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

Commit d6471289 authored by Jorge Gil's avatar Jorge Gil
Browse files

Propagate split's task info changes to window decorations

Window decorations were created for split leafs but were not updated
when the task description or it's focused/visible state changed
because the WindowDecorViewModel only received task info changes
from fullscreen and freeform TaskListeners.
This change forwards #onTaskInfoChanged calls from the stage
TaskListeners to the WindowDecorViewModel so that its internal state
is always up to date and to allow decorations from being correctly
drawn or hidden.

Bug: 280831370
Test: atest WMShellUnitTests
Test: manual - put Gmail and Chrome into split screen, then open a
fullscreen app from the taskbar. Verify that the fullscreen task's
caption responds to drags to enter desktop.

Change-Id: I5ce5df3abf540f7f09e42a70f48cb8b07d64fc99
parent 0a6addc9
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -205,8 +205,7 @@ public abstract class WMShellModule {
            SyncTransactionQueue syncQueue,
            Transitions transitions,
            Optional<DesktopModeController> desktopModeController,
            Optional<DesktopTasksController> desktopTasksController,
            Optional<SplitScreenController> splitScreenController) {
            Optional<DesktopTasksController> desktopTasksController) {
        if (DesktopModeStatus.isAnyEnabled()) {
            return new DesktopModeWindowDecorViewModel(
                    context,
@@ -217,8 +216,7 @@ public abstract class WMShellModule {
                    syncQueue,
                    transitions,
                    desktopModeController,
                    desktopTasksController,
                    splitScreenController);
                    desktopTasksController);
        }
        return new CaptionWindowDecorViewModel(
                    context,
@@ -336,11 +334,13 @@ public abstract class WMShellModule {
            IconProvider iconProvider,
            Optional<RecentTasksController> recentTasks,
            LaunchAdjacentController launchAdjacentController,
            Optional<WindowDecorViewModel> windowDecorViewModel,
            @ShellMainThread ShellExecutor mainExecutor) {
        return new SplitScreenController(context, shellInit, shellCommandHandler, shellController,
                shellTaskOrganizer, syncQueue, rootTaskDisplayAreaOrganizer, displayController,
                displayImeController, displayInsetsController, dragAndDropController, transitions,
                transactionPool, iconProvider, recentTasks, launchAdjacentController, mainExecutor);
                transactionPool, iconProvider, recentTasks, launchAdjacentController,
                windowDecorViewModel, mainExecutor);
    }

    //
+6 −2
Original line number Diff line number Diff line
@@ -24,6 +24,9 @@ import android.window.WindowContainerTransaction;
import com.android.launcher3.icons.IconProvider;
import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.common.SyncTransactionQueue;
import com.android.wm.shell.windowdecor.WindowDecorViewModel;

import java.util.Optional;

/**
 * Main stage for split-screen mode. When split-screen is active all standard activity types launch
@@ -35,9 +38,10 @@ class MainStage extends StageTaskListener {

    MainStage(Context context, ShellTaskOrganizer taskOrganizer, int displayId,
            StageListenerCallbacks callbacks, SyncTransactionQueue syncQueue,
            SurfaceSession surfaceSession, IconProvider iconProvider) {
            SurfaceSession surfaceSession, IconProvider iconProvider,
            Optional<WindowDecorViewModel> windowDecorViewModel) {
        super(context, taskOrganizer, displayId, callbacks, syncQueue, surfaceSession,
                iconProvider);
                iconProvider, windowDecorViewModel);
    }

    boolean isActive() {
+6 −2
Original line number Diff line number Diff line
@@ -25,6 +25,9 @@ import android.window.WindowContainerTransaction;
import com.android.launcher3.icons.IconProvider;
import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.common.SyncTransactionQueue;
import com.android.wm.shell.windowdecor.WindowDecorViewModel;

import java.util.Optional;

/**
 * Side stage for split-screen mode. Only tasks that are explicitly pinned to this stage show up
@@ -37,9 +40,10 @@ class SideStage extends StageTaskListener {

    SideStage(Context context, ShellTaskOrganizer taskOrganizer, int displayId,
            StageListenerCallbacks callbacks, SyncTransactionQueue syncQueue,
            SurfaceSession surfaceSession, IconProvider iconProvider) {
            SurfaceSession surfaceSession, IconProvider iconProvider,
            Optional<WindowDecorViewModel> windowDecorViewModel) {
        super(context, taskOrganizer, displayId, callbacks, syncQueue, surfaceSession,
                iconProvider);
                iconProvider, windowDecorViewModel);
    }

    boolean removeAllTasks(WindowContainerTransaction wct, boolean toTop) {
+10 −2
Original line number Diff line number Diff line
@@ -94,6 +94,7 @@ import com.android.wm.shell.sysui.ShellCommandHandler;
import com.android.wm.shell.sysui.ShellController;
import com.android.wm.shell.sysui.ShellInit;
import com.android.wm.shell.transition.Transitions;
import com.android.wm.shell.windowdecor.WindowDecorViewModel;

import java.io.PrintWriter;
import java.lang.annotation.Retention;
@@ -172,6 +173,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
    private final IconProvider mIconProvider;
    private final Optional<RecentTasksController> mRecentTasksOptional;
    private final LaunchAdjacentController mLaunchAdjacentController;
    private final Optional<WindowDecorViewModel> mWindowDecorViewModel;
    private final SplitScreenShellCommandHandler mSplitScreenShellCommandHandler;
    private final String[] mAppsSupportMultiInstances;

@@ -199,6 +201,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
            IconProvider iconProvider,
            Optional<RecentTasksController> recentTasks,
            LaunchAdjacentController launchAdjacentController,
            Optional<WindowDecorViewModel> windowDecorViewModel,
            ShellExecutor mainExecutor) {
        mShellCommandHandler = shellCommandHandler;
        mShellController = shellController;
@@ -216,6 +219,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
        mIconProvider = iconProvider;
        mRecentTasksOptional = recentTasks;
        mLaunchAdjacentController = launchAdjacentController;
        mWindowDecorViewModel = windowDecorViewModel;
        mSplitScreenShellCommandHandler = new SplitScreenShellCommandHandler(this);
        // TODO(b/238217847): Temporarily add this check here until we can remove the dynamic
        //                    override for this controller from the base module
@@ -246,6 +250,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
            IconProvider iconProvider,
            RecentTasksController recentTasks,
            LaunchAdjacentController launchAdjacentController,
            WindowDecorViewModel windowDecorViewModel,
            ShellExecutor mainExecutor,
            StageCoordinator stageCoordinator) {
        mShellCommandHandler = shellCommandHandler;
@@ -264,6 +269,7 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
        mIconProvider = iconProvider;
        mRecentTasksOptional = Optional.of(recentTasks);
        mLaunchAdjacentController = launchAdjacentController;
        mWindowDecorViewModel = Optional.of(windowDecorViewModel);
        mStageCoordinator = stageCoordinator;
        mSplitScreenShellCommandHandler = new SplitScreenShellCommandHandler(this);
        shellInit.addInitCallback(this::onInit, this);
@@ -296,13 +302,15 @@ public class SplitScreenController implements DragAndDropPolicy.Starter,
            mStageCoordinator = createStageCoordinator();
        }
        mDragAndDropController.ifPresent(controller -> controller.setSplitScreenController(this));
        mWindowDecorViewModel.ifPresent(viewModel -> viewModel.setSplitScreenController(this));
    }

    protected StageCoordinator createStageCoordinator() {
        return new StageCoordinator(mContext, DEFAULT_DISPLAY, mSyncQueue,
                mTaskOrganizer, mDisplayController, mDisplayImeController,
                mDisplayInsetsController, mTransitions, mTransactionPool,
                mIconProvider, mMainExecutor, mRecentTasksOptional, mLaunchAdjacentController);
                mDisplayInsetsController, mTransitions, mTransactionPool, mIconProvider,
                mMainExecutor, mRecentTasksOptional, mLaunchAdjacentController,
                mWindowDecorViewModel);
    }

    @Override
+13 −5
Original line number Diff line number Diff line
@@ -141,6 +141,7 @@ import com.android.wm.shell.transition.LegacyTransitions;
import com.android.wm.shell.transition.Transitions;
import com.android.wm.shell.util.SplitBounds;
import com.android.wm.shell.util.TransitionUtil;
import com.android.wm.shell.windowdecor.WindowDecorViewModel;

import java.io.PrintWriter;
import java.util.ArrayList;
@@ -198,6 +199,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
    private final ArrayList<Integer> mPausingTasks = new ArrayList<>();
    private final Optional<RecentTasksController> mRecentTasks;
    private final LaunchAdjacentController mLaunchAdjacentController;
    private final Optional<WindowDecorViewModel> mWindowDecorViewModel;

    private final Rect mTempRect1 = new Rect();
    private final Rect mTempRect2 = new Rect();
@@ -276,7 +278,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
            TransactionPool transactionPool,
            IconProvider iconProvider, ShellExecutor mainExecutor,
            Optional<RecentTasksController> recentTasks,
            LaunchAdjacentController launchAdjacentController) {
            LaunchAdjacentController launchAdjacentController,
            Optional<WindowDecorViewModel> windowDecorViewModel) {
        mContext = context;
        mDisplayId = displayId;
        mSyncQueue = syncQueue;
@@ -285,6 +288,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
        mMainExecutor = mainExecutor;
        mRecentTasks = recentTasks;
        mLaunchAdjacentController = launchAdjacentController;
        mWindowDecorViewModel = windowDecorViewModel;

        taskOrganizer.createRootTask(displayId, WINDOWING_MODE_FULLSCREEN, this /* listener */);

