diff options
4 files changed, 57 insertions, 11 deletions
diff --git a/core/java/com/android/internal/util/LatencyTracker.java b/core/java/com/android/internal/util/LatencyTracker.java index c120e67dfb0d..33794a59fa21 100644 --- a/core/java/com/android/internal/util/LatencyTracker.java +++ b/core/java/com/android/internal/util/LatencyTracker.java @@ -23,6 +23,7 @@ import static com.android.internal.util.FrameworkStatsLog.UIACTION_LATENCY_REPOR import static com.android.internal.util.FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_CHECK_CREDENTIAL; import static com.android.internal.util.FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_CHECK_CREDENTIAL_UNLOCKED; import static com.android.internal.util.FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_DESKTOP_MODE_ENTER_APP_HANDLE_DRAG; +import static com.android.internal.util.FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_DESKTOP_MODE_ENTER_APP_HANDLE_MENU; import static com.android.internal.util.FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_EXPAND_PANEL; import static com.android.internal.util.FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_FACE_WAKE_AND_UNLOCK; import static com.android.internal.util.FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_FINGERPRINT_WAKE_AND_UNLOCK; @@ -268,14 +269,27 @@ public class LatencyTracker { public static final int ACTION_SHADE_WINDOW_DISPLAY_CHANGE = 29; /** - * Applicable when the user drags a full screen app's handle into the desktop drop zone to enter - * desktop mode. This measure the time from when the user releases their finger in the drop zone - * to when the animation for entering desktop mode visually begins. During this period, the - * home task and app headers for each window are initialized. Both have historically been - * expensive. See b/381396057 and b/360452034 respectively. + * Time it takes for the "enter desktop" mode animation to begin when initiated by dragging the + * app's handle into the desktop drop zone. + * <p> + * This measure the time from when the user releases their finger in the drop zone to when the + * animation for entering desktop mode visually begins. During this period, the home task and + * app headers for each window are initialized. Both have historically been expensive. See + * b/381396057 and b/360452034 respectively. */ public static final int ACTION_DESKTOP_MODE_ENTER_APP_HANDLE_DRAG = 30; + /** + * Time it takes for the "enter desktop" mode animation to begin when initiated via the app + * handle's menu. + * <p> + * This measures the time from when the menu option is clicked/tapped to when the animation for + * entering desktop mode visually begins. During this period, the home task and app headers for + * each window are initialized. Both have historically been expensive. See b/381396057 and + * b/360452034 respectively. + */ + public static final int ACTION_DESKTOP_MODE_ENTER_APP_HANDLE_MENU = 31; + private static final int[] ACTIONS_ALL = { ACTION_EXPAND_PANEL, ACTION_TOGGLE_RECENTS, @@ -308,6 +322,7 @@ public class LatencyTracker { ACTION_KEYGUARD_FACE_UNLOCK_TO_HOME, ACTION_SHADE_WINDOW_DISPLAY_CHANGE, ACTION_DESKTOP_MODE_ENTER_APP_HANDLE_DRAG, + ACTION_DESKTOP_MODE_ENTER_APP_HANDLE_MENU, }; /** @hide */ @@ -343,6 +358,7 @@ public class LatencyTracker { ACTION_KEYGUARD_FACE_UNLOCK_TO_HOME, ACTION_SHADE_WINDOW_DISPLAY_CHANGE, ACTION_DESKTOP_MODE_ENTER_APP_HANDLE_DRAG, + ACTION_DESKTOP_MODE_ENTER_APP_HANDLE_MENU, }) @Retention(RetentionPolicy.SOURCE) public @interface Action {} @@ -380,6 +396,7 @@ public class LatencyTracker { UIACTION_LATENCY_REPORTED__ACTION__ACTION_KEYGUARD_FACE_UNLOCK_TO_HOME, UIACTION_LATENCY_REPORTED__ACTION__ACTION_SHADE_WINDOW_DISPLAY_CHANGE, UIACTION_LATENCY_REPORTED__ACTION__ACTION_DESKTOP_MODE_ENTER_APP_HANDLE_DRAG, + UIACTION_LATENCY_REPORTED__ACTION__ACTION_DESKTOP_MODE_ENTER_APP_HANDLE_MENU, }; private final Object mLock = new Object(); @@ -582,6 +599,8 @@ public class LatencyTracker { return "ACTION_SHADE_WINDOW_DISPLAY_CHANGE"; case UIACTION_LATENCY_REPORTED__ACTION__ACTION_DESKTOP_MODE_ENTER_APP_HANDLE_DRAG: return "ACTION_DESKTOP_MODE_ENTER_APP_HANDLE_DRAG"; + case UIACTION_LATENCY_REPORTED__ACTION__ACTION_DESKTOP_MODE_ENTER_APP_HANDLE_MENU: + return "ACTION_DESKTOP_MODE_ENTER_APP_HANDLE_MENU"; default: throw new IllegalArgumentException("Invalid action"); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java index 5d5e4d3ec758..59acdc574434 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java @@ -44,6 +44,7 @@ import androidx.annotation.OptIn; import com.android.internal.jank.InteractionJankMonitor; import com.android.internal.logging.UiEventLogger; import com.android.internal.statusbar.IStatusBarService; +import com.android.internal.util.LatencyTracker; import com.android.launcher3.icons.IconProvider; import com.android.window.flags.Flags; import com.android.wm.shell.RootTaskDisplayAreaOrganizer; @@ -1074,8 +1075,10 @@ public abstract class WMShellModule { static EnterDesktopTaskTransitionHandler provideEnterDesktopModeTaskTransitionHandler( Transitions transitions, Optional<DesktopTasksLimiter> desktopTasksLimiter, - InteractionJankMonitor interactionJankMonitor) { - return new EnterDesktopTaskTransitionHandler(transitions, interactionJankMonitor); + InteractionJankMonitor interactionJankMonitor, + LatencyTracker latencyTracker) { + return new EnterDesktopTaskTransitionHandler( + transitions, interactionJankMonitor, latencyTracker); } @WMSingleton diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/EnterDesktopTaskTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/EnterDesktopTaskTransitionHandler.java index 80e106f3990b..4c1703095ca1 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/EnterDesktopTaskTransitionHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/EnterDesktopTaskTransitionHandler.java @@ -41,6 +41,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.internal.jank.InteractionJankMonitor; +import com.android.internal.util.LatencyTracker; import com.android.wm.shell.shared.desktopmode.DesktopModeTransitionSource; import com.android.wm.shell.transition.Transitions; import com.android.wm.shell.windowdecor.OnTaskResizeAnimationListener; @@ -63,20 +64,25 @@ public class EnterDesktopTaskTransitionHandler implements Transitions.Transition private final List<IBinder> mPendingTransitionTokens = new ArrayList<>(); private final InteractionJankMonitor mInteractionJankMonitor; + private final LatencyTracker mLatencyTracker; private OnTaskResizeAnimationListener mOnTaskResizeAnimationListener; public EnterDesktopTaskTransitionHandler( - Transitions transitions, InteractionJankMonitor interactionJankMonitor) { - this(transitions, interactionJankMonitor, SurfaceControl.Transaction::new); + Transitions transitions, + InteractionJankMonitor interactionJankMonitor, + LatencyTracker latencyTracker) { + this(transitions, interactionJankMonitor, latencyTracker, SurfaceControl.Transaction::new); } public EnterDesktopTaskTransitionHandler( Transitions transitions, InteractionJankMonitor interactionJankMonitor, + LatencyTracker latencyTracker, Supplier<SurfaceControl.Transaction> supplier) { mTransitions = transitions; mInteractionJankMonitor = interactionJankMonitor; + mLatencyTracker = latencyTracker; mTransactionSupplier = supplier; } @@ -122,6 +128,13 @@ public class EnterDesktopTaskTransitionHandler implements Transitions.Transition } } + if (transitionHandled + && info.getType() + == DesktopModeTransitionTypes + .TRANSIT_ENTER_DESKTOP_FROM_APP_HANDLE_MENU_BUTTON) { + mLatencyTracker.onActionEnd(LatencyTracker.ACTION_DESKTOP_MODE_ENTER_APP_HANDLE_MENU); + } + mPendingTransitionTokens.remove(transition); return transitionHandled; diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java index cf139a008164..d9afd1503db5 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java @@ -92,6 +92,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.jank.Cuj; import com.android.internal.jank.InteractionJankMonitor; import com.android.internal.protolog.ProtoLog; +import com.android.internal.util.LatencyTracker; import com.android.window.flags.Flags; import com.android.wm.shell.R; import com.android.wm.shell.RootTaskDisplayAreaOrganizer; @@ -260,6 +261,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, private final DesktopModeCompatPolicy mDesktopModeCompatPolicy; private final DesktopTilingDecorViewModel mDesktopTilingDecorViewModel; private final MultiDisplayDragMoveIndicatorController mMultiDisplayDragMoveIndicatorController; + private final LatencyTracker mLatencyTracker; public DesktopModeWindowDecorViewModel( Context context, @@ -466,6 +468,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, mDesktopTilingDecorViewModel = desktopTilingDecorViewModel; mDesktopTasksController.setSnapEventHandler(this); mMultiDisplayDragMoveIndicatorController = multiDisplayDragMoveIndicatorController; + mLatencyTracker = LatencyTracker.getInstance(mContext); shellInit.addInitCallback(this::onInit, this); } @@ -764,11 +767,19 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, final WindowContainerTransaction wct = new WindowContainerTransaction(); mInteractionJankMonitor.begin(decoration.mTaskSurface, mContext, mMainHandler, CUJ_DESKTOP_MODE_ENTER_MODE_APP_HANDLE_MENU); + mLatencyTracker.onActionStart(LatencyTracker.ACTION_DESKTOP_MODE_ENTER_APP_HANDLE_MENU); // App sometimes draws before the insets from WindowDecoration#relayout have // been added, so they must be added here decoration.addCaptionInset(wct); - mDesktopTasksController.moveTaskToDefaultDeskAndActivate(taskId, wct, source, - /* remoteTransition= */ null, /* moveToDesktopCallback */ null); + if (!mDesktopTasksController.moveTaskToDefaultDeskAndActivate( + taskId, + wct, + source, + /* remoteTransition= */ null, + /* moveToDesktopCallback= */ null)) { + mLatencyTracker.onActionCancel( + LatencyTracker.ACTION_DESKTOP_MODE_ENTER_APP_HANDLE_MENU); + } decoration.closeHandleMenu(); if (source == DesktopModeTransitionSource.APP_HANDLE_MENU_BUTTON) { |