Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit df9c8707 authored by Kazuki Takise's avatar Kazuki Takise Committed by Android (Google) Code Review
Browse files

Merge "Enable restart menu for SCM apps" into main

parents cb3fa4e4 0318370c
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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();
@@ -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.
+5 −3
Original line number Diff line number Diff line
@@ -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));
    }

    /**
+15 −3
Original line number Diff line number Diff line
@@ -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;
@@ -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) {
@@ -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);
    }

+31 −0
Original line number Diff line number Diff line
@@ -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;

@@ -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;

@@ -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() {
@@ -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);
@@ -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);
@@ -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);