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