Add Screen Zoom preview screen with settings page, launch Talkback tutorial
whenever the Talkback setting in SUW is pressed, and remove check for parent
Activity from SettingsPreferenceFragment.
Bug: 26734639

Change-Id: I5671735437844ac54ea68322838d9b6b5c81957f
diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java
index 9aebdbf..49d72b4 100644
--- a/src/com/android/settings/SettingsPreferenceFragment.java
+++ b/src/com/android/settings/SettingsPreferenceFragment.java
@@ -40,7 +40,6 @@
 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;
 
@@ -164,8 +163,7 @@
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
-        if (!TextUtils.isEmpty(mHelpUri)
-                && !(getActivity() instanceof AccessibilitySettingsForSetupWizardActivity)) {
+        if (!TextUtils.isEmpty(mHelpUri)) {
             setHasOptionsMenu(true);
         }
     }
diff --git a/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizard.java b/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizard.java
index 26f5f39..35bb83b 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizard.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizard.java
@@ -17,14 +17,18 @@
 package com.android.settings.accessibility;
 
 import android.accessibilityservice.AccessibilityServiceInfo;
+import android.content.ActivityNotFoundException;
 import android.content.ComponentName;
 import android.content.ContentResolver;
 import android.content.Context;
+import android.content.Intent;
 import android.content.pm.ServiceInfo;
 import android.content.res.Resources;
 import android.os.Bundle;
+import android.os.Handler;
 import android.provider.Settings;
 import android.support.v7.preference.Preference;
+import android.util.Log;
 import android.view.accessibility.AccessibilityManager;
 
 import com.android.internal.logging.MetricsProto;
@@ -40,16 +44,30 @@
 public class AccessibilitySettingsForSetupWizard extends SettingsPreferenceFragment
         implements DialogCreatable, Preference.OnPreferenceChangeListener {
 
+    private static final String TAG = AccessibilitySettingsForSetupWizard.class.getSimpleName();
+
     // Preferences.
     private static final String DISPLAY_MAGNIFICATION_PREFERENCE =
             "screen_magnification_preference";
-    private static final String TALKBACK_PREFERENCE = "talkback_preference";
+    private static final String SCREEN_READER_PREFERENCE = "talkback_preference";
     private static final String FONT_SIZE_PREFERENCE = "font_size_preference";
 
+    // Time needed to let Talkback initialize its self before launching the tutorial.
+    private static final long SCREEN_READER_INITIALIZATION_DELAY_MS = 3000;
+
+    private String mTalkbackPackage;
+
     // Preference controls.
     private Preference mDisplayMagnificationPreference;
     private Preference mTalkbackPreference;
 
+    private Runnable mStartTalkbackRunnable = new Runnable() {
+        @Override
+        public void run() {
+            launchTalkbackTutorial();
+        }
+    };
+
     @Override
     protected int getMetricsCategory() {
         return MetricsProto.MetricsEvent.ACCESSIBILITY;
@@ -61,7 +79,7 @@
         addPreferencesFromResource(R.xml.accessibility_settings_for_setup_wizard);
 
         mDisplayMagnificationPreference = findPreference(DISPLAY_MAGNIFICATION_PREFERENCE);
-        mTalkbackPreference = findPreference(TALKBACK_PREFERENCE);
+        mTalkbackPreference = findPreference(SCREEN_READER_PREFERENCE);
     }
 
     @Override
@@ -75,41 +93,16 @@
         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(':');
+    private void launchTalkbackTutorial() {
+        try {
+            Intent intent = new Intent(Settings.ACTION_SCREEN_READER_TUTORIAL);
+            intent.setPackage(mTalkbackPackage);
+            startActivity(intent);
+        } catch (ActivityNotFoundException e) {
+            // This can happen if either the build is misconfigued or an OEM removes the intent
+            // filter for the Talkback tutorial from their implementation of Talkback.
+            Log.e(TAG, "Can't find Talkback Tutorial: " + Settings.ACTION_SCREEN_READER_TUTORIAL);
         }
-
-        if (servicesToEnable.length() > 0) {
-            servicesToEnable.deleteCharAt(servicesToEnable.length() - 1);
-        }
-
-        return servicesToEnable.toString();
     }
 
     @Override
@@ -130,17 +123,34 @@
             final int accessibilityEnabled =
                     Settings.Secure.getInt(resolver, Settings.Secure.ACCESSIBILITY_ENABLED, 0);
             if (accessibilityEnabled == 0) {
-                final String servicesToEnable = getAccessibilityServicesFiltered(
-                        getActivity(), AccessibilityServiceInfo.FEEDBACK_SPOKEN);
+                // Find the first installed screen reader.
+                String serviceToEnable = null;
+                final AccessibilityManager manager =
+                        getActivity().getSystemService(AccessibilityManager.class);
+                final List<AccessibilityServiceInfo> accessibilityServices =
+                        manager.getInstalledAccessibilityServiceList();
+                for (AccessibilityServiceInfo accessibilityService : accessibilityServices) {
+                    if ((accessibilityService.feedbackType
+                            & AccessibilityServiceInfo.FEEDBACK_SPOKEN) != 0) {
+                        final ServiceInfo serviceInfo =
+                                accessibilityService.getResolveInfo().serviceInfo;
+                        mTalkbackPackage = serviceInfo.packageName;
+                        final ComponentName componentName =
+                                new ComponentName(serviceInfo.packageName, serviceInfo.name);
+
+                        serviceToEnable = componentName.flattenToString();
+                        break;
+                    }
+                }
 
                 // Enable all accessibility services with spoken feedback type.
                 Settings.Secure.putString(resolver, Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
-                        servicesToEnable);
+                        serviceToEnable);
 
                 // Allow the services we just enabled to toggle touch exploration.
                 Settings.Secure.putString(resolver,
                         Settings.Secure.TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES,
-                        servicesToEnable);
+                        serviceToEnable);
 
                 // Enable touch exploration.
                 Settings.Secure.putInt(resolver, Settings.Secure.TOUCH_EXPLORATION_ENABLED, 1);
@@ -148,6 +158,13 @@
                 // Turn on accessibility mode last, since enabling accessibility with no
                 // services has no effect.
                 Settings.Secure.putInt(resolver, Settings.Secure.ACCESSIBILITY_ENABLED, 1);
+
+                // Since Talkback will display an error message if it's not active when the Tutorial
+                // is launched, launch Talkbck Tutorial with a delay.
+                new Handler().postDelayed(mStartTalkbackRunnable,
+                        SCREEN_READER_INITIALIZATION_DELAY_MS);
+            } else {
+                launchTalkbackTutorial();
             }
         }
 
diff --git a/src/com/android/settings/display/ScreenZoomSettings.java b/src/com/android/settings/display/ScreenZoomSettings.java
index 406c993..d87f230 100644
--- a/src/com/android/settings/display/ScreenZoomSettings.java
+++ b/src/com/android/settings/display/ScreenZoomSettings.java
@@ -50,7 +50,7 @@
         // This should be replaced once the final preview sample screen is in place.
         mPreviewSampleResIds = new int[]{R.layout.screen_zoom_preview_1,
                 R.layout.screen_zoom_preview_2,
-                R.layout.screen_zoom_preview_3};
+                R.layout.screen_zoom_preview_settings};
 
         final DisplayDensityUtils density = new DisplayDensityUtils(getContext());