From b1795f554921249420bf588280396d6920541556 Mon Sep 17 00:00:00 2001 From: Anna Galusza Date: Fri, 8 Jan 2016 14:37:16 -0800 Subject: [PATCH] Make A11y SUW launchable from SUW and small UX changes based on last round of UX studies. Change-Id: I9c20cd3abf910a37731da2af604f3af2cd30e942 --- AndroidManifest.xml | 17 ++++ res/layout/preference_button.xml | 48 ------------ res/layout/preference_multiline_title.xml | 56 ++++++++++++++ res/values/colors.xml | 4 + res/values/strings.xml | 10 ++- res/values/themes.xml | 9 ++- res/xml/accessibility_settings.xml | 5 -- ...ccessibility_settings_for_setup_wizard.xml | 34 ++++---- .../android/settings/SettingsActivity.java | 2 + .../settings/SettingsPreferenceFragment.java | 4 +- .../AccessibilitySettingsForSetupWizard.java | 77 +++++++++++++++++-- ...ibilitySettingsForSetupWizardActivity.java | 56 ++++++++++++++ .../ToggleFeaturePreferenceFragment.java | 1 - ...ScreenMagnificationPreferenceFragment.java | 29 ++++++- 14 files changed, 268 insertions(+), 84 deletions(-) delete mode 100644 res/layout/preference_button.xml create mode 100644 res/layout/preference_multiline_title.xml create mode 100644 src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 3281adedf3f..923beea5c7d 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1407,6 +1407,23 @@ android:value="true" /> + + + + + + + + + + - - - - - - - - - - diff --git a/res/layout/preference_multiline_title.xml b/res/layout/preference_multiline_title.xml new file mode 100644 index 00000000000..f4e26fc0ce9 --- /dev/null +++ b/res/layout/preference_multiline_title.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + diff --git a/res/values/colors.xml b/res/values/colors.xml index a9517764bf1..de92fe4cc14 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -103,4 +103,8 @@ #ff009587 #ffced7db + + #4285F4 + #3367D6 + diff --git a/res/values/strings.xml b/res/values/strings.xml index dea16208201..3be290fdfce 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -3652,10 +3652,14 @@ Accessibility Accessibility settings - - Guide me + + Vision Settings + + Adjust these settings now to assist you through the remainder of the set up process. You can adjust them any time in device settings. Services + + Screenreader tool primarily for people with blindness and low vision System @@ -6679,7 +6683,7 @@ Quickly open camera without unlocking your screen - Screen zoom + Magnify display display density, screen zoom, scale, scaling diff --git a/res/values/themes.xml b/res/values/themes.xml index b15a77cd7bb..14ee1602cfa 100644 --- a/res/values/themes.xml +++ b/res/values/themes.xml @@ -103,7 +103,6 @@ @style/Preference @style/Preference.DropDown.Material @style/PreferenceFragmentStyle - @style/ApnPreference @@ -115,6 +114,14 @@ @layout/setup_preference + + + - - + android:key="vision_settings_summary" + android:title="@string/vision_settings_description" + android:layout="@layout/preference_multiline_title" /> + android:fragment="com.android.settings.accessibility.ToggleFontSizePreferenceFragment" + android:key="font_size_preference" + android:title="@string/title_font_size" /> + + + android:summary="@string/talkback_summary" + android:persistent="true" /> diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java index dab2cb7607c..bad8af892a0 100644 --- a/src/com/android/settings/SettingsActivity.java +++ b/src/com/android/settings/SettingsActivity.java @@ -53,6 +53,7 @@ import android.widget.SearchView; import com.android.internal.util.ArrayUtils; import com.android.settings.Settings.WifiSettingsActivity; import com.android.settings.accessibility.AccessibilitySettings; +import com.android.settings.accessibility.AccessibilitySettingsForSetupWizard; import com.android.settings.accessibility.CaptionPropertiesFragment; import com.android.settings.accounts.AccountSettings; import com.android.settings.accounts.AccountSyncSettings; @@ -264,6 +265,7 @@ public class SettingsActivity extends SettingsDrawerActivity PrivacySettings.class.getName(), DeviceAdminSettings.class.getName(), AccessibilitySettings.class.getName(), + AccessibilitySettingsForSetupWizard.class.getName(), CaptionPropertiesFragment.class.getName(), com.android.settings.accessibility.ToggleDaltonizerPreferenceFragment.class.getName(), TextToSpeechSettings.class.getName(), diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java index 2ba49ce618b..4f81a38e2f8 100644 --- a/src/com/android/settings/SettingsPreferenceFragment.java +++ b/src/com/android/settings/SettingsPreferenceFragment.java @@ -40,6 +40,7 @@ import android.view.MenuInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; +import com.android.settings.accessibility.AccessibilitySettingsForSetupWizardActivity; import com.android.settings.applications.LayoutPreference; import com.android.settings.widget.FloatingActionButton; @@ -148,7 +149,8 @@ public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceF @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - if (!TextUtils.isEmpty(mHelpUri)) { + if (!TextUtils.isEmpty(mHelpUri) + && !(getActivity() instanceof AccessibilitySettingsForSetupWizardActivity)) { setHasOptionsMenu(true); } } diff --git a/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizard.java b/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizard.java index 7636fd9056c..6a984ac1266 100644 --- a/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizard.java +++ b/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizard.java @@ -16,15 +16,24 @@ package com.android.settings.accessibility; +import android.accessibilityservice.AccessibilityServiceInfo; +import android.content.ComponentName; +import android.content.ContentResolver; +import android.content.Context; +import android.content.pm.ServiceInfo; import android.content.res.Resources; import android.os.Bundle; import android.provider.Settings; import android.support.v7.preference.Preference; +import android.view.accessibility.AccessibilityManager; + import com.android.internal.logging.MetricsLogger; import com.android.settings.DialogCreatable; import com.android.settings.R; import com.android.settings.SettingsPreferenceFragment; +import java.util.List; + /** * Activity with the accessibility settings specific to Setup Wizard. */ @@ -34,7 +43,6 @@ public class AccessibilitySettingsForSetupWizard extends SettingsPreferenceFragm // Preferences. private static final String DISPLAY_MAGNIFICATION_PREFERENCE = "screen_magnification_preference"; - private static final String DISPLAY_DALTONIZER_PREFERENCE = "daltonizer_preference"; private static final String TALKBACK_PREFERENCE = "talkback_preference"; private static final String FONT_SIZE_PREFERENCE = "font_size_preference"; @@ -42,7 +50,6 @@ public class AccessibilitySettingsForSetupWizard extends SettingsPreferenceFragm // Preference controls. private Preference mDisplayMagnificationPreference; - private Preference mDisplayDaltonizerPreference; private Preference mFontSizePreference; private Preference mTalkbackPreference; @@ -62,7 +69,6 @@ public class AccessibilitySettingsForSetupWizard extends SettingsPreferenceFragm addPreferencesFromResource(R.xml.accessibility_settings_for_setup_wizard); mDisplayMagnificationPreference = findPreference(DISPLAY_MAGNIFICATION_PREFERENCE); - mDisplayDaltonizerPreference = findPreference(DISPLAY_DALTONIZER_PREFERENCE); mFontSizePreference = findPreference(FONT_SIZE_PREFERENCE); mTalkbackPreference = findPreference(TALKBACK_PREFERENCE); @@ -86,6 +92,43 @@ public class AccessibilitySettingsForSetupWizard extends SettingsPreferenceFragm return false; } + /** + * Returns a semicolon-delimited string containing a list of all the + * installed {@link AccessibilityService}s that provide at least one + * required feedback type. + * + * @param context The {@link android.app.Activity} context. + * @param requiredFeedbackTypes An integer mask containing the required + * feedback types. + * @return A semicolon-delimited string containing a list of accessibility services. + */ + private String getAccessibilityServicesFiltered( + Context context, int requiredFeedbackTypes) { + final AccessibilityManager manager = context.getSystemService(AccessibilityManager.class); + final List accessibilityServices = manager + .getInstalledAccessibilityServiceList(); + final StringBuilder servicesToEnable = new StringBuilder(); + + for (AccessibilityServiceInfo accessibilityService : accessibilityServices) { + if ((accessibilityService.feedbackType & requiredFeedbackTypes) == 0) { + continue; + } + + final ServiceInfo serviceInfo = accessibilityService.getResolveInfo().serviceInfo; + final ComponentName componentName = new ComponentName(serviceInfo.packageName, + serviceInfo.name); + + servicesToEnable.append(componentName.flattenToString()); + servicesToEnable.append(':'); + } + + if (servicesToEnable.length() > 0) { + servicesToEnable.deleteCharAt(servicesToEnable.length() - 1); + } + + return servicesToEnable.toString(); + } + @Override public boolean onPreferenceTreeClick(Preference preference) { if (mDisplayMagnificationPreference == preference) { @@ -98,6 +141,32 @@ public class AccessibilitySettingsForSetupWizard extends SettingsPreferenceFragm extras.putBoolean(AccessibilitySettings.EXTRA_CHECKED, Settings.Secure.getInt(getContentResolver(), Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, 0) == 1); + } else if (mTalkbackPreference == preference) { + // Toggle Talkback. The tutorial will automatically start when Talkback is first + // activated. + final ContentResolver resolver = getContentResolver(); + + final boolean enable = + Settings.Secure.getInt(resolver, Settings.Secure.ACCESSIBILITY_ENABLED, 0) == 0; + final String servicesToEnable = getAccessibilityServicesFiltered( + getActivity(), AccessibilityServiceInfo.FEEDBACK_SPOKEN); + + // Enable all accessibility services with spoken feedback type. + Settings.Secure.putString(resolver, Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, + enable ? servicesToEnable : ""); + + // Allow the services we just enabled to toggle touch exploration. + Settings.Secure.putString(resolver, + Settings.Secure.TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES, + enable ? servicesToEnable : ""); + + // Enable touch exploration. + Settings.Secure.putInt(resolver, Settings.Secure.TOUCH_EXPLORATION_ENABLED, + enable ? 1 : 0); + + // Turn on accessibility mode last, since enabling accessibility with no + // services has no effect. + Settings.Secure.putInt(resolver, Settings.Secure.ACCESSIBILITY_ENABLED, enable ? 1 : 0); } return super.onPreferenceTreeClick(preference); @@ -106,8 +175,6 @@ public class AccessibilitySettingsForSetupWizard extends SettingsPreferenceFragm private void updatePreferences() { updateFeatureSummary(Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, mDisplayMagnificationPreference); - updateFeatureSummary(Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, - mDisplayDaltonizerPreference); updateFontSizeSummary(mFontSizePreference); } diff --git a/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java b/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java new file mode 100644 index 00000000000..09961b7f802 --- /dev/null +++ b/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2015 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. + */ + +package com.android.settings.accessibility; + +import android.app.Fragment; +import android.os.Bundle; +import android.view.Menu; +import android.view.MenuItem; + +import com.android.settings.R; +import com.android.settings.SettingsActivity; + +public class AccessibilitySettingsForSetupWizardActivity extends SettingsActivity { + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Return true, so we get notified when items in the menu are clicked. + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + onBackPressed(); + return true; + } + + @Override + public void startPreferencePanel(String fragmentClass, Bundle args, int titleRes, + CharSequence titleText, Fragment resultTo, int resultRequestCode) { + startPreferenceFragment(Fragment.instantiate(this, fragmentClass, args), true); + } + + @Override + public void openDrawer() { + // Do nothing. + } + + @Override + public void closeDrawer() { + // Do nothing. + } +} diff --git a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java index bee46c8c328..e1c4f7e5852 100644 --- a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java @@ -99,7 +99,6 @@ public abstract class ToggleFeaturePreferenceFragment @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - setHasOptionsMenu(true); installActionBarToggleSwitch(); } diff --git a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java index 44355c66afa..45af2de3a1d 100644 --- a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragment.java @@ -16,6 +16,7 @@ package com.android.settings.accessibility; +import android.os.Bundle; import android.provider.Settings; import com.android.internal.logging.MetricsLogger; @@ -24,10 +25,10 @@ import com.android.settings.widget.ToggleSwitch.OnBeforeCheckedChangeListener; public class ToggleScreenMagnificationPreferenceFragment extends ToggleFeaturePreferenceFragment { + @Override protected void onPreferenceToggled(String preferenceKey, boolean enabled) { - Settings.Secure.putInt(getContentResolver(), - Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, enabled ? 1 : 0); + // Do nothing. } @Override @@ -44,6 +45,30 @@ public class ToggleScreenMagnificationPreferenceFragment }); } + @Override + public void onResume() { + super.onResume(); + + // Temporarily enable Magnification on this screen if it's disabled. + if (Settings.Secure.getInt(getContentResolver(), + Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, 0) == 0) { + setMagnificationEnabled(1); + } + } + + @Override + public void onPause() { + super.onPause(); + if (!mToggleSwitch.isChecked()) { + setMagnificationEnabled(0); + } + } + + private void setMagnificationEnabled(int enabled) { + Settings.Secure.putInt(getContentResolver(), + Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED, enabled); + } + @Override protected int getMetricsCategory() { return MetricsLogger.ACCESSIBILITY_TOGGLE_SCREEN_MAGNIFICATION;