Merge "Fix Language & Input Settings layouts padding - part 2"
diff --git a/Android.mk b/Android.mk
index 023e0c0..d615547 100644
--- a/Android.mk
+++ b/Android.mk
@@ -10,6 +10,8 @@
         $(call all-java-files-under, src) \
         src/com/android/settings/EventLogTags.logtags
 
+LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
+
 LOCAL_PACKAGE_NAME := Settings
 LOCAL_CERTIFICATE := platform
 LOCAL_PRIVILEGED_MODULE := true
@@ -18,9 +20,11 @@
 
 LOCAL_AAPT_FLAGS += -c zz_ZZ
 
+include frameworks/opt/setupwizard/navigationbar/common.mk
+
 include $(BUILD_PACKAGE)
 
-# Use the folloing include to make our test apk.
+# Use the following include to make our test apk.
 ifeq (,$(ONE_SHOT_MAKEFILE))
 include $(call all-makefiles-under,$(LOCAL_PATH))
 endif
diff --git a/res/layout/setup_preference.xml b/res/layout/setup_preference.xml
index dc6130d..195214f 100644
--- a/res/layout/setup_preference.xml
+++ b/res/layout/setup_preference.xml
@@ -16,177 +16,189 @@
 ** limitations under the License.
 */
 -->
-<view
+<LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
-    class="com.android.settings.widget.ProportionalOuterFrame"
+    android:id="@+id/fragment"
+    android:orientation="vertical"
     android:layout_height="match_parent"
     android:layout_width="match_parent">
-
-    <RelativeLayout
-        android:id="@+id/title_area"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_alignParentTop="true"
-        android:gravity="bottom">
-
-        <LinearLayout
-            android:id="@+id/title_bar"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:gravity="bottom"
-            android:orientation="horizontal">
-            <TextView
-                android:id="@+id/title"
-                android:layout_width="0dip"
-                android:layout_height="wrap_content"
-                android:layout_weight="1.0"
-                style="@style/SetupTitle"
-                android:text="@string/wifi_setup_wizard_title"
-                android:gravity="bottom" />
-
-            <ImageButton
-                android:id="@+id/more"
-                android:layout_width="@dimen/setup_button_size"
-                android:layout_height="@dimen/setup_button_size"
-                android:layout_marginStart="8dip"
-                android:layout_marginEnd="8dip"
-                android:layout_marginBottom="8dip"
-                android:src="?attr/ic_menu_moreoverflow"
-                android:background="?android:attr/actionBarItemBackground"
-                android:contentDescription="@string/wifi_menu_more_options" />
-
-        </LinearLayout>
-
-        <!-- Divider -->
-        <View
-            android:id="@+id/top_divider"
-            style="@style/TopDivider"
-            android:layout_below="@id/title_bar" />
-
-    </RelativeLayout>
-
-    <LinearLayout
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        android:layout_width="match_parent"
+    <view
+        class="com.android.settings.widget.ProportionalOuterFrame"
+        android:layout_weight="1"
         android:layout_height="match_parent"
-        android:layout_below="@id/title_area"
-        android:background="@android:color/transparent"
-        android:orientation="vertical" >
-
-        <TextView
-            android:id="@+id/wifi_required_info"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginBottom="6dip"
-            android:textAppearance="?android:attr/textAppearanceMedium"
-            android:text="@string/wifi_required_info_text"
-            android:visibility="gone" />
-
-        <ListView
-            android:id="@android:id/list"
-            android:layout_width="match_parent"
-            android:layout_height="0px"
-            android:layout_weight="1"
-            android:cacheColorHint="@android:color/transparent"
-            android:clipToPadding="false"
-            android:drawSelectorOnTop="false"
-            android:paddingTop="0dip"
-            android:scrollbarAlwaysDrawVerticalTrack="true" />
-
-        <TextView
-            android:id="@android:id/empty"
-            android:layout_width="match_parent"
-            android:layout_height="0px"
-            android:layout_weight="1"
-            android:gravity="center"
-            android:visibility="gone" />
-
-        <ImageView
-            android:id="@+id/divider"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="@dimen/setup_item_margin"
-            android:background="@*android:drawable/list_divider_holo_dark" />
-
-        <LinearLayout
-            android:id="@+id/other_network"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginBottom="@dimen/setup_item_margin"
-            android:background="?android:attr/selectableItemBackground"
-            android:gravity="center_vertical"
-            android:minHeight="?android:attr/listPreferredItemHeight"
-            android:paddingEnd="?android:attr/scrollbarSize" >
-
-            <ImageView
-                android:id="@+id/add_icon"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_gravity="center"
-                android:src="?attr/ic_menu_add" />
-
-            <TextView
-                android:id="@+id/other"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginBottom="6dip"
-                android:layout_marginStart="15dip"
-                android:layout_marginEnd="6dip"
-                android:layout_marginTop="6dip"
-                android:layout_weight="1"
-                android:ellipsize="marquee"
-                android:fadingEdge="horizontal"
-                android:singleLine="true"
-                android:textAppearance="?android:attr/textAppearanceMedium"
-                android:text="@string/wifi_other_network" />
-
-        </LinearLayout>
+        android:layout_width="match_parent">
 
         <RelativeLayout
