Merge "Add ability to connect to only headset profile."
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/AccessibilitySettings.java b/src/com/android/settings/AccessibilitySettings.java
index f0c2b02..6cc5508 100644
--- a/src/com/android/settings/AccessibilitySettings.java
+++ b/src/com/android/settings/AccessibilitySettings.java
@@ -21,10 +21,7 @@
 import android.app.Service;
 import android.content.DialogInterface;
 import android.content.Intent;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
 import android.content.pm.ServiceInfo;
-import android.content.pm.PackageManager.NameNotFoundException;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.SystemProperties;
@@ -51,7 +48,7 @@
     private static final String DEFAULT_SCREENREADER_MARKET_LINK =
         "market://search?q=pname:com.google.android.marvin.talkback";
 
-    private final String TOGGLE_ACCESSIBILITY_SERVICE_CHECKBOX =
+    private final String TOGGLE_ACCESSIBILITY_CHECKBOX =
         "toggle_accessibility_service_checkbox";
 
     private static final String ACCESSIBILITY_SERVICES_CATEGORY =
@@ -63,9 +60,12 @@
     private static final String POWER_BUTTON_CATEGORY =
         "power_button_category";
 
-    private final String POWER_BUTTON_ENDS_CALL_CHECKBOX =
+    private static final String POWER_BUTTON_ENDS_CALL_CHECKBOX =
         "power_button_ends_call";
 
+    private final String KEY_TOGGLE_ACCESSIBILITY_SERVICE_CHECKBOX =
+        "key_toggle_accessibility_service_checkbox";
+
     private static final int DIALOG_ID_DISABLE_ACCESSIBILITY = 1;
     private static final int DIALOG_ID_ENABLE_SCRIPT_INJECTION = 2;
     private static final int DIALOG_ID_ENABLE_ACCESSIBILITY_SERVICE = 3;
@@ -96,7 +96,7 @@
             (PreferenceGroup) findPreference(ACCESSIBILITY_SERVICES_CATEGORY);
 
         mToggleAccessibilityCheckBox = (CheckBoxPreference) findPreference(
-                TOGGLE_ACCESSIBILITY_SERVICE_CHECKBOX);
+                TOGGLE_ACCESSIBILITY_CHECKBOX);
 
         mToggleScriptInjectionCheckBox = (CheckBoxPreference) findPreference(
                 TOGGLE_ACCESSIBILITY_SCRIPT_INJECTION_CHECKBOX);
@@ -131,16 +131,7 @@
     }
 
     @Override
