diff options
| -rw-r--r-- | services/core/java/com/android/server/am/ActivityStackSupervisor.java | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 7bbc6cce9bd8..ab6e6025e602 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -1705,6 +1705,9 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D return true; } + // Check if caller is already present on display + final boolean uidPresentOnDisplay = activityDisplay.isUidPresent(callingUid); + final int displayOwnerUid = activityDisplay.mDisplay.getOwnerUid(); if (activityDisplay.mDisplay.getType() == TYPE_VIRTUAL && displayOwnerUid != SYSTEM_UID && displayOwnerUid != aInfo.applicationInfo.uid) { @@ -1717,7 +1720,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D } // Check if the caller is allowed to embed activities from other apps. if (mService.checkPermission(ACTIVITY_EMBEDDING, callingPid, callingUid) - == PERMISSION_DENIED) { + == PERMISSION_DENIED && !uidPresentOnDisplay) { if (DEBUG_TASKS) Slog.d(TAG, "Launch on display check:" + " disallow activity embedding without permission."); return false; @@ -1738,8 +1741,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D return true; } - // Check if caller is present on display - if (activityDisplay.isUidPresent(callingUid)) { + if (uidPresentOnDisplay) { if (DEBUG_TASKS) Slog.d(TAG, "Launch on display check:" + " allow launch for caller present on the display"); return true; |