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

Commit e268f3fb authored by Winson Chung's avatar Winson Chung Committed by Sunny Goyal
Browse files

Add home task container overlay

Test: Verified the flow in Launcher
Bug: 273828110
Change-Id: Idba36284b6030070d2f650fdb50a93215b5d9dbf
parent 3d182295
Loading
Loading
Loading
Loading
+31 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.wm.shell;

import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
@@ -168,6 +169,13 @@ public class ShellTaskOrganizer extends TaskOrganizer implements
    private final Object mLock = new Object();
    private StartingWindowController mStartingWindow;

    /** Overlay surface for home root task */
    private final SurfaceControl mHomeTaskOverlayContainer = new SurfaceControl.Builder()
            .setName("home_task_overlay_container")
            .setContainerLayer()
            .setHidden(false)
            .build();

    /**
     * In charge of showing compat UI. Can be {@code null} if the device doesn't support size
     * compat or if this isn't the main {@link ShellTaskOrganizer}.
@@ -428,6 +436,14 @@ public class ShellTaskOrganizer extends TaskOrganizer implements
        }
    }

    /**
     * Returns a surface which can be used to attach overlays to the home root task
     */
    @NonNull
    public SurfaceControl getHomeTaskOverlayContainer() {
        return mHomeTaskOverlayContainer;
    }

    @Override
    public void addStartingWindow(StartingWindowInfo info) {
        if (mStartingWindow != null) {
@@ -485,6 +501,15 @@ public class ShellTaskOrganizer extends TaskOrganizer implements
        if (mUnfoldAnimationController != null) {
            mUnfoldAnimationController.onTaskAppeared(info.getTaskInfo(), info.getLeash());
        }

        if (info.getTaskInfo().getActivityType() == ACTIVITY_TYPE_HOME) {
            ProtoLog.v(WM_SHELL_TASK_ORG, "Adding overlay to home task");
            final SurfaceControl.Transaction t = new SurfaceControl.Transaction();
            t.setLayer(mHomeTaskOverlayContainer, Integer.MAX_VALUE);
            t.reparent(mHomeTaskOverlayContainer, info.getLeash());
            t.apply();
        }

        notifyLocusVisibilityIfNeeded(info.getTaskInfo());
        notifyCompatUI(info.getTaskInfo(), listener);
        mRecentTasks.ifPresent(recentTasks -> recentTasks.onTaskAdded(info.getTaskInfo()));
@@ -579,6 +604,12 @@ public class ShellTaskOrganizer extends TaskOrganizer implements
            notifyCompatUI(taskInfo, null /* taskListener */);
            // Notify the recent tasks that a task has been removed
            mRecentTasks.ifPresent(recentTasks -> recentTasks.onTaskRemoved(taskInfo));
            if (taskInfo.getActivityType() == ACTIVITY_TYPE_HOME) {
                SurfaceControl.Transaction t = new SurfaceControl.Transaction();
                t.reparent(mHomeTaskOverlayContainer, null);
                t.apply();
                ProtoLog.v(WM_SHELL_TASK_ORG, "Removing overlay surface");
            }

            if (!ENABLE_SHELL_TRANSITIONS && (appearedInfo.getLeash() != null)) {
                // Preemptively clean up the leash only if shell transitions are not enabled
+9 −1
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.wm.shell.transition;

import android.view.SurfaceControl;
import android.window.RemoteTransition;
import android.window.TransitionFilter;

@@ -42,6 +43,13 @@ interface IShellTransitions {
     */
    IBinder getShellApplyToken() = 3;

    /** Set listener that will receive callbacks about transitions involving home activity */
    /**
     * Set listener that will receive callbacks about transitions involving home activity.
     */
    oneway void setHomeTransitionListener(in IHomeTransitionListener listener) = 4;

    /**
     * Returns a container surface for the home root task.
     */
    SurfaceControl getHomeTaskOverlayContainer() = 5;
}
+19 −4
Original line number Diff line number Diff line
@@ -64,7 +64,6 @@ import android.window.TransitionInfo;
import android.window.TransitionMetrics;
import android.window.TransitionRequestInfo;
import android.window.WindowContainerTransaction;
import android.window.WindowOrganizer;

import androidx.annotation.BinderThread;

@@ -72,6 +71,7 @@ import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.protolog.common.ProtoLog;
import com.android.wm.shell.RootTaskDisplayAreaOrganizer;
import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.ExternalInterfaceBinder;
import com.android.wm.shell.common.RemoteCallable;
@@ -172,7 +172,7 @@ public class Transitions implements RemoteCallable<Transitions>,
    /** Transition to animate task to desktop. */
    public static final int TRANSIT_MOVE_TO_DESKTOP = WindowManager.TRANSIT_FIRST_CUSTOM + 15;

    private final WindowOrganizer mOrganizer;
    private final ShellTaskOrganizer mOrganizer;
    private final Context mContext;
    private final ShellExecutor mMainExecutor;
    private final ShellExecutor mAnimExecutor;
@@ -264,7 +264,7 @@ public class Transitions implements RemoteCallable<Transitions>,
    public Transitions(@NonNull Context context,
            @NonNull ShellInit shellInit,
            @NonNull ShellController shellController,
            @NonNull WindowOrganizer organizer,
            @NonNull ShellTaskOrganizer organizer,
            @NonNull TransactionPool pool,
            @NonNull DisplayController displayController,
            @NonNull ShellExecutor mainExecutor,
@@ -280,7 +280,7 @@ public class Transitions implements RemoteCallable<Transitions>,
            @NonNull ShellInit shellInit,
            @Nullable ShellCommandHandler shellCommandHandler,
            @NonNull ShellController shellController,
            @NonNull WindowOrganizer organizer,
            @NonNull ShellTaskOrganizer organizer,
            @NonNull TransactionPool pool,
            @NonNull DisplayController displayController,
            @NonNull ShellExecutor mainExecutor,
@@ -1240,6 +1240,10 @@ public class Transitions implements RemoteCallable<Transitions>,
        }
    }

    private SurfaceControl getHomeTaskOverlayContainer() {
        return mOrganizer.getHomeTaskOverlayContainer();
    }

    /**
     * Interface for a callback that must be called after a TransitionHandler finishes playing an
     * animation.
@@ -1470,6 +1474,17 @@ public class Transitions implements RemoteCallable<Transitions>,
                                listener);
                    });
        }

        @Override
        public SurfaceControl getHomeTaskOverlayContainer() {
            SurfaceControl[] result = new SurfaceControl[1];
            executeRemoteCallWithTaskPermission(mTransitions, "getHomeTaskOverlayContainer",
                    (controller) -> {
                        result[0] = controller.getHomeTaskOverlayContainer();
                    }, true /* blocking */);
            // Return a copy as writing to parcel releases the original surface
            return new SurfaceControl(result[0], "Transitions.HomeOverlay");
        }
    }

    private class SettingsObserver extends ContentObserver {
+2 −2
Original line number Diff line number Diff line
@@ -40,12 +40,12 @@ import android.os.RemoteException;
import android.view.SurfaceControl;
import android.window.TransitionInfo;
import android.window.TransitionInfo.TransitionMode;
import android.window.WindowOrganizer;

import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
import androidx.test.platform.app.InstrumentationRegistry;

import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.ShellTestCase;
import com.android.wm.shell.TestShellExecutor;
import com.android.wm.shell.common.DisplayController;
@@ -68,7 +68,7 @@ import java.util.List;
@RunWith(AndroidJUnit4.class)
public class HomeTransitionObserverTest extends ShellTestCase {

    private final WindowOrganizer mOrganizer = mock(WindowOrganizer.class);
    private final ShellTaskOrganizer mOrganizer = mock(ShellTaskOrganizer.class);
    private final TransactionPool mTransactionPool = mock(TransactionPool.class);
    private final Context mContext =
            InstrumentationRegistry.getInstrumentation().getTargetContext();
+2 −2
Original line number Diff line number Diff line
@@ -87,7 +87,6 @@ import android.window.TransitionInfo;
import android.window.TransitionRequestInfo;
import android.window.WindowContainerToken;
import android.window.WindowContainerTransaction;
import android.window.WindowOrganizer;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -98,6 +97,7 @@ import androidx.test.platform.app.InstrumentationRegistry;
import com.android.internal.R;
import com.android.internal.policy.TransitionAnimation;
import com.android.wm.shell.RootTaskDisplayAreaOrganizer;
import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.ShellTestCase;
import com.android.wm.shell.TestShellExecutor;
import com.android.wm.shell.common.DisplayController;
@@ -130,7 +130,7 @@ import java.util.function.Function;
@RunWith(AndroidJUnit4.class)
public class ShellTransitionTests extends ShellTestCase {

    private final WindowOrganizer mOrganizer = mock(WindowOrganizer.class);
    private final ShellTaskOrganizer mOrganizer = mock(ShellTaskOrganizer.class);
    private final TransactionPool mTransactionPool = mock(TransactionPool.class);
    private final Context mContext =
            InstrumentationRegistry.getInstrumentation().getTargetContext();