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

Commit 067417bb authored by Winson Chung's avatar Winson Chung Committed by Automerger Merge Worker
Browse files

Merge "Revert "Clean up previous DA organizer when registering"" into sc-dev...

Merge "Revert "Clean up previous DA organizer when registering"" into sc-dev am: 37ae9cfc am: 9224e9d7

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15329893

Change-Id: I80fb2fc37b3cd6328375dcfe3beddbb08e22c9f4
parents 4ed4450b 9224e9d7
Loading
Loading
Loading
Loading
+39 −59
Original line number Diff line number Diff line
@@ -26,7 +26,6 @@ import android.content.pm.ParceledListSlice;
import android.os.Binder;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Slog;
import android.view.SurfaceControl;
import android.window.DisplayAreaAppearedInfo;
import android.window.IDisplayAreaOrganizer;
@@ -50,8 +49,7 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl

    final ActivityTaskManagerService mService;
    private final WindowManagerGlobalLock mGlobalLock;
    private final HashMap<Integer, DisplayAreaOrganizerState> mOrganizersByFeatureIds =
            new HashMap();
    private final HashMap<Integer, IDisplayAreaOrganizer> mOrganizersByFeatureIds = new HashMap();

    private class DeathRecipient implements IBinder.DeathRecipient {
        int mFeature;
@@ -65,41 +63,12 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl
        @Override
        public void binderDied() {
            synchronized (mGlobalLock) {
                mOrganizersByFeatureIds.remove(mFeature).destroy();
                mOrganizersByFeatureIds.remove(mFeature);
                removeOrganizer(mOrganizer);
            }
        }
    }

    private class DisplayAreaOrganizerState {
        private final IDisplayAreaOrganizer mOrganizer;
        private final DeathRecipient mDeathRecipient;

        DisplayAreaOrganizerState(IDisplayAreaOrganizer organizer, int feature) {
            mOrganizer = organizer;
            mDeathRecipient = new DeathRecipient(organizer, feature);
            try {
                organizer.asBinder().linkToDeath(mDeathRecipient, 0);
            } catch (RemoteException e) {
                // Oh well...
            }
        }

        void destroy() {
            IBinder organizerBinder = mOrganizer.asBinder();
            mService.mRootWindowContainer.forAllDisplayAreas((da) -> {
                if (da.mOrganizer != null && da.mOrganizer.asBinder().equals(organizerBinder)) {
                    if (da.isTaskDisplayArea() && da.asTaskDisplayArea().mCreatedByOrganizer) {
                        // Delete the organizer created TDA when unregister.
                        deleteTaskDisplayArea(da.asTaskDisplayArea());
                    } else {
                        da.setOrganizer(null);
                    }
                }
            });
            organizerBinder.unlinkToDeath(mDeathRecipient, 0);
        }
    }

    DisplayAreaOrganizerController(ActivityTaskManagerService atm) {
        mService = atm;
        mGlobalLock = atm.mGlobalLock;
@@ -111,8 +80,7 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl

    @Nullable
    IDisplayAreaOrganizer getOrganizerByFeature(int featureId) {
        final DisplayAreaOrganizerState state = mOrganizersByFeatureIds.get(featureId);
        return state != null ? state.mOrganizer : null;
        return mOrganizersByFeatureIds.get(featureId);
    }

    @Override
@@ -126,18 +94,17 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl
                ProtoLog.v(WM_DEBUG_WINDOW_ORGANIZER, "Register display organizer=%s uid=%d",
                        organizer.asBinder(), uid);
                if (mOrganizersByFeatureIds.get(feature) != null) {
                    if (mOrganizersByFeatureIds.get(feature).mOrganizer.asBinder()
                            .isBinderAlive()) {
                    throw new IllegalStateException(
                            "Replacing existing organizer currently unsupported");
                }

                    mOrganizersByFeatureIds.remove(feature).destroy();
                    Slog.d(TAG, "Replacing dead organizer for feature=" + feature);
                final DeathRecipient dr = new DeathRecipient(organizer, feature);
                try {
                    organizer.asBinder().linkToDeath(dr, 0);
                } catch (RemoteException e) {
                    // Oh well...
                }

                final DisplayAreaOrganizerState state = new DisplayAreaOrganizerState(organizer,
                        feature);
                final List<DisplayAreaAppearedInfo> displayAreaInfos = new ArrayList<>();
                mService.mRootWindowContainer.forAllDisplays(dc -> {
                    if (!dc.isTrusted()) {
@@ -153,7 +120,7 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl
                    });
                });

                mOrganizersByFeatureIds.put(feature, state);
                mOrganizersByFeatureIds.put(feature, organizer);
                return new ParceledListSlice<>(displayAreaInfos);
            }
        } finally {
@@ -170,11 +137,9 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl
            synchronized (mGlobalLock) {
                ProtoLog.v(WM_DEBUG_WINDOW_ORGANIZER, "Unregister display organizer=%s uid=%d",
                        organizer.asBinder(), uid);
                mOrganizersByFeatureIds.values().forEach((state) -> {
                    if (state.mOrganizer.asBinder() == organizer.asBinder()) {
                        state.destroy();
                    }
                });
                mOrganizersByFeatureIds.entrySet().removeIf(
                        entry -> entry.getValue().asBinder() == organizer.asBinder());
                removeOrganizer(organizer);
            }
        } finally {
            Binder.restoreCallingIdentity(origId);
@@ -225,15 +190,19 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl
                }

                final int taskDisplayAreaFeatureId = mNextTaskDisplayAreaFeatureId++;
                final DisplayAreaOrganizerState state = new DisplayAreaOrganizerState(organizer,
                        taskDisplayAreaFeatureId);
                final DeathRecipient dr = new DeathRecipient(organizer, taskDisplayAreaFeatureId);
                try {
                    organizer.asBinder().linkToDeath(dr, 0);
                } catch (RemoteException e) {
                    // Oh well...
                }

                final TaskDisplayArea tda = parentRoot != null
                        ? createTaskDisplayArea(parentRoot, name, taskDisplayAreaFeatureId)
                        : createTaskDisplayArea(parentTda, name, taskDisplayAreaFeatureId);
                final DisplayAreaAppearedInfo tdaInfo = organizeDisplayArea(organizer, tda,
                        "DisplayAreaOrganizerController.createTaskDisplayArea");
                mOrganizersByFeatureIds.put(taskDisplayAreaFeatureId, state);
                mOrganizersByFeatureIds.put(taskDisplayAreaFeatureId, organizer);
                return tdaInfo;
            }
        } finally {
@@ -261,7 +230,8 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl
                                    + "TaskDisplayArea=" + taskDisplayArea);
                }

                mOrganizersByFeatureIds.remove(taskDisplayArea.mFeatureId).destroy();
                mOrganizersByFeatureIds.remove(taskDisplayArea.mFeatureId);
                deleteTaskDisplayArea(taskDisplayArea);
            }
        } finally {
            Binder.restoreCallingIdentity(origId);
@@ -281,10 +251,6 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl

    void onDisplayAreaVanished(IDisplayAreaOrganizer organizer, DisplayArea da) {
        ProtoLog.v(WM_DEBUG_WINDOW_ORGANIZER, "DisplayArea vanished name=%s", da.getName());
        if (!organizer.asBinder().isBinderAlive()) {
            Slog.d(TAG, "Organizer died before sending onDisplayAreaVanished");
            return;
        }
        try {
            organizer.onDisplayAreaVanished(da.getDisplayAreaInfo());
        } catch (RemoteException e) {
@@ -301,6 +267,20 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl
        }
    }

    private void removeOrganizer(IDisplayAreaOrganizer organizer) {
        IBinder organizerBinder = organizer.asBinder();
        mService.mRootWindowContainer.forAllDisplayAreas((da) -> {
            if (da.mOrganizer != null && da.mOrganizer.asBinder().equals(organizerBinder)) {
                if (da.isTaskDisplayArea() && da.asTaskDisplayArea().mCreatedByOrganizer) {
                    // Delete the organizer created TDA when unregister.
                    deleteTaskDisplayArea(da.asTaskDisplayArea());
                } else {
                    da.setOrganizer(null);
                }
            }
        });
    }

    private DisplayAreaAppearedInfo organizeDisplayArea(IDisplayAreaOrganizer organizer,
            DisplayArea displayArea, String callsite) {
        displayArea.setOrganizer(organizer, true /* skipDisplayAreaAppeared */);
+0 −2
Original line number Diff line number Diff line
@@ -57,7 +57,6 @@ import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.graphics.Rect;
import android.os.Binder;
import android.os.IBinder;
import android.platform.test.annotations.Presubmit;
import android.view.SurfaceControl;
import android.view.View;
@@ -557,7 +556,6 @@ public class DisplayAreaTest extends WindowTestsBase {
        final DisplayArea<WindowContainer> displayArea = new DisplayArea<>(
                mWm, BELOW_TASKS, "NewArea", FEATURE_VENDOR_FIRST);
        final IDisplayAreaOrganizer mockDisplayAreaOrganizer = mock(IDisplayAreaOrganizer.class);
        doReturn(mock(IBinder.class)).when(mockDisplayAreaOrganizer).asBinder();
        displayArea.mOrganizer = mockDisplayAreaOrganizer;
        spyOn(mWm.mAtmService.mWindowOrganizerController.mDisplayAreaOrganizerController);
        mDisplayContent.addChild(displayArea, 0);