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

Commit 9d07e626 authored by chaviw's avatar chaviw
Browse files

Added onDisplayAreaChanged and unregister for DisplayAreaOrganizer

Notify DisplayAreaOrganzier when the registered DisplayArea has changed.

Also added the ability to unregister a DisplayAreaOrganizer

Test: DisplayAreaOrganizerTest
Bug: 152114574
Change-Id: I9e8c537f8fe6aa7f5b007ef73535294be62dd806
parent d1a2393f
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -52,10 +52,27 @@ public class DisplayAreaOrganizer extends WindowOrganizer {
        }
    }

    /**
     * @hide
     */
    @RequiresPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS)
    public void unregisterOrganizer() {
        try {
            getController().unregisterOrganizer(mInterface);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    public void onDisplayAreaAppeared(@NonNull DisplayAreaInfo displayAreaInfo) {}

    public void onDisplayAreaVanished(@NonNull DisplayAreaInfo displayAreaInfo) {}

    /**
     * @hide
     */
    public void onDisplayAreaInfoChanged(@NonNull DisplayAreaInfo displayAreaInfo) {}

    private final IDisplayAreaOrganizer mInterface = new IDisplayAreaOrganizer.Stub() {

        @Override
@@ -67,6 +84,11 @@ public class DisplayAreaOrganizer extends WindowOrganizer {
        public void onDisplayAreaVanished(@NonNull DisplayAreaInfo displayAreaInfo) {
            DisplayAreaOrganizer.this.onDisplayAreaVanished(displayAreaInfo);
        }

        @Override
        public void onDisplayAreaInfoChanged(@NonNull DisplayAreaInfo displayAreaInfo) {
            DisplayAreaOrganizer.this.onDisplayAreaInfoChanged(displayAreaInfo);
        }
    };

    private static IDisplayAreaOrganizerController getController() {
+1 −0
Original line number Diff line number Diff line
@@ -25,4 +25,5 @@ import android.window.DisplayAreaInfo;
oneway interface IDisplayAreaOrganizer {
    void onDisplayAreaAppeared(in DisplayAreaInfo displayAreaInfo);
    void onDisplayAreaVanished(in DisplayAreaInfo displayAreaInfo);
    void onDisplayAreaInfoChanged(in DisplayAreaInfo displayAreaInfo);
}
+5 −0
Original line number Diff line number Diff line
@@ -23,4 +23,9 @@ interface IDisplayAreaOrganizerController {

    /** Register a DisplayAreaOrganizer to manage display areas for a given feature. */
    void registerOrganizer(in IDisplayAreaOrganizer organizer, int displayAreaFeature);

    /**
     * Unregisters a previously registered display area organizer.
     */
    void unregisterOrganizer(in IDisplayAreaOrganizer organizer);
}
+9 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import static com.android.server.wm.DisplayAreaProto.WINDOW_CONTAINER;
import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_ORIENTATION;
import static com.android.server.wm.WindowContainerChildProto.DISPLAY_AREA;

import android.content.res.Configuration;
import android.graphics.Rect;
import android.util.proto.ProtoOutputStream;
import android.window.DisplayAreaInfo;
@@ -154,6 +155,14 @@ public class DisplayArea<T extends WindowContainer> extends WindowContainer<T> {
        mOrganizerController.onDisplayAreaVanished(mOrganizer, this);
    }

    @Override
    public void onConfigurationChanged(Configuration newParentConfig) {
        super.onConfigurationChanged(newParentConfig);
        if (mOrganizer != null) {
            mOrganizerController.onDisplayAreaInfoChanged(mOrganizer, this);
        }
    }

    @Override
    boolean isOrganized() {
        return mOrganizer != null;
+27 −0
Original line number Diff line number Diff line
@@ -92,6 +92,25 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl
        }
    }

    @Override
    public void unregisterOrganizer(IDisplayAreaOrganizer organizer) {
        enforceStackPermission("unregisterTaskOrganizer()");
        final long origId = Binder.clearCallingIdentity();
        try {
            synchronized (mGlobalLock) {
                mOrganizersByFeatureIds.entrySet().removeIf(
                        entry -> entry.getValue().asBinder() == organizer.asBinder());

                mService.mRootWindowContainer.forAllDisplayAreas((da) -> {
                    if (da.mOrganizer != organizer) return;
                    da.setOrganizer(null);
                });
            }
        } finally {
            Binder.restoreCallingIdentity(origId);
        }
    }

    void onDisplayAreaAppeared(IDisplayAreaOrganizer organizer, DisplayArea da) {
        try {
            organizer.onDisplayAreaAppeared(da.getDisplayAreaInfo());
@@ -107,4 +126,12 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl
            // Oh well...
        }
    }

    void onDisplayAreaInfoChanged(IDisplayAreaOrganizer organizer, DisplayArea da) {
        try {
            organizer.onDisplayAreaInfoChanged(da.getDisplayAreaInfo());
        } catch (RemoteException e) {
            // Oh well...
        }
    }
}
Loading