Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a28da95c authored by arthurhung's avatar arthurhung
Browse files

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
parent edea65c7
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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);
        }
+15 −7
Original line number Diff line number Diff line
@@ -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;
        }
+2 −0
Original line number Diff line number Diff line
@@ -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;