Loading libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecorViewModel.java +3 −2 Original line number Original line Diff line number Diff line Loading @@ -44,6 +44,7 @@ import android.view.IWindowManager; import android.view.MotionEvent; import android.view.MotionEvent; import android.view.SurfaceControl; import android.view.SurfaceControl; import android.view.View; import android.view.View; import android.view.ViewConfiguration; import android.window.DisplayAreaInfo; import android.window.DisplayAreaInfo; import android.window.WindowContainerToken; import android.window.WindowContainerToken; import android.window.WindowContainerTransaction; import android.window.WindowContainerTransaction; Loading Loading @@ -310,7 +311,6 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel { new CaptionTouchEventListener(taskInfo, taskPositioner); new CaptionTouchEventListener(taskInfo, taskPositioner); windowDecoration.setCaptionListeners(touchEventListener, touchEventListener); windowDecoration.setCaptionListeners(touchEventListener, touchEventListener); windowDecoration.setDragPositioningCallback(taskPositioner); windowDecoration.setDragPositioningCallback(taskPositioner); windowDecoration.setDragDetector(touchEventListener.mDragDetector); windowDecoration.setTaskDragResizer(taskPositioner); windowDecoration.setTaskDragResizer(taskPositioner); windowDecoration.relayout(taskInfo, startT, finishT, windowDecoration.relayout(taskInfo, startT, finishT, false /* applyStartTransactionOnDraw */, false /* setTaskCropAndPosition */); false /* applyStartTransactionOnDraw */, false /* setTaskCropAndPosition */); Loading @@ -334,7 +334,8 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel { mTaskId = taskInfo.taskId; mTaskId = taskInfo.taskId; mTaskToken = taskInfo.token; mTaskToken = taskInfo.token; mDragPositioningCallback = dragPositioningCallback; mDragPositioningCallback = dragPositioningCallback; mDragDetector = new DragDetector(this); mDragDetector = new DragDetector(this, 0 /* holdToDragMinDurationMs */, ViewConfiguration.get(mContext).getScaledTouchSlop()); mDisplayId = taskInfo.displayId; mDisplayId = taskInfo.displayId; } } Loading libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecoration.java +0 −8 Original line number Original line Diff line number Diff line Loading @@ -74,7 +74,6 @@ public class CaptionWindowDecoration extends WindowDecoration<WindowDecorLinearL private View.OnTouchListener mOnCaptionTouchListener; private View.OnTouchListener mOnCaptionTouchListener; private DragPositioningCallback mDragPositioningCallback; private DragPositioningCallback mDragPositioningCallback; private DragResizeInputListener mDragResizeListener; private DragResizeInputListener mDragResizeListener; private DragDetector mDragDetector; private RelayoutParams mRelayoutParams = new RelayoutParams(); private RelayoutParams mRelayoutParams = new RelayoutParams(); private final RelayoutResult<WindowDecorLinearLayout> mResult = private final RelayoutResult<WindowDecorLinearLayout> mResult = Loading Loading @@ -176,12 +175,6 @@ public class CaptionWindowDecoration extends WindowDecoration<WindowDecorLinearL return stableBounds.bottom - requiredEmptySpace; return stableBounds.bottom - requiredEmptySpace; } } void setDragDetector(DragDetector dragDetector) { mDragDetector = dragDetector; mDragDetector.setTouchSlop(ViewConfiguration.get(mContext).getScaledTouchSlop()); } @Override @Override void relayout(RunningTaskInfo taskInfo) { void relayout(RunningTaskInfo taskInfo) { final SurfaceControl.Transaction t = new SurfaceControl.Transaction(); final SurfaceControl.Transaction t = new SurfaceControl.Transaction(); Loading Loading @@ -288,7 +281,6 @@ public class CaptionWindowDecoration extends WindowDecoration<WindowDecorLinearL final int touchSlop = ViewConfiguration.get(mResult.mRootView.getContext()) final int touchSlop = ViewConfiguration.get(mResult.mRootView.getContext()) .getScaledTouchSlop(); .getScaledTouchSlop(); mDragDetector.setTouchSlop(touchSlop); final Resources res = mResult.mRootView.getResources(); final Resources res = mResult.mRootView.getResources(); mDragResizeListener.setGeometry(new DragResizeWindowGeometry(0 /* taskCornerRadius */, mDragResizeListener.setGeometry(new DragResizeWindowGeometry(0 /* taskCornerRadius */, Loading libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java +24 −5 Original line number Original line Diff line number Diff line Loading @@ -79,6 +79,7 @@ import android.view.MotionEvent; import android.view.SurfaceControl; import android.view.SurfaceControl; import android.view.SurfaceControl.Transaction; import android.view.SurfaceControl.Transaction; import android.view.View; import android.view.View; import android.view.ViewConfiguration; import android.widget.Toast; import android.widget.Toast; import android.window.TaskSnapshot; import android.window.TaskSnapshot; import android.window.WindowContainerToken; import android.window.WindowContainerToken; Loading Loading @@ -663,11 +664,14 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { private class DesktopModeTouchEventListener extends GestureDetector.SimpleOnGestureListener private class DesktopModeTouchEventListener extends GestureDetector.SimpleOnGestureListener implements View.OnClickListener, View.OnTouchListener, View.OnLongClickListener, implements View.OnClickListener, View.OnTouchListener, View.OnLongClickListener, View.OnGenericMotionListener, DragDetector.MotionEventHandler { View.OnGenericMotionListener, DragDetector.MotionEventHandler { private static final long APP_HANDLE_HOLD_TO_DRAG_DURATION_MS = 100; private static final long APP_HEADER_HOLD_TO_DRAG_DURATION_MS = 0; private final int mTaskId; private final int mTaskId; private final WindowContainerToken mTaskToken; private final WindowContainerToken mTaskToken; private final DragPositioningCallback mDragPositioningCallback; private final DragPositioningCallback mDragPositioningCallback; private final DragDetector mDragDetector; private final DragDetector mHandleDragDetector; private final DragDetector mHeaderDragDetector; private final GestureDetector mGestureDetector; private final GestureDetector mGestureDetector; private final int mDisplayId; private final int mDisplayId; private final Rect mOnDragStartInitialBounds = new Rect(); private final Rect mOnDragStartInitialBounds = new Rect(); Loading @@ -689,7 +693,13 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { mTaskId = taskInfo.taskId; mTaskId = taskInfo.taskId; mTaskToken = taskInfo.token; mTaskToken = taskInfo.token; mDragPositioningCallback = dragPositioningCallback; mDragPositioningCallback = dragPositioningCallback; mDragDetector = new DragDetector(this); final int touchSlop = ViewConfiguration.get(mContext).getScaledTouchSlop(); final long appHandleHoldToDragDuration = Flags.enableHoldToDragAppHandle() ? APP_HANDLE_HOLD_TO_DRAG_DURATION_MS : 0; mHandleDragDetector = new DragDetector(this, appHandleHoldToDragDuration, touchSlop); mHeaderDragDetector = new DragDetector(this, APP_HEADER_HOLD_TO_DRAG_DURATION_MS, touchSlop); mGestureDetector = new GestureDetector(mContext, this); mGestureDetector = new GestureDetector(mContext, this); mDisplayId = taskInfo.displayId; mDisplayId = taskInfo.displayId; } } Loading Loading @@ -748,7 +758,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { && id != R.id.maximize_window && id != R.id.minimize_window) { && id != R.id.maximize_window && id != R.id.minimize_window) { return false; return false; } } final boolean isAppHandle = !getTaskInfo().isFreeform(); final int actionMasked = e.getActionMasked(); final int actionMasked = e.getActionMasked(); final boolean isDown = actionMasked == MotionEvent.ACTION_DOWN; final boolean isDown = actionMasked == MotionEvent.ACTION_DOWN; final boolean isUpOrCancel = actionMasked == MotionEvent.ACTION_CANCEL final boolean isUpOrCancel = actionMasked == MotionEvent.ACTION_CANCEL Loading Loading @@ -797,7 +807,11 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { // Gesture is finished, reset state. // Gesture is finished, reset state. mShouldPilferCaptionEvents = false; mShouldPilferCaptionEvents = false; } } return mDragDetector.onMotionEvent(v, e); if (isAppHandle) { return mHandleDragDetector.onMotionEvent(v, e); } else { return mHeaderDragDetector.onMotionEvent(v, e); } } } @Override @Override Loading Loading @@ -865,6 +879,12 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { } } } } @NonNull private RunningTaskInfo getTaskInfo() { final DesktopModeWindowDecoration decoration = mWindowDecorByTaskId.get(mTaskId); return decoration.mTaskInfo; } private boolean handleNonFreeformMotionEvent(DesktopModeWindowDecoration decoration, private boolean handleNonFreeformMotionEvent(DesktopModeWindowDecoration decoration, View v, MotionEvent e) { View v, MotionEvent e) { final int id = v.getId(); final int id = v.getId(); Loading Loading @@ -1447,7 +1467,6 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { touchEventListener, touchEventListener, touchEventListener, touchEventListener); touchEventListener, touchEventListener, touchEventListener, touchEventListener); windowDecoration.setExclusionRegionListener(mExclusionRegionListener); windowDecoration.setExclusionRegionListener(mExclusionRegionListener); windowDecoration.setDragPositioningCallback(taskPositioner); windowDecoration.setDragPositioningCallback(taskPositioner); windowDecoration.setDragDetector(touchEventListener.mDragDetector); windowDecoration.relayout(taskInfo, startT, finishT, windowDecoration.relayout(taskInfo, startT, finishT, false /* applyStartTransactionOnDraw */, false /* shouldSetTaskPositionAndCrop */); false /* applyStartTransactionOnDraw */, false /* shouldSetTaskPositionAndCrop */); if (!Flags.enableHandleInputFix()) { if (!Flags.enableHandleInputFix()) { Loading libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java +0 −7 Original line number Original line Diff line number Diff line Loading @@ -144,7 +144,6 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin private Function0<Unit> mOnManageWindowsClickListener; private Function0<Unit> mOnManageWindowsClickListener; private DragPositioningCallback mDragPositioningCallback; private DragPositioningCallback mDragPositioningCallback; private DragResizeInputListener mDragResizeListener; private DragResizeInputListener mDragResizeListener; private DragDetector mDragDetector; private RelayoutParams mRelayoutParams = new RelayoutParams(); private RelayoutParams mRelayoutParams = new RelayoutParams(); private final WindowDecoration.RelayoutResult<WindowDecorLinearLayout> mResult = private final WindowDecoration.RelayoutResult<WindowDecorLinearLayout> mResult = new WindowDecoration.RelayoutResult<>(); new WindowDecoration.RelayoutResult<>(); Loading Loading @@ -335,11 +334,6 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin mDragPositioningCallback = dragPositioningCallback; mDragPositioningCallback = dragPositioningCallback; } } void setDragDetector(DragDetector dragDetector) { mDragDetector = dragDetector; mDragDetector.setTouchSlop(ViewConfiguration.get(mContext).getScaledTouchSlop()); } void setOpenInBrowserClickListener(Consumer<Uri> listener) { void setOpenInBrowserClickListener(Consumer<Uri> listener) { mOpenInBrowserClickListener = listener; mOpenInBrowserClickListener = listener; } } Loading Loading @@ -504,7 +498,6 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin final int touchSlop = ViewConfiguration.get(mResult.mRootView.getContext()) final int touchSlop = ViewConfiguration.get(mResult.mRootView.getContext()) .getScaledTouchSlop(); .getScaledTouchSlop(); mDragDetector.setTouchSlop(touchSlop); // If either task geometry or position have changed, update this task's // If either task geometry or position have changed, update this task's // exclusion region listener // exclusion region listener Loading libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragDetector.java +28 −2 Original line number Original line Diff line number Diff line Loading @@ -26,6 +26,7 @@ import static android.view.MotionEvent.ACTION_MOVE; import static android.view.MotionEvent.ACTION_POINTER_UP; import static android.view.MotionEvent.ACTION_POINTER_UP; import static android.view.MotionEvent.ACTION_UP; import static android.view.MotionEvent.ACTION_UP; import android.annotation.NonNull; import android.graphics.PointF; import android.graphics.PointF; import android.view.MotionEvent; import android.view.MotionEvent; import android.view.View; import android.view.View; Loading @@ -48,12 +49,18 @@ class DragDetector { private int mTouchSlop; private int mTouchSlop; private boolean mIsDragEvent; private boolean mIsDragEvent; private int mDragPointerId = -1; private int mDragPointerId = -1; private final long mHoldToDragMinDurationMs; private boolean mDidStrayBeforeFullHold; private boolean mDidHoldForMinDuration; private boolean mResultOfDownAction; private boolean mResultOfDownAction; DragDetector(MotionEventHandler eventHandler) { DragDetector(@NonNull MotionEventHandler eventHandler, long holdToDragMinDurationMs, int touchSlop) { resetState(); resetState(); mEventHandler = eventHandler; mEventHandler = eventHandler; mHoldToDragMinDurationMs = holdToDragMinDurationMs; mTouchSlop = touchSlop; } } /** /** Loading Loading @@ -101,9 +108,26 @@ class DragDetector { if (!mIsDragEvent) { if (!mIsDragEvent) { float dx = ev.getRawX(dragPointerIndex) - mInputDownPoint.x; float dx = ev.getRawX(dragPointerIndex) - mInputDownPoint.x; float dy = ev.getRawY(dragPointerIndex) - mInputDownPoint.y; float dy = ev.getRawY(dragPointerIndex) - mInputDownPoint.y; final float dt = ev.getEventTime() - ev.getDownTime(); final boolean pastTouchSlop = Math.hypot(dx, dy) > mTouchSlop; final boolean withinHoldRegion = !pastTouchSlop; if (mHoldToDragMinDurationMs <= 0) { mDidHoldForMinDuration = true; } else { if (!withinHoldRegion && dt < mHoldToDragMinDurationMs) { // Mark as having strayed so that in case the (x,y) ends up in the // original position we know it's not actually valid. mDidStrayBeforeFullHold = true; } if (!mDidStrayBeforeFullHold && dt >= mHoldToDragMinDurationMs) { mDidHoldForMinDuration = true; } } // Touches generate noisy moves, so only once the move is past the touch // Touches generate noisy moves, so only once the move is past the touch // slop threshold should it be considered a drag. // slop threshold should it be considered a drag. mIsDragEvent = Math.hypot(dx, dy) > mTouchSlop; mIsDragEvent = mDidHoldForMinDuration && pastTouchSlop; } } // The event handler should only be notified about 'move' events if a drag has been // The event handler should only be notified about 'move' events if a drag has been // detected. // detected. Loading Loading @@ -162,6 +186,8 @@ class DragDetector { mInputDownPoint.set(0, 0); mInputDownPoint.set(0, 0); mDragPointerId = -1; mDragPointerId = -1; mResultOfDownAction = false; mResultOfDownAction = false; mDidStrayBeforeFullHold = false; mDidHoldForMinDuration = false; } } interface MotionEventHandler { interface MotionEventHandler { Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecorViewModel.java +3 −2 Original line number Original line Diff line number Diff line Loading @@ -44,6 +44,7 @@ import android.view.IWindowManager; import android.view.MotionEvent; import android.view.MotionEvent; import android.view.SurfaceControl; import android.view.SurfaceControl; import android.view.View; import android.view.View; import android.view.ViewConfiguration; import android.window.DisplayAreaInfo; import android.window.DisplayAreaInfo; import android.window.WindowContainerToken; import android.window.WindowContainerToken; import android.window.WindowContainerTransaction; import android.window.WindowContainerTransaction; Loading Loading @@ -310,7 +311,6 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel { new CaptionTouchEventListener(taskInfo, taskPositioner); new CaptionTouchEventListener(taskInfo, taskPositioner); windowDecoration.setCaptionListeners(touchEventListener, touchEventListener); windowDecoration.setCaptionListeners(touchEventListener, touchEventListener); windowDecoration.setDragPositioningCallback(taskPositioner); windowDecoration.setDragPositioningCallback(taskPositioner); windowDecoration.setDragDetector(touchEventListener.mDragDetector); windowDecoration.setTaskDragResizer(taskPositioner); windowDecoration.setTaskDragResizer(taskPositioner); windowDecoration.relayout(taskInfo, startT, finishT, windowDecoration.relayout(taskInfo, startT, finishT, false /* applyStartTransactionOnDraw */, false /* setTaskCropAndPosition */); false /* applyStartTransactionOnDraw */, false /* setTaskCropAndPosition */); Loading @@ -334,7 +334,8 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel { mTaskId = taskInfo.taskId; mTaskId = taskInfo.taskId; mTaskToken = taskInfo.token; mTaskToken = taskInfo.token; mDragPositioningCallback = dragPositioningCallback; mDragPositioningCallback = dragPositioningCallback; mDragDetector = new DragDetector(this); mDragDetector = new DragDetector(this, 0 /* holdToDragMinDurationMs */, ViewConfiguration.get(mContext).getScaledTouchSlop()); mDisplayId = taskInfo.displayId; mDisplayId = taskInfo.displayId; } } Loading
libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecoration.java +0 −8 Original line number Original line Diff line number Diff line Loading @@ -74,7 +74,6 @@ public class CaptionWindowDecoration extends WindowDecoration<WindowDecorLinearL private View.OnTouchListener mOnCaptionTouchListener; private View.OnTouchListener mOnCaptionTouchListener; private DragPositioningCallback mDragPositioningCallback; private DragPositioningCallback mDragPositioningCallback; private DragResizeInputListener mDragResizeListener; private DragResizeInputListener mDragResizeListener; private DragDetector mDragDetector; private RelayoutParams mRelayoutParams = new RelayoutParams(); private RelayoutParams mRelayoutParams = new RelayoutParams(); private final RelayoutResult<WindowDecorLinearLayout> mResult = private final RelayoutResult<WindowDecorLinearLayout> mResult = Loading Loading @@ -176,12 +175,6 @@ public class CaptionWindowDecoration extends WindowDecoration<WindowDecorLinearL return stableBounds.bottom - requiredEmptySpace; return stableBounds.bottom - requiredEmptySpace; } } void setDragDetector(DragDetector dragDetector) { mDragDetector = dragDetector; mDragDetector.setTouchSlop(ViewConfiguration.get(mContext).getScaledTouchSlop()); } @Override @Override void relayout(RunningTaskInfo taskInfo) { void relayout(RunningTaskInfo taskInfo) { final SurfaceControl.Transaction t = new SurfaceControl.Transaction(); final SurfaceControl.Transaction t = new SurfaceControl.Transaction(); Loading Loading @@ -288,7 +281,6 @@ public class CaptionWindowDecoration extends WindowDecoration<WindowDecorLinearL final int touchSlop = ViewConfiguration.get(mResult.mRootView.getContext()) final int touchSlop = ViewConfiguration.get(mResult.mRootView.getContext()) .getScaledTouchSlop(); .getScaledTouchSlop(); mDragDetector.setTouchSlop(touchSlop); final Resources res = mResult.mRootView.getResources(); final Resources res = mResult.mRootView.getResources(); mDragResizeListener.setGeometry(new DragResizeWindowGeometry(0 /* taskCornerRadius */, mDragResizeListener.setGeometry(new DragResizeWindowGeometry(0 /* taskCornerRadius */, Loading
libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java +24 −5 Original line number Original line Diff line number Diff line Loading @@ -79,6 +79,7 @@ import android.view.MotionEvent; import android.view.SurfaceControl; import android.view.SurfaceControl; import android.view.SurfaceControl.Transaction; import android.view.SurfaceControl.Transaction; import android.view.View; import android.view.View; import android.view.ViewConfiguration; import android.widget.Toast; import android.widget.Toast; import android.window.TaskSnapshot; import android.window.TaskSnapshot; import android.window.WindowContainerToken; import android.window.WindowContainerToken; Loading Loading @@ -663,11 +664,14 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { private class DesktopModeTouchEventListener extends GestureDetector.SimpleOnGestureListener private class DesktopModeTouchEventListener extends GestureDetector.SimpleOnGestureListener implements View.OnClickListener, View.OnTouchListener, View.OnLongClickListener, implements View.OnClickListener, View.OnTouchListener, View.OnLongClickListener, View.OnGenericMotionListener, DragDetector.MotionEventHandler { View.OnGenericMotionListener, DragDetector.MotionEventHandler { private static final long APP_HANDLE_HOLD_TO_DRAG_DURATION_MS = 100; private static final long APP_HEADER_HOLD_TO_DRAG_DURATION_MS = 0; private final int mTaskId; private final int mTaskId; private final WindowContainerToken mTaskToken; private final WindowContainerToken mTaskToken; private final DragPositioningCallback mDragPositioningCallback; private final DragPositioningCallback mDragPositioningCallback; private final DragDetector mDragDetector; private final DragDetector mHandleDragDetector; private final DragDetector mHeaderDragDetector; private final GestureDetector mGestureDetector; private final GestureDetector mGestureDetector; private final int mDisplayId; private final int mDisplayId; private final Rect mOnDragStartInitialBounds = new Rect(); private final Rect mOnDragStartInitialBounds = new Rect(); Loading @@ -689,7 +693,13 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { mTaskId = taskInfo.taskId; mTaskId = taskInfo.taskId; mTaskToken = taskInfo.token; mTaskToken = taskInfo.token; mDragPositioningCallback = dragPositioningCallback; mDragPositioningCallback = dragPositioningCallback; mDragDetector = new DragDetector(this); final int touchSlop = ViewConfiguration.get(mContext).getScaledTouchSlop(); final long appHandleHoldToDragDuration = Flags.enableHoldToDragAppHandle() ? APP_HANDLE_HOLD_TO_DRAG_DURATION_MS : 0; mHandleDragDetector = new DragDetector(this, appHandleHoldToDragDuration, touchSlop); mHeaderDragDetector = new DragDetector(this, APP_HEADER_HOLD_TO_DRAG_DURATION_MS, touchSlop); mGestureDetector = new GestureDetector(mContext, this); mGestureDetector = new GestureDetector(mContext, this); mDisplayId = taskInfo.displayId; mDisplayId = taskInfo.displayId; } } Loading Loading @@ -748,7 +758,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { && id != R.id.maximize_window && id != R.id.minimize_window) { && id != R.id.maximize_window && id != R.id.minimize_window) { return false; return false; } } final boolean isAppHandle = !getTaskInfo().isFreeform(); final int actionMasked = e.getActionMasked(); final int actionMasked = e.getActionMasked(); final boolean isDown = actionMasked == MotionEvent.ACTION_DOWN; final boolean isDown = actionMasked == MotionEvent.ACTION_DOWN; final boolean isUpOrCancel = actionMasked == MotionEvent.ACTION_CANCEL final boolean isUpOrCancel = actionMasked == MotionEvent.ACTION_CANCEL Loading Loading @@ -797,7 +807,11 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { // Gesture is finished, reset state. // Gesture is finished, reset state. mShouldPilferCaptionEvents = false; mShouldPilferCaptionEvents = false; } } return mDragDetector.onMotionEvent(v, e); if (isAppHandle) { return mHandleDragDetector.onMotionEvent(v, e); } else { return mHeaderDragDetector.onMotionEvent(v, e); } } } @Override @Override Loading Loading @@ -865,6 +879,12 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { } } } } @NonNull private RunningTaskInfo getTaskInfo() { final DesktopModeWindowDecoration decoration = mWindowDecorByTaskId.get(mTaskId); return decoration.mTaskInfo; } private boolean handleNonFreeformMotionEvent(DesktopModeWindowDecoration decoration, private boolean handleNonFreeformMotionEvent(DesktopModeWindowDecoration decoration, View v, MotionEvent e) { View v, MotionEvent e) { final int id = v.getId(); final int id = v.getId(); Loading Loading @@ -1447,7 +1467,6 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { touchEventListener, touchEventListener, touchEventListener, touchEventListener); touchEventListener, touchEventListener, touchEventListener, touchEventListener); windowDecoration.setExclusionRegionListener(mExclusionRegionListener); windowDecoration.setExclusionRegionListener(mExclusionRegionListener); windowDecoration.setDragPositioningCallback(taskPositioner); windowDecoration.setDragPositioningCallback(taskPositioner); windowDecoration.setDragDetector(touchEventListener.mDragDetector); windowDecoration.relayout(taskInfo, startT, finishT, windowDecoration.relayout(taskInfo, startT, finishT, false /* applyStartTransactionOnDraw */, false /* shouldSetTaskPositionAndCrop */); false /* applyStartTransactionOnDraw */, false /* shouldSetTaskPositionAndCrop */); if (!Flags.enableHandleInputFix()) { if (!Flags.enableHandleInputFix()) { Loading
libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java +0 −7 Original line number Original line Diff line number Diff line Loading @@ -144,7 +144,6 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin private Function0<Unit> mOnManageWindowsClickListener; private Function0<Unit> mOnManageWindowsClickListener; private DragPositioningCallback mDragPositioningCallback; private DragPositioningCallback mDragPositioningCallback; private DragResizeInputListener mDragResizeListener; private DragResizeInputListener mDragResizeListener; private DragDetector mDragDetector; private RelayoutParams mRelayoutParams = new RelayoutParams(); private RelayoutParams mRelayoutParams = new RelayoutParams(); private final WindowDecoration.RelayoutResult<WindowDecorLinearLayout> mResult = private final WindowDecoration.RelayoutResult<WindowDecorLinearLayout> mResult = new WindowDecoration.RelayoutResult<>(); new WindowDecoration.RelayoutResult<>(); Loading Loading @@ -335,11 +334,6 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin mDragPositioningCallback = dragPositioningCallback; mDragPositioningCallback = dragPositioningCallback; } } void setDragDetector(DragDetector dragDetector) { mDragDetector = dragDetector; mDragDetector.setTouchSlop(ViewConfiguration.get(mContext).getScaledTouchSlop()); } void setOpenInBrowserClickListener(Consumer<Uri> listener) { void setOpenInBrowserClickListener(Consumer<Uri> listener) { mOpenInBrowserClickListener = listener; mOpenInBrowserClickListener = listener; } } Loading Loading @@ -504,7 +498,6 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin final int touchSlop = ViewConfiguration.get(mResult.mRootView.getContext()) final int touchSlop = ViewConfiguration.get(mResult.mRootView.getContext()) .getScaledTouchSlop(); .getScaledTouchSlop(); mDragDetector.setTouchSlop(touchSlop); // If either task geometry or position have changed, update this task's // If either task geometry or position have changed, update this task's // exclusion region listener // exclusion region listener Loading
libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragDetector.java +28 −2 Original line number Original line Diff line number Diff line Loading @@ -26,6 +26,7 @@ import static android.view.MotionEvent.ACTION_MOVE; import static android.view.MotionEvent.ACTION_POINTER_UP; import static android.view.MotionEvent.ACTION_POINTER_UP; import static android.view.MotionEvent.ACTION_UP; import static android.view.MotionEvent.ACTION_UP; import android.annotation.NonNull; import android.graphics.PointF; import android.graphics.PointF; import android.view.MotionEvent; import android.view.MotionEvent; import android.view.View; import android.view.View; Loading @@ -48,12 +49,18 @@ class DragDetector { private int mTouchSlop; private int mTouchSlop; private boolean mIsDragEvent; private boolean mIsDragEvent; private int mDragPointerId = -1; private int mDragPointerId = -1; private final long mHoldToDragMinDurationMs; private boolean mDidStrayBeforeFullHold; private boolean mDidHoldForMinDuration; private boolean mResultOfDownAction; private boolean mResultOfDownAction; DragDetector(MotionEventHandler eventHandler) { DragDetector(@NonNull MotionEventHandler eventHandler, long holdToDragMinDurationMs, int touchSlop) { resetState(); resetState(); mEventHandler = eventHandler; mEventHandler = eventHandler; mHoldToDragMinDurationMs = holdToDragMinDurationMs; mTouchSlop = touchSlop; } } /** /** Loading Loading @@ -101,9 +108,26 @@ class DragDetector { if (!mIsDragEvent) { if (!mIsDragEvent) { float dx = ev.getRawX(dragPointerIndex) - mInputDownPoint.x; float dx = ev.getRawX(dragPointerIndex) - mInputDownPoint.x; float dy = ev.getRawY(dragPointerIndex) - mInputDownPoint.y; float dy = ev.getRawY(dragPointerIndex) - mInputDownPoint.y; final float dt = ev.getEventTime() - ev.getDownTime(); final boolean pastTouchSlop = Math.hypot(dx, dy) > mTouchSlop; final boolean withinHoldRegion = !pastTouchSlop; if (mHoldToDragMinDurationMs <= 0) { mDidHoldForMinDuration = true; } else { if (!withinHoldRegion && dt < mHoldToDragMinDurationMs) { // Mark as having strayed so that in case the (x,y) ends up in the // original position we know it's not actually valid. mDidStrayBeforeFullHold = true; } if (!mDidStrayBeforeFullHold && dt >= mHoldToDragMinDurationMs) { mDidHoldForMinDuration = true; } } // Touches generate noisy moves, so only once the move is past the touch // Touches generate noisy moves, so only once the move is past the touch // slop threshold should it be considered a drag. // slop threshold should it be considered a drag. mIsDragEvent = Math.hypot(dx, dy) > mTouchSlop; mIsDragEvent = mDidHoldForMinDuration && pastTouchSlop; } } // The event handler should only be notified about 'move' events if a drag has been // The event handler should only be notified about 'move' events if a drag has been // detected. // detected. Loading Loading @@ -162,6 +186,8 @@ class DragDetector { mInputDownPoint.set(0, 0); mInputDownPoint.set(0, 0); mDragPointerId = -1; mDragPointerId = -1; mResultOfDownAction = false; mResultOfDownAction = false; mDidStrayBeforeFullHold = false; mDidHoldForMinDuration = false; } } interface MotionEventHandler { interface MotionEventHandler { Loading