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

Commit e94518df authored by Ameer Armaly's avatar Ameer Armaly Committed by Android (Google) Code Review
Browse files

Merge changes from topic "window overlays"

* changes:
  Add api for app accessibility overlays.
  Allow accessibility services to request input channels for windows of TYPE_ACCESSIBILITY_OVERLAY.
parents 8c063d40 d88c4994
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -3094,6 +3094,7 @@ package android.accessibilityservice {
  public abstract class AccessibilityService extends android.app.Service {
    ctor public AccessibilityService();
    method public void attachAccessibilityOverlayToDisplay(int, @NonNull android.view.SurfaceControl);
    method public void attachAccessibilityOverlayToWindow(int, @NonNull android.view.SurfaceControl);
    method public boolean clearCache();
    method public boolean clearCachedSubtree(@NonNull android.view.accessibility.AccessibilityNodeInfo);
    method public final void disableSelf();
+16 −0
Original line number Diff line number Diff line
@@ -3439,4 +3439,20 @@ public abstract class AccessibilityService extends Service {
            throw new RuntimeException(re);
        }
    }

    /**
     * Attaches an accessibility overlay {@link android.view.SurfaceControl} to the specified
     * window. This method should be used when you want the overlay to move and resize as the parent
     * window moves and resizes. To remove this overlay and free the associated resources, use
     * <code> new SurfaceControl.Transaction().reparent(sc, null).apply();</code>.
     *
     * @param accessibilityWindowId The window id, from {@link AccessibilityWindowInfo#getId()}.
     * @param sc the SurfaceControl containing the overlay content
     */
    public void attachAccessibilityOverlayToWindow(
            int accessibilityWindowId, @NonNull SurfaceControl sc) {
        Preconditions.checkNotNull(sc, "SurfaceControl cannot be null");
        AccessibilityInteractionClient.getInstance(this)
                .attachAccessibilityOverlayToWindow(mConnectionId, accessibilityWindowId, sc);
    }
}
+4 −1
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import android.graphics.Region;
import android.os.Bundle;
import android.os.RemoteCallback;
import android.view.MagnificationSpec;
import android.view.SurfaceControl;
import android.view.MotionEvent;
import android.view.SurfaceControl;
import android.view.accessibility.AccessibilityNodeInfo;
@@ -157,4 +158,6 @@ interface IAccessibilityServiceConnection {

    List<AccessibilityServiceInfo> getInstalledAndEnabledServices();
    void attachAccessibilityOverlayToDisplay(int displayId, in SurfaceControl sc);

    void attachAccessibilityOverlayToWindow(int accessibilityWindowId, in SurfaceControl sc);
}
 No newline at end of file
+21 −0
Original line number Diff line number Diff line
@@ -21,6 +21,8 @@ import static android.view.accessibility.AccessibilityNodeInfo.ACTION_ARGUMENT_A
import static android.view.accessibility.AccessibilityNodeInfo.EXTRA_DATA_REQUESTED_KEY;
import static android.view.accessibility.AccessibilityNodeInfo.EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY;

import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;

import android.accessibilityservice.AccessibilityService;
import android.annotation.NonNull;
import android.graphics.Matrix;
@@ -1961,4 +1963,23 @@ public final class AccessibilityInteractionController {
            }
        }
    }

    /** Attaches an accessibility overlay to the specified window. */
    public void attachAccessibilityOverlayToWindowClientThread(SurfaceControl sc) {
        mHandler.sendMessage(
                obtainMessage(
                        AccessibilityInteractionController
                                ::attachAccessibilityOverlayToWindowUiThread,
                        this,
                        sc));
    }

    private void attachAccessibilityOverlayToWindowUiThread(SurfaceControl sc) {
        SurfaceControl parent = mViewRootImpl.getSurfaceControl();
        if (parent.isValid()) {
            SurfaceControl.Transaction t = new SurfaceControl.Transaction();
            t.reparent(sc, parent).apply();
            t.close();
        }
    }
}
+2 −1
Original line number Diff line number Diff line
@@ -299,7 +299,8 @@ interface IWindowSession {
    */
    void grantInputChannel(int displayId, in SurfaceControl surface, in IWindow window,
            in IBinder hostInputToken, int flags, int privateFlags, int type,
            in IBinder focusGrantToken, String inputHandleName, out InputChannel outInputChannel);
            in IBinder windowToken, in IBinder focusGrantToken, String inputHandleName,
            out InputChannel outInputChannel);

    /**
     * Update the flags on an input channel associated with a particular surface.
Loading