From 1d0a70b8daa768f83d2d3180726804267a378b1a Mon Sep 17 00:00:00 2001 From: Jerry Chang Date: Mon, 26 Dec 2022 18:01:19 +0000 Subject: [PATCH] Fix not able to enter split screen with trampoline launch Make sure to bring the starting activity to the front when its caller is in the front no matter if the caller is the top most task or not. Fix: 263330444 Test: repro steps of the bug Change-Id: I0191876adbd8190c6bf47140467ded04f9beb006 --- .../android/server/wm/ActivityStarter.java | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index c6e0cd2846dcf..aad89b441732f 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -2867,9 +2867,9 @@ class ActivityStarter { if (differentTopTask && !mAvoidMoveToFront) { mStartActivity.intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); - if (mSourceRecord == null || (mSourceRootTask.getTopNonFinishingActivity() != null - && mSourceRootTask.getTopNonFinishingActivity().getTask() - == mSourceRecord.getTask())) { + // TODO(b/264487981): Consider using BackgroundActivityStartController to determine + // whether to bring the launching activity to the front. + if (mSourceRecord == null || inTopNonFinishingTask(mSourceRecord)) { // We really do want to push this one into the user's face, right now. if (mLaunchTaskBehind && mSourceRecord != null) { intentActivity.setTaskToAffiliateWith(mSourceRecord.getTask()); @@ -2928,6 +2928,20 @@ class ActivityStarter { mRootWindowContainer.getDefaultTaskDisplayArea(), mTargetRootTask); } + private boolean inTopNonFinishingTask(ActivityRecord r) { + if (r == null || r.getTask() == null) { + return false; + } + + final Task rTask = r.getTask(); + final Task parent = rTask.getCreatedByOrganizerTask() != null + ? rTask.getCreatedByOrganizerTask() : r.getRootTask(); + final ActivityRecord topNonFinishingActivity = parent != null + ? parent.getTopNonFinishingActivity() : null; + + return topNonFinishingActivity != null && topNonFinishingActivity.getTask() == rTask; + } + private void resumeTargetRootTaskIfNeeded() { if (mDoResume) { final ActivityRecord next = mTargetRootTask.topRunningActivity(