1 /*
2  * Copyright (C) 2020 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.systemui.statusbar.notification.collection.inflation;
18 
19 import com.android.systemui.statusbar.FeatureFlags;
20 import com.android.systemui.statusbar.notification.collection.GroupEntry;
21 import com.android.systemui.statusbar.notification.collection.NotificationEntry;
22 import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
23 import com.android.systemui.statusbar.notification.row.RowContentBindParams;
24 import com.android.systemui.statusbar.notification.row.RowContentBindStage;
25 import com.android.systemui.statusbar.phone.NotificationGroupManager;
26 
27 import javax.inject.Inject;
28 import javax.inject.Singleton;
29 
30 /**
31  * Helper class that provide methods to help check when we need to inflate a low priority version
32  * ot notification content.
33  */
34 @Singleton
35 public class LowPriorityInflationHelper {
36     private final FeatureFlags mFeatureFlags;
37     private final NotificationGroupManager mGroupManager;
38     private final RowContentBindStage mRowContentBindStage;
39 
40     @Inject
LowPriorityInflationHelper( FeatureFlags featureFlags, NotificationGroupManager groupManager, RowContentBindStage rowContentBindStage)41     LowPriorityInflationHelper(
42             FeatureFlags featureFlags,
43             NotificationGroupManager groupManager,
44             RowContentBindStage rowContentBindStage) {
45         mFeatureFlags = featureFlags;
46         mGroupManager = groupManager;
47         mRowContentBindStage = rowContentBindStage;
48     }
49 
50     /**
51      * Check if we inflated the wrong version of the view and if we need to reinflate the
52      * content views to be their low priority version or not.
53      *
54      * Whether we inflate the low priority view or not depends on the notification being visually
55      * part of a group. Since group membership is determined AFTER inflation, we're forced to check
56      * again at a later point in the pipeline to see if we inflated the wrong view and reinflate
57      * the correct one here.
58      *
59      * TODO: The group manager should run before inflation so that we don't deal with this
60      */
recheckLowPriorityViewAndInflate( NotificationEntry entry, ExpandableNotificationRow row)61     public void recheckLowPriorityViewAndInflate(
62             NotificationEntry entry,
63             ExpandableNotificationRow row) {
64         RowContentBindParams params = mRowContentBindStage.getStageParams(entry);
65         final boolean shouldBeLowPriority = shouldUseLowPriorityView(entry);
66         if (!row.isRemoved() && row.isLowPriority() != shouldBeLowPriority) {
67             params.setUseLowPriority(shouldBeLowPriority);
68             mRowContentBindStage.requestRebind(entry,
69                     en -> row.setIsLowPriority(shouldBeLowPriority));
70         }
71     }
72 
73     /**
74      * Whether the notification should inflate a low priority version of its content views.
75      */
shouldUseLowPriorityView(NotificationEntry entry)76     public boolean shouldUseLowPriorityView(NotificationEntry entry) {
77         boolean isGroupChild;
78         if (mFeatureFlags.isNewNotifPipelineRenderingEnabled()) {
79             isGroupChild = (entry.getParent() != GroupEntry.ROOT_ENTRY);
80         } else {
81             isGroupChild = mGroupManager.isChildInGroupWithSummary(entry.getSbn());
82         }
83         return entry.isAmbient() && !isGroupChild;
84     }
85 }
86