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:
@@ -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
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user