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

Commit c3b6179f authored by Filip Gruszczynski's avatar Filip Gruszczynski Committed by Wale Ogunwale
Browse files

Relaunch activity resumed if it got resumed before relaunching.

This fixes following scenario:
1) first activity starts second activity and expects results; first
activity gets paused;
2) second activity finishes and returns a result;
3) first activity is still paused and receives the result from the second
activity; first activty requests a local relaunch; relaunch gets
scheduled and is marked as launching paused (because the activity is
still paused)
4) first activity resumes;
5) first activity relaunches and finishes in paused state.

The fix makes it drop the information about launching paused if it is
local when it gets resumed in step 4.

Bug: 25674611
Bug: 26116905
Change-Id: Ieeef3f0d5c311679882fdc59c13fd8a99e3d3a20
parent cd7043e9
Loading
Loading
Loading
Loading
+22 −3
Original line number Diff line number Diff line
@@ -3345,6 +3345,18 @@ public final class ActivityThread {
                }
                r.activity.performResume();

                // If there is a pending local relaunch that was requested when the activity was
                // paused, it will put the activity into paused state when it finally happens.
                // Since the activity resumed before being relaunched, we don't want that to happen,
                // so we need to clear the request to relaunch paused.
                for (int i = mRelaunchingActivities.size() - 1; i >= 0; i--) {
                    final ActivityClientRecord relaunching = mRelaunchingActivities.get(i);
                    if (relaunching.token == r.token
                            && relaunching.onlyLocalRequest && relaunching.startsNotResumed) {
                        relaunching.startsNotResumed = false;
                    }
                }

                EventLog.writeEvent(LOG_AM_ON_RESUME_CALLED, UserHandle.myUserId(),
                        r.activity.getComponentName().getClassName(), reason);

@@ -3576,6 +3588,7 @@ public final class ActivityThread {
    private void handlePauseActivity(IBinder token, boolean finished,
            boolean userLeaving, int configChanges, boolean dontReport, int seq) {
        ActivityClientRecord r = mActivities.get(token);
        if (DEBUG_ORDER) Slog.d(TAG, "handlePauseActivity " + r + ", seq: " + seq);
        if (!checkAndUpdateLifecycleSeq(seq, r, "pauseActivity")) {
            return;
        }
@@ -4230,6 +4243,7 @@ public final class ActivityThread {
        synchronized (mResourcesManager) {
            for (int i=0; i<mRelaunchingActivities.size(); i++) {
                ActivityClientRecord r = mRelaunchingActivities.get(i);
                if (DEBUG_ORDER) Slog.d(TAG, "requestRelaunchActivity: " + this + ", trying: " + r);
                if (r.token == token) {
                    target = r;
                    if (pendingResults != null) {
@@ -4260,14 +4274,19 @@ public final class ActivityThread {
            }

            if (target == null) {
                if (DEBUG_ORDER) Slog.d(TAG, "requestRelaunchActivity: target is null, fromServer:"
                        + fromServer);
                target = new ActivityClientRecord();
                target.token = token;
                target.pendingResults = pendingResults;
                target.pendingIntents = pendingNewIntents;
                target.mPreserveWindow = preserveWindow;
                if (!fromServer) {
                    ActivityClientRecord existing = mActivities.get(token);
                    final ActivityClientRecord existing = mActivities.get(token);
                    if (DEBUG_ORDER) Slog.d(TAG, "requestRelaunchActivity: " + existing);
                    if (existing != null) {
                        if (DEBUG_ORDER) Slog.d(TAG, "requestRelaunchActivity: paused= "
                                + existing.paused);;
                        target.startsNotResumed = existing.paused;
                        target.overrideConfig = existing.overrideConfig;
                    }
@@ -4290,8 +4309,8 @@ public final class ActivityThread {
            target.pendingConfigChanges |= configChanges;
            target.relaunchSeq = getLifecycleSeq();
        }
        if (DEBUG_ORDER) Slog.d(TAG, "relaunchActivity " + ActivityThread.this
                + " operation received seq: " + target.relaunchSeq);
        if (DEBUG_ORDER) Slog.d(TAG, "relaunchActivity " + ActivityThread.this + ", target "
                + target + " operation received seq: " + target.relaunchSeq);
    }

    private void handleRelaunchActivity(ActivityClientRecord tmp) {