diff options
9 files changed, 101 insertions, 49 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/Dependency.java b/packages/SystemUI/src/com/android/systemui/Dependency.java index 567207376996..87f004fc12e6 100644 --- a/packages/SystemUI/src/com/android/systemui/Dependency.java +++ b/packages/SystemUI/src/com/android/systemui/Dependency.java @@ -61,7 +61,6 @@ import com.android.systemui.statusbar.notification.NotificationAlertingManager; import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.NotificationFilter; import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider; -import com.android.systemui.statusbar.notification.NotificationRowBinder; import com.android.systemui.statusbar.notification.VisualStabilityManager; import com.android.systemui.statusbar.notification.collection.NotificationData.KeyguardEnvironment; import com.android.systemui.statusbar.notification.logging.NotificationLogger; @@ -266,7 +265,6 @@ public class Dependency extends SystemUI { @Inject Lazy<NotificationListener> mNotificationListener; @Inject Lazy<NotificationLogger> mNotificationLogger; @Inject Lazy<NotificationViewHierarchyManager> mNotificationViewHierarchyManager; - @Inject Lazy<NotificationRowBinder> mNotificationRowBinder; @Inject Lazy<NotificationFilter> mNotificationFilter; @Inject Lazy<NotificationInterruptionStateProvider> mNotificationInterruptionStateProvider; @Inject Lazy<KeyguardDismissUtil> mKeyguardDismissUtil; @@ -440,7 +438,6 @@ public class Dependency extends SystemUI { mProviders.put(NotificationLogger.class, mNotificationLogger::get); mProviders.put(NotificationViewHierarchyManager.class, mNotificationViewHierarchyManager::get); - mProviders.put(NotificationRowBinder.class, mNotificationRowBinder::get); mProviders.put(NotificationFilter.class, mNotificationFilter::get); mProviders.put(NotificationInterruptionStateProvider.class, mNotificationInterruptionStateProvider::get); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationPresenter.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationPresenter.java index c945afd1cb39..f34b912a255c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationPresenter.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationPresenter.java @@ -15,7 +15,6 @@ */ package com.android.systemui.statusbar; -import com.android.systemui.statusbar.notification.NotificationRowBinder; import com.android.systemui.statusbar.notification.row.ActivatableNotificationView; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; @@ -27,8 +26,7 @@ import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow * want to perform some action before doing so). */ public interface NotificationPresenter extends ExpandableNotificationRow.OnExpandClickListener, - ActivatableNotificationView.OnActivatedListener, - NotificationRowBinder.BindRowCallback { + ActivatableNotificationView.OnActivatedListener { /** * Returns true if the presenter is not visible. For example, it may not be necessary to do * animations if this returns true. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java index 3fbc64163759..4ed9ae4d5142 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java @@ -35,6 +35,7 @@ import com.android.systemui.statusbar.NotificationUpdateHandler; import com.android.systemui.statusbar.notification.collection.NotificationData; import com.android.systemui.statusbar.notification.collection.NotificationData.KeyguardEnvironment; import com.android.systemui.statusbar.notification.collection.NotificationEntry; +import com.android.systemui.statusbar.notification.collection.NotificationRowBinder; import com.android.systemui.statusbar.notification.logging.NotificationLogger; import com.android.systemui.statusbar.notification.row.NotificationContentInflater; import com.android.systemui.statusbar.notification.row.NotificationContentInflater.InflationFlag; @@ -124,16 +125,7 @@ public class NotificationEntryManager implements return mRemoteInputManager; } - private NotificationRowBinder getRowBinder() { - if (mNotificationRowBinder == null) { - mNotificationRowBinder = Dependency.get(NotificationRowBinder.class); - } - return mNotificationRowBinder; - } - - // TODO: Remove this once we can always use a mocked row binder in our tests - @VisibleForTesting - void setRowBinder(NotificationRowBinder notificationRowBinder) { + public void setRowBinder(NotificationRowBinder notificationRowBinder) { mNotificationRowBinder = notificationRowBinder; } @@ -345,7 +337,7 @@ public class NotificationEntryManager implements Dependency.get(LeakDetector.class).trackInstance(entry); // Construct the expanded view. - getRowBinder().inflateViews(entry, () -> performRemoveNotification(notification)); + requireBinder().inflateViews(entry, () -> performRemoveNotification(notification)); abortExistingInflation(key); @@ -386,7 +378,7 @@ public class NotificationEntryManager implements listener.onPreEntryUpdated(entry); } - getRowBinder().inflateViews(entry, () -> performRemoveNotification(notification)); + requireBinder().inflateViews(entry, () -> performRemoveNotification(notification)); updateNotifications(); if (DEBUG) { @@ -440,7 +432,7 @@ public class NotificationEntryManager implements // By comparing the old and new UI adjustments, reinflate the view accordingly. for (NotificationEntry entry : entries) { - getRowBinder().onNotificationRankingUpdated( + requireBinder().onNotificationRankingUpdated( entry, oldImportances.get(entry.key), oldAdjustments.get(entry.key), @@ -486,4 +478,12 @@ public class NotificationEntryManager implements activeExtender.setShouldManageLifetime(entry, false); } } + + private NotificationRowBinder requireBinder() { + if (mNotificationRowBinder == null) { + throw new RuntimeException("You must initialize NotificationEntryManager by calling" + + "setRowBinder() before using."); + } + return mNotificationRowBinder; + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationRowBinder.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationRowBinder.java new file mode 100644 index 000000000000..7504e863ca73 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationRowBinder.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.notification.collection; + +import android.annotation.Nullable; + +import com.android.systemui.statusbar.NotificationUiAdjustment; +import com.android.systemui.statusbar.notification.InflationException; +import com.android.systemui.statusbar.notification.NotificationEntryManager; + +/** + * Used by the {@link NotificationEntryManager}. When notifications are added or updated, the binder + * is asked to (re)inflate and prepare their views. This inflation must occur off the main thread. + */ +public interface NotificationRowBinder { + /** + * Called when a notification has been added or updated. The binder must asynchronously inflate + * and bind the views associated with the notification. + * + * TODO: The caller is notified when the inflation completes, but this is currently a very + * roundabout business. Add an explicit completion/failure callback to this method. + */ + void inflateViews( + NotificationEntry entry, + Runnable onDismissRunnable) + throws InflationException; + + /** + * Called when the ranking has been updated (but not add or remove has been done). The binder + * should inspect the old and new adjustments and re-inflate the entry's views if necessary + * (e.g. if something important changed). + */ + void onNotificationRankingUpdated( + NotificationEntry entry, + @Nullable Integer oldImportance, + NotificationUiAdjustment oldAdjustment, + NotificationUiAdjustment newAdjustment); +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationRowBinder.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationRowBinderImpl.java index 6f5baf9faf39..b91cdaf9ae80 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationRowBinder.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationRowBinderImpl.java @@ -14,10 +14,9 @@ * limitations under the License. */ -package com.android.systemui.statusbar.notification; +package com.android.systemui.statusbar.notification.collection; import static com.android.internal.util.Preconditions.checkNotNull; -import static com.android.systemui.Dependency.ALLOW_NOTIFICATION_LONG_PRESS_NAME; import static com.android.systemui.statusbar.NotificationRemoteInputManager.ENABLE_REMOTE_INPUT; import static com.android.systemui.statusbar.notification.row.NotificationContentInflater.FLAG_CONTENT_VIEW_AMBIENT; import static com.android.systemui.statusbar.notification.row.NotificationContentInflater.FLAG_CONTENT_VIEW_HEADS_UP; @@ -39,7 +38,9 @@ import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.NotificationPresenter; import com.android.systemui.statusbar.NotificationRemoteInputManager; import com.android.systemui.statusbar.NotificationUiAdjustment; -import com.android.systemui.statusbar.notification.collection.NotificationEntry; +import com.android.systemui.statusbar.notification.InflationException; +import com.android.systemui.statusbar.notification.NotificationClicker; +import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider; import com.android.systemui.statusbar.notification.logging.NotificationLogger; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.notification.row.NotificationContentInflater; @@ -50,13 +51,8 @@ import com.android.systemui.statusbar.phone.NotificationGroupManager; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.policy.HeadsUpManager; -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Singleton; - /** Handles inflating and updating views for notifications. */ -@Singleton -public class NotificationRowBinder { +public class NotificationRowBinderImpl implements NotificationRowBinder { private static final String TAG = "NotificationViewManager"; @@ -84,9 +80,7 @@ public class NotificationRowBinder { private NotificationClicker mNotificationClicker; private final NotificationLogger mNotificationLogger = Dependency.get(NotificationLogger.class); - @Inject - public NotificationRowBinder(Context context, - @Named(ALLOW_NOTIFICATION_LONG_PRESS_NAME) boolean allowLongPress) { + public NotificationRowBinderImpl(Context context, boolean allowLongPress) { mContext = context; mMessagingUtil = new NotificationMessagingUtil(context); mAllowLongPress = allowLongPress; @@ -122,6 +116,7 @@ public class NotificationRowBinder { /** * Inflates the views for the given entry (possibly asynchronously). */ + @Override public void inflateViews( NotificationEntry entry, Runnable onDismissRunnable) @@ -192,6 +187,7 @@ public class NotificationRowBinder { * Updates the views bound to an entry when the entry's ranking changes, either in-place or by * reinflating them. */ + @Override public void onNotificationRankingUpdated( NotificationEntry entry, @Nullable Integer oldImportance, @@ -264,7 +260,7 @@ public class NotificationRowBinder { } private void logNotificationExpansion(String key, boolean userAction, boolean expanded) { - mNotificationLogger.onExpansionChanged(key, userAction, expanded); + mNotificationLogger.onExpansionChanged(key, userAction, expanded); } /** Callback for when a row is bound to an entry. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 51ffc1dd98cc..65e75fbaf315 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -197,9 +197,9 @@ import com.android.systemui.statusbar.notification.NotificationClicker; import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider; import com.android.systemui.statusbar.notification.NotificationListController; -import com.android.systemui.statusbar.notification.NotificationRowBinder; import com.android.systemui.statusbar.notification.VisualStabilityManager; import com.android.systemui.statusbar.notification.collection.NotificationEntry; +import com.android.systemui.statusbar.notification.collection.NotificationRowBinderImpl; import com.android.systemui.statusbar.notification.logging.NotificationLogger; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.notification.row.NotificationGutsManager; @@ -392,7 +392,6 @@ public class StatusBar extends SystemUI implements DemoMode, protected NotificationEntryManager mEntryManager; private NotificationListController mNotificationListController; private NotificationInterruptionStateProvider mNotificationInterruptionStateProvider; - private NotificationRowBinder mNotificationRowBinder; protected NotificationViewHierarchyManager mViewHierarchyManager; protected ForegroundServiceController mForegroundServiceController; protected AppOpsController mAppOpsController; @@ -626,7 +625,6 @@ public class StatusBar extends SystemUI implements DemoMode, mEntryManager = Dependency.get(NotificationEntryManager.class); mNotificationInterruptionStateProvider = Dependency.get(NotificationInterruptionStateProvider.class); - mNotificationRowBinder = Dependency.get(NotificationRowBinder.class); mViewHierarchyManager = Dependency.get(NotificationViewHierarchyManager.class); mForegroundServiceController = Dependency.get(ForegroundServiceController.class); mAppOpsController = Dependency.get(AppOpsController.class); @@ -1041,10 +1039,15 @@ public class StatusBar extends SystemUI implements DemoMode, mStatusBarWindow, this, mNotificationPanel, (NotificationListContainer) mStackScroller); + final NotificationRowBinderImpl rowBinder = + new NotificationRowBinderImpl( + mContext, + SystemUIFactory.getInstance().provideAllowNotificationLongPress()); + mPresenter = new StatusBarNotificationPresenter(mContext, mNotificationPanel, mHeadsUpManager, mStatusBarWindow, mStackScroller, mDozeScrimController, mScrimController, mActivityLaunchAnimator, mStatusBarKeyguardViewManager, - mNotificationAlertingManager); + mNotificationAlertingManager, rowBinder); mNotificationListController = new NotificationListController( @@ -1060,7 +1063,9 @@ public class StatusBar extends SystemUI implements DemoMode, mNotificationActivityStarter = new StatusBarNotificationActivityStarter( mContext, mNotificationPanel, mPresenter, mHeadsUpManager, mActivityLaunchAnimator); mGutsManager.setNotificationActivityStarter(mNotificationActivityStarter); - mNotificationRowBinder.setNotificationClicker(new NotificationClicker( + + mEntryManager.setRowBinder(rowBinder); + rowBinder.setNotificationClicker(new NotificationClicker( this, Dependency.get(BubbleController.class), mNotificationActivityStarter)); mGroupAlertTransferHelper.bind(mEntryManager, mGroupManager); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java index 3ce66c5de372..6fe89645ef19 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java @@ -64,9 +64,9 @@ import com.android.systemui.statusbar.notification.NotificationAlertingManager; import com.android.systemui.statusbar.notification.NotificationEntryListener; import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider; -import com.android.systemui.statusbar.notification.NotificationRowBinder; import com.android.systemui.statusbar.notification.VisualStabilityManager; import com.android.systemui.statusbar.notification.collection.NotificationEntry; +import com.android.systemui.statusbar.notification.collection.NotificationRowBinderImpl; import com.android.systemui.statusbar.notification.row.ActivatableNotificationView; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.notification.row.NotificationGutsManager; @@ -79,7 +79,8 @@ import com.android.systemui.statusbar.policy.KeyguardMonitor; import java.util.ArrayList; public class StatusBarNotificationPresenter implements NotificationPresenter, - ConfigurationController.ConfigurationListener { + ConfigurationController.ConfigurationListener, + NotificationRowBinderImpl.BindRowCallback { private final LockscreenGestureLogger mLockscreenGestureLogger = Dependency.get(LockscreenGestureLogger.class); @@ -97,8 +98,6 @@ public class StatusBarNotificationPresenter implements NotificationPresenter, (SysuiStatusBarStateController) Dependency.get(StatusBarStateController.class); private final NotificationEntryManager mEntryManager = Dependency.get(NotificationEntryManager.class); - private final NotificationRowBinder mNotificationRowBinder = - Dependency.get(NotificationRowBinder.class); private final NotificationInterruptionStateProvider mNotificationInterruptionStateProvider = Dependency.get(NotificationInterruptionStateProvider.class); private final NotificationMediaManager mMediaManager = @@ -140,7 +139,8 @@ public class StatusBarNotificationPresenter implements NotificationPresenter, ScrimController scrimController, ActivityLaunchAnimator activityLaunchAnimator, StatusBarKeyguardViewManager statusBarKeyguardViewManager, - NotificationAlertingManager notificationAlertingManager) { + NotificationAlertingManager notificationAlertingManager, + NotificationRowBinderImpl notificationRowBinder) { mContext = context; mNotificationPanel = panel; mHeadsUpManager = headsUp; @@ -217,7 +217,7 @@ public class StatusBarNotificationPresenter implements NotificationPresenter, mEntryManager.addNotificationLifetimeExtender(mGutsManager); mEntryManager.addNotificationLifetimeExtenders( remoteInputManager.getLifetimeExtenders()); - mNotificationRowBinder.setUpWithPresenter(this, notifListContainer, mHeadsUpManager, + notificationRowBinder.setUpWithPresenter(this, notifListContainer, mHeadsUpManager, mEntryManager, this); mNotificationInterruptionStateProvider.setUpWithPresenter( this, mHeadsUpManager, this::canHeadsUp); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java index 04e7cab406ea..0d4328f94a39 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java @@ -67,6 +67,8 @@ import com.android.systemui.statusbar.StatusBarIconView; import com.android.systemui.statusbar.notification.collection.NotificationData; import com.android.systemui.statusbar.notification.collection.NotificationData.KeyguardEnvironment; import com.android.systemui.statusbar.notification.collection.NotificationEntry; +import com.android.systemui.statusbar.notification.collection.NotificationRowBinder; +import com.android.systemui.statusbar.notification.collection.NotificationRowBinderImpl; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.notification.row.NotificationContentInflater.InflationFlag; import com.android.systemui.statusbar.notification.row.NotificationGutsManager; @@ -102,10 +104,8 @@ public class NotificationEntryManagerTest extends SysuiTestCase { @Mock private KeyguardEnvironment mEnvironment; @Mock private ExpandableNotificationRow mRow; @Mock private NotificationListContainer mListContainer; - @Mock - private NotificationEntryListener mEntryListener; - @Mock - private NotificationRowBinder.BindRowCallback mBindCallback; + @Mock private NotificationEntryListener mEntryListener; + @Mock private NotificationRowBinderImpl.BindRowCallback mBindCallback; @Mock private HeadsUpManager mHeadsUpManager; @Mock private NotificationListenerService.RankingMap mRankingMap; @Mock private RemoteInputController mRemoteInputController; @@ -235,10 +235,12 @@ public class NotificationEntryManagerTest extends SysuiTestCase { mEntryManager.setUpWithPresenter(mPresenter, mListContainer, mHeadsUpManager); mEntryManager.addNotificationEntryListener(mEntryListener); - NotificationRowBinder notificationRowBinder = Dependency.get(NotificationRowBinder.class); + NotificationRowBinderImpl notificationRowBinder = + new NotificationRowBinderImpl(mContext, true /* allowLongPress */); notificationRowBinder.setUpWithPresenter( mPresenter, mListContainer, mHeadsUpManager, mEntryManager, mBindCallback); notificationRowBinder.setNotificationClicker(mock(NotificationClicker.class)); + mEntryManager.setRowBinder(notificationRowBinder); setUserSentiment(mEntry.key, NotificationListenerService.Ranking.USER_SENTIMENT_NEUTRAL); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java index 12cb99575fb6..d2b0f7f95967 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java @@ -41,6 +41,7 @@ import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.notification.ActivityLaunchAnimator; import com.android.systemui.statusbar.notification.NotificationAlertingManager; import com.android.systemui.statusbar.notification.collection.NotificationEntry; +import com.android.systemui.statusbar.notification.collection.NotificationRowBinderImpl; import com.android.systemui.statusbar.notification.row.ActivatableNotificationView; import com.android.systemui.statusbar.notification.stack.NotificationListContainer; @@ -74,7 +75,8 @@ public class StatusBarNotificationPresenterTest extends SysuiTestCase { statusBarWindowView, mock(NotificationListContainerViewGroup.class), mock(DozeScrimController.class), mock(ScrimController.class), mock(ActivityLaunchAnimator.class), mock(StatusBarKeyguardViewManager.class), - mock(NotificationAlertingManager.class)); + mock(NotificationAlertingManager.class), + mock(NotificationRowBinderImpl.class)); } @Test |