Do not show the notification footer until the user is set up.

Bug: 193149550
Test: follow repro steps
Merged-In: I49e2b8bcec7b2ce0a9776ff30a64c07f24949da7
Change-Id: I49e2b8bcec7b2ce0a9776ff30a64c07f24949da7
This commit is contained in:
Jeff DeCew
2021-09-17 16:32:58 -04:00
parent e835dab9b8
commit e4d9de5961
4 changed files with 68 additions and 0 deletions

View File

@@ -256,6 +256,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
private boolean mExpandedInThisMotion; private boolean mExpandedInThisMotion;
private boolean mShouldShowShelfOnly; private boolean mShouldShowShelfOnly;
protected boolean mScrollingEnabled; protected boolean mScrollingEnabled;
private boolean mIsCurrentUserSetup;
protected FooterView mFooterView; protected FooterView mFooterView;
protected EmptyShadeView mEmptyShadeView; protected EmptyShadeView mEmptyShadeView;
private boolean mDismissAllInProgress; private boolean mDismissAllInProgress;
@@ -683,6 +684,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
mController.hasActiveClearableNotifications(ROWS_ALL); mController.hasActiveClearableNotifications(ROWS_ALL);
RemoteInputController remoteInputController = mRemoteInputManager.getController(); RemoteInputController remoteInputController = mRemoteInputManager.getController();
boolean showFooterView = (showDismissView || getVisibleNotificationCount() > 0) boolean showFooterView = (showDismissView || getVisibleNotificationCount() > 0)
&& mIsCurrentUserSetup // see: b/193149550
&& mStatusBarState != StatusBarState.KEYGUARD && mStatusBarState != StatusBarState.KEYGUARD
&& !mUnlockedScreenOffAnimationController.isScreenOffAnimationPlaying() && !mUnlockedScreenOffAnimationController.isScreenOffAnimationPlaying()
&& (remoteInputController == null || !remoteInputController.isRemoteInputActive()); && (remoteInputController == null || !remoteInputController.isRemoteInputActive());
@@ -5566,6 +5568,16 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
mAnimateNextTopPaddingChange = true; mAnimateNextTopPaddingChange = true;
} }
/**
* 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 * A listener that is notified when the empty space below the notifications is clicked on
*/ */

View File

