diff --git a/packages/SystemUI/res/values/flags.xml b/packages/SystemUI/res/values/flags.xml index c2dba6c41d122..261b08d4356f8 100644 --- a/packages/SystemUI/res/values/flags.xml +++ b/packages/SystemUI/res/values/flags.xml @@ -40,4 +40,7 @@ false + + + true diff --git a/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt b/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt index 403c809853775..95e2dba88b908 100644 --- a/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt +++ b/packages/SystemUI/src/com/android/systemui/FaceScanningOverlay.kt @@ -36,6 +36,8 @@ import com.android.keyguard.KeyguardUpdateMonitor import com.android.keyguard.KeyguardUpdateMonitorCallback import com.android.settingslib.Utils import com.android.systemui.biometrics.AuthController +import com.android.systemui.flags.FeatureFlags +import com.android.systemui.flags.Flags import com.android.systemui.log.ScreenDecorationsLogger import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.util.asIndenting @@ -54,6 +56,7 @@ class FaceScanningOverlay( val mainExecutor: Executor, val logger: ScreenDecorationsLogger, val authController: AuthController, + val featureFlags: FeatureFlags, ) : ScreenDecorations.DisplayCutoutView(context, pos) { private var showScanningAnim = false private val rimPaint = Paint() @@ -294,6 +297,15 @@ class FaceScanningOverlay( } private fun createFaceScanningRimAnimator(): AnimatorSet { + val dontPulse = featureFlags.isEnabled(Flags.STOP_PULSING_FACE_SCANNING_ANIMATION) + if (dontPulse) { + return AnimatorSet().apply { + playSequentially( + cameraProtectionAnimator, + createRimAppearAnimator(), + ) + } + } return AnimatorSet().apply { playSequentially( cameraProtectionAnimator, diff --git a/packages/SystemUI/src/com/android/systemui/decor/FaceScanningProviderFactory.kt b/packages/SystemUI/src/com/android/systemui/decor/FaceScanningProviderFactory.kt index 4e62104034ee5..ac0d3c8f3d36e 100644 --- a/packages/SystemUI/src/com/android/systemui/decor/FaceScanningProviderFactory.kt +++ b/packages/SystemUI/src/com/android/systemui/decor/FaceScanningProviderFactory.kt @@ -34,6 +34,7 @@ import com.android.systemui.FaceScanningOverlay import com.android.systemui.biometrics.AuthController import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Main +import com.android.systemui.flags.FeatureFlags import com.android.systemui.log.ScreenDecorationsLogger import com.android.systemui.plugins.statusbar.StatusBarStateController import java.util.concurrent.Executor @@ -47,6 +48,7 @@ class FaceScanningProviderFactory @Inject constructor( private val keyguardUpdateMonitor: KeyguardUpdateMonitor, @Main private val mainExecutor: Executor, private val logger: ScreenDecorationsLogger, + private val featureFlags: FeatureFlags, ) : DecorProviderFactory() { private val display = context.display private val displayInfo = DisplayInfo() @@ -86,6 +88,7 @@ class FaceScanningProviderFactory @Inject constructor( keyguardUpdateMonitor, mainExecutor, logger, + featureFlags, ) ) } @@ -110,6 +113,7 @@ class FaceScanningOverlayProviderImpl( private val keyguardUpdateMonitor: KeyguardUpdateMonitor, private val mainExecutor: Executor, private val logger: ScreenDecorationsLogger, + private val featureFlags: FeatureFlags, ) : BoundDecorProvider() { override val viewId: Int = com.android.systemui.R.id.face_scanning_anim @@ -144,6 +148,7 @@ class FaceScanningOverlayProviderImpl( mainExecutor, logger, authController, + featureFlags ) view.id = viewId view.setColor(tintColor) diff --git a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt index ee9482c730af3..ee8fae599d41c 100644 --- a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt +++ b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt @@ -273,6 +273,12 @@ object Flags { @JvmField val STOP_FACE_AUTH_ON_DISPLAY_OFF = resourceBooleanFlag(245, R.bool.flag_stop_face_auth_on_display_off, "stop_face_auth_on_display_off") + /** Flag to disable the face scanning animation pulsing. */ + // TODO(b/295245791): Tracking bug. + @JvmField val STOP_PULSING_FACE_SCANNING_ANIMATION = resourceBooleanFlag(246, + R.bool.flag_stop_pulsing_face_scanning_animation, + "stop_pulsing_face_scanning_animation") + // 300 - power menu // TODO(b/254512600): Tracking Bug @JvmField val POWER_MENU_LITE = releasedFlag(300, "power_menu_lite") diff --git a/packages/SystemUI/tests/src/com/android/systemui/FaceScanningProviderFactoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/FaceScanningProviderFactoryTest.kt index 01d3a39310522..ea7cc3dcd119f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/FaceScanningProviderFactoryTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/FaceScanningProviderFactoryTest.kt @@ -27,6 +27,8 @@ import com.android.keyguard.KeyguardUpdateMonitor import com.android.systemui.biometrics.AuthController import com.android.systemui.decor.FaceScanningProviderFactory import com.android.systemui.dump.logcatLogBuffer +import com.android.systemui.flags.FakeFeatureFlags +import com.android.systemui.flags.Flags import com.android.systemui.log.ScreenDecorationsLogger import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.util.mockito.whenever @@ -80,6 +82,8 @@ class FaceScanningProviderFactoryTest : SysuiTestCase() { R.bool.config_fillMainBuiltInDisplayCutout, true ) + val featureFlags = FakeFeatureFlags() + featureFlags.set(Flags.STOP_PULSING_FACE_SCANNING_ANIMATION, true) underTest = FaceScanningProviderFactory( authController, @@ -87,7 +91,8 @@ class FaceScanningProviderFactoryTest : SysuiTestCase() { statusBarStateController, keyguardUpdateMonitor, mock(Executor::class.java), - ScreenDecorationsLogger(logcatLogBuffer("FaceScanningProviderFactoryTest")) + ScreenDecorationsLogger(logcatLogBuffer("FaceScanningProviderFactoryTest")), + featureFlags, ) whenever(authController.faceSensorLocation).thenReturn(Point(10, 10)) diff --git a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java index 4cf5a4be0b601..13a1fe969ac85 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java @@ -91,6 +91,8 @@ import com.android.systemui.decor.OverlayWindow; import com.android.systemui.decor.PrivacyDotCornerDecorProviderImpl; import com.android.systemui.decor.PrivacyDotDecorProviderFactory; import com.android.systemui.decor.RoundedCornerResDelegate; +import com.android.systemui.flags.FakeFeatureFlags; +import com.android.systemui.flags.Flags; import com.android.systemui.log.ScreenDecorationsLogger; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.settings.FakeDisplayTracker; @@ -225,13 +227,16 @@ public class ScreenDecorationsTest extends SysuiTestCase { doAnswer(it -> !(mMockCutoutList.isEmpty())).when(mCutoutFactory).getHasProviders(); doReturn(mMockCutoutList).when(mCutoutFactory).getProviders(); + FakeFeatureFlags featureFlags = new FakeFeatureFlags(); + featureFlags.set(Flags.STOP_PULSING_FACE_SCANNING_ANIMATION, true); mFaceScanningDecorProvider = spy(new FaceScanningOverlayProviderImpl( BOUNDS_POSITION_TOP, mAuthController, mStatusBarStateController, mKeyguardUpdateMonitor, mExecutor, - new ScreenDecorationsLogger(logcatLogBuffer("TestLogBuffer")))); + new ScreenDecorationsLogger(logcatLogBuffer("TestLogBuffer")), + featureFlags)); mScreenDecorations = spy(new ScreenDecorations(mContext, mExecutor, mSecureSettings, mTunerService, mUserTracker, mDisplayTracker, mDotViewController, mThreadFactory,