Merge "Replacing accessibility service permissions with capability attributes." into jb-mr2-dev
This commit is contained in:
45
res/layout/enable_accessibility_service_dialog_content.xml
Normal file
45
res/layout/enable_accessibility_service_dialog_content.xml
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Copyright (C) 2013 The Android Open Source Project
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<ScrollView
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="fill_parent"
|
||||||
|
android:scrollbarStyle="outsideOverlay"
|
||||||
|
android:gravity="top">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:paddingStart="16dip"
|
||||||
|
android:paddingEnd="16dip" >
|
||||||
|
|
||||||
|
<TextView android:id="@+id/capabilities_header"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:padding="10dip"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceMedium" />
|
||||||
|
|
||||||
|
<LinearLayout android:id="@+id/capabilities"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:padding="10dip" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</ScrollView>
|
@@ -3181,30 +3181,24 @@
|
|||||||
<!-- Summary for the disabled state of an accessiblity feature. [CHAR LIMIT=10] -->
|
<!-- Summary for the disabled state of an accessiblity feature. [CHAR LIMIT=10] -->
|
||||||
<string name="accessibility_feature_state_off">Off</string>
|
<string name="accessibility_feature_state_off">Off</string>
|
||||||
|
|
||||||
<!-- Title for a warning message about security implications of enabling an accessibility service,
|
<!-- Title for a warning about security implications of enabling an accessibility
|
||||||
displayed as a dialog message when the user selects to enable an accessibility service (tablet). [CHAR LIMIT=NONE] -->
|
service. [CHAR LIMIT=NONE] -->
|
||||||
<string name="accessibility_service_security_warning_title">Use
|
<string name="enable_service_title">Use
|
||||||
<xliff:g id="service" example="TalkBack">%1$s</xliff:g>?</string>
|
<xliff:g id="service" example="TalkBack">%1$s</xliff:g>?</string>
|
||||||
<!-- Summary for a warning message about security implications of enabling an accessibility service,
|
<!-- Title for the list of capabilities of an accessibility service. -->
|
||||||
displayed as a dialog message when the user selects to enable an accessibility service (tablet). [CHAR LIMIT=NONE] -->
|
<string name="capabilities_list_title"><xliff:g id="service" example="TalkBack">%1$s</xliff:g>
|
||||||
<string name="accessibility_service_security_warning_summary" product="tablet">
|
needs to:</string>
|
||||||
<xliff:g id="accessibility_service_name">%1$s</xliff:g> 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.</string>
|
|
||||||
<!-- Summary for a warning message about security implications of enabling an accessibility service,
|
|
||||||
displayed as a dialog message when the user selects to enable an accessibility service (phone). [CHAR LIMIT=NONE] -->
|
|
||||||
<string name="accessibility_service_security_warning_summary" product="default">
|
|
||||||
<xliff:g id="accessibility_service_name">%1$s</xliff:g> 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.</string>
|
|
||||||
|
|
||||||
<!-- Title for a warning about disabling an accessibility service displayed as a dialog message when the user
|
<!-- Title for the capability of an accessibility service to receive events and keys. -->
|
||||||
selects to disable that service. This avoids accidental disabling. [CHAR LIMIT=NONE] -->
|
<string name="capability_title_receiveAccessibilityEvents">Observe your actions</string>
|
||||||
<string name="accessibility_service_disable_warning_title">Stop
|
<!-- Description for the capability of an accessibility service to receive events and keys. -->
|
||||||
<xliff:g id="service" example="TalkBack">%1$s</xliff:g>?</string>
|
<string name="capability_desc_receiveAccessibilityEvents">Receive notifications when you\'re
|
||||||
<!-- Summary for a warning about disabling accessibility service displayed as a dialog message when the user
|
interacting with an app.</string>
|
||||||
selects to disable that service. This avoids accidental disabling. [CHAR LIMIT=NONE] -->
|
|
||||||
<string name="accessibility_service_disable_warning_summary">Touching OK will
|
<!-- Title for a warning about disabling an accessibility service. [CHAR LIMIT=NONE] -->
|
||||||
|
<string name="disable_service_title">Stop<xliff:g id="service" example="TalkBack">%1$s</xliff:g>?</string>
|
||||||
|
<!-- Message for a warning about disabling accessibility service. [CHAR LIMIT=NONE] -->
|
||||||
|
<string name="disable_service_message">Touching OK will
|
||||||
stop <xliff:g id="service" example="TalkBack">%1$s</xliff:g>.</string>
|
stop <xliff:g id="service" example="TalkBack">%1$s</xliff:g>.</string>
|
||||||
|
|
||||||
<!-- Title for the prompt shown as a placeholder if no accessibility serivices are installed. [CHAR LIMIT=50] -->
|
<!-- Title for the prompt shown as a placeholder if no accessibility serivices are installed. [CHAR LIMIT=50] -->
|
||||||
|
@@ -50,12 +50,14 @@ import android.text.TextUtils.SimpleStringSplitter;
|
|||||||
import android.view.Gravity;
|
import android.view.Gravity;
|
||||||
import android.view.KeyCharacterMap;
|
import android.view.KeyCharacterMap;
|
||||||
import android.view.KeyEvent;
|
import android.view.KeyEvent;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuInflater;
|
import android.view.MenuInflater;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.accessibility.AccessibilityEvent;
|
import android.view.accessibility.AccessibilityEvent;
|
||||||
import android.view.accessibility.AccessibilityManager;
|
import android.view.accessibility.AccessibilityManager;
|
||||||
|
import android.widget.ImageView;
|
||||||
import android.widget.LinearLayout;
|
import android.widget.LinearLayout;
|
||||||
import android.widget.Switch;
|
import android.widget.Switch;
|
||||||
import android.widget.TextView;
|
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_CHECKED = "checked";
|
||||||
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_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_TITLE = "settings_title";
|
||||||
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_SERVICE_COMPONENT_NAME = "service_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;
|
||||||
@@ -409,20 +407,6 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
|
|||||||
}
|
}
|
||||||
extras.putString(EXTRA_SUMMARY, description);
|
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();
|
String settingsClassName = info.getSettingsActivityName();
|
||||||
if (!TextUtils.isEmpty(settingsClassName)) {
|
if (!TextUtils.isEmpty(settingsClassName)) {
|
||||||
extras.putString(EXTRA_SETTINGS_TITLE,
|
extras.putString(EXTRA_SETTINGS_TITLE,
|
||||||
@@ -432,7 +416,7 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
|
|||||||
settingsClassName).flattenToString());
|
settingsClassName).flattenToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
extras.putString(EXTRA_SERVICE_COMPONENT_NAME, componentName.flattenToString());
|
extras.putParcelable(EXTRA_ACCESSIBILITY_SERVICE_INFO, info);
|
||||||
|
|
||||||
mServicesCategory.addPreference(preference);
|
mServicesCategory.addPreference(preference);
|
||||||
}
|
}
|
||||||
@@ -698,10 +682,7 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private CharSequence mEnableWarningTitle;
|
private AccessibilityServiceInfo mAccessibilityServiceInfo;
|
||||||
private CharSequence mEnableWarningMessage;
|
|
||||||
private CharSequence mDisableWarningTitle;
|
|
||||||
private CharSequence mDisableWarningMessage;
|
|
||||||
|
|
||||||
private String mComponentName;
|
private String mComponentName;
|
||||||
|
|
||||||
@@ -767,32 +748,113 @@ 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(
|
||||||
|
// 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
|
@Override
|
||||||
public Dialog onCreateDialog(int dialogId) {
|
public Dialog onCreateDialog(int dialogId) {
|
||||||
CharSequence title = null;
|
|
||||||
CharSequence message = null;
|
|
||||||
switch (dialogId) {
|
switch (dialogId) {
|
||||||
case DIALOG_ID_ENABLE_WARNING:
|
case DIALOG_ID_ENABLE_WARNING:
|
||||||
mShownDialogId = DIALOG_ID_ENABLE_WARNING;
|
mShownDialogId = DIALOG_ID_ENABLE_WARNING;
|
||||||
title = mEnableWarningTitle;
|
return new AlertDialog.Builder(getActivity())
|
||||||
message = mEnableWarningMessage;
|
.setTitle(getString(R.string.enable_service_title,
|
||||||
break;
|
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:
|
case DIALOG_ID_DISABLE_WARNING:
|
||||||
mShownDialogId = DIALOG_ID_DISABLE_WARNING;
|
mShownDialogId = DIALOG_ID_DISABLE_WARNING;
|
||||||
title = mDisableWarningTitle;
|
return new AlertDialog.Builder(getActivity())
|
||||||
message = mDisableWarningMessage;
|
.setTitle(getString(R.string.disable_service_title,
|
||||||
break;
|
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:
|
default:
|
||||||
throw new IllegalArgumentException();
|
throw new IllegalArgumentException();
|
||||||
}
|
}
|
||||||
return new AlertDialog.Builder(getActivity())
|
}
|
||||||
.setTitle(title)
|
|
||||||
.setIconAttribute(android.R.attr.alertDialogIcon)
|
private View createEnableDialogContentView() {
|
||||||
.setMessage(message)
|
LayoutInflater inflater = (LayoutInflater) getSystemService(
|
||||||
.setCancelable(true)
|
Context.LAYOUT_INFLATER_SERVICE);
|
||||||
.setPositiveButton(android.R.string.ok, this)
|
|
||||||
.setNegativeButton(android.R.string.cancel, this)
|
View content = inflater.inflate(R.layout.enable_accessibility_service_dialog_content,
|
||||||
.create();
|
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<AccessibilityServiceInfo.CapabilityInfo> 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
|
@Override
|
||||||
@@ -823,23 +885,15 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
|
|||||||
@Override
|
@Override
|
||||||
public boolean onBeforeCheckedChanged(ToggleSwitch toggleSwitch, boolean checked) {
|
public boolean onBeforeCheckedChanged(ToggleSwitch toggleSwitch, boolean checked) {
|
||||||
if (checked) {
|
if (checked) {
|
||||||
if (!TextUtils.isEmpty(mEnableWarningMessage)) {
|
toggleSwitch.setCheckedInternal(false);
|
||||||
toggleSwitch.setCheckedInternal(false);
|
getArguments().putBoolean(EXTRA_CHECKED, false);
|
||||||
getArguments().putBoolean(EXTRA_CHECKED, false);
|
showDialog(DIALOG_ID_ENABLE_WARNING);
|
||||||
showDialog(DIALOG_ID_ENABLE_WARNING);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
onPreferenceToggled(mPreferenceKey, true);
|
|
||||||
} else {
|
} else {
|
||||||
if (!TextUtils.isEmpty(mDisableWarningMessage)) {
|
toggleSwitch.setCheckedInternal(true);
|
||||||
toggleSwitch.setCheckedInternal(true);
|
getArguments().putBoolean(EXTRA_CHECKED, true);
|
||||||
getArguments().putBoolean(EXTRA_CHECKED, true);
|
showDialog(DIALOG_ID_DISABLE_WARNING);
|
||||||
showDialog(DIALOG_ID_DISABLE_WARNING);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
onPreferenceToggled(mPreferenceKey, false);
|
|
||||||
}
|
}
|
||||||
return false;
|
return true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -859,20 +913,12 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
|
|||||||
setHasOptionsMenu(true);
|
setHasOptionsMenu(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Enable warning title.
|
|
||||||
mEnableWarningTitle = arguments.getCharSequence(
|
mAccessibilityServiceInfo = arguments.getParcelable(EXTRA_ACCESSIBILITY_SERVICE_INFO);
|
||||||
AccessibilitySettings.EXTRA_ENABLE_WARNING_TITLE);
|
|
||||||
// Enable warning message.
|
ServiceInfo serviceInfo = mAccessibilityServiceInfo.getResolveInfo().serviceInfo;
|
||||||
mEnableWarningMessage = arguments.getCharSequence(
|
mComponentName = new ComponentName(serviceInfo.packageName,
|
||||||
AccessibilitySettings.EXTRA_ENABLE_WARNING_MESSAGE);
|
serviceInfo.name).flattenToString();
|
||||||
// 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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user