From a952197bd161ac0e03abc6acb5f48e4ec2a56e9d Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Sat, 22 Feb 2020 23:20:41 +0800 Subject: [PATCH] RESTRICT AUTOMERGE Create separated tasks for different apps from startActivities Assume there are 2 applications A, B with different uids. There are 4 activities A1, A2, B1, B2 with default task affinity and launch mode. After A1 called startActivities(B1, A2, B2): Original : Task(A1, B1, A2, B2) This Change: Task(A1, B1), Task(A2, B2) In other words, the source caller cannot launch its activity above the activity of other application in the same task, and it can still launch activity of other application in its task. Bug: 145669109 Test: run cts --test android.server.cts.StartActivityTests \ -m CtsServicesHostTestCases Change-Id: I97bd875146a52f62b8fe82235487ccefb2955e8e (cherry picked from commit 973ecc619c0bb87a03481774ea9e86d2924601e4) --- .../java/com/android/server/am/ActivityStarter.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java index fa2e04f70a30..aec552d3e145 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -940,6 +940,8 @@ class ActivityStarter { } else { callingPid = callingUid = -1; } + boolean forceNewTask = false; + final int filterCallingUid = callingUid >= 0 ? callingUid : realCallingUid; final long origId = Binder.clearCallingIdentity(); try { synchronized (mService) { @@ -959,6 +961,9 @@ class ActivityStarter { // Don't modify the client's object! intent = new Intent(intent); + if (forceNewTask) { + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + } // Collect information about the target of the Intent. ActivityInfo aInfo = mSupervisor.resolveActivity(intent, resolvedTypes[i], 0, @@ -984,7 +989,17 @@ class ActivityStarter { return res; } - resultTo = outActivity[0] != null ? outActivity[0].appToken : null; + final ActivityRecord started = outActivity[0]; + if (started != null && started.getUid() == filterCallingUid) { + // Only the started activity which has the same uid as the source caller can + // be the caller of next activity. + resultTo = started.appToken; + forceNewTask = false; + } else { + // Different apps not adjacent to the caller are forced to be new task. + resultTo = null; + forceNewTask = true; + } } } } finally { -- 2.11.0