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

Commit 0054d7fc authored by Winson Chung's avatar Winson Chung
Browse files

10/ Update split for shell thread

- Also remove usages of external interface within the shell code
  and remove methods only used in the controller from the interface
  (will update for other components separately)

Bug: 161979899
Test: atest WMShellUnitTests
Test: atest SystemUITests
Change-Id: I06d266095d8e287ba131e41dc6bebefa15c9e477
parent 6c75e58f
Loading
Loading
Loading
Loading
+4 −3
Original line number Original line Diff line number Diff line
@@ -25,6 +25,7 @@ import com.android.wm.shell.onehanded.OneHanded;
import com.android.wm.shell.pip.Pip;
import com.android.wm.shell.pip.Pip;
import com.android.wm.shell.legacysplitscreen.LegacySplitScreen;
import com.android.wm.shell.legacysplitscreen.LegacySplitScreen;
import com.android.wm.shell.splitscreen.SplitScreen;
import com.android.wm.shell.splitscreen.SplitScreen;
import com.android.wm.shell.splitscreen.SplitScreenController;


import java.io.PrintWriter;
import java.io.PrintWriter;
import java.util.Optional;
import java.util.Optional;
@@ -38,7 +39,7 @@ public final class ShellCommandHandlerImpl {
    private static final String TAG = ShellCommandHandlerImpl.class.getSimpleName();
    private static final String TAG = ShellCommandHandlerImpl.class.getSimpleName();


    private final Optional<LegacySplitScreen> mLegacySplitScreenOptional;
    private final Optional<LegacySplitScreen> mLegacySplitScreenOptional;
    private final Optional<SplitScreen> mSplitScreenOptional;
    private final Optional<SplitScreenController> mSplitScreenOptional;
    private final Optional<Pip> mPipOptional;
    private final Optional<Pip> mPipOptional;
    private final Optional<OneHanded> mOneHandedOptional;
    private final Optional<OneHanded> mOneHandedOptional;
    private final Optional<HideDisplayCutout> mHideDisplayCutout;
    private final Optional<HideDisplayCutout> mHideDisplayCutout;
@@ -50,7 +51,7 @@ public final class ShellCommandHandlerImpl {
    public static ShellCommandHandler create(
    public static ShellCommandHandler create(
            ShellTaskOrganizer shellTaskOrganizer,
            ShellTaskOrganizer shellTaskOrganizer,
            Optional<LegacySplitScreen> legacySplitScreenOptional,
            Optional<LegacySplitScreen> legacySplitScreenOptional,
            Optional<SplitScreen> splitScreenOptional,
            Optional<SplitScreenController> splitScreenOptional,
            Optional<Pip> pipOptional,
            Optional<Pip> pipOptional,
            Optional<OneHanded> oneHandedOptional,
            Optional<OneHanded> oneHandedOptional,
            Optional<HideDisplayCutout> hideDisplayCutout,
            Optional<HideDisplayCutout> hideDisplayCutout,
@@ -64,7 +65,7 @@ public final class ShellCommandHandlerImpl {
    private ShellCommandHandlerImpl(
    private ShellCommandHandlerImpl(
            ShellTaskOrganizer shellTaskOrganizer,
            ShellTaskOrganizer shellTaskOrganizer,
            Optional<LegacySplitScreen> legacySplitScreenOptional,
            Optional<LegacySplitScreen> legacySplitScreenOptional,
            Optional<SplitScreen> splitScreenOptional,
            Optional<SplitScreenController> splitScreenOptional,
            Optional<Pip> pipOptional,
            Optional<Pip> pipOptional,
            Optional<OneHanded> oneHandedOptional,
            Optional<OneHanded> oneHandedOptional,
            Optional<HideDisplayCutout> hideDisplayCutout,
            Optional<HideDisplayCutout> hideDisplayCutout,
+5 −4
Original line number Original line Diff line number Diff line
@@ -25,6 +25,7 @@ import com.android.wm.shell.common.annotations.ExternalThread;
import com.android.wm.shell.draganddrop.DragAndDropController;
import com.android.wm.shell.draganddrop.DragAndDropController;
import com.android.wm.shell.legacysplitscreen.LegacySplitScreen;
import com.android.wm.shell.legacysplitscreen.LegacySplitScreen;
import com.android.wm.shell.splitscreen.SplitScreen;
import com.android.wm.shell.splitscreen.SplitScreen;
import com.android.wm.shell.splitscreen.SplitScreenController;
import com.android.wm.shell.transition.Transitions;
import com.android.wm.shell.transition.Transitions;


import java.util.Optional;
import java.util.Optional;
@@ -39,7 +40,7 @@ public class ShellInitImpl {
    private final DragAndDropController mDragAndDropController;
    private final DragAndDropController mDragAndDropController;
    private final ShellTaskOrganizer mShellTaskOrganizer;
    private final ShellTaskOrganizer mShellTaskOrganizer;
    private final Optional<LegacySplitScreen> mLegacySplitScreenOptional;
    private final Optional<LegacySplitScreen> mLegacySplitScreenOptional;
    private final Optional<SplitScreen> mSplitScreenOptional;
    private final Optional<SplitScreenController> mSplitScreenOptional;
    private final Optional<AppPairs> mAppPairsOptional;
    private final Optional<AppPairs> mAppPairsOptional;
    private final FullscreenTaskListener mFullscreenTaskListener;
    private final FullscreenTaskListener mFullscreenTaskListener;
    private final ShellExecutor mMainExecutor;
    private final ShellExecutor mMainExecutor;
@@ -51,7 +52,7 @@ public class ShellInitImpl {
            DragAndDropController dragAndDropController,
            DragAndDropController dragAndDropController,
            ShellTaskOrganizer shellTaskOrganizer,
            ShellTaskOrganizer shellTaskOrganizer,
            Optional<LegacySplitScreen> legacySplitScreenOptional,
            Optional<LegacySplitScreen> legacySplitScreenOptional,
            Optional<SplitScreen> splitScreenOptional,
            Optional<SplitScreenController> splitScreenOptional,
            Optional<AppPairs> appPairsOptional,
            Optional<AppPairs> appPairsOptional,
            FullscreenTaskListener fullscreenTaskListener,
            FullscreenTaskListener fullscreenTaskListener,
            Transitions transitions,
            Transitions transitions,
@@ -71,7 +72,7 @@ public class ShellInitImpl {
            DragAndDropController dragAndDropController,
            DragAndDropController dragAndDropController,
            ShellTaskOrganizer shellTaskOrganizer,
            ShellTaskOrganizer shellTaskOrganizer,
            Optional<LegacySplitScreen> legacySplitScreenOptional,
            Optional<LegacySplitScreen> legacySplitScreenOptional,
            Optional<SplitScreen> splitScreenOptional,
            Optional<SplitScreenController> splitScreenOptional,
            Optional<AppPairs> appPairsOptional,
            Optional<AppPairs> appPairsOptional,
            FullscreenTaskListener fullscreenTaskListener,
            FullscreenTaskListener fullscreenTaskListener,
            Transitions transitions,
            Transitions transitions,
@@ -97,7 +98,7 @@ public class ShellInitImpl {
        mShellTaskOrganizer.registerOrganizer();
        mShellTaskOrganizer.registerOrganizer();


        mAppPairsOptional.ifPresent(AppPairs::onOrganizerRegistered);
        mAppPairsOptional.ifPresent(AppPairs::onOrganizerRegistered);
        mSplitScreenOptional.ifPresent(SplitScreen::onOrganizerRegistered);
        mSplitScreenOptional.ifPresent(SplitScreenController::onOrganizerRegistered);


        // Bind the splitscreen impl to the drag drop controller
        // Bind the splitscreen impl to the drag drop controller
        mDragAndDropController.initialize(mSplitScreenOptional);
        mDragAndDropController.initialize(mSplitScreenOptional);
+3 −2
Original line number Original line Diff line number Diff line
@@ -53,6 +53,7 @@ import com.android.wm.shell.R;
import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.protolog.ShellProtoLogGroup;
import com.android.wm.shell.protolog.ShellProtoLogGroup;
import com.android.wm.shell.splitscreen.SplitScreen;
import com.android.wm.shell.splitscreen.SplitScreen;
import com.android.wm.shell.splitscreen.SplitScreenController;


import java.util.Optional;
import java.util.Optional;


@@ -66,7 +67,7 @@ public class DragAndDropController implements DisplayController.OnDisplaysChange


    private final Context mContext;
    private final Context mContext;
    private final DisplayController mDisplayController;
    private final DisplayController mDisplayController;
    private SplitScreen mSplitScreen;
    private SplitScreenController mSplitScreen;


    private final SparseArray<PerDisplay> mDisplayDropTargets = new SparseArray<>();
    private final SparseArray<PerDisplay> mDisplayDropTargets = new SparseArray<>();
    private final SurfaceControl.Transaction mTransaction = new SurfaceControl.Transaction();
    private final SurfaceControl.Transaction mTransaction = new SurfaceControl.Transaction();
@@ -76,7 +77,7 @@ public class DragAndDropController implements DisplayController.OnDisplaysChange
        mDisplayController = displayController;
        mDisplayController = displayController;
    }
    }


    public void initialize(Optional<SplitScreen> splitscreen) {
    public void initialize(Optional<SplitScreenController> splitscreen) {
        mSplitScreen = splitscreen.orElse(null);
        mSplitScreen = splitscreen.orElse(null);
        mDisplayController.addDisplayWindowListener(this);
        mDisplayController.addDisplayWindowListener(this);
    }
    }
+36 −34
Original line number Original line Diff line number Diff line
@@ -64,7 +64,9 @@ import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.annotation.VisibleForTesting;


import com.android.wm.shell.common.DisplayLayout;
import com.android.wm.shell.common.DisplayLayout;
import com.android.wm.shell.splitscreen.SplitScreen;
import com.android.wm.shell.splitscreen.SplitScreen.StagePosition;
import com.android.wm.shell.splitscreen.SplitScreen.StageType;
import com.android.wm.shell.splitscreen.SplitScreenController;


import java.lang.annotation.Retention;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.RetentionPolicy;
@@ -81,18 +83,18 @@ public class DragAndDropPolicy {
    private final Context mContext;
    private final Context mContext;
    private final ActivityTaskManager mActivityTaskManager;
    private final ActivityTaskManager mActivityTaskManager;
    private final Starter mStarter;
    private final Starter mStarter;
    private final SplitScreen mSplitScreen;
    private final SplitScreenController mSplitScreen;
    private final ArrayList<DragAndDropPolicy.Target> mTargets = new ArrayList<>();
    private final ArrayList<DragAndDropPolicy.Target> mTargets = new ArrayList<>();


    private DragSession mSession;
    private DragSession mSession;


    public DragAndDropPolicy(Context context, SplitScreen splitScreen) {
    public DragAndDropPolicy(Context context, SplitScreenController splitScreen) {
        this(context, ActivityTaskManager.getInstance(), splitScreen, new DefaultStarter(context));
        this(context, ActivityTaskManager.getInstance(), splitScreen, new DefaultStarter(context));
    }
    }


    @VisibleForTesting
    @VisibleForTesting
    DragAndDropPolicy(Context context, ActivityTaskManager activityTaskManager,
    DragAndDropPolicy(Context context, ActivityTaskManager activityTaskManager,
            SplitScreen splitScreen, Starter starter) {
            SplitScreenController splitScreen, Starter starter) {
        mContext = context;
        mContext = context;
        mActivityTaskManager = activityTaskManager;
        mActivityTaskManager = activityTaskManager;
        mSplitScreen = splitScreen;
        mSplitScreen = splitScreen;
@@ -200,8 +202,8 @@ public class DragAndDropPolicy {
        final boolean inSplitScreen = mSplitScreen != null && mSplitScreen.isSplitScreenVisible();
        final boolean inSplitScreen = mSplitScreen != null && mSplitScreen.isSplitScreenVisible();
        final boolean leftOrTop = target.type == TYPE_SPLIT_TOP || target.type == TYPE_SPLIT_LEFT;
        final boolean leftOrTop = target.type == TYPE_SPLIT_TOP || target.type == TYPE_SPLIT_LEFT;


        @SplitScreen.StageType int stage = STAGE_TYPE_UNDEFINED;
        @StageType int stage = STAGE_TYPE_UNDEFINED;
        @SplitScreen.StagePosition int position = STAGE_POSITION_UNDEFINED;
        @StagePosition int position = STAGE_POSITION_UNDEFINED;
        if (target.type != TYPE_FULLSCREEN && mSplitScreen != null) {
        if (target.type != TYPE_FULLSCREEN && mSplitScreen != null) {
            // Update launch options for the split side we are targeting.
            // Update launch options for the split side we are targeting.
            position = leftOrTop ? STAGE_POSITION_TOP_OR_LEFT : STAGE_POSITION_BOTTOM_OR_RIGHT;
            position = leftOrTop ? STAGE_POSITION_TOP_OR_LEFT : STAGE_POSITION_BOTTOM_OR_RIGHT;
@@ -213,7 +215,28 @@ public class DragAndDropPolicy {


        final ClipDescription description = data.getDescription();
        final ClipDescription description = data.getDescription();
        final Intent dragData = mSession.dragData;
        final Intent dragData = mSession.dragData;
        mStarter.startClipDescription(description, dragData, stage, position);
        startClipDescription(description, dragData, stage, position);
    }

    private void startClipDescription(ClipDescription description, Intent intent,
            @StageType int stage, @StagePosition int position) {
        final boolean isTask = description.hasMimeType(MIMETYPE_APPLICATION_TASK);
        final boolean isShortcut = description.hasMimeType(MIMETYPE_APPLICATION_SHORTCUT);
        final Bundle opts = intent.hasExtra(EXTRA_ACTIVITY_OPTIONS)
                ? intent.getBundleExtra(EXTRA_ACTIVITY_OPTIONS) : new Bundle();

        if (isTask) {
            final int taskId = intent.getIntExtra(EXTRA_TASK_ID, INVALID_TASK_ID);
            mStarter.startTask(taskId, stage, position, opts);
        } else if (isShortcut) {
            final String packageName = intent.getStringExtra(EXTRA_PACKAGE_NAME);
            final String id = intent.getStringExtra(EXTRA_SHORTCUT_ID);
            final UserHandle user = intent.getParcelableExtra(EXTRA_USER);
            mStarter.startShortcut(packageName, id, stage, position, opts, user);
        } else {
            mStarter.startIntent(intent.getParcelableExtra(EXTRA_PENDING_INTENT), stage, position,
                    opts);
        }
    }
    }


    /**
    /**
@@ -267,34 +290,13 @@ public class DragAndDropPolicy {
    /**
    /**
     * Interface for actually committing the task launches.
     * Interface for actually committing the task launches.
     */
     */
    @VisibleForTesting
    public interface Starter {
    public interface Starter {
        default void startClipDescription(ClipDescription description, Intent intent,
        void startTask(int taskId, @StageType int stage, @StagePosition int position,
                @SplitScreen.StageType int stage, @SplitScreen.StagePosition int position) {
                @Nullable Bundle options);
            final boolean isTask = description.hasMimeType(MIMETYPE_APPLICATION_TASK);
        void startShortcut(String packageName, String shortcutId, @StageType int stage,
            final boolean isShortcut = description.hasMimeType(MIMETYPE_APPLICATION_SHORTCUT);
                @StagePosition int position, @Nullable Bundle options, UserHandle user);
            final Bundle opts = intent.hasExtra(EXTRA_ACTIVITY_OPTIONS)
        void startIntent(PendingIntent intent, @StageType int stage, @StagePosition int position,
                    ? intent.getBundleExtra(EXTRA_ACTIVITY_OPTIONS) : new Bundle();
                @Nullable Bundle options);

            if (isTask) {
                final int taskId = intent.getIntExtra(EXTRA_TASK_ID, INVALID_TASK_ID);
                startTask(taskId, stage, position, opts);
            } else if (isShortcut) {
                final String packageName = intent.getStringExtra(EXTRA_PACKAGE_NAME);
                final String id = intent.getStringExtra(EXTRA_SHORTCUT_ID);
                final UserHandle user = intent.getParcelableExtra(EXTRA_USER);
                startShortcut(packageName, id, stage, position, opts, user);
            } else {
                startIntent(intent.getParcelableExtra(EXTRA_PENDING_INTENT), stage, position, opts);
            }
        }
        void startTask(int taskId, @SplitScreen.StageType int stage,
                @SplitScreen.StagePosition int position, @Nullable Bundle options);
        void startShortcut(String packageName, String shortcutId,
                @SplitScreen.StageType int stage, @SplitScreen.StagePosition int position,
                @Nullable Bundle options, UserHandle user);
        void startIntent(PendingIntent intent, @SplitScreen.StageType int stage,
                @SplitScreen.StagePosition int position, @Nullable Bundle options);
        void enterSplitScreen(int taskId, boolean leftOrTop);
        void enterSplitScreen(int taskId, boolean leftOrTop);
        void exitSplitScreen();
        void exitSplitScreen();
    }
    }
+2 −2
Original line number Original line Diff line number Diff line
@@ -42,7 +42,7 @@ import com.android.internal.protolog.common.ProtoLog;
import com.android.wm.shell.R;
import com.android.wm.shell.R;
import com.android.wm.shell.common.DisplayLayout;
import com.android.wm.shell.common.DisplayLayout;
import com.android.wm.shell.protolog.ShellProtoLogGroup;
import com.android.wm.shell.protolog.ShellProtoLogGroup;
import com.android.wm.shell.splitscreen.SplitScreen;
import com.android.wm.shell.splitscreen.SplitScreenController;


import java.util.ArrayList;
import java.util.ArrayList;


@@ -61,7 +61,7 @@ public class DragLayout extends View {
    private boolean mIsShowing;
    private boolean mIsShowing;
    private boolean mHasDropped;
    private boolean mHasDropped;


    public DragLayout(Context context, SplitScreen splitscreen) {
    public DragLayout(Context context, SplitScreenController splitscreen) {
        super(context);
        super(context);
        mPolicy = new DragAndDropPolicy(context, splitscreen);
        mPolicy = new DragAndDropPolicy(context, splitscreen);
        mDisplayMargin = context.getResources().getDimensionPixelSize(
        mDisplayMargin = context.getResources().getDimensionPixelSize(
Loading