Merge "Remove indicator theme for non-device entry activity" into tm-qpr-dev

This commit is contained in:
Diya Bera
2023-02-15 02:49:56 +00:00
committed by Android (Google) Code Review
4 changed files with 103 additions and 32 deletions

View File

@@ -33,6 +33,7 @@ import android.app.admin.DevicePolicyManager;
import android.content.Intent; import android.content.Intent;
import android.content.res.ColorStateList; import android.content.res.ColorStateList;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.hardware.biometrics.BiometricOverlayConstants;
import android.hardware.biometrics.BiometricSourceType; import android.hardware.biometrics.BiometricSourceType;
import android.metrics.LogMaker; import android.metrics.LogMaker;
import android.os.UserHandle; import android.os.UserHandle;
@@ -379,7 +380,8 @@ public class KeyguardSecurityContainerController extends ViewController<Keyguard
+ "isUnlockingWithFpAllowed=" + isUnlockingWithFpAllowed); + "isUnlockingWithFpAllowed=" + isUnlockingWithFpAllowed);
} }
if (toShow) { if (toShow) {
mSideFpsController.get().show(SideFpsUiRequestSource.PRIMARY_BOUNCER); mSideFpsController.get().show(SideFpsUiRequestSource.PRIMARY_BOUNCER,
BiometricOverlayConstants.REASON_AUTH_KEYGUARD);
} else { } else {
mSideFpsController.get().hide(SideFpsUiRequestSource.PRIMARY_BOUNCER); mSideFpsController.get().hide(SideFpsUiRequestSource.PRIMARY_BOUNCER);
} }

View File

