Move Voice input/output settings to Language & keyboard

Bug: 3267042
Change-Id: I127a2e9d11fb70283812e68979bdde3976e32cf9
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 15dc279..1b80ce8 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -301,6 +301,7 @@
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <action android:name="android.settings.INPUT_METHOD_SETTINGS" />
+                <action android:name="com.android.settings.VOICE_INPUT_OUTPUT_SETTINGS" />
                 <category android:name="android.intent.category.VOICE_LAUNCH" />
                 <category android:name="android.intent.category.DEFAULT" />
                 <category android:name="com.android.settings.SHORTCUT" />
@@ -631,21 +632,6 @@
                 android:resource="@id/accessibility_settings" />
         </activity>
 
-        <activity android:name="Settings$VoiceInputOutputSettingsActivity"
-                android:theme="@android:style/Theme.Holo"
-                android:label="@string/voice_input_output_settings"
-                android:targetActivity="Settings">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <action android:name="com.android.settings.VOICE_INPUT_OUTPUT_SETTINGS" />
-                <category android:name="android.intent.category.DEFAULT" />
-            </intent-filter>
-            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
-                android:value="com.android.settings.VoiceInputOutputSettings" />
-            <meta-data android:name="com.android.settings.TOP_LEVEL_HEADER_ID"
-                android:resource="@id/voice_input_output_settings" />
-        </activity>
-
         <activity android:name="TextToSpeechSettings" android:label="@string/tts_settings">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 8c94635..8bc4139 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2181,7 +2181,7 @@
 
     <!-- Language Settings --> <skip />
     <!-- Title of setting on main settings screen.  This item will take the user to the screen to tweak settings realted to locale and text -->
-    <string name="language_settings">Language &amp; keyboard</string>
+    <string name="language_settings">Language &amp; input</string>
     <!-- Title of Language and keyboard settings screen -->
     <string name="language_keyboard_settings_title">Language &amp; keyboard settings</string>
     <!-- On Language & keyboard settings screen, heading. Inside the "Language & keyboard settings" screen, this is the header for settings that relate to language (select the system language, user dictionary for the language). -->
diff --git a/res/xml/language_settings.xml b/res/xml/language_settings.xml
index 2037fc7..3afe861 100644
--- a/res/xml/language_settings.xml
+++ b/res/xml/language_settings.xml
@@ -33,6 +33,28 @@
         android:summary="@string/user_dict_settings_summary">
     </PreferenceScreen>
 
+    <PreferenceCategory android:key="voice_input_category"
+            android:title="@string/voice_input_category" >
+
+        <!-- entries, entryValues, and defaultValue will be populated programmatically. -->
+        <ListPreference
+                android:key="recognizer"
+                android:title="@string/recognizer_title"
+                android:dialogTitle="@string/recognizer_title" />
+
+        <!-- An intent for this preference will be populated programmatically. -->
+        <PreferenceScreen android:key="recognizer_settings"
+                android:title="@string/recognizer_settings_title" />
+    </PreferenceCategory>
+
+    <PreferenceCategory android:key="voice_output_category"
+            android:title="@string/voice_output_category" >
+
+        <PreferenceScreen android:key="tts_settings"
+                android:fragment="com.android.settings.TextToSpeechSettings"
+                android:title="@string/tts_settings_title" />
+    </PreferenceCategory>
+
     <PreferenceCategory android:key="keyboard_settings_category"
             android:title="@string/keyboard_settings_category">
 
diff --git a/res/xml/settings_headers.xml b/res/xml/settings_headers.xml
index 25f9368..5411308 100644
--- a/res/xml/settings_headers.xml
+++ b/res/xml/settings_headers.xml
@@ -119,14 +119,6 @@
         android:icon="@drawable/ic_settings_language"
         android:title="@string/language_settings" />
 
-    <!-- Voice input & output -->
-
-    <header
-        android:id="@+id/voice_input_output_settings"
-        android:fragment="com.android.settings.VoiceInputOutputSettings"
-        android:icon="@drawable/ic_settings_speech"
-        android:title="@string/voice_input_output_settings" />
-
     <!-- Accessibility feedback -->
 
     <header
