From 62335be7c9e22899ecaa28d37ea3b15bc3846f7c Mon Sep 17 00:00:00 2001 From: Schneider Victor-Tulias Date: Wed, 11 Sep 2024 14:56:26 -0700 Subject: [PATCH] Track all ActiveGestureLogs in ProtoLog Flag: com.android.launcher3.enable_active_gesture_proto_log Bug: 293182501 Test: checked protolog traces in winscope Doc: go/launcher-protolog-support Change-Id: I2eb153aa9a94fe49f9c5e9b93b0be5e14fb4eb9c --- aconfig/launcher.aconfig | 7 + .../uioverrides/QuickstepLauncher.java | 17 +- .../android/quickstep/AbsSwipeUpHandler.java | 66 +-- .../com/android/quickstep/GestureState.java | 7 +- .../android/quickstep/MultiStateCallback.java | 8 +- .../quickstep/OverviewCommandHelper.kt | 3 +- .../quickstep/OverviewComponentObserver.java | 9 +- .../quickstep/RecentsAnimationCallbacks.java | 27 +- .../quickstep/RecentsAnimationController.java | 10 +- .../com/android/quickstep/SystemUiProxy.java | 5 +- .../quickstep/TaskAnimationManager.java | 46 +- .../quickstep/TouchInteractionService.java | 96 +--- .../inputconsumers/DelegateInputConsumer.java | 5 +- .../quickstep/util/MotionPauseDetector.java | 2 +- .../util/TaskRemovedDuringLaunchListener.java | 5 +- .../android/quickstep/views/RecentsView.java | 9 +- .../util/ActiveGestureErrorDetector.java | 2 +- .../quickstep/util/ActiveGestureLog.java | 8 +- .../util/ActiveGestureProtoLogProxy.java | 538 ++++++++++++++++++ 19 files changed, 647 insertions(+), 223 deletions(-) rename quickstep/{src => src_protolog}/com/android/quickstep/util/ActiveGestureErrorDetector.java (99%) rename quickstep/{src => src_protolog}/com/android/quickstep/util/ActiveGestureLog.java (98%) create mode 100644 quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java diff --git a/aconfig/launcher.aconfig b/aconfig/launcher.aconfig index 4d6c7ab032..38af57260f 100644 --- a/aconfig/launcher.aconfig +++ b/aconfig/launcher.aconfig @@ -426,3 +426,10 @@ flag { description: "Show recent apps in the taskbar overflow." bug: "368119679" } + +flag { + name: "enable_active_gesture_proto_log" + namespace: "launcher" + description: "Enables tracking active gesture logs in ProtoLog" + bug: "293182501" +} diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java index 5082c11227..9d9f096f92 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java +++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java @@ -60,8 +60,6 @@ import static com.android.launcher3.testing.shared.TestProtocol.QUICK_SWITCH_STA import static com.android.launcher3.util.DisplayController.CHANGE_ACTIVE_SCREEN; import static com.android.launcher3.util.DisplayController.CHANGE_NAVIGATION_MODE; import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR; -import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.QUICK_SWITCH_FROM_HOME_FAILED; -import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.QUICK_SWITCH_FROM_HOME_FALLBACK; import static com.android.quickstep.util.AnimUtils.completeRunnableListCallback; import static com.android.quickstep.util.SplitAnimationTimings.TABLET_HOME_TO_SPLIT; import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SYSTEM_WINDOWS_REASON_HOME_KEY; @@ -172,7 +170,7 @@ import com.android.quickstep.RecentsModel; import com.android.quickstep.SystemUiProxy; import com.android.quickstep.TaskUtils; import com.android.quickstep.TouchInteractionService.TISBinder; -import com.android.quickstep.util.ActiveGestureLog; +import com.android.quickstep.util.ActiveGestureProtoLogProxy; import com.android.quickstep.util.AsyncClockEventDelegate; import com.android.quickstep.util.GroupTask; import com.android.quickstep.util.LauncherUnfoldAnimationController; @@ -595,11 +593,8 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, TaskView taskToLaunch = currentPageTask; if (currentPageTask == null) { taskToLaunch = fallbackTask; - ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( - "Quick switch from home fallback case: The TaskView at index ") - .append(rv.getCurrentPage()) - .append(" is missing."), - QUICK_SWITCH_FROM_HOME_FALLBACK); + ActiveGestureProtoLogProxy.logQuickSwitchFromHomeFallback( + rv.getCurrentPage()); } taskToLaunch.launchWithoutAnimation(success -> { if (!success) { @@ -610,11 +605,7 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer, return Unit.INSTANCE; }); } else { - ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( - "Quick switch from home failed: TaskViews at indices ") - .append(rv.getCurrentPage()) - .append(" and 0 are missing."), - QUICK_SWITCH_FROM_HOME_FAILED); + ActiveGestureProtoLogProxy.logQuickSwitchFromHomeFailed(rv.getCurrentPage()); getStateManager().goToState(NORMAL); } break; diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java index fe1d015ed5..864328f883 100644 --- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java +++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java @@ -56,11 +56,7 @@ import static com.android.quickstep.GestureState.STATE_RECENTS_ANIMATION_CANCELE import static com.android.quickstep.GestureState.STATE_RECENTS_ANIMATION_STARTED; import static com.android.quickstep.GestureState.STATE_RECENTS_SCROLLING_FINISHED; import static com.android.quickstep.MultiStateCallback.DEBUG_STATES; -import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.CANCEL_RECENTS_ANIMATION; import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.EXPECTING_TASK_APPEARED; -import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.INVALID_VELOCITY_ON_SWIPE_UP; -import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.LAUNCHER_DESTROYED; -import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.ON_SETTLED_ON_END_TARGET; import static com.android.quickstep.views.RecentsView.UPDATE_SYSUI_FLAGS_THRESHOLD; import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SYSTEM_WINDOWS_REASON_RECENTS; @@ -128,6 +124,7 @@ import com.android.quickstep.RemoteTargetGluer.RemoteTargetHandle; import com.android.quickstep.fallback.window.RecentsWindowManager; import com.android.quickstep.util.ActiveGestureErrorDetector; import com.android.quickstep.util.ActiveGestureLog; +import com.android.quickstep.util.ActiveGestureProtoLogProxy; import com.android.quickstep.util.ActivityInitListener; import com.android.quickstep.util.AnimatorControllerWithResistance; import com.android.quickstep.util.InputConsumerProxy; @@ -203,7 +200,7 @@ public abstract class AbsSwipeUpHandler< private boolean mRecentsViewScrollLinked = false; private final Runnable mLauncherOnDestroyCallback = () -> { - ActiveGestureLog.INSTANCE.addLog("Launcher destroyed", LAUNCHER_DESTROYED); + ActiveGestureProtoLogProxy.logLauncherDestroyed(); mRecentsView = null; mContainer = null; mStateCallback.clearState(STATE_LAUNCHER_PRESENT); @@ -984,9 +981,7 @@ public abstract class AbsSwipeUpHandler< @Override public void onRecentsAnimationCanceled(HashMap thumbnailDatas) { - ActiveGestureLog.INSTANCE.addLog( - /* event= */ "cancelRecentsAnimation", - /* gestureEvent= */ CANCEL_RECENTS_ANIMATION); + ActiveGestureProtoLogProxy.logAbsSwipeUpHandlerOnRecentsAnimationCanceled(); mActivityInitListener.unregister("AbsSwipeUpHandler.onRecentsAnimationCanceled"); mStateCallback.setStateOnUiThread(STATE_GESTURE_CANCELLED | STATE_HANDLER_INVALIDATED); // Defer clearing the controller and the targets until after we've updated the state @@ -1190,10 +1185,7 @@ public abstract class AbsSwipeUpHandler< // Resets this value as the gesture is now complete. mContainerInterface.getTaskbarController().setUserIsNotGoingHome(false); } - ActiveGestureLog.INSTANCE.addLog( - new ActiveGestureLog.CompoundString("onSettledOnEndTarget ") - .append(endTarget.name()), - /* gestureEvent= */ ON_SETTLED_ON_END_TARGET); + ActiveGestureProtoLogProxy.logOnSettledOnEndTarget(endTarget.name()); } /** @return Whether this was the task we were waiting to appear, and thus handled it. */ @@ -1227,19 +1219,10 @@ public abstract class AbsSwipeUpHandler< private GestureEndTarget calculateEndTarget( PointF velocityPxPerMs, float endVelocityPxPerMs, boolean isFlingY, boolean isCancel) { - - ActiveGestureErrorDetector.GestureEvent gestureEvent = - velocityPxPerMs.x == 0 && velocityPxPerMs.y == 0 - ? INVALID_VELOCITY_ON_SWIPE_UP - : null; - ActiveGestureLog.INSTANCE.addLog( - new ActiveGestureLog.CompoundString("calculateEndTarget: velocities=(x=") - .append(dpiFromPx(velocityPxPerMs.x)) - .append("dp/ms, y=") - .append(dpiFromPx(velocityPxPerMs.y)) - .append("dp/ms), angle=") - .append(Math.toDegrees(Math.atan2( - -velocityPxPerMs.y, velocityPxPerMs.x))), gestureEvent); + ActiveGestureProtoLogProxy.logOnCalculateEndTarget( + dpiFromPx(velocityPxPerMs.x), + dpiFromPx(velocityPxPerMs.y), + Math.toDegrees(Math.atan2(-velocityPxPerMs.y, velocityPxPerMs.x))); if (mGestureState.isHandlingAtomicEvent()) { // Button mode, this is only used to go to recents. @@ -1990,9 +1973,7 @@ public abstract class AbsSwipeUpHandler< * handler (in case of quick switch). */ private void cancelCurrentAnimation() { - ActiveGestureLog.INSTANCE.addLog( - "AbsSwipeUpHandler.cancelCurrentAnimation", - ActiveGestureErrorDetector.GestureEvent.CANCEL_CURRENT_ANIMATION); + ActiveGestureProtoLogProxy.logAbsSwipeUpHandlerCancelCurrentAnimation(); mCanceled = true; mCurrentShift.cancelAnimation(); @@ -2313,7 +2294,7 @@ public abstract class AbsSwipeUpHandler< if (!hasTaskPreviouslyAppeared) { ActiveGestureLog.INSTANCE.trackEvent(EXPECTING_TASK_APPEARED); } - ActiveGestureLog.INSTANCE.addLog(nextTaskLog); + ActiveGestureProtoLogProxy.logDynamicString(nextTaskLog.toString()); nextTask.launchWithoutAnimation(true, success -> { resultCallback.accept(success); if (success) { @@ -2391,9 +2372,7 @@ public abstract class AbsSwipeUpHandler< return; } final Runnable onFinishComplete = () -> { - ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( - "AbsSwipeUpHandler.onTasksAppeared: ") - .append("force finish recents animation complete; clearing state callback.")); + ActiveGestureProtoLogProxy.logAbsSwipeUpHandlerOnTasksAppeared(); mStateCallback.setStateOnUiThread(STATE_GESTURE_CANCELLED | STATE_HANDLER_INVALIDATED); }; ActiveGestureLog.CompoundString forceFinishReason = new ActiveGestureLog.CompoundString( @@ -2404,18 +2383,17 @@ public abstract class AbsSwipeUpHandler< // previous quickswitch task launch, then cancel the animation back to the app RemoteAnimationTarget appearedTaskTarget = appearedTaskTargets[0]; TaskInfo taskInfo = appearedTaskTarget.taskInfo; - ActiveGestureLog.INSTANCE.addLog(forceFinishReason - .append("Unexpected task appeared id=") - .append(taskInfo.taskId) - .append(" pkg=") - .append(taskInfo.baseIntent.getComponent().getPackageName())); + ActiveGestureProtoLogProxy.logUnexpectedTaskAppeared( + taskInfo.taskId, + taskInfo.baseIntent.getComponent().getPackageName()); finishRecentsAnimationOnTasksAppeared(onFinishComplete); return; } ActiveGestureLog.CompoundString handleTaskFailureReason = new ActiveGestureLog.CompoundString("handleTaskAppeared check failed: "); if (!handleTaskAppeared(appearedTaskTargets, handleTaskFailureReason)) { - ActiveGestureLog.INSTANCE.addLog(forceFinishReason.append(handleTaskFailureReason)); + forceFinishReason.append(handleTaskFailureReason); + ActiveGestureProtoLogProxy.logDynamicString(forceFinishReason.toString()); finishRecentsAnimationOnTasksAppeared(onFinishComplete); return; } @@ -2423,8 +2401,8 @@ public abstract class AbsSwipeUpHandler< .filter(mGestureState.mLastStartedTaskIdPredicate) .toArray(RemoteAnimationTarget[]::new); if (taskTargets.length == 0) { - ActiveGestureLog.INSTANCE.addLog( - forceFinishReason.append("No appeared task matching started task id")); + forceFinishReason.append("No appeared task matching started task id"); + ActiveGestureProtoLogProxy.logDynamicString(forceFinishReason.toString()); finishRecentsAnimationOnTasksAppeared(onFinishComplete); return; } @@ -2433,12 +2411,14 @@ public abstract class AbsSwipeUpHandler< ? null : mRecentsView.getTaskViewByTaskId(taskTarget.taskId); if (taskView == null || taskView.getTaskContainers().stream().noneMatch( TaskContainer::getShouldShowSplashView)) { - ActiveGestureLog.INSTANCE.addLog(forceFinishReason.append("Splash not needed")); + forceFinishReason.append("Splash not needed"); + ActiveGestureProtoLogProxy.logDynamicString(forceFinishReason.toString()); finishRecentsAnimationOnTasksAppeared(onFinishComplete); return; } if (mContainer == null) { - ActiveGestureLog.INSTANCE.addLog(forceFinishReason.append("Activity destroyed")); + forceFinishReason.append("Activity destroyed"); + ActiveGestureProtoLogProxy.logDynamicString(forceFinishReason.toString()); finishRecentsAnimationOnTasksAppeared(onFinishComplete); return; } @@ -2494,7 +2474,7 @@ public abstract class AbsSwipeUpHandler< if (mRecentsAnimationController != null) { mRecentsAnimationController.finish(false /* toRecents */, onFinishComplete); } - ActiveGestureLog.INSTANCE.addLog("finishRecentsAnimationOnTasksAppeared"); + ActiveGestureProtoLogProxy.logFinishRecentsAnimationOnTasksAppeared(); } /** diff --git a/quickstep/src/com/android/quickstep/GestureState.java b/quickstep/src/com/android/quickstep/GestureState.java index 22967cb606..2892d2c913 100644 --- a/quickstep/src/com/android/quickstep/GestureState.java +++ b/quickstep/src/com/android/quickstep/GestureState.java @@ -24,7 +24,6 @@ import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_BACKG import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_HOME; import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_OVERVIEW; import static com.android.quickstep.MultiStateCallback.DEBUG_STATES; -import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.SET_END_TARGET; import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.SET_END_TARGET_ALL_APPS; import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.SET_END_TARGET_HOME; import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.SET_END_TARGET_NEW_TASK; @@ -42,6 +41,7 @@ import com.android.launcher3.statemanager.StatefulContainer; import com.android.quickstep.TopTaskTracker.CachedTaskInfo; import com.android.quickstep.util.ActiveGestureErrorDetector; import com.android.quickstep.util.ActiveGestureLog; +import com.android.quickstep.util.ActiveGestureProtoLogProxy; import com.android.quickstep.views.RecentsViewContainer; import com.android.systemui.shared.recents.model.ThumbnailData; @@ -411,10 +411,7 @@ public class GestureState implements RecentsAnimationCallbacks.RecentsAnimationL public void setEndTarget(GestureEndTarget target, boolean isAtomic) { mEndTarget = target; mStateCallback.setState(STATE_END_TARGET_SET); - ActiveGestureLog.INSTANCE.addLog( - new ActiveGestureLog.CompoundString("setEndTarget ") - .append(mEndTarget.name()), - /* gestureEvent= */ SET_END_TARGET); + ActiveGestureProtoLogProxy.logSetEndTarget(mEndTarget.name()); switch (mEndTarget) { case HOME: ActiveGestureLog.INSTANCE.trackEvent(SET_END_TARGET_HOME); diff --git a/quickstep/src/com/android/quickstep/MultiStateCallback.java b/quickstep/src/com/android/quickstep/MultiStateCallback.java index df42efcc4e..a9f196d8ff 100644 --- a/quickstep/src/com/android/quickstep/MultiStateCallback.java +++ b/quickstep/src/com/android/quickstep/MultiStateCallback.java @@ -28,6 +28,7 @@ import androidx.annotation.Nullable; import com.android.launcher3.config.FeatureFlags; import com.android.quickstep.util.ActiveGestureErrorDetector; import com.android.quickstep.util.ActiveGestureLog; +import com.android.quickstep.util.ActiveGestureProtoLogProxy; import java.util.ArrayList; import java.util.LinkedList; @@ -114,10 +115,9 @@ public class MultiStateCallback { if (gestureEvent == null) { continue; } - if (gestureEvent.mLogEvent && gestureEvent.mTrackEvent) { - ActiveGestureLog.INSTANCE.addLog(gestureEvent.name(), gestureEvent); - } else if (gestureEvent.mLogEvent) { - ActiveGestureLog.INSTANCE.addLog(gestureEvent.name()); + if (gestureEvent.mLogEvent) { + ActiveGestureProtoLogProxy.logDynamicString( + gestureEvent.name(), gestureEvent.mTrackEvent ? gestureEvent : null); } else if (gestureEvent.mTrackEvent) { ActiveGestureLog.INSTANCE.trackEvent(gestureEvent); } diff --git a/quickstep/src/com/android/quickstep/OverviewCommandHelper.kt b/quickstep/src/com/android/quickstep/OverviewCommandHelper.kt index 66224ae098..a33e5c0fd2 100644 --- a/quickstep/src/com/android/quickstep/OverviewCommandHelper.kt +++ b/quickstep/src/com/android/quickstep/OverviewCommandHelper.kt @@ -45,6 +45,7 @@ import com.android.quickstep.OverviewCommandHelper.CommandType.KEYBOARD_INPUT import com.android.quickstep.OverviewCommandHelper.CommandType.SHOW import com.android.quickstep.OverviewCommandHelper.CommandType.TOGGLE import com.android.quickstep.util.ActiveGestureLog +import com.android.quickstep.util.ActiveGestureProtoLogProxy import com.android.quickstep.views.RecentsView import com.android.quickstep.views.TaskView import com.android.systemui.shared.recents.model.ThumbnailData @@ -280,7 +281,7 @@ constructor( keyboardTaskFocusIndex = 0 } HOME -> { - ActiveGestureLog.INSTANCE.addLog("OverviewCommandHelper.executeCommand(HOME)") + ActiveGestureProtoLogProxy.logExecuteHomeCommand() // Although IActivityTaskManager$Stub$Proxy.startActivity is a slow binder call, // we should still call it on main thread because launcher is waiting for // ActivityTaskManager to resume it. Also calling startActivity() on bg thread diff --git a/quickstep/src/com/android/quickstep/OverviewComponentObserver.java b/quickstep/src/com/android/quickstep/OverviewComponentObserver.java index a69b831ba1..66112c1768 100644 --- a/quickstep/src/com/android/quickstep/OverviewComponentObserver.java +++ b/quickstep/src/com/android/quickstep/OverviewComponentObserver.java @@ -42,7 +42,7 @@ import androidx.annotation.UiThread; import com.android.launcher3.Flags; import com.android.launcher3.R; import com.android.launcher3.util.SimpleBroadcastReceiver; -import com.android.quickstep.util.ActiveGestureLog; +import com.android.quickstep.util.ActiveGestureProtoLogProxy; import com.android.systemui.shared.system.PackageManagerWrapper; import java.io.PrintWriter; @@ -305,10 +305,11 @@ public final class OverviewComponentObserver { * Starts the intent for the current home activity. */ public static void startHomeIntentSafely( - @NonNull Context context, @NonNull Intent homeIntent, @Nullable Bundle options, + @NonNull Context context, + @NonNull Intent homeIntent, + @Nullable Bundle options, @NonNull String reason) { - ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( - "OverviewComponentObserver.startHomeIntent: ").append(reason)); + ActiveGestureProtoLogProxy.logStartHomeIntent(reason); try { context.startActivity(homeIntent, options); } catch (NullPointerException | ActivityNotFoundException | SecurityException e) { diff --git a/quickstep/src/com/android/quickstep/RecentsAnimationCallbacks.java b/quickstep/src/com/android/quickstep/RecentsAnimationCallbacks.java index 0c5806b13c..fc11812f0e 100644 --- a/quickstep/src/com/android/quickstep/RecentsAnimationCallbacks.java +++ b/quickstep/src/com/android/quickstep/RecentsAnimationCallbacks.java @@ -19,9 +19,6 @@ import static android.view.RemoteAnimationTarget.MODE_CLOSING; import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER; import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; -import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.ON_CANCEL_RECENTS_ANIMATION; -import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.ON_FINISH_RECENTS_ANIMATION; -import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.ON_START_RECENTS_ANIMATION; import android.graphics.Rect; import android.os.Bundle; @@ -34,8 +31,7 @@ import androidx.annotation.UiThread; import com.android.launcher3.Utilities; import com.android.launcher3.util.Preconditions; -import com.android.quickstep.util.ActiveGestureErrorDetector; -import com.android.quickstep.util.ActiveGestureLog; +import com.android.quickstep.util.ActiveGestureProtoLogProxy; import com.android.systemui.shared.recents.model.ThumbnailData; import com.android.systemui.shared.system.RecentsAnimationControllerCompat; @@ -107,11 +103,8 @@ public class RecentsAnimationCallbacks implements .filter(app -> app.mode == MODE_CLOSING) .count(); if (appCount == 0) { + ActiveGestureProtoLogProxy.logOnRecentsAnimationStartCancelled(); // Edge case, if there are no closing app targets, then Launcher has nothing to handle - ActiveGestureLog.INSTANCE.addLog( - /* event= */ "RecentsAnimationCallbacks.onAnimationStart (canceled)", - /* extras= */ 0, - /* gestureEvent= */ ON_START_RECENTS_ANIMATION); notifyAnimationCanceled(); animationController.finish(false /* toHome */, false /* sendUserLeaveHint */, null /* finishCb */); @@ -138,10 +131,7 @@ public class RecentsAnimationCallbacks implements extras); Utilities.postAsyncCallback(MAIN_EXECUTOR.getHandler(), () -> { - ActiveGestureLog.INSTANCE.addLog( - /* event= */ "RecentsAnimationCallbacks.onAnimationStart", - /* extras= */ targets.apps.length, - /* gestureEvent= */ ON_START_RECENTS_ANIMATION); + ActiveGestureProtoLogProxy.logOnRecentsAnimationStart(targets.apps.length); for (RecentsAnimationListener listener : getListeners()) { listener.onRecentsAnimationStart(mController, targets); } @@ -153,9 +143,7 @@ public class RecentsAnimationCallbacks implements @Override public final void onAnimationCanceled(HashMap thumbnailDatas) { Utilities.postAsyncCallback(MAIN_EXECUTOR.getHandler(), () -> { - ActiveGestureLog.INSTANCE.addLog( - /* event= */ "RecentsAnimationCallbacks.onAnimationCanceled", - /* gestureEvent= */ ON_CANCEL_RECENTS_ANIMATION); + ActiveGestureProtoLogProxy.logRecentsAnimationCallbacksOnAnimationCancelled(); for (RecentsAnimationListener listener : getListeners()) { listener.onRecentsAnimationCanceled(thumbnailDatas); } @@ -166,8 +154,7 @@ public class RecentsAnimationCallbacks implements @Override public void onTasksAppeared(RemoteAnimationTarget[] apps) { Utilities.postAsyncCallback(MAIN_EXECUTOR.getHandler(), () -> { - ActiveGestureLog.INSTANCE.addLog("RecentsAnimationCallbacks.onTasksAppeared", - ActiveGestureErrorDetector.GestureEvent.TASK_APPEARED); + ActiveGestureProtoLogProxy.logRecentsAnimationCallbacksOnTasksAppeared(); for (RecentsAnimationListener listener : getListeners()) { listener.onTasksAppeared(apps); } @@ -176,9 +163,7 @@ public class RecentsAnimationCallbacks implements private void onAnimationFinished(RecentsAnimationController controller) { Utilities.postAsyncCallback(MAIN_EXECUTOR.getHandler(), () -> { - ActiveGestureLog.INSTANCE.addLog( - /* event= */ "RecentsAnimationCallbacks.onAnimationFinished", - ON_FINISH_RECENTS_ANIMATION); + ActiveGestureProtoLogProxy.logAbsSwipeUpHandlerOnRecentsAnimationFinished(); for (RecentsAnimationListener listener : getListeners()) { listener.onRecentsAnimationFinished(controller); } diff --git a/quickstep/src/com/android/quickstep/RecentsAnimationController.java b/quickstep/src/com/android/quickstep/RecentsAnimationController.java index 190d5269ed..dcb01087ee 100644 --- a/quickstep/src/com/android/quickstep/RecentsAnimationController.java +++ b/quickstep/src/com/android/quickstep/RecentsAnimationController.java @@ -17,7 +17,6 @@ package com.android.quickstep; import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR; -import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.FINISH_RECENTS_ANIMATION; import android.os.Bundle; import android.os.RemoteException; @@ -32,7 +31,7 @@ import com.android.internal.jank.Cuj; import com.android.internal.os.IResultReceiver; import com.android.launcher3.util.Preconditions; import com.android.launcher3.util.RunnableList; -import com.android.quickstep.util.ActiveGestureLog; +import com.android.quickstep.util.ActiveGestureProtoLogProxy; import com.android.systemui.shared.recents.model.ThumbnailData; import com.android.systemui.shared.system.InteractionJankMonitorWrapper; import com.android.systemui.shared.system.RecentsAnimationControllerCompat; @@ -132,10 +131,7 @@ public class RecentsAnimationController { // trigger the callback to be called immediately return; } - ActiveGestureLog.INSTANCE.addLog( - /* event= */ "finishRecentsAnimation", - /* extras= */ toRecents, - /* gestureEvent= */ FINISH_RECENTS_ANIMATION); + ActiveGestureProtoLogProxy.logFinishRecentsAnimation(toRecents); // Finish not yet requested mFinishRequested = true; mFinishTargetIsLauncher = toRecents; @@ -144,7 +140,7 @@ public class RecentsAnimationController { mController.finish(toRecents, sendUserLeaveHint, new IResultReceiver.Stub() { @Override public void send(int i, Bundle bundle) throws RemoteException { - ActiveGestureLog.INSTANCE.addLog("finishRecentsAnimation-callback"); + ActiveGestureProtoLogProxy.logFinishRecentsAnimationCallback(); MAIN_EXECUTOR.execute(() -> { mPendingFinishCallbacks.executeAllAndDestroy(); }); diff --git a/quickstep/src/com/android/quickstep/SystemUiProxy.java b/quickstep/src/com/android/quickstep/SystemUiProxy.java index 6482f34e19..34435d52c1 100644 --- a/quickstep/src/com/android/quickstep/SystemUiProxy.java +++ b/quickstep/src/com/android/quickstep/SystemUiProxy.java @@ -21,7 +21,6 @@ import static com.android.launcher3.Flags.enableUnfoldStateAnimation; import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR; import static com.android.launcher3.util.SplitConfigurationOptions.StagePosition; -import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.RECENT_TASKS_MISSING; import static com.android.quickstep.util.LogUtils.splitFailureMessage; import android.app.ActivityManager; @@ -64,7 +63,7 @@ import com.android.internal.view.AppearanceRegion; import com.android.launcher3.util.MainThreadInitializedObject; import com.android.launcher3.util.Preconditions; import com.android.launcher3.util.SafeCloseable; -import com.android.quickstep.util.ActiveGestureLog; +import com.android.quickstep.util.ActiveGestureProtoLogProxy; import com.android.quickstep.util.AssistUtils; import com.android.quickstep.util.unfold.ProxyUnfoldTransitionProvider; import com.android.systemui.shared.recents.ISystemUiProxy; @@ -1520,7 +1519,7 @@ public class SystemUiProxy implements ISystemUiProxy, NavHandle, SafeCloseable { public boolean startRecentsActivity(Intent intent, ActivityOptions options, RecentsAnimationListener listener) { if (mRecentTasks == null) { - ActiveGestureLog.INSTANCE.addLog("Null mRecentTasks", RECENT_TASKS_MISSING); + ActiveGestureProtoLogProxy.logRecentTasksMissing(); return false; } final IRecentsAnimationRunner runner = new IRecentsAnimationRunner.Stub() { diff --git a/quickstep/src/com/android/quickstep/TaskAnimationManager.java b/quickstep/src/com/android/quickstep/TaskAnimationManager.java index 4beb99a4f1..98d7628633 100644 --- a/quickstep/src/com/android/quickstep/TaskAnimationManager.java +++ b/quickstep/src/com/android/quickstep/TaskAnimationManager.java @@ -26,7 +26,6 @@ import static com.android.quickstep.GestureState.GestureEndTarget.RECENTS; import static com.android.quickstep.GestureState.STATE_END_TARGET_ANIMATION_FINISHED; import static com.android.quickstep.GestureState.STATE_RECENTS_ANIMATION_INITIALIZED; import static com.android.quickstep.GestureState.STATE_RECENTS_ANIMATION_STARTED; -import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.START_RECENTS_ANIMATION; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_QUICK_SETTINGS_EXPANDED; @@ -49,7 +48,7 @@ import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.taskbar.TaskbarUIController; import com.android.launcher3.util.DisplayController; import com.android.quickstep.fallback.window.RecentsWindowManager; -import com.android.quickstep.util.ActiveGestureLog; +import com.android.quickstep.util.ActiveGestureProtoLogProxy; import com.android.quickstep.util.SystemUiFlagUtils; import com.android.quickstep.views.RecentsView; import com.android.systemui.shared.recents.model.ThumbnailData; @@ -137,9 +136,7 @@ public class TaskAnimationManager implements RecentsAnimationCallbacks.RecentsAn @UiThread public RecentsAnimationCallbacks startRecentsAnimation(@NonNull GestureState gestureState, Intent intent, RecentsAnimationCallbacks.RecentsAnimationListener listener) { - ActiveGestureLog.INSTANCE.addLog( - /* event= */ "startRecentsAnimation", - /* gestureEvent= */ START_RECENTS_ANIMATION); + ActiveGestureProtoLogProxy.logStartRecentsAnimation(); // Notify if recents animation is still running if (mController != null) { String msg = "New recents animation started before old animation completed"; @@ -169,9 +166,8 @@ public class TaskAnimationManager implements RecentsAnimationCallbacks.RecentsAn public void onRecentsAnimationStart(RecentsAnimationController controller, RecentsAnimationTargets targets) { if (enableHandleDelayedGestureCallbacks() && mRecentsAnimationStartPending) { - ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( - "TaskAnimationManager.startRecentsAnimation(onRecentsAnimationStart): ") - .append("Setting mRecentsAnimationStartPending = false")); + ActiveGestureProtoLogProxy.logStartRecentsAnimationCallback( + "onRecentsAnimationStart"); mRecentsAnimationStartPending = false; } if (mCallbacks == null) { @@ -215,10 +211,8 @@ public class TaskAnimationManager implements RecentsAnimationCallbacks.RecentsAn @Override public void onRecentsAnimationCanceled(HashMap thumbnailDatas) { if (enableHandleDelayedGestureCallbacks() && mRecentsAnimationStartPending) { - ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( - "TaskAnimationManager.startRecentsAnimation") - .append("(onRecentsAnimationCanceled): ") - .append("Setting mRecentsAnimationStartPending = false")); + ActiveGestureProtoLogProxy.logStartRecentsAnimationCallback( + "onRecentsAnimationCanceled"); mRecentsAnimationStartPending = false; } cleanUpRecentsAnimation(newCallbacks); @@ -227,10 +221,8 @@ public class TaskAnimationManager implements RecentsAnimationCallbacks.RecentsAn @Override public void onRecentsAnimationFinished(RecentsAnimationController controller) { if (enableHandleDelayedGestureCallbacks() && mRecentsAnimationStartPending) { - ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( - "TaskAnimationManager.startRecentsAnimation") - .append("(onRecentsAnimationFinished): ") - .append("Setting mRecentsAnimationStartPending = false")); + ActiveGestureProtoLogProxy.logStartRecentsAnimationCallback( + "onRecentsAnimationFinished"); mRecentsAnimationStartPending = false; } cleanUpRecentsAnimation(newCallbacks); @@ -276,16 +268,14 @@ public class TaskAnimationManager implements RecentsAnimationCallbacks.RecentsAn RecentsView recentsView = containerInterface.getCreatedContainer().getOverviewPanel(); if (recentsView != null) { - ActiveGestureLog.INSTANCE.addLog( - new ActiveGestureLog.CompoundString("Launching side task id=") - .append(appearedTaskTarget.taskId)); + ActiveGestureProtoLogProxy.logLaunchingSideTask(appearedTaskTarget.taskId); recentsView.launchSideTaskInLiveTileMode(appearedTaskTarget.taskId, appearedTaskTargets, new RemoteAnimationTarget[0] /* wallpaper */, nonAppTargets /* nonApps */); return; } else { - ActiveGestureLog.INSTANCE.addLog("Unable to launch side task (no recents)"); + ActiveGestureProtoLogProxy.logLaunchingSideTaskFailed(); } } else if (nonAppTargets.length > 0) { TaskViewUtils.createSplitAuxiliarySurfacesAnimator(nonAppTargets /* nonApps */, @@ -340,10 +330,8 @@ public class TaskAnimationManager implements RecentsAnimationCallbacks.RecentsAn .startRecentsActivity(intent, options, mCallbacks); } if (enableHandleDelayedGestureCallbacks()) { - ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( - "TaskAnimationManager.startRecentsAnimation: ") - .append("Setting mRecentsAnimationStartPending = ") - .append(mRecentsAnimationStartPending)); + ActiveGestureProtoLogProxy.logSettingRecentsAnimationStartPending( + mRecentsAnimationStartPending); } gestureState.setState(STATE_RECENTS_ANIMATION_INITIALIZED); return mCallbacks; @@ -353,7 +341,7 @@ public class TaskAnimationManager implements RecentsAnimationCallbacks.RecentsAn * Continues the existing running recents animation for a new gesture. */ public RecentsAnimationCallbacks continueRecentsAnimation(GestureState gestureState) { - ActiveGestureLog.INSTANCE.addLog(/* event= */ "continueRecentsAnimation"); + ActiveGestureProtoLogProxy.logContinueRecentsAnimation(); mCallbacks.removeListener(mLastGestureState); mLastGestureState = gestureState; mCallbacks.addListener(gestureState); @@ -435,8 +423,7 @@ public class TaskAnimationManager implements RecentsAnimationCallbacks.RecentsAn public void finishRunningRecentsAnimation(boolean toHome, boolean forceFinish, Runnable forceFinishCb) { if (mController != null) { - ActiveGestureLog.INSTANCE.addLog( - /* event= */ "finishRunningRecentsAnimation", toHome); + ActiveGestureProtoLogProxy.logFinishRunningRecentsAnimation(toHome); if (forceFinish) { mController.finishController(toHome, forceFinishCb, false /* sendUserLeaveHint */, true /* forceFinish */); @@ -473,11 +460,10 @@ public class TaskAnimationManager implements RecentsAnimationCallbacks.RecentsAn */ private void cleanUpRecentsAnimation(RecentsAnimationCallbacks targetCallbacks) { if (mCallbacks != targetCallbacks) { - ActiveGestureLog.INSTANCE.addLog( - /* event= */ "cleanUpRecentsAnimation skipped due to wrong callbacks"); + ActiveGestureProtoLogProxy.logCleanUpRecentsAnimationSkipped(); return; } - ActiveGestureLog.INSTANCE.addLog(/* event= */ "cleanUpRecentsAnimation"); + ActiveGestureProtoLogProxy.logCleanUpRecentsAnimation(); if (mLiveTileCleanUpHandler != null) { mLiveTileCleanUpHandler.run(); mLiveTileCleanUpHandler = null; diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java index c5791fa750..c3ef5c357d 100644 --- a/quickstep/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java @@ -36,11 +36,6 @@ import static com.android.quickstep.GestureState.DEFAULT_STATE; import static com.android.quickstep.GestureState.TrackpadGestureType.getTrackpadGestureType; import static com.android.quickstep.InputConsumer.TYPE_CURSOR_HOVER; import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.FLAG_USING_OTHER_ACTIVITY_INPUT_CONSUMER; -import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.MOTION_DOWN; -import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.MOTION_MOVE; -import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.MOTION_UP; -import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.NAVIGATION_MODE_SWITCHED; -import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.RECENTS_ANIMATION_START_PENDING; import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SYSTEM_WINDOWS_REASON_RECENTS; import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SYSUI_PROXY; import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_UNFOLD_ANIMATION_FORWARDER; @@ -126,6 +121,7 @@ import com.android.quickstep.inputconsumers.TaskbarUnstashInputConsumer; import com.android.quickstep.inputconsumers.TrackpadStatusBarInputConsumer; import com.android.quickstep.util.ActiveGestureLog; import com.android.quickstep.util.ActiveGestureLog.CompoundString; +import com.android.quickstep.util.ActiveGestureProtoLogProxy; import com.android.quickstep.util.AssistStateManager; import com.android.quickstep.util.AssistUtils; import com.android.quickstep.views.RecentsViewContainer; @@ -857,9 +853,7 @@ public class TouchInteractionService extends Service { private void onInputEvent(InputEvent ev) { if (!(ev instanceof MotionEvent)) { - ActiveGestureLog.INSTANCE.addLog(new CompoundString("TIS.onInputEvent: ") - .append("Cannot process input event: received unknown event ") - .append(ev.toString())); + ActiveGestureProtoLogProxy.logUnknownInputEvent(ev.toString()); return; } MotionEvent event = (MotionEvent) ev; @@ -868,27 +862,19 @@ public class TouchInteractionService extends Service { TestProtocol.SEQUENCE_TIS, "TouchInteractionService.onInputEvent", event); if (!LockedUserState.get(this).isUserUnlocked()) { - ActiveGestureLog.INSTANCE.addLog(new CompoundString("TIS.onInputEvent: ") - .append("Cannot process input event: user is locked")); + ActiveGestureProtoLogProxy.logOnInputEventUserLocked(); return; } NavigationMode currentNavMode = mDeviceState.getMode(); if (mGestureStartNavMode != null && mGestureStartNavMode != currentNavMode) { - ActiveGestureLog.INSTANCE.addLog(new CompoundString("TIS.onInputEvent: ") - .append("Navigation mode switched mid-gesture (") - .append(mGestureStartNavMode.name()) - .append(" -> ") - .append(currentNavMode.name()) - .append("); cancelling gesture."), - NAVIGATION_MODE_SWITCHED); + ActiveGestureProtoLogProxy.logOnInputEventNavModeSwitched( + mGestureStartNavMode.name(), currentNavMode.name()); event.setAction(ACTION_CANCEL); } else if (mDeviceState.isButtonNavMode() && !mDeviceState.supportsAssistantGestureInButtonNav() && !isTrackpadMotionEvent(event)) { - ActiveGestureLog.INSTANCE.addLog(new CompoundString("TIS.onInputEvent: ") - .append("Cannot process input event: ") - .append("using 3-button nav and event is not a trackpad event")); + ActiveGestureProtoLogProxy.logOnInputEventThreeButtonNav(); return; } @@ -904,12 +890,7 @@ public class TouchInteractionService extends Service { } if (mTaskAnimationManager.shouldIgnoreMotionEvents()) { if (action == ACTION_DOWN || isHoverActionWithoutConsumer) { - ActiveGestureLog.INSTANCE.addLog( - new CompoundString("TIS.onMotionEvent: A new gesture has been ") - .append("started, but a previously-requested recents ") - .append("animation hasn't started. Ignoring all following ") - .append("motion events."), - RECENTS_ANIMATION_START_PENDING); + ActiveGestureProtoLogProxy.logOnInputIgnoringFollowingEvents(); } return; } @@ -999,41 +980,25 @@ public class TouchInteractionService extends Service { if (mUncheckedConsumer != InputConsumer.NO_OP) { switch (action) { case ACTION_DOWN: - ActiveGestureLog.INSTANCE.addLog(reasonString); + ActiveGestureProtoLogProxy.logDynamicString(reasonString.toString()); // fall through case ACTION_UP: - ActiveGestureLog.INSTANCE.addLog( - new CompoundString("onMotionEvent(") - .append((int) event.getRawX()) - .append(", ") - .append((int) event.getRawY()) - .append("): ") - .append(MotionEvent.actionToString(action)) - .append(", ") - .append(MotionEvent.classificationToString( - event.getClassification())), - /* gestureEvent= */ action == ACTION_DOWN - ? MOTION_DOWN - : MOTION_UP); + ActiveGestureProtoLogProxy.logOnInputEventActionUp( + (int) event.getRawX(), + (int) event.getRawY(), + action, + MotionEvent.classificationToString(event.getClassification())); break; case ACTION_MOVE: - ActiveGestureLog.INSTANCE.addLog( - new CompoundString("onMotionEvent: ") - .append(MotionEvent.actionToString(action)) - .append(",") - .append(MotionEvent.classificationToString( - event.getClassification())) - .append(", pointerCount: ") - .append(event.getPointerCount()), - MOTION_MOVE); + ActiveGestureProtoLogProxy.logOnInputEventActionMove( + MotionEvent.actionToString(action), + MotionEvent.classificationToString(event.getClassification()), + event.getPointerCount()); break; default: { - ActiveGestureLog.INSTANCE.addLog( - new CompoundString("onMotionEvent: ") - .append(MotionEvent.actionToString(action)) - .append(",") - .append(MotionEvent.classificationToString( - event.getClassification()))); + ActiveGestureProtoLogProxy.logOnInputEventGenericAction( + MotionEvent.actionToString(action), + MotionEvent.classificationToString(event.getClassification())); } } } @@ -1123,10 +1088,8 @@ public class TouchInteractionService extends Service { gestureState.setTrackpadGestureType(trackpadGestureType); // Log initial state for the gesture. - ActiveGestureLog.INSTANCE.addLog(new CompoundString("Current running task package name=") - .append(taskInfo.getPackageName())); - ActiveGestureLog.INSTANCE.addLog(new CompoundString("Current SystemUi state flags=") - .append(mDeviceState.getSystemUiStateString())); + ActiveGestureProtoLogProxy.logRunningTaskPackage(taskInfo.getPackageName()); + ActiveGestureProtoLogProxy.logSysuiStateFlags(mDeviceState.getSystemUiStateString()); return gestureState; } @@ -1339,10 +1302,7 @@ public class TouchInteractionService extends Service { private void logInputConsumerSelectionReason( InputConsumer consumer, CompoundString reasonString) { - ActiveGestureLog.INSTANCE.addLog(new CompoundString("setInputConsumer: ") - .append(consumer.getName()) - .append(". reason(s):") - .append(reasonString)); + ActiveGestureProtoLogProxy.logSetInputConsumer(consumer.getName(), reasonString.toString()); if ((consumer.getType() & InputConsumer.TYPE_OTHER_ACTIVITY) != 0) { ActiveGestureLog.INSTANCE.trackEvent(FLAG_USING_OTHER_ACTIVITY_INPUT_CONSUMER); } @@ -1380,11 +1340,8 @@ public class TouchInteractionService extends Service { ? null : runningTask.getVisibleNonExcludedTask(); if (otherVisibleTask != null) { - ActiveGestureLog.INSTANCE.addLog(new CompoundString("Changing active task to ") - .append(otherVisibleTask.getPackageName()) - .append(" because the previous task running on top of this one (") - .append(runningTask.getPackageName()) - .append(") was excluded from recents")); + ActiveGestureProtoLogProxy.logUpdateGestureStateRunningTask( + otherVisibleTask.getPackageName(), runningTask.getPackageName()); gestureState.updateRunningTask(otherVisibleTask); } @@ -1604,8 +1561,7 @@ public class TouchInteractionService extends Service { // TODO(b/258022658): Remove temporary logging. Log.i(TAG, "preloadOverview: forSUWAllSet=" + forSUWAllSet + ", isHomeAndOverviewSame=" + mOverviewComponentObserver.isHomeAndOverviewSame()); - - ActiveGestureLog.INSTANCE.addLog("preloadRecentsAnimation"); + ActiveGestureProtoLogProxy.logPreloadRecentsAnimation(); mTaskAnimationManager.preloadRecentsAnimation(overviewIntent); } diff --git a/quickstep/src/com/android/quickstep/inputconsumers/DelegateInputConsumer.java b/quickstep/src/com/android/quickstep/inputconsumers/DelegateInputConsumer.java index 5557639b1c..4afd92a88f 100644 --- a/quickstep/src/com/android/quickstep/inputconsumers/DelegateInputConsumer.java +++ b/quickstep/src/com/android/quickstep/inputconsumers/DelegateInputConsumer.java @@ -5,7 +5,7 @@ import android.view.MotionEvent; import com.android.launcher3.testing.TestLogging; import com.android.launcher3.testing.shared.TestProtocol; import com.android.quickstep.InputConsumer; -import com.android.quickstep.util.ActiveGestureLog; +import com.android.quickstep.util.ActiveGestureProtoLogProxy; import com.android.systemui.shared.system.InputMonitorCompat; public abstract class DelegateInputConsumer implements InputConsumer { @@ -57,8 +57,7 @@ public abstract class DelegateInputConsumer implements InputConsumer { } protected void setActive(MotionEvent ev) { - ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString(getDelegatorName()) - .append(" became active")); + ActiveGestureProtoLogProxy.logInputConsumerBecameActive(getDelegatorName()); mState = STATE_ACTIVE; TestLogging.recordEvent(TestProtocol.SEQUENCE_PILFER, "pilferPointers"); diff --git a/quickstep/src/com/android/quickstep/util/MotionPauseDetector.java b/quickstep/src/com/android/quickstep/util/MotionPauseDetector.java index 15081da2de..4a9e0d8304 100644 --- a/quickstep/src/com/android/quickstep/util/MotionPauseDetector.java +++ b/quickstep/src/com/android/quickstep/util/MotionPauseDetector.java @@ -252,7 +252,7 @@ public class MotionPauseDetector { if (Utilities.isRunningInTestHarness()) { Log.d(TAG, logString.toString()); } - ActiveGestureLog.INSTANCE.addLog(logString); + ActiveGestureProtoLogProxy.logMotionPauseDetectorEvent(logString.toString()); } public void clear() { diff --git a/quickstep/src/com/android/quickstep/util/TaskRemovedDuringLaunchListener.java b/quickstep/src/com/android/quickstep/util/TaskRemovedDuringLaunchListener.java index e80d2a6d3f..40a328ccfc 100644 --- a/quickstep/src/com/android/quickstep/util/TaskRemovedDuringLaunchListener.java +++ b/quickstep/src/com/android/quickstep/util/TaskRemovedDuringLaunchListener.java @@ -98,10 +98,7 @@ public class TaskRemovedDuringLaunchListener { final Runnable taskLaunchFailedCallback = mTaskLaunchFailedCallback; RecentsModel.INSTANCE.get(mContext).isTaskRemoved(mLaunchedTaskId, (taskRemoved) -> { if (taskRemoved) { - ActiveGestureLog.INSTANCE.addLog( - new ActiveGestureLog.CompoundString("Launch failed, task (id=") - .append(launchedTaskId) - .append(") finished mid transition")); + ActiveGestureProtoLogProxy.logTaskLaunchFailed(launchedTaskId); taskLaunchFailedCallback.run(); } }, (task) -> true /* filter */); diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index da68a03c56..3cd95b0304 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -205,8 +205,7 @@ import com.android.quickstep.recents.data.RecentsRotationStateRepositoryImpl; import com.android.quickstep.recents.di.RecentsDependencies; import com.android.quickstep.recents.viewmodel.RecentsViewData; import com.android.quickstep.recents.viewmodel.RecentsViewModel; -import com.android.quickstep.util.ActiveGestureErrorDetector; -import com.android.quickstep.util.ActiveGestureLog; +import com.android.quickstep.util.ActiveGestureProtoLogProxy; import com.android.quickstep.util.AnimUtils; import com.android.quickstep.util.DesktopTask; import com.android.quickstep.util.GroupTask; @@ -1587,8 +1586,7 @@ public abstract class RecentsView< @Override protected void onPageEndTransition() { super.onPageEndTransition(); - ActiveGestureLog.INSTANCE.addLog( - "onPageEndTransition: current page index updated", getNextPage()); + ActiveGestureProtoLogProxy.logOnPageEndTransition(getNextPage()); if (isClearAllHidden() && !mContainer.getDeviceProfile().isTablet) { mActionsView.updateDisabledFlags(OverviewActionsView.DISABLED_SCROLLING, false); } @@ -1792,8 +1790,7 @@ public abstract class RecentsView< @Override protected void onScrollerAnimationAborted() { - ActiveGestureLog.INSTANCE.addLog("scroller animation aborted", - ActiveGestureErrorDetector.GestureEvent.SCROLLER_ANIMATION_ABORTED); + ActiveGestureProtoLogProxy.logOnScrollerAnimationAborted(); } @Override diff --git a/quickstep/src/com/android/quickstep/util/ActiveGestureErrorDetector.java b/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureErrorDetector.java similarity index 99% rename from quickstep/src/com/android/quickstep/util/ActiveGestureErrorDetector.java rename to quickstep/src_protolog/com/android/quickstep/util/ActiveGestureErrorDetector.java index 2398e6627e..ab10979927 100644 --- a/quickstep/src/com/android/quickstep/util/ActiveGestureErrorDetector.java +++ b/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureErrorDetector.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 The Android Open Source Project + * 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. diff --git a/quickstep/src/com/android/quickstep/util/ActiveGestureLog.java b/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureLog.java similarity index 98% rename from quickstep/src/com/android/quickstep/util/ActiveGestureLog.java rename to quickstep/src_protolog/com/android/quickstep/util/ActiveGestureLog.java index d46b8fc51a..0eb6f88286 100644 --- a/quickstep/src/com/android/quickstep/util/ActiveGestureLog.java +++ b/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureLog.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 The Android Open Source Project + * 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. @@ -18,8 +18,6 @@ package com.android.quickstep.util; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.android.launcher3.util.Preconditions; - import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -338,8 +336,6 @@ public class ActiveGestureLog { } private Object[] getArgs() { - Preconditions.assertTrue(!mIsNoOp); - return mArgs.toArray(); } @@ -349,8 +345,6 @@ public class ActiveGestureLog { } private String toUnformattedString() { - Preconditions.assertTrue(!mIsNoOp); - StringBuilder sb = new StringBuilder(); for (String substring : mSubstrings) { sb.append(substring); diff --git a/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java b/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java new file mode 100644 index 0000000000..308eeb52fa --- /dev/null +++ b/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java @@ -0,0 +1,538 @@ +/* + * 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.quickstep.util; + +import static android.view.MotionEvent.ACTION_DOWN; + +import static com.android.launcher3.Flags.enableActiveGestureProtoLog; +import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.CANCEL_RECENTS_ANIMATION; +import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.FINISH_RECENTS_ANIMATION; +import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.INVALID_VELOCITY_ON_SWIPE_UP; +import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.LAUNCHER_DESTROYED; +import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.MOTION_DOWN; +import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.MOTION_MOVE; +import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.MOTION_UP; +import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.NAVIGATION_MODE_SWITCHED; +import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.ON_CANCEL_RECENTS_ANIMATION; +import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.ON_FINISH_RECENTS_ANIMATION; +import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.ON_SETTLED_ON_END_TARGET; +import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.ON_START_RECENTS_ANIMATION; +import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.QUICK_SWITCH_FROM_HOME_FAILED; +import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.QUICK_SWITCH_FROM_HOME_FALLBACK; +import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.RECENTS_ANIMATION_START_PENDING; +import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.RECENT_TASKS_MISSING; +import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.SET_END_TARGET; +import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.START_RECENTS_ANIMATION; +import static com.android.quickstep.util.QuickstepProtoLogGroup.ACTIVE_GESTURE_LOG; + +import android.view.MotionEvent; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.android.internal.protolog.ProtoLog; +import com.android.internal.protolog.common.IProtoLogGroup; + +/** + * Proxy class used for ActiveGestureLog ProtoLog support. + *

+ * This file will have all of its static strings in the + * {@link ProtoLog#d(IProtoLogGroup, String, Object...)} calls replaced by dynamic code/strings. + *

+ * When a new ActiveGestureLog entry needs to be added to the codebase (or and existing entry needs + * to be modified), add it here under a new unique method and make sure the ProtoLog entry matches + * to avoid confusion. + */ +public class ActiveGestureProtoLogProxy { + + public static void logLauncherDestroyed() { + ActiveGestureLog.INSTANCE.addLog("Launcher destroyed", LAUNCHER_DESTROYED); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, "Launcher destroyed"); + } + + public static void logAbsSwipeUpHandlerOnRecentsAnimationCanceled() { + ActiveGestureLog.INSTANCE.addLog( + /* event= */ "AbsSwipeUpHandler.onRecentsAnimationCanceled", + /* gestureEvent= */ CANCEL_RECENTS_ANIMATION); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, "AbsSwipeUpHandler.onRecentsAnimationCanceled"); + } + + public static void logAbsSwipeUpHandlerOnRecentsAnimationFinished() { + ActiveGestureLog.INSTANCE.addLog( + /* event= */ "RecentsAnimationCallbacks.onAnimationFinished", + ON_FINISH_RECENTS_ANIMATION); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, "AbsSwipeUpHandler.onAnimationFinished"); + } + + public static void logAbsSwipeUpHandlerCancelCurrentAnimation() { + ActiveGestureLog.INSTANCE.addLog( + "AbsSwipeUpHandler.cancelCurrentAnimation", + ActiveGestureErrorDetector.GestureEvent.CANCEL_CURRENT_ANIMATION); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, "AbsSwipeUpHandler.cancelCurrentAnimation"); + + } + + public static void logAbsSwipeUpHandlerOnTasksAppeared() { + ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( + "AbsSwipeUpHandler.onTasksAppeared: ") + .append("force finish recents animation complete; clearing state callback.")); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, + "AbsSwipeUpHandler.onTasksAppeared: force finish recents animation complete; " + + "clearing state callback."); + + } + + public static void logFinishRecentsAnimationOnTasksAppeared() { + ActiveGestureLog.INSTANCE.addLog("finishRecentsAnimationOnTasksAppeared"); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, "finishRecentsAnimationOnTasksAppeared"); + + } + + public static void logRecentsAnimationCallbacksOnAnimationCancelled() { + ActiveGestureLog.INSTANCE.addLog( + /* event= */ "RecentsAnimationCallbacks.onAnimationCanceled", + /* gestureEvent= */ ON_CANCEL_RECENTS_ANIMATION); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, "RecentsAnimationCallbacks.onAnimationCanceled"); + + } + + public static void logRecentsAnimationCallbacksOnTasksAppeared() { + ActiveGestureLog.INSTANCE.addLog("RecentsAnimationCallbacks.onTasksAppeared", + ActiveGestureErrorDetector.GestureEvent.TASK_APPEARED); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, "RecentsAnimationCallbacks.onTasksAppeared"); + + } + + public static void logStartRecentsAnimation() { + ActiveGestureLog.INSTANCE.addLog( + /* event= */ "TaskAnimationManager.startRecentsAnimation", + /* gestureEvent= */ START_RECENTS_ANIMATION); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, "TaskAnimationManager.startRecentsAnimation"); + + } + + public static void logLaunchingSideTaskFailed() { + ActiveGestureLog.INSTANCE.addLog("Unable to launch side task (no recents)"); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, "Unable to launch side task (no recents)"); + + } + + public static void logContinueRecentsAnimation() { + ActiveGestureLog.INSTANCE.addLog(/* event= */ "continueRecentsAnimation"); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, "continueRecentsAnimation"); + + } + + public static void logCleanUpRecentsAnimationSkipped() { + ActiveGestureLog.INSTANCE.addLog( + /* event= */ "cleanUpRecentsAnimation skipped due to wrong callbacks"); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, "cleanUpRecentsAnimation skipped due to wrong callbacks"); + + } + + public static void logCleanUpRecentsAnimation() { + ActiveGestureLog.INSTANCE.addLog(/* event= */ "cleanUpRecentsAnimation"); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, "cleanUpRecentsAnimation"); + + } + + public static void logOnInputEventUserLocked() { + ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString("TIS.onInputEvent: ") + .append("Cannot process input event: user is locked")); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, + "TIS.onInputEvent: Cannot process input event: user is locked"); + } + + public static void logOnInputIgnoringFollowingEvents() { + ActiveGestureLog.INSTANCE.addLog( + new ActiveGestureLog.CompoundString("TIS.onMotionEvent: A new gesture has been ") + .append("started, but a previously-requested recents ") + .append("animation hasn't started. Ignoring all following ") + .append("motion events."), + RECENTS_ANIMATION_START_PENDING); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, + "TIS.onMotionEvent: A new gesture has been started, but a " + + "previously-requested recents animation hasn't started. " + + "Ignoring all following motion events."); + } + + public static void logOnInputEventThreeButtonNav() { + ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString("TIS.onInputEvent: ") + .append("Cannot process input event: ") + .append("using 3-button nav and event is not a trackpad event")); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, + "TIS.onInputEvent: Cannot process input event: using 3-button nav and " + + "event is not a trackpad event"); + } + + public static void logPreloadRecentsAnimation() { + ActiveGestureLog.INSTANCE.addLog("preloadRecentsAnimation"); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, "preloadRecentsAnimation"); + } + + public static void logRecentTasksMissing() { + ActiveGestureLog.INSTANCE.addLog("Null mRecentTasks", RECENT_TASKS_MISSING); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, "Null mRecentTasks"); + } + + public static void logExecuteHomeCommand() { + ActiveGestureLog.INSTANCE.addLog("OverviewCommandHelper.executeCommand(HOME)"); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, "OverviewCommandHelper.executeCommand(HOME)"); + } + + public static void logFinishRecentsAnimationCallback() { + ActiveGestureLog.INSTANCE.addLog("finishRecentsAnimation-callback"); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, "finishRecentsAnimation-callback"); + } + + public static void logOnScrollerAnimationAborted() { + ActiveGestureLog.INSTANCE.addLog("scroller animation aborted", + ActiveGestureErrorDetector.GestureEvent.SCROLLER_ANIMATION_ABORTED); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, "scroller animation aborted"); + } + + public static void logInputConsumerBecameActive(@NonNull String consumerName) { + ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString(consumerName) + .append(" became active")); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, "%s became active", consumerName); + } + + public static void logTaskLaunchFailed(int launchedTaskId) { + ActiveGestureLog.INSTANCE.addLog( + new ActiveGestureLog.CompoundString("Launch failed, task (id=") + .append(launchedTaskId) + .append(") finished mid transition")); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, + "Launch failed, task (id=%d) finished mid transition", launchedTaskId); + } + + public static void logMotionPauseDetectorEvent(@NonNull String event) { + ActiveGestureLog.INSTANCE.addLog(event); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, "MotionPauseDetector: %s", event); + } + + public static void logOnPageEndTransition(int nextPageIndex) { + ActiveGestureLog.INSTANCE.addLog( + "onPageEndTransition: current page index updated", nextPageIndex); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, + "onPageEndTransition: current page index updated: %d", nextPageIndex); + } + + public static void logQuickSwitchFromHomeFallback(int taskIndex) { + ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( + "Quick switch from home fallback case: The TaskView at index ") + .append(taskIndex) + .append(" is missing."), + QUICK_SWITCH_FROM_HOME_FALLBACK); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, + "Quick switch from home fallback case: The TaskView at index %d is missing.", + taskIndex); + } + + public static void logQuickSwitchFromHomeFailed(int taskIndex) { + ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( + "Quick switch from home failed: TaskViews at indices ") + .append(taskIndex) + .append(" and 0 are missing."), + QUICK_SWITCH_FROM_HOME_FAILED); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, + "Quick switch from home failed: TaskViews at indices %d and 0 are missing.", + taskIndex); + } + + public static void logFinishRecentsAnimation(boolean toRecents) { + ActiveGestureLog.INSTANCE.addLog( + /* event= */ "finishRecentsAnimation", + /* extras= */ toRecents, + /* gestureEvent= */ FINISH_RECENTS_ANIMATION); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, "finishRecentsAnimation: %b", toRecents); + } + + public static void logSetEndTarget(@NonNull String target) { + ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString("setEndTarget ") + .append(target), + /* gestureEvent= */ SET_END_TARGET); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, "setEndTarget %s", target); + } + + public static void logStartHomeIntent(@NonNull String reason) { + ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( + "OverviewComponentObserver.startHomeIntent: ").append(reason)); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, "OverviewComponentObserver.startHomeIntent: %s", reason); + } + + public static void logRunningTaskPackage(@NonNull String packageName) { + ActiveGestureLog.INSTANCE.addLog( + new ActiveGestureLog.CompoundString("Current running task package name=") + .append(packageName)); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, "Current running task package name=%s", packageName); + } + + public static void logSysuiStateFlags(@NonNull String stateFlags) { + ActiveGestureLog.INSTANCE.addLog( + new ActiveGestureLog.CompoundString("Current SystemUi state flags=") + .append(stateFlags)); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, "Current SystemUi state flags=%s", stateFlags); + } + + public static void logSetInputConsumer(@NonNull String consumerName, @NonNull String reason) { + ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString("setInputConsumer: ") + .append(consumerName) + .append(". reason(s):") + .append(reason)); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, + "setInputConsumer: %s. reason(s):%s", consumerName, reason); + } + + public static void logUpdateGestureStateRunningTask( + @NonNull String otherTaskPackage, @NonNull String runningTaskPackage) { + ActiveGestureLog.INSTANCE.addLog( + new ActiveGestureLog.CompoundString("Changing active task to ") + .append(otherTaskPackage) + .append(" because the previous task running on top of this one (") + .append(runningTaskPackage) + .append(") was excluded from recents")); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, + "Changing active task to %s because the previous task running on top of this " + + "one (%s) was excluded from recents", + otherTaskPackage, + runningTaskPackage); + } + + public static void logOnInputEventActionUp( + int x, int y, int action, @NonNull String classification) { + String actionString = MotionEvent.actionToString(action); + ActiveGestureLog.INSTANCE.addLog( + new ActiveGestureLog.CompoundString("onMotionEvent(") + .append(x) + .append(", ") + .append(y) + .append("): ") + .append(actionString) + .append(", ") + .append(classification), + /* gestureEvent= */ action == ACTION_DOWN + ? MOTION_DOWN + : MOTION_UP); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, + "onMotionEvent(%d, %d): %s, %s", x, y, actionString, classification); + } + + public static void logOnInputEventActionMove( + @NonNull String action, @NonNull String classification, int pointerCount) { + ActiveGestureLog.INSTANCE.addLog( + new ActiveGestureLog.CompoundString("onMotionEvent: ") + .append(action) + .append(",") + .append(classification) + .append(", pointerCount: ") + .append(pointerCount), + MOTION_MOVE); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, + "onMotionEvent: %s, %s, pointerCount: %d", action, classification, pointerCount); + } + + public static void logOnInputEventGenericAction( + @NonNull String action, @NonNull String classification) { + ActiveGestureLog.INSTANCE.addLog( + new ActiveGestureLog.CompoundString("onMotionEvent: ") + .append(action) + .append(",") + .append(classification)); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, "onMotionEvent: %s, %s", action, classification); + } + + public static void logOnInputEventNavModeSwitched( + @NonNull String startNavMode, @NonNull String currentNavMode) { + ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString("TIS.onInputEvent: ") + .append("Navigation mode switched mid-gesture (") + .append(startNavMode) + .append(" -> ") + .append(currentNavMode) + .append("); cancelling gesture."), + NAVIGATION_MODE_SWITCHED); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, + "TIS.onInputEvent: Navigation mode switched mid-gesture (%s -> %s); " + + "cancelling gesture.", + startNavMode, + currentNavMode); + } + + public static void logUnknownInputEvent(@NonNull String event) { + ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString("TIS.onInputEvent: ") + .append("Cannot process input event: received unknown event ") + .append(event)); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, + "TIS.onInputEvent: Cannot process input event: received unknown event %s", event); + + } + + public static void logFinishRunningRecentsAnimation(boolean toHome) { + ActiveGestureLog.INSTANCE.addLog( + /* event= */ "finishRunningRecentsAnimation", toHome); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, "finishRunningRecentsAnimation: %b", toHome); + + } + + public static void logOnRecentsAnimationStartCancelled() { + ActiveGestureLog.INSTANCE.addLog( + /* event= */ "RecentsAnimationCallbacks.onAnimationStart (canceled)", + /* extras= */ 0, + /* gestureEvent= */ ON_START_RECENTS_ANIMATION); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, "RecentsAnimationCallbacks.onAnimationStart (canceled): 0"); + + } + + public static void logOnRecentsAnimationStart(int appCount) { + ActiveGestureLog.INSTANCE.addLog( + /* event= */ "RecentsAnimationCallbacks.onAnimationStart", + /* extras= */ appCount, + /* gestureEvent= */ ON_START_RECENTS_ANIMATION); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, + "RecentsAnimationCallbacks.onAnimationStart (canceled): %d", appCount); + + } + + public static void logStartRecentsAnimationCallback(@NonNull String callback) { + ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( + "TaskAnimationManager.startRecentsAnimation(") + .append(callback) + .append("): ") + .append("Setting mRecentsAnimationStartPending = false")); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, + "TaskAnimationManager.startRecentsAnimation(%s): " + + "Setting mRecentsAnimationStartPending = false", + callback); + + } + + public static void logSettingRecentsAnimationStartPending(boolean value) { + ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( + "TaskAnimationManager.startRecentsAnimation: ") + .append("Setting mRecentsAnimationStartPending = ") + .append(value)); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, + "TaskAnimationManager.startRecentsAnimation: " + + "Setting mRecentsAnimationStartPending = %b", + value); + + } + + public static void logLaunchingSideTask(int taskId) { + ActiveGestureLog.INSTANCE.addLog( + new ActiveGestureLog.CompoundString("Launching side task id=") + .append(taskId)); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, "Launching side task id=", taskId); + + } + + public static void logDynamicString(@NonNull String string) { + logDynamicString(string, null); + } + + public static void logDynamicString( + @NonNull String string, + @Nullable ActiveGestureErrorDetector.GestureEvent gestureEvent) { + ActiveGestureLog.INSTANCE.addLog(string, gestureEvent); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, "%s", string); + } + + public static void logOnSettledOnEndTarget(@NonNull String endTarget) { + ActiveGestureLog.INSTANCE.addLog( + new ActiveGestureLog.CompoundString("onSettledOnEndTarget ") + .append(endTarget), + /* gestureEvent= */ ON_SETTLED_ON_END_TARGET); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, "onSettledOnEndTarget %s", endTarget); + } + + public static void logOnCalculateEndTarget(float velocityX, float velocityY, double angle) { + ActiveGestureLog.INSTANCE.addLog( + new ActiveGestureLog.CompoundString("calculateEndTarget: velocities=(x=") + .append(velocityX) + .append("dp/ms, y=") + .append(velocityY) + .append("dp/ms), angle=") + .append(angle), + velocityX == 0 && velocityY == 0 ? INVALID_VELOCITY_ON_SWIPE_UP : null); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, + "calculateEndTarget: velocities=(x=%fdp/ms, y=%fdp/ms), angle=%f", + velocityX, + velocityY, + angle); + } + + public static void logUnexpectedTaskAppeared(int taskId, @NonNull String packageName) { + ActiveGestureLog.INSTANCE.addLog( + new ActiveGestureLog.CompoundString("Forcefully finishing recents animation: ") + .append("Unexpected task appeared id=") + .append(taskId) + .append(" pkg=") + .append(packageName)); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, + "Forcefully finishing recents animation: Unexpected task appeared id=%d, pkg=%s", + taskId, + packageName); + } +}