-            android:id="@+id/button_bar"
+            android:id="@+id/title_area"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_weight="0"
-            android:visibility="gone" >
-
-            <Button
-                android:id="@+id/back_button"
-                android:layout_width="150dip"
-                android:layout_height="wrap_content"
-                android:layout_alignParentStart="true"
-                android:layout_margin="5dip"
-                android:text="@string/wifi_setup_back" />
-
-            <Button
-                android:id="@+id/custom_button"
-                android:layout_width="150dip"
-                android:layout_height="wrap_content"
-                android:layout_alignParentEnd="true"
-                android:layout_margin="5dip"
-                android:text="@string/wifi_setup_skip" />
+            android:layout_alignParentTop="true"
+            android:gravity="bottom">
 
             <LinearLayout
-                android:layout_width="wrap_content"
+                android:id="@+id/title_bar"
+                android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:layout_alignParentEnd="true"
-                android:orientation="horizontal" >
-
-                <Button
-                    android:id="@+id/skip_button"
-                    android:layout_width="150dip"
+                android:gravity="bottom"
+                android:orientation="horizontal">
+                <TextView
+                    android:id="@+id/title"
+                    android:layout_width="0dip"
                     android:layout_height="wrap_content"
-                    android:layout_margin="5dip"
-                    android:text="@string/wifi_setup_skip"
-                    android:visibility="gone" />
+                    android:layout_weight="1.0"
+                    style="@style/SetupTitle"
+                    android:text="@string/wifi_setup_wizard_title"
+                    android:gravity="bottom" />
 
-                <Button
-                    android:id="@+id/next_button"
-                    android:layout_width="150dip"
-                    android:layout_height="wrap_content"
-                    android:layout_margin="5dip"
-                    android:text="@string/wifi_setup_next"
-                    android:visibility="gone" />
-                </LinearLayout>
+                <ImageButton
+                    android:id="@+id/more"
+                    android:layout_width="@dimen/setup_button_size"
+                    android:layout_height="@dimen/setup_button_size"
+                    android:layout_marginStart="8dip"
+                    android:layout_marginEnd="8dip"
+                    android:layout_marginBottom="8dip"
+                    android:src="?attr/ic_menu_moreoverflow"
+                    android:background="?android:attr/actionBarItemBackground"
+                    android:contentDescription="@string/wifi_menu_more_options" />
+
+            </LinearLayout>
+
+            <!-- Divider -->
+            <View
+                android:id="@+id/top_divider"
+                style="@style/TopDivider"
+                android:layout_below="@id/title_bar" />
+
         </RelativeLayout>
-    </LinearLayout>
-</view>
+
+        <LinearLayout
+            xmlns:android="http://schemas.android.com/apk/res/android"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_below="@id/title_area"
+            android:background="@android:color/transparent"
+            android:orientation="vertical" >
+
+            <TextView
+                android:id="@+id/wifi_required_info"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginBottom="6dip"
+                android:textAppearance="?android:attr/textAppearanceMedium"
+                android:text="@string/wifi_required_info_text"
+                android:visibility="gone" />
+
+            <ListView
+                android:id="@android:id/list"
+                android:layout_width="match_parent"
+                android:layout_height="0px"
+                android:layout_weight="1"
+                android:cacheColorHint="@android:color/transparent"
+                android:clipToPadding="false"
+                android:drawSelectorOnTop="false"
+                android:paddingTop="0dip"
+                android:scrollbarAlwaysDrawVerticalTrack="true" />
+
+            <TextView
+                android:id="@android:id/empty"
+                android:layout_width="match_parent"
+                android:layout_height="0px"
+                android:layout_weight="1"
+                android:gravity="center"
+                android:visibility="gone" />
+
+            <ImageView
+                android:id="@+id/divider"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/setup_item_margin"
+                android:background="@*android:drawable/list_divider_holo_dark" />
+
+            <LinearLayout
+                android:id="@+id/other_network"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginBottom="@dimen/setup_item_margin"
+                android:background="?android:attr/selectableItemBackground"
+                android:gravity="center_vertical"
+                android:minHeight="?android:attr/listPreferredItemHeight"
+                android:paddingEnd="?android:attr/scrollbarSize" >
+
+                <ImageView
+                    android:id="@+id/add_icon"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center"
+                    android:src="?attr/ic_menu_add" />
+
+                <TextView
+                    android:id="@+id/other"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginBottom="6dip"
+                    android:layout_marginStart="15dip"
+                    android:layout_marginEnd="6dip"
+                    android:layout_marginTop="6dip"
+                    android:layout_weight="1"
+                    android:ellipsize="marquee"
+                    android:fadingEdge="horizontal"
+                    android:singleLine="true"
+                    android:textAppearance="?android:attr/textAppearanceMedium"
+                    android:text="@string/wifi_other_network" />
+
+            </LinearLayout>
+
+            <RelativeLayout
+                android:id="@+id/button_bar"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_weight="0"
+                android:visibility="gone" >
+
+                <Button
+                    android:id="@+id/back_button"
+                    android:layout_width="150dip"
+                    android:layout_height="wrap_content"
+                    android:layout_alignParentStart="true"
+                    android:layout_margin="5dip"
+                    android:text="@string/wifi_setup_back" />
+
+                <Button
+                    android:id="@+id/custom_button"
+                    android:layout_width="150dip"
+                    android:layout_height="wrap_content"
+                    android:layout_alignParentEnd="true"
+                    android:layout_margin="5dip"
+                    android:text="@string/wifi_setup_skip" />
+
+                <LinearLayout
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_alignParentEnd="true"
+                    android:orientation="horizontal" >
+
+                    <Button
+                        android:id="@+id/skip_button"
+                        android:layout_width="150dip"
+                        android:layout_height="wrap_content"
+                        android:layout_margin="5dip"
+                        android:text="@string/wifi_setup_skip"
+                        android:visibility="gone" />
+
+                    <Button
+                        android:id="@+id/next_button"
+                        android:layout_width="150dip"
+                        android:layout_height="wrap_content"
+                        android:layout_margin="5dip"
+                        android:text="@string/wifi_setup_next"
+                        android:visibility="gone" />
+                    </LinearLayout>
+            </RelativeLayout>
+        </LinearLayout>
+    </view>
+    <fragment android:name="com.android.setupwizard.navigationbar.SetupWizardNavBar"
+        android:id="@+id/navigation_bar"
+        style="@style/setup_wizard_navbar_style"
+        android:layout_weight="0"
+        />
+</LinearLayout>
diff --git a/src/com/android/settings/CryptKeeper.java b/src/com/android/settings/CryptKeeper.java
index 4e20823..e9fed4f 100644
--- a/src/com/android/settings/CryptKeeper.java
+++ b/src/com/android/settings/CryptKeeper.java
@@ -65,6 +65,8 @@
 import com.android.internal.widget.LockPatternView;
 import com.android.internal.widget.LockPatternView.Cell;
 
