From 688bc453cd059353260f5c658db1b3bd9cb236a2 Mon Sep 17 00:00:00 2001 From: Schneider Victor-Tulias Date: Sat, 21 Sep 2024 11:22:10 -0400 Subject: [PATCH] Refactor CompoundString to use a string-format API matching ProtoLog Flag: com.android.launcher3.enable_active_gesture_proto_log Bug: 293182501 Test: checked TIS logs Change-Id: I6728697f659ed3617169a41e524ab93a587b6e75 --- .../android/quickstep/AbsSwipeUpHandler.java | 37 ++- .../quickstep/TouchInteractionService.java | 251 ++++++++--------- .../quickstep/util/MotionPauseDetector.java | 39 ++- .../quickstep/util/ActiveGestureLog.java | 104 ++----- .../util/ActiveGestureProtoLogProxy.java | 264 ++++++++---------- 5 files changed, 286 insertions(+), 409 deletions(-) diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java index 864328f883..9ad6b30352 100644 --- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java +++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java @@ -1201,11 +1201,9 @@ public abstract class AbsSwipeUpHandler< failureReason.append("STATE_START_NEW_TASK was never set"); } else { TaskInfo taskInfo = appearedTaskTargets[0].taskInfo; - failureReason.append("Unexpected task appeared") - .append(" id=") - .append(taskInfo.taskId) - .append(" pkg=") - .append(taskInfo.baseIntent.getComponent().getPackageName()); + failureReason.append("Unexpected task appeared id=%d, pkg=%s", + taskInfo.taskId, + taskInfo.baseIntent.getComponent().getPackageName()); } return false; } @@ -2274,18 +2272,15 @@ public abstract class AbsSwipeUpHandler< TaskView nextTask = mRecentsView == null ? null : mRecentsView.getNextPageTaskView(); if (nextTask != null) { int[] taskIds = nextTask.getTaskIds(); - ActiveGestureLog.CompoundString nextTaskLog = new ActiveGestureLog.CompoundString( - "Launching task: "); + ActiveGestureLog.CompoundString nextTaskLog = + ActiveGestureLog.CompoundString.newEmptyString(); for (TaskContainer container : nextTask.getTaskContainers()) { if (container == null) { continue; } - nextTaskLog - .append("[id: ") - .append(container.getTask().key.id) - .append(", pkg: ") - .append(container.getTask().key.getPackageName()) - .append("] | "); + nextTaskLog.append("[id: %d, pkg: %s] | ", + container.getTask().key.id, + container.getTask().key.getPackageName()); } mGestureState.updateLastStartedTaskIds(taskIds); boolean hasTaskPreviouslyAppeared = Arrays.stream(taskIds).anyMatch( @@ -2294,7 +2289,7 @@ public abstract class AbsSwipeUpHandler< if (!hasTaskPreviouslyAppeared) { ActiveGestureLog.INSTANCE.trackEvent(EXPECTING_TASK_APPEARED); } - ActiveGestureProtoLogProxy.logDynamicString(nextTaskLog.toString()); + ActiveGestureProtoLogProxy.logStartNewTask(nextTaskLog); nextTask.launchWithoutAnimation(true, success -> { resultCallback.accept(success); if (success) { @@ -2375,8 +2370,8 @@ public abstract class AbsSwipeUpHandler< ActiveGestureProtoLogProxy.logAbsSwipeUpHandlerOnTasksAppeared(); mStateCallback.setStateOnUiThread(STATE_GESTURE_CANCELLED | STATE_HANDLER_INVALIDATED); }; - ActiveGestureLog.CompoundString forceFinishReason = new ActiveGestureLog.CompoundString( - "Forcefully finishing recents animation: "); + ActiveGestureLog.CompoundString forceFinishReason = + ActiveGestureLog.CompoundString.newEmptyString(); if (!mStateCallback.hasStates(STATE_GESTURE_COMPLETED) && !hasStartedTaskBefore(appearedTaskTargets)) { // This is a special case, if a task is started mid-gesture that wasn't a part of a @@ -2390,10 +2385,10 @@ public abstract class AbsSwipeUpHandler< return; } ActiveGestureLog.CompoundString handleTaskFailureReason = - new ActiveGestureLog.CompoundString("handleTaskAppeared check failed: "); + ActiveGestureLog.CompoundString.newEmptyString(); if (!handleTaskAppeared(appearedTaskTargets, handleTaskFailureReason)) { forceFinishReason.append(handleTaskFailureReason); - ActiveGestureProtoLogProxy.logDynamicString(forceFinishReason.toString()); + ActiveGestureProtoLogProxy.logHandleTaskAppearedFailed(forceFinishReason); finishRecentsAnimationOnTasksAppeared(onFinishComplete); return; } @@ -2402,7 +2397,7 @@ public abstract class AbsSwipeUpHandler< .toArray(RemoteAnimationTarget[]::new); if (taskTargets.length == 0) { forceFinishReason.append("No appeared task matching started task id"); - ActiveGestureProtoLogProxy.logDynamicString(forceFinishReason.toString()); + ActiveGestureProtoLogProxy.logHandleTaskAppearedFailed(forceFinishReason); finishRecentsAnimationOnTasksAppeared(onFinishComplete); return; } @@ -2412,13 +2407,13 @@ public abstract class AbsSwipeUpHandler< if (taskView == null || taskView.getTaskContainers().stream().noneMatch( TaskContainer::getShouldShowSplashView)) { forceFinishReason.append("Splash not needed"); - ActiveGestureProtoLogProxy.logDynamicString(forceFinishReason.toString()); + ActiveGestureProtoLogProxy.logHandleTaskAppearedFailed(forceFinishReason); finishRecentsAnimationOnTasksAppeared(onFinishComplete); return; } if (mContainer == null) { forceFinishReason.append("Activity destroyed"); - ActiveGestureProtoLogProxy.logDynamicString(forceFinishReason.toString()); + ActiveGestureProtoLogProxy.logHandleTaskAppearedFailed(forceFinishReason); finishRecentsAnimationOnTasksAppeared(onFinishComplete); return; } diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java index 18b7678c5d..f0943dc798 100644 --- a/quickstep/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java @@ -911,7 +911,7 @@ public class TouchInteractionService extends Service { SafeCloseable traceToken = TraceHelper.INSTANCE.allowIpcs("TIS.onInputEvent"); CompoundString reasonString = action == ACTION_DOWN - ? new CompoundString("TIS.onMotionEvent: ") : CompoundString.NO_OP; + ? CompoundString.newEmptyString() : CompoundString.NO_OP; if (action == ACTION_DOWN || isHoverActionWithoutConsumer) { mRotationTouchHelper.setOrientationTransformIfNeeded(event); @@ -929,22 +929,22 @@ public class TouchInteractionService extends Service { reasonString.append("in three button mode which supports Assistant gesture"); // Consume gesture event for Assistant (all other gestures should do nothing). if (mDeviceState.canTriggerAssistantAction(event)) { - reasonString.append(" and event can trigger assistant action") - .append(", consuming gesture for assistant action"); + reasonString.append(" and event can trigger assistant action, " + + "consuming gesture for assistant action"); mGestureState = createGestureState(mGestureState, getTrackpadGestureType(event)); mUncheckedConsumer = tryCreateAssistantInputConsumer(mGestureState, event); } else { - reasonString.append(" but event cannot trigger Assistant") - .append(", consuming gesture as no-op"); + reasonString.append(" but event cannot trigger Assistant, " + + "consuming gesture as no-op"); mUncheckedConsumer = InputConsumer.NO_OP; } } else if ((!isOneHandedModeActive && isInSwipeUpTouchRegion) || isHoverActionWithoutConsumer || isOnBubbles) { reasonString.append(!isOneHandedModeActive && isInSwipeUpTouchRegion - ? "one handed mode is not active and event is in swipe up region" - : "isHoverActionWithoutConsumer == true") - .append(", creating new input consumer"); + ? "one handed mode is not active and event is in swipe up region, " + + "creating new input consumer" + : "isHoverActionWithoutConsumer == true, creating new input consumer"); // Clone the previous gesture state since onConsumerAboutToBeSwitched might trigger // onConsumerInactive and wipe the previous gesture state GestureState prevGestureState = new GestureState(mGestureState); @@ -957,18 +957,18 @@ public class TouchInteractionService extends Service { } else if ((mDeviceState.isFullyGesturalNavMode() || isTrackpadMultiFingerSwipe(event)) && mDeviceState.canTriggerAssistantAction(event)) { reasonString.append(mDeviceState.isFullyGesturalNavMode() - ? "using fully gestural nav" - : "event is a trackpad multi-finger swipe") - .append(" and event can trigger assistant action") - .append(", consuming gesture for assistant action"); + ? "using fully gestural nav and event can trigger assistant action, " + + "consuming gesture for assistant action" + : "event is a trackpad multi-finger swipe and event can trigger assistant " + + "action, consuming gesture for assistant action"); mGestureState = createGestureState(mGestureState, getTrackpadGestureType(event)); // Do not change mConsumer as if there is an ongoing QuickSwitch gesture, we // should not interrupt it. QuickSwitch assumes that interruption can only // happen if the next gesture is also quick switch. mUncheckedConsumer = tryCreateAssistantInputConsumer(mGestureState, event); } else if (mDeviceState.canTriggerOneHandedAction(event)) { - reasonString.append("event can trigger one-handed action") - .append(", consuming gesture for one-handed action"); + reasonString.append("event can trigger one-handed action, " + + "consuming gesture for one-handed action"); // Consume gesture event for triggering one handed feature. mUncheckedConsumer = new OneHandedModeInputConsumer(this, mDeviceState, InputConsumer.NO_OP, mInputMonitorCompat); @@ -986,7 +986,7 @@ public class TouchInteractionService extends Service { if (mUncheckedConsumer != InputConsumer.NO_OP) { switch (action) { case ACTION_DOWN: - ActiveGestureProtoLogProxy.logDynamicString(reasonString.toString()); + ActiveGestureProtoLogProxy.logOnInputEventActionDown(reasonString); // fall through case ACTION_UP: ActiveGestureProtoLogProxy.logOnInputEventActionUp( @@ -1059,11 +1059,11 @@ public class TouchInteractionService extends Service { MotionEvent motionEvent, CompoundString reasonString) { if (mDeviceState.isGestureBlockedTask(gestureState.getRunningTask())) { - reasonString.append(SUBSTRING_PREFIX) - .append("is gesture-blocked task, using base input consumer"); + reasonString.append( + "%sis gesture-blocked task, using base input consumer", SUBSTRING_PREFIX); return base; } else { - reasonString.append(SUBSTRING_PREFIX).append("using AssistantInputConsumer"); + reasonString.append("%susing AssistantInputConsumer", SUBSTRING_PREFIX); return new AssistantInputConsumer( this, gestureState, base, mInputMonitorCompat, mDeviceState, motionEvent); } @@ -1132,12 +1132,11 @@ public class TouchInteractionService extends Service { // This handles apps launched in direct boot mode (e.g. dialer) as well as apps // launched while device is locked even after exiting direct boot mode (e.g. camera). consumer = createDeviceLockedInputConsumer( - newGestureState, reasonString.append(SUBSTRING_PREFIX) - .append("can start system gesture")); + newGestureState, + reasonString.append("%scan start system gesture", SUBSTRING_PREFIX)); } else { consumer = getDefaultInputConsumer( - reasonString.append(SUBSTRING_PREFIX) - .append("cannot start system gesture")); + reasonString.append("%scannot start system gesture", SUBSTRING_PREFIX)); } logInputConsumerSelectionReason(consumer, reasonString); return consumer; @@ -1149,13 +1148,12 @@ public class TouchInteractionService extends Service { // a followup gesture and the first gesture started in a valid system state. if (canStartSystemGesture || previousGestureState.isRecentsAnimationRunning()) { reasonString = newCompoundString(canStartSystemGesture - ? "can start system gesture" : "recents animation was running") - .append(", trying to use base consumer"); + ? "can start system gesture, trying to use base consumer" + : "recents animation was running, trying to use base consumer"); base = newBaseConsumer(previousGestureState, newGestureState, event, reasonString); } else { - reasonString = newCompoundString( - "cannot start system gesture and recents animation was not running") - .append(", trying to use default input consumer"); + reasonString = newCompoundString("cannot start system gesture and recents " + + "animation was not running, trying to use default input consumer"); base = getDefaultInputConsumer(reasonString); } if (mDeviceState.isGesturalNavMode() || newGestureState.isTrackpadGesture()) { @@ -1165,11 +1163,11 @@ public class TouchInteractionService extends Service { String reasonPrefix = "device is in gesture navigation mode or 3-button mode with a trackpad gesture"; if (mDeviceState.canTriggerAssistantAction(event)) { - reasonString.append(NEWLINE_PREFIX) - .append(reasonPrefix) - .append(SUBSTRING_PREFIX) - .append("gesture can trigger the assistant") - .append(", trying to use assistant input consumer"); + reasonString.append("%s%s%sgesture can trigger the assistant, " + + "trying to use assistant input consumer", + NEWLINE_PREFIX, + reasonPrefix, + SUBSTRING_PREFIX); base = tryCreateAssistantInputConsumer(base, newGestureState, event, reasonString); } @@ -1180,11 +1178,11 @@ public class TouchInteractionService extends Service { && !tac.isPhoneMode() && !tac.isInStashedLauncherState(); if (canStartSystemGesture && useTaskbarConsumer) { - reasonString.append(NEWLINE_PREFIX) - .append(reasonPrefix) - .append(SUBSTRING_PREFIX) - .append("TaskbarActivityContext != null, ") - .append("using TaskbarUnstashInputConsumer"); + reasonString.append("%s%s%sTaskbarActivityContext != null, " + + "using TaskbarUnstashInputConsumer", + NEWLINE_PREFIX, + reasonPrefix, + SUBSTRING_PREFIX); base = new TaskbarUnstashInputConsumer(this, base, mInputMonitorCompat, tac, mOverviewCommandHelper, mGestureState); } @@ -1193,9 +1191,9 @@ public class TouchInteractionService extends Service { // Create bubbles input consumer before NavHandleLongPressInputConsumer. // This allows for nav handle to fall back to bubbles. if (mDeviceState.isBubblesExpanded()) { - reasonString = newCompoundString(reasonPrefix) - .append(SUBSTRING_PREFIX) - .append("bubbles expanded, trying to use default input consumer"); + reasonString = newCompoundString(reasonPrefix).append( + "%sbubbles expanded, trying to use default input consumer", + SUBSTRING_PREFIX); // Bubbles can handle home gesture itself. base = getDefaultInputConsumer(reasonString); } @@ -1206,10 +1204,10 @@ public class TouchInteractionService extends Service { if (canStartSystemGesture && !previousGestureState.isRecentsAnimationRunning() && navHandle.canNavHandleBeLongPressed() && !ignoreThreeFingerTrackpadForNavHandleLongPress(mGestureState)) { - reasonString.append(NEWLINE_PREFIX) - .append(reasonPrefix) - .append(SUBSTRING_PREFIX) - .append("Not running recents animation, "); + reasonString.append("%s%s%sNot running recents animation, ", + NEWLINE_PREFIX, + reasonPrefix, + SUBSTRING_PREFIX); if (tac != null && tac.getNavHandle().canNavHandleBeLongPressed()) { reasonString.append("stashed handle is long-pressable, "); } @@ -1221,74 +1219,74 @@ public class TouchInteractionService extends Service { if (!enableBubblesLongPressNavHandle()) { // Continue overriding nav handle input consumer with bubbles if (mDeviceState.isBubblesExpanded()) { - reasonString = newCompoundString(reasonPrefix) - .append(SUBSTRING_PREFIX) - .append("bubbles expanded, trying to use default input consumer"); + reasonString = newCompoundString(reasonPrefix).append( + "%sbubbles expanded, trying to use default input consumer", + SUBSTRING_PREFIX); // Bubbles can handle home gesture itself. base = getDefaultInputConsumer(reasonString); } } if (mDeviceState.isSystemUiDialogShowing()) { - reasonString = newCompoundString(reasonPrefix) - .append(SUBSTRING_PREFIX) - .append("system dialog is showing, using SysUiOverlayInputConsumer"); + reasonString = newCompoundString(reasonPrefix).append( + "%ssystem dialog is showing, using SysUiOverlayInputConsumer", + SUBSTRING_PREFIX); base = new SysUiOverlayInputConsumer( getBaseContext(), mDeviceState, mInputMonitorCompat); } if (mGestureState.isTrackpadGesture() && canStartSystemGesture && !previousGestureState.isRecentsAnimationRunning()) { - reasonString = newCompoundString(reasonPrefix) - .append(SUBSTRING_PREFIX) - .append("Trackpad 3-finger gesture, using TrackpadStatusBarInputConsumer"); + reasonString = newCompoundString(reasonPrefix).append( + "%sTrackpad 3-finger gesture, using TrackpadStatusBarInputConsumer", + SUBSTRING_PREFIX); base = new TrackpadStatusBarInputConsumer(getBaseContext(), base, mInputMonitorCompat); } if (mDeviceState.isScreenPinningActive()) { - reasonString = newCompoundString(reasonPrefix) - .append(SUBSTRING_PREFIX) - .append("screen pinning is active, using ScreenPinnedInputConsumer"); + reasonString = newCompoundString(reasonPrefix).append( + "%sscreen pinning is active, using ScreenPinnedInputConsumer", + SUBSTRING_PREFIX); // Note: we only allow accessibility to wrap this, and it replaces the previous // base input consumer (which should be NO_OP anyway since topTaskLocked == true). base = new ScreenPinnedInputConsumer(this, newGestureState); } if (mDeviceState.canTriggerOneHandedAction(event)) { - reasonString.append(NEWLINE_PREFIX) - .append(reasonPrefix) - .append(SUBSTRING_PREFIX) - .append("gesture can trigger one handed mode") - .append(", using OneHandedModeInputConsumer"); + reasonString.append("%s%s%sgesture can trigger one handed mode, " + + "using OneHandedModeInputConsumer", + NEWLINE_PREFIX, + reasonPrefix, + SUBSTRING_PREFIX); base = new OneHandedModeInputConsumer( this, mDeviceState, base, mInputMonitorCompat); } if (mDeviceState.isAccessibilityMenuAvailable()) { - reasonString.append(NEWLINE_PREFIX) - .append(reasonPrefix) - .append(SUBSTRING_PREFIX) - .append("accessibility menu is available") - .append(", using AccessibilityInputConsumer"); + reasonString.append( + "%s%s%saccessibility menu is available, using AccessibilityInputConsumer", + NEWLINE_PREFIX, + reasonPrefix, + SUBSTRING_PREFIX); base = new AccessibilityInputConsumer( this, mDeviceState, mGestureState, base, mInputMonitorCompat); } } else { String reasonPrefix = "device is not in gesture navigation mode"; if (mDeviceState.isScreenPinningActive()) { - reasonString = newCompoundString(reasonPrefix) - .append(SUBSTRING_PREFIX) - .append("screen pinning is active, trying to use default input consumer"); + reasonString = newCompoundString(reasonPrefix).append( + "%sscreen pinning is active, trying to use default input consumer", + SUBSTRING_PREFIX); base = getDefaultInputConsumer(reasonString); } if (mDeviceState.canTriggerOneHandedAction(event)) { - reasonString.append(NEWLINE_PREFIX) - .append(reasonPrefix) - .append(SUBSTRING_PREFIX) - .append("gesture can trigger one handed mode") - .append(", using OneHandedModeInputConsumer"); + reasonString.append("%s%s%sgesture can trigger one handed mode, " + + "using OneHandedModeInputConsumer", + NEWLINE_PREFIX, + reasonPrefix, + SUBSTRING_PREFIX); base = new OneHandedModeInputConsumer( this, mDeviceState, base, mInputMonitorCompat); } @@ -1298,7 +1296,7 @@ public class TouchInteractionService extends Service { } private CompoundString newCompoundString(String substring) { - return new CompoundString(NEWLINE_PREFIX).append(substring); + return new CompoundString("%s%s", NEWLINE_PREFIX, substring); } private boolean ignoreThreeFingerTrackpadForNavHandleLongPress(GestureState gestureState) { @@ -1325,14 +1323,12 @@ public class TouchInteractionService extends Service { CompoundString reasonString) { if (mDeviceState.isKeyguardShowingOccluded()) { // This handles apps showing over the lockscreen (e.g. camera) - return createDeviceLockedInputConsumer( - gestureState, - reasonString.append(SUBSTRING_PREFIX) - .append("keyguard is showing occluded") - .append(", trying to use device locked input consumer")); + return createDeviceLockedInputConsumer(gestureState, reasonString.append( + "%skeyguard is showing occluded, trying to use device locked input consumer", + SUBSTRING_PREFIX)); } - reasonString.append(SUBSTRING_PREFIX).append("keyguard is not showing occluded"); + reasonString.append("%skeyguard is not showing occluded", SUBSTRING_PREFIX); TopTaskTracker.CachedTaskInfo runningTask = gestureState.getRunningTask(); // Use overview input consumer for sharesheets on top of home. @@ -1373,11 +1369,12 @@ public class TouchInteractionService extends Service { gestureState, event, forceOverviewInputConsumer, - reasonString.append(SUBSTRING_PREFIX) - .append("is in live tile mode, trying to use overview input consumer")); + reasonString.append( + "%sis in live tile mode, trying to use overview input consumer", + SUBSTRING_PREFIX)); } else if (runningTask == null) { - return getDefaultInputConsumer(reasonString.append(SUBSTRING_PREFIX) - .append("running task == null")); + return getDefaultInputConsumer(reasonString.append( + "%srunning task == null", SUBSTRING_PREFIX)); } else if (previousGestureAnimatedToLauncher || launcherResumedThroughShellTransition || forceOverviewInputConsumer) { @@ -1386,21 +1383,22 @@ public class TouchInteractionService extends Service { gestureState, event, forceOverviewInputConsumer, - reasonString.append(SUBSTRING_PREFIX) - .append(previousGestureAnimatedToLauncher - ? "previous gesture animated to launcher" + reasonString.append(previousGestureAnimatedToLauncher + ? "%sprevious gesture animated to launcher, " + + "trying to use overview input consumer" : (launcherResumedThroughShellTransition - ? "launcher resumed through a shell transition" - : "forceOverviewInputConsumer == true")) - .append(", trying to use overview input consumer")); + ? "%slauncher resumed through a shell transition, " + + "trying to use overview input consumer" + : "%sforceOverviewInputConsumer == true, " + + "trying to use overview input consumer"), + SUBSTRING_PREFIX)); } else if (mDeviceState.isGestureBlockedTask(runningTask) || launcherChildActivityResumed) { - return getDefaultInputConsumer(reasonString.append(SUBSTRING_PREFIX) - .append(launcherChildActivityResumed - ? "is launcher child-task, trying to use default input consumer" - : "is gesture-blocked task, trying to use default input consumer")); + return getDefaultInputConsumer(reasonString.append(launcherChildActivityResumed + ? "%sis launcher child-task, trying to use default input consumer" + : "%sis gesture-blocked task, trying to use default input consumer", + SUBSTRING_PREFIX)); } else { - reasonString.append(SUBSTRING_PREFIX) - .append("using OtherActivityInputConsumer"); + reasonString.append("%susing OtherActivityInputConsumer", SUBSTRING_PREFIX); return createOtherActivityInputConsumer(gestureState, event); } } @@ -1427,20 +1425,18 @@ public class TouchInteractionService extends Service { GestureState gestureState, CompoundString reasonString) { if ((mDeviceState.isFullyGesturalNavMode() || gestureState.isTrackpadGesture()) && gestureState.getRunningTask() != null) { - reasonString.append(SUBSTRING_PREFIX) - .append("device is in gesture nav mode or 3-button mode with a trackpad") - .append(" gesture and running task != null") - .append(", using DeviceLockedInputConsumer"); + reasonString.append("%sdevice is in gesture nav mode or 3-button mode with a trackpad " + + "gesture and running task != null, using DeviceLockedInputConsumer", + SUBSTRING_PREFIX); return new DeviceLockedInputConsumer( this, mDeviceState, mTaskAnimationManager, gestureState, mInputMonitorCompat); } else { - return getDefaultInputConsumer(reasonString - .append(SUBSTRING_PREFIX) - .append((mDeviceState.isFullyGesturalNavMode() - || gestureState.isTrackpadGesture()) - ? "running task == null" - : "device is not in gesture nav mode and it's not a trackpad gesture") - .append(", trying to use default input consumer")); + return getDefaultInputConsumer(reasonString.append( + mDeviceState.isFullyGesturalNavMode() || gestureState.isTrackpadGesture() + ? "%srunning task == null, trying to use default input consumer" + : "%sdevice is not in gesture nav mode and it's not a trackpad gesture," + + " trying to use default input consumer", + SUBSTRING_PREFIX)); } } @@ -1452,9 +1448,8 @@ public class TouchInteractionService extends Service { CompoundString reasonString) { RecentsViewContainer container = gestureState.getContainerInterface().getCreatedContainer(); if (container == null) { - return getDefaultInputConsumer( - reasonString.append(SUBSTRING_PREFIX) - .append("activity == null, trying to use default input consumer")); + return getDefaultInputConsumer(reasonString.append( + "%sactivity == null, trying to use default input consumer", SUBSTRING_PREFIX)); } View rootview = container.getRootView(); @@ -1464,24 +1459,24 @@ public class TouchInteractionService extends Service { || mDeviceState.isPredictiveBackToHomeInProgress(); boolean isInLiveTileMode = gestureState.getContainerInterface().isInLiveTileMode(); - reasonString.append(SUBSTRING_PREFIX) - .append(hasWindowFocus - ? "activity has window focus" - : (isPreviousGestureAnimatingToLauncher - ? "previous gesture is still animating to launcher" - : isInLiveTileMode - ? "device is in live mode" - : "all overview focus conditions failed")); + reasonString.append(hasWindowFocus + ? "%sactivity has window focus" + : (isPreviousGestureAnimatingToLauncher + ? "%sprevious gesture is still animating to launcher" + : isInLiveTileMode + ? "%sdevice is in live mode" + : "%sall overview focus conditions failed"), SUBSTRING_PREFIX); if (hasWindowFocus || isPreviousGestureAnimatingToLauncher || isInLiveTileMode) { - reasonString.append(SUBSTRING_PREFIX) - .append("overview should have focus, using OverviewInputConsumer"); + reasonString.append( + "%soverview should have focus, using OverviewInputConsumer", SUBSTRING_PREFIX); return new OverviewInputConsumer(gestureState, container, mInputMonitorCompat, false /* startingInActivityBounds */); } else { - reasonString.append(SUBSTRING_PREFIX).append( - "overview shouldn't have focus, using OverviewWithoutFocusInputConsumer"); + reasonString.append( + "%soverview shouldn't have focus, using OverviewWithoutFocusInputConsumer", + SUBSTRING_PREFIX); final boolean disableHorizontalSwipe = mDeviceState.isInExclusionRegion(event); return new OverviewWithoutFocusInputConsumer(container.asContext(), mDeviceState, gestureState, mInputMonitorCompat, disableHorizontalSwipe); @@ -1518,12 +1513,14 @@ public class TouchInteractionService extends Service { */ private @NonNull InputConsumer getDefaultInputConsumer(@NonNull CompoundString reasonString) { if (mResetGestureInputConsumer != null) { - reasonString.append(SUBSTRING_PREFIX).append( - "mResetGestureInputConsumer initialized, using ResetGestureInputConsumer"); + reasonString.append( + "%smResetGestureInputConsumer initialized, using ResetGestureInputConsumer", + SUBSTRING_PREFIX); return mResetGestureInputConsumer; } else { - reasonString.append(SUBSTRING_PREFIX).append( - "mResetGestureInputConsumer not initialized, using no-op input consumer"); + reasonString.append( + "%smResetGestureInputConsumer not initialized, using no-op input consumer", + SUBSTRING_PREFIX); // mResetGestureInputConsumer isn't initialized until onUserUnlocked(), so reset to // NO_OP until then (we never want these to be null). return InputConsumer.NO_OP; diff --git a/quickstep/src/com/android/quickstep/util/MotionPauseDetector.java b/quickstep/src/com/android/quickstep/util/MotionPauseDetector.java index 4a9e0d8304..8762e86d98 100644 --- a/quickstep/src/com/android/quickstep/util/MotionPauseDetector.java +++ b/quickstep/src/com/android/quickstep/util/MotionPauseDetector.java @@ -98,10 +98,8 @@ public class MotionPauseDetector { mSpeedFast = res.getDimension(R.dimen.motion_pause_detector_speed_fast); mForcePauseTimeout = new Alarm(); mForcePauseTimeout.setOnAlarmListener(alarm -> { - ActiveGestureLog.CompoundString log = - new ActiveGestureLog.CompoundString("Force pause timeout after ") - .append(alarm.getLastSetTimeout()) - .append("ms"); + ActiveGestureLog.CompoundString log = new ActiveGestureLog.CompoundString( + "Force pause timeout after %dms", alarm.getLastSetTimeout()); addLogs(log); updatePaused(true /* isPaused */, log); }); @@ -124,9 +122,8 @@ public class MotionPauseDetector { * @param disallowPause If true, we will not detect any pauses until this is set to false again. */ public void setDisallowPause(boolean disallowPause) { - ActiveGestureLog.CompoundString log = - new ActiveGestureLog.CompoundString("Set disallowPause=") - .append(disallowPause); + ActiveGestureLog.CompoundString log = new ActiveGestureLog.CompoundString( + "Set disallowPause=%b", disallowPause); if (mDisallowPause != disallowPause) { addLogs(log); } @@ -188,8 +185,8 @@ public class MotionPauseDetector { speed < previousSpeed * getRapidDecelerationFactor(); isPaused = isRapidDeceleration && speed < mSpeedSomewhatFast; isPausedReason = new ActiveGestureLog.CompoundString( - "Didn't have back to back slow speeds, checking for rapid ") - .append(" deceleration on first pause only"); + "Didn't have back to back slow speeds, checking for rapid " + + " deceleration on first pause only"); } if (mMakePauseHarderToTrigger) { if (speed < mSpeedSlow) { @@ -198,8 +195,8 @@ public class MotionPauseDetector { } isPaused = time - mSlowStartTime >= HARDER_TRIGGER_TIMEOUT; isPausedReason = new ActiveGestureLog.CompoundString( - "Maintained slow speed for sufficient duration when making") - .append(" pause harder to trigger"); + "Maintained slow speed for sufficient duration when making" + + " pause harder to trigger"); } else { mSlowStartTime = 0; isPaused = false; @@ -215,17 +212,14 @@ public class MotionPauseDetector { private void updatePaused(boolean isPaused, ActiveGestureLog.CompoundString reason) { if (mDisallowPause) { reason = new ActiveGestureLog.CompoundString( - "Disallow pause; otherwise, would have been ") - .append(isPaused) - .append(" due to reason:") + "Disallow pause; otherwise, would have been %b due to reason: ", isPaused) .append(reason); isPaused = false; } if (mIsPaused != isPaused) { mIsPaused = isPaused; - addLogs(new ActiveGestureLog.CompoundString("onMotionPauseChanged triggered; paused=") - .append(mIsPaused) - .append(", reason=") + addLogs(new ActiveGestureLog.CompoundString( + "onMotionPauseChanged triggered; paused=%b, reason=", mIsPaused) .append(reason)); boolean isFirstDetectedPause = !mHasEverBeenPaused && mIsPaused; if (mIsPaused) { @@ -245,14 +239,13 @@ public class MotionPauseDetector { } } - private void addLogs(ActiveGestureLog.CompoundString compoundString) { - ActiveGestureLog.CompoundString logString = - new ActiveGestureLog.CompoundString("MotionPauseDetector: ") - .append(compoundString); + private void addLogs(ActiveGestureLog.CompoundString event) { if (Utilities.isRunningInTestHarness()) { - Log.d(TAG, logString.toString()); + Log.d(TAG, new ActiveGestureLog.CompoundString("MotionPauseDetector: ") + .append(event) + .toString()); } - ActiveGestureProtoLogProxy.logMotionPauseDetectorEvent(logString.toString()); + ActiveGestureProtoLogProxy.logMotionPauseDetectorEvent(event); } public void clear() { diff --git a/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureLog.java b/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureLog.java index 0eb6f88286..23e245c51a 100644 --- a/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureLog.java +++ b/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureLog.java @@ -21,6 +21,7 @@ import androidx.annotation.Nullable; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.List; @@ -70,14 +71,6 @@ public class ActiveGestureLog { addLog(event, null); } - public void addLog(@NonNull String event, int extras) { - addLog(event, extras, null); - } - - public void addLog(@NonNull String event, boolean extras) { - addLog(event, extras, null); - } - /** * Adds a log to be printed at log-dump-time and track the associated event for error detection. * @@ -88,20 +81,6 @@ public class ActiveGestureLog { addLog(new CompoundString(event), gestureEvent); } - public void addLog( - @NonNull String event, - int extras, - @Nullable ActiveGestureErrorDetector.GestureEvent gestureEvent) { - addLog(new CompoundString(event).append(": ").append(extras), gestureEvent); - } - - public void addLog( - @NonNull String event, - boolean extras, - @Nullable ActiveGestureErrorDetector.GestureEvent gestureEvent) { - addLog(new CompoundString(event).append(": ").append(extras), gestureEvent); - } - public void addLog(@NonNull CompoundString compoundString) { addLog(compoundString, null); } @@ -250,25 +229,27 @@ public class ActiveGestureLog { /** A buildable string stored as an array for memory efficiency. */ public static class CompoundString { - public static final CompoundString NO_OP = new CompoundString(); + public static final CompoundString NO_OP = new CompoundString(true); private final List mSubstrings; private final List mArgs; private final boolean mIsNoOp; - private CompoundString() { - this(null); + public static CompoundString newEmptyString() { + return new CompoundString(false); } - public CompoundString(String substring) { - mIsNoOp = substring == null; + private CompoundString(boolean isNoOp) { + mIsNoOp = isNoOp; mSubstrings = mIsNoOp ? null : new ArrayList<>(); mArgs = mIsNoOp ? null : new ArrayList<>(); + } - if (!mIsNoOp) { - mSubstrings.add(substring); - } + public CompoundString(String substring, Object... args) { + this(substring == null); + + append(substring, args); } public CompoundString append(CompoundString substring) { @@ -281,76 +262,24 @@ public class ActiveGestureLog { return this; } - public CompoundString append(String substring) { + public CompoundString append(String substring, Object... args) { if (mIsNoOp) { return this; } mSubstrings.add(substring); + mArgs.addAll(Arrays.stream(args).toList()); return this; } - public CompoundString append(int num) { - if (mIsNoOp) { - return this; - } - mArgs.add(num); - - return append("%d"); - } - - public CompoundString append(long num) { - if (mIsNoOp) { - return this; - } - mArgs.add(num); - - return append("%d"); - } - - public CompoundString append(float num) { - if (mIsNoOp) { - return this; - } - mArgs.add(num); - - return append("%.2f"); - } - - public CompoundString append(double num) { - if (mIsNoOp) { - return this; - } - mArgs.add(num); - - return append("%.2f"); - } - - public CompoundString append(boolean bool) { - if (mIsNoOp) { - return this; - } - mArgs.add(bool); - - return append("%b"); - } - - private Object[] getArgs() { - return mArgs.toArray(); - } - @Override public String toString() { - return String.format(toUnformattedString(), getArgs()); - } - - private String toUnformattedString() { + if (mIsNoOp) return null; StringBuilder sb = new StringBuilder(); for (String substring : mSubstrings) { sb.append(substring); } - - return sb.toString(); + return String.format(sb.toString(), mArgs.toArray()); } @Override @@ -360,10 +289,9 @@ public class ActiveGestureLog { @Override public boolean equals(Object obj) { - if (!(obj instanceof CompoundString)) { + if (!(obj instanceof CompoundString other)) { return false; } - CompoundString other = (CompoundString) obj; return (mIsNoOp == other.mIsNoOp) && Objects.equals(mSubstrings, other.mSubstrings) && Objects.equals(mArgs, other.mArgs); diff --git a/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java b/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java index 308eeb52fa..f43a125aa4 100644 --- a/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java +++ b/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java @@ -86,25 +86,20 @@ public class ActiveGestureProtoLogProxy { 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.")); + ActiveGestureLog.INSTANCE.addLog("AbsSwipeUpHandler.onTasksAppeared: " + + "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."); - + 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() { @@ -113,7 +108,6 @@ public class ActiveGestureProtoLogProxy { /* gestureEvent= */ ON_CANCEL_RECENTS_ANIMATION); if (!enableActiveGestureProtoLog()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "RecentsAnimationCallbacks.onAnimationCanceled"); - } public static void logRecentsAnimationCallbacksOnTasksAppeared() { @@ -121,7 +115,6 @@ public class ActiveGestureProtoLogProxy { ActiveGestureErrorDetector.GestureEvent.TASK_APPEARED); if (!enableActiveGestureProtoLog()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "RecentsAnimationCallbacks.onTasksAppeared"); - } public static void logStartRecentsAnimation() { @@ -130,21 +123,18 @@ public class ActiveGestureProtoLogProxy { /* 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() { @@ -152,46 +142,39 @@ public class ActiveGestureProtoLogProxy { /* 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")); + ActiveGestureLog.INSTANCE.addLog( + "TIS.onInputEvent: 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."), + ActiveGestureLog.INSTANCE.addLog("TIS.onMotionEvent: A new gesture has been started, " + + "but a previously-requested recents animation hasn't started. " + + "Ignoring all following 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."); + 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")); + ActiveGestureLog.INSTANCE.addLog("TIS.onInputEvent: Cannot process input event: " + + "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"); + 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() { @@ -226,31 +209,23 @@ public class ActiveGestureProtoLogProxy { } public static void logInputConsumerBecameActive(@NonNull String consumerName) { - ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString(consumerName) - .append(" became active")); + ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( + "%s became active", consumerName)); 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")); + ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( + "Launch failed, task (id=%d) finished mid transition", launchedTaskId)); 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); + ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( + "onPageEndTransition: current page index updated: %d", nextPageIndex)); if (!enableActiveGestureProtoLog()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "onPageEndTransition: current page index updated: %d", nextPageIndex); @@ -258,9 +233,8 @@ public class ActiveGestureProtoLogProxy { 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 case: The TaskView at index %d is missing.", + taskIndex), QUICK_SWITCH_FROM_HOME_FALLBACK); if (!enableActiveGestureProtoLog()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, @@ -270,9 +244,8 @@ public class ActiveGestureProtoLogProxy { 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: TaskViews at indices %d and 0 are missing.", + taskIndex), QUICK_SWITCH_FROM_HOME_FAILED); if (!enableActiveGestureProtoLog()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, @@ -281,50 +254,44 @@ public class ActiveGestureProtoLogProxy { } public static void logFinishRecentsAnimation(boolean toRecents) { - ActiveGestureLog.INSTANCE.addLog( - /* event= */ "finishRecentsAnimation", - /* extras= */ toRecents, + ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( + "finishRecentsAnimation: %b", 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); + ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( + "setEndTarget %s", 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)); + "OverviewComponentObserver.startHomeIntent: %s", 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)); + ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( + "Current running task package name=%s", 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)); + ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( + "Current SystemUi state flags=%s", 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)); + ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( + "setInputConsumer: %s. reason(s):%s", consumerName, reason)); if (!enableActiveGestureProtoLog()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "setInputConsumer: %s. reason(s):%s", consumerName, reason); @@ -332,12 +299,11 @@ public class ActiveGestureProtoLogProxy { 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")); + ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( + "Changing active task to %s because the previous task running on top of this " + + "one (%s) was excluded from recents", + otherTaskPackage, + runningTaskPackage)); if (!enableActiveGestureProtoLog()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "Changing active task to %s because the previous task running on top of this " @@ -349,15 +315,8 @@ public class ActiveGestureProtoLogProxy { 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), + ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( + "onMotionEvent(%d, %d): %s, %s", x, y, actionString, classification), /* gestureEvent= */ action == ACTION_DOWN ? MOTION_DOWN : MOTION_UP); @@ -368,13 +327,11 @@ public class ActiveGestureProtoLogProxy { 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), + ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( + "onMotionEvent: %s, %s, pointerCount: %d", + action, + classification, + pointerCount), MOTION_MOVE); if (!enableActiveGestureProtoLog()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, @@ -383,23 +340,19 @@ public class ActiveGestureProtoLogProxy { public static void logOnInputEventGenericAction( @NonNull String action, @NonNull String classification) { - ActiveGestureLog.INSTANCE.addLog( - new ActiveGestureLog.CompoundString("onMotionEvent: ") - .append(action) - .append(",") - .append(classification)); + ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( + "onMotionEvent: %s, %s", action, 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."), + ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( + "TIS.onInputEvent: Navigation mode switched mid-gesture (%s -> %s); " + + "cancelling gesture.", + startNavMode, + currentNavMode), NAVIGATION_MODE_SWITCHED); if (!enableActiveGestureProtoLog()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, @@ -410,84 +363,100 @@ public class ActiveGestureProtoLogProxy { } 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)); + ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( + "TIS.onInputEvent: Cannot process input event: received unknown event %s", 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); + ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( + "finishRunningRecentsAnimation: %b", 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, + ActiveGestureLog.INSTANCE.addLog("RecentsAnimationCallbacks.onAnimationStart (canceled): 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, + ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( + "RecentsAnimationCallbacks.onAnimationStart (canceled): %d", 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")); + "TaskAnimationManager.startRecentsAnimation(%s): " + + "Setting mRecentsAnimationStartPending = false", + callback)); 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)); + "TaskAnimationManager.startRecentsAnimation: " + + "Setting mRecentsAnimationStartPending = %b", + 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)); + ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( + "Launching side task id=%d", taskId)); if (!enableActiveGestureProtoLog()) return; - ProtoLog.d(ACTIVE_GESTURE_LOG, "Launching side task id=", taskId); - + ProtoLog.d(ACTIVE_GESTURE_LOG, "Launching side task id=%d", taskId); } - public static void logDynamicString(@NonNull String string) { - logDynamicString(string, null); + public static void logOnInputEventActionDown(@NonNull ActiveGestureLog.CompoundString reason) { + ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( + "TIS.onMotionEvent: ").append(reason)); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, "TIS.onMotionEvent: %s", reason.toString()); } + public static void logStartNewTask(@NonNull ActiveGestureLog.CompoundString tasks) { + ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( + "Launching task: ").append(tasks)); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, "TIS.onMotionEvent: %s", tasks.toString()); + } + + public static void logMotionPauseDetectorEvent(@NonNull ActiveGestureLog.CompoundString event) { + ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( + "MotionPauseDetector: ").append(event)); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, "MotionPauseDetector: %s", event.toString()); + } + + public static void logHandleTaskAppearedFailed( + @NonNull ActiveGestureLog.CompoundString reason) { + ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( + "handleTaskAppeared check failed: ").append(reason)); + if (!enableActiveGestureProtoLog()) return; + ProtoLog.d(ACTIVE_GESTURE_LOG, "handleTaskAppeared check failed: %s", reason.toString()); + } + + /** + * This is for special cases where the string is purely dynamic and therefore has no format that + * can be extracted. Do not use in any other case. + */ public static void logDynamicString( @NonNull String string, @Nullable ActiveGestureErrorDetector.GestureEvent gestureEvent) { @@ -497,22 +466,19 @@ public class ActiveGestureProtoLogProxy { } public static void logOnSettledOnEndTarget(@NonNull String endTarget) { - ActiveGestureLog.INSTANCE.addLog( - new ActiveGestureLog.CompoundString("onSettledOnEndTarget ") - .append(endTarget), + ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( + "onSettledOnEndTarget %s", 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), + ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( + "calculateEndTarget: velocities=(x=%fdp/ms, y=%fdp/ms), angle=%f", + velocityX, + velocityY, + angle), velocityX == 0 && velocityY == 0 ? INVALID_VELOCITY_ON_SWIPE_UP : null); if (!enableActiveGestureProtoLog()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, @@ -523,12 +489,10 @@ public class ActiveGestureProtoLogProxy { } 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)); + ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString( + "Forcefully finishing recents animation: Unexpected task appeared id=%d, pkg=%s", + taskId, + packageName)); if (!enableActiveGestureProtoLog()) return; ProtoLog.d(ACTIVE_GESTURE_LOG, "Forcefully finishing recents animation: Unexpected task appeared id=%d, pkg=%s",