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:
arthurhung
2020-04-29 17:45:53 +08:00
parent edea65c7bd
commit a28da95c87
3 changed files with 20 additions and 7 deletions

View File

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

View File

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

View File

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