summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSvetoslav <svetoslavganov@google.com>2013-05-08 11:13:11 -0700
committerSvetoslav <svetoslavganov@google.com>2013-05-08 11:13:15 -0700
commit042ccec5a0921b749b38fed021b82b224ce5a70a (patch)
treea6ffc42b8ca1751e5ed8d84c73826cb18c4c5f02
parent4c95c5377a75a3d6c5f3ed8b09a56071d51fadb1 (diff)
downloadframeworks_base-042ccec5a0921b749b38fed021b82b224ce5a70a.zip
frameworks_base-042ccec5a0921b749b38fed021b82b224ce5a70a.tar.gz
frameworks_base-042ccec5a0921b749b38fed021b82b224ce5a70a.tar.bz2
Dynamically togglable accessibility features improperly handled.
Touch exploration and enhanced web accessibility can be toggled at run time. However, the code that updates the state of these features was not properly doing that. In particular, it did not write to the settings if the feature gets disabled. Now the logic is much cleaner. If there is a service that can request and requests a feature and the feature is not enabled, we enabled it, otherwise the feature is disabled. bug:8790771 Change-Id: I218dfa12fd02220c94940b54f42bed578811a794
-rw-r--r--services/java/com/android/server/accessibility/AccessibilityManagerService.java67
1 files changed, 30 insertions, 37 deletions
diff --git a/services/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/java/com/android/server/accessibility/AccessibilityManagerService.java
index 4ae9eb5..2b5544b 100644
--- a/services/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -1375,29 +1375,30 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
}
private void updateTouchExplorationLocked(UserState userState) {
- userState.mIsTouchExplorationEnabled = false;
+ boolean enabled = false;
final int serviceCount = userState.mBoundServices.size();
for (int i = 0; i < serviceCount; i++) {
Service service = userState.mBoundServices.get(i);
- if (tryEnableTouchExplorationLocked(service)) {
+ if (canRequestAndRequestsTouchExplorationLocked(service)) {
+ enabled = true;
break;
}
}
+ if (enabled != userState.mIsTouchExplorationEnabled) {
+ userState.mIsTouchExplorationEnabled = enabled;
+ Settings.Secure.putIntForUser(mContext.getContentResolver(),
+ Settings.Secure.TOUCH_EXPLORATION_ENABLED, enabled ? 1 : 0,
+ userState.mUserId);
+ }
}
- private boolean tryEnableTouchExplorationLocked(Service service) {
+ private boolean canRequestAndRequestsTouchExplorationLocked(Service service) {
+ // Service not ready or cannot request the feature - well nothing to do.
if (!service.canReceiveEventsLocked() || !service.mRequestTouchExplorationMode) {
return false;
}
- UserState userState = getUserStateLocked(service.mUserId);
- if (userState.mIsTouchExplorationEnabled) {
- return false;
- }
// UI test automation service can always enable it.
if (service.mIsAutomation) {
- userState.mIsTouchExplorationEnabled = true;
- Settings.Secure.putIntForUser(mContext.getContentResolver(),
- Settings.Secure.TOUCH_EXPLORATION_ENABLED, 1, service.mUserId);
return true;
}
if (service.mResolveInfo.serviceInfo.applicationInfo.targetSdkVersion
@@ -1405,29 +1406,21 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
// Up to JB-MR1 we had a white list with services that can enable touch
// exploration. When a service is first started we show a dialog to the
// use to get a permission to white list the service.
- if (!userState.mTouchExplorationGrantedServices.contains(service.mComponentName)) {
- if (mEnableTouchExplorationDialog == null
- || (mEnableTouchExplorationDialog != null
- && !mEnableTouchExplorationDialog.isShowing())) {
- mMainHandler.obtainMessage(
- MainHandler.MSG_SHOW_ENABLED_TOUCH_EXPLORATION_DIALOG,
- service).sendToTarget();
- }
- } else {
- userState.mIsTouchExplorationEnabled = true;
- Settings.Secure.putIntForUser(mContext.getContentResolver(),
- Settings.Secure.TOUCH_EXPLORATION_ENABLED, 1, service.mUserId);
+ UserState userState = getUserStateLocked(service.mUserId);
+ if (userState.mTouchExplorationGrantedServices.contains(service.mComponentName)) {
return true;
+ } else if (mEnableTouchExplorationDialog == null
+ || !mEnableTouchExplorationDialog.isShowing()) {
+ mMainHandler.obtainMessage(
+ MainHandler.MSG_SHOW_ENABLED_TOUCH_EXPLORATION_DIALOG,
+ service).sendToTarget();
}
} else {
// Starting in JB-MR2 we request an accessibility service to declare
// certain capabilities in its meta-data to allow it to enable the
// corresponding features.
- if (service.mIsAutomation || (service.mAccessibilityServiceInfo.getCapabilities()
+ if ((service.mAccessibilityServiceInfo.getCapabilities()
& AccessibilityServiceInfo.CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION) != 0) {
- userState.mIsTouchExplorationEnabled = true;
- Settings.Secure.putIntForUser(mContext.getContentResolver(),
- Settings.Secure.TOUCH_EXPLORATION_ENABLED, 1, service.mUserId);
return true;
}
}
@@ -1435,29 +1428,29 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
}
private void updateEnhancedWebAccessibilityLocked(UserState userState) {
- userState.mIsEnhancedWebAccessibilityEnabled = false;
+ boolean enabled = false;
final int serviceCount = userState.mBoundServices.size();
for (int i = 0; i < serviceCount; i++) {
Service service = userState.mBoundServices.get(i);
- if (tryEnableEnhancedWebAccessibilityLocked(service)) {
- return;
+ if (canRequestAndRequestsEnhancedWebAccessibilityLocked(service)) {
+ enabled = true;
+ break;
}
}
+ if (enabled != userState.mIsEnhancedWebAccessibilityEnabled) {
+ userState.mIsEnhancedWebAccessibilityEnabled = enabled;
+ Settings.Secure.putIntForUser(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_SCRIPT_INJECTION, enabled ? 1 : 0,
+ userState.mUserId);
+ }
}
- private boolean tryEnableEnhancedWebAccessibilityLocked(Service service) {
+ private boolean canRequestAndRequestsEnhancedWebAccessibilityLocked(Service service) {
if (!service.canReceiveEventsLocked() || !service.mRequestEnhancedWebAccessibility ) {
return false;
}
- UserState userState = getUserStateLocked(service.mUserId);
- if (userState.mIsEnhancedWebAccessibilityEnabled) {
- return false;
- }
if (service.mIsAutomation || (service.mAccessibilityServiceInfo.getCapabilities()
& AccessibilityServiceInfo.CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY) != 0) {
- userState.mIsEnhancedWebAccessibilityEnabled = true;
- Settings.Secure.putIntForUser(mContext.getContentResolver(),
- Settings.Secure.ACCESSIBILITY_SCRIPT_INJECTION, 1, userState.mUserId);
return true;
}
return false;