Merge "Import translations. DO NOT MERGE" into qt-dev
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 8fd0769..5149b9c 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -3097,7 +3097,7 @@
 
         <activity android:name=".panel.SettingsPanelActivity"
             android:label="@string/settings_panel_title"
-            android:theme="@style/Theme.BottomDialog"
+            android:theme="@style/Theme.Panel"
             android:documentLaunchMode="always"
             android:excludeFromRecents="true"
             android:exported="true">
diff --git a/res/drawable-hdpi/ic_live_help.png b/res/drawable-hdpi/ic_live_help.png
deleted file mode 100644
index f3548f6..0000000
--- a/res/drawable-hdpi/ic_live_help.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_live_help.png b/res/drawable-mdpi/ic_live_help.png
deleted file mode 100644
index e958662..0000000
--- a/res/drawable-mdpi/ic_live_help.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_live_help.png b/res/drawable-xhdpi/ic_live_help.png
deleted file mode 100644
index dbbbfed..0000000
--- a/res/drawable-xhdpi/ic_live_help.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_live_help.png b/res/drawable-xxhdpi/ic_live_help.png
deleted file mode 100644
index f2a01fe..0000000
--- a/res/drawable-xxhdpi/ic_live_help.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_live_help.png b/res/drawable-xxxhdpi/ic_live_help.png
deleted file mode 100644
index 00338a0..0000000
--- a/res/drawable-xxxhdpi/ic_live_help.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/ic_feedback_24dp.xml b/res/drawable/ic_feedback_24dp.xml
new file mode 100644
index 0000000..a65f444
--- /dev/null
+++ b/res/drawable/ic_feedback_24dp.xml
@@ -0,0 +1,30 @@
+<!--
+  ~ Copyright (C) 2019 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
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24"
+        android:viewportHeight="24">
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M20,2H4C2.9,2 2.01,2.9 2.01,4L2,22l4,-4h14c1.1,0 2,-0.9 2,-2V4C22,2.9 21.1,2 20,2zM20,16H6H5.17l-0.59,0.59L4,17.17V4h16V16z"/>
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M11,12h2v2h-2z"/>
+    <path
+        android:fillColor="#FF000000"
+        android:pathData="M11,6h2v4h-2z"/>
+</vector>
diff --git a/res/layout/panel_layout.xml b/res/layout/panel_layout.xml
index c697afc..abe8f41 100644
--- a/res/layout/panel_layout.xml
+++ b/res/layout/panel_layout.xml
@@ -34,7 +34,7 @@
             android:gravity="center"
             android:paddingBottom="24dp"
             android:paddingTop="18dp"
-            android:textColor="?android:attr/colorPrimary"
+            android:textColor="?android:attr/textColorPrimary"
             android:textSize="20sp"/>
 
         <include layout="@layout/horizontal_divider"/>
diff --git a/res/raw/bubbles.mp4 b/res/raw/bubbles.mp4
new file mode 100644
index 0000000..c68ea57
--- /dev/null
+++ b/res/raw/bubbles.mp4
Binary files differ
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 2a29f44..57d56ad 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -11092,4 +11092,7 @@
 
     <!-- Warn the user that the phone have emergency call limitation. [CHAR LIMIT=NONE] -->
     <string name="wfc_disclaimer_emergency_limitation_desc_text">Emergency calls over Wi\u2011Fi Calling are not supported by your carrier.\nThe device switches automatically to a cellular network to place an emergency call.\nEmergency calls are only possible in areas with cellular coverage.</string>
+
+    <!-- Summary for Wi-Fi calling to explain this feature [CHAR LIMIT=NONE] -->
+    <string name="wifi_calling_summary">Use Wi\u2011Fi for calls to improve quality</string>
 </resources>
diff --git a/res/values/themes.xml b/res/values/themes.xml
index d29d78b..8268ce1 100644
--- a/res/values/themes.xml
+++ b/res/values/themes.xml
@@ -203,7 +203,7 @@
     </style>
 
     <!-- Note that Dialog themes do not set list dividers -->
-    <style name="Theme.BottomDialog" parent="@*android:style/Theme.DeviceDefault.Settings.Dialog">
+    <style name="Theme.Panel" parent="@*android:style/Theme.DeviceDefault.Settings.Dialog">
         <item name="android:windowBackground">@null</item>
         <item name="android:dividerHorizontal">@*android:drawable/list_divider_material</item>
         <item name="android:windowNoTitle">true</item>
