auto import from //depot/cupcake/@136594
diff --git a/src/com/android/settings/LanguageSettings.java b/src/com/android/settings/LanguageSettings.java
index 8463d26..b5f325f 100644
--- a/src/com/android/settings/LanguageSettings.java
+++ b/src/com/android/settings/LanguageSettings.java
@@ -16,7 +16,6 @@
 
 package com.android.settings;
 
-import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.res.Configuration;
@@ -28,37 +27,20 @@
 import android.preference.PreferenceGroup;
 import android.preference.PreferenceScreen;
 import android.provider.Settings;
-import android.provider.Settings.System;
 import android.text.TextUtils;
 import android.view.inputmethod.InputMethodInfo;
 import android.view.inputmethod.InputMethodManager;
 
+import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 
 public class LanguageSettings extends PreferenceActivity {
     
-    private final String[] mSettingsUiKey = {
-            "auto_caps",
-            "auto_replace",
-            "auto_punctuate",
-    };
-    
-    // Note: Order of this array should correspond to the order of the above array
-    private final String[] mSettingsSystemId = {
-            System.TEXT_AUTO_CAPS,
-            System.TEXT_AUTO_REPLACE,
-            System.TEXT_AUTO_PUNCTUATE,
-    };
+    private boolean mHaveHardKeyboard;
 
-    // Note: Order of this array should correspond to the order of the above array
-    private final int[] mSettingsDefault = {
-            1,
-            1,
-            1,
-    };
-    
     private List<InputMethodInfo> mInputMethodProperties;
+    private List<CheckBoxPreference> mCheckboxes;
 
     final TextUtils.SimpleStringSplitter mStringColonSplitter
             = new TextUtils.SimpleStringSplitter(':');
@@ -80,20 +62,15 @@
             getPreferenceScreen().
                 removePreference(findPreference("language_category"));
         }
-    
+
         Configuration config = getResources().getConfiguration();
         if (config.keyboard != Configuration.KEYBOARD_QWERTY) {
             getPreferenceScreen().removePreference(
                     getPreferenceScreen().findPreference("hardkeyboard_category"));
         } else {
-            ContentResolver resolver = getContentResolver();
-            for (int i = 0; i < mSettingsUiKey.length; i++) {
-                CheckBoxPreference pref = (CheckBoxPreference) findPreference(mSettingsUiKey[i]);
-                pref.setChecked(System.getInt(resolver, mSettingsSystemId[i],
-                                              mSettingsDefault[i]) > 0);
-            }
+            mHaveHardKeyboard = true;
         }
-
+        mCheckboxes = new ArrayList<CheckBoxPreference>();
         onCreateIMM();
     }
     
@@ -116,18 +93,27 @@
             CharSequence label = property.loadLabel(getPackageManager());
             
             // Add a check box.
-            CheckBoxPreference chkbxPref = new CheckBoxPreference(this);
-            chkbxPref.setKey(prefKey);
-            chkbxPref.setTitle(label);
-            textCategory.addPreference(chkbxPref);
+            // Don't show the toggle if it's the only keyboard in the system
+            if (mHaveHardKeyboard || N > 1) {
+                CheckBoxPreference chkbxPref = new CheckBoxPreference(this);
+                chkbxPref.setKey(prefKey);
+                chkbxPref.setTitle(label);
+                textCategory.addPreference(chkbxPref);
+                mCheckboxes.add(chkbxPref);
+            }
 
             // If setting activity is available, add a setting screen entry.
             if (null != property.getSettingsActivity()) {
                 PreferenceScreen prefScreen = new PreferenceScreen(this, null);
                 prefScreen.setKey(property.getSettingsActivity());
-                CharSequence settingsLabel = getResources().getString(
-                        R.string.input_methods_settings_label_format, label);
-                prefScreen.setTitle(settingsLabel);
+                prefScreen.setTitle(label);
+                if (N == 1) {
+                    prefScreen.setSummary(getString(R.string.onscreen_keyboard_settings_summary));
+                } else {
+                    CharSequence settingsLabel = getResources().getString(
+                            R.string.input_methods_settings_label_format, label);
+                    prefScreen.setSummary(settingsLabel);
+                }
                 textCategory.addPreference(prefScreen);
             }
         }
@@ -154,8 +140,11 @@
             final String id = mInputMethodProperties.get(i).getId();
             CheckBoxPreference pref = (CheckBoxPreference) findPreference(mInputMethodProperties
                     .get(i).getId());
-            pref.setChecked(enabled.contains(id));
+            if (pref != null) {
+                pref.setChecked(enabled.contains(id));
+            }
         }
+        updateCheckboxes();
         mLastTickedInputMethodId = null;
     }
 
@@ -173,7 +162,7 @@
             final String id = mInputMethodProperties.get(i).getId();
             CheckBoxPreference pref = (CheckBoxPreference) findPreference(id);
             boolean hasIt = id.equals(mLastInputMethodId);
