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 onDisplayAreaVanished(@NonNull DisplayAreaInfo displayAreaInfo) {}
|
||||
|
||||
/**
|
||||
* @hide
|
||||
*/
|
||||
public void onDisplayAreaInfoChanged(@NonNull DisplayAreaInfo displayAreaInfo) {}
|
||||
|
||||
private final IDisplayAreaOrganizer mInterface = new IDisplayAreaOrganizer.Stub() {
|
||||
|
||||
@Override
|
||||
@@ -67,6 +84,11 @@ public class DisplayAreaOrganizer extends WindowOrganizer {
|
||||
public void onDisplayAreaVanished(@NonNull DisplayAreaInfo displayAreaInfo) {
|
||||
DisplayAreaOrganizer.this.onDisplayAreaVanished(displayAreaInfo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisplayAreaInfoChanged(@NonNull DisplayAreaInfo displayAreaInfo) {
|
||||
DisplayAreaOrganizer.this.onDisplayAreaInfoChanged(displayAreaInfo);
|
||||
}
|
||||
};
|
||||
|
||||
private static IDisplayAreaOrganizerController getController() {
|
||||
|
||||
@@ -25,4 +25,5 @@ import android.window.DisplayAreaInfo;
|
||||
oneway interface IDisplayAreaOrganizer {
|
||||
void onDisplayAreaAppeared(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. */
|
||||
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.WindowContainerChildProto.DISPLAY_AREA;
|
||||
|
||||
import android.content.res.Configuration;
|
||||
import android.graphics.Rect;
|
||||
import android.util.proto.ProtoOutputStream;
|
||||
import android.window.DisplayAreaInfo;
|
||||
@@ -154,6 +155,14 @@ public class DisplayArea<T extends WindowContainer> extends WindowContainer<T> {
|
||||
mOrganizerController.onDisplayAreaVanished(mOrganizer, this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfigurationChanged(Configuration newParentConfig) {
|
||||
super.onConfigurationChanged(newParentConfig);
|
||||
if (mOrganizer != null) {
|
||||
mOrganizerController.onDisplayAreaInfoChanged(mOrganizer, this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
boolean isOrganized() {
|
||||
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) {
|
||||
try {
|
||||
organizer.onDisplayAreaAppeared(da.getDisplayAreaInfo());
|
||||
@@ -107,4 +126,12 @@ public class DisplayAreaOrganizerController extends IDisplayAreaOrganizerControl
|
||||
// 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