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

Commit 91a416ba authored by Winson Chung's avatar Winson Chung
Browse files

3/ Fix inverted ShellInit dependency order (no functional changes)



- We were previously initializing components manually because some startup
  is order-dependent, which led to an increasing number of dependencies
  from ShellTaskOrganizer on things that it really doesn't need to know
  about.  The initialization order actually matches the dependency order
  pretty closely, so instead we can have these components add callbacks
  in the order they are created and initalize in sequence.
- Also move some logic out of constructors to the init callback
- The other subtle issue is that the provider for ShellInitImpl was
  implicitly also ensuring that certain shell components were created at
  startup (since they aren't otherwise referenced by any SysUI component
  directly or indirectly).  Instead, separate that out into another
  more explicit provider, with the @ShellCreateTrigger annotation, and
  allow subclasses to provide a @ShellCreateTriggerOverride annotated
  provider for product-specific initialization

Test: atest WMShellUnitTests
Test: atest SystemUITests
Bug: 238217847

Change-Id: I4a2583ceeaf469130ac07fc8c4e267c28843b7b8
Signed-off-by: default avatarWinson Chung <winsonc@google.com>
parent 68de8997
Loading
Loading
Loading
Loading
+25 −21
Original line number Diff line number Diff line
@@ -31,7 +31,6 @@ import android.annotation.Nullable;
import android.app.ActivityManager.RunningTaskInfo;
import android.app.TaskInfo;
import android.app.WindowConfiguration;
import android.content.Context;
import android.content.LocusId;
import android.content.pm.ActivityInfo;
import android.graphics.Rect;
@@ -56,6 +55,7 @@ import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.compatui.CompatUIController;
import com.android.wm.shell.recents.RecentTasksController;
import com.android.wm.shell.startingsurface.StartingWindowController;
import com.android.wm.shell.sysui.ShellInit;
import com.android.wm.shell.unfold.UnfoldAnimationController;

