Invoke organizer events when a display is added / removed.
Bug: 175653536 Test: atest DisplayAreaTest Change-Id: Ib1f6899fc952fc07367c7748de5312dedb5f920b
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user