Loading packages/SystemUI/src/com/android/keyguard/LockIconViewController.java +18 −3 Original line number Diff line number Diff line Loading @@ -62,6 +62,7 @@ import com.android.systemui.biometrics.AuthController; import com.android.systemui.biometrics.AuthRippleController; import com.android.systemui.biometrics.UdfpsController; import com.android.systemui.biometrics.shared.model.UdfpsOverlayParams; import com.android.systemui.bouncer.domain.interactor.BouncerInteractor; import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; Loading @@ -74,12 +75,15 @@ import com.android.systemui.keyguard.shared.model.TransitionStep; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.res.R; import com.android.systemui.scene.shared.flag.SceneContainerFlags; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.VibratorHelper; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.util.concurrency.DelayableExecutor; import dagger.Lazy; import java.io.PrintWriter; import java.util.Objects; import java.util.function.Consumer; Loading Loading @@ -128,6 +132,8 @@ public class LockIconViewController implements Dumpable { @NonNull private final KeyguardTransitionInteractor mTransitionInteractor; @NonNull private final KeyguardInteractor mKeyguardInteractor; @NonNull private final View.AccessibilityDelegate mAccessibilityDelegate; @NonNull private final Lazy<BouncerInteractor> mBouncerInteractor; @NonNull private final SceneContainerFlags mSceneContainerFlags; // Tracks the velocity of a touch to help filter out the touches that move too fast. private VelocityTracker mVelocityTracker; Loading Loading @@ -204,7 +210,9 @@ public class LockIconViewController implements Dumpable { @NonNull KeyguardInteractor keyguardInteractor, @NonNull FeatureFlags featureFlags, PrimaryBouncerInteractor primaryBouncerInteractor, Context context Context context, Lazy<BouncerInteractor> bouncerInteractor, SceneContainerFlags sceneContainerFlags ) { mStatusBarStateController = statusBarStateController; mKeyguardUpdateMonitor = keyguardUpdateMonitor; Loading Loading @@ -233,6 +241,8 @@ public class LockIconViewController implements Dumpable { dumpManager.registerDumpable(TAG, this); mResources = resources; mContext = context; mBouncerInteractor = bouncerInteractor; mSceneContainerFlags = sceneContainerFlags; mAccessibilityDelegate = new View.AccessibilityDelegate() { private final AccessibilityNodeInfo.AccessibilityAction mAccessibilityAuthenticateHint = Loading Loading @@ -715,7 +725,8 @@ public class LockIconViewController implements Dumpable { return mDownDetected; } private void onLongPress() { @VisibleForTesting protected void onLongPress() { cancelTouches(); if (mFalsingManager.isFalseLongTap(FalsingManager.LOW_PENALTY)) { Log.v(TAG, "lock icon long-press rejected by the falsing manager."); Loading @@ -732,8 +743,12 @@ public class LockIconViewController implements Dumpable { // play device entry haptic (consistent with UDFPS controller longpress) vibrateOnLongPress(); if (mSceneContainerFlags.isEnabled()) { mBouncerInteractor.get().showOrUnlockDevice(null); } else { mKeyguardViewController.showPrimaryBouncer(/* scrim */ true); } } private void cancelTouches() { Loading packages/SystemUI/tests/src/com/android/keyguard/LockIconViewControllerBaseTest.java +11 −3 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ import android.view.accessibility.AccessibilityManager; import com.android.systemui.SysuiTestCase; import com.android.systemui.biometrics.AuthController; import com.android.systemui.biometrics.AuthRippleController; import com.android.systemui.bouncer.domain.interactor.BouncerInteractor; import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor; import com.android.systemui.doze.util.BurnInHelperKt; import com.android.systemui.dump.DumpManager; Loading @@ -51,6 +52,7 @@ import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInterac import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.res.R; import com.android.systemui.scene.SceneTestUtils; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.VibratorHelper; import com.android.systemui.statusbar.policy.ConfigurationController; Loading @@ -75,6 +77,8 @@ public class LockIconViewControllerBaseTest extends SysuiTestCase { protected MockitoSession mStaticMockSession; protected final SceneTestUtils mSceneTestUtils = new SceneTestUtils(this); protected @Mock BouncerInteractor mBouncerInteractor; protected @Mock LockIconView mLockIconView; protected @Mock AnimatedStateListDrawable mIconDrawable; protected @Mock Context mContext; Loading @@ -93,6 +97,7 @@ public class LockIconViewControllerBaseTest extends SysuiTestCase { protected @Mock AuthRippleController mAuthRippleController; protected FakeExecutor mDelayableExecutor = new FakeExecutor(new FakeSystemClock()); protected FakeFeatureFlags mFeatureFlags; protected @Mock PrimaryBouncerInteractor mPrimaryBouncerInteractor; protected LockIconViewController mUnderTest; Loading Loading @@ -148,6 +153,7 @@ public class LockIconViewControllerBaseTest extends SysuiTestCase { mFeatureFlags.set(MIGRATE_LOCK_ICON, false); mFeatureFlags.set(LOCKSCREEN_WALLPAPER_DREAM_ENABLED, false); mFeatureFlags.set(LOCKSCREEN_ENABLE_LANDSCAPE, false); mUnderTest = new LockIconViewController( mStatusBarStateController, mKeyguardUpdateMonitor, Loading @@ -168,7 +174,9 @@ public class LockIconViewControllerBaseTest extends SysuiTestCase { KeyguardInteractorFactory.create(mFeatureFlags).getKeyguardInteractor(), mFeatureFlags, mPrimaryBouncerInteractor, mContext mContext, () -> mBouncerInteractor, mSceneTestUtils.getSceneContainerFlags() ); } Loading Loading @@ -227,8 +235,8 @@ public class LockIconViewControllerBaseTest extends SysuiTestCase { setupLockIconViewMocks(); } protected void init(boolean useMigrationFlag) { mFeatureFlags.set(DOZING_MIGRATION_1, useMigrationFlag); protected void init(boolean useDozeMigrationFlag) { mFeatureFlags.set(DOZING_MIGRATION_1, useDozeMigrationFlag); mUnderTest.setLockIconView(mLockIconView); } } packages/SystemUI/tests/src/com/android/keyguard/LockIconViewControllerTest.java +44 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.anyBoolean; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; Loading Loading @@ -404,6 +405,49 @@ public class LockIconViewControllerTest extends LockIconViewControllerBaseTest { // THEN uses perform haptic feedback verify(mVibrator).performHapticFeedback(any(), eq(UdfpsController.LONG_PRESS)); } @Test public void longPress_showBouncer_sceneContainerNotEnabled() { init(/* useMigrationFlag= */ false); mSceneTestUtils.getSceneContainerFlags().setEnabled(false); mFeatureFlags.set(ONE_WAY_HAPTICS_API_MIGRATION, true); when(mFalsingManager.isFalseLongTap(anyInt())).thenReturn(false); // WHEN longPress mUnderTest.onLongPress(); // THEN show primary bouncer via keyguard view controller, not scene container verify(mKeyguardViewController).showPrimaryBouncer(anyBoolean()); verify(mBouncerInteractor, never()).showOrUnlockDevice(any()); } @Test public void longPress_showBouncer() { init(/* useMigrationFlag= */ false); mSceneTestUtils.getSceneContainerFlags().setEnabled(true); mFeatureFlags.set(ONE_WAY_HAPTICS_API_MIGRATION, true); when(mFalsingManager.isFalseLongTap(anyInt())).thenReturn(false); // WHEN longPress mUnderTest.onLongPress(); // THEN show primary bouncer verify(mKeyguardViewController, never()).showPrimaryBouncer(anyBoolean()); verify(mBouncerInteractor).showOrUnlockDevice(any()); } @Test public void longPress_falsingTriggered_doesNotShowBouncer() { init(/* useMigrationFlag= */ false); mSceneTestUtils.getSceneContainerFlags().setEnabled(true); mFeatureFlags.set(ONE_WAY_HAPTICS_API_MIGRATION, true); when(mFalsingManager.isFalseLongTap(anyInt())).thenReturn(true); // WHEN longPress mUnderTest.onLongPress(); // THEN don't show primary bouncer verify(mBouncerInteractor, never()).showOrUnlockDevice(any()); } } Loading
packages/SystemUI/src/com/android/keyguard/LockIconViewController.java +18 −3 Original line number Diff line number Diff line Loading @@ -62,6 +62,7 @@ import com.android.systemui.biometrics.AuthController; import com.android.systemui.biometrics.AuthRippleController; import com.android.systemui.biometrics.UdfpsController; import com.android.systemui.biometrics.shared.model.UdfpsOverlayParams; import com.android.systemui.bouncer.domain.interactor.BouncerInteractor; import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; Loading @@ -74,12 +75,15 @@ import com.android.systemui.keyguard.shared.model.TransitionStep; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.res.R; import com.android.systemui.scene.shared.flag.SceneContainerFlags; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.VibratorHelper; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.util.concurrency.DelayableExecutor; import dagger.Lazy; import java.io.PrintWriter; import java.util.Objects; import java.util.function.Consumer; Loading Loading @@ -128,6 +132,8 @@ public class LockIconViewController implements Dumpable { @NonNull private final KeyguardTransitionInteractor mTransitionInteractor; @NonNull private final KeyguardInteractor mKeyguardInteractor; @NonNull private final View.AccessibilityDelegate mAccessibilityDelegate; @NonNull private final Lazy<BouncerInteractor> mBouncerInteractor; @NonNull private final SceneContainerFlags mSceneContainerFlags; // Tracks the velocity of a touch to help filter out the touches that move too fast. private VelocityTracker mVelocityTracker; Loading Loading @@ -204,7 +210,9 @@ public class LockIconViewController implements Dumpable { @NonNull KeyguardInteractor keyguardInteractor, @NonNull FeatureFlags featureFlags, PrimaryBouncerInteractor primaryBouncerInteractor, Context context Context context, Lazy<BouncerInteractor> bouncerInteractor, SceneContainerFlags sceneContainerFlags ) { mStatusBarStateController = statusBarStateController; mKeyguardUpdateMonitor = keyguardUpdateMonitor; Loading Loading @@ -233,6 +241,8 @@ public class LockIconViewController implements Dumpable { dumpManager.registerDumpable(TAG, this); mResources = resources; mContext = context; mBouncerInteractor = bouncerInteractor; mSceneContainerFlags = sceneContainerFlags; mAccessibilityDelegate = new View.AccessibilityDelegate() { private final AccessibilityNodeInfo.AccessibilityAction mAccessibilityAuthenticateHint = Loading Loading @@ -715,7 +725,8 @@ public class LockIconViewController implements Dumpable { return mDownDetected; } private void onLongPress() { @VisibleForTesting protected void onLongPress() { cancelTouches(); if (mFalsingManager.isFalseLongTap(FalsingManager.LOW_PENALTY)) { Log.v(TAG, "lock icon long-press rejected by the falsing manager."); Loading @@ -732,8 +743,12 @@ public class LockIconViewController implements Dumpable { // play device entry haptic (consistent with UDFPS controller longpress) vibrateOnLongPress(); if (mSceneContainerFlags.isEnabled()) { mBouncerInteractor.get().showOrUnlockDevice(null); } else { mKeyguardViewController.showPrimaryBouncer(/* scrim */ true); } } private void cancelTouches() { Loading
packages/SystemUI/tests/src/com/android/keyguard/LockIconViewControllerBaseTest.java +11 −3 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ import android.view.accessibility.AccessibilityManager; import com.android.systemui.SysuiTestCase; import com.android.systemui.biometrics.AuthController; import com.android.systemui.biometrics.AuthRippleController; import com.android.systemui.bouncer.domain.interactor.BouncerInteractor; import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor; import com.android.systemui.doze.util.BurnInHelperKt; import com.android.systemui.dump.DumpManager; Loading @@ -51,6 +52,7 @@ import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInterac import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.res.R; import com.android.systemui.scene.SceneTestUtils; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.VibratorHelper; import com.android.systemui.statusbar.policy.ConfigurationController; Loading @@ -75,6 +77,8 @@ public class LockIconViewControllerBaseTest extends SysuiTestCase { protected MockitoSession mStaticMockSession; protected final SceneTestUtils mSceneTestUtils = new SceneTestUtils(this); protected @Mock BouncerInteractor mBouncerInteractor; protected @Mock LockIconView mLockIconView; protected @Mock AnimatedStateListDrawable mIconDrawable; protected @Mock Context mContext; Loading @@ -93,6 +97,7 @@ public class LockIconViewControllerBaseTest extends SysuiTestCase { protected @Mock AuthRippleController mAuthRippleController; protected FakeExecutor mDelayableExecutor = new FakeExecutor(new FakeSystemClock()); protected FakeFeatureFlags mFeatureFlags; protected @Mock PrimaryBouncerInteractor mPrimaryBouncerInteractor; protected LockIconViewController mUnderTest; Loading Loading @@ -148,6 +153,7 @@ public class LockIconViewControllerBaseTest extends SysuiTestCase { mFeatureFlags.set(MIGRATE_LOCK_ICON, false); mFeatureFlags.set(LOCKSCREEN_WALLPAPER_DREAM_ENABLED, false); mFeatureFlags.set(LOCKSCREEN_ENABLE_LANDSCAPE, false); mUnderTest = new LockIconViewController( mStatusBarStateController, mKeyguardUpdateMonitor, Loading @@ -168,7 +174,9 @@ public class LockIconViewControllerBaseTest extends SysuiTestCase { KeyguardInteractorFactory.create(mFeatureFlags).getKeyguardInteractor(), mFeatureFlags, mPrimaryBouncerInteractor, mContext mContext, () -> mBouncerInteractor, mSceneTestUtils.getSceneContainerFlags() ); } Loading Loading @@ -227,8 +235,8 @@ public class LockIconViewControllerBaseTest extends SysuiTestCase { setupLockIconViewMocks(); } protected void init(boolean useMigrationFlag) { mFeatureFlags.set(DOZING_MIGRATION_1, useMigrationFlag); protected void init(boolean useDozeMigrationFlag) { mFeatureFlags.set(DOZING_MIGRATION_1, useDozeMigrationFlag); mUnderTest.setLockIconView(mLockIconView); } }
packages/SystemUI/tests/src/com/android/keyguard/LockIconViewControllerTest.java +44 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.anyBoolean; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; Loading Loading @@ -404,6 +405,49 @@ public class LockIconViewControllerTest extends LockIconViewControllerBaseTest { // THEN uses perform haptic feedback verify(mVibrator).performHapticFeedback(any(), eq(UdfpsController.LONG_PRESS)); } @Test public void longPress_showBouncer_sceneContainerNotEnabled() { init(/* useMigrationFlag= */ false); mSceneTestUtils.getSceneContainerFlags().setEnabled(false); mFeatureFlags.set(ONE_WAY_HAPTICS_API_MIGRATION, true); when(mFalsingManager.isFalseLongTap(anyInt())).thenReturn(false); // WHEN longPress mUnderTest.onLongPress(); // THEN show primary bouncer via keyguard view controller, not scene container verify(mKeyguardViewController).showPrimaryBouncer(anyBoolean()); verify(mBouncerInteractor, never()).showOrUnlockDevice(any()); } @Test public void longPress_showBouncer() { init(/* useMigrationFlag= */ false); mSceneTestUtils.getSceneContainerFlags().setEnabled(true); mFeatureFlags.set(ONE_WAY_HAPTICS_API_MIGRATION, true); when(mFalsingManager.isFalseLongTap(anyInt())).thenReturn(false); // WHEN longPress mUnderTest.onLongPress(); // THEN show primary bouncer verify(mKeyguardViewController, never()).showPrimaryBouncer(anyBoolean()); verify(mBouncerInteractor).showOrUnlockDevice(any()); } @Test public void longPress_falsingTriggered_doesNotShowBouncer() { init(/* useMigrationFlag= */ false); mSceneTestUtils.getSceneContainerFlags().setEnabled(true); mFeatureFlags.set(ONE_WAY_HAPTICS_API_MIGRATION, true); when(mFalsingManager.isFalseLongTap(anyInt())).thenReturn(true); // WHEN longPress mUnderTest.onLongPress(); // THEN don't show primary bouncer verify(mBouncerInteractor, never()).showOrUnlockDevice(any()); } }