+import static com.android.internal.widget.LockPatternView.DisplayMode;
+
 import java.util.List;
 
 /**
@@ -122,6 +124,16 @@
     private int mNotificationCountdown = 0;
     /** Number of calls to {@link #notifyUser()} before we release the wakelock */
     private int mReleaseWakeLockCountdown = 0;
+    private int mStatusString = R.string.enter_password;
+
+    // how long we wait to clear a wrong pattern
+    private static final int WRONG_PATTERN_CLEAR_TIMEOUT_MS = 1500;
+
+    private Runnable mClearPatternRunnable = new Runnable() {
+        public void run() {
+            mLockPatternView.clearPattern();
+        }
+    };
 
     /**
      * Used to propagate state through configuration changes (e.g. screen rotation)
@@ -175,21 +187,32 @@
             } else if (failedAttempts == MAX_FAILED_ATTEMPTS) {
                 // Factory reset the device.
                 sendBroadcast(new Intent("android.intent.action.MASTER_CLEAR"));
-            } else if ((failedAttempts % COOL_DOWN_ATTEMPTS) == 0) {
-                if (mLockPatternView != null) {
-                    mLockPatternView.clearPattern();
-                }
-                mCooldown = COOL_DOWN_INTERVAL;
-                cooldown();
             } else {
-                final TextView status = (TextView) findViewById(R.id.status);
-                status.setText(R.string.try_again);
-                // Reenable the password entry
-                if (mPasswordEntry != null) {
-                    mPasswordEntry.setEnabled(true);
-                }
+                // Wrong entry. Handle pattern case.
                 if (mLockPatternView != null) {
-                    mLockPatternView.setEnabled(true);
+                    mLockPatternView.setDisplayMode(DisplayMode.Wrong);
+                    mLockPatternView.removeCallbacks(mClearPatternRunnable);
+                    mLockPatternView.postDelayed(mClearPatternRunnable, WRONG_PATTERN_CLEAR_TIMEOUT_MS);
+                }
+                if ((failedAttempts % COOL_DOWN_ATTEMPTS) == 0) {
+                    mCooldown = COOL_DOWN_INTERVAL;
+                    cooldown();
+                } else {
+                    final TextView status = (TextView) findViewById(R.id.status);
+                    status.setText(R.string.try_again);
+                    if (mLockPatternView != null) {
+                        mLockPatternView.setDisplayMode(DisplayMode.Wrong);
+                    }
+                    // Reenable the password entry
+                    if (mPasswordEntry != null) {
+                        mPasswordEntry.setEnabled(true);
+                        final InputMethodManager imm = (InputMethodManager) getSystemService(
+                                                  Context.INPUT_METHOD_SERVICE);
+                        imm.showSoftInput(mPasswordEntry, 0);
+                    }
+                    if (mLockPatternView != null) {
+                        mLockPatternView.setEnabled(true);
+                    }
                 }
             }
         }
@@ -398,19 +421,28 @@
                 public void onPostExecute(java.lang.Void v) {
                     if(type == StorageManager.CRYPT_TYPE_PIN) {
                         setContentView(R.layout.crypt_keeper_pin_entry);
-                        ((TextView)findViewById(R.id.status)).setText(R.string.enter_pin);
+                        mStatusString = R.string.enter_pin;
                     } else if (type == StorageManager.CRYPT_TYPE_PATTERN) {
                         setContentView(R.layout.crypt_keeper_pattern_entry);
                         setBackFunctionality(false);
-                        ((TextView)findViewById(R.id.status)).setText(R.string.enter_pattern);
+                        mStatusString = R.string.enter_pattern;
                     } else {
                         setContentView(R.layout.crypt_keeper_password_entry);
+                        mStatusString = R.string.enter_password;
                     }
+                    final TextView status = (TextView) findViewById(R.id.status);
+                    status.setText(mStatusString);
 
-                    final TextView status = (TextView) findViewById(R.id.owner_info);
-                    status.setText(owner_info);
-                    status.setSelected(true); // Required for marquee'ing to work
+                    final TextView ownerInfo = (TextView) findViewById(R.id.owner_info);
+                    ownerInfo.setText(owner_info);
+                    ownerInfo.setSelected(true); // Required for marquee'ing to work
+
                     passwordEntryInit();
+
+                    if (mCooldown > 0) {
+                        setBackFunctionality(false);
+                        cooldown(); // in case we are cooling down and coming back from emergency dialler
+                    }
                 }
             }.execute();
         } else if (!mValidationRequested) {
@@ -553,13 +585,24 @@
             // Re-enable the password entry and back presses.
             if (mPasswordEntry != null) {
                 mPasswordEntry.setEnabled(true);
+                final InputMethodManager imm = (InputMethodManager) getSystemService(
+                                          Context.INPUT_METHOD_SERVICE);
+                imm.showSoftInput(mPasswordEntry, 0);
                 setBackFunctionality(true);
             }
             if (mLockPatternView != null) {
                 mLockPatternView.setEnabled(true);
             }
-            status.setText(R.string.enter_password);
+            status.setText(mStatusString);
         } else {
+            // Disable the password entry and back presses.
+            if (mPasswordEntry != null) {
+                mPasswordEntry.setEnabled(false);
+            }
+            if (mLockPatternView != null) {
+                mLockPatternView.setEnabled(false);
+            }
+
             CharSequence template = getText(R.string.crypt_keeper_cooldown);
             status.setText(TextUtils.expandTemplate(template, Integer.toString(mCooldown)));
 
@@ -583,25 +626,26 @@
     }
 
     protected LockPatternView.OnPatternListener mChooseNewLockPatternListener =
-            new LockPatternView.OnPatternListener() {
+        new LockPatternView.OnPatternListener() {
 
-            @Override
-            public void onPatternStart() {
-            }
+        @Override
+        public void onPatternStart() {
+            mLockPatternView.removeCallbacks(mClearPatternRunnable);
+        }
 
-            @Override
-            public void onPatternCleared() {
-            }
+        @Override
+        public void onPatternCleared() {
+        }
 
-            @Override
-            public void onPatternDetected(List<LockPatternView.Cell> pattern) {
-                mLockPatternView.setEnabled(false);
-                new DecryptTask().execute(LockPatternUtils.patternToString(pattern));
-            }
+        @Override
+        public void onPatternDetected(List<LockPatternView.Cell> pattern) {
+            mLockPatternView.setEnabled(false);
+            new DecryptTask().execute(LockPatternUtils.patternToString(pattern));
+        }
 
-            @Override
-            public void onPatternCellAdded(List<Cell> pattern) {
-            }
+        @Override
+        public void onPatternCellAdded(List<Cell> pattern) {
+        }
      };
 
      private void passwordEntryInit() {
@@ -655,13 +699,13 @@
                 mWakeLock.acquire();
                 // Keep awake for 10 minutes - if the user hasn't been alerted by then
                 // best not to just drain their battery
-                mReleaseWakeLockCountdown = 96; // 96 * 5 + 120 = 600
+                mReleaseWakeLockCountdown = 96; // 96 * 5 secs per click + 120 secs before we show this = 600
             }
         }
 
         // Asynchronously throw up the IME, since there are issues with requesting it to be shown
         // immediately.
-        if (mLockPatternView == null) {
+        if (mLockPatternView == null && mCooldown <= 0) {
             mHandler.postDelayed(new Runnable() {
                 @Override public void run() {
                     imm.showSoftInputUnchecked(0, null);
@@ -846,6 +890,7 @@
         final Intent intent = new Intent(ACTION_EMERGENCY_DIAL);
         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                         | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
+        setBackFunctionality(true);
         startActivity(intent);
     }
 
diff --git a/src/com/android/settings/DevelopmentSettings.java b/src/com/android/settings/DevelopmentSettings.java
index 6d9206c..3708999 100644
--- a/src/com/android/settings/DevelopmentSettings.java
+++ b/src/com/android/settings/DevelopmentSettings.java
@@ -359,8 +359,10 @@
         mWebViewDataReductionProxy = findAndInitCheckboxPref(WEBVIEW_DATA_REDUCTION_PROXY_KEY);
         String key = Settings.Global.getString(getActivity().getContentResolver(),
                 Settings.Global.WEBVIEW_DATA_REDUCTION_PROXY_KEY);
-        // Make it not selectable if the key is not available for some reason.
-        mWebViewDataReductionProxy.setSelectable(key != null && !key.isEmpty());
+        // Disable the selection if the key is not available for some reason.
+        if (key == null || key.isEmpty()) {
+            disableForUser(mWebViewDataReductionProxy);
+        }
     }
 
     private ListPreference addListPreference(String prefKey) {
diff --git a/src/com/android/settings/wifi/WifiPickerActivity.java b/src/com/android/settings/wifi/WifiPickerActivity.java
index 4cb78bd..eec9963 100644
--- a/src/com/android/settings/wifi/WifiPickerActivity.java
+++ b/src/com/android/settings/wifi/WifiPickerActivity.java
@@ -20,6 +20,7 @@
 import com.android.settings.wifi.p2p.WifiP2pSettings;
 
 import android.content.Intent;
+import android.preference.PreferenceFragment;
 
 import java.lang.Class;
 
@@ -36,13 +37,13 @@
 
     @Override
     protected boolean isValidFragment(String fragmentName) {
-        if (getWifiSettingsClass().getName().equals(fragmentName)
+        if (WifiSettings.class.getName().equals(fragmentName)
                 || WifiP2pSettings.class.getName().equals(fragmentName)
                 || AdvancedWifiSettings.class.getName().equals(fragmentName)) return true;
         return false;
     }
 
-    /* package */ Class getWifiSettingsClass() {
+    /* package */ Class<? extends PreferenceFragment> getWifiSettingsClass() {
         return WifiSettings.class;
     }
 }
