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

Commit 2e6a09ef authored by Daichi Hirono's avatar Daichi Hirono
Browse files

Invoke organizer events when a display is added / removed.

Bug: 175653536
Test: atest DisplayAreaTest
Change-Id: Ib1f6899fc952fc07367c7748de5312dedb5f920b
parent f1f7f8a0
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -563,6 +563,22 @@ public class DisplayArea<T extends WindowContainer> extends WindowContainer<T> {
        }
    }

    @Override
    void onParentChanged(ConfigurationContainer newParent, ConfigurationContainer oldParent) {
        super.onParentChanged(newParent, oldParent);
        if (mOrganizer != null || newParent == null) {
            return;
        }
        // Check if we have a registered organizer, just after mSurfaceControl is ready.
        setOrganizer(mOrganizerController.getOrganizerByFeature(mFeatureId));
    }

    @Override
    void removeImmediately() {
        setOrganizer(null);
        super.removeImmediately();
    }

    @Override
    DisplayArea getDisplayArea() {
        return this;
+5 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import static android.window.DisplayAreaOrganizer.FEATURE_RUNTIME_TASK_CONTAINER
import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_WINDOW_ORGANIZER;
import static com.android.server.wm.DisplayArea.Type.ANY;

import android.annotation.Nullable;
import android.content.pm.ParceledListSlice;
import android.os.Binder;
import android.os.IBinder;
@@ -50,6 +51,10 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl
    private final WindowManagerGlobalLock mGlobalLock;
    private final HashMap<Integer, IDisplayAreaOrganizer> mOrganizersByFeatureIds = new HashMap();

    @Nullable IDisplayAreaOrganizer getOrganizerByFeature(int featureId) {
        return mOrganizersByFeatureIds.get(featureId);
    }

    private class DeathRecipient implements IBinder.DeathRecipient {
        int mFeature;
        IDisplayAreaOrganizer mOrganizer;
+41 −0
Original line number Diff line number Diff line
@@ -43,11 +43,15 @@ import static com.android.server.wm.testing.Assert.assertThrows;
import static com.google.common.truth.Truth.assertThat;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;

import android.content.pm.ActivityInfo;
import android.graphics.Rect;
@@ -56,6 +60,7 @@ import android.platform.test.annotations.Presubmit;
import android.view.SurfaceControl;
import android.view.View;
import android.view.WindowManager;
import android.window.IDisplayAreaOrganizer;

import com.google.android.collect.Lists;

@@ -498,6 +503,42 @@ public class DisplayAreaTest extends WindowTestsBase {
        assertThat(mDisplayContent.getOrientationRequestingTaskDisplayArea()).isEqualTo(tda);
    }

    @Test
    public void onParentChanged_onDisplayAreaAppeared() {
        final DisplayArea<WindowContainer> displayArea = new DisplayArea<>(
                mWm, BELOW_TASKS, "NewArea", FEATURE_DEFAULT_TASK_CONTAINER);

        final IDisplayAreaOrganizer mockDisplayAreaOrganizer = mock(IDisplayAreaOrganizer.class);
        spyOn(mWm.mAtmService.mWindowOrganizerController.mDisplayAreaOrganizerController);
        when(mWm.mAtmService.mWindowOrganizerController.mDisplayAreaOrganizerController
                .getOrganizerByFeature(FEATURE_DEFAULT_TASK_CONTAINER))
                .thenReturn(mockDisplayAreaOrganizer);

        mDisplayContent.addChild(displayArea, 0);
        assertEquals(mockDisplayAreaOrganizer, displayArea.mOrganizer);
        verify(mWm.mAtmService.mWindowOrganizerController.mDisplayAreaOrganizerController)
                .onDisplayAreaAppeared(
                        eq(mockDisplayAreaOrganizer),
                        argThat(it -> it == displayArea && it.getSurfaceControl() != null));
    }

    @Test
    public void onParentChanged_onDisplayAreaVanished() {
        final DisplayArea<WindowContainer> displayArea = new DisplayArea<>(
                mWm, BELOW_TASKS, "NewArea", FEATURE_DEFAULT_TASK_CONTAINER);

        final IDisplayAreaOrganizer mockDisplayAreaOrganizer = mock(IDisplayAreaOrganizer.class);
        displayArea.mOrganizer = mockDisplayAreaOrganizer;
        spyOn(mWm.mAtmService.mWindowOrganizerController.mDisplayAreaOrganizerController);

        mDisplayContent.addChild(displayArea, 0);
        displayArea.removeImmediately();

        assertNull(displayArea.mOrganizer);
        verify(mWm.mAtmService.mWindowOrganizerController.mDisplayAreaOrganizerController)
                .onDisplayAreaVanished(mockDisplayAreaOrganizer, displayArea);
    }

    private static class TestDisplayArea<T extends WindowContainer> extends DisplayArea<T> {
        private TestDisplayArea(WindowManagerService wms, Rect bounds) {
            super(wms, ANY, "half display area");