From ae888f4fd2a210e985dd4f09cc6d3f07382056d2 Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Fri, 8 Jul 2022 08:48:35 -0700 Subject: [PATCH] Fix constant crash when setting MultiStateCallback.DEBUG_STATES=true AbsSwipeUpHandler didn't increase STATE_NAMES size last time we added a state. Changed to ArrayList to dynamically update the size, copied from how GestureState does it, to avoid this issue in the future. Test: Set DEBUG_STATES to true, verified logs when performing gestures Bug: 227514981 Change-Id: I747e66a744f4fd25f0b0289e348d8b3ed2376370 --- .../android/quickstep/AbsSwipeUpHandler.java | 49 ++++++++++--------- .../com/android/quickstep/GestureState.java | 21 ++++---- 2 files changed, 37 insertions(+), 33 deletions(-) diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java index 0972e4e9c0..c7eebb6ed7 100644 --- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java +++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java @@ -140,7 +140,7 @@ public abstract class AbsSwipeUpHandler, RecentsAnimationCallbacks.RecentsAnimationListener { private static final String TAG = "AbsSwipeUpHandler"; - private static final String[] STATE_NAMES = DEBUG_STATES ? new String[17] : null; + private static final ArrayList STATE_NAMES = new ArrayList<>(); protected final BaseActivityInterface mActivityInterface; protected final InputConsumerProxy mInputConsumerProxy; @@ -171,59 +171,62 @@ public abstract class AbsSwipeUpHandler, } }; - private static int getFlagForIndex(int index, String name) { + private static int FLAG_COUNT = 0; + private static int getNextStateFlag(String name) { if (DEBUG_STATES) { - STATE_NAMES[index] = name; + STATE_NAMES.add(name); } - return 1 << index; + int index = 1 << FLAG_COUNT; + FLAG_COUNT++; + return index; } // Launcher UI related states protected static final int STATE_LAUNCHER_PRESENT = - getFlagForIndex(0, "STATE_LAUNCHER_PRESENT"); + getNextStateFlag("STATE_LAUNCHER_PRESENT"); protected static final int STATE_LAUNCHER_STARTED = - getFlagForIndex(1, "STATE_LAUNCHER_STARTED"); + getNextStateFlag("STATE_LAUNCHER_STARTED"); protected static final int STATE_LAUNCHER_DRAWN = - getFlagForIndex(2, "STATE_LAUNCHER_DRAWN"); + getNextStateFlag("STATE_LAUNCHER_DRAWN"); // Called when the Launcher has connected to the touch interaction service (and the taskbar // ui controller is initialized) protected static final int STATE_LAUNCHER_BIND_TO_SERVICE = - getFlagForIndex(3, "STATE_LAUNCHER_BIND_TO_SERVICE"); + getNextStateFlag("STATE_LAUNCHER_BIND_TO_SERVICE"); // Internal initialization states private static final int STATE_APP_CONTROLLER_RECEIVED = - getFlagForIndex(4, "STATE_APP_CONTROLLER_RECEIVED"); + getNextStateFlag("STATE_APP_CONTROLLER_RECEIVED"); // Interaction finish states private static final int STATE_SCALED_CONTROLLER_HOME = - getFlagForIndex(5, "STATE_SCALED_CONTROLLER_HOME"); + getNextStateFlag("STATE_SCALED_CONTROLLER_HOME"); private static final int STATE_SCALED_CONTROLLER_RECENTS = - getFlagForIndex(6, "STATE_SCALED_CONTROLLER_RECENTS"); + getNextStateFlag("STATE_SCALED_CONTROLLER_RECENTS"); protected static final int STATE_HANDLER_INVALIDATED = - getFlagForIndex(7, "STATE_HANDLER_INVALIDATED"); + getNextStateFlag("STATE_HANDLER_INVALIDATED"); private static final int STATE_GESTURE_STARTED = - getFlagForIndex(8, "STATE_GESTURE_STARTED"); + getNextStateFlag("STATE_GESTURE_STARTED"); private static final int STATE_GESTURE_CANCELLED = - getFlagForIndex(9, "STATE_GESTURE_CANCELLED"); + getNextStateFlag("STATE_GESTURE_CANCELLED"); private static final int STATE_GESTURE_COMPLETED = - getFlagForIndex(10, "STATE_GESTURE_COMPLETED"); + getNextStateFlag("STATE_GESTURE_COMPLETED"); private static final int STATE_CAPTURE_SCREENSHOT = - getFlagForIndex(11, "STATE_CAPTURE_SCREENSHOT"); + getNextStateFlag("STATE_CAPTURE_SCREENSHOT"); protected static final int STATE_SCREENSHOT_CAPTURED = - getFlagForIndex(12, "STATE_SCREENSHOT_CAPTURED"); + getNextStateFlag("STATE_SCREENSHOT_CAPTURED"); private static final int STATE_SCREENSHOT_VIEW_SHOWN = - getFlagForIndex(13, "STATE_SCREENSHOT_VIEW_SHOWN"); + getNextStateFlag("STATE_SCREENSHOT_VIEW_SHOWN"); private static final int STATE_RESUME_LAST_TASK = - getFlagForIndex(14, "STATE_RESUME_LAST_TASK"); + getNextStateFlag("STATE_RESUME_LAST_TASK"); private static final int STATE_START_NEW_TASK = - getFlagForIndex(15, "STATE_START_NEW_TASK"); + getNextStateFlag("STATE_START_NEW_TASK"); private static final int STATE_CURRENT_TASK_FINISHED = - getFlagForIndex(16, "STATE_CURRENT_TASK_FINISHED"); + getNextStateFlag("STATE_CURRENT_TASK_FINISHED"); private static final int STATE_FINISH_WITH_NO_END = - getFlagForIndex(17, "STATE_FINISH_WITH_NO_END"); + getNextStateFlag("STATE_FINISH_WITH_NO_END"); private static final int LAUNCHER_UI_STATES = STATE_LAUNCHER_PRESENT | STATE_LAUNCHER_DRAWN | STATE_LAUNCHER_STARTED | @@ -314,7 +317,7 @@ public abstract class AbsSwipeUpHandler, } private void initStateCallbacks() { - mStateCallback = new MultiStateCallback(STATE_NAMES); + mStateCallback = new MultiStateCallback(STATE_NAMES.toArray(new String[0])); mStateCallback.runOnceAtState(STATE_LAUNCHER_PRESENT | STATE_GESTURE_STARTED, this::onLauncherPresentAndGestureStarted); diff --git a/quickstep/src/com/android/quickstep/GestureState.java b/quickstep/src/com/android/quickstep/GestureState.java index 3b52e9178e..acdbbbd130 100644 --- a/quickstep/src/com/android/quickstep/GestureState.java +++ b/quickstep/src/com/android/quickstep/GestureState.java @@ -38,6 +38,7 @@ import java.io.PrintWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Set; /** @@ -82,11 +83,11 @@ public class GestureState implements RecentsAnimationCallbacks.RecentsAnimationL private static final String TAG = "GestureState"; - private static final ArrayList STATE_NAMES = new ArrayList<>(); + private static final List STATE_NAMES = new ArrayList<>(); public static final GestureState DEFAULT_STATE = new GestureState(); private static int FLAG_COUNT = 0; - private static int getFlagForIndex(String name) { + private static int getNextStateFlag(String name) { if (DEBUG_STATES) { STATE_NAMES.add(name); } @@ -97,36 +98,36 @@ public class GestureState implements RecentsAnimationCallbacks.RecentsAnimationL // Called when the end target as been set public static final int STATE_END_TARGET_SET = - getFlagForIndex("STATE_END_TARGET_SET"); + getNextStateFlag("STATE_END_TARGET_SET"); // Called when the end target animation has finished public static final int STATE_END_TARGET_ANIMATION_FINISHED = - getFlagForIndex("STATE_END_TARGET_ANIMATION_FINISHED"); + getNextStateFlag("STATE_END_TARGET_ANIMATION_FINISHED"); // Called when the recents animation has been requested to start public static final int STATE_RECENTS_ANIMATION_INITIALIZED = - getFlagForIndex("STATE_RECENTS_ANIMATION_INITIALIZED"); + getNextStateFlag("STATE_RECENTS_ANIMATION_INITIALIZED"); // Called when the recents animation is started and the TaskAnimationManager has been updated // with the controller and targets public static final int STATE_RECENTS_ANIMATION_STARTED = - getFlagForIndex("STATE_RECENTS_ANIMATION_STARTED"); + getNextStateFlag("STATE_RECENTS_ANIMATION_STARTED"); // Called when the recents animation is canceled public static final int STATE_RECENTS_ANIMATION_CANCELED = - getFlagForIndex("STATE_RECENTS_ANIMATION_CANCELED"); + getNextStateFlag("STATE_RECENTS_ANIMATION_CANCELED"); // Called when the recents animation finishes public static final int STATE_RECENTS_ANIMATION_FINISHED = - getFlagForIndex("STATE_RECENTS_ANIMATION_FINISHED"); + getNextStateFlag("STATE_RECENTS_ANIMATION_FINISHED"); // Always called when the recents animation ends (regardless of cancel or finish) public static final int STATE_RECENTS_ANIMATION_ENDED = - getFlagForIndex("STATE_RECENTS_ANIMATION_ENDED"); + getNextStateFlag("STATE_RECENTS_ANIMATION_ENDED"); // Called when RecentsView stops scrolling and settles on a TaskView. public static final int STATE_RECENTS_SCROLLING_FINISHED = - getFlagForIndex("STATE_RECENTS_SCROLLING_FINISHED"); + getNextStateFlag("STATE_RECENTS_SCROLLING_FINISHED"); // Needed to interact with the current activity private final Intent mHomeIntent;