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

Commit cf2d44ab authored by Daniel Norman's avatar Daniel Norman
Browse files

feat(trusted_service): New API to self-enable a trusted a11y service

Bug: 418057329
Test: atest AccessibilityManagerServiceTest
Test: atest TrustedAccessibilityServiceTest
Flag: android.view.accessibility.enable_trusted_accessibility_service_api
Change-Id: I7861c385e4489bbe343e367f1ce4a0e78c55e0aa
parent 8824343e
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -56407,6 +56407,7 @@ package android.view.accessibility {
    method @FlaggedApi("com.android.graphics.hwui.flags.high_contrast_text_small_text_rect") public void addHighContrastTextStateChangeListener(@NonNull java.util.concurrent.Executor, @NonNull android.view.accessibility.AccessibilityManager.HighContrastTextStateChangeListener);
    method public boolean addTouchExplorationStateChangeListener(@NonNull android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener);
    method public void addTouchExplorationStateChangeListener(@NonNull android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener, @Nullable android.os.Handler);
    method @FlaggedApi("android.view.accessibility.enable_trusted_accessibility_service_api") public boolean enableTrustedAccessibilityService(@NonNull android.content.ComponentName);
    method @ColorInt public int getAccessibilityFocusColor();
    method public int getAccessibilityFocusStrokeWidth();
    method @Deprecated public java.util.List<android.content.pm.ServiceInfo> getAccessibilityServiceList();
+1 −0
Original line number Diff line number Diff line
@@ -3985,6 +3985,7 @@ package android.view.accessibility {
  public final class AccessibilityManager {
    method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_ACCESSIBILITY) public java.util.List<java.lang.String> getAccessibilityShortcutTargets(int);
    method public boolean hasAnyDirectConnection();
    method @FlaggedApi("android.view.accessibility.enable_trusted_accessibility_service_api") @RequiresPermission(android.Manifest.permission.MANAGE_ACCESSIBILITY) public void setTrustedAccessibilityServiceForTesting(@Nullable android.content.ComponentName);
    method @FlaggedApi("android.view.accessibility.flash_notification_system_api") public boolean startFlashNotificationSequence(@NonNull android.content.Context, int);
    method @FlaggedApi("android.view.accessibility.flash_notification_system_api") public boolean stopFlashNotificationSequence(@NonNull android.content.Context);
  }
+63 −0
Original line number Diff line number Diff line
@@ -85,6 +85,7 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.Executor;

@@ -645,6 +646,68 @@ public final class AccessibilityManager {
        }
    }

    /**
     * Enables a trusted {@link AccessibilityService} identified by the provided component name.
     *
     * <p>In order to succeed, the provided service must:
     * <ul>
     *     <li>Belong to the same package name as the caller.</li>
     *     <li>Belong to a preinstalled package on the device.</li>
     *     <li>Belong to an allowlist defined by the device.</li>
     * </ul>
     *
     * @param trustedAccessibilityService the component name of the {@link AccessibilityService}
     * @return {@code true} if the system attempted to start the service, otherwise {@code false}
     */
    @FlaggedApi(Flags.FLAG_ENABLE_TRUSTED_ACCESSIBILITY_SERVICE_API)
    public boolean enableTrustedAccessibilityService(
            @NonNull ComponentName trustedAccessibilityService) {
        Objects.requireNonNull(trustedAccessibilityService);
        final IAccessibilityManager service;
        final int userId;
        synchronized (mLock) {
            service = getServiceLocked();
            if (service == null) {
                return false;
            }
            userId = mUserId;
        }
        try {
            return service.enableTrustedAccessibilityService(trustedAccessibilityService, userId);
        } catch (RemoteException re) {
            throw re.rethrowFromSystemServer();
        }
    }

    /**
     * Set the given component name as a trusted accessibility service so that it bypasses
     * the regular trust checks in the system.
     *
     * <p>This is only used for testing and must be permission-protected against non-system callers.
     * @param trustedAccessibilityService The component name to set as trusted, or
     *        {@code null} to clear.
     * @hide
     */
    @TestApi
    @FlaggedApi(Flags.FLAG_ENABLE_TRUSTED_ACCESSIBILITY_SERVICE_API)
    @RequiresPermission(Manifest.permission.MANAGE_ACCESSIBILITY)
    @VisibleForTesting
    public void setTrustedAccessibilityServiceForTesting(
            @Nullable ComponentName trustedAccessibilityService) {
        final IAccessibilityManager service;
        synchronized (mLock) {
            service = getServiceLocked();
            if (service == null) {
                return;
            }
        }
        try {
            service.setTrustedAccessibilityServiceForTesting(trustedAccessibilityService);
        } catch (RemoteException re) {
            throw re.rethrowFromSystemServer();
        }
    }

    /**
     * @see AccessibilityInteractionClient#hasAnyDirectConnection
     * @hide
+6 −0
Original line number Diff line number Diff line
@@ -201,4 +201,10 @@ interface IAccessibilityManager {

    @RequiresNoPermission
    void unregisterUserInitializationCompleteCallback(IUserInitializationCompleteCallback callback);

    @RequiresNoPermission
    boolean enableTrustedAccessibilityService(in ComponentName trustedAccessibilityService, int userId);

    @EnforcePermission("MANAGE_ACCESSIBILITY")
    void setTrustedAccessibilityServiceForTesting(in ComponentName trustedAccessibilityService);
}
+8 −0
Original line number Diff line number Diff line
@@ -124,6 +124,14 @@ flag {
    bug: "283323770"
}

flag {
    name: "enable_trusted_accessibility_service_api"
    namespace: "accessibility"
    description: "API that allows an app to enable its own accessibility service if that service is trusted."
    bug: "418057329"
    is_exported: true
}

flag {
    name: "enable_type_window_control"
    namespace: "accessibility"
Loading