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

Commit 0c1857ec authored by Wei Sheng Shih's avatar Wei Sheng Shih Committed by Android (Google) Code Review
Browse files

Merge "Correct activity's lifecycle when the process was killed in background." into 24D1-dev

parents c52b2c6a bec26a07
Loading
Loading
Loading
Loading
+9 −2
Original line number Original line Diff line number Diff line
@@ -57,6 +57,7 @@ import static com.android.server.wm.ActivityRecord.State.PAUSED;
import static com.android.server.wm.ActivityRecord.State.PAUSING;
import static com.android.server.wm.ActivityRecord.State.PAUSING;
import static com.android.server.wm.ActivityRecord.State.RESTARTING_PROCESS;
import static com.android.server.wm.ActivityRecord.State.RESTARTING_PROCESS;
import static com.android.server.wm.ActivityRecord.State.RESUMED;
import static com.android.server.wm.ActivityRecord.State.RESUMED;
import static com.android.server.wm.ActivityRecord.State.STOPPING;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_ALL;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_ALL;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_CLEANUP;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_CLEANUP;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_IDLE;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_IDLE;
@@ -104,6 +105,7 @@ import android.app.servertransaction.ActivityLifecycleItem;
import android.app.servertransaction.LaunchActivityItem;
import android.app.servertransaction.LaunchActivityItem;
import android.app.servertransaction.PauseActivityItem;
import android.app.servertransaction.PauseActivityItem;
import android.app.servertransaction.ResumeActivityItem;
import android.app.servertransaction.ResumeActivityItem;
import android.app.servertransaction.StopActivityItem;
import android.companion.virtual.VirtualDeviceManager;
import android.companion.virtual.VirtualDeviceManager;
import android.content.ComponentName;
import android.content.ComponentName;
import android.content.Context;
import android.content.Context;
@@ -944,8 +946,10 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks {
                if (andResume) {
                if (andResume) {
                    lifecycleItem = ResumeActivityItem.obtain(r.token, isTransitionForward,
                    lifecycleItem = ResumeActivityItem.obtain(r.token, isTransitionForward,
                            r.shouldSendCompatFakeFocus());
                            r.shouldSendCompatFakeFocus());
                } else {
                } else if (r.isVisibleRequested()) {
                    lifecycleItem = PauseActivityItem.obtain(r.token);
                    lifecycleItem = PauseActivityItem.obtain(r.token);
                } else {
                    lifecycleItem = StopActivityItem.obtain(r.token);
                }
                }


                // Schedule transaction.
                // Schedule transaction.
@@ -1012,7 +1016,7 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks {
            // As part of the process of launching, ActivityThread also performs
            // As part of the process of launching, ActivityThread also performs
            // a resume.
            // a resume.
            rootTask.minimalResumeActivityLocked(r);
            rootTask.minimalResumeActivityLocked(r);
        } else {
        } else if (r.isVisibleRequested()) {
            // This activity is not starting in the resumed state... which should look like we asked
            // This activity is not starting in the resumed state... which should look like we asked
            // it to pause+stop (but remain visible), and it has done so and reported back the
            // it to pause+stop (but remain visible), and it has done so and reported back the
            // current icicle and other state.
            // current icicle and other state.
@@ -1020,6 +1024,9 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks {
                    + "(starting in paused state)", r);
                    + "(starting in paused state)", r);
            r.setState(PAUSED, "realStartActivityLocked");
            r.setState(PAUSED, "realStartActivityLocked");
            mRootWindowContainer.executeAppTransitionForAllDisplay();
            mRootWindowContainer.executeAppTransitionForAllDisplay();
        } else {
            // This activity is starting while invisible, so it should be stopped.
            r.setState(STOPPING, "realStartActivityLocked");
        }
        }
        // Perform OOM scoring after the activity state is set, so the process can be updated with
        // Perform OOM scoring after the activity state is set, so the process can be updated with
        // the latest state.
        // the latest state.
+2 −3
Original line number Original line Diff line number Diff line
@@ -33,6 +33,7 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.times;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.times;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
import static com.android.server.wm.ActivityRecord.State.PAUSED;
import static com.android.server.wm.ActivityRecord.State.PAUSED;
import static com.android.server.wm.ActivityRecord.State.STOPPING;
import static com.android.server.wm.RecentsAnimationController.REORDER_KEEP_IN_PLACE;
import static com.android.server.wm.RecentsAnimationController.REORDER_KEEP_IN_PLACE;
import static com.android.server.wm.WindowContainer.POSITION_TOP;
import static com.android.server.wm.WindowContainer.POSITION_TOP;


@@ -164,13 +165,12 @@ public class RecentsAnimationTest extends WindowTestsBase {
        ActivityRecord recentsActivity = recentsStack.getTopNonFinishingActivity();
        ActivityRecord recentsActivity = recentsStack.getTopNonFinishingActivity();
        // The activity is started in background so it should be invisible and will be stopped.
        // The activity is started in background so it should be invisible and will be stopped.
        assertThat(recentsActivity).isNotNull();
        assertThat(recentsActivity).isNotNull();
        assertThat(mSupervisor.mStoppingActivities).contains(recentsActivity);
        assertThat(recentsActivity.getState()).isEqualTo(STOPPING);
        assertFalse(recentsActivity.isVisibleRequested());
        assertFalse(recentsActivity.isVisibleRequested());


        // Assume it is stopped to test next use case.
        // Assume it is stopped to test next use case.
        recentsActivity.activityStopped(null /* newIcicle */, null /* newPersistentState */,
        recentsActivity.activityStopped(null /* newIcicle */, null /* newPersistentState */,
                null /* description */);
                null /* description */);
        mSupervisor.mStoppingActivities.remove(recentsActivity);


        spyOn(recentsActivity);
        spyOn(recentsActivity);
        // Start when the recents activity exists. It should ensure the configuration.
        // Start when the recents activity exists. It should ensure the configuration.
@@ -178,7 +178,6 @@ public class RecentsAnimationTest extends WindowTestsBase {
                null /* recentsAnimationRunner */);
                null /* recentsAnimationRunner */);


        verify(recentsActivity).ensureActivityConfiguration(eq(true) /* ignoreVisibility */);
        verify(recentsActivity).ensureActivityConfiguration(eq(true) /* ignoreVisibility */);
        assertThat(mSupervisor.mStoppingActivities).contains(recentsActivity);
    }
    }


    @Test
    @Test