Fix screen will flicker when swipe-down around NavigationBar to

trigger One-Handed mode many times quickly in a short time

To prevent entering or exiting OHM quilcky in a shot time.

Bug: 185304468
Test: manual
Test: atest WMShellUnitTests
Change-Id: Ibc5ade564da241d5871b3b037c97bd68a6b03a5d
This commit is contained in:
Jason Chang
2021-04-16 17:07:33 +08:00
parent fbe969c925
commit 3a77d720e9

View File

@@ -29,6 +29,7 @@ import android.content.om.IOverlayManager;
import android.content.om.OverlayInfo;
import android.content.res.Configuration;
import android.database.ContentObserver;
import android.graphics.Rect;
import android.os.Handler;
import android.os.RemoteException;
import android.os.ServiceManager;
@@ -61,7 +62,8 @@ import java.io.PrintWriter;
/**
* Manages and manipulates the one handed states, transitions, and gesture for phones.
*/
public class OneHandedController implements RemoteCallable<OneHandedController> {
public class OneHandedController implements RemoteCallable<OneHandedController>,
OneHandedTransitionCallback {
private static final String TAG = "OneHandedController";
private static final String ONE_HANDED_MODE_OFFSET_PERCENTAGE =
@@ -73,6 +75,7 @@ public class OneHandedController implements RemoteCallable<OneHandedController>
private volatile boolean mIsOneHandedEnabled;
private volatile boolean mIsSwipeToNotificationEnabled;
private volatile boolean mIsTransitioning;
private boolean mTaskChangeToExit;
private boolean mLockedDisabled;
private int mUserId;
@@ -327,7 +330,7 @@ public class OneHandedController implements RemoteCallable<OneHandedController>
@VisibleForTesting
void startOneHanded() {
if (isLockedDisabled()) {
if (isLockedDisabled() || mIsTransitioning) {
Slog.d(TAG, "Temporary lock disabled");
return;
}
@@ -337,6 +340,7 @@ public class OneHandedController implements RemoteCallable<OneHandedController>
return;
}
if (!mDisplayAreaOrganizer.isInOneHanded()) {
mIsTransitioning = true;
final int yOffSet = Math.round(
mDisplayAreaOrganizer.getDisplayLayout().height() * mOffSetFraction);
mOneHandedAccessibilityUtil.announcementForScreenReader(
@@ -354,7 +358,8 @@ public class OneHandedController implements RemoteCallable<OneHandedController>
}
private void stopOneHanded(int uiEvent) {
if (mDisplayAreaOrganizer.isInOneHanded()) {
if (mDisplayAreaOrganizer.isInOneHanded() && !mIsTransitioning) {
mIsTransitioning = true;
mOneHandedAccessibilityUtil.announcementForScreenReader(
mOneHandedAccessibilityUtil.getOneHandedStopDescription());
mDisplayAreaOrganizer.scheduleOffset(0, 0);
@@ -383,6 +388,7 @@ public class OneHandedController implements RemoteCallable<OneHandedController>
mDisplayAreaOrganizer.registerTransitionCallback(mGestureHandler);
mDisplayAreaOrganizer.registerTransitionCallback(mTutorialHandler);
mDisplayAreaOrganizer.registerTransitionCallback(mBackgroundPanelOrganizer);
mDisplayAreaOrganizer.registerTransitionCallback(this);
if (mTaskChangeToExit) {
mTaskStackListener.addListener(mTaskStackListenerCallback);
}
@@ -609,6 +615,8 @@ public class OneHandedController implements RemoteCallable<OneHandedController>
pw.println(mLockedDisabled);
pw.print(innerPrefix + "mUserId=");
pw.println(mUserId);
pw.print(innerPrefix + "mIsTransitioning=");
pw.println(mIsTransitioning);
if (mBackgroundPanelOrganizer != null) {
mBackgroundPanelOrganizer.dump(pw);
@@ -654,6 +662,26 @@ public class OneHandedController implements RemoteCallable<OneHandedController>
}
}
/**
* TODO(b/185558765) To implement a state machine for One-Handed transition state machine.
* ONE_HANDDE_STATE_TRANSITION {
* STATE_DEFAULT,
* STATE_TRANSITIONING,
* STATE_ENTER_ONE_HANED,
* STATE_EXIT_ONE_HANDED
* }
* and we need to align the state to launcher3 quick steps through SysuiProxy.
*/
@Override
public void onStartFinished(Rect bounds) {
mIsTransitioning = false;
}
@Override
public void onStopFinished(Rect bounds) {
mIsTransitioning = false;
}
/**
* The interface for calls from outside the Shell, within the host process.
*/