diff options
6 files changed, 46 insertions, 32 deletions
diff --git a/core/java/android/content/res/Configuration.java b/core/java/android/content/res/Configuration.java index 5a45d9f1bf46..226c7e7c1f61 100644 --- a/core/java/android/content/res/Configuration.java +++ b/core/java/android/content/res/Configuration.java @@ -452,6 +452,9 @@ public final class Configuration implements Parcelable, Comparable<Configuration if ((diff & ActivityInfo.CONFIG_SMALLEST_SCREEN_SIZE) != 0) { list.add("CONFIG_SMALLEST_SCREEN_SIZE"); } + if ((diff & ActivityInfo.CONFIG_DENSITY) != 0) { + list.add("CONFIG_DENSITY"); + } if ((diff & ActivityInfo.CONFIG_LAYOUT_DIRECTION) != 0) { list.add("CONFIG_LAYOUT_DIRECTION"); } @@ -461,6 +464,9 @@ public final class Configuration implements Parcelable, Comparable<Configuration if ((diff & ActivityInfo.CONFIG_ASSETS_PATHS) != 0) { list.add("CONFIG_ASSETS_PATHS"); } + if ((diff & ActivityInfo.CONFIG_WINDOW_CONFIGURATION) != 0) { + list.add("CONFIG_WINDOW_CONFIGURATION"); + } StringBuilder builder = new StringBuilder("{"); for (int i = 0, n = list.size(); i < n; i++) { builder.append(list.get(i)); diff --git a/packages/SystemUI/src/com/android/systemui/SizeCompatModeActivityController.java b/packages/SystemUI/src/com/android/systemui/SizeCompatModeActivityController.java index 72a403035294..4749addc7139 100644 --- a/packages/SystemUI/src/com/android/systemui/SizeCompatModeActivityController.java +++ b/packages/SystemUI/src/com/android/systemui/SizeCompatModeActivityController.java @@ -280,6 +280,7 @@ public class SizeCompatModeActivityController extends SystemUI implements Comman R.layout.size_compat_mode_hint, null /* root */); PopupWindow popupWindow = new PopupWindow(popupView, LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); + popupWindow.setWindowLayoutType(mWinParams.type); popupWindow.setElevation(getResources().getDimension(R.dimen.bubble_elevation)); popupWindow.setAnimationStyle(android.R.style.Animation_InputMethod); popupWindow.setClippingEnabled(false); diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 5377db4402a0..9d03a3ca547a 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -6533,7 +6533,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } else if (mCompatDisplayInsets != null) { // The override changes can only be obtained from display, because we don't have the // difference of full configuration in each hierarchy. - final int displayChanges = display.getLastOverrideConfigurationChanges(); + final int displayChanges = display.getCurrentOverrideConfigurationChanges(); final int orientationChanges = CONFIG_WINDOW_CONFIGURATION | CONFIG_SCREEN_SIZE | CONFIG_ORIENTATION; final boolean hasNonOrienSizeChanged = hasResizeChange(displayChanges) diff --git a/services/core/java/com/android/server/wm/ConfigurationContainer.java b/services/core/java/com/android/server/wm/ConfigurationContainer.java index 30f3bc5e70fb..aba0eb3119f9 100644 --- a/services/core/java/com/android/server/wm/ConfigurationContainer.java +++ b/services/core/java/com/android/server/wm/ConfigurationContainer.java @@ -81,9 +81,6 @@ public abstract class ConfigurationContainer<E extends ConfigurationContainer> { */ private Configuration mFullConfiguration = new Configuration(); - /** The bit mask of the last override fields of full configuration. */ - private int mLastOverrideConfigurationChanges; - /** * Contains merged override configuration settings from the top of the hierarchy down to this * particular instance. It is different from {@link #mFullConfiguration} because it starts from @@ -121,11 +118,6 @@ public abstract class ConfigurationContainer<E extends ConfigurationContainer> { return mFullConfiguration; } - /** Returns the last changes from applying override configuration. */ - int getLastOverrideConfigurationChanges() { - return mLastOverrideConfigurationChanges; - } - /** * Notify that parent config changed and we need to update full configuration. * @see #mFullConfiguration @@ -141,8 +133,7 @@ public abstract class ConfigurationContainer<E extends ConfigurationContainer> { mResolvedTmpConfig.setTo(mResolvedOverrideConfiguration); resolveOverrideConfiguration(newParentConfig); mFullConfiguration.setTo(newParentConfig); - mLastOverrideConfigurationChanges = - mFullConfiguration.updateFrom(mResolvedOverrideConfiguration); + mFullConfiguration.updateFrom(mResolvedOverrideConfiguration); if (!mResolvedTmpConfig.equals(mResolvedOverrideConfiguration)) { onMergedOverrideConfigurationChanged(); // This depends on the assumption that change-listeners don't do diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 2aa9ea5b385f..efbc2786e025 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -346,6 +346,9 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo /** The desired scaling factor for compatible apps. */ float mCompatibleScreenScale; + /** @see #getCurrentOverrideConfigurationChanges */ + private int mCurrentOverrideConfigurationChanges; + /** * Orientation forced by some window. If there is no visible window that specifies orientation * it is set to {@link android.content.pm.ActivityInfo#SCREEN_ORIENTATION_UNSPECIFIED}. @@ -1867,6 +1870,25 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo mTaskStackContainers.onStackWindowingModeChanged(stack); } + /** + * The value is only valid in the scope {@link #onRequestedOverrideConfigurationChanged} of the + * changing hierarchy and the {@link #onConfigurationChanged} of its children. + * + * @return The current changes ({@link android.content.pm.ActivityInfo.Config}) of requested + * override configuration. + */ + int getCurrentOverrideConfigurationChanges() { + return mCurrentOverrideConfigurationChanges; + } + + @Override + public void onRequestedOverrideConfigurationChanged(Configuration overrideConfiguration) { + mCurrentOverrideConfigurationChanges = + getRequestedOverrideConfiguration().diff(overrideConfiguration); + super.onRequestedOverrideConfigurationChanged(overrideConfiguration); + mCurrentOverrideConfigurationChanges = 0; + } + @Override public void onConfigurationChanged(Configuration newParentConfig) { final int lastOrientation = getConfiguration().orientation; diff --git a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java index 212931b76b88..d91adb7a772c 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java @@ -16,7 +16,6 @@ package com.android.server.wm; -import static android.content.pm.ActivityInfo.CONFIG_ORIENTATION; import static android.content.pm.ActivityInfo.RESIZE_MODE_UNRESIZEABLE; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; @@ -27,7 +26,7 @@ import static android.view.Surface.ROTATION_90; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing; import static com.android.dx.mockito.inline.extended.ExtendedMockito.eq; import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock; -import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; +import static com.android.dx.mockito.inline.extended.ExtendedMockito.never; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; import static com.android.server.wm.ActivityStack.ActivityState.STOPPED; @@ -36,7 +35,6 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.when; import android.app.ActivityManager; import android.app.ActivityManagerInternal; @@ -54,7 +52,6 @@ import org.junit.Test; import org.junit.runner.RunWith; import java.util.ArrayList; -import java.util.concurrent.TimeUnit; /** * Tests for Size Compatibility mode. @@ -317,37 +314,35 @@ public class SizeCompatTests extends ActivityTestsBase { @Test public void testResetNonVisibleActivity() { setUpApp(new TestActivityDisplay.Builder(mService, 1000, 2500).build()); + prepareUnresizable(1.5f, SCREEN_ORIENTATION_UNSPECIFIED); final ActivityDisplay display = mStack.getDisplay(); - spyOn(display); + // Resize the display so the activity is in size compatibility mode. + resizeDisplay(display, 900, 1800); - prepareUnresizable(1.5f, SCREEN_ORIENTATION_UNSPECIFIED); mActivity.setState(STOPPED, "testSizeCompatMode"); mActivity.mVisibleRequested = false; mActivity.app.setReportedProcState(ActivityManager.PROCESS_STATE_CACHED_ACTIVITY); - // Make the parent bounds to be different so the activity is in size compatibility mode. - mTask.getWindowConfiguration().setAppBounds(new Rect(0, 0, 600, 1200)); // Simulate the display changes orientation. - when(display.getLastOverrideConfigurationChanges()).thenReturn( - ActivityInfo.CONFIG_SCREEN_SIZE | CONFIG_ORIENTATION - | ActivityInfo.CONFIG_WINDOW_CONFIGURATION); - mActivity.onConfigurationChanged(mTask.getConfiguration()); - when(display.getLastOverrideConfigurationChanges()).thenCallRealMethod(); - // The override configuration should not change so it is still in size compatibility mode. + final Configuration c = new Configuration(); + display.getDisplayRotation().setRotation(ROTATION_90); + display.computeScreenConfiguration(c); + display.onRequestedOverrideConfigurationChanged(c); + // Size compatibility mode is able to handle orientation change so the process shouldn't be + // restarted and the override configuration won't be cleared. + verify(mActivity, never()).restartProcessIfVisible(); assertTrue(mActivity.inSizeCompatMode()); // Change display density - final DisplayContent displayContent = mStack.getDisplay().mDisplayContent; - displayContent.mBaseDisplayDensity = (int) (0.7f * displayContent.mBaseDisplayDensity); - final Configuration c = new Configuration(); - displayContent.computeScreenConfiguration(c); + display.mBaseDisplayDensity = (int) (0.7f * display.mBaseDisplayDensity); + display.computeScreenConfiguration(c); mService.mAmInternal = mock(ActivityManagerInternal.class); - mStack.getDisplay().onRequestedOverrideConfigurationChanged(c); + display.onRequestedOverrideConfigurationChanged(c); // The override configuration should be reset and the activity's process will be killed. assertFalse(mActivity.inSizeCompatMode()); verify(mActivity).restartProcessIfVisible(); - mLockRule.runWithScissors(mService.mH, () -> { }, TimeUnit.SECONDS.toMillis(3)); + waitHandlerIdle(mService.mH); verify(mService.mAmInternal).killProcess( eq(mActivity.app.mName), eq(mActivity.app.mUid), anyString()); } @@ -362,7 +357,6 @@ public class SizeCompatTests extends ActivityTestsBase { ActivityRecord activity = mActivity; activity.setState(ActivityStack.ActivityState.RESUMED, "testHandleActivitySizeCompatMode"); prepareUnresizable(-1.f /* maxAspect */, SCREEN_ORIENTATION_PORTRAIT); - ensureActivityConfiguration(); assertFalse(mActivity.inSizeCompatMode()); final ArrayList<IBinder> compatTokens = new ArrayList<>(); |