\ No newline at end of file
diff --git a/src/com/android/settings/wifi/WifiSettingsForSetupWizard.java b/src/com/android/settings/wifi/WifiSettingsForSetupWizard.java
index 17fca9f..325e1eb 100644
--- a/src/com/android/settings/wifi/WifiSettingsForSetupWizard.java
+++ b/src/com/android/settings/wifi/WifiSettingsForSetupWizard.java
@@ -17,11 +17,8 @@
 package com.android.settings.wifi;
 
 import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.Dialog;
 import android.content.BroadcastReceiver;
 import android.content.Context;
-import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.res.TypedArray;
@@ -63,25 +60,9 @@
     // this boolean extra specifies whether to auto finish when connection is established
     private static final String EXTRA_AUTO_FINISH_ON_CONNECT = "wifi_auto_finish_on_connect";
 
-    // this boolean extra shows a custom button that we can control
-    protected static final String EXTRA_SHOW_CUSTOM_BUTTON = "wifi_show_custom_button";
-
     // show a text regarding data charges when wifi connection is required during setup wizard
     protected static final String EXTRA_SHOW_WIFI_REQUIRED_INFO = "wifi_show_wifi_required_info";
 
-    // this boolean extra is set if we are being invoked by the Setup Wizard
-    private static final String EXTRA_IS_FIRST_RUN = "firstRun";
-
-    // Activity result when pressing the Skip button
-    private static final int RESULT_SKIP = Activity.RESULT_FIRST_USER;
-
-    // From WizardManager (must match constants maintained there)
-    private static final String ACTION_NEXT = "com.android.wizard.NEXT";
-    private static final String EXTRA_SCRIPT_URI = "scriptUri";
-    private static final String EXTRA_ACTION_ID = "actionId";
-    private static final String EXTRA_RESULT_CODE = "com.android.setupwizard.ResultCode";
-    private static final int NEXT_REQUEST = 10000;
-
     // should Next button only be enabled when we have a connection?
     private boolean mEnableNextOnConnection;
 