-            if (pref.isChecked()) {
+            if ((N == 1 && !mHaveHardKeyboard) || (pref != null && pref.isChecked())) {
                 if (builder.length() > 0) builder.append(':');
                 builder.append(id);
                 if (firstEnabled < 0) {
@@ -200,18 +189,30 @@
             Settings.Secure.DEFAULT_INPUT_METHOD, mLastInputMethodId);
     }
 
-    @Override
-    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
-
-        // Physical keyboard stuff
-        for (int i = 0; i < mSettingsUiKey.length; i++) {
-            if (mSettingsUiKey[i].equals(preference.getKey())) {
-                System.putInt(getContentResolver(), mSettingsSystemId[i], 
-                        ((CheckBoxPreference)preference).isChecked()? 1 : 0);
-                return true;
+    private void updateCheckboxes() {
+        final int count = mCheckboxes.size();
+        int nChecked = 0;
+        int iChecked = -1;
+        // See how many are checked and note the only or last checked one
+        for (int i = 0; i < count; i++) {
+            if (mCheckboxes.get(i).isChecked()) {
+                iChecked = i;
+                nChecked++;
             }
         }
-
+        // 
+        if (nChecked == 1) {
+            mCheckboxes.get(iChecked).setEnabled(false);
+        } else {
+            for (int i = 0; i < count; i++) {
+                mCheckboxes.get(i).setEnabled(true);
+            }
+        }
+    }
+    
+    @Override
+    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
+        
         // Input Method stuff
         // Those monkeys kept committing suicide, so we add this property
         // to disable this functionality
@@ -240,7 +241,7 @@
                 }
             }
         }
-
+        updateCheckboxes();
         return super.onPreferenceTreeClick(preferenceScreen, preference);
     }
 
diff --git a/src/com/android/settings/PhysicalKeyboardSettings.java b/src/com/android/settings/PhysicalKeyboardSettings.java
new file mode 100644
index 0000000..acd0bd6
--- /dev/null
+++ b/src/com/android/settings/PhysicalKeyboardSettings.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2009 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;
+
+import android.content.ContentResolver;
+import android.os.Bundle;
+import android.preference.CheckBoxPreference;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.preference.PreferenceScreen;
+import android.provider.Settings.System;
+
+public class PhysicalKeyboardSettings extends PreferenceActivity {
+    
+    private final String[] mSettingsUiKey = {
+            "auto_caps",
+            "auto_replace",
+            "auto_punctuate",
+    };
+    
+    // Note: Order of this array should correspond to the order of the above array
+    private final String[] mSettingsSystemId = {
+            System.TEXT_AUTO_CAPS,
+            System.TEXT_AUTO_REPLACE,
+            System.TEXT_AUTO_PUNCTUATE,
+    };
+
+    // Note: Order of this array should correspond to the order of the above array
+    private final int[] mSettingsDefault = {
+            1,
+            1,
+            1,
+    };
+
+    @Override
+    protected void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+
+        addPreferencesFromResource(R.xml.keyboard_settings);
+    }
+    
+    @Override
+    protected void onResume() {
+        super.onResume();
+        ContentResolver resolver = getContentResolver();
+        for (int i = 0; i < mSettingsUiKey.length; i++) {
+            CheckBoxPreference pref = (CheckBoxPreference) findPreference(mSettingsUiKey[i]);
+            pref.setChecked(System.getInt(resolver, mSettingsSystemId[i],
+                                          mSettingsDefault[i]) > 0);
+        }
+    }
+
+
+    @Override
+    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
+
+        // Physical keyboard stuff
+        for (int i = 0; i < mSettingsUiKey.length; i++) {
+            if (mSettingsUiKey[i].equals(preference.getKey())) {
+                System.putInt(getContentResolver(), mSettingsSystemId[i], 
+                        ((CheckBoxPreference)preference).isChecked()? 1 : 0);
+                return true;
+            }
+        }
+
+        return super.onPreferenceTreeClick(preferenceScreen, preference);
+    }
+
+}
diff --git a/src/com/android/settings/RadioInfo.java b/src/com/android/settings/RadioInfo.java
index dbad45d..5df9313 100644
--- a/src/com/android/settings/RadioInfo.java
+++ b/src/com/android/settings/RadioInfo.java
@@ -560,7 +560,7 @@
 
         // Get the toggle-data-on-boot menu item in the right state.
         item = menu.findItem(MENU_ITEM_TOGGLE_DATA_ON_BOOT);
