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

Commit c42e38af authored by Prabir Pradhan's avatar Prabir Pradhan
Browse files

PointerEventDispatcher: Convert to spy window with flag DO_NOT_PILFER

Bug: 216789894
Test: Presubmit
Flag: EXEMPT refactor
Change-Id: I7b20f5fc7ccb1073bce74d4850d2fd610ea53fe8
parent dadc0fb0
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -69,6 +69,7 @@ public final class InputWindowHandle {
            InputConfig.CLONE,
            InputConfig.SENSITIVE_FOR_PRIVACY,
            InputConfig.DISPLAY_TOPOLOGY_AWARE,
            InputConfig.DO_NOT_PILFER,
    })
    public @interface InputConfigFlags {}

+3 −0
Original line number Diff line number Diff line
@@ -443,6 +443,9 @@ public class InputManagerService extends IInputManager.Stub
    // system gestures (e.g. navigation bar, edge-back, etc) while there is an active
    // handwriting session.
    public static final int INPUT_OVERLAY_LAYER_HANDWRITING_SURFACE = 2;
    // The layer where the pointer event dispatcher is added by WindowManager to get an
    // uninterrupted stream of all pointer events on each display.
    public static final int INPUT_OVERLAY_POINTER_EVENT_DISPATCHER = Integer.MAX_VALUE;


    private final String mVelocityTrackerStrategy;
+42 −0
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
import static android.content.res.Configuration.ORIENTATION_UNDEFINED;
import static android.os.Build.VERSION_CODES.N;
import static android.os.InputConstants.DEFAULT_DISPATCHING_TIMEOUT_MILLIS;
import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
import static android.util.DisplayMetrics.DENSITY_DEFAULT;
import static android.util.RotationUtils.deltaRotation;
@@ -184,6 +185,7 @@ import android.os.Debug;
import android.os.Handler;
import android.os.HandlerExecutor;
import android.os.IBinder;
import android.os.InputConfig;
import android.os.Message;
import android.os.PowerManager;
import android.os.RemoteCallbackList;
@@ -216,8 +218,10 @@ import android.view.IDecorViewGestureListener;
import android.view.IDisplayWindowInsetsController;
import android.view.ISystemGestureExclusionListener;
import android.view.IWindow;
import android.view.InputApplicationHandle;
import android.view.InputChannel;
import android.view.InputDevice;
import android.view.InputWindowHandle;
import android.view.InsetsSource;
import android.view.InsetsState;
import android.view.MagnificationSpec;
@@ -250,6 +254,7 @@ import com.android.internal.protolog.ProtoLog;
import com.android.internal.util.ToBooleanFunction;
import com.android.internal.util.function.pooled.PooledLambda;
import com.android.internal.util.function.pooled.PooledPredicate;
import com.android.server.input.InputManagerService;
import com.android.server.inputmethod.InputMethodManagerInternal;
import com.android.server.policy.WindowManagerPolicy;
import com.android.server.wm.utils.RegionUtils;
@@ -333,6 +338,12 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
     */
    private SurfaceControl mInputOverlayLayer;

    /**
     * A special input overlay layer that is always created for each display that receives all
     * pointer input on the display.
     */
    private SurfaceControl mPointerEventDispatcherOverlayLayer;

    /** A surfaceControl specifically for accessibility overlays. */
    private SurfaceControl mA11yOverlayLayer;

@@ -1333,6 +1344,13 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
            transaction.reparent(mInputOverlayLayer, mSurfaceControl);
        }

        if (mPointerEventDispatcherOverlayLayer == null) {
            final var name = "PointerEventDispatcherOverlay" + mDisplayId;
            mPointerEventDispatcherOverlayLayer =
                    b.setName(name).setParent(mInputOverlayLayer).build();
            configurePointerEventDispatcherOverlayLayer(transaction, name);
        }

        if (mA11yOverlayLayer == null) {
            mA11yOverlayLayer =
                    b.setName("Accessibility Overlays").setParent(mSurfaceControl).build();
@@ -1347,10 +1365,34 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
                .show(mOverlayLayer)
                .setLayer(mInputOverlayLayer, Integer.MAX_VALUE - 1)
                .show(mInputOverlayLayer)
                .show(mPointerEventDispatcherOverlayLayer)
                .setLayer(mA11yOverlayLayer, Integer.MAX_VALUE - 2)
                .show(mA11yOverlayLayer);
    }

    private void configurePointerEventDispatcherOverlayLayer(SurfaceControl.Transaction transaction,
            String name) {
        final var handle = new InputWindowHandle(
                new InputApplicationHandle(null, name, DEFAULT_DISPATCHING_TIMEOUT_MILLIS),
                mDisplayId);
        handle.name = name;
        handle.token = mPointerEventDispatcher.getToken();
        handle.layoutParamsType = WindowManager.LayoutParams.TYPE_SECURE_SYSTEM_OVERLAY;
        handle.dispatchingTimeoutMillis = DEFAULT_DISPATCHING_TIMEOUT_MILLIS;
        handle.ownerPid = WindowManagerService.MY_PID;
        handle.ownerUid = WindowManagerService.MY_UID;
        handle.scaleFactor = 1.0f;
        handle.replaceTouchableRegionWithCrop(null /* use this surface's bounds */);
        handle.inputConfig =
                InputConfig.NOT_FOCUSABLE | InputConfig.SPY | InputConfig.DO_NOT_PILFER;
        handle.setTrustedOverlay(transaction, mPointerEventDispatcherOverlayLayer, true);
        transaction
                .setInputWindowInfo(mPointerEventDispatcherOverlayLayer, handle)
                .setLayer(mPointerEventDispatcherOverlayLayer,
                        InputManagerService.INPUT_OVERLAY_POINTER_EVENT_DISPATCHER)
                .setCrop(mPointerEventDispatcherOverlayLayer, null /* crop to parent surface */);
    }

    DisplayRotationReversionController getRotationReversionController() {
        return mRotationReversionController;
    }