@@ -105,7 +86,8 @@
                 changeNextButtonState(info.isConnected());
                 if (mAutoFinishOnConnection && info.isConnected()) {
                     Log.d(TAG, "mReceiver.onReceive context=" + context + " intent=" + intent);
-                    finishOrNext(Activity.RESULT_OK);
+                    WifiSetupActivity activity = (WifiSetupActivity) getActivity();
+                    activity.finishOrNext(Activity.RESULT_OK);
                 }
             }
         };
@@ -150,36 +132,6 @@
         }
 
         final Intent intent = getActivity().getIntent();
-        if (intent.getBooleanExtra(EXTRA_SHOW_CUSTOM_BUTTON, false)) {
-            view.findViewById(R.id.button_bar).setVisibility(View.VISIBLE);
-            view.findViewById(R.id.back_button).setVisibility(View.INVISIBLE);
-            view.findViewById(R.id.skip_button).setVisibility(View.INVISIBLE);
-            view.findViewById(R.id.next_button).setVisibility(View.INVISIBLE);
-
-            Button customButton = (Button) view.findViewById(R.id.custom_button);
-            customButton.setVisibility(View.VISIBLE);
-            customButton.setOnClickListener(new OnClickListener() {
-                @Override
-                public void onClick(View v) {
-                    boolean isConnected = false;
-                    Activity activity = getActivity();
-                    final ConnectivityManager connectivity = (ConnectivityManager)
-                            activity.getSystemService(Context.CONNECTIVITY_SERVICE);
-                    if (connectivity != null) {
-                        final NetworkInfo info = connectivity.getActiveNetworkInfo();
-                        isConnected = (info != null) && info.isConnected();
-                    }
-                    if (isConnected) {
-                        // Warn of possible data charges
-                        showDialog(WIFI_SKIPPED_DIALOG_ID);
-                    } else {
-                        // Warn of lack of updates
-                        showDialog(WIFI_AND_MOBILE_SKIPPED_DIALOG_ID);
-                    }
-                }
-            });
-        }
-
         if (intent.getBooleanExtra(EXTRA_SHOW_WIFI_REQUIRED_INFO, false)) {
             view.findViewById(R.id.wifi_required_info).setVisibility(View.VISIBLE);
         }
@@ -197,30 +149,32 @@
                 View.STATUS_BAR_DISABLE_NOTIFICATION_ALERTS |
                 View.STATUS_BAR_DISABLE_CLOCK);
 
