diff options
author | Nirmal Patel <nirmalpatel@google.com> | 2015-06-02 18:11:32 -0700 |
---|---|---|
committer | Svet Ganov <svetoslavganov@google.com> | 2015-06-03 19:18:00 -0700 |
commit | 386a824384a0d5795a38d10d1d2c18e4e50f8c30 (patch) | |
tree | ec78c084bd26b80ba1d4b3c4d13c6fdf8efb505d /services/accessibility | |
parent | db2911321b1cb0870d10baab370c93da13a91067 (diff) | |
download | frameworks_base-386a824384a0d5795a38d10d1d2c18e4e50f8c30.zip frameworks_base-386a824384a0d5795a38d10d1d2c18e4e50f8c30.tar.gz frameworks_base-386a824384a0d5795a38d10d1d2c18e4e50f8c30.tar.bz2 |
Make node retrieval methods in AccessibilityManagerService use separate Region instances to make them thread safe.
b/21087793
Change-Id: Ice690e3d7494788fb9e1e234a54f14831bd4e0d3
(cherry picked from commit ebd8eb4610d6bb9322a374f8965a78ba1c39ee63)
Diffstat (limited to 'services/accessibility')
-rw-r--r-- | services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java | 37 |
1 files changed, 30 insertions, 7 deletions
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index 860939c..9c21a1a 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -166,8 +166,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { private final List<AccessibilityServiceInfo> mEnabledServicesForFeedbackTempList = new ArrayList<>(); - private final Region mTempRegion = new Region(); - private final Rect mTempRect = new Rect(); private final Rect mTempRect1 = new Rect(); @@ -2241,7 +2239,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { throws RemoteException { final int resolvedWindowId; IAccessibilityInteractionConnection connection = null; - Region partialInteractiveRegion = mTempRegion; + Region partialInteractiveRegion = Region.obtain(); synchronized (mLock) { // We treat calls from a profile as if made by its parent as profiles // share the accessibility state of the parent. The call below @@ -2265,6 +2263,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { } if (!mSecurityPolicy.computePartialInteractiveRegionForWindowLocked( resolvedWindowId, partialInteractiveRegion)) { + partialInteractiveRegion.recycle(); partialInteractiveRegion = null; } } @@ -2282,6 +2281,10 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { } } finally { Binder.restoreCallingIdentity(identityToken); + // Recycle if passed to another process. + if (partialInteractiveRegion != null && Binder.isProxy(connection)) { + partialInteractiveRegion.recycle(); + } } return false; } @@ -2293,7 +2296,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { throws RemoteException { final int resolvedWindowId; IAccessibilityInteractionConnection connection = null; - Region partialInteractiveRegion = mTempRegion; + Region partialInteractiveRegion = Region.obtain(); synchronized (mLock) { // We treat calls from a profile as if made by its parent as profiles // share the accessibility state of the parent. The call below @@ -2317,6 +2320,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { } if (!mSecurityPolicy.computePartialInteractiveRegionForWindowLocked( resolvedWindowId, partialInteractiveRegion)) { + partialInteractiveRegion.recycle(); partialInteractiveRegion = null; } } @@ -2334,6 +2338,10 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { } } finally { Binder.restoreCallingIdentity(identityToken); + // Recycle if passed to another process. + if (partialInteractiveRegion != null && Binder.isProxy(connection)) { + partialInteractiveRegion.recycle(); + } } return false; } @@ -2345,7 +2353,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { long interrogatingTid) throws RemoteException { final int resolvedWindowId; IAccessibilityInteractionConnection connection = null; - Region partialInteractiveRegion = mTempRegion; + Region partialInteractiveRegion = Region.obtain(); synchronized (mLock) { // We treat calls from a profile as if made by its parent as profiles // share the accessibility state of the parent. The call below @@ -2369,6 +2377,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { } if (!mSecurityPolicy.computePartialInteractiveRegionForWindowLocked( resolvedWindowId, partialInteractiveRegion)) { + partialInteractiveRegion.recycle(); partialInteractiveRegion = null; } } @@ -2386,6 +2395,10 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { } } finally { Binder.restoreCallingIdentity(identityToken); + // Recycle if passed to another process. + if (partialInteractiveRegion != null && Binder.isProxy(connection)) { + partialInteractiveRegion.recycle(); + } } return false; } @@ -2397,7 +2410,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { throws RemoteException { final int resolvedWindowId; IAccessibilityInteractionConnection connection = null; - Region partialInteractiveRegion = mTempRegion; + Region partialInteractiveRegion = Region.obtain(); synchronized (mLock) { // We treat calls from a profile as if made by its parent as profiles // share the accessibility state of the parent. The call below @@ -2422,6 +2435,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { } if (!mSecurityPolicy.computePartialInteractiveRegionForWindowLocked( resolvedWindowId, partialInteractiveRegion)) { + partialInteractiveRegion.recycle(); partialInteractiveRegion = null; } } @@ -2439,6 +2453,10 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { } } finally { Binder.restoreCallingIdentity(identityToken); + // Recycle if passed to another process. + if (partialInteractiveRegion != null && Binder.isProxy(connection)) { + partialInteractiveRegion.recycle(); + } } return false; } @@ -2450,7 +2468,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { throws RemoteException { final int resolvedWindowId; IAccessibilityInteractionConnection connection = null; - Region partialInteractiveRegion = mTempRegion; + Region partialInteractiveRegion = Region.obtain(); synchronized (mLock) { // We treat calls from a profile as if made by its parent as profiles // share the accessibility state of the parent. The call below @@ -2474,6 +2492,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { } if (!mSecurityPolicy.computePartialInteractiveRegionForWindowLocked( resolvedWindowId, partialInteractiveRegion)) { + partialInteractiveRegion.recycle(); partialInteractiveRegion = null; } } @@ -2491,6 +2510,10 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { } } finally { Binder.restoreCallingIdentity(identityToken); + // Recycle if passed to another process. + if (partialInteractiveRegion != null && Binder.isProxy(connection)) { + partialInteractiveRegion.recycle(); + } } return false; } |