From 43df5b95994e39b85cbb5de37a70d15a6c732220 Mon Sep 17 00:00:00 2001 From: Joe Bolinger Date: Thu, 1 Jul 2021 18:27:56 -0700 Subject: [PATCH 1/3] Execute hide overlay immediatly. Address race conditions during configuration changes. Fix: 192552884 Test: manual (rotate device while using udfps device) Change-Id: I715e0e53b2e972f06c03ac2e637a3e259643b1a3 --- .../systemui/biometrics/UdfpsController.java | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java index c5a0dfb45eda5..38f85cdb4a9bb 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java @@ -663,6 +663,7 @@ public class UdfpsController implements DozeReceiver { private void showUdfpsOverlay(@NonNull ServerRequest request) { mExecution.assertIsMainThread(); + final int reason = request.mRequestReason; if (mView == null) { try { @@ -751,22 +752,22 @@ public class UdfpsController implements DozeReceiver { } private void hideUdfpsOverlay() { - mFgExecutor.execute(() -> { - if (mView != null) { - Log.v(TAG, "hideUdfpsOverlay | removing window"); - // Reset the controller back to its starting state. - onFingerUp(); - mWindowManager.removeView(mView); - mView.setOnTouchListener(null); - mView.setOnHoverListener(null); - mView.setAnimationViewController(null); - mAccessibilityManager.removeTouchExplorationStateChangeListener( - mTouchExplorationStateChangeListener); - mView = null; - } else { - Log.v(TAG, "hideUdfpsOverlay | the overlay is already hidden"); - } - }); + mExecution.assertIsMainThread(); + + if (mView != null) { + Log.v(TAG, "hideUdfpsOverlay | removing window"); + // Reset the controller back to its starting state. + onFingerUp(); + mWindowManager.removeView(mView); + mView.setOnTouchListener(null); + mView.setOnHoverListener(null); + mView.setAnimationViewController(null); + mAccessibilityManager.removeTouchExplorationStateChangeListener( + mTouchExplorationStateChangeListener); + mView = null; + } else { + Log.v(TAG, "hideUdfpsOverlay | the overlay is already hidden"); + } } /** From 571124edc93a50c88f1cd778b26b2c75d7daf27e Mon Sep 17 00:00:00 2001 From: Joe Bolinger Date: Fri, 2 Jul 2021 14:47:50 -0700 Subject: [PATCH 2/3] Add modality switch callback to update UDFPS layout during configuration changes. Addresses a race condition when the view is attached and the modality switch is in progress. Also fixes an issue with the confirmation button being re-enabled after a configuration change. Bug: 190832486 Test: atest AuthBiometricFaceToFingerprintViewTest Change-Id: I701d9d6f03474df2dda6f48e506208ddf7eab2c3 --- .../AuthBiometricFaceToFingerprintView.java | 10 +++++ .../biometrics/AuthBiometricView.java | 3 ++ .../biometrics/AuthContainerView.java | 39 +++++++++++-------- .../systemui/biometrics/ModalityListener.java | 36 +++++++++++++++++ ...uthBiometricFaceToFingerprintViewTest.java | 25 ++++++++++++ 5 files changed, 97 insertions(+), 16 deletions(-) create mode 100644 packages/SystemUI/src/com/android/systemui/biometrics/ModalityListener.java diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceToFingerprintView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceToFingerprintView.java index c4f58806c26c8..205054d68280f 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceToFingerprintView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricFaceToFingerprintView.java @@ -90,6 +90,7 @@ public class AuthBiometricFaceToFingerprintView extends AuthBiometricFaceView { } @Modality private int mActiveSensorType = TYPE_FACE; + @Nullable private ModalityListener mModalityListener; @Nullable private FingerprintSensorPropertiesInternal mFingerprintSensorProps; @Nullable private UdfpsDialogMeasureAdapter mUdfpsMeasureAdapter; @@ -115,6 +116,10 @@ public class AuthBiometricFaceToFingerprintView extends AuthBiometricFaceView { return mFingerprintSensorProps.isAnyUdfpsType(); } + void setModalityListener(@NonNull ModalityListener listener) { + mModalityListener = listener; + } + void setFingerprintSensorProps(@NonNull FingerprintSensorPropertiesInternal sensorProps) { mFingerprintSensorProps = sensorProps; } @@ -182,11 +187,16 @@ public class AuthBiometricFaceToFingerprintView extends AuthBiometricFaceView { @Override public void updateState(@BiometricState int newState) { if (mState == STATE_HELP || mState == STATE_ERROR) { + @Modality final int currentType = mActiveSensorType; mActiveSensorType = TYPE_FINGERPRINT; setRequireConfirmation(false); mConfirmButton.setEnabled(false); mConfirmButton.setVisibility(View.GONE); + + if (mModalityListener != null && currentType != mActiveSensorType) { + mModalityListener.onModalitySwitched(currentType, mActiveSensorType); + } } super.updateState(newState); diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java index d5f74951c6f74..bebf813e1833e 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthBiometricView.java @@ -759,6 +759,9 @@ public abstract class AuthBiometricView extends LinearLayout { // Restore positive button(s) state mConfirmButton.setVisibility( mSavedState.getInt(AuthDialog.KEY_BIOMETRIC_CONFIRM_VISIBILITY)); + if (mConfirmButton.getVisibility() == View.GONE) { + setRequireConfirmation(false); + } mTryAgainButton.setVisibility( mSavedState.getInt(AuthDialog.KEY_BIOMETRIC_TRY_AGAIN_VISIBILITY)); diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java index fd1313fc9d1d9..a533d2cd97d20 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java @@ -24,7 +24,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; import android.graphics.PixelFormat; -import android.hardware.biometrics.BiometricAuthenticator; import android.hardware.biometrics.BiometricAuthenticator.Modality; import android.hardware.biometrics.BiometricConstants; import android.hardware.biometrics.PromptInfo; @@ -356,6 +355,12 @@ public class AuthContainerView extends LinearLayout (AuthBiometricFaceToFingerprintView) factory.inflate( R.layout.auth_biometric_face_to_fingerprint_view, null, false); faceToFingerprintView.setFingerprintSensorProps(fingerprintSensorProps); + faceToFingerprintView.setModalityListener(new ModalityListener() { + @Override + public void onModalitySwitched(int oldModality, int newModality) { + maybeUpdatePositionForUdfps(true /* invalidate */); + } + }); mBiometricView = faceToFingerprintView; } else { Log.e(TAG, "Fingerprint props not found for sensor ID: " + fingerprintSensorId); @@ -489,9 +494,7 @@ public class AuthContainerView extends LinearLayout + mConfig.mPromptInfo.getAuthenticators()); } - if (shouldUpdatePositionForUdfps()) { - updatePositionForUdfps(); - } + maybeUpdatePositionForUdfps(false /* invalidate */); if (mConfig.mSkipIntro) { mContainerState = STATE_SHOWING; @@ -536,14 +539,14 @@ public class AuthContainerView extends LinearLayout } } - private boolean shouldUpdatePositionForUdfps() { - if (mBiometricView instanceof AuthBiometricUdfpsView) { + private static boolean shouldUpdatePositionForUdfps(@NonNull View view) { + if (view instanceof AuthBiometricUdfpsView) { return true; } - if (mBiometricView instanceof AuthBiometricFaceToFingerprintView) { + if (view instanceof AuthBiometricFaceToFingerprintView) { AuthBiometricFaceToFingerprintView faceToFingerprintView = - (AuthBiometricFaceToFingerprintView) mBiometricView; + (AuthBiometricFaceToFingerprintView) view; return faceToFingerprintView.getActiveSensorType() == TYPE_FINGERPRINT && faceToFingerprintView.isFingerprintUdfps(); } @@ -551,7 +554,11 @@ public class AuthContainerView extends LinearLayout return false; } - private void updatePositionForUdfps() { + private boolean maybeUpdatePositionForUdfps(boolean invalidate) { + if (!shouldUpdatePositionForUdfps(mBiometricView)) { + return false; + } + final int displayRotation = getDisplay().getRotation(); switch (displayRotation) { case Surface.ROTATION_0: @@ -576,6 +583,13 @@ public class AuthContainerView extends LinearLayout setScrollViewGravity(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM); break; } + + if (invalidate) { + mPanelView.invalidateOutline(); + mBiometricView.requestLayout(); + } + + return true; } private void setScrollViewGravity(int gravity) { @@ -626,13 +640,6 @@ public class AuthContainerView extends LinearLayout @Override public void onAuthenticationFailed(@Modality int modality, String failureReason) { mBiometricView.onAuthenticationFailed(modality, failureReason); - if (mBiometricView instanceof AuthBiometricFaceToFingerprintView - && ((AuthBiometricFaceToFingerprintView) mBiometricView).isFingerprintUdfps() - && modality == BiometricAuthenticator.TYPE_FACE) { - updatePositionForUdfps(); - mPanelView.invalidateOutline(); - mBiometricView.requestLayout(); - } } @Override diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ModalityListener.java b/packages/SystemUI/src/com/android/systemui/biometrics/ModalityListener.java new file mode 100644 index 0000000000000..c162f7dec4523 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/biometrics/ModalityListener.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.biometrics; + +import android.hardware.biometrics.BiometricAuthenticator.Modality; + +/** + * Listener for events related to modality changes during operations. + * + * Used by views such as {@link AuthBiometricFaceToFingerprintView} that support fallback style + * authentication. + */ +public interface ModalityListener { + + /** + * The modality has changed. Called after the transition has been fully completed. + * + * @param oldModality original modality + * @param newModality current modality + */ + default void onModalitySwitched(@Modality int oldModality, @Modality int newModality) {} +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricFaceToFingerprintViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricFaceToFingerprintViewTest.java index fcdf702495d27..5cd781085b155 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricFaceToFingerprintViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthBiometricFaceToFingerprintViewTest.java @@ -137,6 +137,31 @@ public class AuthBiometricFaceToFingerprintViewTest extends SysuiTestCase { verify(mConfirmButton).setVisibility(eq(View.GONE)); } + @Test + public void testStateUpdated_whenSwitchToFingerprint_invokesCallbacks() { + class TestModalityListener implements ModalityListener { + public int switchCount = 0; + + @Override + public void onModalitySwitched(int oldModality, int newModality) { + assertEquals(TYPE_FINGERPRINT, newModality); + assertEquals(TYPE_FACE, oldModality); + switchCount++; + } + } + final TestModalityListener modalityListener = new TestModalityListener(); + + mFaceToFpView.onDialogAnimatedIn(); + mFaceToFpView.setModalityListener(modalityListener); + + assertEquals(0, modalityListener.switchCount); + + mFaceToFpView.updateState(AuthBiometricFaceToFingerprintView.STATE_ERROR); + mFaceToFpView.updateState(AuthBiometricFaceToFingerprintView.STATE_AUTHENTICATING); + + assertEquals(1, modalityListener.switchCount); + } + @Test public void testModeUpdated_onSoftError_whenSwitchToFingerprint() { mFaceToFpView.onDialogAnimatedIn(); From c3e039f9cae09d9a3174fb4646057948e26d357c Mon Sep 17 00:00:00 2001 From: Joe Bolinger Date: Fri, 2 Jul 2021 16:26:31 -0700 Subject: [PATCH 3/3] Add a device orientation listener for updaing UDFPS layouts. Configuration change events are only generated when switching to/from portrait/landscape modes and can't be used for udfps overlays. Fix: 190832486 Test: manual (put device in landscape, start auth, flip 180 degrees) Change-Id: If03d8ee3ec479b91eab93622a6e93f00b3f14765 --- .../biometrics/AuthContainerView.java | 12 ++- .../systemui/biometrics/AuthController.java | 84 ++++++++++++------- .../systemui/biometrics/AuthDialog.java | 8 ++ .../biometrics/SidefpsController.java | 3 +- .../systemui/biometrics/UdfpsController.java | 2 +- .../biometrics/AuthControllerTest.java | 11 ++- 6 files changed, 85 insertions(+), 35 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java index a533d2cd97d20..3f61d3c6af9a4 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java @@ -36,6 +36,7 @@ import android.os.IBinder; import android.os.Looper; import android.os.UserManager; import android.util.Log; +import android.view.Display; import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; @@ -475,6 +476,11 @@ public class AuthContainerView extends LinearLayout mPanelController.setContainerDimensions(getMeasuredWidth(), getMeasuredHeight()); } + @Override + public void onOrientationChanged() { + maybeUpdatePositionForUdfps(true /* invalidate */); + } + @Override public void onAttachedToWindow() { super.onAttachedToWindow(); @@ -555,11 +561,15 @@ public class AuthContainerView extends LinearLayout } private boolean maybeUpdatePositionForUdfps(boolean invalidate) { + final Display display = getDisplay(); + if (display == null) { + return false; + } if (!shouldUpdatePositionForUdfps(mBiometricView)) { return false; } - final int displayRotation = getDisplay().getRotation(); + final int displayRotation = display.getRotation(); switch (displayRotation) { case Surface.ROTATION_0: mPanelController.setPosition(AuthPanelController.POSITION_BOTTOM); diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java index 7947241ff7941..2a18055da2329 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java @@ -30,7 +30,6 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.res.Configuration; import android.graphics.PointF; -import android.graphics.RectF; import android.hardware.biometrics.BiometricAuthenticator.Modality; import android.hardware.biometrics.BiometricConstants; import android.hardware.biometrics.BiometricManager.Authenticators; @@ -49,7 +48,10 @@ import android.os.Handler; import android.os.Looper; import android.os.RemoteException; import android.util.Log; +import android.view.Display; import android.view.MotionEvent; +import android.view.OrientationEventListener; +import android.view.Surface; import android.view.WindowManager; import com.android.internal.R; @@ -97,17 +99,15 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, @VisibleForTesting AuthDialog mCurrentDialog; - private WindowManager mWindowManager; - @Nullable - private UdfpsController mUdfpsController; - @Nullable - private IUdfpsHbmListener mUdfpsHbmListener; - @Nullable - private SidefpsController mSidefpsController; + @NonNull private final WindowManager mWindowManager; + @Nullable private UdfpsController mUdfpsController; + @Nullable private IUdfpsHbmListener mUdfpsHbmListener; + @Nullable private SidefpsController mSidefpsController; @VisibleForTesting TaskStackListener mTaskStackListener; @VisibleForTesting IBiometricSysuiReceiver mReceiver; + @NonNull private final BiometricOrientationEventListener mOrientationListener; @Nullable private final List mFaceProps; @Nullable private List mFpProps; @Nullable private List mUdfpsProps; @@ -120,6 +120,42 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, } } + private class BiometricOrientationEventListener extends OrientationEventListener { + @Surface.Rotation private int mLastRotation; + + BiometricOrientationEventListener(Context context) { + super(context); + mLastRotation = context.getDisplay().getRotation(); + } + + @Override + public void onOrientationChanged(int orientation) { + if (orientation == ORIENTATION_UNKNOWN) { + return; + } + + final Display display = mContext.getDisplay(); + if (display == null) { + return; + } + + final int rotation = display.getRotation(); + if (mLastRotation != rotation) { + mLastRotation = rotation; + + if (mCurrentDialog != null) { + mCurrentDialog.onOrientationChanged(); + } + if (mUdfpsController != null) { + mUdfpsController.onOrientationChanged(); + } + if (mSidefpsController != null) { + mSidefpsController.onOrientationChanged(); + } + } + } + } + @NonNull private final IFingerprintAuthenticatorsRegisteredCallback mFingerprintAuthenticatorsRegisteredCallback = @@ -164,6 +200,7 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, Log.w(TAG, "ACTION_CLOSE_SYSTEM_DIALOGS received"); mCurrentDialog.dismissWithoutCallback(true /* animate */); mCurrentDialog = null; + mOrientationListener.disable(); try { if (mReceiver != null) { @@ -192,6 +229,8 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, Log.w(TAG, "Evicting client due to: " + topPackage); mCurrentDialog.dismissWithoutCallback(true /* animate */); mCurrentDialog = null; + mOrientationListener.disable(); + if (mReceiver != null) { mReceiver.onDialogDismissed( BiometricPrompt.DISMISSED_REASON_USER_CANCEL, @@ -339,15 +378,6 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, } } - /** - * @return where the UDFPS exists on the screen in pixels in portrait mode. - */ - @Nullable public RectF getUdfpsRegion() { - return mUdfpsController == null - ? null - : mUdfpsController.getSensorLocation(); - } - /** * @return where the UDFPS exists on the screen in pixels in portrait mode. */ @@ -422,8 +452,10 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, } @Inject - public AuthController(Context context, CommandQueue commandQueue, + public AuthController(Context context, + CommandQueue commandQueue, ActivityTaskManager activityTaskManager, + @NonNull WindowManager windowManager, @Nullable FingerprintManager fingerprintManager, @Nullable FaceManager faceManager, Provider udfpsControllerFactory, @@ -435,6 +467,8 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, mFaceManager = faceManager; mUdfpsControllerFactory = udfpsControllerFactory; mSidefpsControllerFactory = sidefpsControllerFactory; + mWindowManager = windowManager; + mOrientationListener = new BiometricOrientationEventListener(context); mFaceProps = mFaceManager != null ? mFaceManager.getSensorPropertiesInternal() : null; @@ -462,7 +496,6 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, @Override public void start() { mCommandQueue.addCallback(this); - mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); if (mFingerprintManager != null) { mFingerprintManager.addAuthenticatorsRegisteredCallback( @@ -630,6 +663,7 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, // BiometricService will have already sent the callback to the client in this case. // This avoids a round trip to SystemUI. So, just dismiss the dialog and we're done. mCurrentDialog = null; + mOrientationListener.disable(); } /** @@ -701,6 +735,7 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, mReceiver = (IBiometricSysuiReceiver) args.arg2; mCurrentDialog = newDialog; mCurrentDialog.show(mWindowManager, savedState); + mOrientationListener.enable(); } private void onDialogDismissed(@DismissedReason int reason) { @@ -710,20 +745,12 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, } mReceiver = null; mCurrentDialog = null; + mOrientationListener.disable(); } @Override protected void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); - // UdfpsController is not BiometricPrompt-specific. It can be active for keyguard or - // enrollment. - if (mUdfpsController != null) { - mUdfpsController.onConfigurationChanged(); - } - - if (mSidefpsController != null) { - mSidefpsController.onConfigurationChanged(); - } // Save the state of the current dialog (buttons showing, etc) if (mCurrentDialog != null) { @@ -731,6 +758,7 @@ public class AuthController extends SystemUI implements CommandQueue.Callbacks, mCurrentDialog.onSaveState(savedState); mCurrentDialog.dismissWithoutCallback(false /* animate */); mCurrentDialog = null; + mOrientationListener.disable(); // Only show the dialog if necessary. If it was animating out, the dialog is supposed // to send its pending callback immediately. diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialog.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialog.java index ff31e499f6e8e..fa5213e940817 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialog.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthDialog.java @@ -156,4 +156,12 @@ public interface AuthDialog { * @return true if device credential is allowed. */ boolean isAllowDeviceCredentials(); + + /** + * Called when the device's orientation changed and the dialog may need to do another + * layout. This is most relevant to UDFPS since configuration changes are not sent by + * the framework in equivalent cases (landscape to reverse landscape) but the dialog + * must remain fixed on the physical sensor location. + */ + void onOrientationChanged(); } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/SidefpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/SidefpsController.java index a52296a71960e..436e1e4e3116e 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/SidefpsController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/SidefpsController.java @@ -137,8 +137,7 @@ public class SidefpsController { } } - - void onConfigurationChanged() { + void onOrientationChanged() { // If mView is null or if view is hidden, then return. if (mView == null || !mIsVisible) { return; diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java index 38f85cdb4a9bb..81e60f316bbde 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java @@ -650,7 +650,7 @@ public class UdfpsController implements DozeReceiver { return mCoreLayoutParams; } - void onConfigurationChanged() { + void onOrientationChanged() { // When the configuration changes it's almost always necessary to destroy and re-create // the overlay's window to pass it the new LayoutParams. // Hiding the overlay will destroy its window. It's safe to hide the overlay regardless diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java index 9774ea98ff0db..bfcd1310acc2e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthControllerTest.java @@ -59,6 +59,7 @@ import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; import android.testing.TestableContext; import android.testing.TestableLooper.RunWithLooper; +import android.view.WindowManager; import com.android.internal.R; import com.android.systemui.SysuiTestCase; @@ -97,6 +98,8 @@ public class AuthControllerTest extends SysuiTestCase { @Mock private ActivityTaskManager mActivityTaskManager; @Mock + private WindowManager mWindowManager; + @Mock private FingerprintManager mFingerprintManager; @Mock private FaceManager mFaceManager; @@ -149,7 +152,7 @@ public class AuthControllerTest extends SysuiTestCase { when(mFingerprintManager.getSensorPropertiesInternal()).thenReturn(props); mAuthController = new TestableAuthController(context, mCommandQueue, - mActivityTaskManager, mFingerprintManager, mFaceManager, + mActivityTaskManager, mWindowManager, mFingerprintManager, mFaceManager, () -> mUdfpsController, () -> mSidefpsController); mAuthController.start(); @@ -576,13 +579,15 @@ public class AuthControllerTest extends SysuiTestCase { private int mBuildCount = 0; private PromptInfo mLastBiometricPromptInfo; - TestableAuthController(Context context, CommandQueue commandQueue, + TestableAuthController(Context context, + CommandQueue commandQueue, ActivityTaskManager activityTaskManager, + WindowManager windowManager, FingerprintManager fingerprintManager, FaceManager faceManager, Provider udfpsControllerFactory, Provider sidefpsControllerFactory) { - super(context, commandQueue, activityTaskManager, + super(context, commandQueue, activityTaskManager, windowManager, fingerprintManager, faceManager, udfpsControllerFactory, sidefpsControllerFactory); }