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

Commit 6cd554f3 authored by Phil Weaver's avatar Phil Weaver
Browse files

Indicate when accessibility services have stopped

Bug: 35219990
Test: Created an accessibility service that crashes, and
then verified that the new status is reflected in
Settings.
Change-Id: I676c8e87f7642366a51b139f46cf8e3094a58d50
parent 8837f992
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -4428,6 +4428,10 @@
    <string name="accessibility_summary_state_enabled">On</string>
    <!-- Preference's state when disabled. -->
    <string name="accessibility_summary_state_disabled">Off</string>
    <!-- Accessibility service's preference's state when enabled but not running (like maybe it crashed). -->
    <string name="accessibility_summary_state_stopped">Not working. Tap for info.</string>
    <!-- Accessibility service's description when enabled but not running (like maybe it crashed). -->
    <string name="accessibility_description_state_stopped">This service is malfunctioning.</string>
    <!-- Title for the preference to show a tile for a particular feature in the Quick Settings pane. [CHAR LIMIT=NONE] -->
    <string name="enable_quick_setting">Show in Quick Settings</string>
+35 −29
Original line number Diff line number Diff line
@@ -211,7 +211,6 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
    private SwitchPreference mToggleDisableAnimationsPreference;
    private SwitchPreference mToggleMasterMonoPreference;
    private ListPreference mSelectLongPressTimeoutPreference;
    private Preference mNoServicesMessagePreference;
    private Preference mCaptioningPreferenceScreen;
    private Preference mDisplayMagnificationPreferenceScreen;
    private Preference mFontSizePreferenceScreen;
@@ -495,12 +494,12 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements

        List<AccessibilityServiceInfo> installedServices =
                accessibilityManager.getInstalledAccessibilityServiceList();
        List<AccessibilityServiceInfo> enabledServiceInfos = accessibilityManager
                .getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_ALL_MASK);
        Set<ComponentName> enabledServices = AccessibilityUtils.getEnabledServicesFromSettings(
                getActivity());
        List<String> permittedServices = mDpm.getPermittedAccessibilityServices(
                UserHandle.myUserId());
        final boolean accessibilityEnabled = Settings.Secure.getInt(getContentResolver(),
                Settings.Secure.ACCESSIBILITY_ENABLED, 0) == 1;

        PreferenceCategory downloadedServicesCategory =
                mCategoryToPrefCategoryMap.get(CATEGORY_DOWNLOADED_SERVICES);
@@ -513,7 +512,7 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
            final AccessibilityServiceInfo info = installedServices.get(i);
            final ResolveInfo resolveInfo = info.getResolveInfo();

            RestrictedPreference preference =
            final RestrictedPreference preference =
                    new RestrictedPreference(downloadedServicesCategory.getContext());
            final String title = resolveInfo.loadLabel(getPackageManager()).toString();

@@ -524,16 +523,26 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
                icon = resolveInfo.loadIcon(getPackageManager());
            }

            ServiceInfo serviceInfo = resolveInfo.serviceInfo;
            String packageName = serviceInfo.packageName;
            ComponentName componentName = new ComponentName(packageName, serviceInfo.name);
            final ServiceInfo serviceInfo = resolveInfo.serviceInfo;
            final String packageName = serviceInfo.packageName;
            final ComponentName componentName = new ComponentName(packageName, serviceInfo.name);

            preference.setKey(componentName.flattenToString());

            preference.setTitle(title);
            Utils.setSafeIcon(preference, icon);
            final boolean serviceEnabled = accessibilityEnabled
                    && enabledServices.contains(componentName);
            final boolean serviceEnabled = enabledServices.contains(componentName);
            String description = info.loadDescription(getPackageManager());
            if (TextUtils.isEmpty(description)) {
                description = getString(R.string.accessibility_service_default_description);
            }

            if (serviceEnabled && AccessibilityUtils.hasServiceCrashed(
                    packageName, serviceInfo.name, enabledServiceInfos)) {
                // Update the summaries for services that have crashed.
                preference.setSummary(R.string.accessibility_summary_state_stopped);
                description = getString(R.string.accessibility_description_state_stopped);
            } else {
                final String serviceState = serviceEnabled ?
                        getString(R.string.accessibility_summary_state_enabled) :
                        getString(R.string.accessibility_summary_state_disabled);
@@ -543,12 +552,14 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
                        serviceState, serviceSummary);
                preference.setSummary((TextUtils.isEmpty(serviceSummary)) ? serviceState
                        : stateSummaryCombo);
            }

            // Disable all accessibility services that are not permitted.
            boolean serviceAllowed =
            final boolean serviceAllowed =
                    permittedServices == null || permittedServices.contains(packageName);
            if (!serviceAllowed && !serviceEnabled) {
                EnforcedAdmin admin = RestrictedLockUtils.checkIfAccessibilityServiceDisallowed(
                final EnforcedAdmin admin =
                        RestrictedLockUtils.checkIfAccessibilityServiceDisallowed(
                                getActivity(), packageName, UserHandle.myUserId());
                if (admin != null) {
                    preference.setDisabledByAdmin(admin);
@@ -562,19 +573,14 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
            preference.setFragment(ToggleAccessibilityServicePreferenceFragment.class.getName());
            preference.setPersistent(true);

            Bundle extras = preference.getExtras();
            final Bundle extras = preference.getExtras();
            extras.putString(EXTRA_PREFERENCE_KEY, preference.getKey());
            extras.putBoolean(EXTRA_CHECKED, serviceEnabled);
            extras.putString(EXTRA_TITLE, title);
            extras.putParcelable(EXTRA_RESOLVE_INFO, resolveInfo);

            String description = info.loadDescription(getPackageManager());
            if (TextUtils.isEmpty(description)) {
                description = getString(R.string.accessibility_service_default_description);
            }
            extras.putString(EXTRA_SUMMARY, description);

            String settingsClassName = info.getSettingsActivityName();
            final String settingsClassName = info.getSettingsActivityName();
            if (!TextUtils.isEmpty(settingsClassName)) {
                extras.putString(EXTRA_SETTINGS_TITLE,
                        getString(R.string.accessibility_menu_item_settings));
@@ -595,7 +601,7 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements

        // If the user has not installed any additional services, hide the category.
        if (downloadedServicesCategory.getPreferenceCount() == 0) {
            PreferenceScreen screen = getPreferenceScreen();
            final PreferenceScreen screen = getPreferenceScreen();
            screen.removePreference(downloadedServicesCategory);
        }
    }