diff --git a/res/xml/bubble_notification_settings.xml b/res/xml/bubble_notification_settings.xml
index 20783fa..7fba125 100644
--- a/res/xml/bubble_notification_settings.xml
+++ b/res/xml/bubble_notification_settings.xml
@@ -18,6 +18,14 @@
                   xmlns:settings="http://schemas.android.com/apk/res-auto"
                   android:title="@string/bubbles_app_toggle_title"
                   android:key="bubble_notification_settings">
+
+        <com.android.settings.widget.VideoPreference
+            android:key="bubbles_illustration"
+            android:title="@string/summary_placeholder"
+            settings:animation="@raw/bubbles"
+            settings:controller="com.android.settings.widget.VideoPreferenceController"
+            android:persistent="false" />
+
         <!-- Notification bubbles -->
         <SwitchPreference
             android:key="global_notification_bubbles"
diff --git a/res/xml/mobile_network_settings.xml b/res/xml/mobile_network_settings.xml
index 16484f3..1a9b885 100644
--- a/res/xml/mobile_network_settings.xml
+++ b/res/xml/mobile_network_settings.xml
@@ -83,6 +83,7 @@
         <PreferenceScreen
             android:key="wifi_calling_key"
             android:title="@string/wifi_calling_settings_title"
+            android:summary="@string/wifi_calling_summary"
             settings:controller="com.android.settings.network.telephony.WifiCallingPreferenceController" >
             <intent android:action="android.intent.action.MAIN"
                     android:targetPackage="com.android.settings"
diff --git a/res/xml/mobile_network_settings_v2.xml b/res/xml/mobile_network_settings_v2.xml
index 6890a41..cc377bd 100644
--- a/res/xml/mobile_network_settings_v2.xml
+++ b/res/xml/mobile_network_settings_v2.xml
@@ -123,6 +123,7 @@
             <PreferenceScreen
                 android:key="wifi_calling_key"
                 android:title="@string/wifi_calling_settings_title"
+                android:summary="@string/wifi_calling_summary"
                 settings:controller="com.android.settings.network.telephony.WifiCallingPreferenceController">
                 <intent android:action="android.intent.action.MAIN"
                         android:targetPackage="com.android.settings"
diff --git a/src/com/android/settings/password/ChooseLockPassword.java b/src/com/android/settings/password/ChooseLockPassword.java
index 21ef720..8677e22 100644
--- a/src/com/android/settings/password/ChooseLockPassword.java
+++ b/src/com/android/settings/password/ChooseLockPassword.java
@@ -515,7 +515,7 @@
             }
         }
 
-        private int getStageType() {
+        protected int getStageType() {
             return mForFingerprint ? Stage.TYPE_FINGERPRINT :
                     mForFace ? Stage.TYPE_FACE :
                             Stage.TYPE_NONE;
diff --git a/src/com/android/settings/password/ChooseLockPattern.java b/src/com/android/settings/password/ChooseLockPattern.java
index 85b9a46..dd5e674 100644
--- a/src/com/android/settings/password/ChooseLockPattern.java
+++ b/src/com/android/settings/password/ChooseLockPattern.java
@@ -185,7 +185,7 @@
         // how long we wait to clear a wrong pattern
         private static final int WRONG_PATTERN_CLEAR_TIMEOUT_MS = 2000;
 
-        private static final int ID_EMPTY_MESSAGE = -1;
+        protected static final int ID_EMPTY_MESSAGE = -1;
 
         private static final String FRAGMENT_TAG_SAVE_AND_FINISH = "save_and_finish_worker";
 
diff --git a/src/com/android/settings/password/SetupChooseLockGeneric.java b/src/com/android/settings/password/SetupChooseLockGeneric.java
index 72b9fa8..8155a72 100644
--- a/src/com/android/settings/password/SetupChooseLockGeneric.java
+++ b/src/com/android/settings/password/SetupChooseLockGeneric.java
@@ -196,8 +196,14 @@
             final String key = preference.getKey();
             if (KEY_UNLOCK_SET_DO_LATER.equals(key)) {
                 // show warning.
-                SetupSkipDialog dialog = SetupSkipDialog.newInstance(getActivity().getIntent()
-                        .getBooleanExtra(SetupSkipDialog.EXTRA_FRP_SUPPORTED, false));
+                SetupSkipDialog dialog = SetupSkipDialog.newInstance(
+                        getActivity().getIntent()
+                                .getBooleanExtra(SetupSkipDialog.EXTRA_FRP_SUPPORTED, false),
+                        /* isPatternMode= */ false,
+                        /* isAlphaMode= */ false,
+                        /* isFingerprintSupported= */ false,
+                        /* isFaceSupported= */ false
+                );
                 dialog.show(getFragmentManager());
                 return true;
             }
@@ -231,7 +237,7 @@
 
         @Override
         protected Intent getBiometricEnrollIntent(Context context) {
-            final Intent intent = getBiometricEnrollIntent(context);
+            final Intent intent = super.getBiometricEnrollIntent(context);
             SetupWizardUtils.copySetupExtras(getActivity().getIntent(), intent);
             return intent;
         }
diff --git a/src/com/android/settings/password/SetupChooseLockPassword.java b/src/com/android/settings/password/SetupChooseLockPassword.java
index 213351b..60bb0cd 100644
--- a/src/com/android/settings/password/SetupChooseLockPassword.java
+++ b/src/com/android/settings/password/SetupChooseLockPassword.java
@@ -106,7 +106,16 @@
             if (mLeftButtonIsSkip) {
                 SetupSkipDialog dialog = SetupSkipDialog.newInstance(
                         getActivity().getIntent()
-                                .getBooleanExtra(SetupSkipDialog.EXTRA_FRP_SUPPORTED, false));
+                                .getBooleanExtra(SetupSkipDialog.EXTRA_FRP_SUPPORTED, false),
+                        /* isPatternMode= */ false,
+                        mIsAlphaMode,
+                        getActivity().getIntent()
+                                .getBooleanExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT,
+                                        false),
+                        getActivity().getIntent()
+                                .getBooleanExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FACE, false)
+
+                );
                 dialog.show(getFragmentManager());
                 return;
             }
