From 7beb3787838cfc2aed5f7056ba1b9d1bf031b178 Mon Sep 17 00:00:00 2001 From: Sean Stout Date: Thu, 30 Jul 2020 21:34:44 -0700 Subject: [PATCH] Allow virtual displays to launch activities if trusted This CL updates ActivityStackSupervisor to allow virtual displays to launch Activities if they are trusted displays. Trusted virtual displays can only be created if the ADD_TRUSTED_DISPLAY permission is held. Bug: 162255799 Bug: 162042798 Test: atest WmTests:ActivityStackSupervisorTests Change-Id: I0ec3ef91e7ee2cbea34183d2607b31a4b0dd0fc3 --- .../server/wm/ActivityStackSupervisor.java | 9 ++-- services/tests/wmtests/AndroidManifest.xml | 1 + .../wm/ActivityStackSupervisorTests.java | 52 +++++++++++++++++++ 3 files changed, 58 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java index 04b1edc3eedeb..7e5408f357383 100644 --- a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java @@ -130,6 +130,7 @@ import android.util.MergedConfiguration; import android.util.Slog; import android.util.SparseArray; import android.util.SparseIntArray; +import android.view.Display; import com.android.internal.R; import com.android.internal.annotations.GuardedBy; @@ -1090,9 +1091,9 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { // Check if caller is already present on display final boolean uidPresentOnDisplay = displayContent.isUidPresent(callingUid); - final int displayOwnerUid = displayContent.mDisplay.getOwnerUid(); - if (displayContent.mDisplay.getType() == TYPE_VIRTUAL && displayOwnerUid != SYSTEM_UID) { - // Limit launching on virtual displays, because their contents can be read from Surface + final Display display = displayContent.mDisplay; + if (!display.isTrusted()) { + // Limit launching on untrusted displays because their contents can be read from Surface // by apps that created them. if ((aInfo.flags & ActivityInfo.FLAG_ALLOW_EMBEDDED) == 0) { if (DEBUG_TASKS) Slog.d(TAG, "Launch on display check:" @@ -1116,7 +1117,7 @@ public class ActivityStackSupervisor implements RecentTasks.Callbacks { } // Check if the caller is the owner of the display. - if (displayOwnerUid == callingUid) { + if (display.getOwnerUid() == callingUid) { if (DEBUG_TASKS) Slog.d(TAG, "Launch on display check:" + " allow launch for owner of the display"); return true; diff --git a/services/tests/wmtests/AndroidManifest.xml b/services/tests/wmtests/AndroidManifest.xml index 4040fa6a675e2..e3c795d03381e 100644 --- a/services/tests/wmtests/AndroidManifest.xml +++ b/services/tests/wmtests/AndroidManifest.xml @@ -38,6 +38,7 @@ +