Merge changes from topics "caitlinshk-csg-authripplecontroller", "caitlinshk-csg-lightrevealscrim" into udc-dev

* changes:
  [Central Surfaces] Make AuthRipple(view&controller) a singleton.
  [Central Surfaces] Remove AuthRippleController's dependency on CS.
This commit is contained in:
Caitlin Shkuratov
2023-04-20 20:34:36 +00:00
committed by Android (Google) Code Review
7 changed files with 67 additions and 38 deletions

View File

@@ -23,14 +23,17 @@ import android.content.Context
import android.graphics.Point
import android.hardware.biometrics.BiometricFingerprintConstants
import android.hardware.biometrics.BiometricSourceType
import android.util.DisplayMetrics
import androidx.annotation.VisibleForTesting
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.keyguard.KeyguardUpdateMonitorCallback
import com.android.keyguard.logging.KeyguardLogger
import com.android.settingslib.Utils
import com.android.settingslib.udfps.UdfpsOverlayParams
import com.android.systemui.CoreStartable
import com.android.systemui.R
import com.android.systemui.animation.Interpolators
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.flags.FeatureFlags
import com.android.systemui.flags.Flags
import com.android.systemui.keyguard.WakefulnessLifecycle
@@ -39,12 +42,11 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.statusbar.CircleReveal
import com.android.systemui.statusbar.LiftReveal
import com.android.systemui.statusbar.LightRevealEffect
import com.android.systemui.statusbar.LightRevealScrim
import com.android.systemui.statusbar.NotificationShadeWindowController
import com.android.systemui.statusbar.commandline.Command
import com.android.systemui.statusbar.commandline.CommandRegistry
import com.android.systemui.statusbar.phone.BiometricUnlockController
import com.android.systemui.statusbar.phone.CentralSurfaces
import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent.CentralSurfacesScope
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.util.ViewController
@@ -60,9 +62,8 @@ import javax.inject.Provider
*
* The ripple uses the accent color of the current theme.
*/
@CentralSurfacesScope
@SysUISingleton
class AuthRippleController @Inject constructor(
private val centralSurfaces: CentralSurfaces,
private val sysuiContext: Context,
private val authController: AuthController,
private val configurationController: ConfigurationController,
@@ -73,12 +74,15 @@ class AuthRippleController @Inject constructor(
private val notificationShadeWindowController: NotificationShadeWindowController,
private val udfpsControllerProvider: Provider<UdfpsController>,
private val statusBarStateController: StatusBarStateController,
private val displayMetrics: DisplayMetrics,
private val featureFlags: FeatureFlags,
private val logger: KeyguardLogger,
private val biometricUnlockController: BiometricUnlockController,
private val lightRevealScrim: LightRevealScrim,
rippleView: AuthRippleView?
) :
ViewController<AuthRippleView>(rippleView),
CoreStartable,
KeyguardStateController.Callback,
WakefulnessLifecycle.Observer {
@@ -92,6 +96,10 @@ class AuthRippleController @Inject constructor(
private var udfpsController: UdfpsController? = null
private var udfpsRadius: Float = -1f
override fun start() {
init()
}
@VisibleForTesting
public override fun onViewAttached() {
authController.addCallback(authControllerCallback)
@@ -153,8 +161,8 @@ class AuthRippleController @Inject constructor(
it.y,
0,
Math.max(
Math.max(it.x, centralSurfaces.displayWidth.toInt() - it.x),
Math.max(it.y, centralSurfaces.displayHeight.toInt() - it.y)
Math.max(it.x, displayMetrics.widthPixels - it.x),
Math.max(it.y, displayMetrics.heightPixels - it.y)
)
)
logger.showingUnlockRippleAt(it.x, it.y, "FP sensor radius: $udfpsRadius")
@@ -168,8 +176,8 @@ class AuthRippleController @Inject constructor(
it.y,
0,
Math.max(
Math.max(it.x, centralSurfaces.displayWidth.toInt() - it.x),
Math.max(it.y, centralSurfaces.displayHeight.toInt() - it.y)
Math.max(it.x, displayMetrics.widthPixels - it.x),
Math.max(it.y, displayMetrics.heightPixels - it.y)
)
)
logger.showingUnlockRippleAt(it.x, it.y, "Face unlock ripple")
@@ -184,11 +192,10 @@ class AuthRippleController @Inject constructor(
// This code path is not used if the KeyguardTransitionRepository is managing the light
// reveal scrim.
if (!featureFlags.isEnabled(Flags.LIGHT_REVEAL_MIGRATION)) {
val lightRevealScrim = centralSurfaces.lightRevealScrim
if (statusBarStateController.isDozing || biometricUnlockController.isWakeAndUnlock) {
circleReveal?.let {
lightRevealScrim?.revealAmount = 0f
lightRevealScrim?.revealEffect = it
lightRevealScrim.revealAmount = 0f
lightRevealScrim.revealEffect = it
startLightRevealScrimOnKeyguardFadingAway = true
}
}
@@ -208,8 +215,7 @@ class AuthRippleController @Inject constructor(
}
if (keyguardStateController.isKeyguardFadingAway) {
val lightRevealScrim = centralSurfaces.lightRevealScrim
if (startLightRevealScrimOnKeyguardFadingAway && lightRevealScrim != null) {
if (startLightRevealScrimOnKeyguardFadingAway) {
lightRevealScrimAnimator?.cancel()
lightRevealScrimAnimator = ValueAnimator.ofFloat(.1f, 1f).apply {
interpolator = Interpolators.LINEAR_OUT_SLOW_IN

View File

@@ -17,15 +17,28 @@
package com.android.systemui.shade
import android.view.LayoutInflater
import com.android.systemui.CoreStartable
import com.android.systemui.R
import com.android.systemui.biometrics.AuthRippleController
import com.android.systemui.biometrics.AuthRippleView
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.statusbar.LightRevealScrim
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout
import dagger.Binds
import dagger.Module
import dagger.Provides
import dagger.multibindings.ClassKey
import dagger.multibindings.IntoMap
/** Module for classes related to the notification shade. */
@Module
abstract class ShadeModule {
@Binds
@IntoMap
@ClassKey(AuthRippleController::class)
abstract fun bindAuthRippleController(controller: AuthRippleController): CoreStartable
companion object {
@Provides
@SysUISingleton
@@ -59,5 +72,22 @@ abstract class ShadeModule {
): NotificationPanelView {
return notificationShadeWindowView.findViewById(R.id.notification_panel)
}
@Provides
@SysUISingleton
fun providesLightRevealScrim(
notificationShadeWindowView: NotificationShadeWindowView,
): LightRevealScrim {
return notificationShadeWindowView.findViewById(R.id.light_reveal_scrim)
}
// TODO(b/277762009): Only allow this view's controller to inject the view. See above.
@Provides
@SysUISingleton
fun providesAuthRippleView(
notificationShadeWindowView: NotificationShadeWindowView,
): AuthRippleView? {
return notificationShadeWindowView.findViewById(R.id.auth_ripple)
}
}
}

View File

@@ -452,7 +452,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces {
protected PhoneStatusBarView mStatusBarView;
private PhoneStatusBarViewController mPhoneStatusBarViewController;
private PhoneStatusBarTransitions mStatusBarTransitions;
private AuthRippleController mAuthRippleController;
private final AuthRippleController mAuthRippleController;
@WindowVisibleState private int mStatusBarWindowState = WINDOW_STATE_SHOWING;
protected final NotificationShadeWindowController mNotificationShadeWindowController;
private final StatusBarInitializer mStatusBarInitializer;
@@ -460,7 +460,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces {
private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
@VisibleForTesting
DozeServiceHost mDozeServiceHost;
private LightRevealScrim mLightRevealScrim;
private final LightRevealScrim mLightRevealScrim;
private PowerButtonReveal mPowerButtonReveal;
private boolean mWakeUpComingFromTouch;
@@ -768,6 +768,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces {
ScrimController scrimController,
Lazy<LockscreenWallpaper> lockscreenWallpaperLazy,
Lazy<BiometricUnlockController> biometricUnlockControllerLazy,
AuthRippleController authRippleController,
DozeServiceHost dozeServiceHost,
PowerManager powerManager,
ScreenPinningRequest screenPinningRequest,
@@ -810,6 +811,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces {
IDreamManager dreamManager,
Lazy<CameraLauncher> cameraLauncherLazy,
Lazy<LightRevealScrimViewModel> lightRevealScrimViewModelLazy,
LightRevealScrim lightRevealScrim,
AlternateBouncerInteractor alternateBouncerInteractor,
UserTracker userTracker,
Provider<FingerprintManager> fingerprintManager
@@ -866,6 +868,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces {
mScreenPinningRequest = screenPinningRequest;
mDozeScrimController = dozeScrimController;
mBiometricUnlockControllerLazy = biometricUnlockControllerLazy;
mAuthRippleController = authRippleController;
mNotificationShadeDepthControllerLazy = notificationShadeDepthControllerLazy;
mVolumeComponent = volumeComponent;
mCommandQueue = commandQueue;
@@ -932,6 +935,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces {
wiredChargingRippleController.registerCallbacks();
mLightRevealScrimViewModelLazy = lightRevealScrimViewModelLazy;
mLightRevealScrim = lightRevealScrim;
// Based on teamfood flag, turn predictive back dispatch on at runtime.
if (mFeatureFlags.isEnabled(Flags.WM_ENABLE_PREDICTIVE_BACK_SYSUI)) {
@@ -1326,8 +1330,6 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces {
});
mScrimController.attachViews(scrimBehind, notificationsScrim, scrimInFront);
mLightRevealScrim = mNotificationShadeWindowView.findViewById(R.id.light_reveal_scrim);
if (mFeatureFlags.isEnabled(Flags.LIGHT_REVEAL_MIGRATION)) {
LightRevealScrimViewBinder.bind(
mLightRevealScrim, mLightRevealScrimViewModelLazy.get());
@@ -1667,8 +1669,6 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces {
mPresenter = mCentralSurfacesComponent.getNotificationPresenter();
mNotificationActivityStarter = mCentralSurfacesComponent.getNotificationActivityStarter();
mNotificationShelfController = mCentralSurfacesComponent.getNotificationShelfController();
mAuthRippleController = mCentralSurfacesComponent.getAuthRippleController();
mAuthRippleController.init();
mHeadsUpManager.addListener(mCentralSurfacesComponent.getStatusBarHeadsUpChangeListener());

View File

@@ -121,11 +121,6 @@ public interface CentralSurfacesComponent {
*/
LockIconViewController getLockIconViewController();
/**
* Creates an AuthRippleViewController. Must be init after creation.
*/
AuthRippleController getAuthRippleController();
/**
* Creates a StatusBarHeadsUpChangeListener.
*/

View File

@@ -29,7 +29,6 @@ import com.android.keyguard.LockIconView;
import com.android.systemui.R;
import com.android.systemui.battery.BatteryMeterView;
import com.android.systemui.battery.BatteryMeterViewController;
import com.android.systemui.biometrics.AuthRippleView;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.flags.FeatureFlags;
@@ -148,15 +147,6 @@ public abstract class StatusBarViewModule {
return notificationShadeWindowView.findViewById(R.id.lock_icon_view);
}
/** */
@Provides
@CentralSurfacesComponent.CentralSurfacesScope
@Nullable
public static AuthRippleView getAuthRippleView(
NotificationShadeWindowView notificationShadeWindowView) {
return notificationShadeWindowView.findViewById(R.id.auth_ripple);
}
/** */
@Provides
@Named(SHADE_HEADER)

View File

@@ -21,6 +21,7 @@ import android.hardware.biometrics.BiometricSourceType
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal
import android.testing.AndroidTestingRunner
import android.testing.TestableLooper.RunWithLooper
import android.util.DisplayMetrics
import androidx.test.filters.SmallTest
import com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession
import com.android.keyguard.KeyguardUpdateMonitor
@@ -35,7 +36,6 @@ import com.android.systemui.statusbar.LightRevealScrim
import com.android.systemui.statusbar.NotificationShadeWindowController
import com.android.systemui.statusbar.commandline.CommandRegistry
import com.android.systemui.statusbar.phone.BiometricUnlockController
import com.android.systemui.statusbar.phone.CentralSurfaces
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.util.leak.RotationUtils
@@ -66,7 +66,6 @@ class AuthRippleControllerTest : SysuiTestCase() {
private lateinit var staticMockSession: MockitoSession
private lateinit var controller: AuthRippleController
@Mock private lateinit var mCentralSurfaces: CentralSurfaces
@Mock private lateinit var rippleView: AuthRippleView
@Mock private lateinit var commandRegistry: CommandRegistry
@Mock private lateinit var configurationController: ConfigurationController
@@ -92,6 +91,8 @@ class AuthRippleControllerTest : SysuiTestCase() {
@Mock
private lateinit var fpSensorProp: FingerprintSensorPropertiesInternal
private val displayMetrics = DisplayMetrics()
@Captor
private lateinit var biometricUnlockListener:
ArgumentCaptor<BiometricUnlockController.BiometricUnlockEventsListener>
@@ -109,7 +110,6 @@ class AuthRippleControllerTest : SysuiTestCase() {
`when`(udfpsControllerProvider.get()).thenReturn(udfpsController)
controller = AuthRippleController(
mCentralSurfaces,
context,
authController,
configurationController,
@@ -120,13 +120,14 @@ class AuthRippleControllerTest : SysuiTestCase() {
notificationShadeWindowController,
udfpsControllerProvider,
statusBarStateController,
displayMetrics,
featureFlags,
KeyguardLogger(logcatLogBuffer(AuthRippleController.TAG)),
biometricUnlockController,
lightRevealScrim,
rippleView,
)
controller.init()
`when`(mCentralSurfaces.lightRevealScrim).thenReturn(lightRevealScrim)
}
@After

View File

@@ -101,6 +101,7 @@ import com.android.systemui.SysuiTestCase;
import com.android.systemui.accessibility.floatingmenu.AccessibilityFloatingMenuController;
import com.android.systemui.animation.ActivityLaunchAnimator;
import com.android.systemui.assist.AssistManager;
import com.android.systemui.biometrics.AuthRippleController;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.charging.WiredChargingRippleController;
import com.android.systemui.classifier.FalsingCollectorFake;
@@ -138,6 +139,7 @@ import com.android.systemui.shade.ShadeExpansionStateManager;
import com.android.systemui.shade.ShadeLogger;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.KeyguardIndicationController;
import com.android.systemui.statusbar.LightRevealScrim;
import com.android.systemui.statusbar.LockscreenShadeTransitionController;
import com.android.systemui.statusbar.NotificationListener;
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
@@ -231,10 +233,12 @@ public class CentralSurfacesImplTest extends SysuiTestCase {
@Mock private IStatusBarService mBarService;
@Mock private IDreamManager mDreamManager;
@Mock private LightRevealScrimViewModel mLightRevealScrimViewModel;
@Mock private LightRevealScrim mLightRevealScrim;
@Mock private ScrimController mScrimController;
@Mock private DozeScrimController mDozeScrimController;
@Mock private Lazy<BiometricUnlockController> mBiometricUnlockControllerLazy;
@Mock private BiometricUnlockController mBiometricUnlockController;
@Mock private AuthRippleController mAuthRippleController;
@Mock private NotificationListener mNotificationListener;
@Mock private KeyguardViewMediator mKeyguardViewMediator;
@Mock private NotificationLockscreenUserManager mLockscreenUserManager;
@@ -345,6 +349,7 @@ public class CentralSurfacesImplTest extends SysuiTestCase {
mFeatureFlags.set(Flags.WM_SHADE_ALLOW_BACK_GESTURE, true);
// For the Shade to animate during the Back gesture, we must enable the animation flag.
mFeatureFlags.set(Flags.WM_SHADE_ANIMATE_BACK_GESTURE, true);
mFeatureFlags.set(Flags.LIGHT_REVEAL_MIGRATION, true);
IThermalService thermalService = mock(IThermalService.class);
mPowerManager = new PowerManager(mContext, mPowerManagerService, thermalService,
@@ -497,6 +502,7 @@ public class CentralSurfacesImplTest extends SysuiTestCase {
mScrimController,
mLockscreenWallpaperLazy,
mBiometricUnlockControllerLazy,
mAuthRippleController,
mDozeServiceHost,
mPowerManager, mScreenPinningRequest,
mDozeScrimController,
@@ -538,6 +544,7 @@ public class CentralSurfacesImplTest extends SysuiTestCase {
mDreamManager,
mCameraLauncherLazy,
() -> mLightRevealScrimViewModel,
mLightRevealScrim,
mAlternateBouncerInteractor,
mUserTracker,
() -> mFingerprintManager