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

Commit d418e086 authored by Bill Lin's avatar Bill Lin
Browse files

Allow temporary locked OHM function disabled when keyguard visible

- User is easier to mis-trigger OHM when keyguard showing
  it's make sense to disabled OHM when keyguard showing
- Resolve OneHandedControllerTest flaky

Test: atest WMShellUnitTests
Test: manual enable OHM, when keyguard showing OHM can not trigger
Bug: 179044949
Bug: 180682204
Change-Id: I59399e35c7f7bc895df006f54b43e572a9463fd1
parent 8a071ee6
Loading
Loading
Loading
Loading
+12 −3
Original line number Diff line number Diff line
@@ -52,18 +52,27 @@ public interface OneHanded {
    void stopOneHanded(int uiEvent);

    /**
     * Set navigation 3 button mode enabled or disabled by users.
     * Sets navigation 3 button mode enabled or disabled by users.
     */
    void setThreeButtonModeEnabled(boolean enabled);

    /**
     * Register callback to be notified after {@link OneHandedDisplayAreaOrganizer}
     * Sets one handed feature temporary locked in enabled or disabled state, this won't change
     * settings configuration.
     *
     * @param locked locked function in disabled(can not trigger) or enabled state.
     * @param enabled function in disabled(can not trigger) or enabled state.
     */
    void setLockedDisabled(boolean locked, boolean enabled);

    /**
     * Registers callback to be notified after {@link OneHandedDisplayAreaOrganizer}
     * transition start or finish
     */
    void registerTransitionCallback(OneHandedTransitionCallback callback);

    /**
     * Register callback for one handed gesture, this gesture callbcak will be activated on
     * Registers callback for one handed gesture, this gesture callback will be activated on
     * 3 button navigation mode only
     */
    void registerGestureCallback(OneHandedGestureEventCallback callback);
+27 −0
Original line number Diff line number Diff line
@@ -67,6 +67,7 @@ public class OneHandedController {
    private volatile boolean mIsOneHandedEnabled;
    private volatile boolean mIsSwipeToNotificationEnabled;
    private boolean mTaskChangeToExit;
    private boolean mLockedDisabled;
    private float mOffSetFraction;

    private final Context mContext;
@@ -263,6 +264,10 @@ public class OneHandedController {

    @VisibleForTesting
    void startOneHanded() {
        if (isLockedDisabled()) {
            Slog.d(TAG, "Temporary lock disabled");
            return;
        }
        if (!mDisplayAreaOrganizer.isInOneHanded()) {
            final int yOffSet = Math.round(getDisplaySize().y * mOffSetFraction);
            mDisplayAreaOrganizer.scheduleOffset(0, yOffSet);
@@ -433,6 +438,11 @@ public class OneHandedController {
        return displaySize;
    }

    @VisibleForTesting
    boolean isLockedDisabled() {
        return mLockedDisabled;
    }

    private void updateOneHandedEnabled() {
        if (mDisplayAreaOrganizer.isInOneHanded()) {
            stopOneHanded();
@@ -485,6 +495,14 @@ public class OneHandedController {
        }
    }

    @VisibleForTesting
    void setLockedDisabled(boolean locked, boolean enabled) {
        if (enabled == mIsOneHandedEnabled) {
            return;
        }
        mLockedDisabled = locked && !enabled;
    }

    private void onConfigChanged(Configuration newConfig) {
        if (mTutorialHandler != null) {
            if (!mIsOneHandedEnabled
@@ -500,6 +518,8 @@ public class OneHandedController {
        pw.println(TAG + "states: ");
        pw.print(innerPrefix + "mOffSetFraction=");
        pw.println(mOffSetFraction);
        pw.print(innerPrefix + "mLockedDisabled=");
        pw.println(mLockedDisabled);

        if (mDisplayAreaOrganizer != null) {
            mDisplayAreaOrganizer.dump(pw);
@@ -575,6 +595,13 @@ public class OneHandedController {
            });
        }

        @Override
        public void setLockedDisabled(boolean locked, boolean enabled) {
            mMainExecutor.execute(() -> {
                OneHandedController.this.setLockedDisabled(locked, enabled);
            });
        }

        @Override
        public void registerTransitionCallback(OneHandedTransitionCallback callback) {
            mMainExecutor.execute(() -> {
+70 −13
Original line number Diff line number Diff line
@@ -84,6 +84,8 @@ public class OneHandedControllerTest extends OneHandedTestCase {
    final boolean mDefaultSwipeToNotificationEnabled =
            OneHandedSettingsUtil.getSettingsSwipeToNotificationEnabled(
                    getTestContext().getContentResolver());
    final boolean mDefaultTapAppToExitEnabled = OneHandedSettingsUtil.getSettingsTapsAppToExit(
            getTestContext().getContentResolver());

    @Before
    public void setUp() {
@@ -176,7 +178,7 @@ public class OneHandedControllerTest extends OneHandedTestCase {
    }

    @Test
    public void testStopOneHanded_shouldRemoveTimer() {
    public void testStopOneHandedShouldRemoveTimer() {
        when(mMockDisplayAreaOrganizer.isInOneHanded()).thenReturn(true);
        mSpiedOneHandedController.stopOneHanded();

@@ -193,27 +195,29 @@ public class OneHandedControllerTest extends OneHandedTestCase {
    }

    @Test
    public void testUpdateSwipeToNotificationEnabled() {
        final boolean swipeToNotificationEnabled = true;
        mSpiedOneHandedController.setSwipeToNotificationEnabled(swipeToNotificationEnabled);
    public void testUpdateSwipeToNotification() {
        mSpiedOneHandedController.setSwipeToNotificationEnabled(mDefaultSwipeToNotificationEnabled);

        verify(mMockTouchHandler, atLeastOnce()).onOneHandedEnabled(mDefaultEnabled);
        verify(mMockGestureHandler, atLeastOnce()).onOneHandedEnabled(
                mDefaultEnabled || swipeToNotificationEnabled);
                mDefaultEnabled || mDefaultSwipeToNotificationEnabled);
    }

    @Test
    public void testUpdateTapAppToExitUpdate() {
    public void testSettingsObserverUpdateTapAppToExit() {
        mSpiedOneHandedController.onTaskChangeExitSettingChanged();

        if (mDefaultTapAppToExitEnabled) {
            verify(mMockTaskStackListener, atLeastOnce()).addListener(any());
        } else {
            verify(mMockTaskStackListener, atLeastOnce()).removeListener(any());
        }
    }

    @Test
    public void tesSettingsObserverUpdateEnabled() {
    public void testSettingsObserverUpdateEnabled() {
        mSpiedOneHandedController.onEnabledSettingChanged();

        verify(mSpiedOneHandedController, atLeastOnce()).setOneHandedEnabled(mDefaultEnabled);
        verify(mSpiedOneHandedController).setOneHandedEnabled(mDefaultEnabled);
    }

    @Test
@@ -224,10 +228,63 @@ public class OneHandedControllerTest extends OneHandedTestCase {
    }

    @Test
    public void tesSettingsObserverUpdateSwipeToNotification() {
    public void testSettingsObserverUpdateSwipeToNotification() {
        mSpiedOneHandedController.onSwipeToNotificationEnabledSettingChanged();

        verify(mSpiedOneHandedController, atLeastOnce()).setSwipeToNotificationEnabled(
                !mDefaultEnabled);
        // Swipe to notification function is opposite with one handed mode function
        if (mDefaultSwipeToNotificationEnabled) {
            verify(mSpiedOneHandedController).setSwipeToNotificationEnabled(
                    mDefaultSwipeToNotificationEnabled);
        } else {
            verify(mSpiedOneHandedController, never()).setSwipeToNotificationEnabled(
                    mDefaultSwipeToNotificationEnabled);
        }
    }

    @Test
    public void testLockedOneHandedDisabled() {
        // Default mLockDisabled is false
        assertThat(mSpiedOneHandedController.isLockedDisabled()).isFalse();

        mSpiedOneHandedController.setOneHandedEnabled(true);
        mSpiedOneHandedController.setLockedDisabled(false /* locked */, true /* enabled */);

        // If mOneHandedEnabled == enabled, then keep unlocked
        assertThat(mSpiedOneHandedController.isLockedDisabled()).isFalse();

        // If prefer locked enabled state and 'mOneHandedEnabled == enabled', then unlocked
        mSpiedOneHandedController.setLockedDisabled(true /* locked */, true /* enabled */);

        assertThat(mSpiedOneHandedController.isLockedDisabled()).isFalse();

        // If prefer locked disabled state and 'mOneHandedEnabled != enabled', then locked disabled
        mSpiedOneHandedController.setLockedDisabled(true /* locked */, false /* enabled */);

        assertThat(mSpiedOneHandedController.isLockedDisabled()).isTrue();

        // If prefer unlock disabled state and 'mOneHandedEnabled != enabled', then unlocked
        mSpiedOneHandedController.setLockedDisabled(false /* locked */, false /* enabled */);

        assertThat(mSpiedOneHandedController.isLockedDisabled()).isFalse();
    }

    @Test
    public void testKeyguardShowingLockOneHandedDisabled() {
        when(mMockDisplayAreaOrganizer.isInOneHanded()).thenReturn(false);
        mSpiedOneHandedController.setOneHandedEnabled(true);
        mSpiedOneHandedController.setLockedDisabled(true /* locked */, false /* enabled */);
        mSpiedOneHandedController.startOneHanded();

        verify(mMockDisplayAreaOrganizer, never()).scheduleOffset(anyInt(), anyInt());
    }

    @Test
    public void testResetKeyguardShowingLockOneHandedDisabled() {
        when(mMockDisplayAreaOrganizer.isInOneHanded()).thenReturn(false);
        mSpiedOneHandedController.setOneHandedEnabled(true);
        mSpiedOneHandedController.setLockedDisabled(false /* locked */, false /* enabled */);
        mSpiedOneHandedController.startOneHanded();

        verify(mMockDisplayAreaOrganizer).scheduleOffset(anyInt(), anyInt());
    }
}
+7 −0
Original line number Diff line number Diff line
@@ -287,6 +287,13 @@ public final class WMShell extends SystemUI

            @Override
            public void onKeyguardVisibilityChanged(boolean showing) {
                if (showing) {
                    // When keyguard shown, temperory lock OHM disabled to avoid mis-trigger.
                    oneHanded.setLockedDisabled(true /* locked */, false /* enabled */);
                } else {
                    // Reset locked.
                    oneHanded.setLockedDisabled(false /* locked */, false /* enabled */);
                }
                oneHanded.stopOneHanded();
            }
        };