summaryrefslogtreecommitdiffstats
path: root/services/accessibility
diff options
context:
space:
mode:
authorChristopher Tate <ctate@google.com>2015-03-16 16:55:14 -0700
committerChristopher Tate <ctate@google.com>2015-03-16 17:39:07 -0700
commit2d4aadca9487d76cb7220bdba90afa53119664ea (patch)
treec332c59f9cb2263aef59f1216995de0eba196afa /services/accessibility
parent6597e3435f8abfedbb9a4f1bfb10cc17ea7f38bf (diff)
downloadframeworks_base-2d4aadca9487d76cb7220bdba90afa53119664ea.zip
frameworks_base-2d4aadca9487d76cb7220bdba90afa53119664ea.tar.gz
frameworks_base-2d4aadca9487d76cb7220bdba90afa53119664ea.tar.bz2
Merge restored accessibility enable state, don't overwrite
We do not want to accidentally disable the user's currently-enabled accessibility service(s); presumably they turned them on during setup for a reason. We now merge the prior + current states rather than simply replacing the current state with the former. Bug 19427367 Change-Id: I96eb47df57318c88066c5da6862f23f656639148
Diffstat (limited to 'services/accessibility')
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java48
1 files changed, 45 insertions, 3 deletions
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index a712d78..bb5ff1b 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -352,6 +352,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
intentFilter.addAction(Intent.ACTION_USER_SWITCHED);
intentFilter.addAction(Intent.ACTION_USER_REMOVED);
intentFilter.addAction(Intent.ACTION_USER_PRESENT);
+ intentFilter.addAction(Intent.ACTION_SETTING_RESTORED);
mContext.registerReceiverAsUser(new BroadcastReceiver() {
@Override
@@ -369,6 +370,15 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
onUserStateChangedLocked(userState);
}
}
+ } else if (Intent.ACTION_SETTING_RESTORED.equals(action)) {
+ final String which = intent.getStringExtra(Intent.EXTRA_SETTING_NAME);
+ if (Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES.equals(which)) {
+ synchronized (mLock) {
+ restoreEnabledAccessibilityServicesLocked(
+ intent.getStringExtra(Intent.EXTRA_SETTING_PREVIOUS_VALUE),
+ intent.getStringExtra(Intent.EXTRA_SETTING_NEW_VALUE));
+ }
+ }
}
}
}, UserHandle.ALL, intentFilter, null, null);
@@ -857,6 +867,21 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
}
}
+ // Called only during settings restore; currently supports only the owner user
+ void restoreEnabledAccessibilityServicesLocked(String oldSetting, String newSetting) {
+ readComponentNamesFromStringLocked(oldSetting, mTempComponentNameSet, false);
+ readComponentNamesFromStringLocked(newSetting, mTempComponentNameSet, true);
+
+ UserState userState = getUserStateLocked(UserHandle.USER_OWNER);
+ userState.mEnabledServices.clear();
+ userState.mEnabledServices.addAll(mTempComponentNameSet);
+ persistComponentNamesToSettingLocked(
+ Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
+ userState.mEnabledServices,
+ UserHandle.USER_OWNER);
+ onUserStateChangedLocked(userState);
+ }
+
private InteractionBridge getInteractionBridgeLocked() {
if (mInteractionBridge == null) {
mInteractionBridge = new InteractionBridge();
@@ -1129,10 +1154,27 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
Set<ComponentName> outComponentNames) {
String settingValue = Settings.Secure.getStringForUser(mContext.getContentResolver(),
settingName, userId);
- outComponentNames.clear();
- if (settingValue != null) {
+ readComponentNamesFromStringLocked(settingValue, outComponentNames, false);
+ }
+
+ /**
+ * Populates a set with the {@link ComponentName}s contained in a colon-delimited string.
+ *
+ * @param names The colon-delimited string to parse.
+ * @param outComponentNames The set of component names to be populated based on
+ * the contents of the <code>names</code> string.
+ * @param doMerge If true, the parsed component names will be merged into the output
+ * set, rather than replacing the set's existing contents entirely.
+ */
+ private void readComponentNamesFromStringLocked(String names,
+ Set<ComponentName> outComponentNames,
+ boolean doMerge) {
+ if (!doMerge) {
+ outComponentNames.clear();
+ }
+ if (names != null) {
TextUtils.SimpleStringSplitter splitter = mStringColonSplitter;
- splitter.setString(settingValue);
+ splitter.setString(names);
while (splitter.hasNext()) {
String str = splitter.next();
if (str == null || str.length() <= 0) {