-    public void onPause() {
-        super.onPause();
-
-        persistEnabledAccessibilityServices();
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-
+    public void onActivityCreated(Bundle savedInstanceState) {
         addAccessibilitServicePreferences();
 
         final HashSet<String> enabled = new HashSet<String>();
@@ -169,6 +160,9 @@
         if (!accessibilityServices.isEmpty()) {
             if (serviceState == 1) {
                 mToggleAccessibilityCheckBox.setChecked(true);
+                if (savedInstanceState != null) {
+                    restoreInstanceStrate(savedInstanceState);
+                }
             } else {
                 setAccessibilityServicePreferencesState(false);
             }
@@ -182,7 +176,41 @@
             mToggleAccessibilityCheckBox.setEnabled(false);
             // Notify user that they do not have any accessibility apps
             // installed and direct them to Market to get TalkBack
-            displayNoAppsAlert();
+            showDialog(DIALOG_ID_NO_ACCESSIBILITY_SERVICES);
+        }
+
+        super.onActivityCreated(savedInstanceState);
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+
+        persistEnabledAccessibilityServices();
+    }
+
+    @Override
+    public void onSaveInstanceState(Bundle outState) {
+        if (mToggleAccessibilityServiceCheckBox != null) {
+            outState.putString(KEY_TOGGLE_ACCESSIBILITY_SERVICE_CHECKBOX,
+                    mToggleAccessibilityServiceCheckBox.getKey());
+        }
+    }
+
+    /**
+     * Restores the instance state from <code>savedInstanceState</code>.
+     */
+    private void restoreInstanceStrate(Bundle savedInstanceState) {
+        String key = savedInstanceState.getString(KEY_TOGGLE_ACCESSIBILITY_SERVICE_CHECKBOX);
+        if (key != null) {
+            Preference preference = findPreference(key);
+            if (!(preference instanceof CheckBoxPreference)) {
+                throw new IllegalArgumentException(
+                        KEY_TOGGLE_ACCESSIBILITY_SERVICE_CHECKBOX
+                                + " must be mapped to an instance of a "
+                                + CheckBoxPreference.class.getName());
+            }
+            mToggleAccessibilityServiceCheckBox = (CheckBoxPreference) preference;
         }
     }
 
@@ -208,7 +236,7 @@
     public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
         final String key = preference.getKey();
 
-        if (TOGGLE_ACCESSIBILITY_SERVICE_CHECKBOX.equals(key)) {
+        if (TOGGLE_ACCESSIBILITY_CHECKBOX.equals(key)) {
             handleEnableAccessibilityStateChange((CheckBoxPreference) preference);
         } else if (POWER_BUTTON_ENDS_CALL_CHECKBOX.equals(key)) {
             boolean isChecked = ((CheckBoxPreference) preference).isChecked();
@@ -327,22 +355,6 @@
         }
     }
 
-    /**
-     * Displays a message telling the user that they do not have any accessibility
-     * related apps installed and that they can get TalkBack (Google's free screen
-     * reader) from Market.
-     */
-    private void displayNoAppsAlert() {
-        try {
-            PackageManager pm = getActivity().getPackageManager();
-            ApplicationInfo info = pm.getApplicationInfo("com.android.vending", 0);
-            showDialog(DIALOG_ID_NO_ACCESSIBILITY_SERVICES);
-        } catch (NameNotFoundException e) {
-            // This is a no-op if the user does not have Android Market
-            return;
-        }
-    }
-
     @Override
     public Dialog onCreateDialog(int dialogId) {
         switch (dialogId) {
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/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java
index a2f701d..6f0c91f 100644
--- a/src/com/android/settings/SettingsPreferenceFragment.java
+++ b/src/com/android/settings/SettingsPreferenceFragment.java
@@ -23,7 +23,6 @@
 import android.content.ContentResolver;
 import android.content.Intent;
 import android.content.pm.PackageManager;
-import android.content.res.Resources;
 import android.os.Bundle;
 import android.preference.PreferenceActivity;
 import android.preference.PreferenceFragment;
@@ -49,9 +48,6 @@
 
     private SettingsDialogFragment mDialogFragment;
 
-    private int mResultCode = Activity.RESULT_CANCELED;
-    private Intent mResultData;
-
     private Button mNextButton;
 
     @Override
@@ -114,18 +110,55 @@
     }
 
     public static class SettingsDialogFragment extends DialogFragment {
+        private static final String KEY_DIALOG_ID = "key_dialog_id";
+        private static final String KEY_PARENT_FRAGMENT_ID = "key_parent_fragment_id";
+
         private int mDialogId;
 
-        private DialogCreatable mFragment;
+        private Fragment mParentFragment;
+
+        public SettingsDialogFragment() {
+            /* do nothing */
+        }
 
         public SettingsDialogFragment(DialogCreatable fragment, int dialogId) {
             mDialogId = dialogId;
-            mFragment = fragment;
+            if (!(fragment instanceof Fragment)) {
+                throw new IllegalArgumentException("fragment argument must be an instance of "
+                        + Fragment.class.getName());
+            }
+            mParentFragment = (Fragment) fragment;
+        }
+
+        @Override
+        public void onActivityCreated(Bundle savedInstanceState) {
+            if (savedInstanceState != null) {
+                mDialogId = savedInstanceState.getInt(KEY_DIALOG_ID, 0);
+                int mParentFragmentId = savedInstanceState.getInt(KEY_PARENT_FRAGMENT_ID, -1);
+                if (mParentFragmentId > -1) {
+                    mParentFragment = getFragmentManager().findFragmentById(mParentFragmentId);
+                    if (!(mParentFragment instanceof DialogCreatable)) {
+                        throw new IllegalArgumentException(
+                                KEY_PARENT_FRAGMENT_ID + " must implement "
+                                        + DialogCreatable.class.getName());
+                    }
+                }
+            }
+            super.onActivityCreated(savedInstanceState);
+        }
+
+        @Override
+        public void onSaveInstanceState(Bundle outState) {
+            super.onSaveInstanceState(outState);
+            if (mParentFragment != null) {
+                outState.putInt(KEY_DIALOG_ID, mDialogId);
+                outState.putInt(KEY_PARENT_FRAGMENT_ID, mParentFragment.getId());
+            }
         }
 
         @Override
         public Dialog onCreateDialog(Bundle savedInstanceState) {
-            return mFragment.onCreateDialog(mDialogId);
+            return ((DialogCreatable) mParentFragment).onCreateDialog(mDialogId);
         }
 
         public int getDialogId() {
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/WirelessSettings.java b/src/com/android/settings/WirelessSettings.java
index 22fa8f6..5322555 100644
--- a/src/com/android/settings/WirelessSettings.java
+++ b/src/com/android/settings/WirelessSettings.java
@@ -127,7 +127,7 @@
         }
 
         // Remove NFC if its not available
-        if (NfcAdapter.getDefaultAdapter() == null) {
+        if (NfcAdapter.getDefaultAdapter(this) == null) {
             getPreferenceScreen().removePreference(nfc);
         }
 
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) {
diff --git a/src/com/android/settings/nfc/NfcEnabler.java b/src/com/android/settings/nfc/NfcEnabler.java
index e3a44b7..d1cec13 100644
--- a/src/com/android/settings/nfc/NfcEnabler.java
+++ b/src/com/android/settings/nfc/NfcEnabler.java
@@ -60,7 +60,7 @@
     public NfcEnabler(Context context, CheckBoxPreference checkBoxPreference) {
         mContext = context;
         mCheckbox = checkBoxPreference;
-        mNfcAdapter = NfcAdapter.getDefaultAdapter();
+        mNfcAdapter = NfcAdapter.getDefaultAdapter(context);
 
         if (mNfcAdapter == null) {
             // NFC is not supported
diff --git a/src/com/android/settings/vpn/VpnSettings.java b/src/com/android/settings/vpn/VpnSettings.java
index 4dfe21a..ea16f9d 100644
--- a/src/com/android/settings/vpn/VpnSettings.java
+++ b/src/com/android/settings/vpn/VpnSettings.java
@@ -216,23 +216,27 @@
         }
     }
 
+    private class ConnectDialog extends AlertDialog {
+        public ConnectDialog(Context context) {
+            super(context);
+            setTitle(String.format(getString(R.string.vpn_connect_to),
+                    mActiveProfile.getName()));
+            setButton(DialogInterface.BUTTON_POSITIVE,
+                    getString(R.string.vpn_connect_button),
+                    VpnSettings.this);
+            setButton(DialogInterface.BUTTON_NEGATIVE,
+                    getString(android.R.string.cancel),
+                    VpnSettings.this);
+            setView(mConnectingActor.createConnectView());
+        }
+        public void onBackPressed() {
+            changeState(mActiveProfile, VpnState.IDLE);
+            super.onBackPressed();
+        }
+    }
+
     private Dialog createConnectDialog() {
-        final Activity activity = getActivity();
-        return new AlertDialog.Builder(activity)
-                .setView(mConnectingActor.createConnectView())
-                .setTitle(String.format(activity.getString(R.string.vpn_connect_to),
-                        mActiveProfile.getName()))
-                .setPositiveButton(activity.getString(R.string.vpn_connect_button),
-                        this)
-                .setNegativeButton(activity.getString(android.R.string.cancel),
-                        this)
-                .setOnCancelListener(new DialogInterface.OnCancelListener() {
-                            public void onCancel(DialogInterface dialog) {
-                                removeDialog(DIALOG_CONNECT);
-                                changeState(mActiveProfile, VpnState.IDLE);
-                            }
-                        })
-                .create();
+        return new ConnectDialog(getActivity());
     }
 
     private Dialog createReconnectDialog(int id) {