diff options
author | 2025-06-25 14:52:39 -0700 | |
---|---|---|
committer | 2025-09-18 09:06:34 +0200 | |
commit | 641ad004e1b9e6dae5eaa4182d35f7bd458b7436 (patch) | |
tree | 6707dee2439460f1656adc1f35505c01a2c0b017 /services | |
parent | 6fed4a4e7e0402ce99896dd8cb2fabed58a7fc89 (diff) |
[SP 2025-09-01] [RESTRICT AUTOMERGE] Disallow PINNED in setLaunchWindowingMode
- Throw security exception if setLaunchWindowingMode is called with
WINDOWING_MODE_PINNED
- Deprecated also test cases that are irrelevant after this change
Flag: EXEMPT security fix
Bug: 388029380
Test: atest PinnedStackTests \
SafeActivityOptionsTest \
TaskLaunchParamsModifierTests
Change-Id: I9d37d41af3d86f785fd5d85503b544552b39cac4
Diffstat (limited to 'services')
3 files changed, 17 insertions, 36 deletions
diff --git a/services/core/java/com/android/server/wm/SafeActivityOptions.java b/services/core/java/com/android/server/wm/SafeActivityOptions.java index 88e534351e2e..73c1357c4a24 100644 --- a/services/core/java/com/android/server/wm/SafeActivityOptions.java +++ b/services/core/java/com/android/server/wm/SafeActivityOptions.java @@ -24,6 +24,7 @@ import static android.Manifest.permission.STATUS_BAR_SERVICE; import static android.app.ActivityTaskManager.INVALID_TASK_ID; import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT; import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED; +import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; import static android.app.WindowConfiguration.activityTypeToString; import static android.content.pm.PackageManager.PERMISSION_DENIED; import static android.content.pm.PackageManager.PERMISSION_GRANTED; @@ -372,6 +373,17 @@ public class SafeActivityOptions { throw new SecurityException(msg); } + // setLaunchWindowingMode(PINNED) is not allowed, use ActivityOptions#makeLaunchIntoPip + // instead which is a public API. + if (options.getLaunchWindowingMode() == WINDOWING_MODE_PINNED) { + final String msg = "Permission Denial: starting " + getIntentString(intent) + + " from " + callerApp + " (pid=" + callingPid + + ", uid=" + callingUid + ") with" + + " setLaunchWindowingMode=PINNED"; + Slog.w(TAG, msg); + throw new SecurityException(msg); + } + final int activityType = options.getLaunchActivityType(); if (activityType != ACTIVITY_TYPE_UNDEFINED && !isSystemOrSystemUI(callingPid, callingUid)) { diff --git a/services/tests/wmtests/src/com/android/server/wm/SafeActivityOptionsTest.java b/services/tests/wmtests/src/com/android/server/wm/SafeActivityOptionsTest.java index a92fe3afbd78..76be76f85c39 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SafeActivityOptionsTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/SafeActivityOptionsTest.java @@ -17,6 +17,7 @@ package com.android.server.wm; import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; +import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; import static android.content.pm.PackageManager.PERMISSION_DENIED; import static android.view.Display.DEFAULT_DISPLAY; @@ -197,6 +198,10 @@ public class SafeActivityOptionsTest { activityOptions.setRemoteTransition(remoteTransition); verifySecureExceptionThrown(activityOptions, taskSupervisor); + activityOptions = ActivityOptions.makeBasic(); + activityOptions.setLaunchWindowingMode(WINDOWING_MODE_PINNED); + verifySecureExceptionThrown(activityOptions, taskSupervisor); + verifySecureExceptionThrown(activityOptions, taskSupervisor, mock(TaskDisplayArea.class)); } finally { diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskLaunchParamsModifierTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskLaunchParamsModifierTests.java index 4568c77204a5..24ca929dd2cd 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskLaunchParamsModifierTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskLaunchParamsModifierTests.java @@ -714,42 +714,6 @@ public class TaskLaunchParamsModifierTests extends WINDOWING_MODE_FULLSCREEN); } - - @Test - public void testKeepsPictureInPictureLaunchModeInOptions() { - final TestDisplayContent freeformDisplay = createNewDisplayContent( - WINDOWING_MODE_FREEFORM); - - final ActivityOptions options = ActivityOptions.makeBasic(); - options.setLaunchWindowingMode(WINDOWING_MODE_PINNED); - - mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea(); - - assertEquals(RESULT_CONTINUE, - new CalculateRequestBuilder().setOptions(options).calculate()); - - assertEquivalentWindowingMode(WINDOWING_MODE_PINNED, mResult.mWindowingMode, - WINDOWING_MODE_FREEFORM); - } - - @Test - public void testKeepsPictureInPictureLaunchModeWithBoundsInOptions() { - final TestDisplayContent freeformDisplay = createNewDisplayContent( - WINDOWING_MODE_FREEFORM); - - final ActivityOptions options = ActivityOptions.makeBasic(); - options.setLaunchWindowingMode(WINDOWING_MODE_PINNED); - options.setLaunchBounds(new Rect(0, 0, 100, 100)); - - mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea(); - - assertEquals(RESULT_CONTINUE, - new CalculateRequestBuilder().setOptions(options).calculate()); - - assertEquivalentWindowingMode(WINDOWING_MODE_PINNED, mResult.mWindowingMode, - WINDOWING_MODE_FREEFORM); - } - @Test public void testKeepsFullscreenLaunchModeInOptionsOnNonFreeformDisplay() { final ActivityOptions options = ActivityOptions.makeBasic(); |