Merge "Request hiding IME before starting dismiss biometric UI animation" into tm-qpr-dev

This commit is contained in:
Ming-Shin Lu
2022-11-02 19:05:34 +00:00
committed by Android (Google) Code Review
2 changed files with 37 additions and 0 deletions

View File

@@ -762,6 +762,12 @@ public class AuthContainerView extends LinearLayout
} }
mContainerState = STATE_ANIMATING_OUT; mContainerState = STATE_ANIMATING_OUT;
// Request hiding soft-keyboard before animating away credential UI, in case IME insets
// animation get delayed by dismissing animation.
if (isAttachedToWindow() && getRootWindowInsets().isVisible(WindowInsets.Type.ime())) {
getWindowInsetsController().hide(WindowInsets.Type.ime());
}
if (sendReason) { if (sendReason) {
mPendingCallbackReason = reason; mPendingCallbackReason = reason;
} else { } else {

View File

@@ -35,6 +35,8 @@ import android.view.WindowInsets
import android.view.WindowManager import android.view.WindowManager
import android.widget.ScrollView import android.widget.ScrollView
import androidx.test.filters.SmallTest import androidx.test.filters.SmallTest
import com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn
import com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn
import com.android.internal.jank.InteractionJankMonitor import com.android.internal.jank.InteractionJankMonitor
import com.android.internal.widget.LockPatternUtils import com.android.internal.widget.LockPatternUtils
import com.android.systemui.R import com.android.systemui.R
@@ -158,6 +160,35 @@ class AuthContainerViewTest : SysuiTestCase() {
assertThat(container.parent).isNull() assertThat(container.parent).isNull()
} }
@Test
fun testDismissesOnFocusLoss_hidesKeyboardWhenVisible() {
val container = initializeFingerprintContainer(
authenticators = BiometricManager.Authenticators.DEVICE_CREDENTIAL
)
waitForIdleSync()
val requestID = authContainer?.requestId ?: 0L
// Simulate keyboard was shown on the credential view
val windowInsetsController = container.windowInsetsController
spyOn(windowInsetsController)
spyOn(container.rootWindowInsets)
doReturn(true).`when`(container.rootWindowInsets).isVisible(WindowInsets.Type.ime())
container.onWindowFocusChanged(false)
waitForIdleSync()
// Expect hiding IME request will be invoked when dismissing the view
verify(windowInsetsController)?.hide(WindowInsets.Type.ime())
verify(callback).onDismissed(
eq(AuthDialogCallback.DISMISSED_USER_CANCELED),
eq<ByteArray?>(null), /* credentialAttestation */
eq(requestID)
)
assertThat(container.parent).isNull()
}
@Test @Test
fun testActionAuthenticated_sendsDismissedAuthenticated() { fun testActionAuthenticated_sendsDismissedAuthenticated() {
val container = initializeFingerprintContainer() val container = initializeFingerprintContainer()