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 static android.service.notification.NotificationStats.DISMISS_SENTIMENT_NEUTRAL;
20 
21 import static com.android.systemui.statusbar.StatusBarState.KEYGUARD;
22 
23 import android.os.SystemClock;
24 import android.service.notification.NotificationStats;
25 
26 import androidx.annotation.NonNull;
27 
28 import com.android.systemui.dagger.SysUISingleton;
29 import com.android.systemui.plugins.statusbar.StatusBarStateController;
30 import com.android.systemui.statusbar.notification.collection.NotifCollection;
31 import com.android.systemui.statusbar.notification.collection.NotifCollection.CancellationReason;
32 import com.android.systemui.statusbar.notification.collection.NotificationEntry;
33 import com.android.systemui.statusbar.notification.collection.coordinator.VisualStabilityCoordinator;
34 import com.android.systemui.statusbar.notification.collection.notifcollection.DismissedByUserStats;
35 import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
36 import com.android.systemui.statusbar.notification.row.OnUserInteractionCallback;
37 import com.android.systemui.statusbar.policy.HeadsUpManager;
38 
39 import javax.inject.Inject;
40 
41 /**
42  * Callback for when a user interacts with a {@see ExpandableNotificationRow}. Sends relevant
43  * information about the interaction to the notification pipeline.
44  */
45 @SysUISingleton
46 public class OnUserInteractionCallbackImpl implements OnUserInteractionCallback {
47     private final NotificationVisibilityProvider mVisibilityProvider;
48     private final NotifCollection mNotifCollection;
49     private final HeadsUpManager mHeadsUpManager;
50     private final StatusBarStateController mStatusBarStateController;
51     private final VisualStabilityCoordinator mVisualStabilityCoordinator;
52 
53     @Inject
OnUserInteractionCallbackImpl( NotificationVisibilityProvider visibilityProvider, NotifCollection notifCollection, HeadsUpManager headsUpManager, StatusBarStateController statusBarStateController, VisualStabilityCoordinator visualStabilityCoordinator )54     public OnUserInteractionCallbackImpl(
55             NotificationVisibilityProvider visibilityProvider,
56             NotifCollection notifCollection,
57             HeadsUpManager headsUpManager,
58             StatusBarStateController statusBarStateController,
59             VisualStabilityCoordinator visualStabilityCoordinator
60     ) {
61         mVisibilityProvider = visibilityProvider;
62         mNotifCollection = notifCollection;
63         mHeadsUpManager = headsUpManager;
64         mStatusBarStateController = statusBarStateController;
65         mVisualStabilityCoordinator = visualStabilityCoordinator;
66     }
67 
68     @NonNull
getDismissedByUserStats(NotificationEntry entry)69     private DismissedByUserStats getDismissedByUserStats(NotificationEntry entry) {
70         int dismissalSurface = NotificationStats.DISMISSAL_SHADE;
71         if (mHeadsUpManager.isAlerting(entry.getKey())) {
72             dismissalSurface = NotificationStats.DISMISSAL_PEEK;
73         } else if (mStatusBarStateController.isDozing()) {
74             dismissalSurface = NotificationStats.DISMISSAL_AOD;
75         } else if (mStatusBarStateController.getState() == KEYGUARD) {
76             dismissalSurface = NotificationStats.DISMISSAL_LOCKSCREEN;
77         }
78         return new DismissedByUserStats(
79                 dismissalSurface,
80                 DISMISS_SENTIMENT_NEUTRAL,
81                 mVisibilityProvider.obtain(entry, true));
82     }
83 
84     @Override
onImportanceChanged(NotificationEntry entry)85     public void onImportanceChanged(NotificationEntry entry) {
86         mVisualStabilityCoordinator.temporarilyAllowSectionChanges(
87                 entry,
88                 SystemClock.uptimeMillis());
89     }
90 
91     @NonNull
92     @Override
registerFutureDismissal(@onNull NotificationEntry entry, @CancellationReason int cancellationReason)93     public Runnable registerFutureDismissal(@NonNull NotificationEntry entry,
94             @CancellationReason int cancellationReason) {
95         return mNotifCollection.registerFutureDismissal(
96                 entry, cancellationReason, this::getDismissedByUserStats);
97     }
98 }
99