diff --git a/res/layout-land/wifi_dpp_qrcode_scanner_fragment.xml b/res/layout-land/wifi_dpp_qrcode_scanner_fragment.xml
index 4eed0f6..0069e93 100644
--- a/res/layout-land/wifi_dpp_qrcode_scanner_fragment.xml
+++ b/res/layout-land/wifi_dpp_qrcode_scanner_fragment.xml
@@ -46,9 +46,14 @@
                     android:layout_height="match_parent"/>
             </com.android.settings.wifi.qrcode.QrPreviewLayout>
 
-            <TextView android:id="@+id/error_message"
+            <TextView
+                android:id="@+id/error_message"
                 android:layout_width="wrap_content"
-                android:layout_height="wrap_content"/>
+                android:layout_height="wrap_content"
+                android:textAlignment="center"
+                android:layout_marginTop="8dp"
+                android:visibility="invisible"
+                android:textColor="?android:attr/colorError"/>
 
         </LinearLayout>
 
diff --git a/res/layout/wifi_dpp_qrcode_scanner_fragment.xml b/res/layout/wifi_dpp_qrcode_scanner_fragment.xml
index c5e416b..9bd066b 100644
--- a/res/layout/wifi_dpp_qrcode_scanner_fragment.xml
+++ b/res/layout/wifi_dpp_qrcode_scanner_fragment.xml
@@ -50,8 +50,8 @@
                 android:id="@+id/error_message"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
+                android:textAlignment="center"
                 android:layout_marginTop="8dp"
-                android:text="@string/wifi_dpp_could_not_detect_valid_qr_code"
                 android:visibility="invisible"
                 android:textColor="?android:attr/colorError"/>
 
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 31b89f1..03e40aa 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -1098,6 +1098,17 @@
         <item>zen_mode_from_none</item>
     </string-array>
 
+    <!--String arrays for notification swipe direction -->
+    <string-array name="swipe_direction_titles">
+        <item>@string/swipe_direction_rtl</item>
+        <item>@string/swipe_direction_ltr</item>
+    </string-array>
+
+    <string-array name="swipe_direction_values">
+        <item>1</item>
+        <item>0</item>
+    </string-array>
+
     <string-array name="wifi_metered_entries">
         <item>Detect automatically</item>
         <item>Treat as metered</item>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 266836d..c031c5b 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -728,7 +728,7 @@
     <string name="date_and_time_settings_title_setup_wizard">Set date and time</string>
     <!-- Main Settings screen setting option summary text for the item to go into the date and time settings. -->
     <string name="date_and_time_settings_summary">Set date, time, time zone, &amp; formats</string>
-    <!-- Date & time setting screen setting check box title if the date and time should be determined automatically [CHAR LIMIT=30] -->
+    <!-- Date & time setting screen setting check box title if the date and time should be determined automatically [CHAR LIMIT=100] -->
     <string name="date_time_auto">Use network-provided time</string>
     <!-- Date & time setting screen setting option text when Automatic time zone check box is selected (that is, when date and time should be determined automatically)
         [CHAR LIMIT=100]  -->
@@ -2124,7 +2124,19 @@
     <!-- Hint for the user to use another device to scan QR code on screen to join Wi-Fi [CHAR LIMIT=NONE] -->
     <string name="wifi_dpp_scan_qr_code_with_another_device">Scan this QR code with another device to join \u201c<xliff:g id="ssid" example="OfficeWifi">%1$s</xliff:g>\u201d</string>
     <!-- Hint for QR code detection [CHAR LIMIT=NONE]  -->
-    <string name="wifi_dpp_could_not_detect_valid_qr_code">Couldn\u2019t read QR code</string>
+    <string name="wifi_dpp_could_not_detect_valid_qr_code">Couldn\u2019t read QR code. Re-center code and try again</string>
+    <!-- Hint for Wi-Fi DPP handshake failure [CHAR LIMIT=NONE]  -->
+    <string name="wifi_dpp_failure_authentication_or_configuration">Try again. If the issue continues, contact the device manufacturer</string>
+    <!-- Hint for Wi-Fi DPP handshake failure [CHAR LIMIT=NONE]  -->
+    <string name="wifi_dpp_failure_not_compatible">Something went wrong</string>
+    <!-- Hint for Wi-Fi DPP handshake failure [CHAR LIMIT=NONE]  -->
+    <string name="wifi_dpp_failure_timeout">Make sure the device has been plugged in, charged, and turned on</string>
+    <!-- Hint for Wi-Fi DPP handshake failure [CHAR LIMIT=NONE]  -->
+    <string name="wifi_dpp_failure_generic">Make sure the device has been plugged in, charged, and turned on. If the issue continues, contact the device manufacturer</string>
+    <!-- Hint for Wi-Fi DPP handshake failure [CHAR LIMIT=NONE]  -->
+    <string name="wifi_dpp_failure_not_supported">Adding \u201c<xliff:g id="ssid" example="OfficeWifi">%1$s</xliff:g>\u201d isn\u2019t supported by this device</string>
+    <!-- Hint for Wi-Fi connection fail [CHAR LIMIT=NONE]  -->
+    <string name="wifi_dpp_check_connection_try_again">Check connection and try again</string>
     <!-- Title for the fragment choose network [CHAR LIMIT=50]  -->
     <string name="wifi_dpp_choose_network">Choose network</string>
     <!-- Hint for the user to center another device's QR code in the below camera window [CHAR LIMIT=NONE] -->
@@ -7622,6 +7634,15 @@
     <!-- Configure Notifications: Title for the notification bubbles option. [CHAR LIMIT=60] -->
     <string name="notification_bubbles_title">Allow notification bubbles</string>
 
+    <!-- Configure notifications: title for swipe direction [CHAR LIMIT=60] -->
+    <string name="swipe_direction_title">Swipe actions</string>
+
+    <!-- Configure notifications: value for swipe direction [CHAR LIMIT=100] -->
+    <string name="swipe_direction_ltr">Swipe right to dismiss, left to show menu</string>
+
+    <!-- Configure notifications: value for swipe direction [CHAR LIMIT=100] -->
+    <string name="swipe_direction_rtl">Swipe left to dismiss, right to show menu</string>
+
     <!-- Configure Notifications: Title for the pulse notification light option. [CHAR LIMIT=30] -->
     <string name="notification_pulse_title">Blink light</string>
 
@@ -9176,7 +9197,7 @@
     <!-- Title of condition that do not disturb is on [CHAR LIMIT=36] -->
     <string name="condition_zen_title">Do Not Disturb is on</string>
 
-    <!-- Summary of condition that do not disturb is on and all exceptions set to off [CHAR LIMIT=36] -->
+    <!-- Summary of condition that do not disturb is on and all exceptions set to off [CHAR LIMIT=38] -->
     <string name="condition_zen_summary_phone_muted">Phone muted</string>
 
     <!-- Summary of condition that do not disturb is on and some exceptions are allowed [CHAR LIMIT=36] -->
diff --git a/res/xml/configure_notification_settings.xml b/res/xml/configure_notification_settings.xml
index 8df1197..803d12b 100644
--- a/res/xml/configure_notification_settings.xml
+++ b/res/xml/configure_notification_settings.xml
@@ -19,58 +19,71 @@
                   android:title="@string/configure_notification_settings"
                   android:key="configure_notification_settings">
 
-    <!-- When device is locked -->
-    <com.android.settings.RestrictedListPreference
-        android:key="lock_screen_notifications"
-        android:title="@string/lock_screen_notifications_title"
-        android:summary="@string/summary_placeholder"
-        settings:searchable="false"/>
-
     <SwitchPreference
         android:key="hide_silent_icons"
         android:title="@string/hide_silent_icons_title"
         android:summary="@string/hide_silent_icons_summary"
         settings:controller="com.android.settings.notification.SilentStatusBarPreferenceController" />
 
