diff --git a/res/layout/enable_accessibility_service_dialog_content.xml b/res/layout/enable_accessibility_service_dialog_content.xml
new file mode 100644
index 00000000000..fbeeb27291c
--- /dev/null
+++ b/res/layout/enable_accessibility_service_dialog_content.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 665959aa73a..32b30a05d80 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -3181,30 +3181,24 @@
Off
-
- Use
+
+ Use
%1$s?
-
-
- %1$s can
- collect all of the text you type, except passwords. This includes personal data such as credit card
- numbers. It can also collect data about your interactions with the tablet.
-
-
- %1$s can
- collect all of the text you type, except passwords. This includes personal data such as credit card
- numbers. It can also collect data about your interactions with the phone.
+
+ %1$s
+ needs to:
-
- Stop
- %1$s?
-
- Touching OK will
+
+ Observe your actions
+
+ Receive notifications when you\'re
+ interacting with an app.
+
+
+ Stop%1$s?
+
+ Touching OK will
stop %1$s.
diff --git a/src/com/android/settings/AccessibilitySettings.java b/src/com/android/settings/AccessibilitySettings.java
index ec0089239f3..fb0a4292b81 100644
--- a/src/com/android/settings/AccessibilitySettings.java
+++ b/src/com/android/settings/AccessibilitySettings.java
@@ -50,12 +50,14 @@ import android.text.TextUtils.SimpleStringSplitter;
import android.view.Gravity;
import android.view.KeyCharacterMap;
import android.view.KeyEvent;
+import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
+import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Switch;
import android.widget.TextView;
@@ -118,13 +120,9 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
private static final String EXTRA_CHECKED = "checked";
private static final String EXTRA_TITLE = "title";
private static final String EXTRA_SUMMARY = "summary";
- private static final String EXTRA_ENABLE_WARNING_TITLE = "enable_warning_title";
- private static final String EXTRA_ENABLE_WARNING_MESSAGE = "enable_warning_message";
- private static final String EXTRA_DISABLE_WARNING_TITLE = "disable_warning_title";
- private static final String EXTRA_DISABLE_WARNING_MESSAGE = "disable_warning_message";
private static final String EXTRA_SETTINGS_TITLE = "settings_title";
private static final String EXTRA_SETTINGS_COMPONENT_NAME = "settings_component_name";
- private static final String EXTRA_SERVICE_COMPONENT_NAME = "service_component_name";
+ private static final String EXTRA_ACCESSIBILITY_SERVICE_INFO = "accessibility_service_info";
// Dialog IDs.
private static final int DIALOG_ID_NO_ACCESSIBILITY_SERVICES = 1;
@@ -409,20 +407,6 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
}
extras.putString(EXTRA_SUMMARY, description);
- CharSequence applicationLabel = info.getResolveInfo().loadLabel(getPackageManager());
-
- extras.putString(EXTRA_ENABLE_WARNING_TITLE, getString(
- R.string.accessibility_service_security_warning_title, applicationLabel));
- extras.putString(EXTRA_ENABLE_WARNING_MESSAGE, getString(
- R.string.accessibility_service_security_warning_summary, applicationLabel));
-
- extras.putString(EXTRA_DISABLE_WARNING_TITLE, getString(
- R.string.accessibility_service_disable_warning_title,
- applicationLabel));
- extras.putString(EXTRA_DISABLE_WARNING_MESSAGE, getString(
- R.string.accessibility_service_disable_warning_summary,
- applicationLabel));
-
String settingsClassName = info.getSettingsActivityName();
if (!TextUtils.isEmpty(settingsClassName)) {
extras.putString(EXTRA_SETTINGS_TITLE,
@@ -432,7 +416,7 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
settingsClassName).flattenToString());
}
- extras.putString(EXTRA_SERVICE_COMPONENT_NAME, componentName.flattenToString());
+ extras.putParcelable(EXTRA_ACCESSIBILITY_SERVICE_INFO, info);
mServicesCategory.addPreference(preference);
}
@@ -698,10 +682,7 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
}
};
- private CharSequence mEnableWarningTitle;
- private CharSequence mEnableWarningMessage;
- private CharSequence mDisableWarningTitle;
- private CharSequence mDisableWarningMessage;
+ private AccessibilityServiceInfo mAccessibilityServiceInfo;
private String mComponentName;
@@ -767,32 +748,113 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
Settings.Secure.ACCESSIBILITY_ENABLED, accessibilityEnabled ? 1 : 0);
}
+// extras.putString(EXTRA_ENABLE_WARNING_TITLE, getString(
+// R.string.accessibility_service_security_warning_title, applicationLabel));
+// extras.putString(EXTRA_ENABLE_WARNING_MESSAGE, getString(
+// R.string.accessibility_service_security_warning_summary, applicationLabel));
+//
+// extras.putString(EXTRA_DISABLE_WARNING_TITLE, getString(
+// R.string.accessibility_service_disable_warning_title,
+// applicationLabel));
+// extras.putString(EXTRA_DISABLE_WARNING_MESSAGE, getString(
+// R.string.accessibility_service_disable_warning_summary,
+// applicationLabel));
+
@Override
public Dialog onCreateDialog(int dialogId) {
- CharSequence title = null;
- CharSequence message = null;
switch (dialogId) {
case DIALOG_ID_ENABLE_WARNING:
mShownDialogId = DIALOG_ID_ENABLE_WARNING;
- title = mEnableWarningTitle;
- message = mEnableWarningMessage;
- break;
+ return new AlertDialog.Builder(getActivity())
+ .setTitle(getString(R.string.enable_service_title,
+ mAccessibilityServiceInfo.getResolveInfo()
+ .loadLabel(getPackageManager())))
+ .setIconAttribute(android.R.attr.alertDialogIcon)
+ .setView(createEnableDialogContentView())
+ .setCancelable(true)
+ .setPositiveButton(android.R.string.ok, this)
+ .setNegativeButton(android.R.string.cancel, this)
+ .create();
case DIALOG_ID_DISABLE_WARNING:
mShownDialogId = DIALOG_ID_DISABLE_WARNING;
- title = mDisableWarningTitle;
- message = mDisableWarningMessage;
- break;
+ return new AlertDialog.Builder(getActivity())
+ .setTitle(getString(R.string.disable_service_title,
+ mAccessibilityServiceInfo.getResolveInfo()
+ .loadLabel(getPackageManager())))
+ .setIconAttribute(android.R.attr.alertDialogIcon)
+ .setMessage(getString(R.string.disable_service_message,
+ mAccessibilityServiceInfo.getResolveInfo()
+ .loadLabel(getPackageManager())))
+ .setCancelable(true)
+ .setPositiveButton(android.R.string.ok, this)
+ .setNegativeButton(android.R.string.cancel, this)
+ .create();
default:
throw new IllegalArgumentException();
}
- return new AlertDialog.Builder(getActivity())
- .setTitle(title)
- .setIconAttribute(android.R.attr.alertDialogIcon)
- .setMessage(message)
- .setCancelable(true)
- .setPositiveButton(android.R.string.ok, this)
- .setNegativeButton(android.R.string.cancel, this)
- .create();
+ }
+
+ private View createEnableDialogContentView() {
+ LayoutInflater inflater = (LayoutInflater) getSystemService(
+ Context.LAYOUT_INFLATER_SERVICE);
+
+ View content = inflater.inflate(R.layout.enable_accessibility_service_dialog_content,
+ null);
+
+ TextView capabilitiesHeaderView = (TextView) content.findViewById(
+ R.id.capabilities_header);
+ capabilitiesHeaderView.setText(getString(R.string.capabilities_list_title,
+ mAccessibilityServiceInfo.getResolveInfo().loadLabel(getPackageManager())));
+
+ LinearLayout capabilitiesView = (LinearLayout) content.findViewById(R.id.capabilities);
+
+ // This capability is implicit for all services.
+ View capabilityView = inflater.inflate(
+ com.android.internal.R.layout.app_permission_item_old, null);
+
+ ImageView imageView = (ImageView) capabilityView.findViewById(
+ com.android.internal.R.id.perm_icon);
+ imageView.setImageDrawable(getResources().getDrawable(
+ com.android.internal.R.drawable.ic_text_dot));
+
+ TextView labelView = (TextView) capabilityView.findViewById(
+ com.android.internal.R.id.permission_group);
+ labelView.setText(getString(R.string.capability_title_receiveAccessibilityEvents));
+
+ TextView descriptionView = (TextView) capabilityView.findViewById(
+ com.android.internal.R.id.permission_list);
+ descriptionView.setText(getString(R.string.capability_desc_receiveAccessibilityEvents));
+
+ List capabilities =
+ mAccessibilityServiceInfo.getCapabilityInfos();
+
+ capabilitiesView.addView(capabilityView);
+
+ // Service specific capabilities.
+ final int capabilityCount = capabilities.size();
+ for (int i = 0; i < capabilityCount; i++) {
+ AccessibilityServiceInfo.CapabilityInfo capability = capabilities.get(i);
+
+ capabilityView = inflater.inflate(
+ com.android.internal.R.layout.app_permission_item_old, null);
+
+ imageView = (ImageView) capabilityView.findViewById(
+ com.android.internal.R.id.perm_icon);
+ imageView.setImageDrawable(getResources().getDrawable(
+ com.android.internal.R.drawable.ic_text_dot));
+
+ labelView = (TextView) capabilityView.findViewById(
+ com.android.internal.R.id.permission_group);
+ labelView.setText(getString(capability.titleResId));
+
+ descriptionView = (TextView) capabilityView.findViewById(
+ com.android.internal.R.id.permission_list);
+ descriptionView.setText(getString(capability.descResId));
+
+ capabilitiesView.addView(capabilityView);
+ }
+
+ return content;
}
@Override
@@ -823,23 +885,15 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
@Override
public boolean onBeforeCheckedChanged(ToggleSwitch toggleSwitch, boolean checked) {
if (checked) {
- if (!TextUtils.isEmpty(mEnableWarningMessage)) {
- toggleSwitch.setCheckedInternal(false);
- getArguments().putBoolean(EXTRA_CHECKED, false);
- showDialog(DIALOG_ID_ENABLE_WARNING);
- return true;
- }
- onPreferenceToggled(mPreferenceKey, true);
+ toggleSwitch.setCheckedInternal(false);
+ getArguments().putBoolean(EXTRA_CHECKED, false);
+ showDialog(DIALOG_ID_ENABLE_WARNING);
} else {
- if (!TextUtils.isEmpty(mDisableWarningMessage)) {
- toggleSwitch.setCheckedInternal(true);
- getArguments().putBoolean(EXTRA_CHECKED, true);
- showDialog(DIALOG_ID_DISABLE_WARNING);
- return true;
- }
- onPreferenceToggled(mPreferenceKey, false);
+ toggleSwitch.setCheckedInternal(true);
+ getArguments().putBoolean(EXTRA_CHECKED, true);
+ showDialog(DIALOG_ID_DISABLE_WARNING);
}
- return false;
+ return true;
}
});
}
@@ -859,20 +913,12 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
setHasOptionsMenu(true);
}
}
- // Enable warning title.
- mEnableWarningTitle = arguments.getCharSequence(
- AccessibilitySettings.EXTRA_ENABLE_WARNING_TITLE);
- // Enable warning message.
- mEnableWarningMessage = arguments.getCharSequence(
- AccessibilitySettings.EXTRA_ENABLE_WARNING_MESSAGE);
- // Disable warning title.
- mDisableWarningTitle = arguments.getString(
- AccessibilitySettings.EXTRA_DISABLE_WARNING_TITLE);
- // Disable warning message.
- mDisableWarningMessage = arguments.getString(
- AccessibilitySettings.EXTRA_DISABLE_WARNING_MESSAGE);
- // Component name.
- mComponentName = arguments.getString(EXTRA_SERVICE_COMPONENT_NAME);
+
+ mAccessibilityServiceInfo = arguments.getParcelable(EXTRA_ACCESSIBILITY_SERVICE_INFO);
+
+ ServiceInfo serviceInfo = mAccessibilityServiceInfo.getResolveInfo().serviceInfo;
+ mComponentName = new ComponentName(serviceInfo.packageName,
+ serviceInfo.name).flattenToString();
}
}