diff --git a/aconfig/launcher.aconfig b/aconfig/launcher.aconfig index 457fdd83f9..aafa1f61a8 100644 --- a/aconfig/launcher.aconfig +++ b/aconfig/launcher.aconfig @@ -448,6 +448,12 @@ flag { bug: "292269949" } +flag { + name: "enable_state_manager_proto_log" + namespace: "launcher" + description: "Enables tracking state manager logs in ProtoLog" + bug: "292269949" +} flag { name: "coordinate_workspace_scale" diff --git a/quickstep/src_protolog/com/android/launcher3/util/StateManagerProtoLogProxy.java b/quickstep/src_protolog/com/android/launcher3/util/StateManagerProtoLogProxy.java new file mode 100644 index 0000000000..bc989dc5aa --- /dev/null +++ b/quickstep/src_protolog/com/android/launcher3/util/StateManagerProtoLogProxy.java @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.launcher3.util; + +import static com.android.launcher3.Flags.enableStateManagerProtoLog; +import static com.android.quickstep.util.QuickstepProtoLogGroup.LAUNCHER_STATE_MANAGER; + +import androidx.annotation.NonNull; + +import com.android.internal.protolog.ProtoLog; + +/** + * Proxy class used for StateManager ProtoLog support. + */ +public class StateManagerProtoLogProxy { + + public static void logGoToState( + @NonNull Object fromState, @NonNull Object toState, @NonNull String trace) { + if (!enableStateManagerProtoLog()) return; + ProtoLog.d(LAUNCHER_STATE_MANAGER, + "StateManager.goToState: fromState: %s, toState: %s, partial trace:\n%s", + fromState, + toState, + trace); + } + + public static void logCreateAtomicAnimation( + @NonNull Object fromState, @NonNull Object toState, @NonNull String trace) { + if (!enableStateManagerProtoLog()) return; + ProtoLog.d(LAUNCHER_STATE_MANAGER, "StateManager.createAtomicAnimation: " + + "fromState: %s, toState: %s, partial trace:\n%s", + fromState, + toState, + trace); + } + + public static void logOnStateTransitionStart(@NonNull Object state) { + if (!enableStateManagerProtoLog()) return; + ProtoLog.d(LAUNCHER_STATE_MANAGER, "StateManager.onStateTransitionStart: state: %s", state); + } + + public static void logOnStateTransitionEnd(@NonNull Object state) { + if (!enableStateManagerProtoLog()) return; + ProtoLog.d(LAUNCHER_STATE_MANAGER, "StateManager.onStateTransitionEnd: state: %s", state); + } + + public static void logCancelAnimation(boolean animationOngoing, @NonNull String trace) { + if (!enableStateManagerProtoLog()) return; + ProtoLog.d(LAUNCHER_STATE_MANAGER, + "StateManager.cancelAnimation: animation ongoing: %b, partial trace:\n%s", + animationOngoing, + trace); + } +} diff --git a/quickstep/src_protolog/com/android/quickstep/util/QuickstepProtoLogGroup.java b/quickstep/src_protolog/com/android/quickstep/util/QuickstepProtoLogGroup.java index 7b81b9a2e0..bb02a112d2 100644 --- a/quickstep/src_protolog/com/android/quickstep/util/QuickstepProtoLogGroup.java +++ b/quickstep/src_protolog/com/android/quickstep/util/QuickstepProtoLogGroup.java @@ -27,7 +27,8 @@ import java.util.UUID; public enum QuickstepProtoLogGroup implements IProtoLogGroup { ACTIVE_GESTURE_LOG(true, true, false, "ActiveGestureLog"), - RECENTS_WINDOW(true, true, Constants.DEBUG_RECENTS_WINDOW, "RecentsWindow"); + RECENTS_WINDOW(true, true, Constants.DEBUG_RECENTS_WINDOW, "RecentsWindow"), + LAUNCHER_STATE_MANAGER(true, true, Constants.DEBUG_STATE_MANAGER, "LauncherStateManager"); private final boolean mEnabled; private volatile boolean mLogToProto; @@ -97,6 +98,7 @@ public enum QuickstepProtoLogGroup implements IProtoLogGroup { private static final class Constants { private static final boolean DEBUG_RECENTS_WINDOW = false; + private static final boolean DEBUG_STATE_MANAGER = true; // b/279059025, b/325463989 private static final int LOG_START_ID = (int) (UUID.nameUUIDFromBytes(QuickstepProtoLogGroup.class.getName().getBytes()) diff --git a/src/com/android/launcher3/statemanager/StateManager.java b/src/com/android/launcher3/statemanager/StateManager.java index 303290dda3..763f3bab38 100644 --- a/src/com/android/launcher3/statemanager/StateManager.java +++ b/src/com/android/launcher3/statemanager/StateManager.java @@ -18,6 +18,7 @@ package com.android.launcher3.statemanager; import static android.animation.ValueAnimator.areAnimatorsEnabled; +import static com.android.launcher3.Flags.enableStateManagerProtoLog; import static com.android.launcher3.anim.AnimatorPlaybackController.callListenerCommandRecursively; import static com.android.launcher3.states.StateAnimationConfig.HANDLE_STATE_APPLY; import static com.android.launcher3.states.StateAnimationConfig.SKIP_ALL_ANIMATIONS; @@ -39,6 +40,7 @@ import com.android.launcher3.anim.PendingAnimation; import com.android.launcher3.states.StateAnimationConfig; import com.android.launcher3.states.StateAnimationConfig.AnimationFlags; import com.android.launcher3.states.StateAnimationConfig.AnimationPropertyFlags; +import com.android.launcher3.util.StateManagerProtoLogProxy; import java.io.PrintWriter; import java.util.ArrayList; @@ -243,7 +245,10 @@ public class StateManager, private void goToState( STATE_TYPE state, boolean animated, long delay, AnimatorListener listener) { - if (DEBUG) { + if (enableStateManagerProtoLog()) { + StateManagerProtoLogProxy.logGoToState( + mState, state, getTrimmedStackTrace("StateManager.goToState")); + } else if (DEBUG) { Log.d(TAG, "goToState - fromState: " + mState + ", toState: " + state + ", partial trace:\n" + getTrimmedStackTrace("StateManager.goToState")); } @@ -331,7 +336,10 @@ public class StateManager, */ public AnimatorSet createAtomicAnimation( STATE_TYPE fromState, STATE_TYPE toState, StateAnimationConfig config) { - if (DEBUG) { + if (enableStateManagerProtoLog()) { + StateManagerProtoLogProxy.logCreateAtomicAnimation( + mState, toState, getTrimmedStackTrace("StateManager.createAtomicAnimation")); + } else if (DEBUG) { Log.d(TAG, "createAtomicAnimation - fromState: " + fromState + ", toState: " + toState + ", partial trace:\n" + getTrimmedStackTrace( "StateManager.createAtomicAnimation")); @@ -408,7 +416,9 @@ public class StateManager, mState = state; mStatefulContainer.onStateSetStart(mState); - if (DEBUG) { + if (enableStateManagerProtoLog()) { + StateManagerProtoLogProxy.logOnStateTransitionStart(state); + } else if (DEBUG) { Log.d(TAG, "onStateTransitionStart - state: " + state); } for (int i = mListeners.size() - 1; i >= 0; i--) { @@ -428,7 +438,9 @@ public class StateManager, setRestState(null); } - if (DEBUG) { + if (enableStateManagerProtoLog()) { + StateManagerProtoLogProxy.logOnStateTransitionEnd(state); + } else if (DEBUG) { Log.d(TAG, "onStateTransitionEnd - state: " + state); } for (int i = mListeners.size() - 1; i >= 0; i--) { @@ -468,7 +480,11 @@ public class StateManager, * Cancels the current animation. */ public void cancelAnimation() { - if (DEBUG && mConfig.currentAnimation != null) { + if (enableStateManagerProtoLog()) { + StateManagerProtoLogProxy.logCancelAnimation( + mConfig.currentAnimation != null, + getTrimmedStackTrace("StateManager.cancelAnimation")); + } else if (DEBUG && mConfig.currentAnimation != null) { Log.d(TAG, "cancelAnimation - with ongoing animation" + ", partial trace:\n" + getTrimmedStackTrace("StateManager.cancelAnimation")); } diff --git a/src_no_quickstep/com/android/launcher3/util/StateManagerProtoLogProxy.java b/src_no_quickstep/com/android/launcher3/util/StateManagerProtoLogProxy.java new file mode 100644 index 0000000000..34e15f70ce --- /dev/null +++ b/src_no_quickstep/com/android/launcher3/util/StateManagerProtoLogProxy.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.launcher3.util; + +/** + * Proxy class used for StateManager ProtoLog support. + */ +public class StateManagerProtoLogProxy { + + public static void logGoToState(Object fromState, Object toState, String trace) { } + + public static void logCreateAtomicAnimation(Object fromState, Object toState, String trace) { } + + public static void logOnStateTransitionStart(Object state) { } + + public static void logOnStateTransitionEnd(Object state) { } + + public static void logCancelAnimation(boolean animationOngoing, String trace) { } +}