-    <!-- Notification badging -->
-    <SwitchPreference
-        android:key="notification_badging"
-        android:title="@string/notification_badging_title"
-        settings:controller="com.android.settings.notification.BadgingNotificationPreferenceController"/>
+    <PreferenceCategory
+        android:key="configure_notifications_advanced"
+        android:order="15"
+        settings:initialExpandedChildrenCount="0">
 
-    <!-- Notification bubbles -->
-    <SwitchPreference
-        android:key="notification_bubbles"
-        android:title="@string/notification_bubbles_title"
-        settings:controller="com.android.settings.notification.BubbleNotificationPreferenceController"/>
+        <com.android.settings.RestrictedListPreference
+            android:key="swipe"
+            android:title="@string/swipe_direction_title"
+            android:entries="@array/swipe_direction_titles"
+            android:entryValues="@array/swipe_direction_values"
+            settings:controller="com.android.settings.notification.SwipeDirectionPreferenceController"/>
 
-    <!-- Pulse notification light -->
-    <SwitchPreference
-        android:key="notification_pulse"
-        android:title="@string/notification_pulse_title"
-        settings:controller="com.android.settings.notification.PulseNotificationPreferenceController"/>
+        <!-- When device is locked -->
+        <com.android.settings.RestrictedListPreference
+            android:key="lock_screen_notifications"
+            android:title="@string/lock_screen_notifications_title"
+            android:summary="@string/summary_placeholder"
+            settings:searchable="false"/>
 
-    <!-- Default notification ringtone -->
-    <com.android.settings.DefaultRingtonePreference
-        android:key="notification_default_ringtone"
-        android:title="@string/notification_ringtone_title"
-        android:dialogTitle="@string/notification_ringtone_title"
-        android:summary="@string/summary_placeholder"
-        android:ringtoneType="notification"/>
+        <!-- Notification badging -->
+        <SwitchPreference
+            android:key="notification_badging"
+            android:title="@string/notification_badging_title"
+            settings:controller="com.android.settings.notification.BadgingNotificationPreferenceController"/>
 
-    <Preference
-        android:key="gesture_swipe_down_fingerprint_notifications"
-        android:title="@string/fingerprint_swipe_for_notifications_title"
-        android:fragment="com.android.settings.gestures.SwipeToNotificationSettings"
-        settings:controller="com.android.settings.gestures.SwipeToNotificationPreferenceController"/>
+        <!-- Notification bubbles -->
+        <SwitchPreference
+            android:key="notification_bubbles"
+            android:title="@string/notification_bubbles_title"
+            settings:controller="com.android.settings.notification.BubbleNotificationPreferenceController"/>
 
-    <com.android.settingslib.RestrictedPreference
-        android:key="zen_mode_notifications"
-        android:title="@string/zen_mode_settings_title"
-        settings:useAdminDisabledSummary="true"
-        android:fragment="com.android.settings.notification.ZenModeSettings"
-        settings:controller="com.android.settings.notification.ZenModePreferenceController"
-        settings:allowDividerAbove="false"/>
+        <!-- Pulse notification light -->
+        <SwitchPreference
+            android:key="notification_pulse"
+            android:title="@string/notification_pulse_title"
+            settings:controller="com.android.settings.notification.PulseNotificationPreferenceController"/>
+
+        <!-- Default notification ringtone -->
+        <com.android.settings.DefaultRingtonePreference
+            android:key="notification_default_ringtone"
+            android:title="@string/notification_ringtone_title"
+            android:dialogTitle="@string/notification_ringtone_title"
+            android:summary="@string/summary_placeholder"
+            android:ringtoneType="notification"/>
+
+        <Preference
+            android:key="gesture_swipe_down_fingerprint_notifications"
+            android:title="@string/fingerprint_swipe_for_notifications_title"
+            android:fragment="com.android.settings.gestures.SwipeToNotificationSettings"
+            settings:controller="com.android.settings.gestures.SwipeToNotificationPreferenceController"/>
+
+        <com.android.settingslib.RestrictedPreference
+            android:key="zen_mode_notifications"
+            android:title="@string/zen_mode_settings_title"
+            settings:useAdminDisabledSummary="true"
+            android:fragment="com.android.settings.notification.ZenModeSettings"
+            settings:controller="com.android.settings.notification.ZenModePreferenceController"
+            settings:allowDividerAbove="false"/>
+    </PreferenceCategory>
 
     <!-- Empty category to draw divider -->
     <PreferenceCategory
