OSDN Git Service

Throw an exception if accessibility service has not requested to retrieve window...
authorSvetoslav Ganov <svetoslavganov@google.com>
Sun, 17 Jul 2011 19:22:08 +0000 (12:22 -0700)
committerSvetoslav Ganov <svetoslavganov@google.com>
Sun, 17 Jul 2011 19:22:14 +0000 (12:22 -0700)
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

services/java/com/android/server/accessibility/AccessibilityManagerService.java

index f99951f..a8dc885 100644 (file)
@@ -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);
         }