From 8f07029f3ceb7312abf67dd9ab8b56e1a2e50c85 Mon Sep 17 00:00:00 2001 From: Andrii Kulian Date: Tue, 12 Sep 2017 22:56:49 -0700 Subject: [PATCH] Fix consequent activity launch on virtual displays When activity is launched from a secondary display, it by default should land on the same display. This was broken by recent restrictions added for virtual displays. Bug: 63117330 Test: android.server.cts.ActivityManagerDisplayTests Test: #testConsequentLaunchActivityFromVirtualDisplay Test: #testConsequentLaunchActivityFromVirtualDisplayToTargetDisplay Test: #testConsequentLaunchActivityFromVirtualDisplayNoEmbedding Change-Id: Ie8adfe8eacb3cf8a05115c13bcad881dba51badb --- .../com/android/server/am/ActivityStackSupervisor.java | 8 +++++--- 1 file 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 7bbc6cce9bd8d..ab6e6025e6025 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;