Search code examples
androidandroid-layoutandroid-servicetouch-event

Cannot intercept touch on overlay service


I am trying to block touch on a device using service and a transparent overlay.
The code seems to work fine on Android Oreo but doesn't work properly on devices running Android version below Oreo:

private void setWindowParams(){
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
        params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.MATCH_PARENT,
                WindowManager.LayoutParams.MATCH_PARENT,
                WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                        | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                        | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
                PixelFormat.TRANSLUCENT);
    } else {
        params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.MATCH_PARENT,
                WindowManager.LayoutParams.MATCH_PARENT,
                WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                        | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                        | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
                PixelFormat.TRANSLUCENT);
    }
    wm = (WindowManager) getSystemService(WINDOW_SERVICE);
    FrameLayout noTouchUi = new FrameLayout(this);
    wm.addView(noTouchUi,params);

}

Here I setup a FrameLayout noTouchUi to intercept touch as an overlay using service using onTouchListener

        noTouchUi.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            Log.d(TAG,"touch event");
            return true;
        }
    });

This works properly on Android 8, but doesn't work on Android 7, the overlay shows up properly, but the items behind overlay gets clicked. What I want to do is block that click.


Solution

  • Change the type from:

    WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY
    

    to:

    WindowManager.LayoutParams.TYPE_PHONE
    

    and remove flags:

    WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
    

    and:

    WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH