1/ Add onStartTransition() callback for SYSUI_STATE_ONE_HANDED_ACTIVE

Previously in launcher quick steps, when one handed mode trigger
the gesture is easy to conflict "swipe up Recents" and
"swipe horizontal for quick switch", we only consume gesture when
SYSUI_STATE_ONE_HANDED_ACTIVE=true, however, user have a bad
experience when one handed transitioning conflict to "swipe up
to launch recents".

Legacy design :
  onStartFinished() : SYSUI_STATE_ONE_HANDED_ACTIVE -> true
  onStopFinished()  : SYSUI_STATE_ONE_HANDED_ACTIVE -> false

New design :
  onTransition()    : SYSUI_STATE_ONE_HANDED_ACTIVE -> true
  onStartFinished() : SYSUI_STATE_ONE_HANDED_ACTIVE -> true
  onStopFinished()  : SYSUI_STATE_ONE_HANDED_ACTIVE -> false

Test: atest WMShellUnitTests
Bug: 177978035
Change-Id: Iac9612b2eb07606712a4ab3eb036ac6fd3d12ae3
This commit is contained in:
Bill Lin
2021-04-19 20:09:27 +08:00
parent 1027fb5c21
commit 3e20856215
3 changed files with 26 additions and 3 deletions

View File

@@ -82,6 +82,14 @@ public class OneHandedDisplayAreaOrganizer extends DisplayAreaOrganizer {
@Override
public void onOneHandedAnimationStart(
OneHandedAnimationController.OneHandedTransitionAnimator animator) {
final boolean isEntering = animator.getTransitionDirection()
== TRANSITION_DIRECTION_TRIGGER;
if (!mTransitionCallbacks.isEmpty()) {
for (int i = mTransitionCallbacks.size() - 1; i >= 0; i--) {
final OneHandedTransitionCallback cb = mTransitionCallbacks.get(i);
cb.onStartTransition(isEntering);
}
}
}
@Override
@@ -266,11 +274,12 @@ public class OneHandedDisplayAreaOrganizer extends DisplayAreaOrganizer {
mLastVisualDisplayBounds.offsetTo(0,
direction == TRANSITION_DIRECTION_TRIGGER ? offset : 0);
for (int i = mTransitionCallbacks.size() - 1; i >= 0; i--) {
final OneHandedTransitionCallback callback = mTransitionCallbacks.get(i);
final OneHandedTransitionCallback cb = mTransitionCallbacks.get(i);
cb.onStartTransition(false /* isTransitioning */);
if (direction == TRANSITION_DIRECTION_TRIGGER) {
callback.onStartFinished(getLastVisualDisplayBounds());
cb.onStartFinished(getLastVisualDisplayBounds());
} else {
callback.onStopFinished(getLastVisualDisplayBounds());
cb.onStopFinished(getLastVisualDisplayBounds());
}
}
}

View File

@@ -23,6 +23,12 @@ import android.graphics.Rect;
* touch region.(e.g: one handed activated, user tap out regions of displayArea to stop one handed)
*/
public interface OneHandedTransitionCallback {
/**
* Called when one handed mode entering or exiting transition starting
*/
default void onStartTransition(boolean isEntering) {
}
/**
* Called when start one handed transition finished
*/

View File

@@ -235,6 +235,14 @@ public final class WMShell extends SystemUI
oneHanded.setThreeButtonModeEnabled(currentMode == NAV_BAR_MODE_3BUTTON);
oneHanded.registerTransitionCallback(new OneHandedTransitionCallback() {
@Override
public void onStartTransition(boolean isEntering) {
mSysUiMainExecutor.execute(() -> {
mSysUiState.setFlag(SYSUI_STATE_ONE_HANDED_ACTIVE,
true).commitUpdate(DEFAULT_DISPLAY);
});
}
@Override
public void onStartFinished(Rect bounds) {
mSysUiMainExecutor.execute(() -> {