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
This commit is contained in:
Beverly
2022-04-28 18:24:54 +00:00
parent a3193ed1db
commit 6cd1f07474
8 changed files with 93 additions and 20 deletions

View File

@@ -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"/>

View File

@@ -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"

View File

@@ -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:");

View File

@@ -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);

View File

@@ -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

View File

@@ -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);

View File

@@ -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();
}
};

View File

@@ -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);
}