Loading packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +38 −0 Original line number Diff line number Diff line Loading @@ -140,6 +140,8 @@ import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener; import com.android.systemui.statusbar.policy.DeviceProvisionedController; import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener; import com.android.systemui.statusbar.policy.HeadsUpUtil; import com.android.systemui.statusbar.policy.ScrollAdapter; import com.android.systemui.tuner.TunerService; Loading Loading @@ -280,6 +282,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd private boolean mExpandedInThisMotion; private boolean mShouldShowShelfOnly; protected boolean mScrollingEnabled; private boolean mIsCurrentUserSetup; protected FooterView mFooterView; protected EmptyShadeView mEmptyShadeView; private boolean mDismissAllInProgress; Loading Loading @@ -481,6 +484,8 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd private final Rect mTmpRect = new Rect(); private final NotificationEntryManager mEntryManager = Dependency.get(NotificationEntryManager.class); private final DeviceProvisionedController mDeviceProvisionedController = Dependency.get(DeviceProvisionedController.class); private final IStatusBarService mBarService = IStatusBarService.Stub.asInterface( ServiceManager.getService(Context.STATUS_BAR_SERVICE)); @VisibleForTesting Loading Loading @@ -597,6 +602,28 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd } }, HIGH_PRIORITY, Settings.Secure.NOTIFICATION_DISMISS_RTL); mDeviceProvisionedController.addCallback( new DeviceProvisionedListener() { @Override public void onDeviceProvisionedChanged() { updateCurrentUserIsSetup(); } @Override public void onUserSwitched() { updateCurrentUserIsSetup(); } @Override public void onUserSetupChanged() { updateCurrentUserIsSetup(); } private void updateCurrentUserIsSetup() { setCurrentUserSetup(mDeviceProvisionedController.isCurrentUserSetup()); } }); mEntryManager.addNotificationEntryListener(new NotificationEntryListener() { @Override public void onPostEntryUpdated(NotificationEntry entry) { Loading Loading @@ -683,6 +710,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd boolean showDismissView = mClearAllEnabled && hasActiveClearableNotifications(ROWS_ALL); boolean showFooterView = (showDismissView || mEntryManager.getNotificationData().getActiveNotifications().size() != 0) && mIsCurrentUserSetup // see: b/193149550 && mStatusBarState != StatusBarState.KEYGUARD && !mRemoteInputManager.getController().isRemoteInputActive(); Loading Loading @@ -5734,6 +5762,16 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd } } /** * Sets whether the current user is set up, which is required to show the footer (b/193149550) */ public void setCurrentUserSetup(boolean isCurrentUserSetup) { if (mIsCurrentUserSetup != isCurrentUserSetup) { mIsCurrentUserSetup = isCurrentUserSetup; updateFooter(); } } /** * A listener that is notified when the empty space below the notifications is clicked on */ Loading packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java +27 −0 Original line number Diff line number Diff line Loading @@ -308,6 +308,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { @Test public void testUpdateFooter_noNotifications() { setBarStateForTest(StatusBarState.SHADE); mStackScroller.setCurrentUserSetup(true); assertEquals(0, mNotificationData.getActiveNotifications().size()); mStackScroller.updateFooter(); Loading @@ -317,6 +318,8 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { @Test public void testUpdateFooter_remoteInput() { setBarStateForTest(StatusBarState.SHADE); mStackScroller.setCurrentUserSetup(true); ArrayList<NotificationEntry> entries = new ArrayList<>(); entries.add(mock(NotificationEntry.class)); when(mNotificationData.getActiveNotifications()).thenReturn(entries); Loading @@ -334,6 +337,8 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { @Test public void testUpdateFooter_oneClearableNotification() { setBarStateForTest(StatusBarState.SHADE); mStackScroller.setCurrentUserSetup(true); ArrayList<NotificationEntry> entries = new ArrayList<>(); entries.add(mock(NotificationEntry.class)); when(mNotificationData.getActiveNotifications()).thenReturn(entries); Loading @@ -347,9 +352,29 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { verify(mStackScroller).updateFooterView(true, true); } @Test public void testUpdateFooter_oneClearableNotification_beforeUserSetup() { setBarStateForTest(StatusBarState.SHADE); mStackScroller.setCurrentUserSetup(false); ArrayList<NotificationEntry> entries = new ArrayList<>(); entries.add(mock(NotificationEntry.class)); when(mNotificationData.getActiveNotifications()).thenReturn(entries); ExpandableNotificationRow row = mock(ExpandableNotificationRow.class); when(row.canViewBeDismissed()).thenReturn(true); when(mStackScroller.getChildCount()).thenReturn(1); when(mStackScroller.getChildAt(anyInt())).thenReturn(row); mStackScroller.updateFooter(); verify(mStackScroller).updateFooterView(false, true); } @Test public void testUpdateFooter_oneNonClearableNotification() { setBarStateForTest(StatusBarState.SHADE); mStackScroller.setCurrentUserSetup(true); ArrayList<NotificationEntry> entries = new ArrayList<>(); entries.add(mock(NotificationEntry.class)); when(mEntryManager.getNotificationData().getActiveNotifications()).thenReturn(entries); Loading @@ -361,6 +386,8 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { @Test public void testUpdateFooter_atEnd() { mStackScroller.setCurrentUserSetup(true); // add footer mStackScroller.inflateFooterView(); Loading Loading
packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +38 −0 Original line number Diff line number Diff line Loading @@ -140,6 +140,8 @@ import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener; import com.android.systemui.statusbar.policy.DeviceProvisionedController; import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener; import com.android.systemui.statusbar.policy.HeadsUpUtil; import com.android.systemui.statusbar.policy.ScrollAdapter; import com.android.systemui.tuner.TunerService; Loading Loading @@ -280,6 +282,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd private boolean mExpandedInThisMotion; private boolean mShouldShowShelfOnly; protected boolean mScrollingEnabled; private boolean mIsCurrentUserSetup; protected FooterView mFooterView; protected EmptyShadeView mEmptyShadeView; private boolean mDismissAllInProgress; Loading Loading @@ -481,6 +484,8 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd private final Rect mTmpRect = new Rect(); private final NotificationEntryManager mEntryManager = Dependency.get(NotificationEntryManager.class); private final DeviceProvisionedController mDeviceProvisionedController = Dependency.get(DeviceProvisionedController.class); private final IStatusBarService mBarService = IStatusBarService.Stub.asInterface( ServiceManager.getService(Context.STATUS_BAR_SERVICE)); @VisibleForTesting Loading Loading @@ -597,6 +602,28 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd } }, HIGH_PRIORITY, Settings.Secure.NOTIFICATION_DISMISS_RTL); mDeviceProvisionedController.addCallback( new DeviceProvisionedListener() { @Override public void onDeviceProvisionedChanged() { updateCurrentUserIsSetup(); } @Override public void onUserSwitched() { updateCurrentUserIsSetup(); } @Override public void onUserSetupChanged() { updateCurrentUserIsSetup(); } private void updateCurrentUserIsSetup() { setCurrentUserSetup(mDeviceProvisionedController.isCurrentUserSetup()); } }); mEntryManager.addNotificationEntryListener(new NotificationEntryListener() { @Override public void onPostEntryUpdated(NotificationEntry entry) { Loading Loading @@ -683,6 +710,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd boolean showDismissView = mClearAllEnabled && hasActiveClearableNotifications(ROWS_ALL); boolean showFooterView = (showDismissView || mEntryManager.getNotificationData().getActiveNotifications().size() != 0) && mIsCurrentUserSetup // see: b/193149550 && mStatusBarState != StatusBarState.KEYGUARD && !mRemoteInputManager.getController().isRemoteInputActive(); Loading Loading @@ -5734,6 +5762,16 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd } } /** * Sets whether the current user is set up, which is required to show the footer (b/193149550) */ public void setCurrentUserSetup(boolean isCurrentUserSetup) { if (mIsCurrentUserSetup != isCurrentUserSetup) { mIsCurrentUserSetup = isCurrentUserSetup; updateFooter(); } } /** * A listener that is notified when the empty space below the notifications is clicked on */ Loading
packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java +27 −0 Original line number Diff line number Diff line Loading @@ -308,6 +308,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { @Test public void testUpdateFooter_noNotifications() { setBarStateForTest(StatusBarState.SHADE); mStackScroller.setCurrentUserSetup(true); assertEquals(0, mNotificationData.getActiveNotifications().size()); mStackScroller.updateFooter(); Loading @@ -317,6 +318,8 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { @Test public void testUpdateFooter_remoteInput() { setBarStateForTest(StatusBarState.SHADE); mStackScroller.setCurrentUserSetup(true); ArrayList<NotificationEntry> entries = new ArrayList<>(); entries.add(mock(NotificationEntry.class)); when(mNotificationData.getActiveNotifications()).thenReturn(entries); Loading @@ -334,6 +337,8 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { @Test public void testUpdateFooter_oneClearableNotification() { setBarStateForTest(StatusBarState.SHADE); mStackScroller.setCurrentUserSetup(true); ArrayList<NotificationEntry> entries = new ArrayList<>(); entries.add(mock(NotificationEntry.class)); when(mNotificationData.getActiveNotifications()).thenReturn(entries); Loading @@ -347,9 +352,29 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { verify(mStackScroller).updateFooterView(true, true); } @Test public void testUpdateFooter_oneClearableNotification_beforeUserSetup() { setBarStateForTest(StatusBarState.SHADE); mStackScroller.setCurrentUserSetup(false); ArrayList<NotificationEntry> entries = new ArrayList<>(); entries.add(mock(NotificationEntry.class)); when(mNotificationData.getActiveNotifications()).thenReturn(entries); ExpandableNotificationRow row = mock(ExpandableNotificationRow.class); when(row.canViewBeDismissed()).thenReturn(true); when(mStackScroller.getChildCount()).thenReturn(1); when(mStackScroller.getChildAt(anyInt())).thenReturn(row); mStackScroller.updateFooter(); verify(mStackScroller).updateFooterView(false, true); } @Test public void testUpdateFooter_oneNonClearableNotification() { setBarStateForTest(StatusBarState.SHADE); mStackScroller.setCurrentUserSetup(true); ArrayList<NotificationEntry> entries = new ArrayList<>(); entries.add(mock(NotificationEntry.class)); when(mEntryManager.getNotificationData().getActiveNotifications()).thenReturn(entries); Loading @@ -361,6 +386,8 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { @Test public void testUpdateFooter_atEnd() { mStackScroller.setCurrentUserSetup(true); // add footer mStackScroller.inflateFooterView(); Loading