From 82ea6cb9de38fd20ebcddfd84f0132908beeeab1 Mon Sep 17 00:00:00 2001 From: David Stevens Date: Fri, 3 Mar 2017 16:18:50 -0800 Subject: Switch display uid whitelist from task to activity Tasks can contain activities from multiple UIDs, so the uid whitelists for private displays need to be based on activities instead of tasks. This change also stops keeping track of uids on public displays, since the uid list is not used for those displays. Test: android.server.cts.ActivityManagerDisplayTests Test: #testPermissionLaunchMultiUidTask Change-Id: I38f1434f581af64f0db40221431994fd5a99bab3 --- services/core/java/com/android/server/am/ActivityRecord.java | 4 ++++ services/core/java/com/android/server/am/ActivityStack.java | 10 +++++++--- .../java/com/android/server/am/ActivityStackSupervisor.java | 6 +++++- services/core/java/com/android/server/am/TaskRecord.java | 4 ++++ 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java index 7868fdfd864a..b9bb10645dd7 100644 --- a/services/core/java/com/android/server/am/ActivityRecord.java +++ b/services/core/java/com/android/server/am/ActivityRecord.java @@ -2391,6 +2391,10 @@ final class ActivityRecord implements AppWindowContainerListener { return (config.uiMode & Configuration.UI_MODE_TYPE_MASK) == UI_MODE_TYPE_VR_HEADSET; } + int getUid() { + return info.applicationInfo.uid; + } + @Override public String toString() { if (stringName != null) { diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index e64b4b325642..9a4f804cb1b3 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -741,8 +741,10 @@ class ActivityStack extends ConfigurationContai /** Checks if there are tasks with specific UID in the stack. */ boolean isUidPresent(int uid) { for (TaskRecord task : mTaskHistory) { - if (task.effectiveUid == uid) { - return true; + for (ActivityRecord r : task.mActivities) { + if (r.getUid() == uid) { + return true; + } } } return false; @@ -751,7 +753,9 @@ class ActivityStack extends ConfigurationContai /** Get all UIDs that are present in the stack. */ void getPresentUIDs(IntArray presentUIDs) { for (TaskRecord task : mTaskHistory) { - presentUIDs.add(task.effectiveUid); + for (ActivityRecord r : task.mActivities) { + presentUIDs.add(r.getUid()); + } } } diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index c1bff3692938..d6a8c07d976a 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -1632,7 +1632,11 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D mDisplayAccessUIDs.clear(); for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { final ActivityDisplay activityDisplay = mActivityDisplays.valueAt(displayNdx); - mDisplayAccessUIDs.append(activityDisplay.mDisplayId, activityDisplay.getPresentUIDs()); + // Only bother calculating the whitelist for private displays + if (activityDisplay.isPrivate()) { + mDisplayAccessUIDs.append( + activityDisplay.mDisplayId, activityDisplay.getPresentUIDs()); + } } // Store updated lists in DisplayManager. Callers from outside of AM should get them there. mDisplayManagerInternal.setDisplayAccessUIDs(mDisplayAccessUIDs); diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java index 99fe418e66e1..1db62023b09a 100644 --- a/services/core/java/com/android/server/am/TaskRecord.java +++ b/services/core/java/com/android/server/am/TaskRecord.java @@ -1236,6 +1236,10 @@ final class TaskRecord extends ConfigurationContainer implements TaskWindowConta mWindowContainerController.positionChildAt(appController, index); } r.onOverrideConfigurationSent(); + + // Make sure the list of display UID whitelists is updated + // now that this record is in a new task. + mService.mStackSupervisor.updateUIDsPresentOnDisplay(); } /** -- cgit v1.2.3-59-g8ed1b