summaryrefslogtreecommitdiffstats
path: root/src/com/android/settings/accessibility/AccessibilitySettings.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/settings/accessibility/AccessibilitySettings.java')
-rw-r--r--src/com/android/settings/accessibility/AccessibilitySettings.java283
1 files changed, 155 insertions, 128 deletions
diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java
index 4d24d09..92c478e 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettings.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettings.java
@@ -18,14 +18,10 @@ package com.android.settings.accessibility;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.app.ActivityManagerNative;
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.content.ActivityNotFoundException;
+import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.content.res.Configuration;
@@ -33,16 +29,17 @@ import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.RemoteException;
-import android.os.SystemProperties;
+import android.os.UserHandle;
import android.preference.CheckBoxPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceCategory;
import android.preference.PreferenceScreen;
+import android.preference.SwitchPreference;
+import android.provider.SearchIndexableResource;
import android.provider.Settings;
import android.text.TextUtils;
import android.text.TextUtils.SimpleStringSplitter;
-import android.util.Log;
import android.view.KeyCharacterMap;
import android.view.KeyEvent;
import android.view.View;
@@ -56,7 +53,11 @@ import com.android.settings.DialogCreatable;
import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.Utils;
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settings.search.Indexable;
+import com.android.settings.search.SearchIndexableRaw;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -67,21 +68,12 @@ import java.util.Set;
* Activity with the accessibility settings.
*/
public class AccessibilitySettings extends SettingsPreferenceFragment implements DialogCreatable,
- Preference.OnPreferenceChangeListener {
- private static final String LOG_TAG = "AccessibilitySettings";
-
- private static final String DEFAULT_SCREENREADER_MARKET_LINK =
- "market://search?q=pname:com.google.android.marvin.talkback";
+ Preference.OnPreferenceChangeListener, Indexable {
private static final float LARGE_FONT_SCALE = 1.3f;
- private static final String SYSTEM_PROPERTY_MARKET_URL = "ro.screenreader.market";
-
static final char ENABLED_ACCESSIBILITY_SERVICES_SEPARATOR = ':';
- private static final String KEY_INSTALL_ACCESSIBILITY_SERVICE_OFFERED_ONCE =
- "key_install_accessibility_service_offered_once";
-
// Preference categories
private static final String SERVICES_CATEGORY = "services_category";
private static final String SYSTEM_CATEGORY = "system_category";
@@ -89,6 +81,10 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
// Preferences
private static final String TOGGLE_LARGE_TEXT_PREFERENCE =
"toggle_large_text_preference";
+ private static final String TOGGLE_HIGH_TEXT_CONTRAST_PREFERENCE =
+ "toggle_high_text_contrast_preference";
+ private static final String TOGGLE_INVERSION_PREFERENCE =
+ "toggle_inversion_preference";
private static final String TOGGLE_POWER_BUTTON_ENDS_CALL_PREFERENCE =
"toggle_power_button_ends_call_preference";
private static final String TOGGLE_LOCK_SCREEN_ROTATION_PREFERENCE =
@@ -103,6 +99,8 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
"captioning_preference_screen";
private static final String DISPLAY_MAGNIFICATION_PREFERENCE_SCREEN =
"screen_magnification_preference_screen";
+ private static final String DISPLAY_DALTONIZER_PREFERENCE_SCREEN =
+ "daltonizer_preference_screen";
// Extras passed to sub-fragments.
static final String EXTRA_PREFERENCE_KEY = "preference_key";
@@ -119,9 +117,6 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
// presentation.
private static final long DELAY_UPDATE_SERVICES_MILLIS = 1000;
- // Dialog IDs.
- private static final int DIALOG_ID_NO_ACCESSIBILITY_SERVICES = 1;
-
// Auxiliary members.
final static SimpleStringSplitter sStringColonSplitter =
new SimpleStringSplitter(ENABLED_ACCESSIBILITY_SERVICES_SEPARATOR);
@@ -190,6 +185,7 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
private PreferenceCategory mSystemsCategory;
private CheckBoxPreference mToggleLargeTextPreference;
+ private CheckBoxPreference mToggleHighTextContrastPreference;
private CheckBoxPreference mTogglePowerButtonEndsCallPreference;
private CheckBoxPreference mToggleLockScreenRotationPreference;
private CheckBoxPreference mToggleSpeakPasswordPreference;
@@ -198,14 +194,20 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
private PreferenceScreen mCaptioningPreferenceScreen;
private PreferenceScreen mDisplayMagnificationPreferenceScreen;
private PreferenceScreen mGlobalGesturePreferenceScreen;
+ private PreferenceScreen mDisplayDaltonizerPreferenceScreen;
+ private SwitchPreference mToggleInversionPreference;
private int mLongPressTimeoutDefault;
+ private DevicePolicyManager mDpm;
+
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
addPreferencesFromResource(R.xml.accessibility_settings);
initializeAllPreferences();
+ mDpm = (DevicePolicyManager) (getActivity()
+ .getSystemService(Context.DEVICE_POLICY_SERVICE));
}
@Override
@@ -214,8 +216,6 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
loadInstalledServices();
updateAllPreferences();
- offerInstallAccessibilitySerivceOnce();
-
mSettingsPackageMonitor.register(getActivity(), getActivity().getMainLooper(), false);
mSettingsContentObserver.register(getContentResolver());
if (RotationPolicy.isRotationSupported(getActivity())) {
@@ -237,22 +237,36 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
- if (preference == mSelectLongPressTimeoutPreference) {
- String stringValue = (String) newValue;
- Settings.Secure.putInt(getContentResolver(),
- Settings.Secure.LONG_PRESS_TIMEOUT, Integer.parseInt(stringValue));
- mSelectLongPressTimeoutPreference.setSummary(
- mLongPressTimeoutValuetoTitleMap.get(stringValue));
+ if (mSelectLongPressTimeoutPreference == preference) {
+ handleLongPressTimeoutPreferenceChange((String) newValue);
+ return true;
+ } else if (mToggleInversionPreference == preference) {
+ handleToggleInversionPreferenceChange((Boolean) newValue);
return true;
}
return false;
}
+ private void handleLongPressTimeoutPreferenceChange(String stringValue) {
+ Settings.Secure.putInt(getContentResolver(),
+ Settings.Secure.LONG_PRESS_TIMEOUT, Integer.parseInt(stringValue));
+ mSelectLongPressTimeoutPreference.setSummary(
+ mLongPressTimeoutValuetoTitleMap.get(stringValue));
+ }
+
+ private void handleToggleInversionPreferenceChange(boolean checked) {
+ Settings.Secure.putInt(getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, (checked ? 1 : 0));
+ }
+
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
if (mToggleLargeTextPreference == preference) {
handleToggleLargeTextPreferenceClick();
return true;
+ } else if (mToggleHighTextContrastPreference == preference) {
+ handleToggleTextContrastPreferenceClick();
+ return true;
} else if (mTogglePowerButtonEndsCallPreference == preference) {
handleTogglePowerButtonEndsCallPreferenceClick();
return true;
@@ -263,7 +277,7 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
handleToggleSpeakPasswordPreferenceClick();
return true;
} else if (mGlobalGesturePreferenceScreen == preference) {
- handleTogglEnableAccessibilityGesturePreferenceClick();
+ handleToggleEnableAccessibilityGesturePreferenceClick();
return true;
} else if (mDisplayMagnificationPreferenceScreen == preference) {
handleDisplayMagnificationPreferenceScreenClick();
@@ -281,6 +295,12 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
}
}
+ private void handleToggleTextContrastPreferenceClick() {
+ Settings.Secure.putInt(getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED,
+ (mToggleHighTextContrastPreference.isChecked() ? 1 : 0));
+ }
+
private void handleTogglePowerButtonEndsCallPreferenceClick() {
Settings.Secure.putInt(getContentResolver(),
Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR,
@@ -300,7 +320,7 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
mToggleSpeakPasswordPreference.isChecked() ? 1 : 0);
}
- private void handleTogglEnableAccessibilityGesturePreferenceClick() {
+ private void handleToggleEnableAccessibilityGesturePreferenceClick() {
Bundle extras = mGlobalGesturePreferenceScreen.getExtras();
extras.putString(EXTRA_TITLE, getString(
R.string.accessibility_global_gesture_preference_title));
@@ -332,6 +352,14 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
mToggleLargeTextPreference =
(CheckBoxPreference) findPreference(TOGGLE_LARGE_TEXT_PREFERENCE);
+ // Text contrast.
+ mToggleHighTextContrastPreference =
+ (CheckBoxPreference) findPreference(TOGGLE_HIGH_TEXT_CONTRAST_PREFERENCE);
+
+ // Display inversion.
+ mToggleInversionPreference = (SwitchPreference) findPreference(TOGGLE_INVERSION_PREFERENCE);
+ mToggleInversionPreference.setOnPreferenceChangeListener(this);
+
// Power button ends calls.
mTogglePowerButtonEndsCallPreference =
(CheckBoxPreference) findPreference(TOGGLE_POWER_BUTTON_ENDS_CALL_PREFERENCE);
@@ -375,6 +403,10 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
mDisplayMagnificationPreferenceScreen = (PreferenceScreen) findPreference(
DISPLAY_MAGNIFICATION_PREFERENCE_SCREEN);
+ // Display color adjustments.
+ mDisplayDaltonizerPreferenceScreen = (PreferenceScreen) findPreference(
+ DISPLAY_DALTONIZER_PREFERENCE_SCREEN);
+
// Global gesture.
mGlobalGesturePreferenceScreen =
(PreferenceScreen) findPreference(ENABLE_ACCESSIBILITY_GESTURE_PREFERENCE_SCREEN);
@@ -408,7 +440,8 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
accessibilityManager.getInstalledAccessibilityServiceList();
Set<ComponentName> enabledServices = AccessibilityUtils.getEnabledServicesFromSettings(
getActivity());
-
+ List<String> permittedServices = mDpm.getPermittedAccessibilityServices(
+ UserHandle.myUserId());
final boolean accessibilityEnabled = Settings.Secure.getInt(getContentResolver(),
Settings.Secure.ACCESSIBILITY_ENABLED, 0) == 1;
@@ -428,12 +461,27 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
preference.setTitle(title);
final boolean serviceEnabled = accessibilityEnabled
&& enabledServices.contains(componentName);
+ String serviceEnabledString;
if (serviceEnabled) {
- preference.setSummary(getString(R.string.accessibility_feature_state_on));
+ serviceEnabledString = getString(R.string.accessibility_feature_state_on);
} else {
- preference.setSummary(getString(R.string.accessibility_feature_state_off));
+ serviceEnabledString = getString(R.string.accessibility_feature_state_off);
}
+ // Disable all accessibility services that are not permitted.
+ String packageName = serviceInfo.packageName;
+ boolean serviceAllowed =
+ permittedServices == null || permittedServices.contains(packageName);
+ preference.setEnabled(serviceAllowed || serviceEnabled);
+
+ String summaryString;
+ if (serviceAllowed) {
+ summaryString = serviceEnabledString;
+ } else {
+ summaryString = getString(R.string.accessibility_feature_or_input_method_not_allowed);
+ }
+ preference.setSummary(summaryString);
+
preference.setOrder(i);
preference.setFragment(ToggleAccessibilityServicePreferenceFragment.class.getName());
preference.setPersistent(true);
@@ -465,19 +513,13 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
if (mServicesCategory.getPreferenceCount() == 0) {
if (mNoServicesMessagePreference == null) {
- mNoServicesMessagePreference = new Preference(getActivity()) {
- @Override
- protected void onBindView(View view) {
- super.onBindView(view);
- TextView summaryView = (TextView) view.findViewById(R.id.summary);
- String title = getString(R.string.accessibility_no_services_installed);
- summaryView.setText(title);
- }
- };
+ mNoServicesMessagePreference = new Preference(getActivity());
mNoServicesMessagePreference.setPersistent(false);
mNoServicesMessagePreference.setLayoutResource(
R.layout.text_description_preference);
mNoServicesMessagePreference.setSelectable(false);
+ mNoServicesMessagePreference.setSummary(
+ getString(R.string.accessibility_no_services_installed));
}
mServicesCategory.addPreference(mNoServicesMessagePreference);
}
@@ -492,6 +534,14 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
}
mToggleLargeTextPreference.setChecked(mCurConfig.fontScale == LARGE_FONT_SCALE);
+ mToggleHighTextContrastPreference.setChecked(
+ Settings.Secure.getInt(getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_HIGH_TEXT_CONTRAST_ENABLED, 0) == 1);
+
+ // If the quick setting is enabled, the preference MUST be enabled.
+ mToggleInversionPreference.setChecked(Settings.Secure.getInt(getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, 0) == 1);
+
// Power button ends calls.
if (KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_POWER)
&& Utils.isVoiceCapable(getActivity())) {
@@ -518,25 +568,12 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
mSelectLongPressTimeoutPreference.setValue(value);
mSelectLongPressTimeoutPreference.setSummary(mLongPressTimeoutValuetoTitleMap.get(value));
- // Captioning.
- final boolean captioningEnabled = Settings.Secure.getInt(getContentResolver(),
- Settings.Secure.ACCESSIBILITY_CAPTIONING_ENABLED, 0) == 1;
- if (captioningEnabled) {
- mCaptioningPreferenceScreen.setSummary(R.string.accessibility_feature_state_on);
- } else {
- mCaptioningPreferenceScreen.setSummary(R.string.accessibility_feature_state_off);
- }
-
- // Screen magnification.
- final boolean magnificationEnabled = Settings.Secure.getInt(getContentResolver(),
- Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, 0) == 1;
- if (magnificationEnabled) {
- mDisplayMagnificationPreferenceScreen.setSummary(
- R.string.accessibility_feature_state_on);
- } else {
- mDisplayMagnificationPreferenceScreen.setSummary(
- R.string.accessibility_feature_state_off);
- }
+ updateFeatureSummary(Settings.Secure.ACCESSIBILITY_CAPTIONING_ENABLED,
+ mCaptioningPreferenceScreen);
+ updateFeatureSummary(Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED,
+ mDisplayMagnificationPreferenceScreen);
+ updateFeatureSummary(Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED,
+ mDisplayDaltonizerPreferenceScreen);
// Global gesture
final boolean globalGestureEnabled = Settings.Global.getInt(getContentResolver(),
@@ -550,6 +587,12 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
}
}
+ private void updateFeatureSummary(String prefKey, Preference pref) {
+ final boolean enabled = Settings.Secure.getInt(getContentResolver(), prefKey, 0) == 1;
+ pref.setSummary(enabled ? R.string.accessibility_feature_state_on
+ : R.string.accessibility_feature_state_off);
+ }
+
private void updateLockScreenRotationCheckbox() {
Context context = getActivity();
if (context != null) {
@@ -558,72 +601,6 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
}
}
- private void offerInstallAccessibilitySerivceOnce() {
- // There is always one preference - if no services it is just a message.
- if (mServicesCategory.getPreference(0) != mNoServicesMessagePreference) {
- return;
- }
- SharedPreferences preferences = getActivity().getPreferences(Context.MODE_PRIVATE);
- final boolean offerInstallService = !preferences.getBoolean(
- KEY_INSTALL_ACCESSIBILITY_SERVICE_OFFERED_ONCE, false);
- if (offerInstallService) {
- String screenreaderMarketLink = SystemProperties.get(
- SYSTEM_PROPERTY_MARKET_URL,
- DEFAULT_SCREENREADER_MARKET_LINK);
- Uri marketUri = Uri.parse(screenreaderMarketLink);
- Intent marketIntent = new Intent(Intent.ACTION_VIEW, marketUri);
-
- if (getPackageManager().resolveActivity(marketIntent, 0) == null) {
- // Don't show the dialog if no market app is found/installed.
- return;
- }
-
- preferences.edit().putBoolean(KEY_INSTALL_ACCESSIBILITY_SERVICE_OFFERED_ONCE,
- true).commit();
- // Notify user that they do not have any accessibility
- // services installed and direct them to Market to get TalkBack.
- showDialog(DIALOG_ID_NO_ACCESSIBILITY_SERVICES);
- }
- }
-
- @Override
- public Dialog onCreateDialog(int dialogId) {
- switch (dialogId) {
- case DIALOG_ID_NO_ACCESSIBILITY_SERVICES:
- return new AlertDialog.Builder(getActivity())
- .setTitle(R.string.accessibility_service_no_apps_title)
- .setMessage(R.string.accessibility_service_no_apps_message)
- .setPositiveButton(android.R.string.ok,
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- // dismiss the dialog before launching
- // the activity otherwise the dialog
- // removal occurs after
- // onSaveInstanceState which triggers an
- // exception
- removeDialog(DIALOG_ID_NO_ACCESSIBILITY_SERVICES);
- String screenreaderMarketLink = SystemProperties.get(
- SYSTEM_PROPERTY_MARKET_URL,
- DEFAULT_SCREENREADER_MARKET_LINK);
- Uri marketUri = Uri.parse(screenreaderMarketLink);
- Intent marketIntent = new Intent(Intent.ACTION_VIEW,
- marketUri);
- try {
- startActivity(marketIntent);
- } catch (ActivityNotFoundException anfe) {
- Log.w(LOG_TAG, "Couldn't start play store activity",
- anfe);
- }
- }
- })
- .setNegativeButton(android.R.string.cancel, null)
- .create();
- default:
- return null;
- }
- }
-
private void loadInstalledServices() {
Set<ComponentName> installedServices = sInstalledServices;
installedServices.clear();
@@ -644,4 +621,54 @@ public class AccessibilitySettings extends SettingsPreferenceFragment implements
installedServices.add(installedService);
}
}
+
+ public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+ new BaseSearchIndexProvider() {
+ @Override
+ public List<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled) {
+ List<SearchIndexableRaw> indexables = new ArrayList<SearchIndexableRaw>();
+
+ PackageManager packageManager = context.getPackageManager();
+ AccessibilityManager accessibilityManager = (AccessibilityManager)
+ context.getSystemService(Context.ACCESSIBILITY_SERVICE);
+
+ String screenTitle = context.getResources().getString(
+ R.string.accessibility_services_title);
+
+ // Indexing all services, regardless if enabled.
+ List<AccessibilityServiceInfo> services = accessibilityManager
+ .getInstalledAccessibilityServiceList();
+ final int serviceCount = services.size();
+ for (int i = 0; i < serviceCount; i++) {
+ AccessibilityServiceInfo service = services.get(i);
+ if (service == null || service.getResolveInfo() == null) {
+ continue;
+ }
+
+ ServiceInfo serviceInfo = service.getResolveInfo().serviceInfo;
+ ComponentName componentName = new ComponentName(serviceInfo.packageName,
+ serviceInfo.name);
+
+ SearchIndexableRaw indexable = new SearchIndexableRaw(context);
+ indexable.key = componentName.flattenToString();
+ indexable.title = service.getResolveInfo().loadLabel(packageManager).toString();
+ indexable.summaryOn = context.getString(R.string.accessibility_feature_state_on);
+ indexable.summaryOff = context.getString(R.string.accessibility_feature_state_off);
+ indexable.screenTitle = screenTitle;
+ indexables.add(indexable);
+ }
+
+ return indexables;
+ }
+
+ @Override
+ public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
+ boolean enabled) {
+ List<SearchIndexableResource> indexables = new ArrayList<SearchIndexableResource>();
+ SearchIndexableResource indexable = new SearchIndexableResource(context);
+ indexable.xmlResId = R.xml.accessibility_settings;
+ indexables.add(indexable);
+ return indexables;
+ }
+ };
}