-        final Activity activity = getActivity();
+        final WifiSetupActivity activity = (WifiSetupActivity) getActivity();
         final Intent intent = activity.getIntent();
 
         // first if we're supposed to finish once we have a connection
         mAutoFinishOnConnection = intent.getBooleanExtra(EXTRA_AUTO_FINISH_ON_CONNECT, false);
 
-        /*
-         * When entering with a savedInstanceState, we may be returning from a later activity in the
-         * setup flow. It's not clear yet if there are other possible circumstances. It's not
-         * appropriate to refire our activity results, so we skip that here.
-         */
-        if (mAutoFinishOnConnection && null == savedInstanceState) {
+        if (mAutoFinishOnConnection) {
             // Hide the next button
             if (hasNextButton()) {
                 getNextButton().setVisibility(View.GONE);
             }
 
-            final ConnectivityManager connectivity = (ConnectivityManager)
-                    activity.getSystemService(Context.CONNECTIVITY_SERVICE);
-            if (connectivity != null
-                    && connectivity.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected()) {
-                Log.d(TAG, "onActivityCreated Auto-finishing");
-                finishOrNext(Activity.RESULT_OK);
-                return;
+            /*
+             * When entering with a savedInstanceState, we may be returning from a later activity in
+             * the setup flow. It's not clear yet if there are other possible circumstances. It's
+             * not appropriate to refire our activity results, so we skip that here.
+             */
+            if (savedInstanceState == null) {
+                final ConnectivityManager connectivity = (ConnectivityManager)
+                        activity.getSystemService(Context.CONNECTIVITY_SERVICE);
+                if (connectivity != null &&
+                        connectivity.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected()) {
+                    Log.d(TAG, "onActivityCreated Auto-finishing");
+                    activity.finishOrNext(Activity.RESULT_OK);
+                    return;
+                }
             }
         }
 
@@ -242,49 +196,6 @@
     }
 
     @Override
-    public Dialog onCreateDialog(int dialogId) {
-        switch (dialogId) {
-            case WIFI_SKIPPED_DIALOG_ID:
-                return new AlertDialog.Builder(getActivity())
-                            .setMessage(R.string.wifi_skipped_message)
-                            .setCancelable(false)
-                            .setNegativeButton(R.string.wifi_skip_anyway,
-                                    new DialogInterface.OnClickListener() {
-                                @Override
-                                public void onClick(DialogInterface dialog, int id) {
-                                    finishOrNext(RESULT_SKIP);
-                                }
-                            })
-                            .setPositiveButton(R.string.wifi_dont_skip,
-                                    new DialogInterface.OnClickListener() {
-                                @Override
-                                public void onClick(DialogInterface dialog, int id) {
-                                }
-                            })
-                            .create();
-            case WIFI_AND_MOBILE_SKIPPED_DIALOG_ID:
-                return new AlertDialog.Builder(getActivity())
-                            .setMessage(R.string.wifi_and_mobile_skipped_message)
-                            .setCancelable(false)
-                            .setNegativeButton(R.string.wifi_skip_anyway,
-                                    new DialogInterface.OnClickListener() {
-                                @Override
-                                public void onClick(DialogInterface dialog, int id) {
-                                    finishOrNext(RESULT_SKIP);
-                                }
-                            })
-                            .setPositiveButton(R.string.wifi_dont_skip,
-                                    new DialogInterface.OnClickListener() {
-                                @Override
-                                public void onClick(DialogInterface dialog, int id) {
-                                }
-                            })
-                            .create();
-        }
-        return super.onCreateDialog(dialogId);
-    }
-
-    @Override
     public void onResume() {
         super.onResume();
         getActivity().registerReceiver(mReceiver, mFilter);
@@ -297,24 +208,6 @@
     }
 
     @Override
-    public void onActivityResult(int requestCode, int resultCode, Intent data) {
-        if (resultCode == Activity.RESULT_CANCELED) {
-            // Before returning to the settings panel, forget any current access point so it will
-            // not attempt to automatically reconnect and advance
-            // FIXME: when coming back, it would be better to keep the current connection and
-            // override the auto-advance feature
-            final WifiInfo info = mWifiManager.getConnectionInfo();
-            if (null != info) {
-                int netId = info.getNetworkId();
-                if (netId != WifiConfiguration.INVALID_NETWORK_ID) {
-                    mWifiManager.forget(netId, null);
-                }
-            }
-        }
-        super.onActivityResult(requestCode, resultCode, data);
-    }
-
-    @Override
     public void registerForContextMenu(View view) {
         // Suppressed during setup wizard
     }
@@ -359,39 +252,4 @@
             getNextButton().setEnabled(enabled);
         }
     }
