From 52a0e799f25d53d48f442febf938558b0b5aa30e Mon Sep 17 00:00:00 2001 From: Chilun Date: Thu, 10 Mar 2022 23:11:41 +0800 Subject: [PATCH] Block activity launching if DWPC does not allow Prvent an activity from launching and return START_CANCELED if target display's DWPC does not allow it. Bug: 205811272 Test: atest ActivityBlockingTest ActivityStarterTests Change-Id: I8b6bbc5713da035bd7320c507ba4f3f49bda8423 --- .../android/server/wm/ActivityStarter.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index 7d2dfa0715979..230c8ac8b9959 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -135,6 +135,7 @@ import com.android.server.wm.LaunchParamsController.LaunchParams; import java.io.PrintWriter; import java.text.DateFormat; +import java.util.ArrayList; import java.util.Date; /** @@ -2009,6 +2010,27 @@ class ActivityStarter { return START_PERMISSION_DENIED; } + // Do not start the activity if target display's DWPC does not allow it. + // We can't return fatal error code here because it will crash the caller of + // startActivity() if they don't catch the exception. We don't expect 3P apps to make + // changes. + if (mPreferredTaskDisplayArea != null) { + final DisplayContent displayContent = mRootWindowContainer.getDisplayContentOrCreate( + mPreferredTaskDisplayArea.getDisplayId()); + if (displayContent != null && displayContent.mDwpcHelper.hasController()) { + final ArrayList activities = new ArrayList<>(); + activities.add(r.info); + final int targetWindowingMode = (targetTask != null) + ? targetTask.getWindowingMode() : displayContent.getWindowingMode(); + if (!displayContent.mDwpcHelper + .canContainActivities(activities, targetWindowingMode)) { + Slog.w(TAG, "Abort to launch " + r.info.getComponentName() + + " on display area " + mPreferredTaskDisplayArea); + return START_ABORTED; + } + } + } + return START_SUCCESS; }