Merge "[Bouncer] hide/show keyboard when focus is..." into tm-qpr-dev

This commit is contained in:
Aaron Liu
2022-12-05 23:41:17 +00:00
committed by Android (Google) Code Review
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.graphics.Rect;
import android.os.Trace; import android.os.Trace;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.WindowInsets;
import android.view.WindowInsetsAnimationControlListener; import android.view.WindowInsetsAnimationControlListener;
import android.view.WindowInsetsAnimationController; import android.view.WindowInsetsAnimationController;
import android.view.animation.AnimationUtils; import android.view.animation.AnimationUtils;
@@ -236,4 +237,50 @@ public class KeyguardPasswordView extends KeyguardAbsKeyInputView {
return getResources().getString( return getResources().getString(
com.android.internal.R.string.keyguard_accessibility_password_unlock); 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.KeyEvent;
import android.view.View; import android.view.View;
import android.view.ViewGroup.MarginLayoutParams; import android.view.ViewGroup.MarginLayoutParams;
import android.view.WindowInsets;
import android.view.inputmethod.EditorInfo; import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodManager;
@@ -200,12 +199,9 @@ public class KeyguardPasswordViewController
return; return;
} }
mView.post(() -> {
if (mView.isShown()) { if (mView.isShown()) {
mPasswordEntry.requestFocus(); mView.showKeyboard();
mPasswordEntry.getWindowInsetsController().show(WindowInsets.Type.ime());
} }
});
} }
@Override @Override
@@ -227,16 +223,12 @@ public class KeyguardPasswordViewController
super.onPause(); super.onPause();
}); });
} }
if (mPasswordEntry.isAttachedToWindow()) { mView.hideKeyboard();
mPasswordEntry.getWindowInsetsController().hide(WindowInsets.Type.ime());
}
} }
@Override @Override
public void onStartingToHide() { public void onStartingToHide() {
if (mPasswordEntry.isAttachedToWindow()) { mView.hideKeyboard();
mPasswordEntry.getWindowInsetsController().hide(WindowInsets.Type.ime());
}
} }
private void updateSwitchImeButton() { private void updateSwitchImeButton() {

View File

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