diff options
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 ef030baa967b..4d5bf53eb64a 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 6d52a30be7b4..18386637e8f8 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 e63e675bfd14..e1913657b7cc 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 95cda8b9dfca..2b217f02e834 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<LockIconView> 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<LockIconView> 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<LockIconView> 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 d4dad73a49f2..b6b9065f335e 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthController.java @@ -444,6 +444,27 @@ public class AuthController extends CoreStartable implements CommandQueue.Callba } /** + * @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 937b81337cbb..9139699af26a 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 416b8ee60fd9..8b0f36fe1245 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<Ud updateGenericBouncerVisibility(); mConfigurationController.addCallback(mConfigurationListener); getPanelExpansionStateManager().addExpansionListener(mPanelExpansionListener); + updateScaleFactor(); + mView.updatePadding(); updateAlpha(); updatePauseAuth(); @@ -367,6 +369,15 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud } } + /** + * Update the scale factor based on the device's resolution. + */ + private void updateScaleFactor() { + if (mUdfpsController != null && mUdfpsController.mOverlayParams != null) { + mView.setScaleFactor(mUdfpsController.mOverlayParams.getScaleFactor()); + } + } + private final StatusBarStateController.StateListener mStateListener = new StatusBarStateController.StateListener() { @Override @@ -486,6 +497,8 @@ public class UdfpsKeyguardViewController extends UdfpsAnimationViewController<Ud @Override public void onConfigChanged(Configuration newConfig) { + updateScaleFactor(); + mView.updatePadding(); mView.updateColor(); } }; diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/LockIconViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/LockIconViewControllerTest.java index 4d0feffa1d24..be923a68391c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/LockIconViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/LockIconViewControllerTest.java @@ -20,8 +20,6 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSess import static com.android.keyguard.LockIconView.ICON_LOCK; import static com.android.keyguard.LockIconView.ICON_UNLOCK; -import static junit.framework.Assert.assertEquals; - import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyBoolean; import static org.mockito.Mockito.anyInt; @@ -87,6 +85,7 @@ import java.util.List; @TestableLooper.RunWithLooper public class LockIconViewControllerTest extends SysuiTestCase { private static final String UNLOCKED_LABEL = "unlocked"; + private static final int PADDING = 10; private MockitoSession mStaticMockSession; @@ -149,6 +148,8 @@ public class LockIconViewControllerTest extends SysuiTestCase { when(mWindowManager.getCurrentWindowMetrics().getBounds()).thenReturn(windowBounds); when(mResources.getString(R.string.accessibility_unlock_button)).thenReturn(UNLOCKED_LABEL); when(mResources.getDrawable(anyInt(), any())).thenReturn(mIconDrawable); + when(mResources.getDimensionPixelSize(R.dimen.lock_icon_padding)).thenReturn(PADDING); + when(mAuthController.getScaleFactor()).thenReturn(1f); when(mKeyguardStateController.isShowing()).thenReturn(true); when(mKeyguardStateController.isKeyguardGoingAway()).thenReturn(false); @@ -181,16 +182,32 @@ public class LockIconViewControllerTest extends SysuiTestCase { @Test public void testUpdateFingerprintLocationOnInit() { // GIVEN fp sensor location is available pre-attached - Pair<Integer, PointF> udfps = setupUdfps(); + Pair<Integer, PointF> 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<Integer, PointF> 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); } |