diff --git a/res/xml/voice_input_output_settings.xml b/res/xml/voice_input_output_settings.xml
deleted file mode 100644
index 1645d88..0000000
--- a/res/xml/voice_input_output_settings.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 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.
--->
-
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
-        android:title="@string/voice_input_output_settings_title"
-        android:key="parent">
-
-    <PreferenceCategory android:key="voice_input_category"
-            android:title="@string/voice_input_category" />
-    
-    <!-- entries, entryValues, and defaultValue will be populated programmatically. -->
-    <ListPreference
-            android:key="recognizer"
-            android:title="@string/recognizer_title"
-            android:dialogTitle="@string/recognizer_title" />
-
-    <!-- An intent for this preference will be populated programmatically. -->
-    <PreferenceScreen android:key="recognizer_settings"
-            android:title="@string/recognizer_settings_title" />
-
-    <PreferenceCategory android:key="voice_output_category"
-            android:title="@string/voice_output_category" />
-
-    <PreferenceScreen android:key="tts_settings"
-            android:fragment="com.android.settings.TextToSpeechSettings"
-            android:title="@string/tts_settings_title" />
-
-</PreferenceScreen>
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index 09584ad..00706ad 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -209,7 +209,6 @@
     public static class PrivacySettingsActivity extends Settings { }
     public static class DockSettingsActivity extends Settings { }
     public static class RunningServicesActivity extends Settings { }
-    public static class VoiceInputOutputSettingsActivity extends Settings { }
     public static class ManageAccountsSettingsActivity extends Settings { }
     public static class PowerUsageSummaryActivity extends Settings { }
     public static class AccountSyncSettingsActivity extends Settings { }
diff --git a/src/com/android/settings/VoiceInputOutputSettings.java b/src/com/android/settings/VoiceInputOutputSettings.java
index b07c69e..1e86801 100644
--- a/src/com/android/settings/VoiceInputOutputSettings.java
+++ b/src/com/android/settings/VoiceInputOutputSettings.java
@@ -16,9 +16,6 @@
 
 package com.android.settings;
 
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
 import android.content.ComponentName;
 import android.content.Intent;
 import android.content.pm.PackageManager;
@@ -28,7 +25,6 @@
 import android.content.res.Resources;
 import android.content.res.TypedArray;
 import android.content.res.XmlResourceParser;
-import android.os.Bundle;
 import android.preference.ListPreference;
 import android.preference.Preference;
 import android.preference.PreferenceCategory;
@@ -45,15 +41,16 @@
 import java.util.HashMap;
 import java.util.List;
 
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
 /**
  * Settings screen for voice input/output.
  */
