From eacf34bc18a0e0440bf7832cc0f15312c49f4a72 Mon Sep 17 00:00:00 2001 From: Chandru S Date: Tue, 13 Jun 2023 10:47:27 -0700 Subject: [PATCH] Show specific messages for why bouncer is shown before or after OTA update. Test: 1. Restart the device, 2. Run `adb setprop sys.boot.reason.last reboot,mainline_update` before unlock 3. See message on bouncer Test: atest KeyguardViewMediatorTest Bug: 285956229 Bug: 285578578 Change-Id: I8623cce9e9eb4c321f377f262e9831e3c3a62e93 --- .../SystemUI/res-keyguard/values/strings.xml | 6 ++--- .../keyguard/KeyguardPasswordView.java | 5 +++- .../KeyguardPatternViewController.java | 5 +++- .../keyguard/KeyguardPinBasedInputView.java | 5 +++- .../keyguard/KeyguardSecurityView.java | 6 +++++ .../keyguard/KeyguardViewMediator.java | 16 +++++++++++-- .../keyguard/dagger/KeyguardModule.java | 7 ++++-- .../keyguard/KeyguardViewMediatorTest.java | 24 ++++++++++++++++++- 8 files changed, 63 insertions(+), 11 deletions(-) diff --git a/packages/SystemUI/res-keyguard/values/strings.xml b/packages/SystemUI/res-keyguard/values/strings.xml index 28f5f3d9edd7a..badad584824b8 100644 --- a/packages/SystemUI/res-keyguard/values/strings.xml +++ b/packages/SystemUI/res-keyguard/values/strings.xml @@ -358,12 +358,12 @@ Draw pattern to install update later - + Device updated. Enter PIN to continue. - + Device updated. Enter password to continue. - + Device updated. Draw pattern to continue. diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java index 7a0a24a85eaf0..03d9eb3455fdb 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java @@ -23,6 +23,7 @@ import static com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_NONE; import static com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_NON_STRONG_BIOMETRIC_TIMEOUT; import static com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_PREPARE_FOR_UPDATE; import static com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_RESTART; +import static com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_RESTART_FOR_MAINLINE_UPDATE; import static com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_TIMEOUT; import static com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_TRUSTAGENT_EXPIRED; import static com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_USER_REQUEST; @@ -99,6 +100,8 @@ public class KeyguardPasswordView extends KeyguardAbsKeyInputView { switch (reason) { case PROMPT_REASON_RESTART: return R.string.kg_prompt_reason_restart_password; + case PROMPT_REASON_RESTART_FOR_MAINLINE_UPDATE: + return R.string.kg_prompt_after_update_password; case PROMPT_REASON_TIMEOUT: return R.string.kg_prompt_reason_timeout_password; case PROMPT_REASON_DEVICE_ADMIN: @@ -106,7 +109,7 @@ public class KeyguardPasswordView extends KeyguardAbsKeyInputView { case PROMPT_REASON_USER_REQUEST: return R.string.kg_prompt_after_user_lockdown_password; case PROMPT_REASON_PREPARE_FOR_UPDATE: - return R.string.kg_prompt_reason_timeout_password; + return R.string.kg_prompt_unattended_update_password; case PROMPT_REASON_NON_STRONG_BIOMETRIC_TIMEOUT: return R.string.kg_prompt_reason_timeout_password; case PROMPT_REASON_TRUSTAGENT_EXPIRED: diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java index ffb28b05e7002..ad9fea6432da1 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java @@ -304,6 +304,9 @@ public class KeyguardPatternViewController case PROMPT_REASON_RESTART: resId = R.string.kg_prompt_reason_restart_pattern; break; + case PROMPT_REASON_RESTART_FOR_MAINLINE_UPDATE: + resId = R.string.kg_prompt_after_update_pattern; + break; case PROMPT_REASON_TIMEOUT: resId = R.string.kg_prompt_reason_timeout_pattern; break; @@ -314,7 +317,7 @@ public class KeyguardPatternViewController resId = R.string.kg_prompt_after_user_lockdown_pattern; break; case PROMPT_REASON_PREPARE_FOR_UPDATE: - resId = R.string.kg_prompt_reason_timeout_pattern; + resId = R.string.kg_prompt_unattended_update_pattern; break; case PROMPT_REASON_NON_STRONG_BIOMETRIC_TIMEOUT: resId = R.string.kg_prompt_reason_timeout_pattern; diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java index 687436c5d3884..38e5dc57d3163 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java @@ -21,6 +21,7 @@ import static com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_NONE; import static com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_NON_STRONG_BIOMETRIC_TIMEOUT; import static com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_PREPARE_FOR_UPDATE; import static com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_RESTART; +import static com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_RESTART_FOR_MAINLINE_UPDATE; import static com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_TIMEOUT; import static com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_TRUSTAGENT_EXPIRED; import static com.android.keyguard.KeyguardSecurityView.PROMPT_REASON_USER_REQUEST; @@ -113,6 +114,8 @@ public abstract class KeyguardPinBasedInputView extends KeyguardAbsKeyInputView switch (reason) { case PROMPT_REASON_RESTART: return R.string.kg_prompt_reason_restart_pin; + case PROMPT_REASON_RESTART_FOR_MAINLINE_UPDATE: + return R.string.kg_prompt_after_update_pin; case PROMPT_REASON_TIMEOUT: return R.string.kg_prompt_reason_timeout_pin; case PROMPT_REASON_DEVICE_ADMIN: @@ -120,7 +123,7 @@ public abstract class KeyguardPinBasedInputView extends KeyguardAbsKeyInputView case PROMPT_REASON_USER_REQUEST: return R.string.kg_prompt_after_user_lockdown_pin; case PROMPT_REASON_PREPARE_FOR_UPDATE: - return R.string.kg_prompt_reason_timeout_pin; + return R.string.kg_prompt_unattended_update_pin; case PROMPT_REASON_NON_STRONG_BIOMETRIC_TIMEOUT: return R.string.kg_prompt_reason_timeout_pin; case PROMPT_REASON_TRUSTAGENT_EXPIRED: diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityView.java index 419303d71f97b..21960e219fc93 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityView.java @@ -102,6 +102,12 @@ public interface KeyguardSecurityView { */ int PROMPT_REASON_PRIMARY_AUTH_LOCKED_OUT = 15; + /** + * Strong auth is required because the device has just booted because of an automatic + * mainline update. + */ + int PROMPT_REASON_RESTART_FOR_MAINLINE_UPDATE = 16; + /** * Reset the view and prepare to take input. This should do things like clearing the * password or pattern and clear error messages. diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index e7581255bebc6..8a73d9bd7669f 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -138,6 +138,7 @@ import com.android.systemui.dreams.DreamOverlayStateController; import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.Flags; +import com.android.systemui.flags.SystemPropertiesHelper; import com.android.systemui.keyguard.dagger.KeyguardModule; import com.android.systemui.keyguard.ui.viewmodel.DreamingToLockscreenTransitionViewModel; import com.android.systemui.log.SessionTracker; @@ -171,6 +172,7 @@ import dagger.Lazy; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; +import java.util.Objects; import java.util.concurrent.Executor; import java.util.function.Consumer; @@ -284,6 +286,8 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, * keyguard to show even if it is disabled for the current user. */ public static final String OPTION_FORCE_SHOW = "force_show"; + public static final String SYS_BOOT_REASON_PROP = "sys.boot.reason.last"; + public static final String REBOOT_MAINLINE_UPDATE = "reboot,mainline_update"; private final DreamOverlayStateController mDreamOverlayStateController; /** The stream type that the lock sounds are tied to. */ @@ -322,6 +326,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, private final SecureSettings mSecureSettings; private final SystemSettings mSystemSettings; private final SystemClock mSystemClock; + private SystemPropertiesHelper mSystemPropertiesHelper; /** * Used to keep the device awake while to ensure the keyguard finishes opening before @@ -853,7 +858,12 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, strongAuthTracker.isNonStrongBiometricAllowedAfterIdleTimeout(currentUser); if (any && !strongAuthTracker.hasUserAuthenticatedSinceBoot()) { - return KeyguardSecurityView.PROMPT_REASON_RESTART; + String reasonForReboot = mSystemPropertiesHelper.get(SYS_BOOT_REASON_PROP); + if (Objects.equals(reasonForReboot, REBOOT_MAINLINE_UPDATE)) { + return KeyguardSecurityView.PROMPT_REASON_RESTART_FOR_MAINLINE_UPDATE; + } else { + return KeyguardSecurityView.PROMPT_REASON_RESTART; + } } else if (any && (strongAuth & STRONG_AUTH_REQUIRED_AFTER_TIMEOUT) != 0) { return KeyguardSecurityView.PROMPT_REASON_TIMEOUT; } else if (any && (strongAuth & STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN) != 0) { @@ -1314,7 +1324,8 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, SystemSettings systemSettings, SystemClock systemClock, @Main CoroutineDispatcher mainDispatcher, - Lazy dreamingToLockscreenTransitionViewModel) { + Lazy dreamingToLockscreenTransitionViewModel, + SystemPropertiesHelper systemPropertiesHelper) { mContext = context; mUserTracker = userTracker; mFalsingCollector = falsingCollector; @@ -1331,6 +1342,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, mSecureSettings = secureSettings; mSystemSettings = systemSettings; mSystemClock = systemClock; + mSystemPropertiesHelper = systemPropertiesHelper; mStatusBarService = IStatusBarService.Stub.asInterface( ServiceManager.getService(Context.STATUS_BAR_SERVICE)); mKeyguardDisplayManager = keyguardDisplayManager; diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java b/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java index 6d6205cde53fe..61bacbda98a53 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java @@ -42,6 +42,7 @@ import com.android.systemui.dagger.qualifiers.UiBackground; import com.android.systemui.dreams.DreamOverlayStateController; import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FeatureFlags; +import com.android.systemui.flags.SystemPropertiesHelper; import com.android.systemui.keyguard.DismissCallbackRegistry; import com.android.systemui.keyguard.KeyguardUnlockAnimationController; import com.android.systemui.keyguard.KeyguardViewMediator; @@ -140,7 +141,8 @@ public class KeyguardModule { SystemSettings systemSettings, SystemClock systemClock, @Main CoroutineDispatcher mainDispatcher, - Lazy dreamingToLockscreenTransitionViewModel) { + Lazy dreamingToLockscreenTransitionViewModel, + SystemPropertiesHelper systemPropertiesHelper) { return new KeyguardViewMediator( context, uiEventLogger, @@ -179,7 +181,8 @@ public class KeyguardModule { systemSettings, systemClock, mainDispatcher, - dreamingToLockscreenTransitionViewModel); + dreamingToLockscreenTransitionViewModel, + systemPropertiesHelper); } /** */ diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java index b1b77acd3113d..350b5e20ab611 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java @@ -27,6 +27,8 @@ import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STR import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN; import static com.android.systemui.keyguard.KeyguardViewMediator.DELAYED_KEYGUARD_ACTION; import static com.android.systemui.keyguard.KeyguardViewMediator.KEYGUARD_LOCK_AFTER_DELAY_DEFAULT; +import static com.android.systemui.keyguard.KeyguardViewMediator.REBOOT_MAINLINE_UPDATE; +import static com.android.systemui.keyguard.KeyguardViewMediator.SYS_BOOT_REASON_PROP; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -80,6 +82,7 @@ import com.android.systemui.dreams.DreamOverlayStateController; import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FakeFeatureFlags; import com.android.systemui.flags.Flags; +import com.android.systemui.flags.SystemPropertiesHelper; import com.android.systemui.keyguard.ui.viewmodel.DreamingToLockscreenTransitionViewModel; import com.android.systemui.log.SessionTracker; import com.android.systemui.navigationbar.NavigationModeController; @@ -179,6 +182,7 @@ public class KeyguardViewMediatorTest extends SysuiTestCase { private @Mock CoroutineDispatcher mDispatcher; private @Mock DreamingToLockscreenTransitionViewModel mDreamingToLockscreenTransitionViewModel; + private @Mock SystemPropertiesHelper mSystemPropertiesHelper; private FakeFeatureFlags mFeatureFlags; private int mInitialUserId; @@ -380,6 +384,23 @@ public class KeyguardViewMediatorTest extends SysuiTestCase { mViewMediator.mViewMediatorCallback.getBouncerPromptReason()); } + @Test + public void testBouncerPrompt_deviceRestartedDueToMainlineUpdate() { + // GIVEN biometrics enrolled + when(mUpdateMonitor.isUnlockingWithBiometricsPossible(anyInt())).thenReturn(true); + + // WHEN reboot caused by ota update + KeyguardUpdateMonitor.StrongAuthTracker strongAuthTracker = + mock(KeyguardUpdateMonitor.StrongAuthTracker.class); + when(mUpdateMonitor.getStrongAuthTracker()).thenReturn(strongAuthTracker); + when(strongAuthTracker.hasUserAuthenticatedSinceBoot()).thenReturn(false); + when(mSystemPropertiesHelper.get(SYS_BOOT_REASON_PROP)).thenReturn(REBOOT_MAINLINE_UPDATE); + + // THEN the bouncer prompt reason should return PROMPT_REASON_RESTART_FOR_OTA + assertEquals(KeyguardSecurityView.PROMPT_REASON_RESTART_FOR_MAINLINE_UPDATE, + mViewMediator.mViewMediatorCallback.getBouncerPromptReason()); + } + @Test public void testBouncerPrompt_afterUserLockDown() { // GIVEN biometrics enrolled @@ -747,7 +768,8 @@ public class KeyguardViewMediatorTest extends SysuiTestCase { mSystemSettings, mSystemClock, mDispatcher, - () -> mDreamingToLockscreenTransitionViewModel); + () -> mDreamingToLockscreenTransitionViewModel, + mSystemPropertiesHelper); mViewMediator.start(); mViewMediator.registerCentralSurfaces(mCentralSurfaces, null, null, null, null, null);