diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index e50aff438ecd7..7b60ea7b95588 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; /** @@ -2010,6 +2011,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; }