diff options
Diffstat (limited to 'src/com/android/settings/accessibility/AccessibilitySettings.java')
-rw-r--r-- | src/com/android/settings/accessibility/AccessibilitySettings.java | 283 |
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; + } + }; } |