From 6d532fe59db6de1571ac480047f85af444dcf31e Mon Sep 17 00:00:00 2001 From: Schneider Victor-Tulias Date: Tue, 13 May 2025 16:26:26 -0400 Subject: [PATCH] Fix broken state when tapping nav handle from running app. When tapping the nav handle from running app, OtherActivityInputConsumer will start the recents window through TaskAnimationManager. The recents window would then typically be closed through the StateManager, however since the state isn't changing, then RecentsWindowManger never actually gets any signal to close the recents window. Added a new callback to fix this flow. Flag: com.android.launcher3.enable_launcher_overview_in_window Flag: com.android.launcher3.enable_fallback_overview_in_window Bug: 377678992 Test: pre/post submit tests. tapped nev handle from a runnign app Change-Id: If1fe7de195a9a8a98c72629c7904d469a5768d7f --- .../quickstep/fallback/window/RecentsWindowManager.kt | 8 ++++++++ .../launcher3/util/StateManagerProtoLogProxy.java | 6 ++++++ .../quickstep/util/RecentsWindowProtoLogProxy.java | 5 +++++ .../android/launcher3/statemanager/StateManager.java | 11 +++++++++++ .../launcher3/statemanager/StatefulContainer.java | 8 ++++++++ .../launcher3/util/StateManagerProtoLogProxy.java | 2 ++ 6 files changed, 40 insertions(+) diff --git a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt index f3234eeccc..023cc7ef92 100644 --- a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt +++ b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt @@ -425,6 +425,14 @@ constructor( AccessibilityManagerCompat.sendStateEventToTest(baseContext, state.toLauncherStateOrdinal()) } + override fun onRepeatStateSetAborted(state: RecentsState) { + super.onRepeatStateSetAborted(state) + RecentsWindowProtoLogProxy.logOnRepeatStateSetAborted(state.toString()) + if (!state.isRecentsViewVisible) { + cleanupRecentsWindow() + } + } + override fun getSystemUiController(): SystemUiController? { if (systemUiController == null) { systemUiController = SystemUiController(rootView) diff --git a/quickstep/src_protolog/com/android/launcher3/util/StateManagerProtoLogProxy.java b/quickstep/src_protolog/com/android/launcher3/util/StateManagerProtoLogProxy.java index cb7254f1fe..8221629aeb 100644 --- a/quickstep/src_protolog/com/android/launcher3/util/StateManagerProtoLogProxy.java +++ b/quickstep/src_protolog/com/android/launcher3/util/StateManagerProtoLogProxy.java @@ -62,6 +62,12 @@ public class StateManagerProtoLogProxy { ProtoLog.d(LAUNCHER_STATE_MANAGER, "StateManager.onStateTransitionEnd: state: %s", state); } + public static void logOnRepeatStateSetAborted(@NonNull Object state) { + if (!ENABLE_STATE_MANAGER_PROTO_LOG.isTrue() || !isProtoLogInitialized()) return; + ProtoLog.d(LAUNCHER_STATE_MANAGER, + "StateManager.onRepeatStateSetAborted: state: %s", state); + } + public static void logCancelAnimation(boolean animationOngoing, @NonNull String trace) { if (!ENABLE_STATE_MANAGER_PROTO_LOG.isTrue() || !isProtoLogInitialized()) return; ProtoLog.d(LAUNCHER_STATE_MANAGER, diff --git a/quickstep/src_protolog/com/android/quickstep/util/RecentsWindowProtoLogProxy.java b/quickstep/src_protolog/com/android/quickstep/util/RecentsWindowProtoLogProxy.java index 0be88f6b7f..41e9cefbc1 100644 --- a/quickstep/src_protolog/com/android/quickstep/util/RecentsWindowProtoLogProxy.java +++ b/quickstep/src_protolog/com/android/quickstep/util/RecentsWindowProtoLogProxy.java @@ -54,6 +54,11 @@ public class RecentsWindowProtoLogProxy { ProtoLog.d(RECENTS_WINDOW, "onStateSetEnd: %s", stateName); } + public static void logOnRepeatStateSetAborted(@NonNull String stateName) { + if (!ENABLE_RECENTS_WINDOW_PROTO_LOG.isTrue() || !isProtoLogInitialized()) return; + ProtoLog.d(RECENTS_WINDOW, "onRepeatStateSetAborted: %s", stateName); + } + public static void logStartRecentsWindow(boolean isShown, boolean windowViewIsNull) { if (!ENABLE_RECENTS_WINDOW_PROTO_LOG.isTrue() || !isProtoLogInitialized()) return; ProtoLog.d(RECENTS_WINDOW, diff --git a/src/com/android/launcher3/statemanager/StateManager.java b/src/com/android/launcher3/statemanager/StateManager.java index bbb46a35fa..1388b84d7a 100644 --- a/src/com/android/launcher3/statemanager/StateManager.java +++ b/src/com/android/launcher3/statemanager/StateManager.java @@ -265,6 +265,7 @@ public class StateManager, T extends StatefulContainer if (listener != null) { listener.onAnimationEnd(new AnimatorSet()); } + onRepeatStateSetAborted(state); return; } else if ((!mConfig.isUserControlled() && animated && mConfig.targetState == state) || mState.shouldPreserveDataStateOnReapply()) { @@ -273,6 +274,7 @@ public class StateManager, T extends StatefulContainer if (listener != null) { mConfig.currentAnimation.addListener(listener); } + onRepeatStateSetAborted(state); return; } } @@ -453,6 +455,15 @@ public class StateManager, T extends StatefulContainer } } + private void onRepeatStateSetAborted(S state) { + if (enableStateManagerProtoLog()) { + StateManagerProtoLogProxy.logOnRepeatStateSetAborted(state); + } else if (DEBUG) { + Log.d(TAG, "onRepeatStateSetAborted - state: " + state); + } + mContainer.onRepeatStateSetAborted(state); + } + public S getLastState() { return mLastStableState; } diff --git a/src/com/android/launcher3/statemanager/StatefulContainer.java b/src/com/android/launcher3/statemanager/StatefulContainer.java index 83a2fdcac5..951391438d 100644 --- a/src/com/android/launcher3/statemanager/StatefulContainer.java +++ b/src/com/android/launcher3/statemanager/StatefulContainer.java @@ -62,6 +62,14 @@ public interface StatefulContainer> ext default void onStateSetEnd(STATE_TYPE state) { } + /** + * Called when transition to state is aborted because the state is already set + * + * @param state current state of State_Type + */ + default void onRepeatStateSetAborted(STATE_TYPE state) { + } + /** * Called when transition to state starts * diff --git a/src_no_quickstep/com/android/launcher3/util/StateManagerProtoLogProxy.java b/src_no_quickstep/com/android/launcher3/util/StateManagerProtoLogProxy.java index 34e15f70ce..6906f63533 100644 --- a/src_no_quickstep/com/android/launcher3/util/StateManagerProtoLogProxy.java +++ b/src_no_quickstep/com/android/launcher3/util/StateManagerProtoLogProxy.java @@ -29,5 +29,7 @@ public class StateManagerProtoLogProxy { public static void logOnStateTransitionEnd(Object state) { } + public static void logOnRepeatStateSetAborted(Object state) { } + public static void logCancelAnimation(boolean animationOngoing, String trace) { } }