diff options
| author | 2016-05-10 20:18:11 +0000 | |
|---|---|---|
| committer | 2016-05-10 20:18:12 +0000 | |
| commit | cdaaaaad905396e4f0f2ebd9b37240095182d1d7 (patch) | |
| tree | cfa03875982875d338d1ea1fedcb5cdbf27fc737 | |
| parent | fcc38e6c35be0dd68d722b7398cf2fb66c1c0d92 (diff) | |
| parent | 2fbdd48682c32407daff4fd6577c3838c7c7a220 (diff) | |
Merge "Reduce cost of a11y services with magnification." into nyc-dev
4 files changed, 62 insertions, 20 deletions
diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java index 8b277b2a12ea..ae78e21807e8 100644 --- a/core/java/android/accessibilityservice/AccessibilityService.java +++ b/core/java/android/accessibilityservice/AccessibilityService.java @@ -949,7 +949,7 @@ public abstract class AccessibilityService extends Service { mService.mConnectionId); if (connection != null) { try { - return connection.getMagnifiedRegion(); + return connection.getMagnificationRegion(); } catch (RemoteException re) { Log.w(LOG_TAG, "Failed to obtain magnified region", re); re.rethrowFromSystemServer(); diff --git a/core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl b/core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl index 3783fcac5569..7a55079d3ecf 100644 --- a/core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl +++ b/core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl @@ -75,7 +75,7 @@ interface IAccessibilityServiceConnection { float getMagnificationCenterY(); - Region getMagnifiedRegion(); + Region getMagnificationRegion(); boolean resetMagnification(boolean animate); diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index e1695e03e564..7f977dd425fd 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -1737,7 +1737,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { } if (userState.mIsDisplayMagnificationEnabled || - userHasMagnificationServicesLocked(userState)) { + userHasListeningMagnificationServicesLocked(userState)) { // Initialize the magnification controller if necessary getMagnificationController(); mMagnificationController.register(); @@ -1761,6 +1761,22 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { return false; } + /** + * Returns whether the specified user has any services that are capable of + * controlling magnification and are actively listening for magnification updates. + */ + private boolean userHasListeningMagnificationServicesLocked(UserState userState) { + final List<Service> services = userState.mBoundServices; + for (int i = 0, count = services.size(); i < count; i++) { + final Service service = services.get(i); + if (mSecurityPolicy.canControlMagnification(service) + && service.mInvocationHandler.mIsMagnificationCallbackEnabled) { + return true; + } + } + return false; + } + private void updateSoftKeyboardShowModeLocked(UserState userState) { final int userId = userState.mUserId; // Only check whether we need to reset the soft keyboard mode if it is not set to the @@ -2864,19 +2880,28 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { } @Override - public Region getMagnifiedRegion() { + public Region getMagnificationRegion() { synchronized (mLock) { + final Region region = Region.obtain(); if (!isCalledForCurrentUserLocked()) { - return Region.obtain(); + return region; + } + MagnificationController magnificationController = getMagnificationController(); + boolean forceRegistration = mSecurityPolicy.canControlMagnification(this); + boolean initiallyRegistered = magnificationController.isRegisteredLocked(); + if (!initiallyRegistered && forceRegistration) { + magnificationController.register(); + } + final long identity = Binder.clearCallingIdentity(); + try { + magnificationController.getMagnificationRegion(region); + return region; + } finally { + Binder.restoreCallingIdentity(identity); + if (!initiallyRegistered && forceRegistration) { + magnificationController.unregister(); + } } - } - final long identity = Binder.clearCallingIdentity(); - try { - final Region region = Region.obtain(); - getMagnificationController().getMagnificationRegion(region); - return region; - } finally { - Binder.restoreCallingIdentity(identity); } } @@ -2940,13 +2965,17 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { if (!permissionGranted) { return false; } - } - final long identity = Binder.clearCallingIdentity(); - try { - return getMagnificationController().setScaleAndCenter( - scale, centerX, centerY, animate, mId); - } finally { - Binder.restoreCallingIdentity(identity); + final long identity = Binder.clearCallingIdentity(); + try { + MagnificationController magnificationController = getMagnificationController(); + if (!magnificationController.isRegisteredLocked()) { + magnificationController.register(); + } + return magnificationController + .setScaleAndCenter(scale, centerX, centerY, animate, mId); + } finally { + Binder.restoreCallingIdentity(identity); + } } } diff --git a/services/accessibility/java/com/android/server/accessibility/MagnificationController.java b/services/accessibility/java/com/android/server/accessibility/MagnificationController.java index 027b6e2c83e2..7886b9ea7fad 100644 --- a/services/accessibility/java/com/android/server/accessibility/MagnificationController.java +++ b/services/accessibility/java/com/android/server/accessibility/MagnificationController.java @@ -151,6 +151,15 @@ class MagnificationController { } } + /** + * Check if we are registered. Note that we may be planning to unregister at any moment. + * + * @return {@code true} if the controller is registered. {@code false} otherwise. + */ + public boolean isRegisteredLocked() { + return mRegistered; + } + private void unregisterInternalLocked() { if (mRegistered) { mSpecAnimationBridge.setEnabled(false); @@ -179,6 +188,10 @@ class MagnificationController { */ private void onMagnificationRegionChanged(Region magnified, boolean updateSpec) { synchronized (mLock) { + if (!mRegistered) { + // Don't update if we've unregistered + return; + } boolean magnificationChanged = false; boolean boundsChanged = false; |