diff --git a/src/com/android/settings/SmsDefaultDialog.java b/src/com/android/settings/SmsDefaultDialog.java
index c25961d..e856897 100644
--- a/src/com/android/settings/SmsDefaultDialog.java
+++ b/src/com/android/settings/SmsDefaultDialog.java
@@ -67,6 +67,7 @@
     protected void onStart() {
         super.onStart();
         getWindow().addSystemFlags(SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
+        android.util.EventLog.writeEvent(0x534e4554, "120484087", -1, "");
     }
 
     @Override
diff --git a/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceController.java b/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceController.java
index 24b4dcd..6cd72f7 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceController.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceController.java
@@ -45,7 +45,8 @@
     static final Intent BROWSE_PROBE = new Intent()
             .setAction(Intent.ACTION_VIEW)
             .addCategory(Intent.CATEGORY_BROWSABLE)
-            .setData(Uri.parse("http:"));
+            .setData(Uri.parse("http:"))
+            .addFlags(Intent.FLAG_IGNORE_EPHEMERAL);
 
     public DefaultBrowserPreferenceController(Context context) {
         super(context);
@@ -112,11 +113,13 @@
         final List<ResolveInfo> candidates = new ArrayList<>();
         // Resolve that intent and check that the handleAllWebDataURI boolean is set
         final List<ResolveInfo> list = packageManager.queryIntentActivitiesAsUser(
-            BROWSE_PROBE, 0 /* flags */, userId);
+            BROWSE_PROBE, PackageManager.MATCH_ALL, userId);
         if (list != null) {
             final Set<String> addedPackages = new ArraySet<>();
             for (ResolveInfo info : list) {
-                if (info.activityInfo == null || !info.handleAllWebDataURI) {
+                if (!info.handleAllWebDataURI || info.activityInfo == null
+                        || !info.activityInfo.enabled
+                        || !info.activityInfo.applicationInfo.enabled) {
                     continue;
                 }
                 final String packageName = info.activityInfo.packageName;
diff --git a/src/com/android/settings/notification/SwipeDirectionPreferenceController.java b/src/com/android/settings/notification/SwipeDirectionPreferenceController.java
new file mode 100644
index 0000000..0d122d7
--- /dev/null
+++ b/src/com/android/settings/notification/SwipeDirectionPreferenceController.java
@@ -0,0 +1,75 @@
+/*
+ * 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.
+ */
+
+package com.android.settings.notification;
+
+import android.content.Context;
+import android.provider.Settings;
+
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
+
+import androidx.preference.ListPreference;
+import androidx.preference.Preference;
+
+public class SwipeDirectionPreferenceController extends BasePreferenceController
+        implements Preference.OnPreferenceChangeListener {
+
+    public SwipeDirectionPreferenceController(Context context, String key) {
+        super(context, key);
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return AVAILABLE;
+    }
+
+    @Override
+    public void updateState(Preference pref) {
+        ((ListPreference) pref).setValue(String.valueOf(Settings.Secure.getInt(
+                mContext.getContentResolver(),
+                Settings.Secure.NOTIFICATION_DISMISS_RTL,
+                1)));
+        super.updateState(pref);
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        Settings.Secure.putInt(mContext.getContentResolver(),
+                Settings.Secure.NOTIFICATION_DISMISS_RTL,
+                Integer.valueOf((String) newValue));
+        refreshSummary(preference);
+        return true;
+    }
+
+    @Override
+    public CharSequence getSummary() {
+        int value = Settings.Secure.getInt(mContext.getContentResolver(),
+                Settings.Secure.NOTIFICATION_DISMISS_RTL, 1);
+        String[] values = mContext.getResources().getStringArray(R.array.swipe_direction_values);
+        String[] titles = mContext.getResources().getStringArray(R.array.swipe_direction_titles);
+        if (values == null) {
+            return null;
+        }
+        for (int i = 0; i < values.length; i++) {
+            int valueAt = Integer.parseInt(values[i]);
+            if (value == valueAt) {
+                return titles[i];
+            }
+        }
+        return null;
+    }
+}
diff --git a/src/com/android/settings/wifi/dpp/WifiDppAddDeviceFragment.java b/src/com/android/settings/wifi/dpp/WifiDppAddDeviceFragment.java
index 4523def..536924d 100644
--- a/src/com/android/settings/wifi/dpp/WifiDppAddDeviceFragment.java
+++ b/src/com/android/settings/wifi/dpp/WifiDppAddDeviceFragment.java
@@ -20,6 +20,8 @@
 import android.app.Activity;
 import android.app.settings.SettingsEnums;
 import android.content.Context;
+import android.content.pm.ActivityInfo;
+import android.net.wifi.EasyConnectStatusCallback;
 import android.net.wifi.WifiManager;
 import android.os.Bundle;
 import android.text.TextUtils;
@@ -30,6 +32,8 @@
 import android.widget.Button;
 import android.widget.ImageView;
 
+import androidx.lifecycle.ViewModelProviders;
+
 import com.android.settings.R;
 
 import java.util.concurrent.Executor;
@@ -46,7 +50,12 @@
     private Button mButtonLeft;
     private Button mButtonRight;
 
-    private class EasyConnectStatusCallback extends android.net.wifi.EasyConnectStatusCallback {
+    private int mLatestStatusCode = WifiDppUtils.EASY_CONNECT_EVENT_FAILURE_NONE;
+
+    // Key for Bundle usage
+    private static final String KEY_LATEST_ERROR_CODE = "key_latest_error_code";
+
+    private class EasyConnectConfiguratorStatusCallback extends EasyConnectStatusCallback {
         @Override
         public void onEnrolleeSuccess(int newNetworkId) {
             // Do nothing
@@ -54,32 +63,14 @@
 
         @Override
         public void onConfiguratorSuccess(int code) {
-            // Update success UI.
-            setHeaderIconImageResource(R.drawable.ic_devices_check_circle_green);
-            mTitle.setText(R.string.wifi_dpp_wifi_shared_with_device);
-            mSummary.setVisibility(View.INVISIBLE);
-            mWifiApPictureView.setImageResource(R.drawable.wifi_dpp_success);
-            mChooseDifferentNetwork.setVisibility(View.INVISIBLE);
-            mButtonLeft.setText(R.string.wifi_dpp_add_another_device);
-            mButtonLeft.setOnClickListener(v -> getFragmentManager().popBackStack());
-            mButtonRight.setText(R.string.done);
-            mButtonRight.setOnClickListener(v -> {
-                final Activity activity = getActivity();
-                activity.setResult(Activity.RESULT_OK);
-                activity.finish();
-            });
+            showSuccessUi(/* isConfigurationChange */ false);
         }
 
         @Override
         public void onFailure(int code) {
-            Log.d(TAG, "EasyConnectStatusCallback.onFailure " + code);
+            Log.d(TAG, "EasyConnectConfiguratorStatusCallback.onFailure " + code);
 
-            // Update fail UI.
-            mTitle.setText(R.string.wifi_dpp_could_not_add_device);
-            mSummary.setVisibility(View.INVISIBLE);
-            mWifiApPictureView.setImageResource(R.drawable.wifi_dpp_error);
-            mChooseDifferentNetwork.setVisibility(View.INVISIBLE);
-            mButtonRight.setText(R.string.retry);
+            showErrorUi(code, /* isConfigurationChange */ false);
         }
 
         @Override
@@ -88,12 +79,145 @@
         }
     }
 
+    private void showSuccessUi(boolean isConfigurationChange) {
+        setHeaderIconImageResource(R.drawable.ic_devices_check_circle_green);
+        mTitle.setText(R.string.wifi_dpp_wifi_shared_with_device);
+        mSummary.setVisibility(View.INVISIBLE);
+        mWifiApPictureView.setImageResource(R.drawable.wifi_dpp_success);
+        mChooseDifferentNetwork.setVisibility(View.INVISIBLE);
+        mButtonLeft.setText(R.string.wifi_dpp_add_another_device);
+        mButtonLeft.setOnClickListener(v -> getFragmentManager().popBackStack());
+        mButtonRight.setText(R.string.done);
+        mButtonRight.setOnClickListener(v -> {
+            final Activity activity = getActivity();
+            activity.setResult(Activity.RESULT_OK);
+            activity.finish();
+        });
+
+        if (!isConfigurationChange) {
+            mLatestStatusCode = WifiDppUtils.EASY_CONNECT_EVENT_SUCCESS;
+        }
+    }
+
+    private void showErrorUi(int code, boolean isConfigurationChange) {
+        switch (code) {
+            case EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_INVALID_URI:
+                mSummary.setText(R.string.wifi_dpp_could_not_detect_valid_qr_code);
+                break;
+
+            case EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_AUTHENTICATION:
+                mSummary.setText(R.string.wifi_dpp_failure_authentication_or_configuration);
+                break;
+
+            case EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_NOT_COMPATIBLE:
+                mSummary.setText(R.string.wifi_dpp_failure_not_compatible);
+                break;
+
+            case EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_CONFIGURATION:
+                mSummary.setText(R.string.wifi_dpp_failure_authentication_or_configuration);
+                break;
+
+            case EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_BUSY:
+                if (isConfigurationChange) {
+                    return;
+                }
+
+                if (code == mLatestStatusCode) {
+                    throw(new IllegalStateException("Tried restarting EasyConnectSession but still"
+                            + "receiving EASY_CONNECT_EVENT_FAILURE_BUSY"));
+                }
+
+                mLatestStatusCode = code;
+                final WifiManager wifiManager =
+                        getContext().getSystemService(WifiManager.class);
+                wifiManager.stopEasyConnectSession();
+                startWifiDppConfiguratorInitiator();
+                return;
+
+            case EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_TIMEOUT:
+                mSummary.setText(R.string.wifi_dpp_failure_timeout);
+                break;
+
+            case EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_GENERIC:
+                mSummary.setText(R.string.wifi_dpp_failure_generic);
+                break;
+
+            case EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_NOT_SUPPORTED:
+                mSummary.setText(getString(R.string.wifi_dpp_failure_not_supported, getSsid()));
+                break;
+
+            case EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_INVALID_NETWORK:
+                throw(new IllegalStateException("Wi-Fi DPP configurator used a non-PSK/non-SAE"
+                        + "network to handshake"));
+
+            default:
+                throw(new IllegalStateException("Unexpected Wi-Fi DPP error"));
+        }
+
+        mTitle.setText(R.string.wifi_dpp_could_not_add_device);
+        mWifiApPictureView.setImageResource(R.drawable.wifi_dpp_error);
+        mChooseDifferentNetwork.setVisibility(View.INVISIBLE);
+        if (hasRetryButton(code)) {
+            mButtonRight.setText(R.string.retry);
+        } else {
+            mButtonRight.setText(R.string.done);
+            mButtonRight.setOnClickListener(v -> getActivity().finish());
+            mButtonLeft.setVisibility(View.INVISIBLE);
+        }
+
+        if (!isConfigurationChange) {
+            mLatestStatusCode = code;
+        }
+
+        mButtonRight.setVisibility(isGoingInitiator() ? View.INVISIBLE : View.VISIBLE);
+    }
+
+    private boolean hasRetryButton(int code) {
+        switch (code) {
+            case EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_INVALID_URI:
+            case EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_NOT_COMPATIBLE:
+                return false;
+
+            default:
+                break;
+        }
+
+        return true;
+    }
+
     @Override
     public int getMetricsCategory() {
         return SettingsEnums.SETTINGS_WIFI_DPP_CONFIGURATOR;
     }
 
     @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        if (savedInstanceState != null) {
+            mLatestStatusCode = savedInstanceState.getInt(KEY_LATEST_ERROR_CODE);
+        }
+
+        final WifiDppInitiatorViewModel model =
+                ViewModelProviders.of(this).get(WifiDppInitiatorViewModel.class);
+
+        model.getStatusCode().observe(this, statusCode -> {
+            // After configuration change, observe callback will be triggered,
+            // do nothing for this case if a handshake does not end
+            if (model.isGoingInitiator()) {
+                return;
+            }
+
+            int code = statusCode.intValue();
+            if (code == WifiDppUtils.EASY_CONNECT_EVENT_SUCCESS) {
+                new EasyConnectConfiguratorStatusCallback().onConfiguratorSuccess(code);
+            } else {
+                new EasyConnectConfiguratorStatusCallback().onFailure(code);
+            }
+        });
+    }
+
+    @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
 
@@ -125,14 +249,7 @@
             mTitle.setText(information);
         }
 
-        final WifiNetworkConfig wifiNetworkConfig = ((WifiDppConfiguratorActivity) getActivity())
-                .getWifiNetworkConfig();
-        if (!WifiNetworkConfig.isValidConfig(wifiNetworkConfig)) {
-            throw new IllegalStateException("Invalid Wi-Fi network for configuring");
-        }
-        mSummary.setText(getString(R.string.wifi_dpp_add_device_to_wifi,
-                wifiNetworkConfig.getSsid()));
-
+        mSummary.setText(getString(R.string.wifi_dpp_add_device_to_wifi, getSsid()));
         mWifiApPictureView = view.findViewById(R.id.wifi_ap_picture_view);
 
         mChooseDifferentNetwork = view.findViewById(R.id.choose_different_network);
@@ -146,19 +263,48 @@
 
         mButtonRight = view.findViewById(R.id.button_right);
         mButtonRight.setText(R.string.wifi_dpp_share_wifi);
-        mButtonRight.setOnClickListener(v -> startWifiDppInitiator());
+        mButtonRight.setOnClickListener(v -> {
+            mButtonRight.setVisibility(View.INVISIBLE);
+            startWifiDppConfiguratorInitiator();
+        });
+
+        if (savedInstanceState != null) {
+            if (mLatestStatusCode == WifiDppUtils.EASY_CONNECT_EVENT_SUCCESS) {
+                showSuccessUi(/* isConfigurationChange */ true);
+            } else if (mLatestStatusCode == WifiDppUtils.EASY_CONNECT_EVENT_FAILURE_NONE) {
+                mButtonRight.setVisibility(isGoingInitiator() ? View.INVISIBLE : View.VISIBLE);
+            } else {
+                showErrorUi(mLatestStatusCode, /* isConfigurationChange */ true);
+            }
+        }
     }
 
-    private void startWifiDppInitiator() {
+    @Override
+    public void onSaveInstanceState(Bundle outState) {
+        outState.putInt(KEY_LATEST_ERROR_CODE, mLatestStatusCode);
+
+        super.onSaveInstanceState(outState);
+    }
+
+    private String getSsid() {
+        final WifiNetworkConfig wifiNetworkConfig = ((WifiDppConfiguratorActivity) getActivity())
+                .getWifiNetworkConfig();
+        if (!WifiNetworkConfig.isValidConfig(wifiNetworkConfig)) {
+            throw new IllegalStateException("Invalid Wi-Fi network for configuring");
+        }
+        return wifiNetworkConfig.getSsid();
+    }
+
+    private void startWifiDppConfiguratorInitiator() {
         final WifiQrCode wifiQrCode = ((WifiDppConfiguratorActivity) getActivity())
                 .getWifiDppQrCode();
         final String qrCode = wifiQrCode.getQrCode();
         final int networkId =
                 ((WifiDppConfiguratorActivity) getActivity()).getWifiNetworkConfig().getNetworkId();
-        final WifiManager wifiManager = getContext().getSystemService(WifiManager.class);
-        wifiManager.startEasyConnectAsConfiguratorInitiator(qrCode, networkId,
-                WifiManager.EASY_CONNECT_NETWORK_ROLE_STA, getContext().getMainExecutor(),
-                new EasyConnectStatusCallback());
+        final WifiDppInitiatorViewModel model =
+                ViewModelProviders.of(this).get(WifiDppInitiatorViewModel.class);
+
+        model.startEasyConnectAsConfiguratorInitiator(qrCode, networkId);
     }
 
     // Container Activity must implement this interface
@@ -180,4 +326,12 @@
 
         super.onDetach();
     }
+
+    // Check is Easy Connect handshaking or not
+    private boolean isGoingInitiator() {
+        final WifiDppInitiatorViewModel model =
+                ViewModelProviders.of(this).get(WifiDppInitiatorViewModel.class);
+
+        return model.isGoingInitiator();
+    }
 }
diff --git a/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivity.java b/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivity.java
index 65be11c..1770a02 100644
--- a/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivity.java
+++ b/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivity.java
@@ -57,7 +57,6 @@
         WifiNetworkConfig.Retriever,
         WifiDppQrCodeGeneratorFragment.OnQrCodeGeneratorFragmentAddButtonClickedListener,
         WifiDppQrCodeScannerFragment.OnScanWifiDppSuccessListener,
-        WifiDppQrCodeScannerFragment.OnScanZxingWifiFormatSuccessListener,
         WifiDppAddDeviceFragment.OnClickChooseDifferentNetworkListener,
         WifiNetworkListFragment.OnChooseNetworkListener {
 
@@ -102,7 +101,7 @@
         if (savedInstanceState != null) {
             String qrCode = savedInstanceState.getString(KEY_QR_CODE);
 
-            mWifiDppQrCode = getValidWifiDppQrCodeOrNull(qrCode);
+            mWifiDppQrCode = WifiQrCode.getValidWifiDppQrCodeOrNull(qrCode);
 
             String security = savedInstanceState.getString(KEY_WIFI_SECURITY);
             String ssid = savedInstanceState.getString(KEY_WIFI_SSID);
@@ -148,7 +147,7 @@
             case Settings.ACTION_PROCESS_WIFI_EASY_CONNECT_QR_CODE:
                 String qrCode = intent.getStringExtra(Settings.EXTRA_QR_CODE);
                 mIsTest = intent.getBooleanExtra(WifiDppUtils.EXTRA_TEST, false);
-                mWifiDppQrCode = getValidWifiDppQrCodeOrNull(qrCode);
+                mWifiDppQrCode = WifiQrCode.getValidWifiDppQrCodeOrNull(qrCode);
                 final boolean isDppSupported = WifiDppUtils.isWifiDppEnabled(this);
                 if (!isDppSupported) {
                     Log.d(TAG, "Device doesn't support Wifi DPP");
@@ -285,21 +284,6 @@
         fragmentTransaction.commit();
     }
 
-    private WifiQrCode getValidWifiDppQrCodeOrNull(String qrCode) {
-        WifiQrCode wifiQrCode;
-        try {
-            wifiQrCode = new WifiQrCode(qrCode);
-        } catch(IllegalArgumentException e) {
-            return null;
-        }
-
-        if (WifiQrCode.SCHEME_DPP.equals(wifiQrCode.getScheme())) {
-            return wifiQrCode;
-        }
-
-        return null;
-    }
-
     @Override
     public WifiNetworkConfig getWifiNetworkConfig() {
         return mWifiNetworkConfig;
@@ -359,11 +343,6 @@
     }
 
     @Override
-    public void onScanZxingWifiFormatSuccess(WifiNetworkConfig wifiNetworkConfig) {
-        // Do nothing, it's impossible to be a configurator without a Wi-Fi DPP QR code
-    }
-
-    @Override
     public void onClickChooseDifferentNetwork() {
         showChooseSavedWifiNetworkFragment(/* addToBackStack */ true);
     }
diff --git a/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivity.java b/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivity.java
index 143f87f..392b27d 100644
--- a/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivity.java
+++ b/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivity.java
@@ -17,14 +17,10 @@
 package com.android.settings.wifi.dpp;
 
 import android.app.ActionBar;
-import android.app.Activity;
 import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.content.Intent;
-import android.net.wifi.WifiConfiguration;
-import android.net.wifi.WifiManager;
 import android.os.Bundle;
-import android.provider.Settings;
 import android.util.Log;
 
 import androidx.fragment.app.Fragment;
@@ -34,9 +30,6 @@
 import com.android.settings.R;
 import com.android.settings.core.InstrumentedActivity;
 
-import java.util.List;
-import java.util.concurrent.Executor;
-
 /**
  * To provision "this" device with specified Wi-Fi network.
  *
@@ -44,9 +37,7 @@
  * Wi-Fi network to be provisioned in {@code WifiDppUtils.EXTRA_WIFI_SSID}.
  */
 public class WifiDppEnrolleeActivity extends InstrumentedActivity implements
-        WifiManager.ActionListener,
-        WifiDppQrCodeScannerFragment.OnScanWifiDppSuccessListener,
-        WifiDppQrCodeScannerFragment.OnScanZxingWifiFormatSuccessListener {
+        WifiDppQrCodeScannerFragment.OnScanWifiDppSuccessListener {
     private static final String TAG = "WifiDppEnrolleeActivity";
 
     public static final String ACTION_ENROLLEE_QR_CODE_SCANNER =
@@ -54,40 +45,6 @@
 
     private FragmentManager mFragmentManager;
 
-    private class EasyConnectStatusCallback extends android.net.wifi.EasyConnectStatusCallback {
-        @Override
-        public void onEnrolleeSuccess(int newNetworkId) {
-            // Connect to the new network.
-            final WifiManager wifiManager = getSystemService(WifiManager.class);
-            final List<WifiConfiguration> wifiConfigs =
-                    wifiManager.getPrivilegedConfiguredNetworks();
-            for (WifiConfiguration wifiConfig : wifiConfigs) {
-                if (wifiConfig.networkId == newNetworkId) {
-                    wifiManager.connect(wifiConfig, WifiDppEnrolleeActivity.this);
-                    return;
-                }
-            }
-            Log.e(TAG, "Invalid networkId " + newNetworkId);
-            WifiDppEnrolleeActivity.this.onFailure(WifiManager.ERROR_AUTHENTICATING);
-        }
-
-        @Override
-        public void onConfiguratorSuccess(int code) {
-            // Do nothing
-        }
-
-        @Override
-        public void onFailure(int code) {
-            //TODO(b/122429170): Show DPP enrollee error state UI
-            Log.d(TAG, "EasyConnectStatusCallback.onFailure " + code);
-        }
-
-        @Override
-        public void onProgress(int code) {
-            // Do nothing
-        }
-    }
-
     @Override
     public int getMetricsCategory() {
         return SettingsEnums.SETTINGS_WIFI_DPP_ENROLLEE;
@@ -158,30 +115,6 @@
 
     @Override
     public void onScanWifiDppSuccess(WifiQrCode wifiQrCode) {
-        final WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
-        wifiManager.startEasyConnectAsEnrolleeInitiator(wifiQrCode.getQrCode(), getMainExecutor(),
-                new EasyConnectStatusCallback());
-    }
-
-    @Override
-    public void onScanZxingWifiFormatSuccess(WifiNetworkConfig wifiNetworkConfig) {
-        wifiNetworkConfig.connect(/* context */ this, /* listener */ this);
-    }
-
-    @Override
-    public void onSuccess() {
-        startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS));
-        setResult(Activity.RESULT_OK);
-        finish();
-    }
-
-    @Override
-    public void onFailure(int reason) {
-        Log.d(TAG, "Wi-Fi connect onFailure reason - " + reason);
-
-        final Fragment fragment = mFragmentManager.findFragmentById(R.id.fragment_container);
-        if (fragment instanceof WifiDppQrCodeScannerFragment) {
-            ((WifiDppQrCodeScannerFragment)fragment).showErrorMessage(true);
-        }
+        // Do nothing
     }
 }
diff --git a/src/com/android/settings/wifi/dpp/WifiDppInitiatorViewModel.java b/src/com/android/settings/wifi/dpp/WifiDppInitiatorViewModel.java
new file mode 100644
index 0000000..24e5ebe
--- /dev/null
+++ b/src/com/android/settings/wifi/dpp/WifiDppInitiatorViewModel.java
@@ -0,0 +1,96 @@
+/*
+ * 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.
+ */
+
+package com.android.settings.wifi.dpp;
+
+import android.app.Application;
+import android.net.wifi.EasyConnectStatusCallback;
+import android.net.wifi.WifiManager;
+
+import androidx.lifecycle.MutableLiveData;
+import androidx.lifecycle.AndroidViewModel;
+
+public class WifiDppInitiatorViewModel extends AndroidViewModel {
+    private MutableLiveData<Integer> mEnrolleeSuccessNetworkId;
+    private MutableLiveData<Integer> mStatusCode;
+    private boolean mIsGoingInitiator;
+
+    public WifiDppInitiatorViewModel(Application application) {
+        super(application);
+    }
+
+    public MutableLiveData<Integer> getEnrolleeSuccessNetworkId() {
+        if (mEnrolleeSuccessNetworkId == null) {
+            mEnrolleeSuccessNetworkId = new MutableLiveData<>();
+        }
+
+        return mEnrolleeSuccessNetworkId;
+    }
+
+    public MutableLiveData<Integer> getStatusCode() {
+        if (mStatusCode == null) {
+            mStatusCode = new MutableLiveData<>();
+        }
+
+        return mStatusCode;
+    }
+
+    public boolean isGoingInitiator() {
+        return mIsGoingInitiator;
+    }
+
+    public void startEasyConnectAsConfiguratorInitiator(String qrCode, int networkId) {
+        mIsGoingInitiator = true;
+        final WifiManager wifiManager = getApplication().getSystemService(WifiManager.class);
+
+        wifiManager.startEasyConnectAsConfiguratorInitiator(qrCode, networkId,
+                WifiManager.EASY_CONNECT_NETWORK_ROLE_STA, getApplication().getMainExecutor(),
+                new EasyConnectDelegateCallback());
+    }
+
+    public void startEasyConnectAsEnrolleeInitiator(String qrCode) {
+        mIsGoingInitiator = true;
+        final WifiManager wifiManager = getApplication().getSystemService(WifiManager.class);
+
+        wifiManager.startEasyConnectAsEnrolleeInitiator(qrCode, getApplication().getMainExecutor(),
+                new EasyConnectDelegateCallback());
+    }
+
+    private class EasyConnectDelegateCallback extends EasyConnectStatusCallback {
+        @Override
+        public void onEnrolleeSuccess(int newNetworkId) {
+            mIsGoingInitiator = false;
+            mEnrolleeSuccessNetworkId.setValue(newNetworkId);
+        }
+
+        @Override
+        public void onConfiguratorSuccess(int code) {
+            mIsGoingInitiator = false;
+            mStatusCode.setValue(WifiDppUtils.EASY_CONNECT_EVENT_SUCCESS);
+        }
+
+        @Override
+        public void onFailure(int code) {
+            mIsGoingInitiator = false;
+            mStatusCode.setValue(code);
+        }
+
+        @Override
+        public void onProgress(int code) {
+            // Do nothing
+        }
+    }
+}
diff --git a/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java b/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java
index 9524fee..c88313b 100644
--- a/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java
+++ b/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java
@@ -17,15 +17,23 @@
 package com.android.settings.wifi.dpp;
 
 import android.app.ActionBar;
+import android.app.Activity;
 import android.app.settings.SettingsEnums;
 import android.content.Context;
+import android.content.pm.ActivityInfo;
+import android.content.Intent;
 import android.graphics.Matrix;
 import android.graphics.Rect;
 import android.graphics.SurfaceTexture;
+import android.net.wifi.EasyConnectStatusCallback;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiManager;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
+import android.provider.Settings;
 import android.text.TextUtils;
+import android.util.Log;
 import android.util.Size;
 import android.view.LayoutInflater;
 import android.view.Menu;
@@ -36,13 +44,18 @@
 import android.view.ViewGroup;
 import android.widget.TextView;
 
+import androidx.lifecycle.ViewModelProviders;
+
 import com.android.settings.R;
 import com.android.settings.wifi.qrcode.QrCamera;
 import com.android.settings.wifi.qrcode.QrDecorateView;
 
+import java.util.List;
+
 public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment implements
         SurfaceTextureListener,
-        QrCamera.ScannerCallback {
+        QrCamera.ScannerCallback,
+        WifiManager.ActionListener {
     private static final String TAG = "WifiDppQrCodeScannerFragment";
 
     /** Message sent to hide error message */
@@ -57,12 +70,12 @@
     /** Message sent to manipulate ZXing Wi-Fi QR code */
     private static final int MESSAGE_SCAN_ZXING_WIFI_FORMAT_SUCCESS = 4;
 
-    private static final long SHOW_ERROR_MESSAGE_INTERVAL = 2000;
+    private static final long SHOW_ERROR_MESSAGE_INTERVAL = 10000;
     private static final long SHOW_SUCCESS_SQUARE_INTERVAL = 1000;
 
     // Key for Bundle usage
-    private static final String KEY_PUBLIC_URI = "key_public_uri";
     private static final String KEY_IS_CONFIGURATOR_MODE = "key_is_configurator_mode";
+    private static final String KEY_LATEST_ERROR_CODE = "key_latest_error_code";
 
     private QrCamera mCamera;
     private TextureView mTextureView;
@@ -78,13 +91,41 @@
     /** QR code data scanned by camera */
     private WifiQrCode mWifiQrCode;
 
+    private int mLatestStatusCode = WifiDppUtils.EASY_CONNECT_EVENT_FAILURE_NONE;
+
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
         if (savedInstanceState != null) {
             mIsConfiguratorMode = savedInstanceState.getBoolean(KEY_IS_CONFIGURATOR_MODE);
+            mLatestStatusCode = savedInstanceState.getInt(KEY_LATEST_ERROR_CODE);
         }
+
+        final WifiDppInitiatorViewModel model =
+                ViewModelProviders.of(this).get(WifiDppInitiatorViewModel.class);
+
+        model.getEnrolleeSuccessNetworkId().observe(this, networkId -> {
+            // After configuration change, observe callback will be triggered,
+            // do nothing for this case if a handshake does not end
+            if (model.isGoingInitiator()) {
+                return;
+            }
+
+            new EasyConnectEnrolleeStatusCallback().onEnrolleeSuccess(networkId.intValue());
+        });
+
+        model.getStatusCode().observe(this, statusCode -> {
+            // After configuration change, observe callback will be triggered,
+            // do nothing for this case if a handshake does not end
+            if (model.isGoingInitiator()) {
+                return;
+            }
+
+            int code = statusCode.intValue();
+            Log.d(TAG, "Easy connect enrollee callback onFailure " + code);
+            new EasyConnectEnrolleeStatusCallback().onFailure(code);
+        });
     }
 
     @Override
@@ -102,12 +143,6 @@
     }
     OnScanWifiDppSuccessListener mScanWifiDppSuccessListener;
 
-    // Container Activity must implement this interface
-    public interface OnScanZxingWifiFormatSuccessListener {
-        public void onScanZxingWifiFormatSuccess(WifiNetworkConfig wifiNetworkConfig);
-    }
-    OnScanZxingWifiFormatSuccessListener mScanZxingWifiFormatSuccessListener;
-
     /**
      * Configurator container activity of the fragment should create instance with this constructor.
      */
@@ -144,13 +179,11 @@
         super.onAttach(context);
 
         mScanWifiDppSuccessListener = (OnScanWifiDppSuccessListener) context;
-        mScanZxingWifiFormatSuccessListener = (OnScanZxingWifiFormatSuccessListener) context;
     }
 
     @Override
     public void onDetach() {
         mScanWifiDppSuccessListener = null;
-        mScanZxingWifiFormatSuccessListener = null;
 
         super.onDetach();
     }
@@ -289,7 +322,9 @@
     }
 
     private void handleWifiDpp() {
-        destroyCamera();
+        if (mCamera != null) {
+            mCamera.stop();
+        }
         mDecorateView.setFocused(true);
 
         Message message = mHandler.obtainMessage(MESSAGE_SCAN_WIFI_DPP_SUCCESS);
@@ -299,7 +334,9 @@
     }
 
     private void handleZxingWifiFormat() {
-        destroyCamera();
+        if (mCamera != null) {
+            mCamera.stop();
+        }
         mDecorateView.setFocused(true);
 
         Message message = mHandler.obtainMessage(MESSAGE_SCAN_ZXING_WIFI_FORMAT_SUCCESS);
@@ -317,7 +354,14 @@
         // Check if the camera has already created.
         if (mCamera == null) {
             mCamera = new QrCamera(getContext(), this);
-            mCamera.start(surface);
+
+            if (isGoingInitiator()) {
+                if (mDecorateView != null) {
+                    mDecorateView.setFocused(true);
+                }
+            } else {
+                mCamera.start(surface);
+            }
         }
     }
 
@@ -328,14 +372,13 @@
         }
     }
 
