Make A11y SUW launchable from SUW and small UX changes based on last round of
UX studies.

Change-Id: I9c20cd3abf910a37731da2af604f3af2cd30e942
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index dab2cb7..bad8af8 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -53,6 +53,7 @@
 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 @@
             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 2ba49ce..4f81a38 100644
--- a/src/com/android/settings/SettingsPreferenceFragment.java
+++ b/src/com/android/settings/SettingsPreferenceFragment.java
@@ -40,6 +40,7 @@
 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 @@
     @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 7636fd9..6a984ac 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 @@
     // 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 @@
 
     // Preference controls.
     private Preference mDisplayMagnificationPreference;
-    private Preference mDisplayDaltonizerPreference;
     private Preference mFontSizePreference;
     private Preference mTalkbackPreference;
 
@@ -62,7 +69,6 @@
         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 @@
         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<AccessibilityServiceInfo> 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 @@
             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 @@
     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 0000000..09961b7
--- /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 bee46c8..e1c4f7e 100644
--- a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
@@ -99,7 +99,6 @@
     @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 44355c6..45af2de 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 @@
 
 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
@@ -45,6 +46,30 @@
     }
 
     @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;
     }