-
-    /**
-     * Complete this activity and return the results to the caller. If using WizardManager, this
-     * will invoke the next scripted action; otherwise, we simply finish.
-     */
-    private void finishOrNext(int resultCode) {
-        Log.d(TAG, "finishOrNext resultCode=" + resultCode
-                + " isUsingWizardManager=" + isUsingWizardManager());
-        if (isUsingWizardManager()) {
-            sendResultsToSetupWizard(resultCode);
-        } else {
-            Activity activity = getActivity();
-            activity.setResult(resultCode);
-            activity.finish();
-        }
-    }
-
-    private boolean isUsingWizardManager() {
-        return getActivity().getIntent().hasExtra(EXTRA_SCRIPT_URI);
-    }
-
-    /**
-     * Send the results of this activity to WizardManager, which will then send out the next
-     * scripted activity. WizardManager does not actually return an activity result, but if we
-     * invoke WizardManager without requesting a result, the framework will choose not to issue a
-     * call to onActivityResult with RESULT_CANCELED when navigating backward.
-     */
-    private void sendResultsToSetupWizard(int resultCode) {
-        final Intent intent = getActivity().getIntent();
-        final Intent nextIntent = new Intent(ACTION_NEXT);
-        nextIntent.putExtra(EXTRA_SCRIPT_URI, intent.getStringExtra(EXTRA_SCRIPT_URI));
-        nextIntent.putExtra(EXTRA_ACTION_ID, intent.getStringExtra(EXTRA_ACTION_ID));
-        nextIntent.putExtra(EXTRA_RESULT_CODE, resultCode);
-        startActivityForResult(nextIntent, NEXT_REQUEST);
-    }
 }
diff --git a/src/com/android/settings/wifi/WifiSetupActivity.java b/src/com/android/settings/wifi/WifiSetupActivity.java
index d4811ed..8e4ff48 100644
--- a/src/com/android/settings/wifi/WifiSetupActivity.java
+++ b/src/com/android/settings/wifi/WifiSetupActivity.java
@@ -15,37 +15,210 @@
  */
 package com.android.settings.wifi;
 
-import com.android.settings.ButtonBarHandler;
-
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.DialogFragment;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
 import android.content.res.Resources;
+import android.graphics.Color;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+import android.os.Bundle;
+import android.preference.PreferenceFragment;
+import android.util.Log;
 
-import java.lang.Class;
+import com.android.settings.ButtonBarHandler;
+import com.android.settings.R;
+import com.android.setupwizard.navigationbar.SetupWizardNavBar;
+import com.android.setupwizard.navigationbar.SetupWizardNavBar.NavigationBarListener;
 
