Loading quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java +2 −2 Original line number Diff line number Diff line Loading @@ -292,8 +292,8 @@ public abstract class BaseQuickstepLauncher extends Launcher { mActionsView = findViewById(R.id.overview_actions_view); RecentsView overviewPanel = (RecentsView) getOverviewPanel(); SplitSelectStateController controller = new SplitSelectStateController(mHandler, SystemUiProxy.INSTANCE.get(this), getStateManager(), getDepthController()); new SplitSelectStateController(this, mHandler, getStateManager(), getDepthController()); overviewPanel.init(mActionsView, controller); mActionsView.setDp(getDeviceProfile()); mActionsView.updateVerticalMargin(DisplayController.getNavigationMode(this)); Loading quickstep/src/com/android/quickstep/RecentsActivity.java +2 −2 Original line number Diff line number Diff line Loading @@ -135,8 +135,8 @@ public final class RecentsActivity extends StatefulActivity<RecentsState> { SYSUI_PROGRESS.set(getRootView().getSysUiScrim(), 0f); SplitSelectStateController controller = new SplitSelectStateController(mHandler, SystemUiProxy.INSTANCE.get(this), getStateManager(), null /*depthController*/); new SplitSelectStateController(this, mHandler, getStateManager(), null /* depthController */); mDragLayer.recreateControllers(); mFallbackRecentsView.init(mActionsView, controller); Loading quickstep/src/com/android/quickstep/util/SplitSelectStateController.java +49 −17 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.quickstep.util; import static android.app.ActivityTaskManager.INVALID_TASK_ID; import static android.app.PendingIntent.FLAG_MUTABLE; import static com.android.launcher3.Utilities.postAsyncCallback; import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; Loading @@ -27,9 +28,11 @@ import static com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITIO import android.app.ActivityOptions; import android.app.ActivityThread; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.Handler; import android.os.IBinder; import android.text.TextUtils; import android.view.RemoteAnimationAdapter; import android.view.SurfaceControl; import android.window.TransitionInfo; Loading @@ -45,6 +48,7 @@ import com.android.quickstep.TaskAnimationManager; import com.android.quickstep.TaskViewUtils; import com.android.quickstep.views.GroupedTaskView; import com.android.quickstep.views.TaskView; import com.android.systemui.shared.recents.model.Task; import com.android.systemui.shared.system.RemoteAnimationAdapterCompat; import com.android.systemui.shared.system.RemoteAnimationRunnerCompat; import com.android.systemui.shared.system.RemoteAnimationTargetCompat; Loading @@ -59,12 +63,13 @@ import java.util.function.Consumer; */ public class SplitSelectStateController { private final Context mContext; private final Handler mHandler; private final SystemUiProxy mSystemUiProxy; private final StateManager mStateManager; private final DepthController mDepthController; private @StagePosition int mStagePosition; private PendingIntent mInitialTaskPendingIntent; private Intent mInitialTaskIntent; private int mInitialTaskId = INVALID_TASK_ID; private int mSecondTaskId = INVALID_TASK_ID; private boolean mRecentsAnimationRunning; Loading @@ -72,10 +77,11 @@ public class SplitSelectStateController { @Nullable private GroupedTaskView mLaunchingTaskView; public SplitSelectStateController(Handler handler, SystemUiProxy systemUiProxy, StateManager stateManager, DepthController depthController) { public SplitSelectStateController(Context context, Handler handler, StateManager stateManager, DepthController depthController) { mContext = context; mHandler = handler; mSystemUiProxy = systemUiProxy; mSystemUiProxy = SystemUiProxy.INSTANCE.get(mContext); mStateManager = stateManager; mDepthController = depthController; } Loading @@ -86,12 +92,11 @@ public class SplitSelectStateController { public void setInitialTaskSelect(int taskId, @StagePosition int stagePosition) { mInitialTaskId = taskId; mStagePosition = stagePosition; mInitialTaskPendingIntent = null; mInitialTaskIntent = null; } public void setInitialTaskSelect(PendingIntent pendingIntent, @StagePosition int stagePosition) { mInitialTaskPendingIntent = pendingIntent; public void setInitialTaskSelect(Intent intent, @StagePosition int stagePosition) { mInitialTaskIntent = intent; mStagePosition = stagePosition; mInitialTaskId = INVALID_TASK_ID; } Loading @@ -99,9 +104,22 @@ public class SplitSelectStateController { /** * To be called after second task selected */ public void setSecondTaskId(int taskId, Consumer<Boolean> callback) { mSecondTaskId = taskId; launchTasks(mInitialTaskId, mInitialTaskPendingIntent, mSecondTaskId, mStagePosition, public void setSecondTask(Task task, Consumer<Boolean> callback) { mSecondTaskId = task.key.id; final Intent fillInIntent; if (mInitialTaskIntent != null) { fillInIntent = new Intent(); if (TextUtils.equals(mInitialTaskIntent.getComponent().getPackageName(), task.topActivity.getPackageName())) { fillInIntent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); } } else { fillInIntent = null; } final PendingIntent pendingIntent = mInitialTaskIntent == null ? null : PendingIntent.getActivity(mContext, 0, mInitialTaskIntent, FLAG_MUTABLE); launchTasks(mInitialTaskId, pendingIntent, fillInIntent, mSecondTaskId, mStagePosition, callback, false /* freezeTaskList */, DEFAULT_SPLIT_RATIO); } Loading @@ -113,18 +131,32 @@ public class SplitSelectStateController { mLaunchingTaskView = groupedTaskView; TaskView.TaskIdAttributeContainer[] taskIdAttributeContainers = groupedTaskView.getTaskIdAttributeContainers(); launchTasks(taskIdAttributeContainers[0].getTask().key.id, null, launchTasks(taskIdAttributeContainers[0].getTask().key.id, taskIdAttributeContainers[1].getTask().key.id, taskIdAttributeContainers[0].getStagePosition(), callback, freezeTaskList, groupedTaskView.getSplitRatio()); } /** * To be called when we want to launch split pairs from Overview when split is initiated from * Overview. */ public void launchTasks(int taskId1, int taskId2, @StagePosition int stagePosition, Consumer<Boolean> callback, boolean freezeTaskList, float splitRatio) { launchTasks(taskId1, null /* taskPendingIntent */, null /* fillInIntent */, taskId2, stagePosition, callback, freezeTaskList, splitRatio); } /** * To be called when we want to launch split pairs from Overview. Split can be initiated from * either Overview or home, or all apps. Either both taskIds are set, or a pending intent + a * fill in intent with a taskId2 are set. * @param taskPendingIntent is null when split is initiated from Overview * @param stagePosition representing location of task1 */ public void launchTasks(int taskId1, @Nullable PendingIntent taskPendingIntent, int taskId2, @StagePosition int stagePosition, Consumer<Boolean> callback, boolean freezeTaskList, float splitRatio) { @Nullable Intent fillInIntent, int taskId2, @StagePosition int stagePosition, Consumer<Boolean> callback, boolean freezeTaskList, float splitRatio) { // Assume initial task is for top/left part of screen final int[] taskIds = stagePosition == STAGE_POSITION_TOP_OR_LEFT ? new int[]{taskId1, taskId2} Loading Loading @@ -156,7 +188,7 @@ public class SplitSelectStateController { splitRatio, adapter); } else { mSystemUiProxy.startIntentAndTaskWithLegacyTransition(taskPendingIntent, new Intent(), taskId2, mainOpts.toBundle(), null /* sideOptions */, fillInIntent, taskId2, mainOpts.toBundle(), null /* sideOptions */, stagePosition, splitRatio, adapter); } } Loading Loading @@ -250,7 +282,7 @@ public class SplitSelectStateController { */ public void resetState() { mInitialTaskId = INVALID_TASK_ID; mInitialTaskPendingIntent = null; mInitialTaskIntent = null; mSecondTaskId = INVALID_TASK_ID; mStagePosition = SplitConfigurationOptions.STAGE_POSITION_UNDEFINED; mRecentsAnimationRunning = false; Loading @@ -262,7 +294,7 @@ public class SplitSelectStateController { * chosen */ public boolean isSplitSelectActive() { return (mInitialTaskId != INVALID_TASK_ID || mInitialTaskPendingIntent != null) return (mInitialTaskId != INVALID_TASK_ID || mInitialTaskIntent != null) && mSecondTaskId == INVALID_TASK_ID; } } quickstep/src/com/android/quickstep/views/GroupedTaskView.java +2 −3 Original line number Diff line number Diff line Loading @@ -182,9 +182,8 @@ public class GroupedTaskView extends TaskView { @Override public void launchTask(@NonNull Consumer<Boolean> callback, boolean freezeTaskList) { getRecentsView().getSplitPlaceholder().launchTasks(mTask.key.id, null, mSecondaryTask.key.id, STAGE_POSITION_TOP_OR_LEFT, callback, freezeTaskList, getSplitRatio()); getRecentsView().getSplitPlaceholder().launchTasks(mTask.key.id, mSecondaryTask.key.id, STAGE_POSITION_TOP_OR_LEFT, callback, freezeTaskList, getSplitRatio()); } @Override Loading quickstep/src/com/android/quickstep/views/RecentsView.java +3 −31 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ package com.android.quickstep.views; import static android.app.PendingIntent.FLAG_MUTABLE; import static android.view.Surface.ROTATION_0; import static android.view.View.MeasureSpec.EXACTLY; import static android.view.View.MeasureSpec.makeMeasureSpec; Loading Loading @@ -67,8 +66,6 @@ import android.animation.PropertyValuesHolder; import android.animation.ValueAnimator; import android.annotation.TargetApi; import android.app.ActivityManager.RunningTaskInfo; import android.app.PendingIntent; import android.content.ComponentName; import android.content.Context; import android.content.LocusId; import android.content.res.Configuration; Loading Loading @@ -2011,22 +2008,6 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T return null; } @Nullable private TaskView getTaskViewByComponentName(ComponentName componentName) { if (componentName == null) { return null; } for (int i = 0; i < getTaskViewCount(); i++) { TaskView taskView = requireTaskViewAt(i); if (taskView.getItemInfo().getIntent().getComponent().getPackageName().equals( componentName.getPackageName())) { return taskView; } } return null; } public int getRunningTaskIndex() { TaskView taskView = getRunningTaskView(); return taskView == null ? -1 : indexOfChild(taskView); Loading Loading @@ -3969,17 +3950,8 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T } public void initiateSplitSelect(QuickstepSystemShortcut.SplitSelectSource splitSelectSource) { // Remove the task if it exists in Overview TaskView matchingTaskView = getTaskViewByComponentName( splitSelectSource.intent.getComponent()); if (matchingTaskView != null) { removeTaskInternal(matchingTaskView.getTaskViewId()); } mSplitSelectSource = splitSelectSource; mSplitSelectStateController.setInitialTaskSelect( PendingIntent.getActivity( mContext, 0, splitSelectSource.intent, FLAG_MUTABLE), mSplitSelectStateController.setInitialTaskSelect(splitSelectSource.intent, splitSelectSource.position.stagePosition); } Loading Loading @@ -4033,8 +4005,8 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T mSecondFloatingTaskView.addAnimation(pendingAnimation, secondTaskStartingBounds, secondTaskEndingBounds, true /* fadeWithThumbnail */, false /* isInitialSplit */); pendingAnimation.addEndListener(aBoolean -> mSplitSelectStateController.setSecondTaskId(task.key.id, aBoolean1 -> RecentsView.this.resetFromSplitSelectionState())); mSplitSelectStateController.setSecondTask( task, aBoolean1 -> RecentsView.this.resetFromSplitSelectionState())); if (containerTaskView.containsMultipleTasks()) { // If we are launching from a child task, then only hide the thumbnail itself mSecondSplitHiddenView = thumbnailView; Loading Loading
quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java +2 −2 Original line number Diff line number Diff line Loading @@ -292,8 +292,8 @@ public abstract class BaseQuickstepLauncher extends Launcher { mActionsView = findViewById(R.id.overview_actions_view); RecentsView overviewPanel = (RecentsView) getOverviewPanel(); SplitSelectStateController controller = new SplitSelectStateController(mHandler, SystemUiProxy.INSTANCE.get(this), getStateManager(), getDepthController()); new SplitSelectStateController(this, mHandler, getStateManager(), getDepthController()); overviewPanel.init(mActionsView, controller); mActionsView.setDp(getDeviceProfile()); mActionsView.updateVerticalMargin(DisplayController.getNavigationMode(this)); Loading
quickstep/src/com/android/quickstep/RecentsActivity.java +2 −2 Original line number Diff line number Diff line Loading @@ -135,8 +135,8 @@ public final class RecentsActivity extends StatefulActivity<RecentsState> { SYSUI_PROGRESS.set(getRootView().getSysUiScrim(), 0f); SplitSelectStateController controller = new SplitSelectStateController(mHandler, SystemUiProxy.INSTANCE.get(this), getStateManager(), null /*depthController*/); new SplitSelectStateController(this, mHandler, getStateManager(), null /* depthController */); mDragLayer.recreateControllers(); mFallbackRecentsView.init(mActionsView, controller); Loading
quickstep/src/com/android/quickstep/util/SplitSelectStateController.java +49 −17 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.quickstep.util; import static android.app.ActivityTaskManager.INVALID_TASK_ID; import static android.app.PendingIntent.FLAG_MUTABLE; import static com.android.launcher3.Utilities.postAsyncCallback; import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; Loading @@ -27,9 +28,11 @@ import static com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITIO import android.app.ActivityOptions; import android.app.ActivityThread; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.Handler; import android.os.IBinder; import android.text.TextUtils; import android.view.RemoteAnimationAdapter; import android.view.SurfaceControl; import android.window.TransitionInfo; Loading @@ -45,6 +48,7 @@ import com.android.quickstep.TaskAnimationManager; import com.android.quickstep.TaskViewUtils; import com.android.quickstep.views.GroupedTaskView; import com.android.quickstep.views.TaskView; import com.android.systemui.shared.recents.model.Task; import com.android.systemui.shared.system.RemoteAnimationAdapterCompat; import com.android.systemui.shared.system.RemoteAnimationRunnerCompat; import com.android.systemui.shared.system.RemoteAnimationTargetCompat; Loading @@ -59,12 +63,13 @@ import java.util.function.Consumer; */ public class SplitSelectStateController { private final Context mContext; private final Handler mHandler; private final SystemUiProxy mSystemUiProxy; private final StateManager mStateManager; private final DepthController mDepthController; private @StagePosition int mStagePosition; private PendingIntent mInitialTaskPendingIntent; private Intent mInitialTaskIntent; private int mInitialTaskId = INVALID_TASK_ID; private int mSecondTaskId = INVALID_TASK_ID; private boolean mRecentsAnimationRunning; Loading @@ -72,10 +77,11 @@ public class SplitSelectStateController { @Nullable private GroupedTaskView mLaunchingTaskView; public SplitSelectStateController(Handler handler, SystemUiProxy systemUiProxy, StateManager stateManager, DepthController depthController) { public SplitSelectStateController(Context context, Handler handler, StateManager stateManager, DepthController depthController) { mContext = context; mHandler = handler; mSystemUiProxy = systemUiProxy; mSystemUiProxy = SystemUiProxy.INSTANCE.get(mContext); mStateManager = stateManager; mDepthController = depthController; } Loading @@ -86,12 +92,11 @@ public class SplitSelectStateController { public void setInitialTaskSelect(int taskId, @StagePosition int stagePosition) { mInitialTaskId = taskId; mStagePosition = stagePosition; mInitialTaskPendingIntent = null; mInitialTaskIntent = null; } public void setInitialTaskSelect(PendingIntent pendingIntent, @StagePosition int stagePosition) { mInitialTaskPendingIntent = pendingIntent; public void setInitialTaskSelect(Intent intent, @StagePosition int stagePosition) { mInitialTaskIntent = intent; mStagePosition = stagePosition; mInitialTaskId = INVALID_TASK_ID; } Loading @@ -99,9 +104,22 @@ public class SplitSelectStateController { /** * To be called after second task selected */ public void setSecondTaskId(int taskId, Consumer<Boolean> callback) { mSecondTaskId = taskId; launchTasks(mInitialTaskId, mInitialTaskPendingIntent, mSecondTaskId, mStagePosition, public void setSecondTask(Task task, Consumer<Boolean> callback) { mSecondTaskId = task.key.id; final Intent fillInIntent; if (mInitialTaskIntent != null) { fillInIntent = new Intent(); if (TextUtils.equals(mInitialTaskIntent.getComponent().getPackageName(), task.topActivity.getPackageName())) { fillInIntent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); } } else { fillInIntent = null; } final PendingIntent pendingIntent = mInitialTaskIntent == null ? null : PendingIntent.getActivity(mContext, 0, mInitialTaskIntent, FLAG_MUTABLE); launchTasks(mInitialTaskId, pendingIntent, fillInIntent, mSecondTaskId, mStagePosition, callback, false /* freezeTaskList */, DEFAULT_SPLIT_RATIO); } Loading @@ -113,18 +131,32 @@ public class SplitSelectStateController { mLaunchingTaskView = groupedTaskView; TaskView.TaskIdAttributeContainer[] taskIdAttributeContainers = groupedTaskView.getTaskIdAttributeContainers(); launchTasks(taskIdAttributeContainers[0].getTask().key.id, null, launchTasks(taskIdAttributeContainers[0].getTask().key.id, taskIdAttributeContainers[1].getTask().key.id, taskIdAttributeContainers[0].getStagePosition(), callback, freezeTaskList, groupedTaskView.getSplitRatio()); } /** * To be called when we want to launch split pairs from Overview when split is initiated from * Overview. */ public void launchTasks(int taskId1, int taskId2, @StagePosition int stagePosition, Consumer<Boolean> callback, boolean freezeTaskList, float splitRatio) { launchTasks(taskId1, null /* taskPendingIntent */, null /* fillInIntent */, taskId2, stagePosition, callback, freezeTaskList, splitRatio); } /** * To be called when we want to launch split pairs from Overview. Split can be initiated from * either Overview or home, or all apps. Either both taskIds are set, or a pending intent + a * fill in intent with a taskId2 are set. * @param taskPendingIntent is null when split is initiated from Overview * @param stagePosition representing location of task1 */ public void launchTasks(int taskId1, @Nullable PendingIntent taskPendingIntent, int taskId2, @StagePosition int stagePosition, Consumer<Boolean> callback, boolean freezeTaskList, float splitRatio) { @Nullable Intent fillInIntent, int taskId2, @StagePosition int stagePosition, Consumer<Boolean> callback, boolean freezeTaskList, float splitRatio) { // Assume initial task is for top/left part of screen final int[] taskIds = stagePosition == STAGE_POSITION_TOP_OR_LEFT ? new int[]{taskId1, taskId2} Loading Loading @@ -156,7 +188,7 @@ public class SplitSelectStateController { splitRatio, adapter); } else { mSystemUiProxy.startIntentAndTaskWithLegacyTransition(taskPendingIntent, new Intent(), taskId2, mainOpts.toBundle(), null /* sideOptions */, fillInIntent, taskId2, mainOpts.toBundle(), null /* sideOptions */, stagePosition, splitRatio, adapter); } } Loading Loading @@ -250,7 +282,7 @@ public class SplitSelectStateController { */ public void resetState() { mInitialTaskId = INVALID_TASK_ID; mInitialTaskPendingIntent = null; mInitialTaskIntent = null; mSecondTaskId = INVALID_TASK_ID; mStagePosition = SplitConfigurationOptions.STAGE_POSITION_UNDEFINED; mRecentsAnimationRunning = false; Loading @@ -262,7 +294,7 @@ public class SplitSelectStateController { * chosen */ public boolean isSplitSelectActive() { return (mInitialTaskId != INVALID_TASK_ID || mInitialTaskPendingIntent != null) return (mInitialTaskId != INVALID_TASK_ID || mInitialTaskIntent != null) && mSecondTaskId == INVALID_TASK_ID; } }
quickstep/src/com/android/quickstep/views/GroupedTaskView.java +2 −3 Original line number Diff line number Diff line Loading @@ -182,9 +182,8 @@ public class GroupedTaskView extends TaskView { @Override public void launchTask(@NonNull Consumer<Boolean> callback, boolean freezeTaskList) { getRecentsView().getSplitPlaceholder().launchTasks(mTask.key.id, null, mSecondaryTask.key.id, STAGE_POSITION_TOP_OR_LEFT, callback, freezeTaskList, getSplitRatio()); getRecentsView().getSplitPlaceholder().launchTasks(mTask.key.id, mSecondaryTask.key.id, STAGE_POSITION_TOP_OR_LEFT, callback, freezeTaskList, getSplitRatio()); } @Override Loading
quickstep/src/com/android/quickstep/views/RecentsView.java +3 −31 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ package com.android.quickstep.views; import static android.app.PendingIntent.FLAG_MUTABLE; import static android.view.Surface.ROTATION_0; import static android.view.View.MeasureSpec.EXACTLY; import static android.view.View.MeasureSpec.makeMeasureSpec; Loading Loading @@ -67,8 +66,6 @@ import android.animation.PropertyValuesHolder; import android.animation.ValueAnimator; import android.annotation.TargetApi; import android.app.ActivityManager.RunningTaskInfo; import android.app.PendingIntent; import android.content.ComponentName; import android.content.Context; import android.content.LocusId; import android.content.res.Configuration; Loading Loading @@ -2011,22 +2008,6 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T return null; } @Nullable private TaskView getTaskViewByComponentName(ComponentName componentName) { if (componentName == null) { return null; } for (int i = 0; i < getTaskViewCount(); i++) { TaskView taskView = requireTaskViewAt(i); if (taskView.getItemInfo().getIntent().getComponent().getPackageName().equals( componentName.getPackageName())) { return taskView; } } return null; } public int getRunningTaskIndex() { TaskView taskView = getRunningTaskView(); return taskView == null ? -1 : indexOfChild(taskView); Loading Loading @@ -3969,17 +3950,8 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T } public void initiateSplitSelect(QuickstepSystemShortcut.SplitSelectSource splitSelectSource) { // Remove the task if it exists in Overview TaskView matchingTaskView = getTaskViewByComponentName( splitSelectSource.intent.getComponent()); if (matchingTaskView != null) { removeTaskInternal(matchingTaskView.getTaskViewId()); } mSplitSelectSource = splitSelectSource; mSplitSelectStateController.setInitialTaskSelect( PendingIntent.getActivity( mContext, 0, splitSelectSource.intent, FLAG_MUTABLE), mSplitSelectStateController.setInitialTaskSelect(splitSelectSource.intent, splitSelectSource.position.stagePosition); } Loading Loading @@ -4033,8 +4005,8 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T mSecondFloatingTaskView.addAnimation(pendingAnimation, secondTaskStartingBounds, secondTaskEndingBounds, true /* fadeWithThumbnail */, false /* isInitialSplit */); pendingAnimation.addEndListener(aBoolean -> mSplitSelectStateController.setSecondTaskId(task.key.id, aBoolean1 -> RecentsView.this.resetFromSplitSelectionState())); mSplitSelectStateController.setSecondTask( task, aBoolean1 -> RecentsView.this.resetFromSplitSelectionState())); if (containerTaskView.containsMultipleTasks()) { // If we are launching from a child task, then only hide the thumbnail itself mSecondSplitHiddenView = thumbnailView; Loading