From 8624560d00c06cf37e1a138d9997479425d4d2b4 Mon Sep 17 00:00:00 2001 From: Cheng Shi Date: Thu, 8 Sep 2022 06:43:11 +0000 Subject: [PATCH] Fix the problem that system apps cannot drag If an app with a uid of Process.SYSTEM_UID calls view.startDragAndDrop, IllegalStateException will be thrown in Session.performDrag, which makes the drag-and-drop feature unavailable in this app. And we don't need this check either, because validateAndResolveDragMimeTypeExtras and validateDragFlags are indeed called before Binder.clearCallingIdentity. Bug: 245626682 Change-Id: I1c27287e51a956284dae0f61bfa0cac14dd28a27 --- services/core/java/com/android/server/wm/Session.java | 11 ++--------- .../android/server/wm/DragDropControllerTests.java | 6 ++---- 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/services/core/java/com/android/server/wm/Session.java b/services/core/java/com/android/server/wm/Session.java index 30b50839cd35d..c5f21eb0ef5fa 100644 --- a/services/core/java/com/android/server/wm/Session.java +++ b/services/core/java/com/android/server/wm/Session.java @@ -322,7 +322,7 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient { final int callingPid = Binder.getCallingPid(); // Validate and resolve ClipDescription data before clearing the calling identity validateAndResolveDragMimeTypeExtras(data, callingUid, callingPid, mPackageName); - validateDragFlags(flags, callingUid); + validateDragFlags(flags); final long ident = Binder.clearCallingIdentity(); try { return mDragDropController.performDrag(mPid, mUid, window, flags, surface, touchSource, @@ -347,11 +347,7 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient { * Validates the given drag flags. */ @VisibleForTesting - void validateDragFlags(int flags, int callingUid) { - if (callingUid == Process.SYSTEM_UID) { - throw new IllegalStateException("Need to validate before calling identify is cleared"); - } - + void validateDragFlags(int flags) { if ((flags & View.DRAG_FLAG_REQUEST_SURFACE_FOR_RETURN_ANIMATION) != 0) { if (!mCanStartTasksFromRecents) { throw new SecurityException("Requires START_TASKS_FROM_RECENTS permission"); @@ -365,9 +361,6 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient { @VisibleForTesting void validateAndResolveDragMimeTypeExtras(ClipData data, int callingUid, int callingPid, String callingPackage) { - if (callingUid == Process.SYSTEM_UID) { - throw new IllegalStateException("Need to validate before calling identify is cleared"); - } final ClipDescription desc = data != null ? data.getDescription() : null; if (desc == null) { return; diff --git a/services/tests/wmtests/src/com/android/server/wm/DragDropControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/DragDropControllerTests.java index 28fc352e2f741..4526d18d63d80 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DragDropControllerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DragDropControllerTests.java @@ -467,8 +467,7 @@ public class DragDropControllerTests extends WindowTestsBase { public void onAnimatorScaleChanged(float scale) {} }); try { - session.validateDragFlags(View.DRAG_FLAG_REQUEST_SURFACE_FOR_RETURN_ANIMATION, - TEST_UID); + session.validateDragFlags(View.DRAG_FLAG_REQUEST_SURFACE_FOR_RETURN_ANIMATION); fail("Expected failure without permission"); } catch (SecurityException e) { // Expected failure @@ -484,8 +483,7 @@ public class DragDropControllerTests extends WindowTestsBase { public void onAnimatorScaleChanged(float scale) {} }); try { - session.validateDragFlags(View.DRAG_FLAG_REQUEST_SURFACE_FOR_RETURN_ANIMATION, - TEST_UID); + session.validateDragFlags(View.DRAG_FLAG_REQUEST_SURFACE_FOR_RETURN_ANIMATION); // Expected pass } catch (SecurityException e) { fail("Expected no failure with permission");