summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Phil Weaver <pweaver@google.com> 2016-05-10 20:18:11 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2016-05-10 20:18:12 +0000
commitcdaaaaad905396e4f0f2ebd9b37240095182d1d7 (patch)
treecfa03875982875d338d1ea1fedcb5cdbf27fc737
parentfcc38e6c35be0dd68d722b7398cf2fb66c1c0d92 (diff)
parent2fbdd48682c32407daff4fd6577c3838c7c7a220 (diff)
Merge "Reduce cost of a11y services with magnification." into nyc-dev
-rw-r--r--core/java/android/accessibilityservice/AccessibilityService.java2
-rw-r--r--core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl2
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java65
-rw-r--r--services/accessibility/java/com/android/server/accessibility/MagnificationController.java13
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;