@@ -117,6 +117,8 @@ import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.dagger.StatusBarComponent; import com.android.systemui.statusbar.phone.dagger.StatusBarComponent;
import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener; 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.OnHeadsUpChangedListener; import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
import com.android.systemui.statusbar.policy.ZenModeController; import com.android.systemui.statusbar.policy.ZenModeController;
import com.android.systemui.tuner.TunerService; import com.android.systemui.tuner.TunerService;
@@ -144,6 +146,7 @@ public class NotificationStackScrollLayoutController {
private final HeadsUpManagerPhone mHeadsUpManager; private final HeadsUpManagerPhone mHeadsUpManager;
private final NotificationRoundnessManager mNotificationRoundnessManager; private final NotificationRoundnessManager mNotificationRoundnessManager;
private final TunerService mTunerService; private final TunerService mTunerService;
private final DeviceProvisionedController mDeviceProvisionedController;
private final DynamicPrivacyController mDynamicPrivacyController; private final DynamicPrivacyController mDynamicPrivacyController;
private final ConfigurationController mConfigurationController; private final ConfigurationController mConfigurationController;
private final ZenModeController mZenModeController; private final ZenModeController mZenModeController;
@@ -218,6 +221,28 @@ public class NotificationStackScrollLayoutController {
} }
}; };
private final DeviceProvisionedListener mDeviceProvisionedListener =
new DeviceProvisionedListener() {
@Override
public void onDeviceProvisionedChanged() {
updateCurrentUserIsSetup();
}
@Override
public void onUserSwitched() {
updateCurrentUserIsSetup();
}
@Override
public void onUserSetupChanged() {
updateCurrentUserIsSetup();
}
private void updateCurrentUserIsSetup() {
mView.setCurrentUserSetup(mDeviceProvisionedController.isCurrentUserSetup());
}
};
private final DynamicPrivacyController.Listener mDynamicPrivacyControllerListener = () -> { private final DynamicPrivacyController.Listener mDynamicPrivacyControllerListener = () -> {
if (mView.isExpanded()) { if (mView.isExpanded()) {
// The bottom might change because we're using the final actual height of the view // The bottom might change because we're using the final actual height of the view
@@ -587,6 +612,7 @@ public class NotificationStackScrollLayoutController {
HeadsUpManagerPhone headsUpManager, HeadsUpManagerPhone headsUpManager,
NotificationRoundnessManager notificationRoundnessManager, NotificationRoundnessManager notificationRoundnessManager,
TunerService tunerService, TunerService tunerService,
DeviceProvisionedController deviceProvisionedController,
DynamicPrivacyController dynamicPrivacyController, DynamicPrivacyController dynamicPrivacyController,
ConfigurationController configurationController, ConfigurationController configurationController,
SysuiStatusBarStateController statusBarStateController, SysuiStatusBarStateController statusBarStateController,
@@ -623,6 +649,7 @@ public class NotificationStackScrollLayoutController {
mHeadsUpManager = headsUpManager; mHeadsUpManager = headsUpManager;
mNotificationRoundnessManager = notificationRoundnessManager; mNotificationRoundnessManager = notificationRoundnessManager;
mTunerService = tunerService; mTunerService = tunerService;
mDeviceProvisionedController = deviceProvisionedController;
mDynamicPrivacyController = dynamicPrivacyController; mDynamicPrivacyController = dynamicPrivacyController;
mConfigurationController = configurationController; mConfigurationController = configurationController;
mStatusBarStateController = statusBarStateController; mStatusBarStateController = statusBarStateController;
@@ -759,6 +786,9 @@ public class NotificationStackScrollLayoutController {
return Unit.INSTANCE; return Unit.INSTANCE;
}); });
// callback is invoked synchronously, updating mView immediately
mDeviceProvisionedController.addCallback(mDeviceProvisionedListener);
if (mView.isAttachedToWindow()) { if (mView.isAttachedToWindow()) {
mOnAttachStateChangeListener.onViewAttachedToWindow(mView); mOnAttachStateChangeListener.onViewAttachedToWindow(mView);
} }

View File

@@ -290,6 +290,8 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
@Test @Test
public void testUpdateFooter_noNotifications() { public void testUpdateFooter_noNotifications() {
setBarStateForTest(StatusBarState.SHADE); setBarStateForTest(StatusBarState.SHADE);
mStackScroller.setCurrentUserSetup(true);
FooterView view = mock(FooterView.class); FooterView view = mock(FooterView.class);
mStackScroller.setFooterView(view); mStackScroller.setFooterView(view);
mStackScroller.updateFooter(); mStackScroller.updateFooter();
@@ -299,6 +301,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
@Test @Test
public void testUpdateFooter_remoteInput() { public void testUpdateFooter_remoteInput() {
setBarStateForTest(StatusBarState.SHADE); setBarStateForTest(StatusBarState.SHADE);
mStackScroller.setCurrentUserSetup(true);
ExpandableNotificationRow row = mock(ExpandableNotificationRow.class); ExpandableNotificationRow row = mock(ExpandableNotificationRow.class);
when(row.canViewBeDismissed()).thenReturn(true); when(row.canViewBeDismissed()).thenReturn(true);
@@ -318,6 +321,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
@Test @Test
public void testUpdateFooter_oneClearableNotification() { public void testUpdateFooter_oneClearableNotification() {
setBarStateForTest(StatusBarState.SHADE); setBarStateForTest(StatusBarState.SHADE);
mStackScroller.setCurrentUserSetup(true);
when(mEmptyShadeView.getVisibility()).thenReturn(GONE); when(mEmptyShadeView.getVisibility()).thenReturn(GONE);
when(mStackScrollLayoutController.hasActiveClearableNotifications(ROWS_ALL)) when(mStackScrollLayoutController.hasActiveClearableNotifications(ROWS_ALL))
@@ -330,9 +334,26 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
verify(mStackScroller).updateFooterView(true, true, true); verify(mStackScroller).updateFooterView(true, true, true);
} }
@Test
public void testUpdateFooter_oneClearableNotification_beforeUserSetup() {
setBarStateForTest(StatusBarState.SHADE);
mStackScroller.setCurrentUserSetup(false);
when(mEmptyShadeView.getVisibility()).thenReturn(GONE);
when(mStackScrollLayoutController.hasActiveClearableNotifications(ROWS_ALL))
.thenReturn(true);
when(mStackScrollLayoutController.hasActiveNotifications()).thenReturn(true);
FooterView view = mock(FooterView.class);
mStackScroller.setFooterView(view);
mStackScroller.updateFooter();
verify(mStackScroller).updateFooterView(false, true, true);
}
@Test @Test
public void testUpdateFooter_oneNonClearableNotification() { public void testUpdateFooter_oneNonClearableNotification() {
setBarStateForTest(StatusBarState.SHADE); setBarStateForTest(StatusBarState.SHADE);
mStackScroller.setCurrentUserSetup(true);
ExpandableNotificationRow row = mock(ExpandableNotificationRow.class); ExpandableNotificationRow row = mock(ExpandableNotificationRow.class);
when(row.canViewBeDismissed()).thenReturn(false); when(row.canViewBeDismissed()).thenReturn(false);
@@ -351,6 +372,8 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
@Test @Test
public void testUpdateFooter_atEnd() { public void testUpdateFooter_atEnd() {
mStackScroller.setCurrentUserSetup(true);
// add footer // add footer
mStackScroller.inflateFooterView(); mStackScroller.inflateFooterView();

View File

@@ -74,6 +74,7 @@ import com.android.systemui.statusbar.phone.ScrimController;
import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.ZenModeController; import com.android.systemui.statusbar.policy.ZenModeController;
import com.android.systemui.tuner.TunerService; import com.android.systemui.tuner.TunerService;
@@ -98,6 +99,7 @@ public class NotificationStackScrollerControllerTest extends SysuiTestCase {
@Mock private HeadsUpManagerPhone mHeadsUpManager; @Mock private HeadsUpManagerPhone mHeadsUpManager;
@Mock private NotificationRoundnessManager mNotificationRoundnessManager; @Mock private NotificationRoundnessManager mNotificationRoundnessManager;
@Mock private TunerService mTunerService; @Mock private TunerService mTunerService;
@Mock private DeviceProvisionedController mDeviceProvisionedController;
@Mock private DynamicPrivacyController mDynamicPrivacyController; @Mock private DynamicPrivacyController mDynamicPrivacyController;
@Mock private ConfigurationController mConfigurationController; @Mock private ConfigurationController mConfigurationController;
@Mock private NotificationStackScrollLayout mNotificationStackScrollLayout; @Mock private NotificationStackScrollLayout mNotificationStackScrollLayout;
@@ -153,6 +155,7 @@ public class NotificationStackScrollerControllerTest extends SysuiTestCase {
mHeadsUpManager, mHeadsUpManager,
mNotificationRoundnessManager, mNotificationRoundnessManager,
mTunerService, mTunerService,
mDeviceProvisionedController,
mDynamicPrivacyController, mDynamicPrivacyController,
mConfigurationController, mConfigurationController,
mSysuiStatusBarStateController, mSysuiStatusBarStateController,