Fix TouchExcludeRegion should ignore the invisible windows
The TouchExcludeRegion could tell the freeform Task if the pointer
event could be excluded or process to resize/move Task. We should
only care about the visible excluded windows or some fullscreen
window like NotificationShade could break the region.
- Ignore the invisible excluded windows.
- Restore pointer icon if in excluded region.
- Add TYPE_VOLUME_OVERLAY to the excluded list.
Bug: 152248369
Test: In default display, enable freeform, enter freeform via recent
apps, resize window.
Change-Id: I298ddcd984b172161e37fad4d288cee15a0e728c
This commit is contained in:
@@ -2539,6 +2539,9 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
|
||||
}
|
||||
for (int i = mTapExcludedWindows.size() - 1; i >= 0; i--) {
|
||||
final WindowState win = mTapExcludedWindows.get(i);
|
||||
if (!win.isVisibleLw()) {
|
||||
continue;
|
||||
}
|
||||
win.getTouchableRegion(mTmpRegion);
|
||||
mTouchExcludeRegion.op(mTmpRegion, Region.Op.UNION);
|
||||
}
|
||||
|
||||
@@ -48,6 +48,16 @@ public class TaskTapPointerEventListener implements PointerEventListener {
|
||||
mDisplayContent = displayContent;
|
||||
}
|
||||
|
||||
private void restorePointerIcon(int x, int y) {
|
||||
if (mPointerIconType != TYPE_NOT_SPECIFIED) {
|
||||
mPointerIconType = TYPE_NOT_SPECIFIED;
|
||||
// Find the underlying window and ask it to restore the pointer icon.
|
||||
mService.mH.removeMessages(H.RESTORE_POINTER_ICON);
|
||||
mService.mH.obtainMessage(H.RESTORE_POINTER_ICON,
|
||||
x, y, mDisplayContent).sendToTarget();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPointerEvent(MotionEvent motionEvent) {
|
||||
switch (motionEvent.getActionMasked()) {
|
||||
@@ -67,6 +77,10 @@ public class TaskTapPointerEventListener implements PointerEventListener {
|
||||
case MotionEvent.ACTION_HOVER_MOVE: {
|
||||
final int x = (int) motionEvent.getX();
|
||||
final int y = (int) motionEvent.getY();
|
||||
if (mTouchExcludeRegion.contains(x, y)) {
|
||||
restorePointerIcon(x, y);
|
||||
break;
|
||||
}
|
||||
final Task task = mDisplayContent.findTaskForResizePoint(x, y);
|
||||
int iconType = TYPE_NOT_SPECIFIED;
|
||||
if (task != null) {
|
||||
@@ -103,13 +117,7 @@ public class TaskTapPointerEventListener implements PointerEventListener {
|
||||
case MotionEvent.ACTION_HOVER_EXIT: {
|
||||
final int x = (int) motionEvent.getX();
|
||||
final int y = (int) motionEvent.getY();
|
||||
if (mPointerIconType != TYPE_NOT_SPECIFIED) {
|
||||
mPointerIconType = TYPE_NOT_SPECIFIED;
|
||||
// Find the underlying window and ask it to restore the pointer icon.
|
||||
mService.mH.removeMessages(H.RESTORE_POINTER_ICON);
|
||||
mService.mH.obtainMessage(H.RESTORE_POINTER_ICON,
|
||||
x, y, mDisplayContent).sendToTarget();
|
||||
}
|
||||
restorePointerIcon(x, y);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -72,6 +72,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_QS_DIALOG;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_TOAST;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_VOICE_INTERACTION;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
|
||||
import static android.view.WindowManager.REMOVE_CONTENT_MODE_UNDEFINED;
|
||||
import static android.view.WindowManagerGlobal.ADD_OKAY;
|
||||
@@ -1367,6 +1368,7 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
case TYPE_NOTIFICATION_SHADE:
|
||||
case TYPE_NAVIGATION_BAR:
|
||||
case TYPE_INPUT_METHOD_DIALOG:
|
||||
case TYPE_VOLUME_OVERLAY:
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
||||
Reference in New Issue
Block a user