Merge "Get rid of the silent mode pref on xlarge." into honeycomb
diff --git a/res/layout-xlarge/date_time_settings_setupwizard.xml b/res/layout-xlarge/date_time_settings_setupwizard.xml
index 73aba01..328a014 100644
--- a/res/layout-xlarge/date_time_settings_setupwizard.xml
+++ b/res/layout-xlarge/date_time_settings_setupwizard.xml
@@ -43,6 +43,8 @@
         android:layout_width="match_parent"
         android:layout_height="3dip"
         android:layout_below="@id/title"
+        android:layout_marginTop="6dip"
+        android:layout_marginBottom="7dip"
         android:background="@color/divider_color" />
 
     <!-- timezone -->
diff --git a/res/xml/dock_settings.xml b/res/xml/dock_settings.xml
index d3d6e43..177da9f 100644
--- a/res/xml/dock_settings.xml
+++ b/res/xml/dock_settings.xml
@@ -23,8 +23,7 @@
     <PreferenceScreen
         android:key="dock_audio"
         android:title="@string/dock_audio_settings_title"
-        android:summary="@string/dock_settings_summary"
-        android:widgetLayout="@*android:layout/preference_dialog" />
+        android:summary="@string/dock_settings_summary" />
 
     <CheckBoxPreference
         android:key="dock_sounds"
diff --git a/res/xml/language_settings.xml b/res/xml/language_settings.xml
index 9230496..b7934e6 100644
--- a/res/xml/language_settings.xml
+++ b/res/xml/language_settings.xml
@@ -58,8 +58,7 @@
     <PreferenceCategory android:key="keyboard_settings_category"
             android:title="@string/keyboard_settings_category">
         <PreferenceScreen android:key="current_input_method"
-                android:title="@string/current_input_method"
-                android:widgetLayout="@*android:layout/preference_dialog" />
+                android:title="@string/current_input_method" />
 
         <ListPreference android:key="input_method_selector"
                 android:title="@string/input_method_selector"
diff --git a/src/com/android/settings/wifi/WifiConfigUiForSetupWizardXL.java b/src/com/android/settings/wifi/WifiConfigUiForSetupWizardXL.java
index 4de7ef5..bbd8f80 100644
--- a/src/com/android/settings/wifi/WifiConfigUiForSetupWizardXL.java
+++ b/src/com/android/settings/wifi/WifiConfigUiForSetupWizardXL.java
@@ -75,21 +75,28 @@
         // R.id.security_fields is the only parent for possible EditTexts. Possibly we need to
         // check parentand detect visibility manually.
         if (mView.findViewById(R.id.security_fields).getVisibility() == View.VISIBLE) {
-            // Set Focus to password View.
-            final View viewToBeFocused = mView.findViewById(R.id.password);
-            if (viewToBeFocused == null) {
-                Log.w(TAG, "password field to be focused not found.");
-            } else if (!(viewToBeFocused instanceof EditText)) {
-                Log.w(TAG, "password field is not EditText");
-            } else {
-                // After acquiring the focus, we show software keyboard.
-                viewToBeFocused.setOnFocusChangeListener(this);
-                final boolean requestFocusResult = viewToBeFocused.requestFocus();
-                Log.i(TAG, String.format("Focus request  %s.",
-                        (requestFocusResult ? "successful" : "failed")));
-                if (!requestFocusResult) {
-                    viewToBeFocused.setOnFocusChangeListener(null);
-                }
+            requestFocusAndShowKeyboard(R.id.password);
+        }
+    }
+
+    /**
+     * @param editViewId must be EditView
+     */
+    public void requestFocusAndShowKeyboard(int editViewId) {
+        // Set Focus to password View.
+        final View viewToBeFocused = mView.findViewById(editViewId);
+        if (viewToBeFocused == null) {
+            Log.w(TAG, "password field to be focused not found.");
+        } else if (!(viewToBeFocused instanceof EditText)) {
+            Log.w(TAG, "password field is not EditText");
+        } else {
+            // After acquiring the focus, we show software keyboard.
+            viewToBeFocused.setOnFocusChangeListener(this);
+            final boolean requestFocusResult = viewToBeFocused.requestFocus();
+            Log.i(TAG, String.format("Focus request  %s.",
+                    (requestFocusResult ? "successful" : "failed")));
+            if (!requestFocusResult) {
+                viewToBeFocused.setOnFocusChangeListener(null);
             }
         }
     }
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 5239e00..857e153 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -446,6 +446,10 @@
                 updateConnectionState(WifiInfo.getDetailedStateOf((SupplicantState)
                         intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE)));
             }
