diff options
| author | 2021-11-02 15:00:47 +0800 | |
|---|---|---|
| committer | 2021-11-03 10:22:26 +0800 | |
| commit | 4d61bbca3b91a89c5b79ce6ea6a2e30b6470f6da (patch) | |
| tree | 4386bd9fc1556feff89524cd578530428438427e | |
| parent | 183768148838a279b43c3860922f69cdb44bc69e (diff) | |
Fix unable to drag notification to enter split screen
Fix exception when resetting adjacent launch root, dragging expandable
notification and logging unknown activity dragging event.
Fix: 202276040
Fix: 197968594
Fix: 204900540
Test: tests passed
Test: drag expandable notification to split won't fail
Change-Id: I4bb6c361df2034547079a6e9d932b0f5589b3e35
5 files changed, 49 insertions, 13 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropEventLogger.java b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropEventLogger.java index 6e4b81563441..2a7dd5aeb341 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropEventLogger.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropEventLogger.java @@ -25,6 +25,8 @@ import android.content.ClipDescription; import android.content.pm.ActivityInfo; import android.view.DragEvent; +import androidx.annotation.Nullable; + import com.android.internal.logging.InstanceId; import com.android.internal.logging.InstanceIdSequence; import com.android.internal.logging.UiEvent; @@ -61,9 +63,7 @@ public class DragAndDropEventLogger { mInstanceId = mIdSequence.newInstanceId(); } mActivityInfo = item.getActivityInfo(); - mUiEventLogger.logWithInstanceId(getStartEnum(description), - mActivityInfo.applicationInfo.uid, - mActivityInfo.applicationInfo.packageName, mInstanceId); + log(getStartEnum(description), mActivityInfo); return mInstanceId; } @@ -71,18 +71,21 @@ public class DragAndDropEventLogger { * Logs a successful drop. */ public void logDrop() { - mUiEventLogger.logWithInstanceId(DragAndDropUiEventEnum.GLOBAL_APP_DRAG_DROPPED, - mActivityInfo.applicationInfo.uid, - mActivityInfo.applicationInfo.packageName, mInstanceId); + log(DragAndDropUiEventEnum.GLOBAL_APP_DRAG_DROPPED, mActivityInfo); } /** * Logs the end of a drag. */ public void logEnd() { - mUiEventLogger.logWithInstanceId(DragAndDropUiEventEnum.GLOBAL_APP_DRAG_END, - mActivityInfo.applicationInfo.uid, - mActivityInfo.applicationInfo.packageName, mInstanceId); + log(DragAndDropUiEventEnum.GLOBAL_APP_DRAG_END, mActivityInfo); + } + + private void log(UiEventLogger.UiEventEnum event, @Nullable ActivityInfo activityInfo) { + mUiEventLogger.logWithInstanceId(event, + activityInfo == null ? 0 : activityInfo.applicationInfo.uid, + activityInfo == null ? null : activityInfo.applicationInfo.packageName, + mInstanceId); } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java index ccd4843e9ac6..1bbd45192bea 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java @@ -1760,7 +1760,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView * Called when a notification is dropped on proper target window. */ public void dragAndDropSuccess() { - mOnDragSuccessListener.onDragSuccess(getEntry()); + if (mOnDragSuccessListener != null) { + mOnDragSuccessListener.onDragSuccess(getEntry()); + } } private void doLongClickCallback() { diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java index f5e7967de410..662b3d578b30 100644 --- a/services/core/java/com/android/server/wm/TaskDisplayArea.java +++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java @@ -148,7 +148,8 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { /** * A launch root task for activity launching with {@link FLAG_ACTIVITY_LAUNCH_ADJACENT} flag. */ - private Task mLaunchAdjacentFlagRootTask; + @VisibleForTesting + Task mLaunchAdjacentFlagRootTask; /** * A focusable root task that is purposely to be positioned at the top. Although the root diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java index 6e706e9df003..c69a734d2fe8 100644 --- a/services/core/java/com/android/server/wm/WindowOrganizerController.java +++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java @@ -566,17 +566,17 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub case HIERARCHY_OP_TYPE_SET_LAUNCH_ADJACENT_FLAG_ROOT: { final WindowContainer wc = WindowContainer.fromBinder(hop.getContainer()); final Task task = wc != null ? wc.asTask() : null; + final boolean clearRoot = hop.getToTop(); if (task == null) { throw new IllegalArgumentException("Cannot set non-task as launch root: " + wc); } else if (!task.mCreatedByOrganizer) { throw new UnsupportedOperationException( "Cannot set non-organized task as adjacent flag root: " + wc); - } else if (task.getAdjacentTaskFragment() == null) { + } else if (task.getAdjacentTaskFragment() == null && !clearRoot) { throw new UnsupportedOperationException( "Cannot set non-adjacent task as adjacent flag root: " + wc); } - final boolean clearRoot = hop.getToTop(); task.getDisplayArea().setLaunchAdjacentFlagRootTask(clearRoot ? null : task); break; } diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java index a482bdacfc82..1eed79f189a8 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java @@ -543,6 +543,36 @@ public class WindowOrganizerTests extends WindowTestsBase { } @Test + public void testSetAdjacentLaunchRoot() { + DisplayContent dc = mWm.mRoot.getDisplayContent(Display.DEFAULT_DISPLAY); + + final Task task1 = mWm.mAtmService.mTaskOrganizerController.createRootTask( + dc, WINDOWING_MODE_MULTI_WINDOW, null); + final RunningTaskInfo info1 = task1.getTaskInfo(); + final Task task2 = mWm.mAtmService.mTaskOrganizerController.createRootTask( + dc, WINDOWING_MODE_MULTI_WINDOW, null); + final RunningTaskInfo info2 = task2.getTaskInfo(); + + WindowContainerTransaction wct = new WindowContainerTransaction(); + wct.setAdjacentRoots(info1.token, info2.token); + mWm.mAtmService.mWindowOrganizerController.applyTransaction(wct); + assertEquals(task1.getAdjacentTaskFragment(), task2); + assertEquals(task2.getAdjacentTaskFragment(), task1); + + wct = new WindowContainerTransaction(); + wct.setLaunchAdjacentFlagRoot(info1.token); + mWm.mAtmService.mWindowOrganizerController.applyTransaction(wct); + assertEquals(dc.getDefaultTaskDisplayArea().mLaunchAdjacentFlagRootTask, task1); + + task1.setAdjacentTaskFragment(null); + task2.setAdjacentTaskFragment(null); + wct = new WindowContainerTransaction(); + wct.clearLaunchAdjacentFlagRoot(info1.token); + mWm.mAtmService.mWindowOrganizerController.applyTransaction(wct); + assertEquals(dc.getDefaultTaskDisplayArea().mLaunchAdjacentFlagRootTask, null); + } + + @Test public void testTileAddRemoveChild() { final StubOrganizer listener = new StubOrganizer(); mWm.mAtmService.mTaskOrganizerController.registerTaskOrganizer(listener); |