diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 637061d090232..0e4c9a4d97739 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -4404,6 +4404,12 @@ public final class ActivityStackSupervisor implements DisplayListener { "startActivityFromRecentsInner: Task " + taskId + " not found."); } + // Since we don't have an actual source record here, we assume that the currently focused + // activity was the source. + final ActivityStack focusedStack = getFocusedStack(); + final ActivityRecord sourceRecord = + focusedStack != null ? focusedStack.topActivity() : null; + if (launchStackId != INVALID_STACK_ID) { if (task.stack.mStackId != launchStackId) { moveTaskToStackLocked( @@ -4427,6 +4433,11 @@ public final class ActivityStackSupervisor implements DisplayListener { if (launchStackId == DOCKED_STACK_ID) { setResizingDuringAnimation(taskId); } + + mService.mActivityStarter.postStartActivityUncheckedProcessing(task.getTopActivity(), + ActivityManager.START_TASK_TO_FRONT, + sourceRecord != null ? sourceRecord.task.stack.mStackId : INVALID_STACK_ID, + sourceRecord, task.stack); return ActivityManager.START_TASK_TO_FRONT; } callingUid = task.mCallingUid; diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java index 710193776b873..ba346883f4622 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -536,12 +536,13 @@ class ActivityStarter { } finally { mService.mWindowManager.continueSurfaceLayout(); } - postStartActivityUncheckedProcessing(r, err, stack.mStackId); + postStartActivityUncheckedProcessing(r, err, stack.mStackId, mSourceRecord, mTargetStack); return err; } void postStartActivityUncheckedProcessing( - ActivityRecord r, int result, int prevFocusedStackId) { + ActivityRecord r, int result, int prevFocusedStackId, ActivityRecord sourceRecord, + ActivityStack targetStack) { if (result < START_SUCCESS) { // If someone asked to have the keyguard dismissed on the next activity start, @@ -555,7 +556,7 @@ class ActivityStarter { if (r.task != null && r.task.stack != null) { startedActivityStackId = r.task.stack.mStackId; } else if (mTargetStack != null) { - startedActivityStackId = mTargetStack.mStackId; + startedActivityStackId = targetStack.mStackId; } // If we launched the activity from a no display activity that was launched from the home @@ -563,9 +564,9 @@ class ActivityStarter { // noDisplay activity will be finished shortly after. // TODO: We should prevent noDisplay activities from affecting task/stack ordering and // visibility instead of using this flag. - final boolean noDisplayActivityOverHome = mSourceRecord != null - && mSourceRecord.noDisplay - && mSourceRecord.task.getTaskToReturnTo() == HOME_ACTIVITY_TYPE; + final boolean noDisplayActivityOverHome = sourceRecord != null + && sourceRecord.noDisplay + && sourceRecord.task.getTaskToReturnTo() == HOME_ACTIVITY_TYPE; if (startedActivityStackId == DOCKED_STACK_ID && (prevFocusedStackId == HOME_STACK_ID || noDisplayActivityOverHome)) { final ActivityStack homeStack = mSupervisor.getStack(HOME_STACK_ID); @@ -1788,7 +1789,8 @@ class ActivityStarter { final int result = startActivityUnchecked( pal.r, pal.sourceRecord, null, null, pal.startFlags, resume, null, null); postStartActivityUncheckedProcessing( - pal.r, result, mSupervisor.mFocusedStack.mStackId); + pal.r, result, mSupervisor.mFocusedStack.mStackId, mSourceRecord, + mTargetStack); } catch (Exception e) { Slog.e(TAG, "Exception during pending activity launch pal=" + pal, e); pal.sendErrorResult(e.getMessage());