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

Commit db8d9ce6 authored by Riddle Hsu's avatar Riddle Hsu Committed by syphyr
Browse files

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

[basilgello: Back-ported to 14.1:
 - Added definition for ActivityRecord.getUid() from
   fwb/82ea6cb9]
Signed-off-by: default avatarVasyl Gello <vasek.gello@gmail.com>

Change-Id: I97bd875146a52f62b8fe82235487ccefb2955e8e
(cherry picked from commit 2be3ba49)
parent c90263e2
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -1531,6 +1531,10 @@ final class ActivityRecord {
        }
    }

    int getUid() {
        return info.applicationInfo.uid;
    }

    @Override
    public String toString() {
        if (stringName != null) {
+16 −1
Original line number Diff line number Diff line
@@ -1026,6 +1026,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) {
@@ -1045,6 +1047,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,
@@ -1070,7 +1075,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 {