[wm]: Changed an order to set a target window in TaskPositioner.
The system crash happens in TaskPositioner.unregister()
with the line mClientCallback.unlinkToDeath(this, 0 /* flags */).
Because mClientCallback has not been initialized before starting window drag.
Send the target window at the register function not at the start function.
Test: manual - Drag freefrom windowing task repeatedly
Test: atest WmTests:TaskPositionerTests
Bug: 142746031
Change-Id: Ied605f35d8b50540ad01056fa87bb2637135f1ab
(cherry picked from commit ac5ad99b44ea26aae1571de36c039eed81e886cf)
diff --git a/services/core/java/com/android/server/wm/TaskPositioner.java b/services/core/java/com/android/server/wm/TaskPositioner.java
index 478b1b5..961f973 100644
--- a/services/core/java/com/android/server/wm/TaskPositioner.java
+++ b/services/core/java/com/android/server/wm/TaskPositioner.java
@@ -30,6 +30,7 @@
import static com.android.server.wm.WindowState.MINIMUM_VISIBLE_WIDTH_IN_DP;
import android.annotation.IntDef;
+import android.annotation.NonNull;
import android.app.IActivityTaskManager;
import android.graphics.Point;
import android.graphics.Rect;
@@ -104,6 +105,7 @@
@VisibleForTesting
Task mTask;
+ WindowState mWindow;
private boolean mResizing;
private boolean mPreserveOrientation;
private boolean mStartOrientationWasLandscape;
@@ -238,8 +240,9 @@
/**
* @param displayContent The Display that the window being dragged is on.
+ * @param win The window which will be dragged.
*/
- void register(DisplayContent displayContent) {
+ void register(DisplayContent displayContent, @NonNull WindowState win) {
final Display display = displayContent.getDisplay();
if (DEBUG_TASK_POSITIONING) {
@@ -309,6 +312,17 @@
display.getRealSize(mMaxVisibleSize);
mDragEnded = false;
+
+ try {
+ mClientCallback = win.mClient.asBinder();
+ mClientCallback.linkToDeath(this, 0 /* flags */);
+ } catch (RemoteException e) {
+ // The caller has died, so clean up TaskPositioningController.
+ mService.mTaskPositioningController.finishTaskPositioning();
+ return;
+ }
+ mWindow = win;
+ mTask = win.getTask();
}
void unregister() {
@@ -341,25 +355,19 @@
ProtoLog.d(WM_DEBUG_ORIENTATION, "Resuming rotation after re-position");
mDisplayContent.getDisplayRotation().resume();
mDisplayContent = null;
- mClientCallback.unlinkToDeath(this, 0 /* flags */);
+ if (mClientCallback != null) {
+ mClientCallback.unlinkToDeath(this, 0 /* flags */);
+ }
+ mWindow = null;
}
- void startDrag(WindowState win, boolean resize, boolean preserveOrientation, float startX,
- float startY) {
+ void startDrag(boolean resize, boolean preserveOrientation, float startX,
+ float startY) {
if (DEBUG_TASK_POSITIONING) {
- Slog.d(TAG, "startDrag: win=" + win + ", resize=" + resize
+ Slog.d(TAG, "startDrag: win=" + mWindow + ", resize=" + resize
+ ", preserveOrientation=" + preserveOrientation + ", {" + startX + ", "
+ startY + "}");
}
- try {
- mClientCallback = win.mClient.asBinder();
- mClientCallback.linkToDeath(this, 0 /* flags */);
- } catch (RemoteException e) {
- // The caller has died, so clean up TaskPositioningController.
- mService.mTaskPositioningController.finishTaskPositioning();
- return;
- }
- mTask = win.getTask();
// Use the bounds of the task which accounts for
// multiple app windows. Don't use any bounds from win itself as it
// may not be the same size as the task.
diff --git a/services/core/java/com/android/server/wm/TaskPositioningController.java b/services/core/java/com/android/server/wm/TaskPositioningController.java
index e1123fa..c38e63e 100644
--- a/services/core/java/com/android/server/wm/TaskPositioningController.java
+++ b/services/core/java/com/android/server/wm/TaskPositioningController.java
@@ -169,7 +169,7 @@
mPositioningDisplay = displayContent;
mTaskPositioner = TaskPositioner.create(mService);
- mTaskPositioner.register(displayContent);
+ mTaskPositioner.register(displayContent, win);
// We need to grab the touch focus so that the touch events during the
// resizing/scrolling are not sent to the app. 'win' is the main window
@@ -187,7 +187,7 @@
return false;
}
- mTaskPositioner.startDrag(win, resize, preserveOrientation, startX, startY);
+ mTaskPositioner.startDrag(resize, preserveOrientation, startX, startY);
return true;
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskPositionerTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskPositionerTests.java
index 012eb52..9275512 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskPositionerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskPositionerTests.java
@@ -66,7 +66,6 @@
private int mMinVisibleWidth;
private int mMinVisibleHeight;
private TaskPositioner mPositioner;
- private WindowState mWindow;
@Before
public void setUp() {
@@ -81,17 +80,16 @@
mMinVisibleHeight = dipToPixel(MINIMUM_VISIBLE_HEIGHT_IN_DP, dm);
removeGlobalMinSizeRestriction();
+ WindowState win = createWindow(null, TYPE_BASE_APPLICATION, "window");
mPositioner = new TaskPositioner(mWm, mWm.mAtmService);
- mPositioner.register(mDisplayContent);
- mWindow = createWindow(null, TYPE_BASE_APPLICATION, "window");
- mPositioner.mTask = mWindow.getTask();
- mWindow.getStack().setWindowingMode(WINDOWING_MODE_FREEFORM);
+ mPositioner.register(mDisplayContent, win);
+
+ win.getStack().setWindowingMode(WINDOWING_MODE_FREEFORM);
}
@After
public void tearDown() {
- mWindow = null;
mPositioner = null;
}
@@ -122,8 +120,8 @@
mPositioner.mTask.setBounds(r, true);
// Start a drag resize starting upper left.
- mPositioner.startDrag(mWindow, true /* resizing */,
- false /* preserveOrientation */, r.left - MOUSE_DELTA_X, r.top - MOUSE_DELTA_Y);
+ mPositioner.startDrag(true /* resizing */, false /* preserveOrientation */,
+ r.left - MOUSE_DELTA_X, r.top - MOUSE_DELTA_Y);
assertBoundsEquals(r, mPositioner.getWindowDragBounds());
// Drag to a good landscape size.
@@ -149,8 +147,8 @@
mPositioner.getWindowDragBounds());
// Start a drag resize left and see that only the left coord changes..
- mPositioner.startDrag(mWindow, true /* resizing */,
- false /* preserveOrientation */, r.left - MOUSE_DELTA_X, midY);
+ mPositioner.startDrag(true /* resizing */, false /* preserveOrientation */,
+ r.left - MOUSE_DELTA_X, midY);
// Drag to the left.
mPositioner.resizeDrag(0.0f, midY);
@@ -184,8 +182,8 @@
mPositioner.mTask.setBounds(r, true);
// Drag upper left.
- mPositioner.startDrag(mWindow, true /* resizing */,
- false /* preserveOrientation */, r.left - MOUSE_DELTA_X, r.top - MOUSE_DELTA_Y);
+ mPositioner.startDrag(true /* resizing */, false /* preserveOrientation */,
+ r.left - MOUSE_DELTA_X, r.top - MOUSE_DELTA_Y);
mPositioner.resizeDrag(0.0f, 0.0f);
assertNotEquals(r.left, mPositioner.getWindowDragBounds().left);
assertEquals(r.right, mPositioner.getWindowDragBounds().right);
@@ -193,8 +191,8 @@
assertEquals(r.bottom, mPositioner.getWindowDragBounds().bottom);
// Drag upper.
- mPositioner.startDrag(mWindow, true /* resizing */,
- false /* preserveOrientation */, midX, r.top - MOUSE_DELTA_Y);
+ mPositioner.startDrag(true /* resizing */, false /* preserveOrientation */, midX,
+ r.top - MOUSE_DELTA_Y);
mPositioner.resizeDrag(0.0f, 0.0f);
assertEquals(r.left, mPositioner.getWindowDragBounds().left);
assertEquals(r.right, mPositioner.getWindowDragBounds().right);
@@ -202,8 +200,8 @@
assertEquals(r.bottom, mPositioner.getWindowDragBounds().bottom);
// Drag upper right.
- mPositioner.startDrag(mWindow, true /* resizing */,
- false /* preserveOrientation */, r.right + MOUSE_DELTA_X, r.top - MOUSE_DELTA_Y);
+ mPositioner.startDrag(true /* resizing */, false /* preserveOrientation */,
+ r.right + MOUSE_DELTA_X, r.top - MOUSE_DELTA_Y);
mPositioner.resizeDrag(r.right + 100, 0.0f);
assertEquals(r.left, mPositioner.getWindowDragBounds().left);
assertNotEquals(r.right, mPositioner.getWindowDragBounds().right);
@@ -211,8 +209,8 @@
assertEquals(r.bottom, mPositioner.getWindowDragBounds().bottom);
// Drag right.
- mPositioner.startDrag(mWindow, true /* resizing */,
- false /* preserveOrientation */, r.right + MOUSE_DELTA_X, midY);
+ mPositioner.startDrag(true /* resizing */, false /* preserveOrientation */,
+ r.right + MOUSE_DELTA_X, midY);
mPositioner.resizeDrag(r.right + 100, 0.0f);
assertEquals(r.left, mPositioner.getWindowDragBounds().left);
assertNotEquals(r.right, mPositioner.getWindowDragBounds().right);
@@ -220,8 +218,7 @@
assertEquals(r.bottom, mPositioner.getWindowDragBounds().bottom);
// Drag bottom right.
- mPositioner.startDrag(mWindow, true /* resizing */,
- false /* preserveOrientation */,
+ mPositioner.startDrag(true /* resizing */, false /* preserveOrientation */,
r.right + MOUSE_DELTA_X, r.bottom + MOUSE_DELTA_Y);
mPositioner.resizeDrag(r.right + 100, r.bottom + 100);
assertEquals(r.left, mPositioner.getWindowDragBounds().left);
@@ -230,8 +227,8 @@
assertNotEquals(r.bottom, mPositioner.getWindowDragBounds().bottom);
// Drag bottom.
- mPositioner.startDrag(mWindow, true /* resizing */,
- false /* preserveOrientation */, midX, r.bottom + MOUSE_DELTA_Y);
+ mPositioner.startDrag(true /* resizing */, false /* preserveOrientation */, midX,
+ r.bottom + MOUSE_DELTA_Y);
mPositioner.resizeDrag(r.right + 100, r.bottom + 100);
assertEquals(r.left, mPositioner.getWindowDragBounds().left);
assertEquals(r.right, mPositioner.getWindowDragBounds().right);
@@ -239,8 +236,8 @@
assertNotEquals(r.bottom, mPositioner.getWindowDragBounds().bottom);
// Drag bottom left.
- mPositioner.startDrag(mWindow, true /* resizing */,
- false /* preserveOrientation */, r.left - MOUSE_DELTA_X, r.bottom + MOUSE_DELTA_Y);
+ mPositioner.startDrag(true /* resizing */, false /* preserveOrientation */,
+ r.left - MOUSE_DELTA_X, r.bottom + MOUSE_DELTA_Y);
mPositioner.resizeDrag(0.0f, r.bottom + 100);
assertNotEquals(r.left, mPositioner.getWindowDragBounds().left);
assertEquals(r.right, mPositioner.getWindowDragBounds().right);
@@ -248,8 +245,8 @@
assertNotEquals(r.bottom, mPositioner.getWindowDragBounds().bottom);
// Drag left.
- mPositioner.startDrag(mWindow, true /* resizing */,
- false /* preserveOrientation */, r.left - MOUSE_DELTA_X, midY);
+ mPositioner.startDrag(true /* resizing */, false /* preserveOrientation */,
+ r.left - MOUSE_DELTA_X, midY);
mPositioner.resizeDrag(0.0f, r.bottom + 100);
assertNotEquals(r.left, mPositioner.getWindowDragBounds().left);
assertEquals(r.right, mPositioner.getWindowDragBounds().right);
@@ -266,8 +263,8 @@
final Rect r = new Rect(100, 220, 700, 520);
mPositioner.mTask.setBounds(r, true);
- mPositioner.startDrag(mWindow, true /* resizing */,
- true /* preserveOrientation */, r.left - MOUSE_DELTA_X, r.top - MOUSE_DELTA_Y);
+ mPositioner.startDrag(true /* resizing */, true /* preserveOrientation */,
+ r.left - MOUSE_DELTA_X, r.top - MOUSE_DELTA_Y);
assertBoundsEquals(r, mPositioner.getWindowDragBounds());
// Drag to a good landscape size.
@@ -305,8 +302,8 @@
final int midY = (r.top + r.bottom) / 2;
mPositioner.mTask.setBounds(r, true);
- mPositioner.startDrag(mWindow, true /* resizing */,
- true /* preserveOrientation */, r.left - MOUSE_DELTA_X, midY);
+ mPositioner.startDrag(true /* resizing */, true /* preserveOrientation */,
+ r.left - MOUSE_DELTA_X, midY);
// Drag to the left.
mPositioner.resizeDrag(0.0f, midY);
@@ -346,8 +343,8 @@
final int midX = (r.left + r.right) / 2;
mPositioner.mTask.setBounds(r, true);
- mPositioner.startDrag(mWindow, true /*resizing*/,
- true /*preserveOrientation*/, midX, r.top - MOUSE_DELTA_Y);
+ mPositioner.startDrag(true /*resizing*/, true /*preserveOrientation*/, midX,
+ r.top - MOUSE_DELTA_Y);
// Drag to the left (no change).
mPositioner.resizeDrag(0.0f, r.top);
@@ -382,8 +379,8 @@
final Rect r = new Rect(330, 100, 630, 600);
mPositioner.mTask.setBounds(r, true);
- mPositioner.startDrag(mWindow, true /*resizing*/,
- true /*preserveOrientation*/, r.left - MOUSE_DELTA_X, r.top - MOUSE_DELTA_Y);
+ mPositioner.startDrag(true /*resizing*/, true /*preserveOrientation*/,
+ r.left - MOUSE_DELTA_X, r.top - MOUSE_DELTA_Y);
assertBoundsEquals(r, mPositioner.getWindowDragBounds());
// Drag to a good landscape size.
@@ -416,8 +413,8 @@
final int midY = (r.top + r.bottom) / 2;
mPositioner.mTask.setBounds(r, true);
- mPositioner.startDrag(mWindow, true /* resizing */,
- true /* preserveOrientation */, r.left - MOUSE_DELTA_X, midY);
+ mPositioner.startDrag(true /* resizing */, true /* preserveOrientation */,
+ r.left - MOUSE_DELTA_X, midY);
// Drag to the left.
mPositioner.resizeDrag(0.0f, midY);
@@ -459,8 +456,8 @@
final int midX = (r.left + r.right) / 2;
mPositioner.mTask.setBounds(r, true);
- mPositioner.startDrag(mWindow, true /* resizing */,
- true /* preserveOrientation */, midX, r.top - MOUSE_DELTA_Y);
+ mPositioner.startDrag(true /* resizing */, true /* preserveOrientation */, midX,
+ r.top - MOUSE_DELTA_Y);
// Drag to the left (no change).
mPositioner.resizeDrag(0.0f, r.top);
@@ -502,7 +499,7 @@
public void testFinishingMovingWhenBinderDied() {
spyOn(mWm.mTaskPositioningController);
- mPositioner.startDrag(mWindow, false, false, 0 /* startX */, 0 /* startY */);
+ mPositioner.startDrag(false, false, 0 /* startX */, 0 /* startY */);
verify(mWm.mTaskPositioningController, never()).finishTaskPositioning();
mPositioner.binderDied();
verify(mWm.mTaskPositioningController).finishTaskPositioning();