[DO NOT MERGE] Only show lock icon background with UDFPS Otherwise the background should remain hidden (View.GONE) for devices without the UDFPS sensor. Fixes: 200813382 Test: atest LockIconViewControllerTest Change-Id: I1ef3cef37de60e6968432869f4c946b6de414db4 (cherry picked from commit ddfb4df1a83d6e51e23177790f0b0ecae207f764)
diff --git a/packages/SystemUI/src/com/android/keyguard/LockIconView.java b/packages/SystemUI/src/com/android/keyguard/LockIconView.java index 371564a..ef4353b 100644 --- a/packages/SystemUI/src/com/android/keyguard/LockIconView.java +++ b/packages/SystemUI/src/com/android/keyguard/LockIconView.java
@@ -48,6 +48,7 @@ private ImageView mBgView; private int mLockIconColor; + private boolean mUseBackground = false; public LockIconView(Context context, AttributeSet attrs) { super(context, attrs); @@ -61,8 +62,8 @@ mBgView = findViewById(R.id.lock_icon_bg); } - void updateColorAndBackgroundVisibility(boolean useBackground) { - if (useBackground && mLockIcon.getDrawable() != null) { + void updateColorAndBackgroundVisibility() { + if (mUseBackground && mLockIcon.getDrawable() != null) { mLockIconColor = Utils.getColorAttrDefaultColor(getContext(), android.R.attr.textColorPrimary); mBgView.setBackground(getContext().getDrawable(R.drawable.fingerprint_bg)); @@ -78,6 +79,9 @@ void setImageDrawable(Drawable drawable) { mLockIcon.setImageDrawable(drawable); + + if (!mUseBackground) return; + if (drawable == null) { mBgView.setVisibility(View.INVISIBLE); } else { @@ -86,6 +90,14 @@ } /** + * Whether or not to render the lock icon background. Mainly used for UDPFS. + */ + public void setUseBackground(boolean useBackground) { + mUseBackground = useBackground; + updateColorAndBackgroundVisibility(); + } + + /** * Set the location of the lock icon. */ @VisibleForTesting
diff --git a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java index 28e19ac..8cfd225 100644 --- a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java
@@ -346,7 +346,7 @@ } private void updateColors() { - mView.updateColorAndBackgroundVisibility(mUdfpsSupported); + mView.updateColorAndBackgroundVisibility(); } private void updateConfiguration() { @@ -427,6 +427,8 @@ boolean wasUdfpsEnrolled = mUdfpsEnrolled; mUdfpsSupported = mAuthController.getUdfpsSensorLocation() != null; + mView.setUseBackground(mUdfpsSupported); + mUdfpsEnrolled = mKeyguardUpdateMonitor.isUdfpsEnrolled(); if (wasUdfpsSupported != mUdfpsSupported || wasUdfpsEnrolled != mUdfpsEnrolled) { updateVisibility();
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 af6dee7..c464cad 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/LockIconViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/LockIconViewControllerTest.java
@@ -32,6 +32,7 @@ import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.util.DisplayMetrics; +import android.util.Pair; import android.view.View; import android.view.accessibility.AccessibilityManager; @@ -128,20 +129,7 @@ @Test public void testUpdateFingerprintLocationOnInit() { // GIVEN fp sensor location is available pre-attached - final PointF udfpsLocation = new PointF(50, 75); - final int radius = 33; - final FingerprintSensorPropertiesInternal fpProps = - new FingerprintSensorPropertiesInternal( - /* sensorId */ 0, - /* strength */ 0, - /* max enrollments per user */ 5, - /* component info */ new ArrayList<>(), - /* sensorType */ 3, - /* resetLockoutRequiresHwToken */ false, - List.of(new SensorLocationInternal("" /* displayId */, - (int) udfpsLocation.x, (int) udfpsLocation.y, radius))); - when(mAuthController.getUdfpsSensorLocation()).thenReturn(udfpsLocation); - when(mAuthController.getUdfpsProps()).thenReturn(List.of(fpProps)); + Pair<Integer, PointF> udfps = setupUdfps(); // WHEN lock icon view controller is initialized and attached mLockIconViewController.init(); @@ -149,8 +137,8 @@ mAttachListener.onViewAttachedToWindow(mLockIconView); // THEN lock icon view location is updated with the same coordinates as fpProps - verify(mLockIconView).setCenterLocation(mPointCaptor.capture(), eq(radius)); - assertEquals(udfpsLocation, mPointCaptor.getValue()); + verify(mLockIconView).setCenterLocation(mPointCaptor.capture(), eq(udfps.first)); + assertEquals(udfps.second, mPointCaptor.getValue()); } @Test @@ -164,6 +152,47 @@ // GIVEN fp sensor location is available post-atttached captureAuthControllerCallback(); + Pair<Integer, PointF> udfps = setupUdfps(); + + // WHEN all authenticators are registered + mAuthControllerCallback.onAllAuthenticatorsRegistered(); + + // 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()); + } + + @Test + public void testLockIconViewBackgroundEnabledWhenUdfpsIsAvailable() { + // GIVEN Udpfs sensor location is available + setupUdfps(); + + mLockIconViewController.init(); + captureAttachListener(); + + // WHEN the view is attached + mAttachListener.onViewAttachedToWindow(mLockIconView); + + // THEN the lock icon view background should be enabled + verify(mLockIconView).setUseBackground(true); + } + + @Test + public void testLockIconViewBackgroundDisabledWhenUdfpsIsUnavailable() { + // GIVEN Udfps sensor location is not available + when(mAuthController.getUdfpsSensorLocation()).thenReturn(null); + + mLockIconViewController.init(); + captureAttachListener(); + + // WHEN the view is attached + mAttachListener.onViewAttachedToWindow(mLockIconView); + + // THEN the lock icon view background should be disabled + verify(mLockIconView).setUseBackground(false); + } + + private Pair<Integer, PointF> setupUdfps() { final PointF udfpsLocation = new PointF(50, 75); final int radius = 33; final FingerprintSensorPropertiesInternal fpProps = @@ -179,12 +208,7 @@ when(mAuthController.getUdfpsSensorLocation()).thenReturn(udfpsLocation); when(mAuthController.getUdfpsProps()).thenReturn(List.of(fpProps)); - // WHEN all authenticators are registered - mAuthControllerCallback.onAllAuthenticatorsRegistered(); - - // THEN lock icon view location is updated with the same coordinates as fpProps - verify(mLockIconView).setCenterLocation(mPointCaptor.capture(), eq(radius)); - assertEquals(udfpsLocation, mPointCaptor.getValue()); + return new Pair(radius, udfpsLocation); } private void captureAuthControllerCallback() {