From 6f0ad152bea1fa99970c0bd410c7096390da8af1 Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Fri, 8 May 2020 16:39:45 -0700 Subject: [PATCH] Smoothly hide the keyboard Fixes: 155980369 Test: manual Test: atest KeyguardSecurityContainerTest Change-Id: I678d9a04fdea6895c24cd4bdb77348cdeb2daced --- .../keyguard/KeyguardSecurityContainer.java | 9 ++- .../KeyguardSecurityContainerTest.java | 73 ++++++++++++++++--- 2 files changed, 71 insertions(+), 11 deletions(-) diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java index b99fb057ee656..1a4dd1e6dd36f 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java @@ -103,7 +103,8 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe private KeyguardSecurityModel mSecurityModel; private LockPatternUtils mLockPatternUtils; - private KeyguardSecurityViewFlipper mSecurityViewFlipper; + @VisibleForTesting + KeyguardSecurityViewFlipper mSecurityViewFlipper; private boolean mIsVerifyUnlockOnly; private SecurityMode mCurrentSecuritySelection = SecurityMode.Invalid; private KeyguardSecurityView mCurrentSecurityView; @@ -375,6 +376,9 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe } public boolean startDisappearAnimation(Runnable onFinishRunnable) { + if (mCurrentSecuritySelection == SecurityMode.Password) { + mSecurityViewFlipper.getWindowInsetsController().hide(WindowInsets.Type.ime()); + } if (mCurrentSecuritySelection != SecurityMode.None) { return getSecurityView(mCurrentSecuritySelection).startDisappearAnimation( onFinishRunnable); @@ -397,7 +401,8 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe return mSecurityViewFlipper.getTitle(); } - private KeyguardSecurityView getSecurityView(SecurityMode securityMode) { + @VisibleForTesting + protected KeyguardSecurityView getSecurityView(SecurityMode securityMode) { final int securityViewIdForMode = getSecurityViewIdForMode(securityMode); KeyguardSecurityView view = null; final int children = mSecurityViewFlipper.getChildCount(); diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerTest.java index 64590fd3a36b5..e324d844144cb 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSecurityContainerTest.java @@ -16,31 +16,75 @@ package com.android.keyguard; +import static android.view.WindowInsets.Type.ime; + +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + import android.content.Context; -import android.test.UiThreadTest; +import android.testing.AndroidTestingRunner; +import android.testing.TestableLooper; import android.view.LayoutInflater; +import android.view.WindowInsetsController; import androidx.test.filters.SmallTest; -import androidx.test.runner.AndroidJUnit4; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.statusbar.policy.KeyguardStateController; +import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; @SmallTest -@RunWith(AndroidJUnit4.class) +@RunWith(AndroidTestingRunner.class) +@TestableLooper.RunWithLooper() public class KeyguardSecurityContainerTest extends SysuiTestCase { - @UiThreadTest + @Mock + private KeyguardSecurityModel mKeyguardSecurityModel; + @Mock + private KeyguardStateController mKeyguardStateController; + @Mock + private KeyguardUpdateMonitor mKeyguardUpdateMonitor; + @Mock + private KeyguardSecurityContainer.SecurityCallback mSecurityCallback; + @Mock + private KeyguardSecurityView mSecurityView; + @Mock + private WindowInsetsController mWindowInsetsController; + @Mock + private KeyguardSecurityViewFlipper mSecurityViewFlipper; + @Rule + public MockitoRule mRule = MockitoJUnit.rule(); + private KeyguardSecurityContainer mKeyguardSecurityContainer; + + @Before + public void setup() { + mDependency.injectTestDependency(KeyguardStateController.class, mKeyguardStateController); + mDependency.injectTestDependency(KeyguardSecurityModel.class, mKeyguardSecurityModel); + mDependency.injectTestDependency(KeyguardUpdateMonitor.class, mKeyguardUpdateMonitor); + mKeyguardSecurityContainer = new KeyguardSecurityContainer(getContext()) { + @Override + protected KeyguardSecurityView getSecurityView( + KeyguardSecurityModel.SecurityMode securityMode) { + return mSecurityView; + } + }; + mKeyguardSecurityContainer.mSecurityViewFlipper = mSecurityViewFlipper; + when(mSecurityViewFlipper.getWindowInsetsController()).thenReturn(mWindowInsetsController); + mKeyguardSecurityContainer.setSecurityCallback(mSecurityCallback); + } + @Test public void showSecurityScreen_canInflateAllModes() { - mDependency.injectMockDependency(KeyguardStateController.class); - KeyguardSecurityContainer keyguardSecurityContainer = - new KeyguardSecurityContainer(getContext()); - Context context = getContext(); for (int theme : new int[] {R.style.Theme_SystemUI, R.style.Theme_SystemUI_Light}) { @@ -49,7 +93,7 @@ public class KeyguardSecurityContainerTest extends SysuiTestCase { KeyguardSecurityModel.SecurityMode[] modes = KeyguardSecurityModel.SecurityMode.values(); for (KeyguardSecurityModel.SecurityMode mode : modes) { - final int resId = keyguardSecurityContainer.getLayoutIdFor(mode); + final int resId = mKeyguardSecurityContainer.getLayoutIdFor(mode); if (resId == 0) { continue; } @@ -57,4 +101,15 @@ public class KeyguardSecurityContainerTest extends SysuiTestCase { } } } + + @Test + public void startDisappearAnimation_animatesKeyboard() { + when(mKeyguardSecurityModel.getSecurityMode(anyInt())).thenReturn( + KeyguardSecurityModel.SecurityMode.Password); + mKeyguardSecurityContainer.showPrimarySecurityScreen(false /* turningOff */); + + mKeyguardSecurityContainer.startDisappearAnimation(null); + verify(mSecurityView).startDisappearAnimation(eq(null)); + verify(mWindowInsetsController).hide(eq(ime())); + } } \ No newline at end of file