Skip adding shell drop target window for virtual displays - Having content on the virtual display can prevent mirroring from working correctly Fixes: 205080647 Test: atest WMShellUnitTests Change-Id: Id13d8e9020edf5f78c10148f48bd64cec92b7994
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java index 0c12d6c..d2b4711 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropController.java
@@ -19,6 +19,7 @@ import static android.content.ClipDescription.MIMETYPE_APPLICATION_ACTIVITY; import static android.content.ClipDescription.MIMETYPE_APPLICATION_SHORTCUT; import static android.content.ClipDescription.MIMETYPE_APPLICATION_TASK; +import static android.view.Display.DEFAULT_DISPLAY; import static android.view.DragEvent.ACTION_DRAG_ENDED; import static android.view.DragEvent.ACTION_DRAG_ENTERED; import static android.view.DragEvent.ACTION_DRAG_EXITED; @@ -34,13 +35,13 @@ import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; -import android.content.ClipData; import android.content.ClipDescription; import android.content.Context; import android.content.res.Configuration; import android.graphics.PixelFormat; import android.util.Slog; import android.util.SparseArray; +import android.view.Display; import android.view.DragEvent; import android.view.LayoutInflater; import android.view.SurfaceControl; @@ -55,7 +56,6 @@ import com.android.wm.shell.R; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.protolog.ShellProtoLogGroup; -import com.android.wm.shell.splitscreen.SplitScreen; import com.android.wm.shell.splitscreen.SplitScreenController; import java.util.Optional; @@ -91,6 +91,11 @@ @Override public void onDisplayAdded(int displayId) { ProtoLog.v(ShellProtoLogGroup.WM_SHELL_DRAG_AND_DROP, "Display added: %d", displayId); + if (displayId != DEFAULT_DISPLAY) { + // Ignore non-default displays for now + return; + } + final Context context = mDisplayController.getDisplayContext(displayId) .createWindowContext(TYPE_APPLICATION_OVERLAY, null); final WindowManager wm = context.getSystemService(WindowManager.class);
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/draganddrop/DragAndDropControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/draganddrop/DragAndDropControllerTest.java new file mode 100644 index 0000000..bfa2c92 --- /dev/null +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/draganddrop/DragAndDropControllerTest.java
@@ -0,0 +1,78 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.wm.shell.draganddrop; + +import static org.junit.Assert.assertFalse; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; + +import android.content.Context; +import android.os.RemoteException; +import android.view.Display; +import android.view.DragEvent; +import android.view.View; + +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.filters.SmallTest; + +import com.android.internal.logging.UiEventLogger; +import com.android.wm.shell.common.DisplayController; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +/** + * Tests for the drag and drop controller. + */ +@SmallTest +@RunWith(AndroidJUnit4.class) +public class DragAndDropControllerTest { + + @Mock + private Context mContext; + + @Mock + private DisplayController mDisplayController; + + @Mock + private UiEventLogger mUiEventLogger; + + private DragAndDropController mController; + + @Before + public void setUp() throws RemoteException { + MockitoAnnotations.initMocks(this); + + mController = new DragAndDropController(mContext, mDisplayController, mUiEventLogger); + } + + @Test + public void testIgnoreNonDefaultDisplays() { + final int nonDefaultDisplayId = 12345; + final View dragLayout = mock(View.class); + final Display display = mock(Display.class); + doReturn(nonDefaultDisplayId).when(display).getDisplayId(); + doReturn(display).when(dragLayout).getDisplay(); + + // Expect no per-display layout to be added + mController.onDisplayAdded(nonDefaultDisplayId); + assertFalse(mController.onDrag(dragLayout, mock(DragEvent.class))); + } +}