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

Commit 604acee0 authored by Charles Chen's avatar Charles Chen
Browse files

Check if display exists in RootTDAOrganizer

There's a scenario that the display is removed before DAOrganizer callbacks
propagate to the client side.
This CL checks if the display still exists before applying
 DisplayAreaInfo changes.

Test: manual - repro steps in bug
fixes: 182790285

Change-Id: I1180ca6bea4e5bd87f22298483400c9d604bae06
parent ad976285
Loading
Loading
Loading
Loading
+10 −5
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.wm.shell;

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

import android.annotation.UiContext;
import android.app.ResourcesManager;
import android.content.Context;
@@ -34,6 +36,8 @@ import android.window.DisplayAreaOrganizer;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.android.internal.protolog.common.ProtoLog;

import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
@@ -44,14 +48,14 @@ public class RootTaskDisplayAreaOrganizer extends DisplayAreaOrganizer {

    private static final String TAG = RootTaskDisplayAreaOrganizer.class.getSimpleName();

    // Display area info. mapped by displayIds.
    /** {@link DisplayAreaInfo} list, which is mapped by display IDs. */
    private final SparseArray<DisplayAreaInfo> mDisplayAreasInfo = new SparseArray<>();
    // Display area leashes. mapped by displayIds.
    /** Display area leashes, which is mapped by display IDs. */
    private final SparseArray<SurfaceControl> mLeashes = new SparseArray<>();

    private final SparseArray<ArrayList<RootTaskDisplayAreaListener>> mListeners =
            new SparseArray<>();

    /** {@link DisplayAreaContext} list, which is mapped by display IDs. */
    private final SparseArray<DisplayAreaContext> mDisplayAreaContexts = new SparseArray<>();

    private final Context mContext;
@@ -173,8 +177,9 @@ public class RootTaskDisplayAreaOrganizer extends DisplayAreaOrganizer {
        final Display display = mContext.getSystemService(DisplayManager.class)
                .getDisplay(displayId);
        if (display == null) {
            throw new UnsupportedOperationException("The display #" + displayId + " is invalid."
                    + "displayAreaInfo:" + displayAreaInfo);
            ProtoLog.w(WM_SHELL_TASK_ORG, "The display#%d has been removed."
                    + " Skip following steps", displayId);
            return;
        }
        DisplayAreaContext daContext = mDisplayAreaContexts.get(displayId);
        if (daContext == null) {