Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6416cea0 authored by Tracy Zhou's avatar Tracy Zhou Committed by Android (Google) Code Review
Browse files

Merge "Support launching an intent and a task from the same app as multi-instance" into tm-dev

parents fec75c5a d9cb8cfa
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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));
+2 −2
Original line number Diff line number Diff line
@@ -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);

+49 −17
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
    }
@@ -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;
    }
@@ -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);
    }

@@ -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}
@@ -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);
            }
        }
@@ -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;
@@ -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;
    }
}
+2 −3
Original line number Diff line number Diff line
@@ -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
+3 −31
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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);
@@ -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);
    }

@@ -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;