-    public void showErrorMessage(boolean show) {
-        mErrorMessage.setVisibility(show ? View.VISIBLE : View.INVISIBLE);
+    public void showErrorMessage(String message) {
+        mErrorMessage.setVisibility(View.VISIBLE);
+        mErrorMessage.setText(message);
 
-        if (show) {
-            mHandler.removeMessages(MESSAGE_HIDE_ERROR_MESSAGE);
-            mHandler.sendEmptyMessageDelayed(MESSAGE_HIDE_ERROR_MESSAGE,
-                    SHOW_ERROR_MESSAGE_INTERVAL);
-        }
+        mHandler.removeMessages(MESSAGE_HIDE_ERROR_MESSAGE);
+        mHandler.sendEmptyMessageDelayed(MESSAGE_HIDE_ERROR_MESSAGE,
+                SHOW_ERROR_MESSAGE_INTERVAL);
     }
 
     private final Handler mHandler = new Handler() {
@@ -343,26 +386,32 @@
         public void handleMessage(Message msg) {
             switch (msg.what) {
                 case MESSAGE_HIDE_ERROR_MESSAGE:
-                    showErrorMessage(false);
+                    mErrorMessage.setVisibility(View.INVISIBLE);
                     break;
 
                 case MESSAGE_SHOW_ERROR_MESSAGE:
-                    showErrorMessage(true);
+                    showErrorMessage(getString(R.string.wifi_dpp_could_not_detect_valid_qr_code));
                     break;
 
                 case MESSAGE_SCAN_WIFI_DPP_SUCCESS:
+                    mErrorMessage.setVisibility(View.INVISIBLE);
+
                     if (mScanWifiDppSuccessListener == null) {
                         return;
                     }
                     mScanWifiDppSuccessListener.onScanWifiDppSuccess((WifiQrCode)msg.obj);
+
+                    if (!mIsConfiguratorMode) {
+                        startWifiDppEnrolleeInitiator((WifiQrCode)msg.obj);
+                    }
                     break;
 
                 case MESSAGE_SCAN_ZXING_WIFI_FORMAT_SUCCESS:
-                    if (mScanZxingWifiFormatSuccessListener == null) {
-                        return;
-                    }
-                    mScanZxingWifiFormatSuccessListener.onScanZxingWifiFormatSuccess(
-                            (WifiNetworkConfig)msg.obj);
+                    mErrorMessage.setVisibility(View.INVISIBLE);
+
+                    final WifiNetworkConfig wifiNetworkConfig = (WifiNetworkConfig)msg.obj;
+                    wifiNetworkConfig.connect(getContext(),
+                            /* listener */ WifiDppQrCodeScannerFragment.this);
                     break;
 
                 default:
@@ -374,7 +423,149 @@
     @Override
     public void onSaveInstanceState(Bundle outState) {
         outState.putBoolean(KEY_IS_CONFIGURATOR_MODE, mIsConfiguratorMode);
+        outState.putInt(KEY_LATEST_ERROR_CODE, mLatestStatusCode);
 
         super.onSaveInstanceState(outState);
     }
+
+    private class EasyConnectEnrolleeStatusCallback extends EasyConnectStatusCallback {
+        @Override
+        public void onEnrolleeSuccess(int newNetworkId) {
+
+            // Connect to the new network.
+            final WifiManager wifiManager = getContext().getSystemService(WifiManager.class);
+            final List<WifiConfiguration> wifiConfigs =
+                    wifiManager.getPrivilegedConfiguredNetworks();
+            for (WifiConfiguration wifiConfig : wifiConfigs) {
+                if (wifiConfig.networkId == newNetworkId) {
+                    mLatestStatusCode = WifiDppUtils.EASY_CONNECT_EVENT_SUCCESS;
+                    wifiManager.connect(wifiConfig, WifiDppQrCodeScannerFragment.this);
+                    return;
+                }
+            }
+
+            Log.e(TAG, "Invalid networkId " + newNetworkId);
+            mLatestStatusCode = EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_GENERIC;
+            showErrorMessage(getString(R.string.wifi_dpp_check_connection_try_again));
+            restartCamera();
+        }
+
+        @Override
+        public void onConfiguratorSuccess(int code) {
+            // Do nothing
+        }
+
+        @Override
+        public void onFailure(int code) {
+            Log.d(TAG, "EasyConnectEnrolleeStatusCallback.onFailure " + code);
+
+            switch (code) {
+                case EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_INVALID_URI:
+                    showErrorMessage(getString(R.string.wifi_dpp_could_not_detect_valid_qr_code));
+                    break;
+
+                case EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_AUTHENTICATION:
+                    showErrorMessage(
+                            getString(R.string.wifi_dpp_failure_authentication_or_configuration));
+                    break;
+
+                case EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_NOT_COMPATIBLE:
+                    showErrorMessage(getString(R.string.wifi_dpp_failure_not_compatible));
+                    break;
+
+                case EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_CONFIGURATION:
+                    showErrorMessage(
+                            getString(R.string.wifi_dpp_failure_authentication_or_configuration));
+                    break;
+
+                case EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_BUSY:
+                    if (code == mLatestStatusCode) {
+                        throw(new IllegalStateException("stopEasyConnectSession and try again for"
+                                + "EASY_CONNECT_EVENT_FAILURE_BUSY but still failed"));
+                    }
+
+                    mLatestStatusCode = code;
+                    final WifiManager wifiManager =
+                        getContext().getSystemService(WifiManager.class);
+                    wifiManager.stopEasyConnectSession();
+                    startWifiDppEnrolleeInitiator(mWifiQrCode);
+                    return;
+
+                case EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_TIMEOUT:
+                    showErrorMessage(getString(R.string.wifi_dpp_failure_timeout));
+                    break;
+
+                case EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_GENERIC:
+                    showErrorMessage(getString(R.string.wifi_dpp_failure_generic));
+                    break;
+
+                case EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_NOT_SUPPORTED:
+                    throw(new IllegalStateException("EASY_CONNECT_EVENT_FAILURE_NOT_SUPPORTED" +
+                            " should be a configurator only error"));
+
+                case EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_INVALID_NETWORK:
+                    throw(new IllegalStateException("EASY_CONNECT_EVENT_FAILURE_INVALID_NETWORK" +
+                            " should be a configurator only error"));
+
+                default:
+                    throw(new IllegalStateException("Unexpected Wi-Fi DPP error"));
+            }
+
+            mLatestStatusCode = code;
+            restartCamera();
+        }
+
+        @Override
+        public void onProgress(int code) {
+            // Do nothing
+        }
+    }
+
+    private void startWifiDppEnrolleeInitiator(WifiQrCode wifiQrCode) {
+        final WifiDppInitiatorViewModel model =
+                ViewModelProviders.of(this).get(WifiDppInitiatorViewModel.class);
+
+        model.startEasyConnectAsEnrolleeInitiator(wifiQrCode.getQrCode());
+    }
+
+    @Override
+    public void onSuccess() {
+        startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS));
+        final Activity hostActivity = getActivity();
+        hostActivity.setResult(Activity.RESULT_OK);
+        hostActivity.finish();
+    }
+
+    @Override
+    public void onFailure(int reason) {
+        Log.d(TAG, "Wi-Fi connect onFailure reason - " + reason);
+
+        showErrorMessage(getString(R.string.wifi_dpp_check_connection_try_again));
+        restartCamera();
+    }
+
+    // Check is Easy Connect handshaking or not
+    private boolean isGoingInitiator() {
+        final WifiDppInitiatorViewModel model =
+                ViewModelProviders.of(this).get(WifiDppInitiatorViewModel.class);
+
+        return model.isGoingInitiator();
+    }
+
+    /**
+     * To resume camera decoding task after handshake fail or Wi-Fi connection fail.
+     */
+    private void restartCamera() {
+        if (mCamera == null) {
+            Log.d(TAG, "mCamera is not available for restarting camera");
+            return;
+        }
+
+        final SurfaceTexture surfaceTexture = mTextureView.getSurfaceTexture();
+        if (surfaceTexture == null) {
+            throw new IllegalStateException("SurfaceTexture is not ready for restarting camera");
+        }
+
+        mCamera.start(surfaceTexture);
+    }
 }
diff --git a/src/com/android/settings/wifi/dpp/WifiDppUtils.java b/src/com/android/settings/wifi/dpp/WifiDppUtils.java
index 8b333e2..24cd1d7 100644
--- a/src/com/android/settings/wifi/dpp/WifiDppUtils.java
+++ b/src/com/android/settings/wifi/dpp/WifiDppUtils.java
@@ -75,6 +75,16 @@
     public static final String EXTRA_TEST = "test";
 
     /**
+     * Default status code for Easy Connect
+     */
+    public static final int EASY_CONNECT_EVENT_FAILURE_NONE = 0;
+
+    /**
+     * Success status code for Easy Connect.
+     */
+    public static final int EASY_CONNECT_EVENT_SUCCESS = 1;
+
+    /**
      * Returns whether the device support WiFi DPP.
      */
     public static boolean isWifiDppEnabled(Context context) {
diff --git a/src/com/android/settings/wifi/dpp/WifiQrCode.java b/src/com/android/settings/wifi/dpp/WifiQrCode.java
index a08fb44..10971cf 100644
--- a/src/com/android/settings/wifi/dpp/WifiQrCode.java
+++ b/src/com/android/settings/wifi/dpp/WifiQrCode.java
@@ -228,4 +228,19 @@
 
         return new WifiNetworkConfig(mWifiNetworkConfig);
     }
+
+    public static WifiQrCode getValidWifiDppQrCodeOrNull(String qrCode) {
+        WifiQrCode wifiQrCode;
+        try {
+            wifiQrCode = new WifiQrCode(qrCode);
+        } catch(IllegalArgumentException e) {
+            return null;
+        }
+
+        if (SCHEME_DPP.equals(wifiQrCode.getScheme())) {
+            return wifiQrCode;
+        }
+
+        return null;
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceControllerTest.java
index 03b3867..1aa9f9d 100644
--- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceControllerTest.java
@@ -181,11 +181,11 @@
     }
 
     @Test
-    public void getCandidates_shouldQueryActivityWithFlagsEquals0() {
+    public void getCandidates_shouldQueryActivityWithMatchAll() {
         DefaultBrowserPreferenceController.getCandidates(mPackageManager, 0 /* userId */);
 
         verify(mPackageManager).queryIntentActivitiesAsUser(
-            any(Intent.class), eq(0) /* flags */, eq(0) /* userId */);
+            any(Intent.class), eq(PackageManager.MATCH_ALL), eq(0) /* userId */);
     }
 
     @Test
@@ -221,6 +221,7 @@
         info.handleAllWebDataURI = true;
         info.activityInfo = new ActivityInfo();
         info.activityInfo.packageName = packageName;
+        info.activityInfo.applicationInfo = createApplicationInfo(packageName);
         return info;
     }
 
