Loading services/core/java/com/android/server/wm/ActivityRecord.java +2 −2 Original line number Diff line number Diff line Loading @@ -8449,7 +8449,7 @@ final class ActivityRecord extends WindowToken { // don't want to save mAppCompatDisplayInsets in onConfigurationChanged without visibility // check to avoid remembering obsolete configuration which can lead to unnecessary // size-compat mode. if (mVisibleRequested) { if (isVisibleRequested()) { // Calling from here rather than resolveOverrideConfiguration to ensure that this is // called after full config is updated in ConfigurationContainer#onConfigurationChanged. mAppCompatController.getSizeCompatModePolicy().updateAppCompatDisplayInsets(); Loading Loading @@ -8487,7 +8487,7 @@ final class ActivityRecord extends WindowToken { setLastReportedConfiguration(getProcessGlobalConfiguration(), newMergedOverrideConfig); setLastReportedActivityWindowInfo(newActivityWindowInfo); if (mState == INITIALIZING) { if (getState() == INITIALIZING) { // No need to relaunch or schedule new config for activity that hasn't been launched // yet. We do, however, return after applying the config to activity record, so that // it will use it for launch transaction. Loading services/core/java/com/android/server/wm/AppCompatDisplayCompatModePolicy.java +5 −3 Original line number Diff line number Diff line Loading @@ -60,13 +60,15 @@ class AppCompatDisplayCompatModePolicy { /** * Returns whether the restart menu is enabled for display move. Currently it only gets shown * when an app is in display compat mode. * when an app is in display or size compat mode. * * @return {@code true} if the restart menu should be enabled for display move. */ boolean isRestartMenuEnabledForDisplayMove() { // Restart menu is only available to apps in display compat mode. return ENABLE_RESTART_MENU_FOR_CONNECTED_DISPLAYS.isTrue() && isInDisplayCompatMode(); // Restart menu is only available to apps in display/size compat mode. return ENABLE_RESTART_MENU_FOR_CONNECTED_DISPLAYS.isTrue() && (isInDisplayCompatMode() || (mActivityRecord.inSizeCompatMode() && mDisplayChangedWithoutRestart)); } /** Loading services/tests/wmtests/src/com/android/server/wm/AppCompatActivityRobot.java +15 −3 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ import static com.android.server.wm.ActivityRecord.State.RESUMED; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.clearInvocations; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; Loading Loading @@ -328,9 +329,16 @@ class AppCompatActivityRobot { } void setTopActivityResumed() { mActivityStack.top().setVisible(true); mActivityStack.top().setVisibleRequested(true); mActivityStack.top().setState(RESUMED, "setTopActivityResumed"); doReturn(RESUMED).when(mActivityStack.top()).getState(); doReturn(true).when(mActivityStack.top()).isVisibleRequested(); doReturn(true).when(mActivityStack.top()).isVisible(); mActivityStack.top().mAppCompatController.getSizeCompatModePolicy() .updateAppCompatDisplayInsets(); mActivityStack.top().ensureActivityConfiguration(); } void clearInvocationsForActivity() { clearInvocations(mActivityStack.top()); } void setTopActivityConfigChanges(int supportedConfigChanges) { Loading Loading @@ -383,6 +391,10 @@ class AppCompatActivityRobot { mAtm.mWindowManager.mIsTouchDevice = true; mAtm.mWindowManager.displayReady(); // Make sure the display doesn't get into sleep when created; doReturn(false).when(mSecondaryDisplayContent).shouldSleep(); mAtm.updateSleepIfNeededLocked(); onPostDisplayContentCreation(mSecondaryDisplayContent); } Loading services/tests/wmtests/src/com/android/server/wm/AppCompatDisplayCompatTests.java +31 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import static android.content.pm.ActivityInfo.CONFIG_DENSITY; import static android.content.pm.ActivityInfo.CONFIG_RESOURCES_UNUSED; import static android.content.pm.ActivityInfo.CONFIG_TOUCHSCREEN; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.window.flags.Flags.FLAG_ENABLE_DISPLAY_COMPAT_MODE; import static com.android.window.flags.Flags.FLAG_ENABLE_RESTART_MENU_FOR_CONNECTED_DISPLAYS; Loading @@ -32,6 +33,7 @@ import android.platform.test.annotations.Presubmit; import androidx.annotation.NonNull; import androidx.test.filters.MediumTest; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; Loading @@ -51,6 +53,12 @@ public class AppCompatDisplayCompatTests extends WindowTestsBase { private static final int CONFIG_MASK_FOR_DISPLAY_MOVE = ~(CONFIG_DENSITY | CONFIG_TOUCHSCREEN | CONFIG_COLOR_MODE | CONFIG_RESOURCES_UNUSED); @Before public void setUp() { doReturn(false).when(mDisplayContent).shouldSleep(); mAtm.updateSleepIfNeededLocked(); } @EnableFlags({FLAG_ENABLE_DISPLAY_COMPAT_MODE, FLAG_ENABLE_RESTART_MENU_FOR_CONNECTED_DISPLAYS}) @Test public void testDisplayCompatMode_gameDoesNotRestartWithDisplayMove() { Loading @@ -61,6 +69,7 @@ public class AppCompatDisplayCompatTests extends WindowTestsBase { robot.activity().setTopActivityResumed(); robot.activity().setTopActivityConfigChanges(CONFIG_MASK_FOR_DISPLAY_MOVE); robot.checkRestartMenuVisibility(false); robot.activity().clearInvocationsForActivity(); robot.activity().moveTaskToSecondaryDisplay(); robot.activity().checkTopActivityRelaunched(false); Loading @@ -79,6 +88,7 @@ public class AppCompatDisplayCompatTests extends WindowTestsBase { robot.activity().setTopActivityResumed(); robot.activity().setTopActivityConfigChanges(CONFIG_MASK_FOR_DISPLAY_MOVE); robot.checkRestartMenuVisibility(false); robot.activity().clearInvocationsForActivity(); robot.activity().moveTaskToSecondaryDisplay(); robot.activity().checkTopActivityRelaunched(true); Loading @@ -86,6 +96,27 @@ public class AppCompatDisplayCompatTests extends WindowTestsBase { }); } @EnableFlags(FLAG_ENABLE_RESTART_MENU_FOR_CONNECTED_DISPLAYS) @Test public void testSizeCompatMode_sizeCompatModeAppHasRestartMenuWithDisplayMove() { runTestScenario((robot) -> { robot.activity().createSecondaryDisplay(); robot.activity().createActivityWithComponent(); robot.activity().setTopActivityInSizeCompatMode(true); robot.activity().setShouldCreateCompatDisplayInsets(true); robot.activity().setTopActivityResumed(); robot.checkRestartMenuVisibility(false); robot.activity().clearInvocationsForActivity(); robot.activity().moveTaskToSecondaryDisplay(); robot.activity().checkTopActivityRelaunched(false); robot.checkRestartMenuVisibility(true); robot.activity().applyToTopActivity(ActivityRecord::restartProcessIfVisible); robot.checkRestartMenuVisibility(false); }); } void runTestScenario(@NonNull Consumer<DisplayCompatRobotTest> consumer) { final DisplayCompatRobotTest robot = new DisplayCompatRobotTest(mWm, mAtm, mSupervisor); consumer.accept(robot); Loading Loading
services/core/java/com/android/server/wm/ActivityRecord.java +2 −2 Original line number Diff line number Diff line Loading @@ -8449,7 +8449,7 @@ final class ActivityRecord extends WindowToken { // don't want to save mAppCompatDisplayInsets in onConfigurationChanged without visibility // check to avoid remembering obsolete configuration which can lead to unnecessary // size-compat mode. if (mVisibleRequested) { if (isVisibleRequested()) { // Calling from here rather than resolveOverrideConfiguration to ensure that this is // called after full config is updated in ConfigurationContainer#onConfigurationChanged. mAppCompatController.getSizeCompatModePolicy().updateAppCompatDisplayInsets(); Loading Loading @@ -8487,7 +8487,7 @@ final class ActivityRecord extends WindowToken { setLastReportedConfiguration(getProcessGlobalConfiguration(), newMergedOverrideConfig); setLastReportedActivityWindowInfo(newActivityWindowInfo); if (mState == INITIALIZING) { if (getState() == INITIALIZING) { // No need to relaunch or schedule new config for activity that hasn't been launched // yet. We do, however, return after applying the config to activity record, so that // it will use it for launch transaction. Loading
services/core/java/com/android/server/wm/AppCompatDisplayCompatModePolicy.java +5 −3 Original line number Diff line number Diff line Loading @@ -60,13 +60,15 @@ class AppCompatDisplayCompatModePolicy { /** * Returns whether the restart menu is enabled for display move. Currently it only gets shown * when an app is in display compat mode. * when an app is in display or size compat mode. * * @return {@code true} if the restart menu should be enabled for display move. */ boolean isRestartMenuEnabledForDisplayMove() { // Restart menu is only available to apps in display compat mode. return ENABLE_RESTART_MENU_FOR_CONNECTED_DISPLAYS.isTrue() && isInDisplayCompatMode(); // Restart menu is only available to apps in display/size compat mode. return ENABLE_RESTART_MENU_FOR_CONNECTED_DISPLAYS.isTrue() && (isInDisplayCompatMode() || (mActivityRecord.inSizeCompatMode() && mDisplayChangedWithoutRestart)); } /** Loading
services/tests/wmtests/src/com/android/server/wm/AppCompatActivityRobot.java +15 −3 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ import static com.android.server.wm.ActivityRecord.State.RESUMED; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.clearInvocations; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; Loading Loading @@ -328,9 +329,16 @@ class AppCompatActivityRobot { } void setTopActivityResumed() { mActivityStack.top().setVisible(true); mActivityStack.top().setVisibleRequested(true); mActivityStack.top().setState(RESUMED, "setTopActivityResumed"); doReturn(RESUMED).when(mActivityStack.top()).getState(); doReturn(true).when(mActivityStack.top()).isVisibleRequested(); doReturn(true).when(mActivityStack.top()).isVisible(); mActivityStack.top().mAppCompatController.getSizeCompatModePolicy() .updateAppCompatDisplayInsets(); mActivityStack.top().ensureActivityConfiguration(); } void clearInvocationsForActivity() { clearInvocations(mActivityStack.top()); } void setTopActivityConfigChanges(int supportedConfigChanges) { Loading Loading @@ -383,6 +391,10 @@ class AppCompatActivityRobot { mAtm.mWindowManager.mIsTouchDevice = true; mAtm.mWindowManager.displayReady(); // Make sure the display doesn't get into sleep when created; doReturn(false).when(mSecondaryDisplayContent).shouldSleep(); mAtm.updateSleepIfNeededLocked(); onPostDisplayContentCreation(mSecondaryDisplayContent); } Loading
services/tests/wmtests/src/com/android/server/wm/AppCompatDisplayCompatTests.java +31 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import static android.content.pm.ActivityInfo.CONFIG_DENSITY; import static android.content.pm.ActivityInfo.CONFIG_RESOURCES_UNUSED; import static android.content.pm.ActivityInfo.CONFIG_TOUCHSCREEN; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.window.flags.Flags.FLAG_ENABLE_DISPLAY_COMPAT_MODE; import static com.android.window.flags.Flags.FLAG_ENABLE_RESTART_MENU_FOR_CONNECTED_DISPLAYS; Loading @@ -32,6 +33,7 @@ import android.platform.test.annotations.Presubmit; import androidx.annotation.NonNull; import androidx.test.filters.MediumTest; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; Loading @@ -51,6 +53,12 @@ public class AppCompatDisplayCompatTests extends WindowTestsBase { private static final int CONFIG_MASK_FOR_DISPLAY_MOVE = ~(CONFIG_DENSITY | CONFIG_TOUCHSCREEN | CONFIG_COLOR_MODE | CONFIG_RESOURCES_UNUSED); @Before public void setUp() { doReturn(false).when(mDisplayContent).shouldSleep(); mAtm.updateSleepIfNeededLocked(); } @EnableFlags({FLAG_ENABLE_DISPLAY_COMPAT_MODE, FLAG_ENABLE_RESTART_MENU_FOR_CONNECTED_DISPLAYS}) @Test public void testDisplayCompatMode_gameDoesNotRestartWithDisplayMove() { Loading @@ -61,6 +69,7 @@ public class AppCompatDisplayCompatTests extends WindowTestsBase { robot.activity().setTopActivityResumed(); robot.activity().setTopActivityConfigChanges(CONFIG_MASK_FOR_DISPLAY_MOVE); robot.checkRestartMenuVisibility(false); robot.activity().clearInvocationsForActivity(); robot.activity().moveTaskToSecondaryDisplay(); robot.activity().checkTopActivityRelaunched(false); Loading @@ -79,6 +88,7 @@ public class AppCompatDisplayCompatTests extends WindowTestsBase { robot.activity().setTopActivityResumed(); robot.activity().setTopActivityConfigChanges(CONFIG_MASK_FOR_DISPLAY_MOVE); robot.checkRestartMenuVisibility(false); robot.activity().clearInvocationsForActivity(); robot.activity().moveTaskToSecondaryDisplay(); robot.activity().checkTopActivityRelaunched(true); Loading @@ -86,6 +96,27 @@ public class AppCompatDisplayCompatTests extends WindowTestsBase { }); } @EnableFlags(FLAG_ENABLE_RESTART_MENU_FOR_CONNECTED_DISPLAYS) @Test public void testSizeCompatMode_sizeCompatModeAppHasRestartMenuWithDisplayMove() { runTestScenario((robot) -> { robot.activity().createSecondaryDisplay(); robot.activity().createActivityWithComponent(); robot.activity().setTopActivityInSizeCompatMode(true); robot.activity().setShouldCreateCompatDisplayInsets(true); robot.activity().setTopActivityResumed(); robot.checkRestartMenuVisibility(false); robot.activity().clearInvocationsForActivity(); robot.activity().moveTaskToSecondaryDisplay(); robot.activity().checkTopActivityRelaunched(false); robot.checkRestartMenuVisibility(true); robot.activity().applyToTopActivity(ActivityRecord::restartProcessIfVisible); robot.checkRestartMenuVisibility(false); }); } void runTestScenario(@NonNull Consumer<DisplayCompatRobotTest> consumer) { final DisplayCompatRobotTest robot = new DisplayCompatRobotTest(mWm, mAtm, mSupervisor); consumer.accept(robot); Loading