Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a8bcfd9f authored by Beverly Tai's avatar Beverly Tai Committed by Android (Google) Code Review
Browse files

Merge "Flexiglass: On lock icon longpress, show bouncer" into main

parents cd319594 636272c1
Loading
Loading
Loading
Loading
+18 −3
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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 =
@@ -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.");
@@ -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() {
+11 −3
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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,
@@ -168,7 +174,9 @@ public class LockIconViewControllerBaseTest extends SysuiTestCase {
                KeyguardInteractorFactory.create(mFeatureFlags).getKeyguardInteractor(),
                mFeatureFlags,
                mPrimaryBouncerInteractor,
                mContext
                mContext,
                () -> mBouncerInteractor,
                mSceneTestUtils.getSceneContainerFlags()
        );
    }

@@ -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);
    }
}
+44 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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());
    }
}