diff --git a/tests/robotests/src/com/android/settings/notification/SwipeDirectionPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/SwipeDirectionPreferenceControllerTest.java
new file mode 100644
index 0000000..32ba592
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/notification/SwipeDirectionPreferenceControllerTest.java
@@ -0,0 +1,116 @@
+/*
+ * 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.
+ */
+
+package com.android.settings.notification;
+
+import static android.provider.Settings.Secure.NOTIFICATION_DISMISS_RTL;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.provider.Settings;
+
+import com.android.settings.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+import androidx.preference.ListPreference;
+import androidx.preference.PreferenceScreen;
+
+@RunWith(RobolectricTestRunner.class)
+public class SwipeDirectionPreferenceControllerTest {
+
+    private Context mContext;
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private PreferenceScreen mScreen;
+
+    private SwipeDirectionPreferenceController mController;
+    private ListPreference mPreference;
+
+    private static final String KEY = "swipe";
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mController = new SwipeDirectionPreferenceController(mContext, KEY);
+        mPreference = new ListPreference(RuntimeEnvironment.application);
+        mPreference.setKey(mController.getPreferenceKey());
+        when(mScreen.findPreference(mPreference.getKey())).thenReturn(mPreference);
+    }
+
+    @Test
+    public void display_shouldDisplay() {
+        assertThat(mPreference.isVisible()).isTrue();
+    }
+
+    @Test
+    public void updateState_SettingIsOn() {
+        Settings.Secure.putInt(mContext.getContentResolver(),
+                NOTIFICATION_DISMISS_RTL,
+                1);
+
+        mController.updateState(mPreference);
+
+        assertThat(mPreference.getValue()).isEqualTo("1");
+    }
+
+    @Test
+    public void updateState_SettingIsOff() {
+        Settings.Secure.putInt(mContext.getContentResolver(),
+                NOTIFICATION_DISMISS_RTL,
+                0);
+
+        mController.updateState(mPreference);
+
+        assertThat(mPreference.getValue()).isEqualTo("0");
+    }
+
+    @Test
+    public void onPreferenceChange_LTR() {
+        Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_DISMISS_RTL, 1);
+
+        mController.onPreferenceChange(mPreference, "0");
+
+        assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
+                NOTIFICATION_DISMISS_RTL, 1)).isEqualTo(0);
+
+        assertThat(mPreference.getSummary()).isEqualTo(
+                mContext.getResources().getStringArray(R.array.swipe_direction_titles)[1]);
+    }
+
+    @Test
+    public void onPreferenceChange_On() {
+        Settings.Secure.putInt(mContext.getContentResolver(), NOTIFICATION_DISMISS_RTL, 0);
+
+        mController.onPreferenceChange(mPreference, "1");
+
+        assertThat(Settings.Secure.getInt(mContext.getContentResolver(),
+                NOTIFICATION_DISMISS_RTL, 0)).isEqualTo(1);
+
+        assertThat(mPreference.getSummary()).isEqualTo(
+                mContext.getResources().getStringArray(R.array.swipe_direction_titles)[0]);
+    }
+}
diff --git a/tests/unit/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivityTest.java b/tests/unit/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivityTest.java
index 76df764..a425177 100644
--- a/tests/unit/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivityTest.java
+++ b/tests/unit/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivityTest.java
@@ -110,14 +110,6 @@
     }
 
     @Test
