Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cb0a7a82 authored by Svetoslav Ganov's avatar Svetoslav Ganov
Browse files

Settings may show enabled accessiiblity services after restore even if accessibility is off.

Now the state of accessibility is determined from the number of running, i.e. enabled and
installed, accessibility services - more than zero access is on else it is off. After a
restore the device may have some enabled and installed services but disabled accessibility
setting. In such case settings should respect the restored values and the services should
be displayed as disabled initially and then enabling one of them will enable accessibility.

bug:5367404

Change-Id: If3756aba3f59e282000247e99f87ebff2b64c9fd
parent 9fe945b8
Loading
Loading
Loading
Loading
+30 −34
Original line number Diff line number Diff line
@@ -85,7 +85,7 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
    // the AccessibilityServiceInfo we need for proper presentation.
    private static final long DELAY_UPDATE_SERVICES_MILLIS = 1000;

    private static final String ENABLED_ACCESSIBILITY_SERVICES_SEPARATOR = ":";
    private static final char ENABLED_ACCESSIBILITY_SERVICES_SEPARATOR = ':';

    private static final String KEY_ACCESSIBILITY_TUTORIAL_LAUNCHED_ONCE =
        "key_accessibility_tutorial_launched_once";
@@ -127,10 +127,9 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements

    // Auxiliary members.
    private final static SimpleStringSplitter sStringColonSplitter =
        new SimpleStringSplitter(ENABLED_ACCESSIBILITY_SERVICES_SEPARATOR.charAt(0));
        new SimpleStringSplitter(ENABLED_ACCESSIBILITY_SERVICES_SEPARATOR);

    private static final Set<ComponentName> sInstalledServices = new HashSet<ComponentName>();
    private static final Set<ComponentName> sEnabledServices = new HashSet<ComponentName>();

    private final Map<String, String> mLongPressTimeoutValuetoTitleMap =
        new HashMap<String, String>();
@@ -297,17 +296,10 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements

        List<AccessibilityServiceInfo> installedServices =
            accessibilityManager.getInstalledAccessibilityServiceList();
        Set<ComponentName> enabledServices = getEnabledServicesFromSettings(getActivity());

        Set<ComponentName> enabledComponentNames = new HashSet<ComponentName>();
        String settingValue = Settings.Secure.getString(getContentResolver(),
                Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
        if (settingValue != null) {
            SimpleStringSplitter splitter = sStringColonSplitter;
            splitter.setString(settingValue);
            while (splitter.hasNext()) {
                enabledComponentNames.add(ComponentName.unflattenFromString(splitter.next()));
            }
        }
        final boolean accessibilityEnabled = Settings.Secure.getInt(getContentResolver(),
                Settings.Secure.ACCESSIBILITY_ENABLED, 0) == 1;

        for (int i = 0, count = installedServices.size(); i < count; ++i) {
            AccessibilityServiceInfo info = installedServices.get(i);
@@ -323,8 +315,9 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
            preference.setKey(componentName.flattenToString());

            preference.setTitle(title);
            final boolean enabled = enabledComponentNames.contains(componentName);
            if (enabled) {
            final boolean serviceEnabled = accessibilityEnabled
                && enabledServices.contains(componentName);
            if (serviceEnabled) {
                preference.setSummary(getString(R.string.accessibility_service_state_on));
            } else {
                preference.setSummary(getString(R.string.accessibility_service_state_off));
@@ -336,7 +329,7 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements

            Bundle extras = preference.getExtras();
            extras.putString(EXTRA_PREFERENCE_KEY, preference.getKey());
            extras.putBoolean(EXTRA_CHECKED, enabled);
            extras.putBoolean(EXTRA_CHECKED, serviceEnabled);
            extras.putString(EXTRA_TITLE, title);

            String description = info.getDescription();
@@ -515,6 +508,26 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
        }
    }

    private static Set<ComponentName> getEnabledServicesFromSettings(Context context) {
        String enabledServicesSetting = Settings.Secure.getString(context.getContentResolver(),
                Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
        if (enabledServicesSetting == null) {
            enabledServicesSetting = "";
        }
        Set<ComponentName> enabledServices = new HashSet<ComponentName>();
        SimpleStringSplitter colonSplitter = sStringColonSplitter;
        colonSplitter.setString(enabledServicesSetting);
        while (colonSplitter.hasNext()) {
            String componentNameString = colonSplitter.next();
            ComponentName enabledService = ComponentName.unflattenFromString(
                    componentNameString);
            if (enabledService != null) {
                enabledServices.add(enabledService);
            }
        }
        return enabledServices;
    }

    private class SettingsPackageMonitor extends PackageMonitor {

        @Override
@@ -589,25 +602,8 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
    public static class ToggleAccessibilityServiceFragment extends TogglePreferenceFragment {
        @Override
        public void onPreferenceToggled(String preferenceKey, boolean enabled) {
            String enabledServicesSetting = Settings.Secure.getString(getContentResolver(),
                    Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
            if (enabledServicesSetting == null) {
                enabledServicesSetting = "";
            }

            // Parse the enabled services.
            Set<ComponentName> enabledServices = sEnabledServices;
            enabledServices.clear();
            SimpleStringSplitter colonSplitter = sStringColonSplitter;
            colonSplitter.setString(enabledServicesSetting);
            while (colonSplitter.hasNext()) {
                String componentNameString = colonSplitter.next();
                ComponentName enabledService = ComponentName.unflattenFromString(
                        componentNameString);
                if (enabledService != null) {
                    enabledServices.add(enabledService);
                }
            }
            Set<ComponentName> enabledServices = getEnabledServicesFromSettings(getActivity());

            // Determine enabled services and accessibility state.
            ComponentName toggledService = ComponentName.unflattenFromString(preferenceKey);