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

Commit 4a49d9fe authored by Svetoslav Ganov's avatar Svetoslav Ganov
Browse files

Throw an exception if accessibility service has not requested to retrieve window content.

1. If an accessibility service does not request access to the window
   content and does so, an exception is thrown to point the developer
   to the reason.

bug:5038284

Change-Id: Ibf08f4d2c8ad8939c4f4c2e288048a4f8ff1e31b
parent 47b779b9
Loading
Loading
Loading
Loading
+17 −4
Original line number Diff line number Diff line
@@ -935,9 +935,11 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
            }
        }

        public AccessibilityNodeInfo findAccessibilityNodeInfoByViewIdInActiveWindow(int viewId) {
        public AccessibilityNodeInfo findAccessibilityNodeInfoByViewIdInActiveWindow(int viewId)
                throws RemoteException {
            IAccessibilityInteractionConnection connection = null;
            synchronized (mLock) {
                mSecurityPolicy.enforceCanRetrieveWindowContent(this);
                final boolean permissionGranted = mSecurityPolicy.canRetrieveWindowContent(this);
                if (!permissionGranted) {
                    return null;
@@ -975,15 +977,16 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
        }

        public List<AccessibilityNodeInfo> findAccessibilityNodeInfosByViewTextInActiveWindow(
                String text) {
                String text) throws RemoteException {
            return findAccessibilityNodeInfosByViewText(text,
                    mSecurityPolicy.mRetrievalAlowingWindowId, View.NO_ID);
        }

        public List<AccessibilityNodeInfo> findAccessibilityNodeInfosByViewText(String text,
                int accessibilityWindowId, int accessibilityViewId) {
                int accessibilityWindowId, int accessibilityViewId) throws RemoteException {
            IAccessibilityInteractionConnection connection = null;
            synchronized (mLock) {
                mSecurityPolicy.enforceCanRetrieveWindowContent(this);
                final boolean permissionGranted =
                    mSecurityPolicy.canGetAccessibilityNodeInfoLocked(this, accessibilityWindowId);
                if (!permissionGranted) {
@@ -1026,9 +1029,10 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
        }

        public AccessibilityNodeInfo findAccessibilityNodeInfoByAccessibilityId(
                int accessibilityWindowId, int accessibilityViewId) {
                int accessibilityWindowId, int accessibilityViewId) throws RemoteException {
            IAccessibilityInteractionConnection connection = null;
            synchronized (mLock) {
                mSecurityPolicy.enforceCanRetrieveWindowContent(this);
                final boolean permissionGranted =
                    mSecurityPolicy.canGetAccessibilityNodeInfoLocked(this, accessibilityWindowId);
                if (!permissionGranted) {
@@ -1199,6 +1203,15 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
            return service.mCanRetrieveScreenContent;
        }

        public void enforceCanRetrieveWindowContent(Service service) throws RemoteException {
            // This happens due to incorrect registration so make it apparent.
            if (!canRetrieveWindowContent(service)) {
                Slog.e(LOG_TAG, "Accessibility serivce " + service.mComponentName + " does not " +
                        "declare android:canRetrieveWindowContent.");
                throw new RemoteException();
            }
        }

        private boolean isRetrievalAllowingWindow(int windowId) {
            return (mRetrievalAlowingWindowId == windowId);
        }