Merge "Added onDisplayAreaChanged and unregister for DisplayAreaOrganizer" into rvc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
cd220824de
@@ -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 onDisplayAreaAppeared(@NonNull DisplayAreaInfo displayAreaInfo) {}
|
||||||
|
|
||||||
public void onDisplayAreaVanished(@NonNull DisplayAreaInfo displayAreaInfo) {}
|
public void onDisplayAreaVanished(@NonNull DisplayAreaInfo displayAreaInfo) {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public void onDisplayAreaInfoChanged(@NonNull DisplayAreaInfo displayAreaInfo) {}
|
||||||
|
|
||||||
private final IDisplayAreaOrganizer mInterface = new IDisplayAreaOrganizer.Stub() {
|
private final IDisplayAreaOrganizer mInterface = new IDisplayAreaOrganizer.Stub() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -67,6 +84,11 @@ public class DisplayAreaOrganizer extends WindowOrganizer {
|
|||||||
public void onDisplayAreaVanished(@NonNull DisplayAreaInfo displayAreaInfo) {
|
public void onDisplayAreaVanished(@NonNull DisplayAreaInfo displayAreaInfo) {
|
||||||
DisplayAreaOrganizer.this.onDisplayAreaVanished(displayAreaInfo);
|
DisplayAreaOrganizer.this.onDisplayAreaVanished(displayAreaInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDisplayAreaInfoChanged(@NonNull DisplayAreaInfo displayAreaInfo) {
|
||||||
|
DisplayAreaOrganizer.this.onDisplayAreaInfoChanged(displayAreaInfo);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private static IDisplayAreaOrganizerController getController() {
|
private static IDisplayAreaOrganizerController getController() {
|
||||||
|
|||||||
@@ -25,4 +25,5 @@ import android.window.DisplayAreaInfo;
|
|||||||
oneway interface IDisplayAreaOrganizer {
|
oneway interface IDisplayAreaOrganizer {
|
||||||
void onDisplayAreaAppeared(in DisplayAreaInfo displayAreaInfo);
|
void onDisplayAreaAppeared(in DisplayAreaInfo displayAreaInfo);
|
||||||
void onDisplayAreaVanished(in DisplayAreaInfo displayAreaInfo);
|
void onDisplayAreaVanished(in DisplayAreaInfo displayAreaInfo);
|
||||||
|
void onDisplayAreaInfoChanged(in DisplayAreaInfo displayAreaInfo);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,4 +23,9 @@ interface IDisplayAreaOrganizerController {
|
|||||||
|
|
||||||
/** Register a DisplayAreaOrganizer to manage display areas for a given feature. */
|
/** Register a DisplayAreaOrganizer to manage display areas for a given feature. */
|
||||||
void registerOrganizer(in IDisplayAreaOrganizer organizer, int displayAreaFeature);
|
void registerOrganizer(in IDisplayAreaOrganizer organizer, int displayAreaFeature);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unregisters a previously registered display area organizer.
|
||||||
|
*/
|
||||||
|
void unregisterOrganizer(in IDisplayAreaOrganizer organizer);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.ProtoLogGroup.WM_DEBUG_ORIENTATION;
|
||||||
import static com.android.server.wm.WindowContainerChildProto.DISPLAY_AREA;
|
import static com.android.server.wm.WindowContainerChildProto.DISPLAY_AREA;
|
||||||
|
|
||||||
|
import android.content.res.Configuration;
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.util.proto.ProtoOutputStream;
|
import android.util.proto.ProtoOutputStream;
|
||||||
import android.window.DisplayAreaInfo;
|
import android.window.DisplayAreaInfo;
|
||||||
@@ -154,6 +155,14 @@ public class DisplayArea<T extends WindowContainer> extends WindowContainer<T> {
|
|||||||
mOrganizerController.onDisplayAreaVanished(mOrganizer, this);
|
mOrganizerController.onDisplayAreaVanished(mOrganizer, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onConfigurationChanged(Configuration newParentConfig) {
|
||||||
|
super.onConfigurationChanged(newParentConfig);
|
||||||
|
if (mOrganizer != null) {
|
||||||
|
mOrganizerController.onDisplayAreaInfoChanged(mOrganizer, this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
boolean isOrganized() {
|
boolean isOrganized() {
|
||||||
return mOrganizer != null;
|
return mOrganizer != null;
|
||||||
|
|||||||
@@ -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) {
|
void onDisplayAreaAppeared(IDisplayAreaOrganizer organizer, DisplayArea da) {
|
||||||
try {
|
try {
|
||||||
organizer.onDisplayAreaAppeared(da.getDisplayAreaInfo());
|
organizer.onDisplayAreaAppeared(da.getDisplayAreaInfo());
|
||||||
@@ -107,4 +126,12 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl
|
|||||||
// Oh well...
|
// Oh well...
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void onDisplayAreaInfoChanged(IDisplayAreaOrganizer organizer, DisplayArea da) {
|
||||||
|
try {
|
||||||
|
organizer.onDisplayAreaInfoChanged(da.getDisplayAreaInfo());
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
// Oh well...
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,91 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.android.server.wm;
|
||||||
|
|
||||||
|
import static android.window.DisplayAreaOrganizer.FEATURE_VENDOR_FIRST;
|
||||||
|
|
||||||
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import android.graphics.Rect;
|
||||||
|
import android.os.Binder;
|
||||||
|
import android.os.RemoteException;
|
||||||
|
import android.platform.test.annotations.Presubmit;
|
||||||
|
import android.window.IDisplayAreaOrganizer;
|
||||||
|
|
||||||
|
import androidx.test.filters.SmallTest;
|
||||||
|
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
@SmallTest
|
||||||
|
@Presubmit
|
||||||
|
@RunWith(WindowTestRunner.class)
|
||||||
|
public class DisplayAreaOrganizerTest extends WindowTestsBase {
|
||||||
|
|
||||||
|
private DisplayArea mTestDisplayArea;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() {
|
||||||
|
WindowContainer parentWindow = mDisplayContent.getDefaultTaskDisplayArea().getParent();
|
||||||
|
mTestDisplayArea = new DisplayArea(mWm, DisplayArea.Type.ANY,
|
||||||
|
"TestDisplayArea", FEATURE_VENDOR_FIRST);
|
||||||
|
parentWindow.addChild(mTestDisplayArea,
|
||||||
|
parentWindow.mChildren.indexOf(mDisplayContent.getDefaultTaskDisplayArea()) + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void tearDown() {
|
||||||
|
mTestDisplayArea.removeImmediately();
|
||||||
|
}
|
||||||
|
|
||||||
|
private IDisplayAreaOrganizer registerMockOrganizer(int feature) {
|
||||||
|
final IDisplayAreaOrganizer organizer = mock(IDisplayAreaOrganizer.class);
|
||||||
|
when(organizer.asBinder()).thenReturn(new Binder());
|
||||||
|
|
||||||
|
mWm.mAtmService.mWindowOrganizerController.mDisplayAreaOrganizerController
|
||||||
|
.registerOrganizer(organizer, feature);
|
||||||
|
return organizer;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void unregisterMockOrganizer(IDisplayAreaOrganizer organizer) {
|
||||||
|
mWm.mAtmService.mWindowOrganizerController.mDisplayAreaOrganizerController
|
||||||
|
.unregisterOrganizer(organizer);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAppearedVanished() throws RemoteException {
|
||||||
|
IDisplayAreaOrganizer organizer = registerMockOrganizer(FEATURE_VENDOR_FIRST);
|
||||||
|
verify(organizer).onDisplayAreaAppeared(any());
|
||||||
|
|
||||||
|
unregisterMockOrganizer(organizer);
|
||||||
|
verify(organizer).onDisplayAreaVanished(any());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testChanged() throws RemoteException {
|
||||||
|
IDisplayAreaOrganizer organizer = registerMockOrganizer(FEATURE_VENDOR_FIRST);
|
||||||
|
verify(organizer).onDisplayAreaAppeared(any());
|
||||||
|
|
||||||
|
mDisplayContent.setBounds(new Rect(0, 0, 1000, 1000));
|
||||||
|
verify(organizer).onDisplayAreaInfoChanged(any());
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user