-public class WifiSetupActivity extends WifiPickerActivity implements ButtonBarHandler {
+public class WifiSetupActivity extends WifiPickerActivity
+        implements ButtonBarHandler, NavigationBarListener {
+    private static final String TAG = "WifiSetupActivity";
+
+    private static final String EXTRA_ALLOW_SKIP = "allowSkip";
+    private static final String EXTRA_USE_IMMERSIVE_MODE = "useImmersiveMode";
+
+    // this boolean extra shows a custom button that we can control
+    protected static final String EXTRA_SHOW_CUSTOM_BUTTON = "wifi_show_custom_button";
+
     // Extra containing the resource name of the theme to be used
     private static final String EXTRA_THEME = "theme";
     private static final String THEME_HOLO = "holo";
     private static final String THEME_HOLO_LIGHT = "holo_light";
+    private static final String THEME_MATERIAL = "material";
+    private static final String THEME_MATERIAL_LIGHT = "material_light";
 
-    // Style resources containing theme settings
-    private static final String RESOURCE_THEME_DARK = "SetupWizardWifiTheme";
-    private static final String RESOURCE_THEME_LIGHT = "SetupWizardWifiTheme.Light";
+    // Activity result when pressing the Skip button
+    private static final int RESULT_SKIP = Activity.RESULT_FIRST_USER;
+
+    // From WizardManager (must match constants maintained there)
+    private static final String ACTION_NEXT = "com.android.wizard.NEXT";
+    private static final String EXTRA_SCRIPT_URI = "scriptUri";
+    private static final String EXTRA_ACTION_ID = "actionId";
+    private static final String EXTRA_RESULT_CODE = "com.android.setupwizard.ResultCode";
+    private static final int NEXT_REQUEST = 10000;
 
     @Override
     protected void onApplyThemeResource(Resources.Theme theme, int resid, boolean first) {
         String themeName = getIntent().getStringExtra(EXTRA_THEME);
-        if (THEME_HOLO_LIGHT.equalsIgnoreCase(themeName)) {
-            resid = getResources().getIdentifier(RESOURCE_THEME_LIGHT, "style",
-                    getPackageName());
-        } else if (THEME_HOLO.equalsIgnoreCase(themeName)) {
-            resid = getResources().getIdentifier(RESOURCE_THEME_DARK, "style",
-                    getPackageName());
+        if (THEME_HOLO_LIGHT.equalsIgnoreCase(themeName) ||
+                THEME_MATERIAL_LIGHT.equalsIgnoreCase(themeName)) {
+            resid = R.style.SetupWizardWifiTheme_Light;
+        } else if (THEME_HOLO.equalsIgnoreCase(themeName) ||
+                THEME_MATERIAL.equalsIgnoreCase(themeName)) {
+            resid = R.style.SetupWizardWifiTheme;
         }
         super.onApplyThemeResource(theme, resid, first);
     }
 
     @Override
-    /* package */ Class getWifiSettingsClass() {
+    protected boolean isValidFragment(String fragmentName) {
+        return WifiSettingsForSetupWizard.class.getName().equals(fragmentName);
+    }
+
+    @Override
+    /* package */ Class<? extends PreferenceFragment> getWifiSettingsClass() {
         return WifiSettingsForSetupWizard.class;
     }
+
+    @Override
+    public void onActivityResult(int requestCode, int resultCode, Intent data) {
+        if (resultCode == Activity.RESULT_CANCELED) {
+            // Before returning to the settings panel, forget any current access point so it will
+            // not attempt to automatically reconnect and advance
+            // FIXME: when coming back, it would be better to keep the current connection and
+            // override the auto-advance feature
+            final WifiManager wifiManager = (WifiManager)(getSystemService(Context.WIFI_SERVICE));
+            if (wifiManager != null) {
+                final WifiInfo info = wifiManager.getConnectionInfo();
+                if (info != null) {
+                    int netId = info.getNetworkId();
+                    if (netId != WifiConfiguration.INVALID_NETWORK_ID) {
+                        wifiManager.forget(netId, null);
+                    }
+                }
+            }
+        }
+        super.onActivityResult(requestCode, resultCode, data);
+    }
+
+    /**
+     * Complete this activity and return the results to the caller. If using WizardManager, this
+     * will invoke the next scripted action; otherwise, we simply finish.
+     */
+    public void finishOrNext(int resultCode) {
+        Log.d(TAG, "finishOrNext resultCode=" + resultCode
+                + " isUsingWizardManager=" + isUsingWizardManager());
+        if (isUsingWizardManager()) {
+            sendResultsToSetupWizard(resultCode);
+        } else {
+            setResult(resultCode);
+            finish();
+        }
+    }
+
+    private boolean isUsingWizardManager() {
+        return getIntent().hasExtra(EXTRA_SCRIPT_URI);
+    }
+
+    /**
+     * Send the results of this activity to WizardManager, which will then send out the next
+     * scripted activity. WizardManager does not actually return an activity result, but if we
+     * invoke WizardManager without requesting a result, the framework will choose not to issue a
+     * call to onActivityResult with RESULT_CANCELED when navigating backward.
+     */
+    private void sendResultsToSetupWizard(int resultCode) {
+        final Intent intent = getIntent();
+        final Intent nextIntent = new Intent(ACTION_NEXT);
+        nextIntent.putExtra(EXTRA_SCRIPT_URI, intent.getStringExtra(EXTRA_SCRIPT_URI));
+        nextIntent.putExtra(EXTRA_ACTION_ID, intent.getStringExtra(EXTRA_ACTION_ID));
+        nextIntent.putExtra(EXTRA_RESULT_CODE, resultCode);
+        startActivityForResult(nextIntent, NEXT_REQUEST);
+    }
+
+    @Override
+    public void onNavigationBarCreated(final SetupWizardNavBar bar) {
+        final boolean useImmersiveMode =
+                getIntent().getBooleanExtra(EXTRA_USE_IMMERSIVE_MODE, false);
+        bar.setUseImmersiveMode(useImmersiveMode);
+        if (useImmersiveMode) {
+            getWindow().setNavigationBarColor(Color.TRANSPARENT);
+            getWindow().setStatusBarColor(Color.TRANSPARENT);
+        }
+        getIntent().putExtra(EXTRA_SHOW_CUSTOM_BUTTON, false);
+        bar.getNextButton().setText(R.string.skip_label);
+
+        if (!getIntent().getBooleanExtra(EXTRA_ALLOW_SKIP, true)) {
+            bar.getNextButton().setEnabled(false);
+        }
+    }
+
+    @Override
+    public void onNavigateBack() {
+        onBackPressed();
+    }
+
+    @Override
+    public void onNavigateNext() {
+        boolean isConnected = false;
+        final ConnectivityManager connectivity = (ConnectivityManager)
+                getSystemService(Context.CONNECTIVITY_SERVICE);
+        if (connectivity != null) {
+            final NetworkInfo info = connectivity.getActiveNetworkInfo();
+            isConnected = (info != null) && info.isConnected();
+        }
+        if (isConnected) {
+            // Warn of possible data charges
+            WifiSkipDialog.newInstance(R.string.wifi_skipped_message)
+                    .show(getFragmentManager(), "dialog");
+        } else {
+            // Warn of lack of updates
+            WifiSkipDialog.newInstance(R.string.wifi_and_mobile_skipped_message)
+                    .show(getFragmentManager(), "dialog");
+        }
+    }
+
+    private static class WifiSkipDialog extends DialogFragment {
+        public static WifiSkipDialog newInstance(int messageRes) {
+            final Bundle args = new Bundle();
+            args.putInt("messageRes", messageRes);
+            final WifiSkipDialog dialog = new WifiSkipDialog();
+            dialog.setArguments(args);
+            return dialog;
+        }
+
+        public WifiSkipDialog() {
+            // no-arg constructor for fragment
+        }
+
+        @Override
+        public Dialog onCreateDialog(Bundle savedInstanceState) {
+            int messageRes = getArguments().getInt("messageRes");
+            return new AlertDialog.Builder(getActivity())
+                    .setMessage(messageRes)
+                    .setCancelable(false)
+                    .setNegativeButton(R.string.wifi_skip_anyway,
+                            new DialogInterface.OnClickListener() {
+                        @Override
+                        public void onClick(DialogInterface dialog, int id) {
+                            WifiSetupActivity activity = (WifiSetupActivity) getActivity();
+                            activity.finishOrNext(RESULT_SKIP);
+                        }
+                    })
+                    .setPositiveButton(R.string.wifi_dont_skip,
+                            new DialogInterface.OnClickListener() {
+                        @Override
+                        public void onClick(DialogInterface dialog, int id) {
+                        }
+                    })
+                    .create();
+        }
+    }
 }