Merge "[wm]: Fixed TaskPositioner leak" into qt-dev
am: 050d6df74c
Change-Id: Ife9c5d5da6fae4d40183a6a56a71165001bf6674
This commit is contained in:
@@ -254,6 +254,8 @@ interface IWindowSession {
|
||||
*/
|
||||
boolean startMovingTask(IWindow window, float startX, float startY);
|
||||
|
||||
void finishMovingTask(IWindow window);
|
||||
|
||||
void updatePointerIcon(IWindow window);
|
||||
|
||||
/**
|
||||
|
||||
@@ -25519,6 +25519,21 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Finish a window move task.
|
||||
* @hide
|
||||
*/
|
||||
public void finishMovingTask() {
|
||||
if (ViewDebug.DEBUG_POSITIONING) {
|
||||
Log.d(VIEW_LOG_TAG, "finishMovingTask");
|
||||
}
|
||||
try {
|
||||
mAttachInfo.mSession.finishMovingTask(mAttachInfo.mWindow);
|
||||
} catch (RemoteException e) {
|
||||
Log.e(VIEW_LOG_TAG, "Unable to finish moving", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles drag events sent by the system following a call to
|
||||
* {@link android.view.View#startDragAndDrop(ClipData,DragShadowBuilder,Object,int)
|
||||
|
||||
@@ -188,7 +188,8 @@ public class DecorCaptionView extends ViewGroup implements View.OnTouchListener,
|
||||
final int y = (int) e.getY();
|
||||
final boolean fromMouse = e.getToolType(e.getActionIndex()) == MotionEvent.TOOL_TYPE_MOUSE;
|
||||
final boolean primaryButton = (e.getButtonState() & MotionEvent.BUTTON_PRIMARY) != 0;
|
||||
switch (e.getActionMasked()) {
|
||||
final int actionMasked = e.getActionMasked();
|
||||
switch (actionMasked) {
|
||||
case MotionEvent.ACTION_DOWN:
|
||||
if (!mShow) {
|
||||
// When there is no caption we should not react to anything.
|
||||
@@ -220,6 +221,12 @@ public class DecorCaptionView extends ViewGroup implements View.OnTouchListener,
|
||||
break;
|
||||
}
|
||||
// Abort the ongoing dragging.
|
||||
if (actionMasked == MotionEvent.ACTION_UP) {
|
||||
// If it receives ACTION_UP event, the dragging is already finished and also
|
||||
// the system can not end drag on ACTION_UP event. So request to finish
|
||||
// dragging.
|
||||
finishMovingTask();
|
||||
}
|
||||
mDragging = false;
|
||||
return !mCheckForDragging;
|
||||
}
|
||||
|
||||
@@ -315,6 +315,18 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void finishMovingTask(IWindow window) {
|
||||
if (DEBUG_TASK_POSITIONING) Slog.d(TAG_WM, "finishMovingTask");
|
||||
|
||||
long ident = Binder.clearCallingIdentity();
|
||||
try {
|
||||
mService.mTaskPositioningController.finishTaskPositioning(window);
|
||||
} finally {
|
||||
Binder.restoreCallingIdentity(ident);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void reportSystemGestureExclusionChanged(IWindow window, List<Rect> exclusionRects) {
|
||||
long ident = Binder.clearCallingIdentity();
|
||||
|
||||
@@ -119,7 +119,7 @@ class TaskPositioner implements IBinder.DeathRecipient {
|
||||
private int mCtrlType = CTRL_NONE;
|
||||
@VisibleForTesting
|
||||
boolean mDragEnded;
|
||||
private IBinder mClientCallback;
|
||||
IBinder mClientCallback;
|
||||
|
||||
InputChannel mServerChannel;
|
||||
InputChannel mClientChannel;
|
||||
|
||||
@@ -185,6 +185,12 @@ class TaskPositioningController {
|
||||
return true;
|
||||
}
|
||||
|
||||
public void finishTaskPositioning(IWindow window) {
|
||||
if (mTaskPositioner != null && mTaskPositioner.mClientCallback == window.asBinder()) {
|
||||
finishTaskPositioning();
|
||||
}
|
||||
}
|
||||
|
||||
void finishTaskPositioning() {
|
||||
mHandler.post(() -> {
|
||||
if (DEBUG_TASK_POSITIONING) Slog.d(TAG_WM, "finishPositioning");
|
||||
|
||||
@@ -32,6 +32,7 @@ import static org.junit.Assert.assertTrue;
|
||||
import android.platform.test.annotations.Presubmit;
|
||||
import android.view.InputChannel;
|
||||
|
||||
import androidx.test.filters.FlakyTest;
|
||||
import androidx.test.filters.SmallTest;
|
||||
|
||||
import org.junit.Before;
|
||||
@@ -41,7 +42,7 @@ import org.junit.Test;
|
||||
* Tests for the {@link TaskPositioningController} class.
|
||||
*
|
||||
* Build/Install/Run:
|
||||
* atest FrameworksServicesTests:TaskPositioningControllerTests
|
||||
* atest WmTests:TaskPositioningControllerTests
|
||||
*/
|
||||
@SmallTest
|
||||
@Presubmit
|
||||
@@ -87,6 +88,29 @@ public class TaskPositioningControllerTests extends WindowTestsBase {
|
||||
assertNull(mTarget.getDragWindowHandleLocked());
|
||||
}
|
||||
|
||||
@FlakyTest(bugId = 129507487)
|
||||
@Test
|
||||
public void testFinishPositioningWhenAppRequested() {
|
||||
synchronized (mWm.mGlobalLock) {
|
||||
assertFalse(mTarget.isPositioningLocked());
|
||||
assertNull(mTarget.getDragWindowHandleLocked());
|
||||
}
|
||||
|
||||
assertTrue(mTarget.startMovingTask(mWindow.mClient, 0, 0));
|
||||
|
||||
synchronized (mWm.mGlobalLock) {
|
||||
assertTrue(mTarget.isPositioningLocked());
|
||||
assertNotNull(mTarget.getDragWindowHandleLocked());
|
||||
}
|
||||
|
||||
mTarget.finishTaskPositioning(mWindow.mClient);
|
||||
// Wait until the looper processes finishTaskPositioning.
|
||||
assertTrue(mWm.mH.runWithScissors(() -> { }, TIMEOUT_MS));
|
||||
|
||||
assertFalse(mTarget.isPositioningLocked());
|
||||
assertNull(mTarget.getDragWindowHandleLocked());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testHandleTapOutsideTask() {
|
||||
synchronized (mWm.mGlobalLock) {
|
||||
|
||||
Reference in New Issue
Block a user