@@ -19,6 +19,8 @@ import android.animation.Animator
import android.animation.AnimatorListenerAdapter import android.animation.AnimatorListenerAdapter
import android.app.ActivityTaskManager import android.app.ActivityTaskManager
import android.content.Context import android.content.Context
import android.content.res.Configuration
import android.graphics.Color
import android.graphics.PixelFormat import android.graphics.PixelFormat
import android.graphics.PorterDuff import android.graphics.PorterDuff
import android.graphics.PorterDuffColorFilter import android.graphics.PorterDuffColorFilter
@@ -90,7 +92,7 @@ constructor(
private val featureFlags: FeatureFlags, private val featureFlags: FeatureFlags,
dumpManager: DumpManager dumpManager: DumpManager
) : Dumpable { ) : Dumpable {
val requests: HashSet<SideFpsUiRequestSource> = HashSet() private val requests: HashSet<SideFpsUiRequestSource> = HashSet()
@VisibleForTesting @VisibleForTesting
val sensorProps: FingerprintSensorPropertiesInternal = val sensorProps: FingerprintSensorPropertiesInternal =
@@ -98,13 +100,17 @@ constructor(
?: throw IllegalStateException("no side fingerprint sensor") ?: throw IllegalStateException("no side fingerprint sensor")
@VisibleForTesting @VisibleForTesting
val orientationListener = val orientationReasonListener =
BiometricDisplayListener( OrientationReasonListener(
context, context,
displayManager, displayManager,
handler, handler,
BiometricDisplayListener.SensorType.SideFingerprint(sensorProps) sensorProps,
) { onOrientationChanged() } { reason -> onOrientationChanged(reason) },
BiometricOverlayConstants.REASON_UNKNOWN
)
@VisibleForTesting val orientationListener = orientationReasonListener.orientationListener
@VisibleForTesting @VisibleForTesting
val overviewProxyListener = val overviewProxyListener =
@@ -168,7 +174,7 @@ constructor(
@BiometricOverlayConstants.ShowReason reason: Int @BiometricOverlayConstants.ShowReason reason: Int
) = ) =
if (reason.isReasonToAutoShow(activityTaskManager)) { if (reason.isReasonToAutoShow(activityTaskManager)) {
show(SideFpsUiRequestSource.AUTO_SHOW) show(SideFpsUiRequestSource.AUTO_SHOW, reason)
} else { } else {
hide(SideFpsUiRequestSource.AUTO_SHOW) hide(SideFpsUiRequestSource.AUTO_SHOW)
} }
@@ -198,11 +204,14 @@ constructor(
} }
/** Shows the side fps overlay if not already shown. */ /** Shows the side fps overlay if not already shown. */
fun show(request: SideFpsUiRequestSource) { fun show(
request: SideFpsUiRequestSource,
@BiometricOverlayConstants.ShowReason reason: Int = BiometricOverlayConstants.REASON_UNKNOWN
) {
requests.add(request) requests.add(request)
mainExecutor.execute { mainExecutor.execute {
if (overlayView == null) { if (overlayView == null) {
createOverlayForDisplay() createOverlayForDisplay(reason)
} else { } else {
Log.v(TAG, "overlay already shown") Log.v(TAG, "overlay already shown")
} }
@@ -226,13 +235,13 @@ constructor(
} }
} }
private fun onOrientationChanged() { private fun onOrientationChanged(@BiometricOverlayConstants.ShowReason reason: Int) {
if (overlayView != null) { if (overlayView != null) {
createOverlayForDisplay() createOverlayForDisplay(reason)
} }
} }
private fun createOverlayForDisplay() { private fun createOverlayForDisplay(@BiometricOverlayConstants.ShowReason reason: Int) {
val view = layoutInflater.inflate(R.layout.sidefps_view, null, false) val view = layoutInflater.inflate(R.layout.sidefps_view, null, false)
overlayView = view overlayView = view
val display = context.display!! val display = context.display!!
@@ -263,7 +272,8 @@ constructor(
updateOverlayParams(display, it.bounds) updateOverlayParams(display, it.bounds)
} }
} }
lottie.addOverlayDynamicColor(context) orientationReasonListener.reason = reason
lottie.addOverlayDynamicColor(context, reason)
/** /**
* Intercepts TYPE_WINDOW_STATE_CHANGED accessibility event, preventing Talkback from * Intercepts TYPE_WINDOW_STATE_CHANGED accessibility event, preventing Talkback from
@@ -418,17 +428,36 @@ private fun Display.isNaturalOrientation(): Boolean =
private fun WindowInsets.hasBigNavigationBar(): Boolean = private fun WindowInsets.hasBigNavigationBar(): Boolean =
getInsets(WindowInsets.Type.navigationBars()).bottom >= 70 getInsets(WindowInsets.Type.navigationBars()).bottom >= 70
private fun LottieAnimationView.addOverlayDynamicColor(context: Context) { private fun LottieAnimationView.addOverlayDynamicColor(
context: Context,
@BiometricOverlayConstants.ShowReason reason: Int
) {
fun update() { fun update() {
val c = context.getColor(R.color.biometric_dialog_accent) val c = context.getColor(R.color.biometric_dialog_accent)
val chevronFill = context.getColor(R.color.sfps_chevron_fill) val chevronFill = context.getColor(R.color.sfps_chevron_fill)
for (key in listOf(".blue600", ".blue400")) { val isKeyguard = reason == REASON_AUTH_KEYGUARD
addValueCallback(KeyPath(key, "**"), LottieProperty.COLOR_FILTER) { if (isKeyguard) {
PorterDuffColorFilter(c, PorterDuff.Mode.SRC_ATOP) for (key in listOf(".blue600", ".blue400")) {
addValueCallback(KeyPath(key, "**"), LottieProperty.COLOR_FILTER) {
PorterDuffColorFilter(c, PorterDuff.Mode.SRC_ATOP)
}
}
addValueCallback(KeyPath(".black", "**"), LottieProperty.COLOR_FILTER) {
PorterDuffColorFilter(chevronFill, PorterDuff.Mode.SRC_ATOP)
}
} else if (!isDarkMode(context)) {
addValueCallback(KeyPath(".black", "**"), LottieProperty.COLOR_FILTER) {
PorterDuffColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP)
}
} else if (isDarkMode(context)) {
for (key in listOf(".blue600", ".blue400")) {
addValueCallback(KeyPath(key, "**"), LottieProperty.COLOR_FILTER) {
PorterDuffColorFilter(
context.getColor(R.color.settingslib_color_blue400),
PorterDuff.Mode.SRC_ATOP
)
}
} }
}
addValueCallback(KeyPath(".black", "**"), LottieProperty.COLOR_FILTER) {
PorterDuffColorFilter(chevronFill, PorterDuff.Mode.SRC_ATOP)
} }
} }
@@ -439,6 +468,29 @@ private fun LottieAnimationView.addOverlayDynamicColor(context: Context) {
} }
} }
private fun isDarkMode(context: Context): Boolean {
val darkMode = context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
return darkMode == Configuration.UI_MODE_NIGHT_YES
}
@VisibleForTesting
class OrientationReasonListener(
context: Context,
displayManager: DisplayManager,
handler: Handler,
sensorProps: FingerprintSensorPropertiesInternal,
onOrientationChanged: (reason: Int) -> Unit,
@BiometricOverlayConstants.ShowReason var reason: Int
) {
val orientationListener =
BiometricDisplayListener(
context,
displayManager,
handler,
BiometricDisplayListener.SensorType.SideFingerprint(sensorProps)
) { onOrientationChanged(reason) }
}
/** /**
* The source of a request to show the side fps visual indicator. This is distinct from * The source of a request to show the side fps visual indicator. This is distinct from
* [BiometricOverlayConstants] which corrresponds with the reason fingerprint authentication is * [BiometricOverlayConstants] which corrresponds with the reason fingerprint authentication is

View File

@@ -38,6 +38,7 @@ import static org.mockito.Mockito.when;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.content.res.Resources; import android.content.res.Resources;
import android.hardware.biometrics.BiometricOverlayConstants;
import android.hardware.biometrics.BiometricSourceType; import android.hardware.biometrics.BiometricSourceType;
import android.testing.AndroidTestingRunner; import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper; import android.testing.TestableLooper;
@@ -350,7 +351,8 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase {
mKeyguardSecurityContainerController.onBouncerVisibilityChanged(View.VISIBLE); mKeyguardSecurityContainerController.onBouncerVisibilityChanged(View.VISIBLE);
verify(mSideFpsController).show(SideFpsUiRequestSource.PRIMARY_BOUNCER); verify(mSideFpsController).show(SideFpsUiRequestSource.PRIMARY_BOUNCER,
BiometricOverlayConstants.REASON_AUTH_KEYGUARD);
verify(mSideFpsController, never()).hide(any()); verify(mSideFpsController, never()).hide(any());
} }
@@ -363,7 +365,7 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase {
mKeyguardSecurityContainerController.onBouncerVisibilityChanged(View.VISIBLE); mKeyguardSecurityContainerController.onBouncerVisibilityChanged(View.VISIBLE);
verify(mSideFpsController).hide(SideFpsUiRequestSource.PRIMARY_BOUNCER); verify(mSideFpsController).hide(SideFpsUiRequestSource.PRIMARY_BOUNCER);
verify(mSideFpsController, never()).show(any()); verify(mSideFpsController, never()).show(any(), anyInt());
} }
@Test @Test
@@ -375,7 +377,7 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase {
mKeyguardSecurityContainerController.onBouncerVisibilityChanged(View.VISIBLE); mKeyguardSecurityContainerController.onBouncerVisibilityChanged(View.VISIBLE);
verify(mSideFpsController).hide(SideFpsUiRequestSource.PRIMARY_BOUNCER); verify(mSideFpsController).hide(SideFpsUiRequestSource.PRIMARY_BOUNCER);
verify(mSideFpsController, never()).show(any()); verify(mSideFpsController, never()).show(any(), anyInt());
} }
@Test @Test
@@ -387,7 +389,7 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase {
mKeyguardSecurityContainerController.onBouncerVisibilityChanged(View.VISIBLE); mKeyguardSecurityContainerController.onBouncerVisibilityChanged(View.VISIBLE);
verify(mSideFpsController).hide(SideFpsUiRequestSource.PRIMARY_BOUNCER); verify(mSideFpsController).hide(SideFpsUiRequestSource.PRIMARY_BOUNCER);
verify(mSideFpsController, never()).show(any()); verify(mSideFpsController, never()).show(any(), anyInt());
} }
@Test @Test
@@ -395,13 +397,14 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase {
setupGetSecurityView(); setupGetSecurityView();
setupConditionsToEnableSideFpsHint(); setupConditionsToEnableSideFpsHint();
mKeyguardSecurityContainerController.onBouncerVisibilityChanged(View.VISIBLE); mKeyguardSecurityContainerController.onBouncerVisibilityChanged(View.VISIBLE);
verify(mSideFpsController, atLeastOnce()).show(SideFpsUiRequestSource.PRIMARY_BOUNCER); verify(mSideFpsController, atLeastOnce()).show(SideFpsUiRequestSource.PRIMARY_BOUNCER,
BiometricOverlayConstants.REASON_AUTH_KEYGUARD);
reset(mSideFpsController); reset(mSideFpsController);
mKeyguardSecurityContainerController.onBouncerVisibilityChanged(View.INVISIBLE); mKeyguardSecurityContainerController.onBouncerVisibilityChanged(View.INVISIBLE);
verify(mSideFpsController).hide(SideFpsUiRequestSource.PRIMARY_BOUNCER); verify(mSideFpsController).hide(SideFpsUiRequestSource.PRIMARY_BOUNCER);
verify(mSideFpsController, never()).show(any()); verify(mSideFpsController, never()).show(any(), anyInt());
} }
@Test @Test
@@ -416,13 +419,14 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase {
setupGetSecurityView(); setupGetSecurityView();
setupConditionsToEnableSideFpsHint(); setupConditionsToEnableSideFpsHint();
mKeyguardSecurityContainerController.onBouncerVisibilityChanged(View.VISIBLE); mKeyguardSecurityContainerController.onBouncerVisibilityChanged(View.VISIBLE);
verify(mSideFpsController, atLeastOnce()).show(SideFpsUiRequestSource.PRIMARY_BOUNCER); verify(mSideFpsController, atLeastOnce()).show(SideFpsUiRequestSource.PRIMARY_BOUNCER,
BiometricOverlayConstants.REASON_AUTH_KEYGUARD);
reset(mSideFpsController); reset(mSideFpsController);
mKeyguardSecurityContainerController.onStartingToHide(); mKeyguardSecurityContainerController.onStartingToHide();
verify(mSideFpsController).hide(SideFpsUiRequestSource.PRIMARY_BOUNCER); verify(mSideFpsController).hide(SideFpsUiRequestSource.PRIMARY_BOUNCER);
verify(mSideFpsController, never()).show(any()); verify(mSideFpsController, never()).show(any(), anyInt());
} }
@Test @Test
@@ -430,13 +434,14 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase {
setupGetSecurityView(); setupGetSecurityView();
setupConditionsToEnableSideFpsHint(); setupConditionsToEnableSideFpsHint();
mKeyguardSecurityContainerController.onBouncerVisibilityChanged(View.VISIBLE); mKeyguardSecurityContainerController.onBouncerVisibilityChanged(View.VISIBLE);
verify(mSideFpsController, atLeastOnce()).show(SideFpsUiRequestSource.PRIMARY_BOUNCER); verify(mSideFpsController, atLeastOnce()).show(SideFpsUiRequestSource.PRIMARY_BOUNCER,
BiometricOverlayConstants.REASON_AUTH_KEYGUARD);
reset(mSideFpsController); reset(mSideFpsController);
mKeyguardSecurityContainerController.onPause(); mKeyguardSecurityContainerController.onPause();
verify(mSideFpsController).hide(SideFpsUiRequestSource.PRIMARY_BOUNCER); verify(mSideFpsController).hide(SideFpsUiRequestSource.PRIMARY_BOUNCER);
verify(mSideFpsController, never()).show(any()); verify(mSideFpsController, never()).show(any(), anyInt());
} }
@Test @Test
@@ -448,7 +453,8 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase {
mKeyguardSecurityContainerController.onResume(0); mKeyguardSecurityContainerController.onResume(0);
verify(mSideFpsController).show(SideFpsUiRequestSource.PRIMARY_BOUNCER); verify(mSideFpsController).show(SideFpsUiRequestSource.PRIMARY_BOUNCER,
BiometricOverlayConstants.REASON_AUTH_KEYGUARD);
verify(mSideFpsController, never()).hide(any()); verify(mSideFpsController, never()).hide(any());
} }
@@ -463,7 +469,7 @@ public class KeyguardSecurityContainerControllerTest extends SysuiTestCase {
mKeyguardSecurityContainerController.onResume(0); mKeyguardSecurityContainerController.onResume(0);
verify(mSideFpsController).hide(SideFpsUiRequestSource.PRIMARY_BOUNCER); verify(mSideFpsController).hide(SideFpsUiRequestSource.PRIMARY_BOUNCER);
verify(mSideFpsController, never()).show(any()); verify(mSideFpsController, never()).show(any(), anyInt());
} }
@Test @Test

View File

@@ -266,6 +266,17 @@ class SideFpsControllerTest : SysuiTestCase() {
verify(displayManager).unregisterDisplayListener(any()) verify(displayManager).unregisterDisplayListener(any())
} }
@Test
fun testShowOverlayReasonWhenDisplayChanged() = testWithDisplay {
sideFpsController.show(SideFpsUiRequestSource.AUTO_SHOW, REASON_AUTH_KEYGUARD)
executor.runAllReady()
sideFpsController.orientationListener.onDisplayChanged(1 /* displayId */)
executor.runAllReady()
assertThat(sideFpsController.orientationReasonListener.reason)
.isEqualTo(REASON_AUTH_KEYGUARD)
}
@Test @Test
fun testShowsAndHides() = testWithDisplay { fun testShowsAndHides() = testWithDisplay {
overlayController.show(SENSOR_ID, REASON_UNKNOWN) overlayController.show(SENSOR_ID, REASON_UNKNOWN)