@@ -295,7 +299,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
                mMainStageListener,
                mSyncQueue,
                mSurfaceSession,
                iconProvider);
                iconProvider,
                mWindowDecorViewModel);
        mSideStage = new SideStage(
                mContext,
                mTaskOrganizer,
@@ -303,7 +308,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
                mSideStageListener,
                mSyncQueue,
                mSurfaceSession,
                iconProvider);
                iconProvider,
                mWindowDecorViewModel);
        mDisplayController = displayController;
        mDisplayImeController = displayImeController;
        mDisplayInsetsController = displayInsetsController;
@@ -332,7 +338,8 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
            Transitions transitions, TransactionPool transactionPool,
            ShellExecutor mainExecutor,
            Optional<RecentTasksController> recentTasks,
            LaunchAdjacentController launchAdjacentController) {
            LaunchAdjacentController launchAdjacentController,
            Optional<WindowDecorViewModel> windowDecorViewModel) {
        mContext = context;
        mDisplayId = displayId;
        mSyncQueue = syncQueue;
@@ -350,6 +357,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
        mMainExecutor = mainExecutor;
        mRecentTasks = recentTasks;
        mLaunchAdjacentController = launchAdjacentController;
        mWindowDecorViewModel = windowDecorViewModel;
        mDisplayController.addDisplayWindowListener(this);
        mDisplayLayout = new DisplayLayout();
        transitions.addHandler(this);
@@ -1705,7 +1713,7 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler,
        if (mRootTaskInfo == null || mRootTaskInfo.taskId != taskInfo.taskId) {
            throw new IllegalArgumentException(this + "\n Unknown task info changed: " + taskInfo);
        }

        mWindowDecorViewModel.ifPresent(viewModel -> viewModel.onTaskInfoChanged(taskInfo));
        mRootTaskInfo = taskInfo;
        if (mSplitLayout != null
                && mSplitLayout.updateConfiguration(mRootTaskInfo.configuration)
Loading