@@ -132,6 +141,13 @@
         }
 
         @Override
+        protected int getStageType() {
+            // Return TYPE_NONE to make generic lock screen launch in Setup wizard flow before
+            // fingerprint and face setup.
+            return Stage.TYPE_NONE;
+        }
+
+        @Override
         protected void updateUi() {
             super.updateUi();
             // Show the skip button during SUW but not during Settings > Biometric Enrollment
diff --git a/src/com/android/settings/password/SetupChooseLockPattern.java b/src/com/android/settings/password/SetupChooseLockPattern.java
index 3a69844..8e59d8c 100644
--- a/src/com/android/settings/password/SetupChooseLockPattern.java
+++ b/src/com/android/settings/password/SetupChooseLockPattern.java
@@ -54,6 +54,15 @@
         return SetupChooseLockPatternFragment.class;
     }
 
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        // Show generic pattern title when pattern lock screen launch in Setup wizard flow before
+        // fingerprint and face setup.
+        setTitle(R.string.lockpassword_choose_your_screen_lock_header);
+    }
+
     public static class SetupChooseLockPatternFragment extends ChooseLockPatternFragment
             implements ChooseLockTypeDialogFragment.OnLockTypeSelectedListener {
 
@@ -83,7 +92,16 @@
             if (mLeftButtonIsSkip) {
                 SetupSkipDialog dialog = SetupSkipDialog.newInstance(
                         getActivity().getIntent()
-                                .getBooleanExtra(SetupSkipDialog.EXTRA_FRP_SUPPORTED, false));
+                                .getBooleanExtra(SetupSkipDialog.EXTRA_FRP_SUPPORTED, false),
+                        /* isPatternMode= */ true,
+                        /* isAlphaMode= */ false,
+                        getActivity().getIntent()
+                                .getBooleanExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT,
+                                false),
+                        getActivity().getIntent()
+                                .getBooleanExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FACE, false)
+
+                );
                 dialog.show(getFragmentManager());
                 return;
             }
@@ -116,6 +134,14 @@
             } else {
                 mLeftButtonIsSkip = false;
             }
+
+            // Show generic pattern message when pattern lock screen launch in Setup wizard flow
+            // before fingerprint and face setup.
+            if (stage.message == ID_EMPTY_MESSAGE) {
+                mMessageText.setText("");
+            } else {
+                mMessageText.setText(stage.message);
+            }
         }
 
         @Override
diff --git a/src/com/android/settings/password/SetupSkipDialog.java b/src/com/android/settings/password/SetupSkipDialog.java
index dc1894e..68f8dd4 100644
--- a/src/com/android/settings/password/SetupSkipDialog.java
+++ b/src/com/android/settings/password/SetupSkipDialog.java
@@ -35,13 +35,22 @@
     public static final String EXTRA_FRP_SUPPORTED = ":settings:frp_supported";
 
     private static final String ARG_FRP_SUPPORTED = "frp_supported";
