Merge "Migrate WindowContext#onConfigurationChanged to ClientTransaction (8/n)" into main
This commit is contained in:
@@ -34,7 +34,6 @@ import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
|
||||
import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
|
||||
import static android.content.res.Configuration.ORIENTATION_UNDEFINED;
|
||||
import static android.os.Build.VERSION_CODES.N;
|
||||
import static android.os.Process.SYSTEM_UID;
|
||||
import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
|
||||
import static android.util.DisplayMetrics.DENSITY_DEFAULT;
|
||||
import static android.util.RotationUtils.deltaRotation;
|
||||
@@ -5425,7 +5424,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
|
||||
final WindowProcessController wpc = mAtmService.getProcessController(
|
||||
getDisplayUiContext().getIApplicationThread());
|
||||
mWmService.mWindowContextListenerController.registerWindowContainerListener(
|
||||
wpc, getDisplayUiContext().getWindowContextToken(), this, SYSTEM_UID,
|
||||
wpc, getDisplayUiContext().getWindowContextToken(), this,
|
||||
INVALID_WINDOW_TYPE, null /* options */);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -70,12 +70,12 @@ class WindowContextListenerController {
|
||||
|
||||
/**
|
||||
* @see #registerWindowContainerListener(WindowProcessController, IBinder, WindowContainer, int,
|
||||
* int, Bundle, boolean)
|
||||
* Bundle, boolean)
|
||||
*/
|
||||
void registerWindowContainerListener(@NonNull WindowProcessController wpc,
|
||||
@NonNull IBinder clientToken, @NonNull WindowContainer<?> container, int ownerUid,
|
||||
@NonNull IBinder clientToken, @NonNull WindowContainer<?> container,
|
||||
@WindowType int type, @Nullable Bundle options) {
|
||||
registerWindowContainerListener(wpc, clientToken, container, ownerUid, type, options,
|
||||
registerWindowContainerListener(wpc, clientToken, container, type, options,
|
||||
true /* shouDispatchConfigWhenRegistering */);
|
||||
}
|
||||
|
||||
@@ -89,7 +89,6 @@ class WindowContextListenerController {
|
||||
* @param wpc the process that we should send the window configuration change to
|
||||
* @param clientToken the token to associate with the listener
|
||||
* @param container the {@link WindowContainer} which the listener is going to listen to.
|
||||
* @param ownerUid the caller UID
|
||||
* @param type the window type
|
||||
* @param options a bundle used to pass window-related options.
|
||||
* @param shouDispatchConfigWhenRegistering {@code true} to indicate the current
|
||||
@@ -97,12 +96,12 @@ class WindowContextListenerController {
|
||||
* registering the {@link WindowContextListenerImpl}
|
||||
*/
|
||||
void registerWindowContainerListener(@NonNull WindowProcessController wpc,
|
||||
@NonNull IBinder clientToken, @NonNull WindowContainer<?> container, int ownerUid,
|
||||
@NonNull IBinder clientToken, @NonNull WindowContainer<?> container,
|
||||
@WindowType int type, @Nullable Bundle options,
|
||||
boolean shouDispatchConfigWhenRegistering) {
|
||||
WindowContextListenerImpl listener = mListeners.get(clientToken);
|
||||
if (listener == null) {
|
||||
listener = new WindowContextListenerImpl(wpc, clientToken, container, ownerUid, type,
|
||||
listener = new WindowContextListenerImpl(wpc, clientToken, container, type,
|
||||
options);
|
||||
listener.register(shouDispatchConfigWhenRegistering);
|
||||
} else {
|
||||
@@ -160,9 +159,9 @@ class WindowContextListenerController {
|
||||
if (callerCanManageAppTokens) {
|
||||
return true;
|
||||
}
|
||||
if (callingUid != listener.mOwnerUid) {
|
||||
if (callingUid != listener.getUid()) {
|
||||
throw new UnsupportedOperationException("Uid mismatch. Caller uid is " + callingUid
|
||||
+ ", while the listener's owner is from " + listener.mOwnerUid);
|
||||
+ ", while the listener's owner is from " + listener.getUid());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -208,7 +207,6 @@ class WindowContextListenerController {
|
||||
private final WindowProcessController mWpc;
|
||||
@NonNull
|
||||
private final IWindowToken mClientToken;
|
||||
private final int mOwnerUid;
|
||||
@NonNull
|
||||
private WindowContainer<?> mContainer;
|
||||
/**
|
||||
@@ -228,11 +226,10 @@ class WindowContextListenerController {
|
||||
|
||||
private WindowContextListenerImpl(@NonNull WindowProcessController wpc,
|
||||
@NonNull IBinder clientToken, @NonNull WindowContainer<?> container,
|
||||
int ownerUid, @WindowType int type, @Nullable Bundle options) {
|
||||
@WindowType int type, @Nullable Bundle options) {
|
||||
mWpc = Objects.requireNonNull(wpc);
|
||||
mClientToken = IWindowToken.Stub.asInterface(clientToken);
|
||||
mContainer = Objects.requireNonNull(container);
|
||||
mOwnerUid = ownerUid;
|
||||
mType = type;
|
||||
mOptions = options;
|
||||
|
||||
@@ -252,6 +249,10 @@ class WindowContextListenerController {
|
||||
return mContainer;
|
||||
}
|
||||
|
||||
int getUid() {
|
||||
return mWpc.mUid;
|
||||
}
|
||||
|
||||
private void updateContainer(@NonNull WindowContainer<?> newContainer) {
|
||||
Objects.requireNonNull(newContainer);
|
||||
|
||||
|
||||
@@ -2766,8 +2766,7 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
final DisplayArea<?> da = dc.findAreaForWindowType(type, options,
|
||||
callerCanManageAppTokens, false /* roundedCornerOverlay */);
|
||||
mWindowContextListenerController.registerWindowContainerListener(wpc, clientToken,
|
||||
da, callingUid, type, options,
|
||||
false /* shouDispatchConfigWhenRegistering */);
|
||||
da, type, options, false /* shouDispatchConfigWhenRegistering */);
|
||||
return da.getConfiguration();
|
||||
}
|
||||
} finally {
|
||||
@@ -2798,7 +2797,7 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
// registration in DisplayContent#onParentChanged at DisplayContent initialization.
|
||||
final DisplayContent dc = mRoot.getDisplayContent(displayId);
|
||||
if (dc == null) {
|
||||
if (Binder.getCallingPid() != MY_PID) {
|
||||
if (callingPid != MY_PID) {
|
||||
throw new WindowManager.InvalidDisplayException(
|
||||
"attachWindowContextToDisplayContent: trying to attach to a"
|
||||
+ " non-existing display:" + displayId);
|
||||
@@ -2809,7 +2808,7 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
}
|
||||
|
||||
mWindowContextListenerController.registerWindowContainerListener(wpc, clientToken,
|
||||
dc, callingUid, INVALID_WINDOW_TYPE, null /* options */,
|
||||
dc, INVALID_WINDOW_TYPE, null /* options */,
|
||||
false /* shouDispatchConfigWhenRegistering */);
|
||||
return dc.getConfiguration();
|
||||
}
|
||||
@@ -2858,7 +2857,7 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
return;
|
||||
}
|
||||
mWindowContextListenerController.registerWindowContainerListener(wpc, clientToken,
|
||||
windowToken, callingUid, windowToken.windowType, windowToken.mOptions);
|
||||
windowToken, windowToken.windowType, windowToken.mOptions);
|
||||
}
|
||||
} finally {
|
||||
Binder.restoreCallingIdentity(origId);
|
||||
|
||||
@@ -98,8 +98,7 @@ public class InputMethodDialogWindowContextTest extends WindowTestsBase {
|
||||
DisplayContent dc = mWm.mRoot.getDisplayContent(displayId);
|
||||
final WindowProcessController wpc = mAtm.getProcessController(appThread);
|
||||
mWm.mWindowContextListenerController.registerWindowContainerListener(wpc, clientToken,
|
||||
dc.getImeContainer(), 1000 /* ownerUid */, TYPE_INPUT_METHOD_DIALOG,
|
||||
null /* options */);
|
||||
dc.getImeContainer(), TYPE_INPUT_METHOD_DIALOG, null /* options */);
|
||||
return dc.getImeContainer().getConfiguration();
|
||||
}).when(mIWindowManager).attachWindowContextToDisplayArea(any(), any(),
|
||||
eq(TYPE_INPUT_METHOD_DIALOG), anyInt(), any());
|
||||
|
||||
@@ -37,7 +37,6 @@ import static org.mockito.ArgumentMatchers.anyInt;
|
||||
import static org.mockito.Mockito.doReturn;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.MockitoAnnotations.initMocks;
|
||||
|
||||
import android.app.IWindowToken;
|
||||
import android.content.res.Configuration;
|
||||
@@ -54,7 +53,6 @@ import androidx.test.filters.SmallTest;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.Mockito;
|
||||
|
||||
/**
|
||||
@@ -70,37 +68,38 @@ public class WindowContextListenerControllerTests extends WindowTestsBase {
|
||||
private static final int TEST_UID = 12345;
|
||||
private static final int ANOTHER_UID = 1000;
|
||||
|
||||
@Mock
|
||||
private WindowProcessController mWpc;
|
||||
private final IBinder mClientToken = new Binder();
|
||||
private WindowContainer<?> mContainer;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
initMocks(this);
|
||||
mController = new WindowContextListenerController();
|
||||
mContainer = createTestWindowToken(TYPE_APPLICATION_OVERLAY, mDisplayContent);
|
||||
// Make display on to verify configuration propagation.
|
||||
mDefaultDisplay.getDisplayInfo().state = STATE_ON;
|
||||
mDisplayContent.getDisplayInfo().state = STATE_ON;
|
||||
mWpc = mSystemServicesTestRule.addProcess(
|
||||
DEFAULT_COMPONENT_PACKAGE_NAME, DEFAULT_COMPONENT_PACKAGE_NAME, 0 /* pid */,
|
||||
TEST_UID);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRegisterWindowContextListener() {
|
||||
mController.registerWindowContainerListener(mWpc, mClientToken, mContainer, -1,
|
||||
mController.registerWindowContainerListener(mWpc, mClientToken, mContainer,
|
||||
TYPE_APPLICATION_OVERLAY, null /* options */);
|
||||
|
||||
assertEquals(1, mController.mListeners.size());
|
||||
|
||||
final IBinder clientToken = mock(IBinder.class);
|
||||
mController.registerWindowContainerListener(mWpc, clientToken, mContainer, -1,
|
||||
mController.registerWindowContainerListener(mWpc, clientToken, mContainer,
|
||||
TYPE_APPLICATION_OVERLAY, null /* options */);
|
||||
|
||||
assertEquals(2, mController.mListeners.size());
|
||||
|
||||
final WindowContainer<?> container = createTestWindowToken(TYPE_APPLICATION_OVERLAY,
|
||||
mDefaultDisplay);
|
||||
mController.registerWindowContainerListener(mWpc, mClientToken, container, -1,
|
||||
mController.registerWindowContainerListener(mWpc, mClientToken, container,
|
||||
TYPE_APPLICATION_OVERLAY, null /* options */);
|
||||
|
||||
// The number of listeners doesn't increase since the listener just gets updated.
|
||||
@@ -126,7 +125,7 @@ public class WindowContextListenerControllerTests extends WindowTestsBase {
|
||||
config1.densityDpi = 100;
|
||||
mContainer.onRequestedOverrideConfigurationChanged(config1);
|
||||
|
||||
mController.registerWindowContainerListener(mWpc, clientToken, mContainer, -1,
|
||||
mController.registerWindowContainerListener(mWpc, clientToken, mContainer,
|
||||
TYPE_APPLICATION_OVERLAY, null /* options */);
|
||||
|
||||
assertEquals(bounds1, clientToken.mConfiguration.windowConfiguration.getBounds());
|
||||
@@ -142,7 +141,7 @@ public class WindowContextListenerControllerTests extends WindowTestsBase {
|
||||
config2.densityDpi = 200;
|
||||
container.onRequestedOverrideConfigurationChanged(config2);
|
||||
|
||||
mController.registerWindowContainerListener(mWpc, clientToken, container, -1,
|
||||
mController.registerWindowContainerListener(mWpc, clientToken, container,
|
||||
TYPE_APPLICATION_OVERLAY, null /* options */);
|
||||
|
||||
assertEquals(bounds2, clientToken.mConfiguration.windowConfiguration.getBounds());
|
||||
@@ -169,7 +168,7 @@ public class WindowContextListenerControllerTests extends WindowTestsBase {
|
||||
|
||||
@Test
|
||||
public void testAssertCallerCanModifyListener_CanManageAppTokens_ReturnTrue() {
|
||||
mController.registerWindowContainerListener(mWpc, mClientToken, mContainer, TEST_UID,
|
||||
mController.registerWindowContainerListener(mWpc, mClientToken, mContainer,
|
||||
TYPE_APPLICATION_OVERLAY, null /* options */);
|
||||
|
||||
assertTrue(mController.assertCallerCanModifyListener(mClientToken,
|
||||
@@ -178,7 +177,7 @@ public class WindowContextListenerControllerTests extends WindowTestsBase {
|
||||
|
||||
@Test
|
||||
public void testAssertCallerCanModifyListener_SameUid_ReturnTrue() {
|
||||
mController.registerWindowContainerListener(mWpc, mClientToken, mContainer, TEST_UID,
|
||||
mController.registerWindowContainerListener(mWpc, mClientToken, mContainer,
|
||||
TYPE_APPLICATION_OVERLAY, null /* options */);
|
||||
|
||||
assertTrue(mController.assertCallerCanModifyListener(mClientToken,
|
||||
@@ -187,7 +186,7 @@ public class WindowContextListenerControllerTests extends WindowTestsBase {
|
||||
|
||||
@Test(expected = UnsupportedOperationException.class)
|
||||
public void testAssertCallerCanModifyListener_DifferentUid_ThrowException() {
|
||||
mController.registerWindowContainerListener(mWpc, mClientToken, mContainer, TEST_UID,
|
||||
mController.registerWindowContainerListener(mWpc, mClientToken, mContainer,
|
||||
TYPE_APPLICATION_OVERLAY, null /* options */);
|
||||
|
||||
mController.assertCallerCanModifyListener(mClientToken,
|
||||
@@ -204,7 +203,7 @@ public class WindowContextListenerControllerTests extends WindowTestsBase {
|
||||
final DisplayArea<?> da = windowContextCreatedToken.getDisplayArea();
|
||||
|
||||
mController.registerWindowContainerListener(mWpc, mClientToken, windowContextCreatedToken,
|
||||
TEST_UID, TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY, null /* options */);
|
||||
TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY, null /* options */);
|
||||
|
||||
assertThat(mController.getContainer(mClientToken)).isEqualTo(windowContextCreatedToken);
|
||||
|
||||
@@ -239,7 +238,7 @@ public class WindowContextListenerControllerTests extends WindowTestsBase {
|
||||
.setFromClientToken(true)
|
||||
.build();
|
||||
mController.registerWindowContainerListener(mWpc, mClientToken, windowContextCreatedToken,
|
||||
TEST_UID, TYPE_INPUT_METHOD_DIALOG, null /* options */);
|
||||
TYPE_INPUT_METHOD_DIALOG, null /* options */);
|
||||
|
||||
assertThat(mController.getContainer(mClientToken)).isEqualTo(windowContextCreatedToken);
|
||||
|
||||
@@ -263,7 +262,7 @@ public class WindowContextListenerControllerTests extends WindowTestsBase {
|
||||
config1.densityDpi = 100;
|
||||
mContainer.onRequestedOverrideConfigurationChanged(config1);
|
||||
|
||||
mController.registerWindowContainerListener(mWpc, mockToken, mContainer, -1,
|
||||
mController.registerWindowContainerListener(mWpc, mockToken, mContainer,
|
||||
TYPE_APPLICATION_OVERLAY, null /* options */);
|
||||
|
||||
verify(mockToken, never()).onConfigurationChanged(any(), anyInt());
|
||||
@@ -298,7 +297,7 @@ public class WindowContextListenerControllerTests extends WindowTestsBase {
|
||||
config1.densityDpi = 100;
|
||||
mContainer.onRequestedOverrideConfigurationChanged(config1);
|
||||
|
||||
mController.registerWindowContainerListener(mWpc, clientToken, mContainer, -1,
|
||||
mController.registerWindowContainerListener(mWpc, clientToken, mContainer,
|
||||
TYPE_APPLICATION_OVERLAY, options);
|
||||
|
||||
assertThat(clientToken.mConfiguration).isEqualTo(config1);
|
||||
|
||||
@@ -473,7 +473,7 @@ public class WindowManagerServiceTests extends WindowTestsBase {
|
||||
mWm.attachWindowContextToWindowToken(mAppThread, new Binder(), windowToken.token);
|
||||
|
||||
verify(mWm.mWindowContextListenerController, never()).registerWindowContainerListener(
|
||||
any(), any(), any(), anyInt(), anyInt(), any());
|
||||
any(), any(), any(), anyInt(), any());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -490,7 +490,7 @@ public class WindowManagerServiceTests extends WindowTestsBase {
|
||||
mWm.attachWindowContextToWindowToken(mAppThread, clientToken, windowToken.token);
|
||||
final WindowProcessController wpc = mAtm.getProcessController(mAppThread);
|
||||
verify(mWm.mWindowContextListenerController).registerWindowContainerListener(eq(wpc),
|
||||
eq(clientToken), eq(windowToken), anyInt(), eq(TYPE_INPUT_METHOD),
|
||||
eq(clientToken), eq(windowToken), eq(TYPE_INPUT_METHOD),
|
||||
eq(windowToken.mOptions));
|
||||
}
|
||||
|
||||
@@ -519,7 +519,7 @@ public class WindowManagerServiceTests extends WindowTestsBase {
|
||||
new InsetsSourceControl.Array(), new Rect(), new float[1]);
|
||||
|
||||
verify(mWm.mWindowContextListenerController, never()).registerWindowContainerListener(any(),
|
||||
any(), any(), anyInt(), anyInt(), any());
|
||||
any(), any(), anyInt(), any());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
Reference in New Issue
Block a user