diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 455f258e45434..497ab98d5526e 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -8540,6 +8540,10 @@ public final class ViewRootImpl implements ViewParent, if (mLocalSyncState != LOCAL_SYNC_NONE) { writer.println(innerPrefix + "mLocalSyncState=" + mLocalSyncState); } + writer.println(innerPrefix + "mLastReportedMergedConfiguration=" + + mLastReportedMergedConfiguration); + writer.println(innerPrefix + "mLastConfigurationFromResources=" + + mLastConfigurationFromResources); writer.println(innerPrefix + "mIsAmbientMode=" + mIsAmbientMode); writer.println(innerPrefix + "mUnbufferedInputSource=" + Integer.toHexString(mUnbufferedInputSource)); diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 68fabc505761a..0f5184a03e6fd 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -3868,7 +3868,7 @@ class WindowState extends WindowContainer implements WindowManagerP // configuration update when the window has requested to be hidden. Doing so can lead to // the client erroneously accepting a configuration that would have otherwise caused an // activity restart. We instead hand back the last reported {@link MergedConfiguration}. - if (useLatestConfig || (relayoutVisible && (shouldCheckTokenVisibleRequested() + if (useLatestConfig || (relayoutVisible && (!shouldCheckTokenVisibleRequested() || mToken.isVisibleRequested()))) { final Configuration globalConfig = getProcessGlobalConfiguration(); final Configuration overrideConfig = getMergedOverrideConfiguration(); diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java index c714f0173074a..8370691f34f6a 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java @@ -198,14 +198,25 @@ public class WindowManagerServiceTests extends WindowTestsBase { mWm.mWindowMap.put(win.mClient.asBinder(), win); final int w = 100; final int h = 200; + final ClientWindowFrames outFrames = new ClientWindowFrames(); + final MergedConfiguration outConfig = new MergedConfiguration(); + final SurfaceControl outSurfaceControl = new SurfaceControl(); + final InsetsState outInsetsState = new InsetsState(); + final InsetsSourceControl[] outControls = new InsetsSourceControl[0]; + final Bundle outBundle = new Bundle(); mWm.relayoutWindow(win.mSession, win.mClient, win.mAttrs, w, h, View.GONE, 0, 0, 0, - new ClientWindowFrames(), new MergedConfiguration(), new SurfaceControl(), - new InsetsState(), new InsetsSourceControl[0], new Bundle()); + outFrames, outConfig, outSurfaceControl, outInsetsState, outControls, outBundle); // Because the window is already invisible, it doesn't need to apply exiting animation // and WMS#tryStartExitingAnimation() will destroy the surface directly. assertFalse(win.mAnimatingExit); assertFalse(win.mHasSurface); assertNull(win.mWinAnimator.mSurfaceController); + + doReturn(mSystemServicesTestRule.mTransaction).when(SurfaceControl::getGlobalTransaction); + // Invisible requested activity should not get the last config even if its view is visible. + mWm.relayoutWindow(win.mSession, win.mClient, win.mAttrs, w, h, View.VISIBLE, 0, 0, 0, + outFrames, outConfig, outSurfaceControl, outInsetsState, outControls, outBundle); + assertEquals(0, outConfig.getMergedConfiguration().densityDpi); } @Test