Merge "[wm]: Fixed TaskPositioner leak" into qt-dev

am: 050d6df74c

Change-Id: Ife9c5d5da6fae4d40183a6a56a71165001bf6674
This commit is contained in:
yj81.kwon
2019-05-20 04:54:49 -07:00
committed by android-build-merger
7 changed files with 69 additions and 3 deletions

View File

@@ -254,6 +254,8 @@ interface IWindowSession {
*/
boolean startMovingTask(IWindow window, float startX, float startY);
void finishMovingTask(IWindow window);
void updatePointerIcon(IWindow window);
/**

View File

@@ -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)

View File

@@ -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;
}

View File

@@ -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();

View File

@@ -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;

View File

@@ -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");

View File

@@ -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) {