From dab0ebe4d687eaa627f0fd8345a203d374fdabf6 Mon Sep 17 00:00:00 2001 From: Aaron Liu Date: Tue, 26 Apr 2022 21:54:17 +0000 Subject: [PATCH] [Bouncer] Add condition to keep keyboard hidden Ensure that keyboard remains hidden unless bouncer is showing completely. Fixes: 199679635 Test: Manual Change-Id: If9f18f4c85d890f7acff2382d379251a5679c3e5 --- .../keyguard/KeyguardInputViewController.java | 8 +- .../KeyguardPasswordViewController.java | 10 +- .../KeyguardPasswordViewControllerTest.kt | 114 ++++++++++++++++++ ...yguardSecurityContainerControllerTest.java | 5 +- 4 files changed, 133 insertions(+), 4 deletions(-) create mode 100644 packages/SystemUI/tests/src/com/android/keyguard/KeyguardPasswordViewControllerTest.kt diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java index 75425e1e6ca35..6a68c70c6acbe 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java @@ -28,6 +28,7 @@ import com.android.keyguard.KeyguardSecurityModel.SecurityMode; import com.android.systemui.R; import com.android.systemui.classifier.FalsingCollector; import com.android.systemui.dagger.qualifiers.Main; +import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.policy.DevicePostureController; import com.android.systemui.util.ViewController; import com.android.systemui.util.concurrency.DelayableExecutor; @@ -168,6 +169,7 @@ public abstract class KeyguardInputViewController private final EmergencyButtonController.Factory mEmergencyButtonControllerFactory; private final FalsingCollector mFalsingCollector; private final DevicePostureController mDevicePostureController; + private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; @Inject public Factory(KeyguardUpdateMonitor keyguardUpdateMonitor, @@ -178,7 +180,8 @@ public abstract class KeyguardInputViewController @Main Resources resources, LiftToActivateListener liftToActivateListener, TelephonyManager telephonyManager, FalsingCollector falsingCollector, EmergencyButtonController.Factory emergencyButtonControllerFactory, - DevicePostureController devicePostureController) { + DevicePostureController devicePostureController, + StatusBarKeyguardViewManager statusBarKeyguardViewManager) { mKeyguardUpdateMonitor = keyguardUpdateMonitor; mLockPatternUtils = lockPatternUtils; mLatencyTracker = latencyTracker; @@ -191,6 +194,7 @@ public abstract class KeyguardInputViewController mEmergencyButtonControllerFactory = emergencyButtonControllerFactory; mFalsingCollector = falsingCollector; mDevicePostureController = devicePostureController; + mStatusBarKeyguardViewManager = statusBarKeyguardViewManager; } /** Create a new {@link KeyguardInputViewController}. */ @@ -211,7 +215,7 @@ public abstract class KeyguardInputViewController mKeyguardUpdateMonitor, securityMode, mLockPatternUtils, keyguardSecurityCallback, mMessageAreaControllerFactory, mLatencyTracker, mInputMethodManager, emergencyButtonController, mMainExecutor, mResources, - mFalsingCollector); + mFalsingCollector, mStatusBarKeyguardViewManager); } else if (keyguardInputView instanceof KeyguardPINView) { return new KeyguardPinViewController((KeyguardPINView) keyguardInputView, diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordViewController.java index 0529cdbcbb139..19035264db7f1 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordViewController.java @@ -43,6 +43,7 @@ import com.android.settingslib.Utils; import com.android.systemui.R; import com.android.systemui.classifier.FalsingCollector; import com.android.systemui.dagger.qualifiers.Main; +import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.util.concurrency.DelayableExecutor; import java.util.List; @@ -55,6 +56,7 @@ public class KeyguardPasswordViewController private final KeyguardSecurityCallback mKeyguardSecurityCallback; private final InputMethodManager mInputMethodManager; private final DelayableExecutor mMainExecutor; + private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; private final boolean mShowImeAtScreenOn; private EditText mPasswordEntry; private ImageView mSwitchImeButton; @@ -116,13 +118,15 @@ public class KeyguardPasswordViewController EmergencyButtonController emergencyButtonController, @Main DelayableExecutor mainExecutor, @Main Resources resources, - FalsingCollector falsingCollector) { + FalsingCollector falsingCollector, + StatusBarKeyguardViewManager statusBarKeyguardViewManager) { super(view, keyguardUpdateMonitor, securityMode, lockPatternUtils, keyguardSecurityCallback, messageAreaControllerFactory, latencyTracker, falsingCollector, emergencyButtonController); mKeyguardSecurityCallback = keyguardSecurityCallback; mInputMethodManager = inputMethodManager; mMainExecutor = mainExecutor; + mStatusBarKeyguardViewManager = statusBarKeyguardViewManager; mShowImeAtScreenOn = resources.getBoolean(R.bool.kg_show_ime_at_screen_on); mPasswordEntry = mView.findViewById(mView.getPasswordTextViewId()); mSwitchImeButton = mView.findViewById(R.id.switch_ime_button); @@ -205,6 +209,10 @@ public class KeyguardPasswordViewController } private void showInput() { + if (!mStatusBarKeyguardViewManager.isBouncerShowing()) { + return; + } + mView.post(() -> { if (mView.isShown()) { mPasswordEntry.requestFocus(); diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPasswordViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPasswordViewControllerTest.kt new file mode 100644 index 0000000000000..aff94eb7aef53 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPasswordViewControllerTest.kt @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2022 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.keyguard + +import android.testing.AndroidTestingRunner +import android.testing.TestableLooper +import android.view.inputmethod.InputMethodManager +import androidx.test.filters.SmallTest +import com.android.internal.util.LatencyTracker +import com.android.internal.widget.LockPatternUtils +import com.android.systemui.R +import com.android.systemui.SysuiTestCase +import com.android.systemui.classifier.FalsingCollector +import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager +import com.android.systemui.util.concurrency.DelayableExecutor +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito +import org.mockito.Mockito.never +import org.mockito.Mockito.verify +import org.mockito.MockitoAnnotations + +@SmallTest +@RunWith(AndroidTestingRunner::class) +@TestableLooper.RunWithLooper +class KeyguardPasswordViewControllerTest : SysuiTestCase() { + @Mock + private lateinit var keyguardPasswordView: KeyguardPasswordView + @Mock + lateinit var keyguardUpdateMonitor: KeyguardUpdateMonitor + @Mock + lateinit var securityMode: KeyguardSecurityModel.SecurityMode + @Mock + lateinit var lockPatternUtils: LockPatternUtils + @Mock + lateinit var keyguardSecurityCallback: KeyguardSecurityCallback + @Mock + lateinit var messageAreaControllerFactory: KeyguardMessageAreaController.Factory + @Mock + lateinit var latencyTracker: LatencyTracker + @Mock + lateinit var inputMethodManager: InputMethodManager + @Mock + lateinit var emergencyButtonController: EmergencyButtonController + @Mock + lateinit var mainExecutor: DelayableExecutor + @Mock + lateinit var falsingCollector: FalsingCollector + @Mock + lateinit var statusBarKeyguardViewManager: StatusBarKeyguardViewManager + @Mock + private lateinit var mKeyguardMessageArea: KeyguardMessageArea + @Mock + private lateinit var mKeyguardMessageAreaController: KeyguardMessageAreaController + + private lateinit var keyguardPasswordViewController: KeyguardPasswordViewController + + @Before + fun setup() { + MockitoAnnotations.initMocks(this) + Mockito.`when`(keyguardPasswordView + .findViewById(R.id.keyguard_message_area)) + .thenReturn(mKeyguardMessageArea) + Mockito.`when`(messageAreaControllerFactory.create(mKeyguardMessageArea)) + .thenReturn(mKeyguardMessageAreaController) + keyguardPasswordViewController = KeyguardPasswordViewController( + keyguardPasswordView, + keyguardUpdateMonitor, + securityMode, + lockPatternUtils, + keyguardSecurityCallback, + messageAreaControllerFactory, + latencyTracker, + inputMethodManager, + emergencyButtonController, + mainExecutor, + mContext.resources, + falsingCollector, + statusBarKeyguardViewManager + ) + } + + @Test + fun testFocusWhenBouncerIsShown() { + Mockito.`when`(statusBarKeyguardViewManager.isBouncerShowing).thenReturn(true) + Mockito.`when`(keyguardPasswordView.isShown).thenReturn(true) + keyguardPasswordViewController.onResume(KeyguardSecurityView.VIEW_REVEALED) + keyguardPasswordView.post { verify(keyguardPasswordView).requestFocus() } + } + + @Test + fun testDoNotFocusWhenBouncerIsHidden() { + Mockito.`when`(statusBarKeyguardViewManager.isBouncerShowing).thenReturn(false) + Mockito.`when`(keyguardPasswordView.isShown).thenReturn(true) + keyguardPasswordViewController.onResume(KeyguardSecurityView.VIEW_REVEALED) + verify(keyguardPasswordView, never()).requestFocus() + } +} \ No newline at end of file diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java index a819a7a0f8156..430f880ec6709 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerControllerTest.java @@ -51,6 +51,7 @@ import com.android.systemui.classifier.FalsingCollector; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.log.SessionTracker; import com.android.systemui.plugins.FalsingManager; +import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.UserSwitcherController; @@ -123,6 +124,8 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase { private UserSwitcherController mUserSwitcherController; @Mock private SessionTracker mSessionTracker; + @Mock + private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; private Configuration mConfiguration; private KeyguardSecurityContainerController mKeyguardSecurityContainerController; @@ -150,7 +153,7 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase { (KeyguardPasswordView) mKeyguardPasswordView, mKeyguardUpdateMonitor, SecurityMode.Password, mLockPatternUtils, null, mKeyguardMessageAreaControllerFactory, null, null, mEmergencyButtonController, - null, mock(Resources.class), null); + null, mock(Resources.class), null, mStatusBarKeyguardViewManager); mKeyguardSecurityContainerController = new KeyguardSecurityContainerController.Factory( mView, mAdminSecondaryLockScreenControllerFactory, mLockPatternUtils,