import java.io.PrintWriter;
@@ -186,39 +186,43 @@ public class ShellTaskOrganizer extends TaskOrganizer implements
    @Nullable
    private RunningTaskInfo mLastFocusedTaskInfo;

    public ShellTaskOrganizer(ShellExecutor mainExecutor, Context context) {
        this(null /* taskOrganizerController */, mainExecutor, context, null /* compatUI */,
    public ShellTaskOrganizer(ShellExecutor mainExecutor) {
        this(null /* shellInit */, null /* taskOrganizerController */, null /* compatUI */,
                Optional.empty() /* unfoldAnimationController */,
                Optional.empty() /* recentTasksController */);
                Optional.empty() /* recentTasksController */,
                mainExecutor);
    }

    public ShellTaskOrganizer(ShellExecutor mainExecutor, Context context, @Nullable
            CompatUIController compatUI) {
        this(null /* taskOrganizerController */, mainExecutor, context, compatUI,
                Optional.empty() /* unfoldAnimationController */,
                Optional.empty() /* recentTasksController */);
    }

    public ShellTaskOrganizer(ShellExecutor mainExecutor, Context context, @Nullable
            CompatUIController compatUI,
    public ShellTaskOrganizer(ShellInit shellInit,
            @Nullable CompatUIController compatUI,
            Optional<UnfoldAnimationController> unfoldAnimationController,
            Optional<RecentTasksController> recentTasks) {
        this(null /* taskOrganizerController */, mainExecutor, context, compatUI,
                unfoldAnimationController, recentTasks);
            Optional<RecentTasksController> recentTasks,
            ShellExecutor mainExecutor) {
        this(shellInit, null /* taskOrganizerController */, compatUI,
                unfoldAnimationController, recentTasks, mainExecutor);
    }

    @VisibleForTesting
    protected ShellTaskOrganizer(ITaskOrganizerController taskOrganizerController,
            ShellExecutor mainExecutor, Context context, @Nullable CompatUIController compatUI,
    protected ShellTaskOrganizer(ShellInit shellInit,
            ITaskOrganizerController taskOrganizerController,
            @Nullable CompatUIController compatUI,
            Optional<UnfoldAnimationController> unfoldAnimationController,
            Optional<RecentTasksController> recentTasks) {
            Optional<RecentTasksController> recentTasks,
            ShellExecutor mainExecutor) {
        super(taskOrganizerController, mainExecutor);
        mCompatUI = compatUI;
        mRecentTasks = recentTasks;
        mUnfoldAnimationController = unfoldAnimationController.orElse(null);
        if (compatUI != null) {
            compatUI.setCompatUICallback(this);
        if (shellInit != null) {
            shellInit.addInitCallback(this::onInit, this);
        }
    }

    private void onInit() {
        if (mCompatUI != null) {
            mCompatUI.setCompatUICallback(this);
        }
        registerOrganizer();
    }

    @Override
+7 −2
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import android.window.WindowContainerTransaction;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.android.wm.shell.sysui.ShellInit;
import com.android.wm.shell.transition.Transitions;

/**
@@ -38,13 +39,17 @@ public class ActivityEmbeddingController implements Transitions.TransitionHandle
    private final Context mContext;
    private final Transitions mTransitions;

    public ActivityEmbeddingController(Context context, Transitions transitions) {
    public ActivityEmbeddingController(Context context, ShellInit shellInit,
            Transitions transitions) {
        mContext = context;
        mTransitions = transitions;
        if (Transitions.ENABLE_SHELL_TRANSITIONS) {
            shellInit.addInitCallback(this::onInit, this);
        }
    }

    /** Registers to handle transitions. */
    public void init() {
    public void onInit() {
        mTransitions.addHandler(this);
    }

+4 −1
Original line number Diff line number Diff line
@@ -101,6 +101,7 @@ import com.android.wm.shell.onehanded.OneHandedTransitionCallback;
import com.android.wm.shell.pip.PinnedStackListenerForwarder;
import com.android.wm.shell.sysui.ConfigurationChangeListener;
import com.android.wm.shell.sysui.ShellController;
import com.android.wm.shell.sysui.ShellInit;

import java.io.PrintWriter;
import java.util.ArrayList;
@@ -227,6 +228,7 @@ public class BubbleController implements ConfigurationChangeListener {

  
    public BubbleController(Context context,
            ShellInit shellInit,
            ShellController shellController,
            BubbleData data,
            @Nullable BubbleStackView.SurfaceSynchronizer synchronizer,
@@ -279,6 +281,7 @@ public class BubbleController implements ConfigurationChangeListener {
        mOneHandedOptional = oneHandedOptional;
        mDragAndDropController = dragAndDropController;
        mSyncQueue = syncQueue;
        shellInit.addInitCallback(this::onInit, this);
    }

    private void registerOneHandedState(OneHandedController oneHanded) {
@@ -300,7 +303,7 @@ public class BubbleController implements ConfigurationChangeListener {
                });
    }

    public void initialize() {
    protected void onInit() {
        mBubbleData.setListener(mBubbleDataListener);
        mBubbleData.setSuppressionChangedListener(this::onBubbleMetadataFlagChanged);

+7 −1
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import android.window.WindowContainerTransaction;
import androidx.annotation.BinderThread;

import com.android.wm.shell.common.annotations.ShellMainThread;
import com.android.wm.shell.sysui.ShellInit;

import java.util.concurrent.CopyOnWriteArrayList;

@@ -47,10 +48,15 @@ public class DisplayChangeController {
    private final CopyOnWriteArrayList<OnDisplayChangingListener> mDisplayChangeListener =
            new CopyOnWriteArrayList<>();

    public DisplayChangeController(IWindowManager wmService, ShellExecutor mainExecutor) {
    public DisplayChangeController(IWindowManager wmService, ShellInit shellInit,
            ShellExecutor mainExecutor) {
        mMainExecutor = mainExecutor;
        mWmService = wmService;
        mControllerImpl = new DisplayChangeWindowControllerImpl();
        shellInit.addInitCallback(this::onInit, this);
    }

    private void onInit() {
        try {
            mWmService.setDisplayChangeWindowController(mControllerImpl);
        } catch (RemoteException e) {
+8 −3
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import androidx.annotation.BinderThread;

import com.android.wm.shell.common.DisplayChangeController.OnDisplayChangingListener;
import com.android.wm.shell.common.annotations.ShellMainThread;
import com.android.wm.shell.sysui.ShellInit;

import java.util.ArrayList;
import java.util.List;
@@ -57,19 +58,23 @@ public class DisplayController {
    private final SparseArray<DisplayRecord> mDisplays = new SparseArray<>();
    private final ArrayList<OnDisplaysChangedListener> mDisplayChangedListeners = new ArrayList<>();

    public DisplayController(Context context, IWindowManager wmService,
    public DisplayController(Context context, IWindowManager wmService, ShellInit shellInit,
            ShellExecutor mainExecutor) {
        mMainExecutor = mainExecutor;
        mContext = context;
        mWmService = wmService;
        mChangeController = new DisplayChangeController(mWmService, mainExecutor);
        // TODO: Inject this instead
        mChangeController = new DisplayChangeController(mWmService, shellInit, mainExecutor);
        mDisplayContainerListener = new DisplayWindowListenerImpl();
        // Note, add this after DisplaceChangeController is constructed to ensure that is
        // initialized first
        shellInit.addInitCallback(this::onInit, this);
    }

    /**
     * Initializes the window listener.
     */
    public void initialize() {
    public void onInit() {
        try {
            int[] displayIds = mWmService.registerDisplayWindowListener(mDisplayContainerListener);
            for (int i = 0; i < displayIds.length; i++) {
Loading