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

Commit ffa927e4 authored by Chris Li's avatar Chris Li
Browse files

Fix onDisplayAreaInfoChanged called before onDisplayAreaAppeared

1. In Core, add a flag to track appeared sent.
2. In Shell, make sure the #registerOrganizer is called on the main
   executor.

Fix: 302796032
Bug: 297469287
Test: atest WmTests:DisplayAreaTest
Test: atest WMShellUnitTests:ShellTransitionTests
Change-Id: Ia3142c281479cdf46945d301b96f9f2cd1682166
parent 3d252012
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.wm.shell;

import static com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE;

import android.annotation.SuppressLint;
import android.app.WindowConfiguration;
import android.util.SparseArray;
import android.view.SurfaceControl;
@@ -29,6 +30,7 @@ import android.window.WindowContainerTransaction;
import androidx.annotation.NonNull;

import com.android.internal.protolog.common.ProtoLog;
import com.android.wm.shell.sysui.ShellInit;

import java.io.PrintWriter;
import java.util.List;
@@ -44,9 +46,14 @@ public class RootDisplayAreaOrganizer extends DisplayAreaOrganizer {
    /** Display area leashes, which is mapped by display IDs. */
    private final SparseArray<SurfaceControl> mLeashes = new SparseArray<>();

    public RootDisplayAreaOrganizer(Executor executor) {
    public RootDisplayAreaOrganizer(@NonNull Executor executor, @NonNull ShellInit shellInit) {
        super(executor);
        List<DisplayAreaAppearedInfo> infos = registerOrganizer(FEATURE_ROOT);
        shellInit.addInitCallback(this::onInit, this);
    }

    @SuppressLint("MissingPermission") // Only called by SysUI.
    private void onInit() {
        final List<DisplayAreaAppearedInfo> infos = registerOrganizer(FEATURE_ROOT);
        for (int i = infos.size() - 1; i >= 0; --i) {
            onDisplayAreaAppeared(infos.get(i).getDisplayAreaInfo(), infos.get(i).getLeash());
        }
+11 −2
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.wm.shell;

import static com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_TASK_ORG;

import android.annotation.SuppressLint;
import android.annotation.UiContext;
import android.app.ResourcesManager;
import android.content.Context;
@@ -38,6 +39,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.android.internal.protolog.common.ProtoLog;
import com.android.wm.shell.sysui.ShellInit;

import java.io.PrintWriter;
import java.util.ArrayList;
@@ -69,10 +71,17 @@ public class RootTaskDisplayAreaOrganizer extends DisplayAreaOrganizer {

    private final Context mContext;

    public RootTaskDisplayAreaOrganizer(Executor executor, Context context) {
    public RootTaskDisplayAreaOrganizer(@NonNull Executor executor, @NonNull Context context,
            @NonNull ShellInit shellInit) {
        super(executor);
        mContext = context;
        List<DisplayAreaAppearedInfo> infos = registerOrganizer(FEATURE_DEFAULT_TASK_CONTAINER);
        shellInit.addInitCallback(this::onInit, this);
    }

    @SuppressLint("MissingPermission") // Only called by SysUI.
    private void onInit() {
        final List<DisplayAreaAppearedInfo> infos =
                registerOrganizer(FEATURE_DEFAULT_TASK_CONTAINER);
        for (int i = infos.size() - 1; i >= 0; --i) {
            onDisplayAreaAppeared(infos.get(i).getDisplayAreaInfo(), infos.get(i).getLeash());
        }
+6 −6
Original line number Diff line number Diff line
@@ -110,13 +110,13 @@ import com.android.wm.shell.unfold.UnfoldAnimationController;
import com.android.wm.shell.unfold.UnfoldTransitionHandler;
import com.android.wm.shell.windowdecor.WindowDecorViewModel;

import java.util.Optional;

import dagger.BindsOptionalOf;
import dagger.Lazy;
import dagger.Module;
import dagger.Provides;

import java.util.Optional;

/**
 * Provides basic dependencies from {@link com.android.wm.shell}, these dependencies are only
 * accessible from components within the WM subcomponent (can be explicitly exposed to the
@@ -658,15 +658,15 @@ public abstract class WMShellBaseModule {
    @WMSingleton
    @Provides
    static RootTaskDisplayAreaOrganizer provideRootTaskDisplayAreaOrganizer(
            @ShellMainThread ShellExecutor mainExecutor, Context context) {
        return new RootTaskDisplayAreaOrganizer(mainExecutor, context);
            @ShellMainThread ShellExecutor mainExecutor, Context context, ShellInit shellInit) {
        return new RootTaskDisplayAreaOrganizer(mainExecutor, context, shellInit);
    }

    @WMSingleton
    @Provides
    static RootDisplayAreaOrganizer provideRootDisplayAreaOrganizer(
            @ShellMainThread ShellExecutor mainExecutor) {
        return new RootDisplayAreaOrganizer(mainExecutor);
            @ShellMainThread ShellExecutor mainExecutor, ShellInit shellInit) {
        return new RootDisplayAreaOrganizer(mainExecutor, shellInit);
    }

    @WMSingleton
+1 −1
Original line number Diff line number Diff line
@@ -277,7 +277,7 @@ public class Transitions implements RemoteCallable<Transitions>,
            @NonNull ShellExecutor animExecutor) {
        this(context, shellInit, shellController, organizer, pool, displayController, mainExecutor,
                mainHandler, animExecutor, null,
                new RootTaskDisplayAreaOrganizer(mainExecutor, context));
                new RootTaskDisplayAreaOrganizer(mainExecutor, context, shellInit));
    }

    public Transitions(@NonNull Context context,
+5 −1
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.isA;
import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.doAnswer;
@@ -92,6 +93,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
import androidx.test.platform.app.InstrumentationRegistry;

import com.android.wm.shell.RootTaskDisplayAreaOrganizer;
import com.android.wm.shell.ShellTestCase;
import com.android.wm.shell.TestShellExecutor;
import com.android.wm.shell.common.DisplayController;
@@ -145,7 +147,9 @@ public class ShellTransitionTests extends ShellTestCase {
        final Transitions t = new Transitions(mContext, shellInit, mock(ShellController.class),
                mOrganizer, mTransactionPool, createTestDisplayController(), mMainExecutor,
                mMainHandler, mAnimExecutor);
        verify(shellInit, times(1)).addInitCallback(any(), eq(t));
        // One from Transitions, one from RootTaskDisplayAreaOrganizer
        verify(shellInit).addInitCallback(any(), eq(t));
        verify(shellInit).addInitCallback(any(), isA(RootTaskDisplayAreaOrganizer.class));
    }

    @Test
Loading