Merge "[Bouncer] hide/show keyboard when focus is..." into tm-qpr-dev am: 28bd55410a am: 4a2eb292b4

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/20599101

Change-Id: Ic872cc051d41901dbca371cf3fc6039753723202
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Aaron Liu
2022-12-06 16:43:18 +00:00
committed by Automerger Merge Worker
3 changed files with 71 additions and 14 deletions

View File

@@ -34,6 +34,7 @@ import android.graphics.Insets;
import android.graphics.Rect;
import android.os.Trace;
import android.util.AttributeSet;
import android.view.WindowInsets;
import android.view.WindowInsetsAnimationControlListener;
import android.view.WindowInsetsAnimationController;
import android.view.animation.AnimationUtils;
@@ -236,4 +237,50 @@ public class KeyguardPasswordView extends KeyguardAbsKeyInputView {
return getResources().getString(
com.android.internal.R.string.keyguard_accessibility_password_unlock);
}
@Override
public WindowInsets onApplyWindowInsets(WindowInsets insets) {
if (!mPasswordEntry.isFocused() && isVisibleToUser()) {
mPasswordEntry.requestFocus();
}
return super.onApplyWindowInsets(insets);
}
@Override
public void onWindowFocusChanged(boolean hasWindowFocus) {
super.onWindowFocusChanged(hasWindowFocus);
if (hasWindowFocus) {
if (isVisibleToUser()) {
showKeyboard();
} else {
hideKeyboard();
}
}
}
/**
* Sends signal to the focused window to show the keyboard.
*/
public void showKeyboard() {
post(() -> {
if (mPasswordEntry.isAttachedToWindow()
&& !mPasswordEntry.getRootWindowInsets().isVisible(WindowInsets.Type.ime())) {
mPasswordEntry.requestFocus();
mPasswordEntry.getWindowInsetsController().show(WindowInsets.Type.ime());
}
});
}
/**
* Sends signal to the focused window to hide the keyboard.
*/
public void hideKeyboard() {
post(() -> {
if (mPasswordEntry.isAttachedToWindow()
&& mPasswordEntry.getRootWindowInsets().isVisible(WindowInsets.Type.ime())) {
mPasswordEntry.clearFocus();
mPasswordEntry.getWindowInsetsController().hide(WindowInsets.Type.ime());
}
});
}
}

View File

@@ -26,7 +26,6 @@ import android.text.method.TextKeyListener;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup.MarginLayoutParams;
import android.view.WindowInsets;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodManager;
@@ -200,12 +199,9 @@ public class KeyguardPasswordViewController
return;
}
mView.post(() -> {
if (mView.isShown()) {
mPasswordEntry.requestFocus();
mPasswordEntry.getWindowInsetsController().show(WindowInsets.Type.ime());
}
});
if (mView.isShown()) {
mView.showKeyboard();
}
}
@Override
@@ -227,16 +223,12 @@ public class KeyguardPasswordViewController
super.onPause();
});
}
if (mPasswordEntry.isAttachedToWindow()) {
mPasswordEntry.getWindowInsetsController().hide(WindowInsets.Type.ime());
}
mView.hideKeyboard();
}
@Override
public void onStartingToHide() {
if (mPasswordEntry.isAttachedToWindow()) {
mPasswordEntry.getWindowInsetsController().hide(WindowInsets.Type.ime());
}
mView.hideKeyboard();
}
private void updateSwitchImeButton() {

View File

@@ -19,6 +19,7 @@ package com.android.keyguard
import android.testing.AndroidTestingRunner
import android.testing.TestableLooper
import android.view.inputmethod.InputMethodManager
import android.widget.EditText
import androidx.test.filters.SmallTest
import com.android.internal.util.LatencyTracker
import com.android.internal.widget.LockPatternUtils
@@ -43,6 +44,8 @@ class KeyguardPasswordViewControllerTest : SysuiTestCase() {
@Mock
private lateinit var keyguardPasswordView: KeyguardPasswordView
@Mock
private lateinit var passwordEntry: EditText
@Mock
lateinit var keyguardUpdateMonitor: KeyguardUpdateMonitor
@Mock
lateinit var securityMode: KeyguardSecurityModel.SecurityMode
@@ -81,6 +84,9 @@ class KeyguardPasswordViewControllerTest : SysuiTestCase() {
).thenReturn(mKeyguardMessageArea)
Mockito.`when`(messageAreaControllerFactory.create(mKeyguardMessageArea))
.thenReturn(mKeyguardMessageAreaController)
Mockito.`when`(keyguardPasswordView.passwordTextViewId).thenReturn(R.id.passwordEntry)
Mockito.`when`(keyguardPasswordView.findViewById<EditText>(R.id.passwordEntry)
).thenReturn(passwordEntry)
keyguardPasswordViewController = KeyguardPasswordViewController(
keyguardPasswordView,
keyguardUpdateMonitor,
@@ -103,7 +109,10 @@ class KeyguardPasswordViewControllerTest : SysuiTestCase() {
Mockito.`when`(keyguardViewController.isBouncerShowing).thenReturn(true)
Mockito.`when`(keyguardPasswordView.isShown).thenReturn(true)
keyguardPasswordViewController.onResume(KeyguardSecurityView.VIEW_REVEALED)
keyguardPasswordView.post { verify(keyguardPasswordView).requestFocus() }
keyguardPasswordView.post {
verify(keyguardPasswordView).requestFocus()
verify(keyguardPasswordView).showKeyboard()
}
}
@Test
@@ -114,6 +123,15 @@ class KeyguardPasswordViewControllerTest : SysuiTestCase() {
verify(keyguardPasswordView, never()).requestFocus()
}
@Test
fun testHideKeyboardWhenOnPause() {
keyguardPasswordViewController.onPause()
keyguardPasswordView.post {
verify(keyguardPasswordView).clearFocus()
verify(keyguardPasswordView).hideKeyboard()
}
}
@Test
fun startAppearAnimation() {
keyguardPasswordViewController.startAppearAnimation()