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
This commit is contained in:
Phil Weaver
2018-03-13 10:18:50 -07:00
parent 8837f992bb
commit 6cd554f397
2 changed files with 39 additions and 29 deletions

View File

@@ -4428,6 +4428,10 @@
<string name="accessibility_summary_state_enabled">On</string> <string name="accessibility_summary_state_enabled">On</string>
<!-- Preference's state when disabled. --> <!-- Preference's state when disabled. -->
<string name="accessibility_summary_state_disabled">Off</string> <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] --> <!-- 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> <string name="enable_quick_setting">Show in Quick Settings</string>

View File

@@ -211,7 +211,6 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
private SwitchPreference mToggleDisableAnimationsPreference; private SwitchPreference mToggleDisableAnimationsPreference;
private SwitchPreference mToggleMasterMonoPreference; private SwitchPreference mToggleMasterMonoPreference;
private ListPreference mSelectLongPressTimeoutPreference; private ListPreference mSelectLongPressTimeoutPreference;
private Preference mNoServicesMessagePreference;
private Preference mCaptioningPreferenceScreen; private Preference mCaptioningPreferenceScreen;
private Preference mDisplayMagnificationPreferenceScreen; private Preference mDisplayMagnificationPreferenceScreen;
private Preference mFontSizePreferenceScreen; private Preference mFontSizePreferenceScreen;
@@ -495,12 +494,12 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
List<AccessibilityServiceInfo> installedServices = List<AccessibilityServiceInfo> installedServices =
accessibilityManager.getInstalledAccessibilityServiceList(); accessibilityManager.getInstalledAccessibilityServiceList();
List<AccessibilityServiceInfo> enabledServiceInfos = accessibilityManager
.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_ALL_MASK);
Set<ComponentName> enabledServices = AccessibilityUtils.getEnabledServicesFromSettings( Set<ComponentName> enabledServices = AccessibilityUtils.getEnabledServicesFromSettings(
getActivity()); getActivity());
List<String> permittedServices = mDpm.getPermittedAccessibilityServices( List<String> permittedServices = mDpm.getPermittedAccessibilityServices(
UserHandle.myUserId()); UserHandle.myUserId());
final boolean accessibilityEnabled = Settings.Secure.getInt(getContentResolver(),
Settings.Secure.ACCESSIBILITY_ENABLED, 0) == 1;
PreferenceCategory downloadedServicesCategory = PreferenceCategory downloadedServicesCategory =
mCategoryToPrefCategoryMap.get(CATEGORY_DOWNLOADED_SERVICES); mCategoryToPrefCategoryMap.get(CATEGORY_DOWNLOADED_SERVICES);
@@ -513,7 +512,7 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
final AccessibilityServiceInfo info = installedServices.get(i); final AccessibilityServiceInfo info = installedServices.get(i);
final ResolveInfo resolveInfo = info.getResolveInfo(); final ResolveInfo resolveInfo = info.getResolveInfo();
RestrictedPreference preference = final RestrictedPreference preference =
new RestrictedPreference(downloadedServicesCategory.getContext()); new RestrictedPreference(downloadedServicesCategory.getContext());
final String title = resolveInfo.loadLabel(getPackageManager()).toString(); final String title = resolveInfo.loadLabel(getPackageManager()).toString();
@@ -524,32 +523,44 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
icon = resolveInfo.loadIcon(getPackageManager()); icon = resolveInfo.loadIcon(getPackageManager());
} }
ServiceInfo serviceInfo = resolveInfo.serviceInfo; final ServiceInfo serviceInfo = resolveInfo.serviceInfo;
String packageName = serviceInfo.packageName; final String packageName = serviceInfo.packageName;
ComponentName componentName = new ComponentName(packageName, serviceInfo.name); final ComponentName componentName = new ComponentName(packageName, serviceInfo.name);
preference.setKey(componentName.flattenToString()); preference.setKey(componentName.flattenToString());
preference.setTitle(title); preference.setTitle(title);
Utils.setSafeIcon(preference, icon); Utils.setSafeIcon(preference, icon);
final boolean serviceEnabled = accessibilityEnabled final boolean serviceEnabled = enabledServices.contains(componentName);
&& enabledServices.contains(componentName); String description = info.loadDescription(getPackageManager());
final String serviceState = serviceEnabled ? if (TextUtils.isEmpty(description)) {
getString(R.string.accessibility_summary_state_enabled) : description = getString(R.string.accessibility_service_default_description);
getString(R.string.accessibility_summary_state_disabled); }
final CharSequence serviceSummary = info.loadSummary(getPackageManager());
final String stateSummaryCombo = getString( if (serviceEnabled && AccessibilityUtils.hasServiceCrashed(
R.string.preference_summary_default_combination, packageName, serviceInfo.name, enabledServiceInfos)) {
serviceState, serviceSummary); // Update the summaries for services that have crashed.
preference.setSummary((TextUtils.isEmpty(serviceSummary)) ? serviceState preference.setSummary(R.string.accessibility_summary_state_stopped);
: stateSummaryCombo); 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);
final CharSequence serviceSummary = info.loadSummary(getPackageManager());
final String stateSummaryCombo = getString(
R.string.preference_summary_default_combination,
serviceState, serviceSummary);
preference.setSummary((TextUtils.isEmpty(serviceSummary)) ? serviceState
: stateSummaryCombo);
}
// Disable all accessibility services that are not permitted. // Disable all accessibility services that are not permitted.
boolean serviceAllowed = final boolean serviceAllowed =
permittedServices == null || permittedServices.contains(packageName); permittedServices == null || permittedServices.contains(packageName);
if (!serviceAllowed && !serviceEnabled) { if (!serviceAllowed && !serviceEnabled) {
EnforcedAdmin admin = RestrictedLockUtils.checkIfAccessibilityServiceDisallowed( final EnforcedAdmin admin =
getActivity(), packageName, UserHandle.myUserId()); RestrictedLockUtils.checkIfAccessibilityServiceDisallowed(
getActivity(), packageName, UserHandle.myUserId());
if (admin != null) { if (admin != null) {
preference.setDisabledByAdmin(admin); preference.setDisabledByAdmin(admin);
} else { } else {
@@ -562,19 +573,14 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
preference.setFragment(ToggleAccessibilityServicePreferenceFragment.class.getName()); preference.setFragment(ToggleAccessibilityServicePreferenceFragment.class.getName());
preference.setPersistent(true); preference.setPersistent(true);
Bundle extras = preference.getExtras(); final Bundle extras = preference.getExtras();
extras.putString(EXTRA_PREFERENCE_KEY, preference.getKey()); extras.putString(EXTRA_PREFERENCE_KEY, preference.getKey());
extras.putBoolean(EXTRA_CHECKED, serviceEnabled); extras.putBoolean(EXTRA_CHECKED, serviceEnabled);
extras.putString(EXTRA_TITLE, title); extras.putString(EXTRA_TITLE, title);
extras.putParcelable(EXTRA_RESOLVE_INFO, resolveInfo); 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); extras.putString(EXTRA_SUMMARY, description);
String settingsClassName = info.getSettingsActivityName(); final String settingsClassName = info.getSettingsActivityName();
if (!TextUtils.isEmpty(settingsClassName)) { if (!TextUtils.isEmpty(settingsClassName)) {
extras.putString(EXTRA_SETTINGS_TITLE, extras.putString(EXTRA_SETTINGS_TITLE,
getString(R.string.accessibility_menu_item_settings)); 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 the user has not installed any additional services, hide the category.
if (downloadedServicesCategory.getPreferenceCount() == 0) { if (downloadedServicesCategory.getPreferenceCount() == 0) {
PreferenceScreen screen = getPreferenceScreen(); final PreferenceScreen screen = getPreferenceScreen();
screen.removePreference(downloadedServicesCategory); screen.removePreference(downloadedServicesCategory);
} }
} }