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:
@@ -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>
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user