+    // The key indicates type of lock screen is pattern setup.
+    private static final String ARG_LOCK_TYPE_PATTERN = "lock_type_pattern";
+    // The key indicates type of lock screen setup is alphanumeric for password setup.
+    private static final String ARG_LOCK_TYPE_ALPHANUMERIC = "lock_type_alphanumeric";
     private static final String TAG_SKIP_DIALOG = "skip_dialog";
     public static final int RESULT_SKIP = Activity.RESULT_FIRST_USER + 10;
 
-    public static SetupSkipDialog newInstance(boolean isFrpSupported) {
+    public static SetupSkipDialog newInstance(boolean isFrpSupported, boolean isPatternMode,
+            boolean isAlphanumericMode, boolean isFingerprintSupported, boolean isFaceSupported) {
         SetupSkipDialog dialog = new SetupSkipDialog();
         Bundle args = new Bundle();
         args.putBoolean(ARG_FRP_SUPPORTED, isFrpSupported);
+        args.putBoolean(ARG_LOCK_TYPE_PATTERN, isPatternMode);
+        args.putBoolean(ARG_LOCK_TYPE_ALPHANUMERIC, isAlphanumericMode);
+        args.putBoolean(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT, isFingerprintSupported);
+        args.putBoolean(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FACE, isFaceSupported);
         dialog.setArguments(args);
         return dialog;
     }
@@ -59,13 +68,36 @@
     @NonNull
     public AlertDialog.Builder onCreateDialogBuilder() {
         Bundle args = getArguments();
-        return new AlertDialog.Builder(getContext())
-                .setPositiveButton(R.string.skip_anyway_button_label, this)
-                .setNegativeButton(R.string.go_back_button_label, this)
-                .setTitle(R.string.lock_screen_intro_skip_title)
-                .setMessage(args.getBoolean(ARG_FRP_SUPPORTED) ?
-                        R.string.lock_screen_intro_skip_dialog_text_frp :
-                        R.string.lock_screen_intro_skip_dialog_text);
+        final boolean isFaceSupported =
+                args.getBoolean(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FACE);
+        final boolean isFingerprintSupported =
+                args.getBoolean(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT);
+        if (isFaceSupported || isFingerprintSupported) {
+            final int titleId;
+
+            if (args.getBoolean(ARG_LOCK_TYPE_PATTERN)) {
+                titleId = R.string.lock_screen_pattern_skip_title;
+            } else {
+                titleId = args.getBoolean(ARG_LOCK_TYPE_ALPHANUMERIC) ?
+                    R.string.lock_screen_password_skip_title : R.string.lock_screen_pin_skip_title;
+            }
+
+            return new AlertDialog.Builder(getContext())
+                    .setPositiveButton(R.string.skip_lock_screen_dialog_button_label, this)
+                    .setNegativeButton(R.string.cancel_lock_screen_dialog_button_label, this)
+                    .setTitle(titleId)
+                    .setMessage(isFaceSupported ?
+                            R.string.face_lock_screen_setup_skip_dialog_text :
+                            R.string.fingerprint_lock_screen_setup_skip_dialog_text);
+        } else {
+            return new AlertDialog.Builder(getContext())
+                    .setPositiveButton(R.string.skip_anyway_button_label, this)
+                    .setNegativeButton(R.string.go_back_button_label, this)
+                    .setTitle(R.string.lock_screen_intro_skip_title)
+                    .setMessage(args.getBoolean(ARG_FRP_SUPPORTED) ?
+                            R.string.lock_screen_intro_skip_dialog_text_frp :
+                            R.string.lock_screen_intro_skip_dialog_text);
+        }
     }
 
     @Override
diff --git a/src/com/android/settings/sim/SimListDialogFragment.java b/src/com/android/settings/sim/SimListDialogFragment.java
index 1802d65..3b78927 100644
--- a/src/com/android/settings/sim/SimListDialogFragment.java
+++ b/src/com/android/settings/sim/SimListDialogFragment.java
@@ -174,7 +174,7 @@
             if (sub == null) {
                 title.setText(R.string.sim_calls_ask_first_prefs_title);
                 summary.setText("");
-                icon.setImageDrawable(mContext.getDrawable(R.drawable.ic_help));
+                icon.setImageDrawable(mContext.getDrawable(R.drawable.ic_feedback_24dp));
                 icon.setImageTintList(
                         Utils.getColorAttr(mContext, android.R.attr.textColorSecondary));
             } else {
diff --git a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
index f98dc58..dfb59d1 100644
--- a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
+++ b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
@@ -1109,6 +1109,10 @@
             }
             @Override
             public void onFinish() {
+                if (mFragment == null || mFragment.getActivity() == null) {
+                    Log.d(TAG, "Ignore timeout since activity not exist!");
+                    return;
+                }
                 Log.e(TAG, "Timeout for state:" + mConnectingState);
                 if (mConnectingState == STATE_ENABLE_WIFI) {
                     updateConnectingState(STATE_ENABLE_WIFI_FAILED);
diff --git a/tests/robotests/src/com/android/settings/password/SetupSkipDialogTest.java b/tests/robotests/src/com/android/settings/password/SetupSkipDialogTest.java
index a769048..f46f68f 100644
--- a/tests/robotests/src/com/android/settings/password/SetupSkipDialogTest.java
+++ b/tests/robotests/src/com/android/settings/password/SetupSkipDialogTest.java
@@ -45,7 +45,8 @@
 
     @Test
     public void frpMessages_areShownCorrectly_whenNotSupported() {
-        SetupSkipDialog setupSkipDialog = SetupSkipDialog.newInstance(false);
+        SetupSkipDialog setupSkipDialog =
+                SetupSkipDialog.newInstance(false, false, false, false, false);
         setupSkipDialog.show(mActivity.getSupportFragmentManager());
 
         AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
@@ -59,7 +60,8 @@
 
     @Test
     public void frpMessages_areShownCorrectly_whenSupported() {
-        SetupSkipDialog setupSkipDialog = SetupSkipDialog.newInstance(true);
+        SetupSkipDialog setupSkipDialog =
+                SetupSkipDialog.newInstance(true, false, false, false, false);
         setupSkipDialog.show(mActivity.getSupportFragmentManager());
 
         AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
@@ -70,4 +72,101 @@
         assertThat(mActivity.getString(R.string.lock_screen_intro_skip_dialog_text_frp)).isEqualTo(
                 shadowAlertDialog.getMessage());
     }
+
+    @Test
+    public void dialogMessage_whenSkipPinSetupForFace_shouldShownCorrectly() {
+        SetupSkipDialog setupSkipDialog =
+                SetupSkipDialog.newInstance(true, false, false, false, true);
+        setupSkipDialog.show(mActivity.getSupportFragmentManager());
+
+        AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+        assertThat(alertDialog).isNotNull();
+        ShadowAlertDialogCompat shadowAlertDialog = ShadowAlertDialogCompat.shadowOf(alertDialog);
+        assertThat(mActivity.getString(R.string.lock_screen_pin_skip_title)).isEqualTo(
+                shadowAlertDialog.getTitle());
+
+        assertThat(getSkipDialogMessage(false)).isEqualTo(shadowAlertDialog.getMessage());
+    }
+
+    @Test
+    public void dialogMessage_whenSkipPasswordSetupForFace_shouldShownCorrectly() {
+        SetupSkipDialog setupSkipDialog =
+                SetupSkipDialog.newInstance(true, false, true, false, true);
+        setupSkipDialog.show(mActivity.getSupportFragmentManager());
+
+        AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+        assertThat(alertDialog).isNotNull();
+        ShadowAlertDialogCompat shadowAlertDialog = ShadowAlertDialogCompat.shadowOf(alertDialog);
+        assertThat(mActivity.getString(R.string.lock_screen_password_skip_title)).isEqualTo(
+                shadowAlertDialog.getTitle());
+
+        assertThat(getSkipDialogMessage(false)).isEqualTo(shadowAlertDialog.getMessage());
+    }
+
+    @Test
+    public void dialogMessage_whenSkipPatternSetupForFace_shouldShownCorrectly() {
+        SetupSkipDialog setupSkipDialog =
+                SetupSkipDialog.newInstance(true, true, false, false, true);
+        setupSkipDialog.show(mActivity.getSupportFragmentManager());
+
+        AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+        assertThat(alertDialog).isNotNull();
+        ShadowAlertDialogCompat shadowAlertDialog = ShadowAlertDialogCompat.shadowOf(alertDialog);
+        assertThat(mActivity.getString(R.string.lock_screen_pattern_skip_title)).isEqualTo(
+                shadowAlertDialog.getTitle());
+
+        assertThat(getSkipDialogMessage(false)).isEqualTo(shadowAlertDialog.getMessage());
+    }
+
+    @Test
+    public void dialogMessage_whenSkipPinSetupForFingerprint_shouldShownCorrectly() {
+        SetupSkipDialog setupSkipDialog =
+                SetupSkipDialog.newInstance(true, false, false, true, false);
+        setupSkipDialog.show(mActivity.getSupportFragmentManager());
+
+        AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+        assertThat(alertDialog).isNotNull();
+        ShadowAlertDialogCompat shadowAlertDialog = ShadowAlertDialogCompat.shadowOf(alertDialog);
+        assertThat(mActivity.getString(R.string.lock_screen_pin_skip_title)).isEqualTo(
+                shadowAlertDialog.getTitle());
+
+        assertThat(getSkipDialogMessage(true)).isEqualTo(shadowAlertDialog.getMessage());
+    }
+
+    @Test
+    public void dialogMessage_whenSkipPasswordSetupForFingerprint_shouldShownCorrectly() {
+        SetupSkipDialog setupSkipDialog =
+                SetupSkipDialog.newInstance(true, false, true, true, false);
+        setupSkipDialog.show(mActivity.getSupportFragmentManager());
+
+        AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+        assertThat(alertDialog).isNotNull();
+        ShadowAlertDialogCompat shadowAlertDialog = ShadowAlertDialogCompat.shadowOf(alertDialog);
+        assertThat(mActivity.getString(R.string.lock_screen_password_skip_title)).isEqualTo(
+                shadowAlertDialog.getTitle());
+
+        assertThat(getSkipDialogMessage(true)).isEqualTo(shadowAlertDialog.getMessage());
+    }
+
+    @Test
+    public void dialogMessage_whenSkipPatternSetupForFingerprint_shouldShownCorrectly() {
+        SetupSkipDialog setupSkipDialog =
+                SetupSkipDialog.newInstance(true, true, false, true, false);
+        setupSkipDialog.show(mActivity.getSupportFragmentManager());
+
+        AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+        assertThat(alertDialog).isNotNull();
+        ShadowAlertDialogCompat shadowAlertDialog = ShadowAlertDialogCompat.shadowOf(alertDialog);
+        assertThat(mActivity.getString(R.string.lock_screen_pattern_skip_title)).isEqualTo(
+                shadowAlertDialog.getTitle());
+
+        assertThat(getSkipDialogMessage(true)).isEqualTo(shadowAlertDialog.getMessage());
+    }
+
+    public String getSkipDialogMessage(boolean isFingerprintSupported) {
+        return String.format(
+                mActivity.getString(isFingerprintSupported ?
+                        R.string.fingerprint_lock_screen_setup_skip_dialog_text :
+                        R.string.face_lock_screen_setup_skip_dialog_text));
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
index d4ce481..3ffe61a 100644
--- a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
@@ -1624,6 +1624,39 @@
     }
 
     @Test
+    public void testConnectButton_clickConnectAndBackKey_ignoreTimeoutEvent() {
+        setUpForDisconnectedNetwork();
+        when(mockWifiManager.isWifiEnabled()).thenReturn(true);
+        InOrder inOrder = inOrder(mockButtonsPref);
+        setUpForToast();
+
+        displayAndResume();
+
+        // check connect button exist
+        verifyConnectBtnSetUpAsVisible(inOrder);
+
+        // click connect button
+        mController.connectNetwork();
+
+        // check display button as connecting
+        verify(mockWifiManager, times(1)).connect(anyInt(), any(WifiManager.ActionListener.class));
+        verifyConnectBtnSetUpAsConnecting(inOrder);
+
+        // leave detail page
+        when(mockFragment.getActivity()).thenReturn(null);
+
+        // timeout happened
+        mController.mTimer.onFinish();
+
+        // check connect button visible, be init as default and toast failed message
+        inOrder.verify(mockButtonsPref, never()).setButton3Text(R.string.wifi_connect);
+        inOrder.verify(mockButtonsPref, never()).setButton3Icon(R.drawable.ic_settings_wireless);
+        inOrder.verify(mockButtonsPref, never()).setButton3Enabled(true);
+        inOrder.verify(mockButtonsPref, never()).setButton3Visible(true);
+        assertThat(ShadowToast.shownToastCount()).isEqualTo(0);
+    }
+
+    @Test
     public void updateAccessPoint_returnFalseForNothingChanged() {
         setUpForDisconnectedNetwork();