Loading packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java +6 −11 Original line number Diff line number Diff line Loading @@ -132,8 +132,7 @@ public class AuthContainerView extends LinearLayout private final OnBackInvokedCallback mBackCallback = this::onBackInvoked; private final @Background DelayableExecutor mBackgroundExecutor; private int mOrientation; private boolean mSkipFirstLostFocus = false; private boolean mIsOrientationChanged = false; // Non-null only if the dialog is in the act of dismissing and has not sent the reason yet. @Nullable @AuthDialogCallback.DismissedReason private Integer mPendingCallbackReason; Loading Loading @@ -444,6 +443,7 @@ public class AuthContainerView extends LinearLayout @Override public void onOrientationChanged() { maybeUpdatePositionForUdfps(true /* invalidate */); mIsOrientationChanged = true; } @Override Loading @@ -452,8 +452,8 @@ public class AuthContainerView extends LinearLayout if (!hasWindowFocus) { //it's a workaround to avoid closing BP incorrectly //BP gets a onWindowFocusChanged(false) and then gets a onWindowFocusChanged(true) if (mSkipFirstLostFocus) { mSkipFirstLostFocus = false; if (mIsOrientationChanged) { mIsOrientationChanged = false; return; } Log.v(TAG, "Lost window focus, dismissing the dialog"); Loading @@ -465,9 +465,6 @@ public class AuthContainerView extends LinearLayout public void onAttachedToWindow() { super.onAttachedToWindow(); //save the first orientation mOrientation = getResources().getConfiguration().orientation; mWakefulnessLifecycle.addObserver(this); if (Utils.isBiometricAllowed(mConfig.mPromptInfo)) { Loading Loading @@ -623,7 +620,7 @@ public class AuthContainerView extends LinearLayout } if (savedState != null) { mSkipFirstLostFocus = savedState.getBoolean( mIsOrientationChanged = savedState.getBoolean( AuthDialog.KEY_BIOMETRIC_ORIENTATION_CHANGED); } Loading Loading @@ -717,9 +714,7 @@ public class AuthContainerView extends LinearLayout mBiometricView != null && mCredentialView == null); outState.putBoolean(AuthDialog.KEY_CREDENTIAL_SHOWING, mCredentialView != null); if (mOrientation != getResources().getConfiguration().orientation) { outState.putBoolean(AuthDialog.KEY_BIOMETRIC_ORIENTATION_CHANGED, true); } outState.putBoolean(AuthDialog.KEY_BIOMETRIC_ORIENTATION_CHANGED, mIsOrientationChanged); if (mBiometricView != null) { mBiometricView.onSaveState(outState); Loading packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt +19 −0 Original line number Diff line number Diff line Loading @@ -160,6 +160,25 @@ class AuthContainerViewTest : SysuiTestCase() { assertThat(container.parent).isNull() } @Test fun testFocusLossAfterRotating() { val container = initializeFingerprintContainer() waitForIdleSync() val requestID = authContainer?.requestId ?: 0L verify(callback).onDialogAnimatedIn(requestID) container.onOrientationChanged() container.onWindowFocusChanged(false) waitForIdleSync() verify(callback, never()).onDismissed( eq(AuthDialogCallback.DISMISSED_USER_CANCELED), eq<ByteArray?>(null), /* credentialAttestation */ eq(requestID) ) } @Test fun testDismissesOnFocusLoss_hidesKeyboardWhenVisible() { val container = initializeFingerprintContainer( Loading Loading
packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java +6 −11 Original line number Diff line number Diff line Loading @@ -132,8 +132,7 @@ public class AuthContainerView extends LinearLayout private final OnBackInvokedCallback mBackCallback = this::onBackInvoked; private final @Background DelayableExecutor mBackgroundExecutor; private int mOrientation; private boolean mSkipFirstLostFocus = false; private boolean mIsOrientationChanged = false; // Non-null only if the dialog is in the act of dismissing and has not sent the reason yet. @Nullable @AuthDialogCallback.DismissedReason private Integer mPendingCallbackReason; Loading Loading @@ -444,6 +443,7 @@ public class AuthContainerView extends LinearLayout @Override public void onOrientationChanged() { maybeUpdatePositionForUdfps(true /* invalidate */); mIsOrientationChanged = true; } @Override Loading @@ -452,8 +452,8 @@ public class AuthContainerView extends LinearLayout if (!hasWindowFocus) { //it's a workaround to avoid closing BP incorrectly //BP gets a onWindowFocusChanged(false) and then gets a onWindowFocusChanged(true) if (mSkipFirstLostFocus) { mSkipFirstLostFocus = false; if (mIsOrientationChanged) { mIsOrientationChanged = false; return; } Log.v(TAG, "Lost window focus, dismissing the dialog"); Loading @@ -465,9 +465,6 @@ public class AuthContainerView extends LinearLayout public void onAttachedToWindow() { super.onAttachedToWindow(); //save the first orientation mOrientation = getResources().getConfiguration().orientation; mWakefulnessLifecycle.addObserver(this); if (Utils.isBiometricAllowed(mConfig.mPromptInfo)) { Loading Loading @@ -623,7 +620,7 @@ public class AuthContainerView extends LinearLayout } if (savedState != null) { mSkipFirstLostFocus = savedState.getBoolean( mIsOrientationChanged = savedState.getBoolean( AuthDialog.KEY_BIOMETRIC_ORIENTATION_CHANGED); } Loading Loading @@ -717,9 +714,7 @@ public class AuthContainerView extends LinearLayout mBiometricView != null && mCredentialView == null); outState.putBoolean(AuthDialog.KEY_CREDENTIAL_SHOWING, mCredentialView != null); if (mOrientation != getResources().getConfiguration().orientation) { outState.putBoolean(AuthDialog.KEY_BIOMETRIC_ORIENTATION_CHANGED, true); } outState.putBoolean(AuthDialog.KEY_BIOMETRIC_ORIENTATION_CHANGED, mIsOrientationChanged); if (mBiometricView != null) { mBiometricView.onSaveState(outState); Loading
packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt +19 −0 Original line number Diff line number Diff line Loading @@ -160,6 +160,25 @@ class AuthContainerViewTest : SysuiTestCase() { assertThat(container.parent).isNull() } @Test fun testFocusLossAfterRotating() { val container = initializeFingerprintContainer() waitForIdleSync() val requestID = authContainer?.requestId ?: 0L verify(callback).onDialogAnimatedIn(requestID) container.onOrientationChanged() container.onWindowFocusChanged(false) waitForIdleSync() verify(callback, never()).onDismissed( eq(AuthDialogCallback.DISMISSED_USER_CANCELED), eq<ByteArray?>(null), /* credentialAttestation */ eq(requestID) ) } @Test fun testDismissesOnFocusLoss_hidesKeyboardWhenVisible() { val container = initializeFingerprintContainer( Loading