Merge "Invoke organizer events when a display is added / removed."

This commit is contained in:
TreeHugger Robot
2021-01-06 18:36:44 +00:00
committed by Android (Google) Code Review
3 changed files with 62 additions and 0 deletions

View File

@@ -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;

View File

@@ -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;

View File

@@ -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");