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

Commit d88c4994 authored by Ameer Armaly's avatar Ameer Armaly
Browse files

Add api for app accessibility overlays.

Bug: 238840614
Test: atest AccessibilityOverlayTest
Change-Id: Ie73188fa9d5b604350d1f7accb14d2e498585a50
parent 1b5dd0da
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -3091,6 +3091,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();
        }
    }
}
+9 −0
Original line number Diff line number Diff line
@@ -10810,6 +10810,15 @@ public final class ViewRootImpl implements ViewParent,
                }
            }
        }

        public void attachAccessibilityOverlayToWindow(SurfaceControl sc) {
            ViewRootImpl viewRootImpl = mViewRootImpl.get();
            if (viewRootImpl != null) {
                viewRootImpl
                        .getAccessibilityInteractionController()
                        .attachAccessibilityOverlayToWindowClientThread(sc);
            }
        }
    }

    /**
Loading