diff options
Diffstat (limited to 'services/java/com/android/server/accessibility/AccessibilityManagerService.java')
-rw-r--r-- | services/java/com/android/server/accessibility/AccessibilityManagerService.java | 214 |
1 files changed, 41 insertions, 173 deletions
diff --git a/services/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/java/com/android/server/accessibility/AccessibilityManagerService.java index af01c5b..09ddc2f 100644 --- a/services/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -40,7 +40,6 @@ import android.os.IBinder; import android.os.Message; import android.os.RemoteException; import android.os.ServiceManager; -import android.os.SystemClock; import android.provider.Settings; import android.text.TextUtils; import android.text.TextUtils.SimpleStringSplitter; @@ -72,7 +71,6 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.concurrent.atomic.AtomicInteger; /** * This class is instantiated by the system as a system level service and can be @@ -871,10 +869,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub boolean mIsAutomation; - final Callback mCallback = new Callback(); - - final AtomicInteger mInteractionIdCounter = new AtomicInteger(); - final Rect mTempBounds = new Rect(); // the events pending events to be dispatched to this service @@ -974,14 +968,16 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } } - public AccessibilityNodeInfo findAccessibilityNodeInfoByViewIdInActiveWindow(int viewId) + public float findAccessibilityNodeInfoByViewIdInActiveWindow(int viewId, + int interactionId, IAccessibilityInteractionConnectionCallback callback, + long interrogatingTid) throws RemoteException { IAccessibilityInteractionConnection connection = null; synchronized (mLock) { mSecurityPolicy.enforceCanRetrieveWindowContent(this); final boolean permissionGranted = mSecurityPolicy.canRetrieveWindowContent(this); if (!permissionGranted) { - return null; + return 0; } else { connection = getConnectionToRetrievalAllowingWindowLocked(); if (connection == null) { @@ -989,22 +985,15 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub Slog.e(LOG_TAG, "No interaction connection to a retrieve " + "allowing window."); } - return null; + return 0; } } } + final int interrogatingPid = Binder.getCallingPid(); final long identityToken = Binder.clearCallingIdentity(); try { - final int interactionId = mInteractionIdCounter.getAndIncrement(); - connection.findAccessibilityNodeInfoByViewId(viewId, interactionId, mCallback); - AccessibilityNodeInfo info = mCallback.getFindAccessibilityNodeInfoResultAndClear( - interactionId); - if (info != null) { - applyCompatibilityScaleIfNeeded(info); - info.setConnection(this); - info.setSealed(true); - } - return info; + connection.findAccessibilityNodeInfoByViewId(viewId, interactionId, callback, + interrogatingPid, interrogatingTid); } catch (RemoteException re) { if (DEBUG) { Slog.e(LOG_TAG, "Error finding node."); @@ -1012,51 +1001,44 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } finally { Binder.restoreCallingIdentity(identityToken); } - return null; + return getCompatibilityScale(mSecurityPolicy.getRetrievalAllowingWindowLocked()); } - public List<AccessibilityNodeInfo> findAccessibilityNodeInfosByViewTextInActiveWindow( - String text) throws RemoteException { + public float findAccessibilityNodeInfosByViewTextInActiveWindow( + String text, int interactionId, + IAccessibilityInteractionConnectionCallback callback, long threadId) + throws RemoteException { return findAccessibilityNodeInfosByViewText(text, - mSecurityPolicy.mRetrievalAlowingWindowId, View.NO_ID); + mSecurityPolicy.mRetrievalAlowingWindowId, View.NO_ID, interactionId, callback, + threadId); } - public List<AccessibilityNodeInfo> findAccessibilityNodeInfosByViewText(String text, - int accessibilityWindowId, int accessibilityViewId) throws RemoteException { + public float findAccessibilityNodeInfosByViewText(String text, + int accessibilityWindowId, int accessibilityViewId, int interactionId, + IAccessibilityInteractionConnectionCallback callback, long interrogatingTid) + throws RemoteException { IAccessibilityInteractionConnection connection = null; synchronized (mLock) { mSecurityPolicy.enforceCanRetrieveWindowContent(this); final boolean permissionGranted = mSecurityPolicy.canGetAccessibilityNodeInfoLocked(this, accessibilityWindowId); if (!permissionGranted) { - return null; + return 0; } else { connection = getConnectionToRetrievalAllowingWindowLocked(); if (connection == null) { if (DEBUG) { Slog.e(LOG_TAG, "No interaction connection to focused window."); } - return null; + return 0; } } } + final int interrogatingPid = Binder.getCallingPid(); final long identityToken = Binder.clearCallingIdentity(); try { - final int interactionId = mInteractionIdCounter.getAndIncrement(); connection.findAccessibilityNodeInfosByViewText(text, accessibilityViewId, - interactionId, mCallback); - List<AccessibilityNodeInfo> infos = - mCallback.getFindAccessibilityNodeInfosResultAndClear(interactionId); - if (infos != null) { - final int infoCount = infos.size(); - for (int i = 0; i < infoCount; i++) { - AccessibilityNodeInfo info = infos.get(i); - applyCompatibilityScaleIfNeeded(info); - info.setConnection(this); - info.setSealed(true); - } - } - return infos; + interactionId, callback, interrogatingPid, interrogatingTid); } catch (RemoteException re) { if (DEBUG) { Slog.e(LOG_TAG, "Error finding node."); @@ -1064,18 +1046,20 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } finally { Binder.restoreCallingIdentity(identityToken); } - return null; + return getCompatibilityScale(accessibilityWindowId); } - public AccessibilityNodeInfo findAccessibilityNodeInfoByAccessibilityId( - int accessibilityWindowId, int accessibilityViewId) throws RemoteException { + public float findAccessibilityNodeInfoByAccessibilityId(int accessibilityWindowId, + int accessibilityViewId, int interactionId, + IAccessibilityInteractionConnectionCallback callback, long interrogatingTid) + throws RemoteException { IAccessibilityInteractionConnection connection = null; synchronized (mLock) { mSecurityPolicy.enforceCanRetrieveWindowContent(this); final boolean permissionGranted = mSecurityPolicy.canGetAccessibilityNodeInfoLocked(this, accessibilityWindowId); if (!permissionGranted) { - return null; + return 0; } else { connection = mWindowIdToInteractionConnectionMap.get(accessibilityWindowId); if (connection == null) { @@ -1083,23 +1067,15 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub Slog.e(LOG_TAG, "No interaction connection to window: " + accessibilityWindowId); } - return null; + return 0; } } } + final int interrogatingPid = Binder.getCallingPid(); final long identityToken = Binder.clearCallingIdentity(); try { - final int interactionId = mInteractionIdCounter.getAndIncrement(); connection.findAccessibilityNodeInfoByAccessibilityId(accessibilityViewId, - interactionId, mCallback); - AccessibilityNodeInfo info = - mCallback.getFindAccessibilityNodeInfoResultAndClear(interactionId); - if (info != null) { - applyCompatibilityScaleIfNeeded(info); - info.setConnection(this); - info.setSealed(true); - } - return info; + interactionId, callback, interrogatingPid, interrogatingTid); } catch (RemoteException re) { if (DEBUG) { Slog.e(LOG_TAG, "Error requesting node with accessibilityViewId: " @@ -1108,11 +1084,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } finally { Binder.restoreCallingIdentity(identityToken); } - return null; + return getCompatibilityScale(accessibilityWindowId); } public boolean performAccessibilityAction(int accessibilityWindowId, - int accessibilityViewId, int action) { + int accessibilityViewId, int action, int interactionId, + IAccessibilityInteractionConnectionCallback callback, long interrogatingTid) { IAccessibilityInteractionConnection connection = null; synchronized (mLock) { final boolean permissionGranted = mSecurityPolicy.canPerformActionLocked(this, @@ -1130,12 +1107,11 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } } } + final int interrogatingPid = Binder.getCallingPid(); final long identityToken = Binder.clearCallingIdentity(); try { - final int interactionId = mInteractionIdCounter.getAndIncrement(); connection.performAccessibilityAction(accessibilityViewId, action, interactionId, - mCallback); - return mCallback.getPerformAccessibilityActionResult(interactionId); + callback, interrogatingPid, interrogatingTid); } catch (RemoteException re) { if (DEBUG) { Slog.e(LOG_TAG, "Error requesting node with accessibilityViewId: " @@ -1144,7 +1120,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } finally { Binder.restoreCallingIdentity(identityToken); } - return false; + return true; } public void onServiceDisconnected(ComponentName componentName) { @@ -1173,22 +1149,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub return mWindowIdToInteractionConnectionMap.get(windowId); } - private void applyCompatibilityScaleIfNeeded(AccessibilityNodeInfo info) { - IBinder windowToken = mWindowIdToWindowTokenMap.get(info.getWindowId()); - final float scale = mWindowManagerService.getWindowCompatibilityScale(windowToken); - - if (scale == 1.0f) { - return; - } - - Rect bounds = mTempBounds; - info.getBoundsInParent(bounds); - bounds.scale(scale); - info.setBoundsInParent(bounds); - - info.getBoundsInScreen(bounds); - bounds.scale(scale); - info.setBoundsInScreen(bounds); + private float getCompatibilityScale(int windowId) { + IBinder windowToken = mWindowIdToWindowTokenMap.get(windowId); + return mWindowManagerService.getWindowCompatibilityScale(windowToken); } } @@ -1275,99 +1238,4 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } } } - - final class Callback extends IAccessibilityInteractionConnectionCallback.Stub { - private static final long TIMEOUT_INTERACTION_MILLIS = 5000; - - private int mInteractionId = -1; - private AccessibilityNodeInfo mFindAccessibilityNodeInfoResult; - private List<AccessibilityNodeInfo> mFindAccessibilityNodeInfosResult; - private boolean mPerformAccessibilityActionResult; - - public void setFindAccessibilityNodeInfoResult(AccessibilityNodeInfo info, - int interactionId) { - synchronized (mLock) { - if (interactionId > mInteractionId) { - mFindAccessibilityNodeInfoResult = info; - mInteractionId = interactionId; - } - mLock.notifyAll(); - } - } - - public AccessibilityNodeInfo getFindAccessibilityNodeInfoResultAndClear(int interactionId) { - synchronized (mLock) { - waitForResultTimedLocked(TIMEOUT_INTERACTION_MILLIS, interactionId); - AccessibilityNodeInfo result = mFindAccessibilityNodeInfoResult; - clearLocked(); - return result; - } - } - - public void setFindAccessibilityNodeInfosResult(List<AccessibilityNodeInfo> infos, - int interactionId) { - synchronized (mLock) { - if (interactionId > mInteractionId) { - mFindAccessibilityNodeInfosResult = infos; - mInteractionId = interactionId; - } - mLock.notifyAll(); - } - } - - public List<AccessibilityNodeInfo> getFindAccessibilityNodeInfosResultAndClear( - int interactionId) { - synchronized (mLock) { - waitForResultTimedLocked(TIMEOUT_INTERACTION_MILLIS, interactionId); - List<AccessibilityNodeInfo> result = mFindAccessibilityNodeInfosResult; - clearLocked(); - return result; - } - } - - public void setPerformAccessibilityActionResult(boolean succeeded, int interactionId) { - synchronized (mLock) { - if (interactionId > mInteractionId) { - mPerformAccessibilityActionResult = succeeded; - mInteractionId = interactionId; - } - mLock.notifyAll(); - } - } - - public boolean getPerformAccessibilityActionResult(int interactionId) { - synchronized (mLock) { - waitForResultTimedLocked(TIMEOUT_INTERACTION_MILLIS, interactionId); - final boolean result = mPerformAccessibilityActionResult; - clearLocked(); - return result; - } - } - - public void clearLocked() { - mInteractionId = -1; - mFindAccessibilityNodeInfoResult = null; - mFindAccessibilityNodeInfosResult = null; - mPerformAccessibilityActionResult = false; - } - - private void waitForResultTimedLocked(long waitTimeMillis, int interactionId) { - final long startTimeMillis = SystemClock.uptimeMillis(); - while (true) { - try { - if (mInteractionId == interactionId) { - return; - } - final long elapsedTimeMillis = SystemClock.uptimeMillis() - startTimeMillis; - waitTimeMillis = TIMEOUT_INTERACTION_MILLIS - elapsedTimeMillis; - if (waitTimeMillis <= 0) { - return; - } - mLock.wait(waitTimeMillis); - } catch (InterruptedException ie) { - /* ignore */ - } - } - } - } } |