Merge "Invoke organizer events when a display is added / removed." into sc-dev

This commit is contained in:
Chris Li
2021-02-14 03:09:15 +00:00
committed by Android (Google) Code Review
4 changed files with 84 additions and 5 deletions

View File

@@ -504,6 +504,17 @@ public class DisplayArea<T extends WindowContainer> extends WindowContainer<T> {
return false;
}
@Override
void removeImmediately() {
setOrganizer(null);
super.removeImmediately();
}
@Override
DisplayArea getDisplayArea() {
return this;
}
/**
* DisplayArea that contains WindowTokens, and orders them according to their type.
*/
@@ -584,11 +595,6 @@ public class DisplayArea<T extends WindowContainer> extends WindowContainer<T> {
}
}
@Override
DisplayArea getDisplayArea() {
return this;
}
/**
* DisplayArea that can be dimmed.
*/

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;
@@ -77,6 +78,11 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl
mService.enforceTaskPermission(func);
}
@Nullable
IDisplayAreaOrganizer getOrganizerByFeature(int featureId) {
return mOrganizersByFeatureIds.get(featureId);
}
@Override
public ParceledListSlice<DisplayAreaAppearedInfo> registerOrganizer(
IDisplayAreaOrganizer organizer, int feature) {

View File

@@ -213,6 +213,7 @@ import android.view.WindowInsets;
import android.view.WindowManager;
import android.view.WindowManager.DisplayImePolicy;
import android.view.WindowManagerPolicyConstants.PointerEventListener;
import android.window.IDisplayAreaOrganizer;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.MetricsLogger;
@@ -1074,6 +1075,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
// Sets the display content for the children.
onDisplayChanged(this);
updateDisplayAreaOrganizers();
mInputMonitor = new InputMonitor(mWmService, this);
mInsetsPolicy = new InsetsPolicy(mInsetsStateController, this);
@@ -2711,6 +2713,30 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
return mDisplayAreaPolicy.getDefaultTaskDisplayArea();
}
/**
* Checks for all non-organized {@link DisplayArea}s for if there is any existing organizer for
* their features. If so, registers them with the matched organizer.
*/
@VisibleForTesting
void updateDisplayAreaOrganizers() {
if (!isTrusted()) {
// No need to update for untrusted display.
return;
}
forAllDisplayAreas(displayArea -> {
if (displayArea.isOrganized()) {
return;
}
// Check if we have a registered organizer for the DA feature.
final IDisplayAreaOrganizer organizer =
mAtmService.mWindowOrganizerController.mDisplayAreaOrganizerController
.getOrganizerByFeature(displayArea.mFeatureId);
if (organizer != null) {
displayArea.setOrganizer(organizer);
}
});
}
/**
* Returns true if the input point is within an app window.
*/

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.content.res.Configuration;
@@ -57,6 +61,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;
@@ -525,6 +530,42 @@ public class DisplayAreaTest extends WindowTestsBase {
assertThat(mDisplayContent.getOrientationRequestingTaskDisplayArea()).isEqualTo(tda);
}
@Test
public void testDisplayContentUpdateDisplayAreaOrganizers_onDisplayAreaAppeared() {
final DisplayArea<WindowContainer> displayArea = new DisplayArea<>(
mWm, BELOW_TASKS, "NewArea", FEATURE_VENDOR_FIRST);
final IDisplayAreaOrganizer mockDisplayAreaOrganizer = mock(IDisplayAreaOrganizer.class);
spyOn(mWm.mAtmService.mWindowOrganizerController.mDisplayAreaOrganizerController);
when(mWm.mAtmService.mWindowOrganizerController.mDisplayAreaOrganizerController
.getOrganizerByFeature(FEATURE_VENDOR_FIRST))
.thenReturn(mockDisplayAreaOrganizer);
mDisplayContent.addChild(displayArea, 0);
mDisplayContent.updateDisplayAreaOrganizers();
assertEquals(mockDisplayAreaOrganizer, displayArea.mOrganizer);
verify(mWm.mAtmService.mWindowOrganizerController.mDisplayAreaOrganizerController)
.onDisplayAreaAppeared(
eq(mockDisplayAreaOrganizer),
argThat(it -> it == displayArea && it.getSurfaceControl() != null));
}
@Test
public void testRemoveImmediately_onDisplayAreaVanished() {
final DisplayArea<WindowContainer> displayArea = new DisplayArea<>(
mWm, BELOW_TASKS, "NewArea", FEATURE_VENDOR_FIRST);
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");