diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java index dac6f9cc16ac5..5e6fba98fe5cb 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java @@ -93,7 +93,7 @@ import kotlin.Unit; * controls/manages all UDFPS sensors. In other words, a single controller is registered with * {@link com.android.server.biometrics.sensors.fingerprint.FingerprintService}, and interfaces such * as {@link FingerprintManager#onPointerDown(int, int, int, float, float)} or - * {@link IUdfpsOverlayController#showUdfpsOverlay(int)}should all have + * {@link IUdfpsOverlayController#showUdfpsOverlay(int)} should all have * {@code sensorId} parameters. */ @SuppressWarnings("deprecation") @@ -657,6 +657,20 @@ public class UdfpsController implements DozeReceiver { } } + private boolean shouldRotate(@Nullable UdfpsAnimationViewController animation) { + if (!(animation instanceof UdfpsKeyguardViewController)) { + // always rotate view if we're not on the keyguard + return true; + } + + // on the keyguard, make sure we don't rotate if we're going to sleep or not occluded + if (mKeyguardUpdateMonitor.isGoingToSleep() || !mKeyguardStateController.isOccluded()) { + return false; + } + + return true; + } + private WindowManager.LayoutParams computeLayoutParams( @Nullable UdfpsAnimationViewController animation) { final int paddingX = animation != null ? animation.getPaddingX() : 0; @@ -680,9 +694,11 @@ public class UdfpsController implements DozeReceiver { // Transform dimensions if the device is in landscape mode switch (mContext.getDisplay().getRotation()) { case Surface.ROTATION_90: - if (animation instanceof UdfpsKeyguardViewController - && mKeyguardUpdateMonitor.isGoingToSleep()) { + if (!shouldRotate(animation)) { + Log.v(TAG, "skip rotating udfps location ROTATION_90"); break; + } else { + Log.v(TAG, "rotate udfps location ROTATION_90"); } mCoreLayoutParams.x = mSensorProps.sensorLocationY - mSensorProps.sensorRadius - paddingX; @@ -691,9 +707,11 @@ public class UdfpsController implements DozeReceiver { break; case Surface.ROTATION_270: - if (animation instanceof UdfpsKeyguardViewController - && mKeyguardUpdateMonitor.isGoingToSleep()) { + if (!shouldRotate(animation)) { + Log.v(TAG, "skip rotating udfps location ROTATION_270"); break; + } else { + Log.v(TAG, "rotate udfps location ROTATION_270"); } mCoreLayoutParams.x = p.x - mSensorProps.sensorLocationY - mSensorProps.sensorRadius - paddingX; diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java index cff2aed3f8fca..cb2d99705079d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java @@ -191,6 +191,7 @@ public class UdfpsControllerTest extends SysuiTestCase { when(mLayoutInflater.inflate(R.layout.udfps_keyguard_view, null)) .thenReturn(mKeyguardView); // for showOverlay REASON_AUTH_FPM_KEYGUARD when(mEnrollView.getContext()).thenReturn(mContext); + when(mKeyguardStateController.isOccluded()).thenReturn(false); final List props = new ArrayList<>(); final List componentInfo = new ArrayList<>();