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) {  |