blob: 6fe89645ef19802db5f786f745e7afd9ca845f7f [file] [log] [blame]
Jason Monk297c04e2018-08-23 17:16:59 -04001/*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
5 * except in compliance with the License. You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software distributed under the
10 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
11 * KIND, either express or implied. See the License for the specific language governing
12 * permissions and limitations under the License.
13 */
14
15package com.android.systemui.statusbar.phone;
16
Jason Monk297c04e2018-08-23 17:16:59 -040017import static com.android.systemui.SysUiServiceProvider.getComponent;
18import static com.android.systemui.statusbar.phone.StatusBar.CLOSE_PANEL_WHEN_EMPTIED;
19import static com.android.systemui.statusbar.phone.StatusBar.DEBUG;
20import static com.android.systemui.statusbar.phone.StatusBar.MULTIUSER_DEBUG;
21import static com.android.systemui.statusbar.phone.StatusBar.SPEW;
Jason Monk297c04e2018-08-23 17:16:59 -040022
Ned Burns1dd6b402019-01-02 15:25:23 -050023import android.annotation.Nullable;
Jason Monk297c04e2018-08-23 17:16:59 -040024import android.app.KeyguardManager;
Jason Monk297c04e2018-08-23 17:16:59 -040025import android.content.Context;
Jason Monk297c04e2018-08-23 17:16:59 -040026import android.content.pm.PackageManager;
Jason Monk297c04e2018-08-23 17:16:59 -040027import android.os.RemoteException;
28import android.os.ServiceManager;
Jason Monk297c04e2018-08-23 17:16:59 -040029import android.service.notification.StatusBarNotification;
30import android.service.vr.IVrManager;
31import android.service.vr.IVrStateCallbacks;
Jason Monk297c04e2018-08-23 17:16:59 -040032import android.util.Log;
33import android.util.Slog;
Jason Monk297c04e2018-08-23 17:16:59 -040034import android.view.View;
35import android.view.ViewGroup;
36import android.view.accessibility.AccessibilityManager;
37import android.widget.TextView;
38
39import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
40import com.android.internal.statusbar.IStatusBarService;
Gus Prevasca1b6f72018-12-28 10:53:11 -050041import com.android.internal.statusbar.NotificationVisibility;
Selim Cinek9ba78f12018-12-07 14:37:33 -080042import com.android.internal.widget.MessagingGroup;
43import com.android.internal.widget.MessagingMessage;
Lucas Dupinc12fad32019-05-14 20:59:17 +000044import com.android.keyguard.KeyguardUpdateMonitor;
Jason Monk297c04e2018-08-23 17:16:59 -040045import com.android.systemui.Dependency;
Gus Prevaseb4e2e12018-12-28 14:57:59 -050046import com.android.systemui.ForegroundServiceNotificationListener;
Jason Monk297c04e2018-08-23 17:16:59 -040047import com.android.systemui.InitController;
48import com.android.systemui.R;
Jason Monk297c04e2018-08-23 17:16:59 -040049import com.android.systemui.plugins.ActivityStarter;
50import com.android.systemui.plugins.ActivityStarter.OnDismissAction;
Beverly8fdb5332019-02-04 14:29:49 -050051import com.android.systemui.plugins.statusbar.StatusBarStateController;
Jason Monk297c04e2018-08-23 17:16:59 -040052import com.android.systemui.statusbar.AmbientPulseManager;
53import com.android.systemui.statusbar.CommandQueue;
54import com.android.systemui.statusbar.NotificationLockscreenUserManager;
55import com.android.systemui.statusbar.NotificationMediaManager;
56import com.android.systemui.statusbar.NotificationPresenter;
57import com.android.systemui.statusbar.NotificationRemoteInputManager;
Jason Monk297c04e2018-08-23 17:16:59 -040058import com.android.systemui.statusbar.NotificationViewHierarchyManager;
Jason Monk297c04e2018-08-23 17:16:59 -040059import com.android.systemui.statusbar.StatusBarState;
Beverly8fdb5332019-02-04 14:29:49 -050060import com.android.systemui.statusbar.SysuiStatusBarStateController;
Jason Monk297c04e2018-08-23 17:16:59 -040061import com.android.systemui.statusbar.notification.AboveShelfObserver;
62import com.android.systemui.statusbar.notification.ActivityLaunchAnimator;
Gus Prevasb43dc652018-12-20 13:11:45 -050063import com.android.systemui.statusbar.notification.NotificationAlertingManager;
Gus Prevas26bc59b2018-12-19 11:26:39 -050064import com.android.systemui.statusbar.notification.NotificationEntryListener;
Jason Monk297c04e2018-08-23 17:16:59 -040065import com.android.systemui.statusbar.notification.NotificationEntryManager;
Gus Prevasec9e1f02018-12-18 15:28:12 -050066import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider;
Gus Prevas5b9098dc2018-12-21 17:07:15 -050067import com.android.systemui.statusbar.notification.VisualStabilityManager;
Ned Burnsf81c4c42019-01-07 14:10:43 -050068import com.android.systemui.statusbar.notification.collection.NotificationEntry;
Ned Burnsc5864672019-02-20 12:57:29 -050069import com.android.systemui.statusbar.notification.collection.NotificationRowBinderImpl;
Jason Monk297c04e2018-08-23 17:16:59 -040070import com.android.systemui.statusbar.notification.row.ActivatableNotificationView;
71import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
72import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
73import com.android.systemui.statusbar.notification.row.NotificationGutsManager.OnSettingsClickListener;
74import com.android.systemui.statusbar.notification.row.NotificationInfo.CheckSaveListener;
75import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
Selim Cinek9ba78f12018-12-07 14:37:33 -080076import com.android.systemui.statusbar.policy.ConfigurationController;
Jason Monk297c04e2018-08-23 17:16:59 -040077import com.android.systemui.statusbar.policy.KeyguardMonitor;
Jason Monk297c04e2018-08-23 17:16:59 -040078
Selim Cinekab9c7b22018-12-11 18:15:47 -080079import java.util.ArrayList;
80
Selim Cinek9ba78f12018-12-07 14:37:33 -080081public class StatusBarNotificationPresenter implements NotificationPresenter,
Ned Burnsc5864672019-02-20 12:57:29 -050082 ConfigurationController.ConfigurationListener,
83 NotificationRowBinderImpl.BindRowCallback {
Jason Monk297c04e2018-08-23 17:16:59 -040084
85 private final LockscreenGestureLogger mLockscreenGestureLogger =
86 Dependency.get(LockscreenGestureLogger.class);
87
88 private static final String TAG = "StatusBarNotificationPresenter";
89
90 private final ShadeController mShadeController = Dependency.get(ShadeController.class);
91 private final ActivityStarter mActivityStarter = Dependency.get(ActivityStarter.class);
Jason Monk297c04e2018-08-23 17:16:59 -040092 private final KeyguardMonitor mKeyguardMonitor = Dependency.get(KeyguardMonitor.class);
93 private final NotificationViewHierarchyManager mViewHierarchyManager =
94 Dependency.get(NotificationViewHierarchyManager.class);
95 private final NotificationLockscreenUserManager mLockscreenUserManager =
96 Dependency.get(NotificationLockscreenUserManager.class);
Beverly8fdb5332019-02-04 14:29:49 -050097 private final SysuiStatusBarStateController mStatusBarStateController =
98 (SysuiStatusBarStateController) Dependency.get(StatusBarStateController.class);
Jason Monk297c04e2018-08-23 17:16:59 -040099 private final NotificationEntryManager mEntryManager =
100 Dependency.get(NotificationEntryManager.class);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500101 private final NotificationInterruptionStateProvider mNotificationInterruptionStateProvider =
102 Dependency.get(NotificationInterruptionStateProvider.class);
Jason Monk297c04e2018-08-23 17:16:59 -0400103 private final NotificationMediaManager mMediaManager =
104 Dependency.get(NotificationMediaManager.class);
Gus Prevas5b9098dc2018-12-21 17:07:15 -0500105 private final VisualStabilityManager mVisualStabilityManager =
106 Dependency.get(VisualStabilityManager.class);
Ned Burns1016d962019-01-08 16:52:39 -0500107 private final NotificationGutsManager mGutsManager =
108 Dependency.get(NotificationGutsManager.class);
Jason Monk297c04e2018-08-23 17:16:59 -0400109 protected AmbientPulseManager mAmbientPulseManager = Dependency.get(AmbientPulseManager.class);
110
111 private final NotificationPanelView mNotificationPanel;
112 private final HeadsUpManagerPhone mHeadsUpManager;
113 private final AboveShelfObserver mAboveShelfObserver;
114 private final DozeScrimController mDozeScrimController;
115 private final ScrimController mScrimController;
116 private final Context mContext;
117 private final CommandQueue mCommandQueue;
118
119 private final AccessibilityManager mAccessibilityManager;
Jason Monk297c04e2018-08-23 17:16:59 -0400120 private final KeyguardManager mKeyguardManager;
121 private final ActivityLaunchAnimator mActivityLaunchAnimator;
Gus Prevas0b8174a2018-12-07 11:35:53 -0500122 private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
Jason Monk297c04e2018-08-23 17:16:59 -0400123 private final int mMaxAllowedKeyguardNotifications;
124 private final IStatusBarService mBarService;
Lucas Dupinc12fad32019-05-14 20:59:17 +0000125 private boolean mReinflateNotificationsOnUserSwitched;
126 private boolean mDispatchUiModeChangeOnUserSwitched;
Jason Monk297c04e2018-08-23 17:16:59 -0400127 private final UnlockMethodCache mUnlockMethodCache;
128 private TextView mNotificationPanelDebugText;
129
130 protected boolean mVrMode;
131 private int mMaxKeyguardNotifications;
Jason Monk297c04e2018-08-23 17:16:59 -0400132
Gus Prevas21437b32018-12-05 10:36:13 -0500133 public StatusBarNotificationPresenter(Context context,
134 NotificationPanelView panel,
135 HeadsUpManagerPhone headsUp,
136 StatusBarWindowView statusBarWindow,
137 ViewGroup stackScroller,
138 DozeScrimController dozeScrimController,
Jason Monk297c04e2018-08-23 17:16:59 -0400139 ScrimController scrimController,
Gus Prevas0b8174a2018-12-07 11:35:53 -0500140 ActivityLaunchAnimator activityLaunchAnimator,
Gus Prevasb43dc652018-12-20 13:11:45 -0500141 StatusBarKeyguardViewManager statusBarKeyguardViewManager,
Ned Burnsc5864672019-02-20 12:57:29 -0500142 NotificationAlertingManager notificationAlertingManager,
143 NotificationRowBinderImpl notificationRowBinder) {
Jason Monk297c04e2018-08-23 17:16:59 -0400144 mContext = context;
145 mNotificationPanel = panel;
146 mHeadsUpManager = headsUp;
147 mCommandQueue = getComponent(context, CommandQueue.class);
148 mAboveShelfObserver = new AboveShelfObserver(stackScroller);
Gus Prevas21437b32018-12-05 10:36:13 -0500149 mActivityLaunchAnimator = activityLaunchAnimator;
Gus Prevas0b8174a2018-12-07 11:35:53 -0500150 mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
Jason Monk297c04e2018-08-23 17:16:59 -0400151 mAboveShelfObserver.setListener(statusBarWindow.findViewById(
152 R.id.notification_container_parent));
153 mAccessibilityManager = context.getSystemService(AccessibilityManager.class);
154 mDozeScrimController = dozeScrimController;
155 mScrimController = scrimController;
156 mUnlockMethodCache = UnlockMethodCache.getInstance(mContext);
Jason Monk297c04e2018-08-23 17:16:59 -0400157 mKeyguardManager = context.getSystemService(KeyguardManager.class);
158 mMaxAllowedKeyguardNotifications = context.getResources().getInteger(
159 R.integer.keyguard_max_notification_count);
160 mBarService = IStatusBarService.Stub.asInterface(
161 ServiceManager.getService(Context.STATUS_BAR_SERVICE));
Jason Monk297c04e2018-08-23 17:16:59 -0400162
163 if (MULTIUSER_DEBUG) {
164 mNotificationPanelDebugText = mNotificationPanel.findViewById(R.id.header_debug_info);
165 mNotificationPanelDebugText.setVisibility(View.VISIBLE);
166 }
167
168 IVrManager vrManager = IVrManager.Stub.asInterface(ServiceManager.getService(
169 Context.VR_SERVICE));
170 if (vrManager != null) {
171 try {
172 vrManager.registerListener(mVrStateCallbacks);
173 } catch (RemoteException e) {
174 Slog.e(TAG, "Failed to register VR mode state listener: " + e);
175 }
176 }
Gus Prevas21437b32018-12-05 10:36:13 -0500177 NotificationRemoteInputManager remoteInputManager =
178 Dependency.get(NotificationRemoteInputManager.class);
179 remoteInputManager.setUpWithCallback(
Jason Monk297c04e2018-08-23 17:16:59 -0400180 Dependency.get(NotificationRemoteInputManager.Callback.class),
181 mNotificationPanel.createRemoteInputDelegate());
Gus Prevas21437b32018-12-05 10:36:13 -0500182 remoteInputManager.getController().addCallback(
Jason Monk297c04e2018-08-23 17:16:59 -0400183 Dependency.get(StatusBarWindowController.class));
184
185 NotificationListContainer notifListContainer = (NotificationListContainer) stackScroller;
186 Dependency.get(InitController.class).addPostInitTask(() -> {
Gus Prevas26bc59b2018-12-19 11:26:39 -0500187 NotificationEntryListener notificationEntryListener = new NotificationEntryListener() {
188 @Override
Ned Burnsf81c4c42019-01-07 14:10:43 -0500189 public void onNotificationAdded(NotificationEntry entry) {
Gus Prevas26bc59b2018-12-19 11:26:39 -0500190 // Recalculate the position of the sliding windows and the titles.
191 mShadeController.updateAreThereNotifications();
192 }
193
194 @Override
Mady Mellor0ad5b9d2019-01-08 14:59:55 -0800195 public void onPostEntryUpdated(NotificationEntry entry) {
Gus Prevas26bc59b2018-12-19 11:26:39 -0500196 mShadeController.updateAreThereNotifications();
197 }
198
199 @Override
Gus Prevas772e5322018-12-21 16:22:16 -0500200 public void onEntryRemoved(
Ned Burnsf81c4c42019-01-07 14:10:43 -0500201 @Nullable NotificationEntry entry,
Gus Prevasca1b6f72018-12-28 10:53:11 -0500202 NotificationVisibility visibility,
Gus Prevas772e5322018-12-21 16:22:16 -0500203 boolean removedByUser) {
Ned Burnsef2ef6c2019-01-02 16:48:08 -0500204 StatusBarNotificationPresenter.this.onNotificationRemoved(
205 entry.key, entry.notification);
Gus Prevasdca2be52018-12-21 11:25:10 -0500206 if (removedByUser) {
207 maybeEndAmbientPulse();
208 }
Gus Prevas26bc59b2018-12-19 11:26:39 -0500209 }
210 };
211
Jason Monk297c04e2018-08-23 17:16:59 -0400212 mViewHierarchyManager.setUpWithPresenter(this, notifListContainer);
Gus Prevas8621bd22018-12-20 15:04:25 -0500213 mEntryManager.setUpWithPresenter(this, notifListContainer, mHeadsUpManager);
214 mEntryManager.addNotificationEntryListener(notificationEntryListener);
Gus Prevas5c84abb2018-12-28 16:41:49 -0500215 mEntryManager.addNotificationLifetimeExtender(mHeadsUpManager);
216 mEntryManager.addNotificationLifetimeExtender(mAmbientPulseManager);
Ned Burns1016d962019-01-08 16:52:39 -0500217 mEntryManager.addNotificationLifetimeExtender(mGutsManager);
Gus Prevas5c84abb2018-12-28 16:41:49 -0500218 mEntryManager.addNotificationLifetimeExtenders(
219 remoteInputManager.getLifetimeExtenders());
Ned Burnsc5864672019-02-20 12:57:29 -0500220 notificationRowBinder.setUpWithPresenter(this, notifListContainer, mHeadsUpManager,
Gus Prevas8ba88a82018-12-18 11:13:44 -0500221 mEntryManager, this);
Gus Prevasec9e1f02018-12-18 15:28:12 -0500222 mNotificationInterruptionStateProvider.setUpWithPresenter(
223 this, mHeadsUpManager, this::canHeadsUp);
Jason Monk297c04e2018-08-23 17:16:59 -0400224 mLockscreenUserManager.setUpWithPresenter(this);
225 mMediaManager.setUpWithPresenter(this);
Gus Prevas5b9098dc2018-12-21 17:07:15 -0500226 mVisualStabilityManager.setUpWithPresenter(this);
Ned Burns1016d962019-01-08 16:52:39 -0500227 mGutsManager.setUpWithPresenter(this,
Jason Monk297c04e2018-08-23 17:16:59 -0400228 notifListContainer, mCheckSaveListener, mOnSettingsClickListener);
Gus Prevaseb4e2e12018-12-28 14:57:59 -0500229 // ForegroundServiceControllerListener adds its listener in its constructor
230 // but we need to request it here in order for it to be instantiated.
231 // TODO: figure out how to do this correctly once Dependency.get() is gone.
232 Dependency.get(ForegroundServiceNotificationListener.class);
Jason Monk297c04e2018-08-23 17:16:59 -0400233
234 onUserSwitched(mLockscreenUserManager.getCurrentUserId());
235 });
Selim Cinek9ba78f12018-12-07 14:37:33 -0800236 Dependency.get(ConfigurationController.class).addCallback(this);
Gus Prevasb43dc652018-12-20 13:11:45 -0500237
238 notificationAlertingManager.setHeadsUpManager(mHeadsUpManager);
Jason Monk297c04e2018-08-23 17:16:59 -0400239 }
240
Selim Cinek9ba78f12018-12-07 14:37:33 -0800241 @Override
Jason Monk297c04e2018-08-23 17:16:59 -0400242 public void onDensityOrFontScaleChanged() {
Selim Cinek9ba78f12018-12-07 14:37:33 -0800243 MessagingMessage.dropCache();
244 MessagingGroup.dropCache();
Lucas Dupinc12fad32019-05-14 20:59:17 +0000245 if (!KeyguardUpdateMonitor.getInstance(mContext).isSwitchingUser()) {
246 updateNotificationsOnDensityOrFontScaleChanged();
247 } else {
248 mReinflateNotificationsOnUserSwitched = true;
249 }
Jason Monk297c04e2018-08-23 17:16:59 -0400250 }
251
252 @Override
Selim Cinekab9c7b22018-12-11 18:15:47 -0800253 public void onUiModeChanged() {
Lucas Dupinc12fad32019-05-14 20:59:17 +0000254 if (!KeyguardUpdateMonitor.getInstance(mContext).isSwitchingUser()) {
255 updateNotificationOnUiModeChanged();
256 } else {
257 mDispatchUiModeChangeOnUserSwitched = true;
258 }
Selim Cinekab9c7b22018-12-11 18:15:47 -0800259 }
260
Selim Cinekdd26a7e2019-02-11 18:42:55 -0800261 @Override
262 public void onOverlayChanged() {
263 onDensityOrFontScaleChanged();
264 }
265
Selim Cinekab9c7b22018-12-11 18:15:47 -0800266 private void updateNotificationOnUiModeChanged() {
Ned Burnsf81c4c42019-01-07 14:10:43 -0500267 ArrayList<NotificationEntry> userNotifications
Selim Cinekab9c7b22018-12-11 18:15:47 -0800268 = mEntryManager.getNotificationData().getNotificationsForCurrentUser();
269 for (int i = 0; i < userNotifications.size(); i++) {
Ned Burnsf81c4c42019-01-07 14:10:43 -0500270 NotificationEntry entry = userNotifications.get(i);
Selim Cinekab9c7b22018-12-11 18:15:47 -0800271 ExpandableNotificationRow row = entry.getRow();
272 if (row != null) {
273 row.onUiModeChanged();
274 }
275 }
276 }
277
Ned Burns1016d962019-01-08 16:52:39 -0500278 private void updateNotificationsOnDensityOrFontScaleChanged() {
279 ArrayList<NotificationEntry> userNotifications =
280 mEntryManager.getNotificationData().getNotificationsForCurrentUser();
281 for (int i = 0; i < userNotifications.size(); i++) {
282 NotificationEntry entry = userNotifications.get(i);
283 entry.onDensityOrFontScaleChanged();
284 boolean exposedGuts = entry.areGutsExposed();
285 if (exposedGuts) {
286 mGutsManager.onDensityOrFontScaleChanged(entry);
287 }
288 }
289 }
290
Selim Cinekab9c7b22018-12-11 18:15:47 -0800291 @Override
Jason Monk297c04e2018-08-23 17:16:59 -0400292 public boolean isCollapsing() {
293 return mNotificationPanel.isCollapsing()
294 || mActivityLaunchAnimator.isAnimationPending()
295 || mActivityLaunchAnimator.isAnimationRunning();
296 }
297
Gus Prevasdca2be52018-12-21 11:25:10 -0500298 private void maybeEndAmbientPulse() {
Jason Monk297c04e2018-08-23 17:16:59 -0400299 if (mNotificationPanel.hasPulsingNotifications() &&
Gus Prevasec9e1f02018-12-18 15:28:12 -0500300 !mAmbientPulseManager.hasNotifications()) {
Jason Monk297c04e2018-08-23 17:16:59 -0400301 // We were showing a pulse for a notification, but no notifications are pulsing anymore.
302 // Finish the pulse.
303 mDozeScrimController.pulseOutNow();
304 }
305 }
306
307 @Override
308 public void updateNotificationViews() {
309 // The function updateRowStates depends on both of these being non-null, so check them here.
310 // We may be called before they are set from DeviceProvisionedController's callback.
311 if (mScrimController == null) return;
312
313 // Do not modify the notifications during collapse.
314 if (isCollapsing()) {
315 mShadeController.addPostCollapseAction(this::updateNotificationViews);
316 return;
317 }
318
319 mViewHierarchyManager.updateNotificationViews();
320
321 mNotificationPanel.updateNotificationViews();
322 }
323
Jason Monk297c04e2018-08-23 17:16:59 -0400324 public void onNotificationRemoved(String key, StatusBarNotification old) {
325 if (SPEW) Log.d(TAG, "removeNotification key=" + key + " old=" + old);
326
327 if (old != null) {
328 if (CLOSE_PANEL_WHEN_EMPTIED && !hasActiveNotifications()
329 && !mNotificationPanel.isTracking() && !mNotificationPanel.isQsExpanded()) {
330 if (mStatusBarStateController.getState() == StatusBarState.SHADE) {
331 mCommandQueue.animateCollapsePanels();
332 } else if (mStatusBarStateController.getState() == StatusBarState.SHADE_LOCKED
333 && !isCollapsing()) {
334 mShadeController.goToKeyguard();
335 }
336 }
337 }
338 mShadeController.updateAreThereNotifications();
339 }
340
341 public boolean hasActiveNotifications() {
342 return !mEntryManager.getNotificationData().getActiveNotifications().isEmpty();
343 }
344
Ned Burnsf81c4c42019-01-07 14:10:43 -0500345 public boolean canHeadsUp(NotificationEntry entry, StatusBarNotification sbn) {
Evan Laird1d4379f2018-10-24 15:32:10 -0400346 if (mShadeController.isDozing()) {
Jason Monk297c04e2018-08-23 17:16:59 -0400347 return false;
348 }
349
350 if (mShadeController.isOccluded()) {
351 boolean devicePublic = mLockscreenUserManager.
352 isLockscreenPublicMode(mLockscreenUserManager.getCurrentUserId());
353 boolean userPublic = devicePublic
354 || mLockscreenUserManager.isLockscreenPublicMode(sbn.getUserId());
355 boolean needsRedaction = mLockscreenUserManager.needsRedaction(entry);
356 if (userPublic && needsRedaction) {
357 return false;
358 }
359 }
360
361 if (!mCommandQueue.panelsEnabled()) {
362 if (DEBUG) {
363 Log.d(TAG, "No heads up: disabled panel : " + sbn.getKey());
364 }
365 return false;
366 }
367
368 if (sbn.getNotification().fullScreenIntent != null) {
369 if (mAccessibilityManager.isTouchExplorationEnabled()) {
370 if (DEBUG) Log.d(TAG, "No heads up: accessible fullscreen: " + sbn.getKey());
371 return false;
372 } else {
373 // we only allow head-up on the lockscreen if it doesn't have a fullscreen intent
374 return !mKeyguardMonitor.isShowing()
375 || mShadeController.isOccluded();
376 }
377 }
378 return true;
379 }
380
381 @Override
382 public void onUserSwitched(int newUserId) {
383 // Begin old BaseStatusBar.userSwitched
384 mHeadsUpManager.setUser(newUserId);
385 // End old BaseStatusBar.userSwitched
386 if (MULTIUSER_DEBUG) mNotificationPanelDebugText.setText("USER " + newUserId);
387 mCommandQueue.animateCollapsePanels();
Lucas Dupinc12fad32019-05-14 20:59:17 +0000388 if (mReinflateNotificationsOnUserSwitched) {
389 updateNotificationsOnDensityOrFontScaleChanged();
390 mReinflateNotificationsOnUserSwitched = false;
391 }
392 if (mDispatchUiModeChangeOnUserSwitched) {
393 updateNotificationOnUiModeChanged();
394 mDispatchUiModeChangeOnUserSwitched = false;
395 }
Jason Monk297c04e2018-08-23 17:16:59 -0400396 updateNotificationViews();
397 mMediaManager.clearCurrentMediaNotification();
398 mShadeController.setLockscreenUser(newUserId);
399 updateMediaMetaData(true, false);
400 }
401
402 @Override
Ned Burnsf81c4c42019-01-07 14:10:43 -0500403 public void onBindRow(NotificationEntry entry, PackageManager pmUser,
Jason Monk297c04e2018-08-23 17:16:59 -0400404 StatusBarNotification sbn, ExpandableNotificationRow row) {
405 row.setAboveShelfChangedListener(mAboveShelfObserver);
406 row.setSecureStateProvider(mUnlockMethodCache::canSkipBouncer);
407 }
408
409 @Override
410 public boolean isPresenterFullyCollapsed() {
411 return mNotificationPanel.isFullyCollapsed();
412 }
413
414 @Override
415 public void onActivated(ActivatableNotificationView view) {
416 onActivated();
417 if (view != null) mNotificationPanel.setActivatedChild(view);
418 }
419
420 public void onActivated() {
421 mLockscreenGestureLogger.write(
422 MetricsEvent.ACTION_LS_NOTE,
423 0 /* lengthDp - N/A */, 0 /* velocityDp - N/A */);
424 mNotificationPanel.showTransientIndication(R.string.notification_tap_again);
425 ActivatableNotificationView previousView = mNotificationPanel.getActivatedChild();
426 if (previousView != null) {
427 previousView.makeInactive(true /* animate */);
428 }
429 }
430
431 @Override
432 public void onActivationReset(ActivatableNotificationView view) {
433 if (view == mNotificationPanel.getActivatedChild()) {
434 mNotificationPanel.setActivatedChild(null);
435 mShadeController.onActivationReset();
436 }
437 }
438
439 @Override
440 public void updateMediaMetaData(boolean metaDataChanged, boolean allowEnterAnimation) {
441 mMediaManager.updateMediaMetaData(metaDataChanged, allowEnterAnimation);
442 }
443
444 @Override
Jason Monk297c04e2018-08-23 17:16:59 -0400445 public int getMaxNotificationsWhileLocked(boolean recompute) {
446 if (recompute) {
447 mMaxKeyguardNotifications = Math.max(1,
448 mNotificationPanel.computeMaxKeyguardNotifications(
449 mMaxAllowedKeyguardNotifications));
450 return mMaxKeyguardNotifications;
451 }
452 return mMaxKeyguardNotifications;
453 }
454
455 @Override
456 public void onUpdateRowStates() {
457 mNotificationPanel.onUpdateRowStates();
458 }
459
460 @Override
Ned Burnsf81c4c42019-01-07 14:10:43 -0500461 public void onExpandClicked(NotificationEntry clickedEntry, boolean nowExpanded) {
Jason Monk297c04e2018-08-23 17:16:59 -0400462 mHeadsUpManager.setExpanded(clickedEntry, nowExpanded);
463 if (mStatusBarStateController.getState() == StatusBarState.KEYGUARD && nowExpanded) {
Evan Laird94492852018-10-25 13:43:01 -0400464 mShadeController.goToLockedShade(clickedEntry.getRow());
Jason Monk297c04e2018-08-23 17:16:59 -0400465 }
466 }
467
468 @Override
469 public boolean isDeviceInVrMode() {
470 return mVrMode;
471 }
472
Gus Prevas0b8174a2018-12-07 11:35:53 -0500473 @Override
474 public boolean isPresenterLocked() {
475 return mStatusBarKeyguardViewManager.isShowing()
476 && mStatusBarKeyguardViewManager.isSecure();
477 }
478
Jason Monk297c04e2018-08-23 17:16:59 -0400479 private void onLockedNotificationImportanceChange(OnDismissAction dismissAction) {
480 mStatusBarStateController.setLeaveOpenOnKeyguardHide(true);
481 mActivityStarter.dismissKeyguardThenExecute(dismissAction, null,
482 true /* afterKeyguardGone */);
483 }
484
Jason Monk297c04e2018-08-23 17:16:59 -0400485 private final IVrStateCallbacks mVrStateCallbacks = new IVrStateCallbacks.Stub() {
486 @Override
487 public void onVrStateChanged(boolean enabled) {
488 mVrMode = enabled;
489 }
490 };
491
492 private final CheckSaveListener mCheckSaveListener = new CheckSaveListener() {
493 @Override
494 public void checkSave(Runnable saveImportance, StatusBarNotification sbn) {
Jason Monk297c04e2018-08-23 17:16:59 -0400495 // If the user has security enabled, show challenge if the setting is changed.
496 if (mLockscreenUserManager.isLockscreenPublicMode(sbn.getUser().getIdentifier())
497 && mKeyguardManager.isKeyguardLocked()) {
498 onLockedNotificationImportanceChange(() -> {
499 saveImportance.run();
500 return true;
501 });
502 } else {
503 saveImportance.run();
504 }
505 }
506 };
507
508 private final OnSettingsClickListener mOnSettingsClickListener = new OnSettingsClickListener() {
509 @Override
510 public void onSettingsClick(String key) {
511 try {
512 mBarService.onNotificationSettingsViewed(key);
513 } catch (RemoteException e) {
514 // if we're here we're dead
515 }
516 }
517 };
518}