+
+            if (mInXlSetupWizard) {
+                ((WifiSettingsForSetupWizardXL)getActivity()).onSupplicantStateChanged(intent);
+            }
         } else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {
             NetworkInfo info = (NetworkInfo) intent.getParcelableExtra(
                     WifiManager.EXTRA_NETWORK_INFO);
@@ -589,11 +593,11 @@
                     }
                 } else if (config.networkId != INVALID_NETWORK_ID) {
                     if (mSelectedAccessPoint != null) {
-                        mWifiManager.saveNetwork(config);
+                        saveNetwork(config);
                     }
                 } else {
                     if (configController.isEdit() || requireKeyStore(config)) {
-                        mWifiManager.saveNetwork(config);
+                        saveNetwork(config);
                     } else {
                         mWifiManager.connectNetwork(config);
                     }
@@ -607,6 +611,14 @@
         updateAccessPoints();
     }
 
+    private void saveNetwork(WifiConfiguration config) {
+        if (mInXlSetupWizard) {
+            ((WifiSettingsForSetupWizardXL)getActivity()).onSaveNetwork(config);
+        } else {
+            mWifiManager.saveNetwork(config);
+        }
+    }
+
     /* package */ void forget() {
         mWifiManager.forgetNetwork(mSelectedAccessPoint.networkId);
 
diff --git a/src/com/android/settings/wifi/WifiSettingsForSetupWizardXL.java b/src/com/android/settings/wifi/WifiSettingsForSetupWizardXL.java
index d55cbe4..f420f34 100644
--- a/src/com/android/settings/wifi/WifiSettingsForSetupWizardXL.java
+++ b/src/com/android/settings/wifi/WifiSettingsForSetupWizardXL.java
@@ -20,7 +20,9 @@
 
 import android.app.Activity;
 import android.content.Context;
+import android.content.Intent;
 import android.net.NetworkInfo.DetailedState;
+import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiManager;
 import android.os.Bundle;
 import android.os.Handler;
@@ -87,6 +89,10 @@
 
     private final Handler mHandler = new Handler();
 
+    private int mPreviousWpsFieldsVisibility = View.GONE;
+    private int mPreviousSecurityFieldsVisibility = View.GONE;
+    private int mPreviousTypeVisibility = View.GONE;
+
     // At first, we set "Skip" button disabled so that users won't press it soon after the screen
     // migration. The button is enabled after the wifi module returns some result
     // (a list of available network, etc.) One possible problem is that the notification from the
@@ -233,9 +239,9 @@
             mProgressBar.setIndeterminate(false);
             mProgressBar.setProgress(2);
             mProgressText.setText(Summary.get(this, state));
-            mStatusText.setVisibility(View.VISIBLE);
             mStatusText.setText(R.string.wifi_setup_status_proceed_to_next);
 
+            mConnectButton.setVisibility(View.GONE);
             mAddNetworkButton.setVisibility(View.GONE);
             mRefreshButton.setVisibility(View.GONE);
             mBackButton.setVisibility(View.VISIBLE);
@@ -260,13 +266,11 @@
 
         mAddNetworkButton.setEnabled(true);
         mRefreshButton.setEnabled(true);
-        mSkipOrNextButton.setEnabled(true);
     }
 
     private void showConnectingStatus() {
         mProgressBar.setIndeterminate(false);
         mProgressBar.setProgress(1);
-        mStatusText.setVisibility(View.VISIBLE);
         mStatusText.setText(R.string.wifi_setup_status_connecting);
         mProgressText.setText(Summary.get(this, DetailedState.CONNECTING));
     }
@@ -276,7 +280,6 @@
         ((Button)findViewById(R.id.wifi_setup_add_network)).setEnabled(false);
         ((Button)findViewById(R.id.wifi_setup_refresh_list)).setEnabled(false);
         mProgressText.setText(Summary.get(this, DetailedState.SCANNING));
-        mStatusText.setVisibility(View.VISIBLE);
         mStatusText.setText(R.string.wifi_setup_status_scanning);
     }
 
@@ -294,6 +297,15 @@
      * "Add network" button, meaning there's no selected access point.
      */
     /* package */ void showConfigUi(AccessPoint selectedAccessPoint, boolean edit) {
+        if (selectedAccessPoint != null &&
+                (selectedAccessPoint.security == AccessPoint.SECURITY_WEP ||
+                        selectedAccessPoint.security == AccessPoint.SECURITY_PSK)) {
+            // We forcibly set edit as true so that users can modify every field if they want,
+            // while config UI doesn't allow them to edit some of them when edit is false
+            // (e.g. password field is hiden when edit==false).
+            edit = true;
+        }
+
         // We don't want to keep scanning Wi-Fi networks during users' configuring one network.
         mWifiSettings.pauseWifiScan();
 
@@ -310,7 +322,6 @@
         } else {
             view.findViewById(R.id.wifi_general_info).setVisibility(View.GONE);
         }
-        // parent.addView(view);
 
         if (selectedAccessPoint != null &&
                 selectedAccessPoint.security == AccessPoint.SECURITY_NONE) {
@@ -320,10 +331,15 @@
             mStatusText.setText(R.string.wifi_setup_status_eap_not_supported);
             mConnectButton.setVisibility(View.GONE);
         } else {
-            // mStatusText.setText(R.string.wifi_setup_status_edit_network);
-            mStatusText.setVisibility(View.GONE);
+            mStatusText.setText(R.string.wifi_setup_status_edit_network);
             mConnectButton.setVisibility(View.VISIBLE);
         }