-public class VoiceInputOutputSettings extends SettingsPreferenceFragment
-        implements OnPreferenceChangeListener {
-    
+public class VoiceInputOutputSettings implements OnPreferenceChangeListener {
+
     private static final String TAG = "VoiceInputOutputSettings";
-    
-    private static final String KEY_PARENT = "parent";
+
     private static final String KEY_VOICE_INPUT_CATEGORY = "voice_input_category";
     private static final String KEY_RECOGNIZER = "recognizer";
     private static final String KEY_RECOGNIZER_SETTINGS = "recognizer_settings";
@@ -62,41 +59,42 @@
     private PreferenceCategory mVoiceInputCategory;
     private ListPreference mRecognizerPref;
     private PreferenceScreen mSettingsPref;
-    
+    private SettingsPreferenceFragment mFragment;
+
     private HashMap<String, ResolveInfo> mAvailableRecognizersMap;
-    
-    @Override
-    public void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
 
-        addPreferencesFromResource(R.xml.voice_input_output_settings);
+    public VoiceInputOutputSettings(SettingsPreferenceFragment fragment) {
+        mFragment = fragment;
+    }
 
-        mParent = (PreferenceGroup) findPreference(KEY_PARENT);
+    public void onCreate() {
+
+        mParent = (PreferenceGroup) mFragment.getPreferenceScreen();
         mVoiceInputCategory = (PreferenceCategory) mParent.findPreference(KEY_VOICE_INPUT_CATEGORY);
-        mRecognizerPref = (ListPreference) mParent.findPreference(KEY_RECOGNIZER);
+        mRecognizerPref = (ListPreference) mVoiceInputCategory.findPreference(KEY_RECOGNIZER);
         mRecognizerPref.setOnPreferenceChangeListener(this);
-        mSettingsPref = (PreferenceScreen) mParent.findPreference(KEY_RECOGNIZER_SETTINGS);
-        
+        mSettingsPref = (PreferenceScreen)
+                mVoiceInputCategory.findPreference(KEY_RECOGNIZER_SETTINGS);
+
         mAvailableRecognizersMap = new HashMap<String, ResolveInfo>();
-        
+
         populateOrRemoveRecognizerPreference();
     }
-    
+
     private void populateOrRemoveRecognizerPreference() {
-        List<ResolveInfo> availableRecognitionServices = getPackageManager().queryIntentServices(
+        List<ResolveInfo> availableRecognitionServices =
+                mFragment.getPackageManager().queryIntentServices(
                 new Intent(RecognitionService.SERVICE_INTERFACE), PackageManager.GET_META_DATA);
         int numAvailable = availableRecognitionServices.size();
         
         if (numAvailable == 0) {
             // No recognizer available - remove all related preferences.
-            removePreference(mVoiceInputCategory);
-            removePreference(mRecognizerPref);
-            removePreference(mSettingsPref);
+            mFragment.getPreferenceScreen().removePreference(mVoiceInputCategory);
         } else if (numAvailable == 1) {
             // Only one recognizer available, so don't show the list of choices, but do
             // set up the link to settings for the available recognizer.
-            removePreference(mRecognizerPref);
-            
+            mVoiceInputCategory.removePreference(mRecognizerPref);
+
             // But first set up the available recognizers map with just the one recognizer.
             ResolveInfo resolveInfo = availableRecognitionServices.get(0);
             String recognizerComponent =
@@ -106,20 +104,14 @@
             mAvailableRecognizersMap.put(recognizerComponent, resolveInfo);
             
             String currentSetting = Settings.Secure.getString(
-                    getContentResolver(), Settings.Secure.VOICE_RECOGNITION_SERVICE);
+                    mFragment.getContentResolver(), Settings.Secure.VOICE_RECOGNITION_SERVICE);
             updateSettingsLink(currentSetting);
         } else {
             // Multiple recognizers available, so show the full list of choices.
             populateRecognizerPreference(availableRecognitionServices);
         }
     }
-    
-    private void removePreference(Preference pref) {
-        if (pref != null) {
-            mParent.removePreference(pref);
-        }
-    }
-    
+
     private void populateRecognizerPreference(List<ResolveInfo> recognizers) {
         int size = recognizers.size();
         CharSequence[] entries = new CharSequence[size];
@@ -127,7 +119,7 @@
         
         // Get the current value from the secure setting.
         String currentSetting = Settings.Secure.getString(
-                getContentResolver(), Settings.Secure.VOICE_RECOGNITION_SERVICE);
+                mFragment.getContentResolver(), Settings.Secure.VOICE_RECOGNITION_SERVICE);
         
         // Iterate through all the available recognizers and load up their info to show
         // in the preference. Also build up a map of recognizer component names to their
@@ -140,7 +132,7 @@
             
             mAvailableRecognizersMap.put(recognizerComponent, resolveInfo);
 
-            entries[i] = resolveInfo.loadLabel(getPackageManager());
+            entries[i] = resolveInfo.loadLabel(mFragment.getPackageManager());
             values[i] = recognizerComponent;
         }
         
@@ -159,13 +151,14 @@
         XmlResourceParser parser = null;
         String settingsActivity = null;
         try {
-            parser = si.loadXmlMetaData(getPackageManager(), RecognitionService.SERVICE_META_DATA);
+            parser = si.loadXmlMetaData(mFragment.getPackageManager(),
+                    RecognitionService.SERVICE_META_DATA);
             if (parser == null) {
                 throw new XmlPullParserException("No " + RecognitionService.SERVICE_META_DATA +
                         " meta-data for " + si.packageName);
             }
             
-            Resources res = getPackageManager().getResourcesForApplication(
+            Resources res = mFragment.getPackageManager().getResourcesForApplication(
                     si.applicationInfo);
             
             AttributeSet attrs = Xml.asAttributeSet(parser);
@@ -200,25 +193,24 @@
             // No settings preference available - hide the preference.
             Log.w(TAG, "no recognizer settings available for " + si.packageName);
             mSettingsPref.setIntent(null);
-            mParent.removePreference(mSettingsPref);
+            mVoiceInputCategory.removePreference(mSettingsPref);
         } else {
             Intent i = new Intent(Intent.ACTION_MAIN);
             i.setComponent(new ComponentName(si.packageName, settingsActivity));
             mSettingsPref.setIntent(i);
-            mRecognizerPref.setSummary(currentRecognizer.loadLabel(getPackageManager()));
+            mRecognizerPref.setSummary(currentRecognizer.loadLabel(mFragment.getPackageManager()));
         }
     }
     
     public boolean onPreferenceChange(Preference preference, Object newValue) {
         if (preference == mRecognizerPref) {
             String setting = (String) newValue;
-            
+
             // Put the new value back into secure settings.
-            Settings.Secure.putString(
-                    getContentResolver(),
+            Settings.Secure.putString(mFragment.getContentResolver(),
                     Settings.Secure.VOICE_RECOGNITION_SERVICE,
                     setting);
-            
+
             // Update the settings item so it points to the right settings.
             updateSettingsLink(setting);
         }
diff --git a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
index 22cec54..ef59201 100644
--- a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
+++ b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
@@ -19,6 +19,7 @@
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.Utils;
+import com.android.settings.VoiceInputOutputSettings;
 
 import android.app.AlertDialog;
 import android.content.Context;
@@ -81,6 +82,8 @@
         }
         mCheckboxes = new ArrayList<CheckBoxPreference>();
         onCreateIMM();
+
+        new VoiceInputOutputSettings(this).onCreate();
     }
 
     private boolean isSystemIme(InputMethodInfo property) {