summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jerry Chang <chenghsiuchang@google.com> 2021-11-02 15:00:47 +0800
committer Jerry Chang <chenghsiuchang@google.com> 2021-11-03 10:22:26 +0800
commit4d61bbca3b91a89c5b79ce6ea6a2e30b6470f6da (patch)
tree4386bd9fc1556feff89524cd578530428438427e
parent183768148838a279b43c3860922f69cdb44bc69e (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
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragAndDropEventLogger.java21
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java4
-rw-r--r--services/core/java/com/android/server/wm/TaskDisplayArea.java3
-rw-r--r--services/core/java/com/android/server/wm/WindowOrganizerController.java4
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java30
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);