+
+        // WifiConfigController shows Connect button as "Save" when edit==true and a user
+        // tried to connect the network.
+        // In SetupWizard, we just show the button as "Connect" instead.
+        mConnectButton.setText(R.string.wifi_connect);
+
         mAddNetworkButton.setVisibility(View.GONE);
         mRefreshButton.setVisibility(View.GONE);
         mSkipOrNextButton.setVisibility(View.GONE);
@@ -345,10 +361,24 @@
         // Might be better to delay showing this button.
         mBackButton.setVisibility(View.VISIBLE);
 
-        findViewById(R.id.wps_fields).setVisibility(View.GONE);
-        findViewById(R.id.security_fields).setVisibility(View.GONE);
-        findViewById(R.id.type).setVisibility(View.GONE);
+        // We need to restore visibility status when the device failed to connect the network.
+        final View wpsFieldView = findViewById(R.id.wps_fields);
+        if (wpsFieldView != null) {
+            mPreviousWpsFieldsVisibility = wpsFieldView.getVisibility();
+            wpsFieldView.setVisibility(View.GONE);
+        }
+        final View securityFieldsView = findViewById(R.id.security_fields);
+        if (securityFieldsView != null) {
+            mPreviousSecurityFieldsVisibility = securityFieldsView.getVisibility();
+            securityFieldsView.setVisibility(View.GONE);
+        }
+        final View typeView = findViewById(R.id.type);
+        if (typeView != null) {
+            mPreviousTypeVisibility = typeView.getVisibility();
+            typeView.setVisibility(View.GONE);
+        }
 
+        mHandler.removeCallbacks(mSkipButtonEnabler);
         mSkipOrNextButton.setVisibility(View.VISIBLE);
         mSkipOrNextButton.setEnabled(false);
         mConnectButton.setVisibility(View.GONE);
@@ -389,7 +419,6 @@
         } else { // During user's Wifi configuration.
             mWifiSettings.resumeWifiScan();
 
-            mStatusText.setVisibility(View.VISIBLE);
             mStatusText.setText(R.string.wifi_setup_status_select_network);
             restoreFirstButtonVisibilityState();
 
@@ -437,4 +466,62 @@
 
         mWifiSettings.refreshAccessPoints();
     }
+
+    /**
+     * Called when {@link WifiSettings} received {@link WifiManager#SUPPLICANT_CHANGED_ACTION}.
+     */
+    /* package */ void onSupplicantStateChanged(Intent intent) {
+        final int errorCode = intent.getIntExtra(WifiManager.EXTRA_SUPPLICANT_ERROR, -1);
+        if (errorCode == WifiManager.ERROR_AUTHENTICATING) {
+            Log.i(TAG, "Received authentication error event.");
+            onAuthenticationFailure();
+        }
+    }
+
+    /**
+     * Called once when Authentication failed.
+     */
+    private void onAuthenticationFailure() {
+        mAfterConnectAction = false;
+        mStatusText.setText(R.string.wifi_setup_status_edit_network);
+        mSkipOrNextButton.setVisibility(View.GONE);
+        mConnectButton.setVisibility(View.VISIBLE);
+        mConnectButton.setEnabled(true);
+
+        // Restore View status which was tweaked on connection.
+        final View wpsFieldView = findViewById(R.id.wps_fields);
+        if (wpsFieldView != null) {
+            wpsFieldView.setVisibility(mPreviousWpsFieldsVisibility);
+        }
+        final View securityFieldsView = findViewById(R.id.security_fields);
+        if (securityFieldsView != null) {
+            securityFieldsView.setVisibility(mPreviousSecurityFieldsVisibility);
+            if (mPreviousSecurityFieldsVisibility == View.VISIBLE && mWifiConfig != null) {
+                final View passwordView = findViewById(R.id.password);
+                if (passwordView != null) {
+                    if (passwordView.isFocused()) {
+                        final InputMethodManager inputMethodManager = (InputMethodManager)
+                                getSystemService(Context.INPUT_METHOD_SERVICE);
+                        inputMethodManager.showSoftInput(passwordView, 0);
+                    } else {
+                        mWifiConfig.requestFocusAndShowKeyboard(R.id.password);
+                    }
+                }
+            }
+        }
+        final View typeView = findViewById(R.id.type);
+        if (typeView != null) {
+            typeView.setVisibility(mPreviousTypeVisibility);
+        }
+    }
+
+    /**
+     * Called when WifiManager is requested to save a network. This method sholud include
+     * WifiManager#saveNetwork() call.
+     *
+     * Currently this method calls {@link WifiManager#connectNetwork(int)}.
+     */
+    /* package */ void onSaveNetwork(WifiConfiguration config) {
+        mWifiManager.connectNetwork(config);
+    }
 }