Merge "Allow temporary locked OHM function disabled when keyguard visible" into sc-dev am: 7444a36439
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/13621336 MUST ONLY BE SUBMITTED BY AUTOMERGER Change-Id: I09c2b1ad4f31f7411f8f8076e563f3d8ec09e929
This commit is contained in:
@@ -52,18 +52,27 @@ public interface OneHanded {
|
|||||||
void stopOneHanded(int uiEvent);
|
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);
|
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
|
* transition start or finish
|
||||||
*/
|
*/
|
||||||
void registerTransitionCallback(OneHandedTransitionCallback callback);
|
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
|
* 3 button navigation mode only
|
||||||
*/
|
*/
|
||||||
void registerGestureCallback(OneHandedGestureEventCallback callback);
|
void registerGestureCallback(OneHandedGestureEventCallback callback);
|
||||||
|
|||||||
@@ -67,6 +67,7 @@ public class OneHandedController {
|
|||||||
private volatile boolean mIsOneHandedEnabled;
|
private volatile boolean mIsOneHandedEnabled;
|
||||||
private volatile boolean mIsSwipeToNotificationEnabled;
|
private volatile boolean mIsSwipeToNotificationEnabled;
|
||||||
private boolean mTaskChangeToExit;
|
private boolean mTaskChangeToExit;
|
||||||
|
private boolean mLockedDisabled;
|
||||||
private float mOffSetFraction;
|
private float mOffSetFraction;
|
||||||
|
|
||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
@@ -263,6 +264,10 @@ public class OneHandedController {
|
|||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
void startOneHanded() {
|
void startOneHanded() {
|
||||||
|
if (isLockedDisabled()) {
|
||||||
|
Slog.d(TAG, "Temporary lock disabled");
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (!mDisplayAreaOrganizer.isInOneHanded()) {
|
if (!mDisplayAreaOrganizer.isInOneHanded()) {
|
||||||
final int yOffSet = Math.round(getDisplaySize().y * mOffSetFraction);
|
final int yOffSet = Math.round(getDisplaySize().y * mOffSetFraction);
|
||||||
mDisplayAreaOrganizer.scheduleOffset(0, yOffSet);
|
mDisplayAreaOrganizer.scheduleOffset(0, yOffSet);
|
||||||
@@ -433,6 +438,11 @@ public class OneHandedController {
|
|||||||
return displaySize;
|
return displaySize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
boolean isLockedDisabled() {
|
||||||
|
return mLockedDisabled;
|
||||||
|
}
|
||||||
|
|
||||||
private void updateOneHandedEnabled() {
|
private void updateOneHandedEnabled() {
|
||||||
if (mDisplayAreaOrganizer.isInOneHanded()) {
|
if (mDisplayAreaOrganizer.isInOneHanded()) {
|
||||||
stopOneHanded();
|
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) {
|
private void onConfigChanged(Configuration newConfig) {
|
||||||
if (mTutorialHandler != null) {
|
if (mTutorialHandler != null) {
|
||||||
if (!mIsOneHandedEnabled
|
if (!mIsOneHandedEnabled
|
||||||
@@ -500,6 +518,8 @@ public class OneHandedController {
|
|||||||
pw.println(TAG + "states: ");
|
pw.println(TAG + "states: ");
|
||||||
pw.print(innerPrefix + "mOffSetFraction=");
|
pw.print(innerPrefix + "mOffSetFraction=");
|
||||||
pw.println(mOffSetFraction);
|
pw.println(mOffSetFraction);
|
||||||
|
pw.print(innerPrefix + "mLockedDisabled=");
|
||||||
|
pw.println(mLockedDisabled);
|
||||||
|
|
||||||
if (mDisplayAreaOrganizer != null) {
|
if (mDisplayAreaOrganizer != null) {
|
||||||
mDisplayAreaOrganizer.dump(pw);
|
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
|
@Override
|
||||||
public void registerTransitionCallback(OneHandedTransitionCallback callback) {
|
public void registerTransitionCallback(OneHandedTransitionCallback callback) {
|
||||||
mMainExecutor.execute(() -> {
|
mMainExecutor.execute(() -> {
|
||||||
|
|||||||
@@ -84,6 +84,8 @@ public class OneHandedControllerTest extends OneHandedTestCase {
|
|||||||
final boolean mDefaultSwipeToNotificationEnabled =
|
final boolean mDefaultSwipeToNotificationEnabled =
|
||||||
OneHandedSettingsUtil.getSettingsSwipeToNotificationEnabled(
|
OneHandedSettingsUtil.getSettingsSwipeToNotificationEnabled(
|
||||||
getTestContext().getContentResolver());
|
getTestContext().getContentResolver());
|
||||||
|
final boolean mDefaultTapAppToExitEnabled = OneHandedSettingsUtil.getSettingsTapsAppToExit(
|
||||||
|
getTestContext().getContentResolver());
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
@@ -176,7 +178,7 @@ public class OneHandedControllerTest extends OneHandedTestCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testStopOneHanded_shouldRemoveTimer() {
|
public void testStopOneHandedShouldRemoveTimer() {
|
||||||
when(mMockDisplayAreaOrganizer.isInOneHanded()).thenReturn(true);
|
when(mMockDisplayAreaOrganizer.isInOneHanded()).thenReturn(true);
|
||||||
mSpiedOneHandedController.stopOneHanded();
|
mSpiedOneHandedController.stopOneHanded();
|
||||||
|
|
||||||
@@ -193,27 +195,29 @@ public class OneHandedControllerTest extends OneHandedTestCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testUpdateSwipeToNotificationEnabled() {
|
public void testUpdateSwipeToNotification() {
|
||||||
final boolean swipeToNotificationEnabled = true;
|
mSpiedOneHandedController.setSwipeToNotificationEnabled(mDefaultSwipeToNotificationEnabled);
|
||||||
mSpiedOneHandedController.setSwipeToNotificationEnabled(swipeToNotificationEnabled);
|
|
||||||
|
|
||||||
verify(mMockTouchHandler, atLeastOnce()).onOneHandedEnabled(mDefaultEnabled);
|
verify(mMockTouchHandler, atLeastOnce()).onOneHandedEnabled(mDefaultEnabled);
|
||||||
verify(mMockGestureHandler, atLeastOnce()).onOneHandedEnabled(
|
verify(mMockGestureHandler, atLeastOnce()).onOneHandedEnabled(
|
||||||
mDefaultEnabled || swipeToNotificationEnabled);
|
mDefaultEnabled || mDefaultSwipeToNotificationEnabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testUpdateTapAppToExitUpdate() {
|
public void testSettingsObserverUpdateTapAppToExit() {
|
||||||
mSpiedOneHandedController.onTaskChangeExitSettingChanged();
|
mSpiedOneHandedController.onTaskChangeExitSettingChanged();
|
||||||
|
if (mDefaultTapAppToExitEnabled) {
|
||||||
verify(mMockTaskStackListener, atLeastOnce()).addListener(any());
|
verify(mMockTaskStackListener, atLeastOnce()).addListener(any());
|
||||||
|
} else {
|
||||||
|
verify(mMockTaskStackListener, atLeastOnce()).removeListener(any());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void tesSettingsObserverUpdateEnabled() {
|
public void testSettingsObserverUpdateEnabled() {
|
||||||
mSpiedOneHandedController.onEnabledSettingChanged();
|
mSpiedOneHandedController.onEnabledSettingChanged();
|
||||||
|
|
||||||
verify(mSpiedOneHandedController, atLeastOnce()).setOneHandedEnabled(mDefaultEnabled);
|
verify(mSpiedOneHandedController).setOneHandedEnabled(mDefaultEnabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -224,10 +228,63 @@ public class OneHandedControllerTest extends OneHandedTestCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void tesSettingsObserverUpdateSwipeToNotification() {
|
public void testSettingsObserverUpdateSwipeToNotification() {
|
||||||
mSpiedOneHandedController.onSwipeToNotificationEnabledSettingChanged();
|
mSpiedOneHandedController.onSwipeToNotificationEnabledSettingChanged();
|
||||||
|
|
||||||
verify(mSpiedOneHandedController, atLeastOnce()).setSwipeToNotificationEnabled(
|
// Swipe to notification function is opposite with one handed mode function
|
||||||
!mDefaultEnabled);
|
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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -287,6 +287,13 @@ public final class WMShell extends SystemUI
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onKeyguardVisibilityChanged(boolean showing) {
|
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();
|
oneHanded.stopOneHanded();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user