From 6cd1f074740fd982b81322a5168052744b54414c Mon Sep 17 00:00:00 2001 From: Beverly Date: Thu, 28 Apr 2022 18:24:54 +0000 Subject: [PATCH] Scale px udfps HW related sizes to curr resolution AuthController calculates the size of UDFPS based on the native resolution which can change. This CL updates the lock icon view and udfps keyguard view so that the sizes and paddings are updated based on the scaled pixel values to account for any changes in the display's resolution. Test: manually change display-mode with adb shell cmd display set-user-preferred-display-mode 1080 2340 0 0 and then check location & size of the lock icon + udfps on keyguard Fixes: 230548686 Fixes: 223116689 Change-Id: I6c320e2ec4c0866768d0fc995eb3f8f06bda1db6 --- .../res/layout/status_bar_expanded.xml | 1 - .../layout/udfps_keyguard_view_internal.xml | 2 -- .../com/android/keyguard/LockIconView.java | 8 ++++- .../keyguard/LockIconViewController.java | 15 ++++---- .../systemui/biometrics/AuthController.java | 21 +++++++++++ .../biometrics/UdfpsKeyguardView.java | 18 ++++++++++ .../UdfpsKeyguardViewController.java | 13 +++++++ .../keyguard/LockIconViewControllerTest.java | 35 ++++++++++++++----- 8 files changed, 93 insertions(+), 20 deletions(-) diff --git a/packages/SystemUI/res/layout/status_bar_expanded.xml b/packages/SystemUI/res/layout/status_bar_expanded.xml index ef030baa967b6..4d5bf53eb64a0 100644 --- a/packages/SystemUI/res/layout/status_bar_expanded.xml +++ b/packages/SystemUI/res/layout/status_bar_expanded.xml @@ -62,7 +62,6 @@ android:id="@+id/lock_icon" android:layout_width="match_parent" android:layout_height="match_parent" - android:padding="@dimen/lock_icon_padding" android:layout_gravity="center" android:scaleType="centerCrop"/> diff --git a/packages/SystemUI/res/layout/udfps_keyguard_view_internal.xml b/packages/SystemUI/res/layout/udfps_keyguard_view_internal.xml index 6d52a30be7b4d..18386637e8f8b 100644 --- a/packages/SystemUI/res/layout/udfps_keyguard_view_internal.xml +++ b/packages/SystemUI/res/layout/udfps_keyguard_view_internal.xml @@ -35,7 +35,6 @@ android:id="@+id/udfps_aod_fp" android:layout_width="match_parent" android:layout_height="match_parent" - android:padding="@dimen/lock_icon_padding" android:layout_gravity="center" android:scaleType="centerCrop" app:lottie_autoPlay="false" @@ -47,7 +46,6 @@ android:id="@+id/udfps_lockscreen_fp" android:layout_width="match_parent" android:layout_height="match_parent" - android:padding="@dimen/lock_icon_padding" android:layout_gravity="center" android:scaleType="centerCrop" app:lottie_autoPlay="false" diff --git a/packages/SystemUI/src/com/android/keyguard/LockIconView.java b/packages/SystemUI/src/com/android/keyguard/LockIconView.java index e63e675bfd144..e1913657b7cc6 100644 --- a/packages/SystemUI/src/com/android/keyguard/LockIconView.java +++ b/packages/SystemUI/src/com/android/keyguard/LockIconView.java @@ -56,6 +56,7 @@ public class LockIconView extends FrameLayout implements Dumpable { @NonNull private final RectF mSensorRect; @NonNull private PointF mLockIconCenter = new PointF(0f, 0f); private int mRadius; + private int mLockIconPadding; private ImageView mLockIcon; private ImageView mBgView; @@ -125,9 +126,13 @@ public class LockIconView extends FrameLayout implements Dumpable { * Set the location of the lock icon. */ @VisibleForTesting - public void setCenterLocation(@NonNull PointF center, int radius) { + public void setCenterLocation(@NonNull PointF center, int radius, int drawablePadding) { mLockIconCenter = center; mRadius = radius; + mLockIconPadding = drawablePadding; + + mLockIcon.setPadding(mLockIconPadding, mLockIconPadding, mLockIconPadding, + mLockIconPadding); // mSensorProps coordinates assume portrait mode which is OK b/c the keyguard is always in // portrait. @@ -221,6 +226,7 @@ public class LockIconView extends FrameLayout implements Dumpable { pw.println(" Center in px (x, y)= (" + mLockIconCenter.x + ", " + mLockIconCenter.y + ")"); pw.println(" Radius in pixels: " + mRadius); + pw.println(" Drawable padding: " + mLockIconPadding); pw.println(" mIconType=" + typeToString(mIconType)); pw.println(" mAod=" + mAod); pw.println("Lock Icon View actual measurements:"); diff --git a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java index 239730d189346..4c3c7c7e3e175 100644 --- a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java @@ -31,8 +31,6 @@ import android.graphics.PointF; import android.graphics.Rect; import android.graphics.drawable.AnimatedStateListDrawable; import android.hardware.biometrics.BiometricSourceType; -import android.hardware.biometrics.SensorLocationInternal; -import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; import android.os.Process; import android.os.VibrationAttributes; import android.util.DisplayMetrics; @@ -125,6 +123,7 @@ public class LockIconViewController extends ViewController impleme private float mHeightPixels; private float mWidthPixels; private int mBottomPaddingPx; + private int mScaledPaddingPx; private boolean mShowUnlockIcon; private boolean mShowLockIcon; @@ -341,6 +340,10 @@ public class LockIconViewController extends ViewController impleme mHeightPixels = bounds.bottom; mBottomPaddingPx = getResources().getDimensionPixelSize(R.dimen.lock_icon_margin_bottom); + final int defaultPaddingPx = + getResources().getDimensionPixelSize(R.dimen.lock_icon_padding); + mScaledPaddingPx = (int) (defaultPaddingPx * mAuthController.getScaleFactor()); + mUnlockedLabel = mView.getContext().getResources().getString( R.string.accessibility_unlock_button); mLockedLabel = mView.getContext() @@ -351,15 +354,13 @@ public class LockIconViewController extends ViewController impleme private void updateLockIconLocation() { if (mUdfpsSupported) { - FingerprintSensorPropertiesInternal props = mAuthController.getUdfpsProps().get(0); - final SensorLocationInternal location = props.getLocation(); - mView.setCenterLocation(new PointF(location.sensorLocationX, location.sensorLocationY), - location.sensorRadius); + mView.setCenterLocation(mAuthController.getUdfpsLocation(), + mAuthController.getUdfpsRadius(), mScaledPaddingPx); } else { mView.setCenterLocation( new PointF(mWidthPixels / 2, mHeightPixels - mBottomPaddingPx - sLockIconRadiusPx), - sLockIconRadiusPx); + sLockIconRadiusPx, mScaledPaddingPx); } mView.getHitRect(mSensorTouchLocation); diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java index d4dad73a49f2e..b6b9065f335e0 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java @@ -443,6 +443,27 @@ public class AuthController extends CoreStartable implements CommandQueue.Callba return new PointF(mUdfpsBounds.centerX(), mUdfpsBounds.centerY()); } + /** + * @return the radius of UDFPS on the screen in pixels + */ + public int getUdfpsRadius() { + if (mUdfpsController == null || mUdfpsBounds == null) { + return -1; + } + return mUdfpsBounds.height() / 2; + } + + /** + * @return the scale factor representing the user's current resolution / the stable + * (default) resolution + */ + public float getScaleFactor() { + if (mUdfpsController == null || mUdfpsController.mOverlayParams == null) { + return 1f; + } + return mUdfpsController.mOverlayParams.getScaleFactor(); + } + /** * @return where the fingerprint sensor exists in pixels in portrait mode. devices without an * overridden value will use the default value even if they don't have a fingerprint sensor diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java index 937b81337cbbc..9139699af26a6 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardView.java @@ -61,6 +61,7 @@ public class UdfpsKeyguardView extends UdfpsAnimationView { private AnimatorSet mBackgroundInAnimator = new AnimatorSet(); private int mAlpha; // 0-255 + private float mScaleFactor = 1; // AOD anti-burn-in offsets private final int mMaxBurnInOffsetX; @@ -172,6 +173,22 @@ public class UdfpsKeyguardView extends UdfpsAnimationView { mLockScreenFp.invalidate(); // updated with a valueCallback } + void setScaleFactor(float scale) { + mScaleFactor = scale; + } + + void updatePadding() { + if (mLockScreenFp == null || mAodFp == null) { + return; + } + + final int defaultPaddingPx = + getResources().getDimensionPixelSize(R.dimen.lock_icon_padding); + final int padding = (int) (defaultPaddingPx * mScaleFactor); + mLockScreenFp.setPadding(padding, padding, padding, padding); + mAodFp.setPadding(padding, padding, padding, padding); + } + /** * @param alpha between 0 and 255 */ @@ -257,6 +274,7 @@ public class UdfpsKeyguardView extends UdfpsAnimationView { mLockScreenFp = view.findViewById(R.id.udfps_lockscreen_fp); mBgProtection = view.findViewById(R.id.udfps_keyguard_fp_bg); + updatePadding(); updateColor(); updateAlpha(); parent.addView(view); diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java index 416b8ee60fd93..8b0f36fe1245e 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsKeyguardViewController.java @@ -154,6 +154,8 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController udfps = setupUdfps(); + Pair udfps = setupUdfps(); // first = radius, second = udfps location // WHEN lock icon view controller is initialized and attached mLockIconViewController.init(); captureAttachListener(); mAttachListener.onViewAttachedToWindow(mLockIconView); - // THEN lock icon view location is updated with the same coordinates as fpProps - verify(mLockIconView).setCenterLocation(mPointCaptor.capture(), eq(udfps.first)); - assertEquals(udfps.second, mPointCaptor.getValue()); + // THEN lock icon view location is updated to the udfps location with UDFPS radius + verify(mLockIconView).setCenterLocation(eq(udfps.second), eq(udfps.first), + eq(PADDING)); + } + + @Test + public void testUpdatePaddingBasedOnResolutionScale() { + // GIVEN fp sensor location is available pre-attached & scaled resolution factor is 5 + Pair udfps = setupUdfps(); // first = radius, second = udfps location + when(mAuthController.getScaleFactor()).thenReturn(5f); + + // WHEN lock icon view controller is initialized and attached + mLockIconViewController.init(); + captureAttachListener(); + mAttachListener.onViewAttachedToWindow(mLockIconView); + + // THEN lock icon view location is updated with the scaled radius + verify(mLockIconView).setCenterLocation(eq(udfps.second), eq(udfps.first), + eq(PADDING * 5)); } @Test @@ -212,8 +229,8 @@ public class LockIconViewControllerTest extends SysuiTestCase { mDelayableExecutor.runAllReady(); // THEN lock icon view location is updated with the same coordinates as fpProps - verify(mLockIconView).setCenterLocation(mPointCaptor.capture(), eq(udfps.first)); - assertEquals(udfps.second, mPointCaptor.getValue()); + verify(mLockIconView).setCenterLocation(eq(udfps.second), eq(udfps.first), + eq(PADDING)); } @Test @@ -400,7 +417,7 @@ public class LockIconViewControllerTest extends SysuiTestCase { List.of(new SensorLocationInternal("" /* displayId */, (int) udfpsLocation.x, (int) udfpsLocation.y, radius))); when(mAuthController.getUdfpsLocation()).thenReturn(udfpsLocation); - when(mAuthController.getUdfpsProps()).thenReturn(List.of(fpProps)); + when(mAuthController.getUdfpsRadius()).thenReturn(radius); return new Pair(radius, udfpsLocation); }