-        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this.getApplication());
+        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(phone.getContext());
         boolean value = sp.getBoolean(GSMPhone.DATA_DISABLED_ON_BOOT_KEY, false);
         if (value) {
             item.setTitle(R.string.radioInfo_menu_enableDataOnBoot);
@@ -584,7 +584,7 @@
 
     private void updateQxdmState(Boolean newQxdmStatus) {
         SharedPreferences sp = 
-          PreferenceManager.getDefaultSharedPreferences(this.getApplication());
+          PreferenceManager.getDefaultSharedPreferences(phone.getContext());
         mQxdmLogEnabled = sp.getBoolean("qxdmstatus", false);
         // This is called from onCreate, onResume, and the handler when the status
         // is updated. 
@@ -602,14 +602,14 @@
     }
 
     private void setCiphPref(boolean value) {
-        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this.getApplication());
+        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(phone.getContext());
         SharedPreferences.Editor editor = sp.edit();
         editor.putBoolean(GSMPhone.CIPHERING_KEY, value);
         editor.commit();
     }
 
     private boolean getCiphPref() {
-        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this.getApplication());
+        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(phone.getContext());
         boolean ret = sp.getBoolean(GSMPhone.CIPHERING_KEY, true);
         return ret;
     }
@@ -1044,7 +1044,7 @@
     };
 
     private void toggleDataDisabledOnBoot() {
-        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this.getApplication());
+        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(phone.getContext());
         SharedPreferences.Editor editor = sp.edit();
         boolean value = sp.getBoolean(GSMPhone.DATA_DISABLED_ON_BOOT_KEY, false);
         editor.putBoolean(GSMPhone.DATA_DISABLED_ON_BOOT_KEY, !value);
diff --git a/src/com/android/settings/UserDictionarySettings.java b/src/com/android/settings/UserDictionarySettings.java
index aeddcf7..ef22ee1 100644
--- a/src/com/android/settings/UserDictionarySettings.java
+++ b/src/com/android/settings/UserDictionarySettings.java
@@ -1,5 +1,5 @@
 /**
- * Copyright (C) 2007 Google Inc.
+ * Copyright (C) 2009 Google Inc.
  *
  * 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
@@ -136,7 +136,7 @@
     
     @Override
     protected void onListItemClick(ListView l, View v, int position, long id) {
-        showAddOrEditDialog(getWord(position));
+        openContextMenu(v);
     }
 
     @Override
@@ -145,8 +145,10 @@
         
         AdapterContextMenuInfo adapterMenuInfo = (AdapterContextMenuInfo) menuInfo;
         menu.setHeaderTitle(getWord(adapterMenuInfo.position));
-        menu.add(0, CONTEXT_MENU_EDIT, 0, R.string.user_dict_settings_context_menu_edit_title);
-        menu.add(0, CONTEXT_MENU_DELETE, 0, R.string.user_dict_settings_context_menu_delete_title);
+        menu.add(0, CONTEXT_MENU_EDIT, 0, 
+                R.string.user_dict_settings_context_menu_edit_title);
+        menu.add(0, CONTEXT_MENU_DELETE, 0, 
+                R.string.user_dict_settings_context_menu_delete_title);
     }
     
     @Override
@@ -203,7 +205,9 @@
                 | InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE);
         
         return new AlertDialog.Builder(this)
-                .setTitle(R.string.user_dict_settings_add_dialog_title)
+                .setTitle(mDialogEditingWord != null 
+                        ? R.string.user_dict_settings_edit_dialog_title 
+                        : R.string.user_dict_settings_add_dialog_title)
                 .setView(content)
                 .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                     public void onClick(DialogInterface dialog, int which) {
@@ -216,10 +220,12 @@
                     }})
                 .create();
     }
-
     @Override
     protected void onPrepareDialog(int id, Dialog d) {
         AlertDialog dialog = (AlertDialog) d;
+        d.setTitle(mDialogEditingWord != null 
+                        ? R.string.user_dict_settings_edit_dialog_title 
+                        : R.string.user_dict_settings_add_dialog_title);
         EditText editText = (EditText) dialog.findViewById(R.id.edittext);
         editText.setText(mDialogEditingWord);
     }
diff --git a/src/com/android/settings/wifi/AccessPointDialog.java b/src/com/android/settings/wifi/AccessPointDialog.java
index 917ed96..919f7fc 100644
--- a/src/com/android/settings/wifi/AccessPointDialog.java
+++ b/src/com/android/settings/wifi/AccessPointDialog.java
@@ -24,6 +24,7 @@
 import android.net.wifi.WifiInfo;
 import android.net.wifi.WifiManager;
 import android.os.Bundle;
+import android.text.InputType;
 import android.text.TextUtils;
 import android.text.format.Formatter;
 import android.text.method.PasswordTransformationMethod;
@@ -589,11 +590,9 @@
     
     private void setShowPassword(boolean showPassword) {
         if (mPasswordEdit != null) {
-            // Toggle password
-            mPasswordEdit.setTransformationMethod(
-                    showPassword ?
-                            null :
-                            PasswordTransformationMethod.getInstance());
+            mPasswordEdit.setInputType(InputType.TYPE_CLASS_TEXT |
+                    (showPassword ? InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
+                            : InputType.TYPE_TEXT_VARIATION_PASSWORD));
         }
     }