-    public void testActivity_shouldImplementsOnScanZxingWifiFormatSuccessCallback() {
-        WifiDppConfiguratorActivity activity = mActivityRule.getActivity();
-
-        assertThat(activity instanceof WifiDppQrCodeScannerFragment
-                .OnScanZxingWifiFormatSuccessListener).isEqualTo(true);
-    }
-
-    @Test
     public void testActivity_shouldImplementsOnClickChooseDifferentNetworkCallback() {
         WifiDppConfiguratorActivity activity = mActivityRule.getActivity();
 
diff --git a/tests/unit/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivityTest.java b/tests/unit/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivityTest.java
index 283da13..aef4767 100644
--- a/tests/unit/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivityTest.java
+++ b/tests/unit/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivityTest.java
@@ -38,12 +38,4 @@
         assertThat(activity instanceof WifiDppQrCodeScannerFragment
                 .OnScanWifiDppSuccessListener).isEqualTo(true);
     }
-
-    @Test
-    public void testActivity_shouldImplementsOnScanZxingWifiFormatSuccessCallback() {
-        WifiDppEnrolleeActivity activity = mActivityRule.getActivity();
-
-        assertThat(activity instanceof WifiDppQrCodeScannerFragment
-                .OnScanZxingWifiFormatSuccessListener).isEqualTo(true);
-    }
 }
