diff options
3 files changed, 18 insertions, 93 deletions
diff --git a/services/core/java/com/android/server/wm/DragDropController.java b/services/core/java/com/android/server/wm/DragDropController.java index 5b0cc9ab6909..fa748d3a22a5 100644 --- a/services/core/java/com/android/server/wm/DragDropController.java +++ b/services/core/java/com/android/server/wm/DragDropController.java @@ -28,11 +28,9 @@ import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import android.annotation.NonNull; import android.content.ClipData; import android.content.Context; -import android.hardware.display.DisplayTopology; import android.hardware.input.InputManagerGlobal; import android.os.Binder; import android.os.Handler; -import android.os.HandlerExecutor; import android.os.IBinder; import android.os.Looper; import android.os.Message; @@ -51,7 +49,6 @@ import android.window.IGlobalDragListener; import android.window.IUnhandledDragCallback; import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.hidden_from_bootclasspath.com.android.window.flags.Flags; import com.android.server.wm.WindowManagerInternal.IDragDropCallback; import java.util.Objects; @@ -59,7 +56,6 @@ import java.util.Random; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; -import java.util.function.Consumer; /** * Managing drag and drop operations initiated by View#startDragAndDrop. @@ -87,8 +83,6 @@ class DragDropController { private WindowManagerService mService; private final Handler mHandler; - private final Consumer<DisplayTopology> mDisplayTopologyListener = - this::handleDisplayTopologyChange; // The global drag listener for handling cross-window drags private IGlobalDragListener mGlobalDragListener; @@ -114,17 +108,6 @@ class DragDropController { DragDropController(WindowManagerService service, Looper looper) { mService = service; mHandler = new DragHandler(service, looper); - if (Flags.enableConnectedDisplaysDnd()) { - mService.mDisplayManager.registerTopologyListener( - new HandlerExecutor(mService.mH), mDisplayTopologyListener); - } - } - - @VisibleForTesting - void cleanupListeners() { - if (Flags.enableConnectedDisplaysDnd()) { - mService.mDisplayManager.unregisterTopologyListener(mDisplayTopologyListener); - } } @VisibleForTesting @@ -498,18 +481,6 @@ class DragDropController { } } - private void handleDisplayTopologyChange(DisplayTopology unused) { - synchronized (mService.mGlobalLock) { - if (mDragState == null) { - return; - } - if (DEBUG_DRAG) { - Slog.d(TAG_WM, "DisplayTopology changed, cancelling DragAndDrop"); - } - cancelDragAndDrop(mDragState.mToken, true /* skipAnimation */); - } - } - /** * Handles motion events. * @param keepHandling Whether if the drag operation is continuing or this is the last motion diff --git a/services/tests/wmtests/Android.bp b/services/tests/wmtests/Android.bp index 08ae6371559a..b328fc2d5868 100644 --- a/services/tests/wmtests/Android.bp +++ b/services/tests/wmtests/Android.bp @@ -101,7 +101,6 @@ android_test { "testng", "truth", "wmtests-support", - "display_flags_lib", ], libs: [ 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 6ced26920ff4..f509706d1692 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DragDropControllerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DragDropControllerTests.java @@ -32,12 +32,10 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.when; -import static com.android.server.display.feature.flags.Flags.FLAG_DISPLAY_TOPOLOGY; import static com.android.server.wm.DragDropController.MSG_UNHANDLED_DROP_LISTENER_TIMEOUT; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; @@ -58,7 +56,6 @@ import android.content.Intent; import android.content.pm.ShortcutServiceInternal; import android.graphics.PixelFormat; import android.graphics.Rect; -import android.hardware.display.VirtualDisplay; import android.os.Binder; import android.os.Handler; import android.os.IBinder; @@ -69,7 +66,6 @@ import android.os.RemoteException; import android.os.UserHandle; import android.platform.test.annotations.EnableFlags; import android.platform.test.annotations.Presubmit; -import android.platform.test.annotations.RequiresFlagsEnabled; import android.view.DragEvent; import android.view.InputChannel; import android.view.SurfaceControl; @@ -83,14 +79,12 @@ import androidx.test.filters.SmallTest; import com.android.server.LocalServices; import com.android.server.pm.UserManagerInternal; -import com.android.server.wm.utils.VirtualDisplayTestRule; import com.android.window.flags.Flags; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; -import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; @@ -111,8 +105,6 @@ import java.util.function.Consumer; @Presubmit @RunWith(WindowTestRunner.class) public class DragDropControllerTests extends WindowTestsBase { - @Rule - public VirtualDisplayTestRule mVirtualDisplayTestRule = new VirtualDisplayTestRule(); private static final int TIMEOUT_MS = 3000; private static final int TEST_UID = 12345; private static final int TEST_PROFILE_UID = 12345 * UserHandle.PER_USER_RANGE; @@ -228,17 +220,13 @@ public class DragDropControllerTests extends WindowTestsBase { @After public void tearDown() throws Exception { - // Besides TestDragDropController, WMService also creates another DragDropController in - // test, and since listeners are added on instantiation, it has to be cleared here as well. - mTarget.cleanupListeners(); - mWm.mDragDropController.cleanupListeners(); + final CountDownLatch latch; if (!mTarget.dragDropActiveLocked()) { return; } if (mToken != null) { mTarget.cancelDragAndDrop(mToken, false); } - final CountDownLatch latch; latch = new CountDownLatch(1); mTarget.setOnClosedCallbackLocked(latch::countDown); if (mTarget.mIsAccessibilityDrag) { @@ -349,13 +337,12 @@ public class DragDropControllerTests extends WindowTestsBase { // Verify the drop event is only sent for the global intercept window assertTrue(nonLocalWindowDragEvents.isEmpty()); - assertNotEquals(ACTION_DROP, localWindowDragEvents.getLast().getAction()); - assertEquals(ACTION_DROP, - globalInterceptWindowDragEvents.getLast().getAction()); + assertTrue(last(localWindowDragEvents).getAction() != ACTION_DROP); + assertTrue(last(globalInterceptWindowDragEvents).getAction() == ACTION_DROP); // Verify that item extras were not sent with the drop event - assertNull(localWindowDragEvents.getLast().getClipData()); - assertFalse(globalInterceptWindowDragEvents.getLast().getClipData() + assertNull(last(localWindowDragEvents).getClipData()); + assertFalse(last(globalInterceptWindowDragEvents).getClipData() .willParcelWithActivityInfo()); }); } @@ -397,7 +384,7 @@ public class DragDropControllerTests extends WindowTestsBase { } @Test - public void testDragEventCoordinatesOverlappingWindows() { + public void testDragEventCoordinates() { int dragStartX = mWindow.getBounds().centerX(); int dragStartY = mWindow.getBounds().centerY(); int startOffsetPx = 10; @@ -442,7 +429,7 @@ public class DragDropControllerTests extends WindowTestsBase { // Verify only window2 received the DROP event and coords are sent as-is. assertEquals(1, dragEvents.size()); assertEquals(2, dragEvents2.size()); - final DragEvent dropEvent = dragEvents2.getLast(); + final DragEvent dropEvent = last(dragEvents2); assertEquals(ACTION_DROP, dropEvent.getAction()); assertEquals(dropCoordsPx, dropEvent.getX(), 0.0 /* delta */); assertEquals(dropCoordsPx, dropEvent.getY(), 0.0 /* delta */); @@ -450,10 +437,10 @@ public class DragDropControllerTests extends WindowTestsBase { mTarget.reportDropResult(iwindow2, true); // Verify both windows received ACTION_DRAG_ENDED event. - assertEquals(ACTION_DRAG_ENDED, dragEvents.getLast().getAction()); - assertEquals(window2.getDisplayId(), dragEvents.getLast().getDisplayId()); - assertEquals(ACTION_DRAG_ENDED, dragEvents2.getLast().getAction()); - assertEquals(window2.getDisplayId(), dragEvents2.getLast().getDisplayId()); + assertEquals(ACTION_DRAG_ENDED, last(dragEvents).getAction()); + assertEquals(window2.getDisplayId(), last(dragEvents).getDisplayId()); + assertEquals(ACTION_DRAG_ENDED, last(dragEvents2).getAction()); + assertEquals(window2.getDisplayId(), last(dragEvents2).getDisplayId()); } finally { mTarget.continueDragStateClose(); } @@ -506,7 +493,7 @@ public class DragDropControllerTests extends WindowTestsBase { // Verify only window2 received the DROP event and coords are sent as-is assertEquals(1, dragEvents.size()); assertEquals(2, dragEvents2.size()); - final DragEvent dropEvent = dragEvents2.getLast(); + final DragEvent dropEvent = last(dragEvents2); assertEquals(ACTION_DROP, dropEvent.getAction()); assertEquals(dropCoordsPx, dropEvent.getX(), 0.0 /* delta */); assertEquals(dropCoordsPx, dropEvent.getY(), 0.0 /* delta */); @@ -514,12 +501,10 @@ public class DragDropControllerTests extends WindowTestsBase { mTarget.reportDropResult(iwindow2, true); // Verify both windows received ACTION_DRAG_ENDED event. - assertEquals(ACTION_DRAG_ENDED, dragEvents.getLast().getAction()); - assertEquals(testDisplay.getDisplayId(), - dragEvents.getLast().getDisplayId()); - assertEquals(ACTION_DRAG_ENDED, dragEvents2.getLast().getAction()); - assertEquals(testDisplay.getDisplayId(), - dragEvents2.getLast().getDisplayId()); + assertEquals(ACTION_DRAG_ENDED, last(dragEvents).getAction()); + assertEquals(testDisplay.getDisplayId(), last(dragEvents).getDisplayId()); + assertEquals(ACTION_DRAG_ENDED, last(dragEvents2).getAction()); + assertEquals(testDisplay.getDisplayId(), last(dragEvents2).getDisplayId()); } finally { mTarget.continueDragStateClose(); } @@ -576,30 +561,8 @@ public class DragDropControllerTests extends WindowTestsBase { }); } - @Test - @RequiresFlagsEnabled(FLAG_DISPLAY_TOPOLOGY) - @EnableFlags(Flags.FLAG_ENABLE_CONNECTED_DISPLAYS_DND) - public void testDragCancelledOnTopologyChange() { - VirtualDisplay virtualDisplay = createVirtualDisplay(); - // Necessary for now since DragState.sendDragStartedLocked() will recycle drag events - // immediately after dispatching, which is a problem when using mockito arguments captor - // because it returns and modifies the same drag event. - TestIWindow iwindow = (TestIWindow) mWindow.mClient; - final ArrayList<DragEvent> dragEvents = new ArrayList<>(); - iwindow.setDragEventJournal(dragEvents); - - startDrag(0, 0, View.DRAG_FLAG_GLOBAL | View.DRAG_FLAG_GLOBAL_URI_READ, - ClipData.newPlainText("label", "text"), (surface) -> { - final CountDownLatch latch = new CountDownLatch(1); - mTarget.setOnClosedCallbackLocked(latch::countDown); - - // Release virtual display to trigger drag-and-drop cancellation. - virtualDisplay.release(); - assertTrue(awaitInWmLock(() -> latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS))); - - assertEquals(2, dragEvents.size()); - assertEquals(ACTION_DRAG_ENDED, dragEvents.getLast().getAction()); - }); + private DragEvent last(ArrayList<DragEvent> list) { + return list.get(list.size() - 1); } @Test @@ -979,12 +942,4 @@ public class DragDropControllerTests extends WindowTestsBase { assertNotNull(mToken); r.run(); } - - private VirtualDisplay createVirtualDisplay() { - final int width = 800; - final int height = 600; - final String name = getClass().getSimpleName() + "_VirtualDisplay"; - return mVirtualDisplayTestRule.createDisplayManagerAttachedVirtualDisplay(name, width, - height); - } } |