From 7fb4f997c458936ebb0d7a8cd10a1332b7d97331 Mon Sep 17 00:00:00 2001 From: Vinit Nayak Date: Tue, 6 Sep 2022 18:15:35 -0700 Subject: [PATCH] Add metrics sources for split invocation * See design doc in bug description for usage/details Bug: 231369744 Change-Id: I0c0ec11e924e387c523b5ac5feb7cabf78eaa748 --- .../popup/QuickstepSystemShortcut.java | 16 +++-- .../taskbar/TaskbarDragController.java | 11 ++-- .../taskbar/TaskbarPopupController.java | 21 +++++- ...kbarShortcutMenuAccessibilityDelegate.java | 25 ++++++-- .../uioverrides/QuickstepLauncher.java | 6 +- .../android/quickstep/RecentsActivity.java | 2 +- .../com/android/quickstep/SystemUiProxy.java | 26 ++++---- .../fallback/FallbackRecentsView.java | 6 +- .../com/android/quickstep/util/LogUtils.kt | 34 ++++++++++ .../util/SplitSelectStateController.java | 64 ++++++++++++++----- .../quickstep/views/LauncherRecentsView.java | 9 +-- .../android/quickstep/views/RecentsView.java | 16 +++-- .../com/android/quickstep/views/TaskView.java | 4 +- .../launcher3/logging/StatsLogManager.java | 6 ++ .../util/PendingSplitSelectInfo.java | 10 ++- .../util/SplitConfigurationOptions.java | 11 ++++ 16 files changed, 206 insertions(+), 61 deletions(-) create mode 100644 quickstep/src/com/android/quickstep/util/LogUtils.kt diff --git a/quickstep/src/com/android/launcher3/popup/QuickstepSystemShortcut.java b/quickstep/src/com/android/launcher3/popup/QuickstepSystemShortcut.java index a0cf6cb1e6..9a682c6e53 100644 --- a/quickstep/src/com/android/launcher3/popup/QuickstepSystemShortcut.java +++ b/quickstep/src/com/android/launcher3/popup/QuickstepSystemShortcut.java @@ -15,14 +15,16 @@ */ package com.android.launcher3.popup; +import static com.android.launcher3.util.SplitConfigurationOptions.getLogEventForPosition; + import android.content.Intent; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; -import android.os.UserHandle; import android.util.Log; import android.view.View; +import com.android.launcher3.logging.StatsLogManager; import com.android.launcher3.model.data.ItemInfo; import com.android.launcher3.model.data.WorkspaceItemInfo; import com.android.launcher3.uioverrides.QuickstepLauncher; @@ -70,9 +72,10 @@ public interface QuickstepSystemShortcut { } RecentsView recentsView = mTarget.getOverviewPanel(); + StatsLogManager.EventEnum splitEvent = getLogEventForPosition(mPosition.stagePosition); recentsView.initiateSplitSelect( new SplitSelectSource(mOriginalView, new BitmapDrawable(bitmap), intent, - mPosition, mItemInfo.user)); + mPosition, mItemInfo, splitEvent)); } } @@ -82,15 +85,18 @@ public interface QuickstepSystemShortcut { public final Drawable drawable; public final Intent intent; public final SplitPositionOption position; - public final UserHandle user; + public final ItemInfo mItemInfo; + public final StatsLogManager.EventEnum splitEvent; public SplitSelectSource(View view, Drawable drawable, Intent intent, - SplitPositionOption position, UserHandle user) { + SplitPositionOption position, ItemInfo itemInfo, + StatsLogManager.EventEnum splitEvent) { this.view = view; this.drawable = drawable; this.intent = intent; this.position = position; - this.user = user; + this.mItemInfo = itemInfo; + this.splitEvent = splitEvent; } } } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java index 97029fedbc..9a1e0642bb 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java @@ -32,6 +32,7 @@ import android.graphics.Point; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.UserHandle; +import android.util.Pair; import android.view.DragEvent; import android.view.MotionEvent; import android.view.SurfaceControl; @@ -42,7 +43,6 @@ import android.window.SurfaceSyncer; import androidx.annotation.Nullable; import com.android.internal.logging.InstanceId; -import com.android.internal.logging.InstanceIdSequence; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.BubbleTextView; import com.android.launcher3.DragSource; @@ -69,6 +69,7 @@ import com.android.launcher3.testing.TestLogging; import com.android.launcher3.testing.shared.TestProtocol; import com.android.launcher3.util.IntSet; import com.android.launcher3.util.ItemInfoMatcher; +import com.android.quickstep.util.LogUtils; import com.android.systemui.shared.recents.model.Task; import java.io.PrintWriter; @@ -359,11 +360,11 @@ public class TaskbarDragController extends DragController im } if (clipDescription != null && intent != null) { + Pair instanceIds = + LogUtils.getShellShareableInstanceId(); // Need to share the same InstanceId between launcher3 and WM Shell (internal). - InstanceId internalInstanceId = new InstanceIdSequence( - com.android.launcher3.logging.InstanceId.INSTANCE_ID_MAX).newInstanceId(); - com.android.launcher3.logging.InstanceId launcherInstanceId = - new com.android.launcher3.logging.InstanceId(internalInstanceId.getId()); + InstanceId internalInstanceId = instanceIds.first; + com.android.launcher3.logging.InstanceId launcherInstanceId = instanceIds.second; intent.putExtra(ClipDescription.EXTRA_LOGGING_INSTANCE_ID, internalInstanceId); diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java index 7b4501a003..49d0873037 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java @@ -15,14 +15,20 @@ */ package com.android.launcher3.taskbar; +import static com.android.launcher3.util.SplitConfigurationOptions.getLogEventForPosition; + +import android.content.ClipDescription; import android.content.Intent; import android.content.pm.LauncherApps; import android.graphics.Point; +import android.os.Bundle; +import android.util.Pair; import android.view.MotionEvent; import android.view.View; import androidx.annotation.NonNull; +import com.android.internal.logging.InstanceId; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.BubbleTextView; import com.android.launcher3.LauncherSettings; @@ -47,6 +53,7 @@ import com.android.launcher3.util.ShortcutUtil; import com.android.launcher3.util.SplitConfigurationOptions.SplitPositionOption; import com.android.launcher3.views.ActivityContext; import com.android.quickstep.SystemUiProxy; +import com.android.quickstep.util.LogUtils; import java.io.PrintWriter; import java.util.HashMap; @@ -263,8 +270,14 @@ public class TaskbarPopupController implements TaskbarControllers.LoggableTaskba @Override public void onClick(View view) { - AbstractFloatingView.closeAllOpenViews(mTarget); + Pair instanceIds = + LogUtils.getShellShareableInstanceId(); + mTarget.getStatsLogManager().logger() + .withItemInfo(mItemInfo) + .withInstanceId(instanceIds.second) + .log(getLogEventForPosition(mPosition.stagePosition)); + AbstractFloatingView.closeAllOpenViews(mTarget); if (mItemInfo.itemType == LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT) { WorkspaceItemInfo workspaceItemInfo = (WorkspaceItemInfo) mItemInfo; SystemUiProxy.INSTANCE.get(mTarget).startShortcut( @@ -272,7 +285,8 @@ public class TaskbarPopupController implements TaskbarControllers.LoggableTaskba workspaceItemInfo.getDeepShortcutId(), mPosition.stagePosition, null, - workspaceItemInfo.user); + workspaceItemInfo.user, + instanceIds.first); } else { SystemUiProxy.INSTANCE.get(mTarget).startIntent( mTarget.getSystemService(LauncherApps.class).getMainActivityLaunchIntent( @@ -281,7 +295,8 @@ public class TaskbarPopupController implements TaskbarControllers.LoggableTaskba mItemInfo.user), new Intent(), mPosition.stagePosition, - null); + null, + instanceIds.first); } } } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarShortcutMenuAccessibilityDelegate.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarShortcutMenuAccessibilityDelegate.java index f131595126..c10b57ab87 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarShortcutMenuAccessibilityDelegate.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarShortcutMenuAccessibilityDelegate.java @@ -17,24 +17,29 @@ package com.android.launcher3.taskbar; import static com.android.launcher3.accessibility.LauncherAccessibilityDelegate.DEEP_SHORTCUTS; import static com.android.launcher3.accessibility.LauncherAccessibilityDelegate.SHORTCUTS_AND_NOTIFICATIONS; -import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT; -import static com.android.wm.shell.common.split.SplitScreenConstants.SPLIT_POSITION_TOP_OR_LEFT; +import static com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_BOTTOM_OR_RIGHT; +import static com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_TOP_OR_LEFT; +import static com.android.launcher3.util.SplitConfigurationOptions.getLogEventForPosition; import android.content.Intent; import android.content.pm.LauncherApps; +import android.util.Pair; import android.view.KeyEvent; import android.view.View; +import com.android.internal.logging.InstanceId; import com.android.launcher3.BubbleTextView; import com.android.launcher3.LauncherSettings; import com.android.launcher3.R; import com.android.launcher3.accessibility.BaseAccessibilityDelegate; import com.android.launcher3.config.FeatureFlags; +import com.android.launcher3.logging.StatsLogManager; import com.android.launcher3.model.data.ItemInfo; import com.android.launcher3.model.data.WorkspaceItemInfo; import com.android.launcher3.notification.NotificationListener; import com.android.launcher3.util.ShortcutUtil; import com.android.quickstep.SystemUiProxy; +import com.android.quickstep.util.LogUtils; import java.util.List; @@ -49,10 +54,12 @@ public class TaskbarShortcutMenuAccessibilityDelegate public static final int MOVE_TO_BOTTOM_OR_RIGHT = R.id.action_move_to_bottom_or_right; private final LauncherApps mLauncherApps; + private final StatsLogManager mStatsLogManager; public TaskbarShortcutMenuAccessibilityDelegate(TaskbarActivityContext context) { super(context); mLauncherApps = context.getSystemService(LauncherApps.class); + mStatsLogManager = context.getStatsLogManager(); mActions.put(DEEP_SHORTCUTS, new LauncherAction(DEEP_SHORTCUTS, R.string.action_deep_shortcut, KeyEvent.KEYCODE_S)); @@ -82,7 +89,14 @@ public class TaskbarShortcutMenuAccessibilityDelegate && (action == MOVE_TO_TOP_OR_LEFT || action == MOVE_TO_BOTTOM_OR_RIGHT)) { WorkspaceItemInfo info = (WorkspaceItemInfo) item; int side = action == MOVE_TO_TOP_OR_LEFT - ? SPLIT_POSITION_TOP_OR_LEFT : SPLIT_POSITION_BOTTOM_OR_RIGHT; + ? STAGE_POSITION_TOP_OR_LEFT : STAGE_POSITION_BOTTOM_OR_RIGHT; + + Pair instanceIds = + LogUtils.getShellShareableInstanceId(); + mStatsLogManager.logger() + .withItemInfo(item) + .withInstanceId(instanceIds.second) + .log(getLogEventForPosition(side)); if (info.itemType == LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT) { SystemUiProxy.INSTANCE.get(mContext).startShortcut( @@ -90,14 +104,15 @@ public class TaskbarShortcutMenuAccessibilityDelegate info.getDeepShortcutId(), side, /* bundleOpts= */ null, - info.user); + info.user, + instanceIds.first); } else { SystemUiProxy.INSTANCE.get(mContext).startIntent( mLauncherApps.getMainActivityLaunchIntent( item.getIntent().getComponent(), /* startActivityOptions= */null, item.user), - new Intent(), side, null); + new Intent(), side, null, instanceIds.first); } return true; } else if (action == DEEP_SHORTCUTS || action == SHORTCUTS_AND_NOTIFICATIONS) { diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java index 12d7a98472..3320d2e150 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java +++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java @@ -192,7 +192,7 @@ public class QuickstepLauncher extends Launcher { RecentsView overviewPanel = (RecentsView) getOverviewPanel(); SplitSelectStateController controller = new SplitSelectStateController(this, mHandler, getStateManager(), - getDepthController()); + getDepthController(), getStatsLogManager()); overviewPanel.init(mActionsView, controller); mActionsView.updateDimension(getDeviceProfile(), overviewPanel.getLastComputedTaskSize()); mActionsView.updateVerticalMargin(DisplayController.getNavigationMode(this)); @@ -899,8 +899,8 @@ public class QuickstepLauncher extends Launcher { outState.putIBinder(PENDING_SPLIT_SELECT_INFO, ObjectWrapper.wrap( new PendingSplitSelectInfo( splitSelectStateController.getInitialTaskId(), - splitSelectStateController.getActiveSplitStagePosition() - ) + splitSelectStateController.getActiveSplitStagePosition(), + splitSelectStateController.getSplitEvent()) )); outState.putInt(RUNTIME_STATE, OVERVIEW.ordinal); } diff --git a/quickstep/src/com/android/quickstep/RecentsActivity.java b/quickstep/src/com/android/quickstep/RecentsActivity.java index 3e3a43178c..357fd93b41 100644 --- a/quickstep/src/com/android/quickstep/RecentsActivity.java +++ b/quickstep/src/com/android/quickstep/RecentsActivity.java @@ -131,7 +131,7 @@ public final class RecentsActivity extends StatefulActivity { SplitSelectStateController controller = new SplitSelectStateController(this, mHandler, getStateManager(), - null /* depthController */); + /* depthController */ null, getStatsLogManager()); mDragLayer.recreateControllers(); mFallbackRecentsView.init(mActionsView, controller); diff --git a/quickstep/src/com/android/quickstep/SystemUiProxy.java b/quickstep/src/com/android/quickstep/SystemUiProxy.java index 3a7ade316a..944e2f985d 100644 --- a/quickstep/src/com/android/quickstep/SystemUiProxy.java +++ b/quickstep/src/com/android/quickstep/SystemUiProxy.java @@ -47,6 +47,7 @@ import android.window.IOnBackInvokedCallback; import androidx.annotation.WorkerThread; +import com.android.internal.logging.InstanceId; import com.android.launcher3.util.MainThreadInitializedObject; import com.android.launcher3.util.SplitConfigurationOptions; import com.android.systemui.shared.recents.ISystemUiProxy; @@ -539,11 +540,11 @@ public class SystemUiProxy implements ISystemUiProxy { /** Start multiple tasks in split-screen simultaneously. */ public void startTasks(int mainTaskId, Bundle mainOptions, int sideTaskId, Bundle sideOptions, @SplitConfigurationOptions.StagePosition int sidePosition, float splitRatio, - RemoteTransitionCompat remoteTransition) { + RemoteTransitionCompat remoteTransition, InstanceId instanceId) { if (mSystemUiProxy != null) { try { mSplitScreen.startTasks(mainTaskId, mainOptions, sideTaskId, sideOptions, - sidePosition, splitRatio, remoteTransition.getTransition()); + sidePosition, splitRatio, remoteTransition.getTransition(), instanceId); } catch (RemoteException e) { Log.w(TAG, "Failed call startTask"); } @@ -555,11 +556,11 @@ public class SystemUiProxy implements ISystemUiProxy { */ public void startTasksWithLegacyTransition(int mainTaskId, Bundle mainOptions, int sideTaskId, Bundle sideOptions, @SplitConfigurationOptions.StagePosition int sidePosition, - float splitRatio, RemoteAnimationAdapter adapter) { + float splitRatio, RemoteAnimationAdapter adapter, InstanceId instanceId) { if (mSystemUiProxy != null) { try { mSplitScreen.startTasksWithLegacyTransition(mainTaskId, mainOptions, sideTaskId, - sideOptions, sidePosition, splitRatio, adapter); + sideOptions, sidePosition, splitRatio, adapter, instanceId); } catch (RemoteException e) { Log.w(TAG, "Failed call startTasksWithLegacyTransition"); } @@ -569,11 +570,12 @@ public class SystemUiProxy implements ISystemUiProxy { public void startIntentAndTaskWithLegacyTransition(PendingIntent pendingIntent, Intent fillInIntent, int taskId, Bundle mainOptions, Bundle sideOptions, @SplitConfigurationOptions.StagePosition int sidePosition, float splitRatio, - RemoteAnimationAdapter adapter) { + RemoteAnimationAdapter adapter, InstanceId instanceId) { if (mSystemUiProxy != null) { try { mSplitScreen.startIntentAndTaskWithLegacyTransition(pendingIntent, fillInIntent, - taskId, mainOptions, sideOptions, sidePosition, splitRatio, adapter); + taskId, mainOptions, sideOptions, sidePosition, splitRatio, adapter, + instanceId); } catch (RemoteException e) { Log.w(TAG, "Failed call startIntentAndTaskWithLegacyTransition"); } @@ -583,11 +585,11 @@ public class SystemUiProxy implements ISystemUiProxy { public void startShortcutAndTaskWithLegacyTransition(ShortcutInfo shortcutInfo, int taskId, Bundle mainOptions, Bundle sideOptions, @SplitConfigurationOptions.StagePosition int sidePosition, float splitRatio, - RemoteAnimationAdapter adapter) { + RemoteAnimationAdapter adapter, InstanceId instanceId) { if (mSystemUiProxy != null) { try { mSplitScreen.startShortcutAndTaskWithLegacyTransition(shortcutInfo, taskId, - mainOptions, sideOptions, sidePosition, splitRatio, adapter); + mainOptions, sideOptions, sidePosition, splitRatio, adapter, instanceId); } catch (RemoteException e) { Log.w(TAG, "Failed call startShortcutAndTaskWithLegacyTransition"); } @@ -595,11 +597,11 @@ public class SystemUiProxy implements ISystemUiProxy { } public void startShortcut(String packageName, String shortcutId, int position, - Bundle options, UserHandle user) { + Bundle options, UserHandle user, InstanceId instanceId) { if (mSplitScreen != null) { try { mSplitScreen.startShortcut(packageName, shortcutId, position, options, - user); + user, instanceId); } catch (RemoteException e) { Log.w(TAG, "Failed call startShortcut"); } @@ -607,10 +609,10 @@ public class SystemUiProxy implements ISystemUiProxy { } public void startIntent(PendingIntent intent, Intent fillInIntent, int position, - Bundle options) { + Bundle options, InstanceId instanceId) { if (mSplitScreen != null) { try { - mSplitScreen.startIntent(intent, fillInIntent, position, options); + mSplitScreen.startIntent(intent, fillInIntent, position, options, instanceId); } catch (RemoteException e) { Log.w(TAG, "Failed call startIntent"); } diff --git a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java index 7c96bf8a78..c2d934fee1 100644 --- a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java +++ b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java @@ -33,6 +33,7 @@ import androidx.annotation.Nullable; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.anim.AnimatorPlaybackController; import com.android.launcher3.anim.PendingAnimation; +import com.android.launcher3.logging.StatsLogManager; import com.android.launcher3.popup.QuickstepSystemShortcut; import com.android.launcher3.statemanager.StateManager.StateListener; import com.android.launcher3.util.SplitConfigurationOptions; @@ -210,8 +211,9 @@ public class FallbackRecentsView extends RecentsView { + val internalInstanceId = InstanceIdSequence(InstanceId.INSTANCE_ID_MAX).newInstanceId() + val launcherInstanceId = InstanceId(internalInstanceId.id) + return Pair(internalInstanceId, launcherInstanceId) + } +} diff --git a/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java b/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java index 7efb1a51ad..efbe783125 100644 --- a/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java +++ b/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java @@ -38,12 +38,16 @@ import android.os.IBinder; import android.os.UserHandle; import android.text.TextUtils; import android.util.Log; +import android.util.Pair; import android.view.RemoteAnimationAdapter; import android.view.SurfaceControl; import android.window.TransitionInfo; import androidx.annotation.Nullable; +import com.android.internal.logging.InstanceId; +import com.android.launcher3.logging.StatsLogManager; +import com.android.launcher3.model.data.ItemInfo; import com.android.launcher3.shortcuts.ShortcutKey; import com.android.launcher3.statehandlers.DepthController; import com.android.launcher3.statemanager.StateManager; @@ -74,10 +78,12 @@ public class SplitSelectStateController { private final Context mContext; private final Handler mHandler; + private StatsLogManager mStatsLogManager; private final SystemUiProxy mSystemUiProxy; private final StateManager mStateManager; private final DepthController mDepthController; private @StagePosition int mStagePosition; + private ItemInfo mItemInfo; private Intent mInitialTaskIntent; private int mInitialTaskId = INVALID_TASK_ID; private int mSecondTaskId = INVALID_TASK_ID; @@ -88,11 +94,14 @@ public class SplitSelectStateController { /** If not null, this is the TaskView we want to launch from */ @Nullable private GroupedTaskView mLaunchingTaskView; + /** Represents where split is intended to be invoked from. */ + private StatsLogManager.EventEnum mSplitEvent; public SplitSelectStateController(Context context, Handler handler, StateManager stateManager, - DepthController depthController) { + DepthController depthController, StatsLogManager statsLogManager) { mContext = context; mHandler = handler; + mStatsLogManager = statsLogManager; mSystemUiProxy = SystemUiProxy.INSTANCE.get(mContext); mStateManager = stateManager; mDepthController = depthController; @@ -101,19 +110,25 @@ public class SplitSelectStateController { /** * To be called after first task selected */ - public void setInitialTaskSelect(int taskId, @StagePosition int stagePosition) { + public void setInitialTaskSelect(int taskId, @StagePosition int stagePosition, + StatsLogManager.EventEnum splitEvent, ItemInfo itemInfo) { mInitialTaskId = taskId; - mStagePosition = stagePosition; - mInitialTaskIntent = null; - mUser = null; + setInitialData(stagePosition, splitEvent, itemInfo); } public void setInitialTaskSelect(Intent intent, @StagePosition int stagePosition, - @Nullable UserHandle user) { + @NonNull ItemInfo itemInfo, StatsLogManager.EventEnum splitEvent) { mInitialTaskIntent = intent; + mUser = itemInfo.user; + mItemInfo = itemInfo; + setInitialData(stagePosition, splitEvent, itemInfo); + } + + private void setInitialData(@StagePosition int stagePosition, + StatsLogManager.EventEnum splitEvent, ItemInfo itemInfo) { + mItemInfo = itemInfo; mStagePosition = stagePosition; - mInitialTaskId = INVALID_TASK_ID; - mUser = user; + mSplitEvent = splitEvent; } /** @@ -137,8 +152,16 @@ public class SplitSelectStateController { FLAG_MUTABLE, null /* options */, mUser) : PendingIntent.getActivity(mContext, 0, mInitialTaskIntent, FLAG_MUTABLE)); + Pair instanceIds = + LogUtils.getShellShareableInstanceId(); launchTasks(mInitialTaskId, pendingIntent, fillInIntent, mSecondTaskId, mStagePosition, - callback, false /* freezeTaskList */, DEFAULT_SPLIT_RATIO); + callback, false /* freezeTaskList */, DEFAULT_SPLIT_RATIO, + instanceIds.first); + + mStatsLogManager.logger() + .withItemInfo(mItemInfo) + .withInstanceId(instanceIds.second) + .log(mSplitEvent); } @@ -174,7 +197,7 @@ public class SplitSelectStateController { public void launchTasks(int taskId1, int taskId2, @StagePosition int stagePosition, Consumer callback, boolean freezeTaskList, float splitRatio) { launchTasks(taskId1, null /* taskPendingIntent */, null /* fillInIntent */, taskId2, - stagePosition, callback, freezeTaskList, splitRatio); + stagePosition, callback, freezeTaskList, splitRatio, null); } /** @@ -183,10 +206,14 @@ public class SplitSelectStateController { * fill in intent with a taskId2 are set. * @param taskPendingIntent is null when split is initiated from Overview * @param stagePosition representing location of task1 + * @param shellInstanceId loggingId to be used by shell, will be non-null for actions that create + * a split instance, null for cases that bring existing instaces to the + * foreground (quickswitch, launching previous pairs from overview) */ public void launchTasks(int taskId1, @Nullable PendingIntent taskPendingIntent, @Nullable Intent fillInIntent, int taskId2, @StagePosition int stagePosition, - Consumer callback, boolean freezeTaskList, float splitRatio) { + Consumer callback, boolean freezeTaskList, float splitRatio, + @Nullable InstanceId shellInstanceId) { TestLogging.recordEvent( TestProtocol.SEQUENCE_MAIN, "launchSplitTasks"); // Assume initial task is for top/left part of screen @@ -200,7 +227,8 @@ public class SplitSelectStateController { mSystemUiProxy.startTasks(taskIds[0], null /* mainOptions */, taskIds[1], null /* sideOptions */, STAGE_POSITION_BOTTOM_OR_RIGHT, splitRatio, new RemoteTransitionCompat(animationRunner, MAIN_EXECUTOR, - ActivityThread.currentActivityThread().getApplicationThread())); + ActivityThread.currentActivityThread().getApplicationThread()), + shellInstanceId); // TODO(b/237635859): handle intent/shortcut + task with shell transition } else { RemoteSplitLaunchAnimationRunner animationRunner = @@ -218,18 +246,18 @@ public class SplitSelectStateController { if (taskPendingIntent == null) { mSystemUiProxy.startTasksWithLegacyTransition(taskIds[0], mainOpts.toBundle(), taskIds[1], null /* sideOptions */, STAGE_POSITION_BOTTOM_OR_RIGHT, - splitRatio, adapter); + splitRatio, adapter, shellInstanceId); } else { final ShortcutInfo shortcutInfo = getShortcutInfo(mInitialTaskIntent, taskPendingIntent.getCreatorUserHandle()); if (shortcutInfo != null) { mSystemUiProxy.startShortcutAndTaskWithLegacyTransition(shortcutInfo, taskId2, mainOpts.toBundle(), null /* sideOptions */, stagePosition, splitRatio, - adapter); + adapter, shellInstanceId); } else { mSystemUiProxy.startIntentAndTaskWithLegacyTransition(taskPendingIntent, fillInIntent, taskId2, mainOpts.toBundle(), null /* sideOptions */, - stagePosition, splitRatio, adapter); + stagePosition, splitRatio, adapter, shellInstanceId); } } } @@ -239,6 +267,10 @@ public class SplitSelectStateController { return mStagePosition; } + public StatsLogManager.EventEnum getSplitEvent() { + return mSplitEvent; + } + public void setRecentsAnimationRunning(boolean running) { this.mRecentsAnimationRunning = running; } @@ -358,6 +390,8 @@ public class SplitSelectStateController { mStagePosition = SplitConfigurationOptions.STAGE_POSITION_UNDEFINED; mRecentsAnimationRunning = false; mLaunchingTaskView = null; + mItemInfo = null; + mSplitEvent = null; } /** diff --git a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java index de7ccad7a3..364cf7bebc 100644 --- a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java +++ b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java @@ -33,6 +33,7 @@ import androidx.annotation.Nullable; import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.LauncherState; +import com.android.launcher3.logging.StatsLogManager; import com.android.launcher3.popup.QuickstepSystemShortcut; import com.android.launcher3.statehandlers.DepthController; import com.android.launcher3.statemanager.StateManager.StateListener; @@ -94,7 +95,7 @@ public class LauncherRecentsView extends RecentsView