The touch exploration capability is dynamically granted pre-JellyBeanMR2.

Since the enable touch exploration capability is dynamically granted by
the user for apps targeting pre-JellybeanMR2 API level, we have to avoid
caching copies of the service info.

Framework change:https://googleplex-android-review.googlesource.com/#/c/301722

bug:8633951

Change-Id: I2b409ca92931d1409e885d6f54e0f10cbece2e80
This commit is contained in:
Svetoslav
2013-04-24 15:03:41 -07:00
parent 5e9bd86bc6
commit 5467207b47

View File

@@ -121,8 +121,8 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
private static final String EXTRA_TITLE = "title"; private static final String EXTRA_TITLE = "title";
private static final String EXTRA_SUMMARY = "summary"; private static final String EXTRA_SUMMARY = "summary";
private static final String EXTRA_SETTINGS_TITLE = "settings_title"; private static final String EXTRA_SETTINGS_TITLE = "settings_title";
private static final String EXTRA_COMPONENT_NAME = "component_name";
private static final String EXTRA_SETTINGS_COMPONENT_NAME = "settings_component_name"; private static final String EXTRA_SETTINGS_COMPONENT_NAME = "settings_component_name";
private static final String EXTRA_ACCESSIBILITY_SERVICE_INFO = "accessibility_service_info";
// Dialog IDs. // Dialog IDs.
private static final int DIALOG_ID_NO_ACCESSIBILITY_SERVICES = 1; private static final int DIALOG_ID_NO_ACCESSIBILITY_SERVICES = 1;
@@ -416,7 +416,7 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
settingsClassName).flattenToString()); settingsClassName).flattenToString());
} }
extras.putParcelable(EXTRA_ACCESSIBILITY_SERVICE_INFO, info); extras.putParcelable(EXTRA_COMPONENT_NAME, componentName);
mServicesCategory.addPreference(preference); mServicesCategory.addPreference(preference);
} }
@@ -677,14 +677,12 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
public void onChange(boolean selfChange, Uri uri) { public void onChange(boolean selfChange, Uri uri) {
String settingValue = Settings.Secure.getString(getContentResolver(), String settingValue = Settings.Secure.getString(getContentResolver(),
Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES); Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
final boolean enabled = settingValue.contains(mComponentName); final boolean enabled = settingValue.contains(mComponentName.flattenToString());
mToggleSwitch.setCheckedInternal(enabled); mToggleSwitch.setCheckedInternal(enabled);
} }
}; };
private AccessibilityServiceInfo mAccessibilityServiceInfo; private ComponentName mComponentName;
private String mComponentName;
private int mShownDialogId; private int mShownDialogId;
@@ -748,53 +746,66 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
Settings.Secure.ACCESSIBILITY_ENABLED, accessibilityEnabled ? 1 : 0); Settings.Secure.ACCESSIBILITY_ENABLED, accessibilityEnabled ? 1 : 0);
} }
// extras.putString(EXTRA_ENABLE_WARNING_TITLE, getString( // IMPORTANT: Refresh the info since there are dynamically changing capabilities. For
// R.string.accessibility_service_security_warning_title, applicationLabel)); // example, before JellyBean MR2 the user was granting the explore by touch one.
// extras.putString(EXTRA_ENABLE_WARNING_MESSAGE, getString( private AccessibilityServiceInfo getAccessibilityServiceInfo() {
// R.string.accessibility_service_security_warning_summary, applicationLabel)); List<AccessibilityServiceInfo> serviceInfos = AccessibilityManager.getInstance(
// getActivity()).getInstalledAccessibilityServiceList();
// extras.putString(EXTRA_DISABLE_WARNING_TITLE, getString( final int serviceInfoCount = serviceInfos.size();
// R.string.accessibility_service_disable_warning_title, for (int i = 0; i < serviceInfoCount; i++) {
// applicationLabel)); AccessibilityServiceInfo serviceInfo = serviceInfos.get(i);
// extras.putString(EXTRA_DISABLE_WARNING_MESSAGE, getString( ResolveInfo resolveInfo = serviceInfo.getResolveInfo();
// R.string.accessibility_service_disable_warning_summary, if (mComponentName.getPackageName().equals(resolveInfo.serviceInfo.packageName)
// applicationLabel)); && mComponentName.getClassName().equals(resolveInfo.serviceInfo.name)) {
return serviceInfo;
}
}
return null;
}
@Override @Override
public Dialog onCreateDialog(int dialogId) { public Dialog onCreateDialog(int dialogId) {
switch (dialogId) { switch (dialogId) {
case DIALOG_ID_ENABLE_WARNING: case DIALOG_ID_ENABLE_WARNING: {
mShownDialogId = DIALOG_ID_ENABLE_WARNING; mShownDialogId = DIALOG_ID_ENABLE_WARNING;
AccessibilityServiceInfo info = getAccessibilityServiceInfo();
if (info == null) {
return null;
}
return new AlertDialog.Builder(getActivity()) return new AlertDialog.Builder(getActivity())
.setTitle(getString(R.string.enable_service_title, .setTitle(getString(R.string.enable_service_title,
mAccessibilityServiceInfo.getResolveInfo() info.getResolveInfo().loadLabel(getPackageManager())))
.loadLabel(getPackageManager())))
.setIconAttribute(android.R.attr.alertDialogIcon) .setIconAttribute(android.R.attr.alertDialogIcon)
.setView(createEnableDialogContentView()) .setView(createEnableDialogContentView(info))
.setCancelable(true) .setCancelable(true)
.setPositiveButton(android.R.string.ok, this) .setPositiveButton(android.R.string.ok, this)
.setNegativeButton(android.R.string.cancel, this) .setNegativeButton(android.R.string.cancel, this)
.create(); .create();
case DIALOG_ID_DISABLE_WARNING: }
case DIALOG_ID_DISABLE_WARNING: {
mShownDialogId = DIALOG_ID_DISABLE_WARNING; mShownDialogId = DIALOG_ID_DISABLE_WARNING;
AccessibilityServiceInfo info = getAccessibilityServiceInfo();
if (info == null) {
return null;
}
return new AlertDialog.Builder(getActivity()) return new AlertDialog.Builder(getActivity())
.setTitle(getString(R.string.disable_service_title, .setTitle(getString(R.string.disable_service_title,
mAccessibilityServiceInfo.getResolveInfo() info.getResolveInfo().loadLabel(getPackageManager())))
.loadLabel(getPackageManager())))
.setIconAttribute(android.R.attr.alertDialogIcon) .setIconAttribute(android.R.attr.alertDialogIcon)
.setMessage(getString(R.string.disable_service_message, .setMessage(getString(R.string.disable_service_message,
mAccessibilityServiceInfo.getResolveInfo() info.getResolveInfo().loadLabel(getPackageManager())))
.loadLabel(getPackageManager())))
.setCancelable(true) .setCancelable(true)
.setPositiveButton(android.R.string.ok, this) .setPositiveButton(android.R.string.ok, this)
.setNegativeButton(android.R.string.cancel, this) .setNegativeButton(android.R.string.cancel, this)
.create(); .create();
default: }
default: {
throw new IllegalArgumentException(); throw new IllegalArgumentException();
}
} }
} }
private View createEnableDialogContentView() { private View createEnableDialogContentView(AccessibilityServiceInfo info) {
LayoutInflater inflater = (LayoutInflater) getSystemService( LayoutInflater inflater = (LayoutInflater) getSystemService(
Context.LAYOUT_INFLATER_SERVICE); Context.LAYOUT_INFLATER_SERVICE);
@@ -804,7 +815,7 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
TextView capabilitiesHeaderView = (TextView) content.findViewById( TextView capabilitiesHeaderView = (TextView) content.findViewById(
R.id.capabilities_header); R.id.capabilities_header);
capabilitiesHeaderView.setText(getString(R.string.capabilities_list_title, capabilitiesHeaderView.setText(getString(R.string.capabilities_list_title,
mAccessibilityServiceInfo.getResolveInfo().loadLabel(getPackageManager()))); info.getResolveInfo().loadLabel(getPackageManager())));
LinearLayout capabilitiesView = (LinearLayout) content.findViewById(R.id.capabilities); LinearLayout capabilitiesView = (LinearLayout) content.findViewById(R.id.capabilities);
@@ -826,7 +837,7 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
descriptionView.setText(getString(R.string.capability_desc_receiveAccessibilityEvents)); descriptionView.setText(getString(R.string.capability_desc_receiveAccessibilityEvents));
List<AccessibilityServiceInfo.CapabilityInfo> capabilities = List<AccessibilityServiceInfo.CapabilityInfo> capabilities =
mAccessibilityServiceInfo.getCapabilityInfos(); info.getCapabilityInfos();
capabilitiesView.addView(capabilityView); capabilitiesView.addView(capabilityView);
@@ -914,11 +925,7 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
} }
} }
mAccessibilityServiceInfo = arguments.getParcelable(EXTRA_ACCESSIBILITY_SERVICE_INFO); mComponentName = arguments.getParcelable(EXTRA_COMPONENT_NAME);
ServiceInfo serviceInfo = mAccessibilityServiceInfo.getResolveInfo().serviceInfo;
mComponentName = new ComponentName(serviceInfo.packageName,
serviceInfo.name).flattenToString();
} }
} }