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

Commit 1e924c47 authored by Daniel Norman's avatar Daniel Norman Committed by Android (Google) Code Review
Browse files

Merge "Revert "Limit off-label accessibility access using a new property.""

parents 5c0ac2b3 ff3c059c
Loading
Loading
Loading
Loading
+0 −8
Original line number Diff line number Diff line
@@ -49957,7 +49957,6 @@ package android.view {
    method public void invalidate();
    method public void invalidateDrawable(@NonNull android.graphics.drawable.Drawable);
    method public void invalidateOutline();
    method public boolean isAccessibilityDataPrivate();
    method public boolean isAccessibilityFocused();
    method public boolean isAccessibilityHeading();
    method public boolean isActivated();
@@ -50135,7 +50134,6 @@ package android.view {
    method public void scrollTo(int, int);
    method public void sendAccessibilityEvent(int);
    method public void sendAccessibilityEventUnchecked(android.view.accessibility.AccessibilityEvent);
    method public void setAccessibilityDataPrivate(int);
    method public void setAccessibilityDelegate(@Nullable android.view.View.AccessibilityDelegate);
    method public void setAccessibilityHeading(boolean);
    method public void setAccessibilityLiveRegion(int);
@@ -50316,9 +50314,6 @@ package android.view {
    method @CallSuper protected boolean verifyDrawable(@NonNull android.graphics.drawable.Drawable);
    method @Deprecated public boolean willNotCacheDrawing();
    method public boolean willNotDraw();
    field public static final int ACCESSIBILITY_DATA_PRIVATE_AUTO = 0; // 0x0
    field public static final int ACCESSIBILITY_DATA_PRIVATE_NO = 2; // 0x2
    field public static final int ACCESSIBILITY_DATA_PRIVATE_YES = 1; // 0x1
    field public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2; // 0x2
    field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
    field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
@@ -51771,11 +51766,9 @@ package android.view.accessibility {
    method public int getSpeechStateChangeTypes();
    method public int getWindowChanges();
    method public void initFromParcel(android.os.Parcel);
    method public boolean isAccessibilityDataPrivate();
    method @Deprecated public static android.view.accessibility.AccessibilityEvent obtain(int);
    method @Deprecated public static android.view.accessibility.AccessibilityEvent obtain(android.view.accessibility.AccessibilityEvent);
    method @Deprecated public static android.view.accessibility.AccessibilityEvent obtain();
    method public void setAccessibilityDataPrivate(boolean);
    method public void setAction(int);
    method public void setContentChangeTypes(int);
    method public void setEventTime(long);
@@ -51866,7 +51859,6 @@ package android.view.accessibility {
    method public static boolean isAccessibilityButtonSupported();
    method public boolean isAudioDescriptionRequested();
    method public boolean isEnabled();
    method public boolean isRequestFromAccessibilityTool();
    method public boolean isTouchExplorationEnabled();
    method public void removeAccessibilityRequestPreparer(android.view.accessibility.AccessibilityRequestPreparer);
    method public boolean removeAccessibilityServicesStateChangeListener(@NonNull android.view.accessibility.AccessibilityManager.AccessibilityServicesStateChangeListener);
+0 −1
Original line number Diff line number Diff line
@@ -90,7 +90,6 @@ package android.accessibilityservice {

  public class AccessibilityServiceInfo implements android.os.Parcelable {
    method @NonNull public android.content.ComponentName getComponentName();
    method public void setAccessibilityTool(boolean);
  }

}
+0 −21
Original line number Diff line number Diff line
@@ -784,7 +784,6 @@ public class AccessibilityServiceInfo implements Parcelable {
        mNonInteractiveUiTimeout = other.mNonInteractiveUiTimeout;
        mInteractiveUiTimeout = other.mInteractiveUiTimeout;
        flags = other.flags;
        mIsAccessibilityTool = other.mIsAccessibilityTool;
    }

    private boolean isRequestAccessibilityButtonChangeEnabled(IPlatformCompat platformCompat) {
@@ -1112,26 +1111,6 @@ public class AccessibilityServiceInfo implements Parcelable {
                || mResolveInfo.serviceInfo.directBootAware;
    }

    /**
     * Sets whether the service is used to assist users with disabilities.
     *
     * <p>
     * This property is normally provided in the service's {@link #mResolveInfo ResolveInfo}.
     * </p>
     *
     * <p>
     * This method is helpful for unit testing. However, this property is not dynamically
     * configurable by a standard {@link AccessibilityService} so it's not possible to update the
     * copy held by the system with this method.
     * </p>
     *
     * @hide
     */
    @TestApi
    public void setAccessibilityTool(boolean isAccessibilityTool) {
        mIsAccessibilityTool = isAccessibilityTool;
    }

    /**
     * Indicates if the service is used to assist users with disabilities.
     *
+0 −1
Original line number Diff line number Diff line
@@ -550,7 +550,6 @@ public final class UiAutomationConnection extends IUiAutomationConnection.Stub {
        info.setCapabilities(AccessibilityServiceInfo.CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT
                | AccessibilityServiceInfo.CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION
                | AccessibilityServiceInfo.CAPABILITY_CAN_REQUEST_FILTER_KEY_EVENTS);
        info.setAccessibilityTool(true);
        try {
            // Calling out with a lock held is fine since if the system
            // process is gone the client calling in will be killed.
+25 −52
Original line number Diff line number Diff line
@@ -89,7 +89,9 @@ public final class AccessibilityInteractionController {

    // Callbacks should have the same configuration of the flags below to allow satisfying a pending
    // node request on prefetch
    private static final int FLAGS_AFFECTING_REPORTED_DATA = AccessibilityNodeInfo.FLAG_REPORT_MASK;
    private static final int FLAGS_AFFECTING_REPORTED_DATA =
            AccessibilityNodeInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS
            | AccessibilityNodeInfo.FLAG_REPORT_VIEW_IDS;

    private final ArrayList<AccessibilityNodeInfo> mTempAccessibilityNodeInfoList =
        new ArrayList<AccessibilityNodeInfo>();
@@ -165,11 +167,6 @@ public final class AccessibilityInteractionController {
        return (view != null) && (view.getWindowVisibility() == View.VISIBLE && view.isShown());
    }

    private boolean isVisibleToAccessibilityService(View view) {
        return view != null && (!view.isAccessibilityDataPrivate()
                || mA11yManager.isRequestFromAccessibilityTool());
    }

    public void findAccessibilityNodeInfoByAccessibilityIdClientThread(
            long accessibilityNodeId, Region interactiveRegion, int interactionId,
            IAccessibilityInteractionConnectionCallback callback, int flags, int interrogatingPid,
@@ -361,7 +358,7 @@ public final class AccessibilityInteractionController {
            if (mViewRootImpl.mView == null || mViewRootImpl.mAttachInfo == null) {
                return;
            }
            setAccessibilityFetchFlags(flags);
            mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = flags;
            requestedView = findViewByAccessibilityId(accessibilityViewId);
            if (requestedView != null && isShown(requestedView)) {
                requestedNode = populateAccessibilityNodeInfoForView(
@@ -374,7 +371,7 @@ public final class AccessibilityInteractionController {
                    mPrefetcher.prefetchAccessibilityNodeInfos(requestedView,
                            requestedNode == null ? null : new AccessibilityNodeInfo(requestedNode),
                            infos);
                    resetAccessibilityFetchFlags();
                    mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0;
                }
            }
        } finally {
@@ -399,7 +396,7 @@ public final class AccessibilityInteractionController {
        }
        mPrefetcher.prefetchAccessibilityNodeInfos(requestedView,
                requestedNode == null ? null : new AccessibilityNodeInfo(requestedNode), infos);
        resetAccessibilityFetchFlags();
        mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0;
        updateInfosForViewPort(infos, spec, matrixValues, interactiveRegion);
        final SatisfiedFindAccessibilityNodeByAccessibilityIdRequest satisfiedRequest =
                getSatisfiedRequestInPrefetch(requestedNode == null ? null : requestedNode, infos,
@@ -481,7 +478,7 @@ public final class AccessibilityInteractionController {
                    || viewId == null) {
                return;
            }
            setAccessibilityFetchFlags(flags);
            mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = flags;
            final View root = findViewByAccessibilityId(accessibilityViewId);
            if (root != null) {
                final int resolvedViewId = root.getContext().getResources()
@@ -497,7 +494,7 @@ public final class AccessibilityInteractionController {
                mAddNodeInfosForViewId.reset();
            }
        } finally {
            resetAccessibilityFetchFlags();
            mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0;
            updateInfosForViewportAndReturnFindNodeResult(
                    infos, callback, interactionId, spec, matrixValues, interactiveRegion);
        }
@@ -545,7 +542,7 @@ public final class AccessibilityInteractionController {
            if (mViewRootImpl.mView == null || mViewRootImpl.mAttachInfo == null) {
                return;
            }
            setAccessibilityFetchFlags(flags);
            mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = flags;
            final View root = findViewByAccessibilityId(accessibilityViewId);
            if (root != null && isShown(root)) {
                AccessibilityNodeProvider provider = root.getAccessibilityNodeProvider();
@@ -564,7 +561,7 @@ public final class AccessibilityInteractionController {
                        final int viewCount = foundViews.size();
                        for (int i = 0; i < viewCount; i++) {
                            View foundView = foundViews.get(i);
                            if (isShown(foundView) && isVisibleToAccessibilityService(foundView)) {
                            if (isShown(foundView)) {
                                provider = foundView.getAccessibilityNodeProvider();
                                if (provider != null) {
                                    List<AccessibilityNodeInfo> infosFromProvider =
@@ -582,7 +579,7 @@ public final class AccessibilityInteractionController {
                }
            }
        } finally {
            resetAccessibilityFetchFlags();
            mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0;
            updateInfosForViewportAndReturnFindNodeResult(
                    infos, callback, interactionId, spec, matrixValues, interactiveRegion);
        }
@@ -630,7 +627,7 @@ public final class AccessibilityInteractionController {
            if (mViewRootImpl.mView == null || mViewRootImpl.mAttachInfo == null) {
                return;
            }
            setAccessibilityFetchFlags(flags);
            mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = flags;
            final View root = findViewByAccessibilityId(accessibilityViewId);
            if (root != null && isShown(root)) {
                switch (focusType) {
@@ -645,9 +642,6 @@ public final class AccessibilityInteractionController {
                        if (!isShown(host)) {
                            break;
                        }
                        if (!isVisibleToAccessibilityService(host)) {
                            break;
                        }
                        // If the host has a provider ask this provider to search for the
                        // focus instead fetching all provider nodes to do the search here.
                        AccessibilityNodeProvider provider = host.getAccessibilityNodeProvider();
@@ -668,9 +662,6 @@ public final class AccessibilityInteractionController {
                        if (!isShown(target)) {
                            break;
                        }
                        if (!isVisibleToAccessibilityService(target)) {
                            break;
                        }
                        AccessibilityNodeProvider provider = target.getAccessibilityNodeProvider();
                        if (provider != null) {
                            focused = provider.findFocus(focusType);
@@ -684,7 +675,7 @@ public final class AccessibilityInteractionController {
                }
            }
        } finally {
            resetAccessibilityFetchFlags();
            mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0;
            updateInfoForViewportAndReturnFindNodeResult(
                    focused, callback, interactionId, spec, matrixValues, interactiveRegion);
        }
@@ -731,7 +722,7 @@ public final class AccessibilityInteractionController {
            if (mViewRootImpl.mView == null || mViewRootImpl.mAttachInfo == null) {
                return;
            }
            setAccessibilityFetchFlags(flags);
            mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = flags;
            final View root = findViewByAccessibilityId(accessibilityViewId);
            if (root != null && isShown(root)) {
                View nextView = root.focusSearch(direction);
@@ -740,7 +731,7 @@ public final class AccessibilityInteractionController {
                }
            }
        } finally {
            resetAccessibilityFetchFlags();
            mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0;
            updateInfoForViewportAndReturnFindNodeResult(
                    next, callback, interactionId, spec, matrixValues, interactiveRegion);
        }
@@ -787,9 +778,9 @@ public final class AccessibilityInteractionController {
                    mViewRootImpl.mStopped || mViewRootImpl.mPausedForTransition) {
                return;
            }
            setAccessibilityFetchFlags(flags);
            mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = flags;
            final View target = findViewByAccessibilityId(accessibilityViewId);
            if (target != null && isShown(target) && isVisibleToAccessibilityService(target)) {
            if (target != null && isShown(target)) {
                mA11yManager.notifyPerformingAction(action);
                if (action == R.id.accessibilityActionClickOnClickableSpan) {
                    // Handle this hidden action separately
@@ -808,7 +799,7 @@ public final class AccessibilityInteractionController {
            }
        } finally {
            try {
                resetAccessibilityFetchFlags();
                mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0;
                callback.setPerformAccessibilityActionResult(succeeded, interactionId);
            } catch (RemoteException re) {
                /* ignore - the other side will time out */
@@ -832,9 +823,9 @@ public final class AccessibilityInteractionController {
            return;
        }
        try {
            setAccessibilityFetchFlags(
                    AccessibilityNodeInfo.FLAG_SERVICE_REQUESTS_INCLUDE_NOT_IMPORTANT_VIEWS);
            final View root = getRootView();
            mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags =
                    AccessibilityNodeInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;
            final View root = mViewRootImpl.mView;
            if (root != null && isShown(root)) {
                final View host = mViewRootImpl.mAccessibilityFocusedHost;
                // If there is no accessibility focus host or it is not a descendant
@@ -858,7 +849,7 @@ public final class AccessibilityInteractionController {
                }
            }
        } finally {
            resetAccessibilityFetchFlags();
            mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0;
        }
    }

@@ -878,7 +869,7 @@ public final class AccessibilityInteractionController {
                || mViewRootImpl.mStopped || mViewRootImpl.mPausedForTransition) {
            return;
        }
        final View root = getRootView();
        final View root = mViewRootImpl.mView;
        if (root != null && isShown(root)) {
            // trigger ACTION_OUTSIDE to notify windows
            final long now = SystemClock.uptimeMillis();
@@ -891,30 +882,12 @@ public final class AccessibilityInteractionController {

    private View findViewByAccessibilityId(int accessibilityId) {
        if (accessibilityId == AccessibilityNodeInfo.ROOT_ITEM_ID) {
            return getRootView();
            return mViewRootImpl.mView;
        } else {
            return AccessibilityNodeIdManager.getInstance().findView(accessibilityId);
        }
    }

    private View getRootView() {
        if (!isVisibleToAccessibilityService(mViewRootImpl.mView)) {
            return null;
        }
        return mViewRootImpl.mView;
    }

    private void setAccessibilityFetchFlags(int flags) {
        mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = flags;
        mA11yManager.setRequestFromAccessibilityTool(
                (flags & AccessibilityNodeInfo.FLAG_SERVICE_IS_ACCESSIBILITY_TOOL) != 0);
    }

    private void resetAccessibilityFetchFlags() {
        mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = 0;
        mA11yManager.setRequestFromAccessibilityTool(false);
    }

    // The boundInScreen includes magnification effect, so we need to normalize it before
    // determine the visibility.
    private void adjustIsVisibleToUserIfNeeded(AccessibilityNodeInfo info,
@@ -1733,7 +1706,7 @@ public final class AccessibilityInteractionController {

        @Override
        public boolean test(View view) {
            if (view.getId() == mViewId && isShown(view) && isVisibleToAccessibilityService(view)) {
            if (view.getId() == mViewId && isShown(view)) {
                mInfos.add(view.createAccessibilityNodeInfo());
            }
            return false;
Loading