diff --git a/res/values/strings.xml b/res/values/strings.xml
index 0116ed4..bdc0081 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -10252,7 +10252,9 @@
     <!-- Message for Network connection timeout Dialog [CHAR LIMIT=NONE] -->
     <string name="network_connection_timeout_dialog_message">No devices found. Make sure the device is turned on and available to connect.</string>
     <!-- OK button for Network connection timeout Dialog [CHAR LIMIT=30] -->
-    <string name="network_connection_timeout_dialog_ok">Scan again</string>
+    <string name="network_connection_timeout_dialog_ok">Try again</string>
+    <!-- Message for Network connection error state Dialog [CHAR LIMIT=NONE] -->
+    <string name="network_connection_errorstate_dialog_message">Something came up. The application has cancelled the request to choose a device.</string>
 
     <!-- Summary for bluetooth devices count in Bluetooth devices slice. [CHAR LIMIT=NONE] -->
     <plurals name="show_bluetooth_devices">
diff --git a/src/com/android/settings/wifi/NetworkRequestDialogFragment.java b/src/com/android/settings/wifi/NetworkRequestDialogFragment.java
index a1d8620..efb3f8c 100644
--- a/src/com/android/settings/wifi/NetworkRequestDialogFragment.java
+++ b/src/com/android/settings/wifi/NetworkRequestDialogFragment.java
@@ -44,12 +44,18 @@
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
+import com.android.settings.wifi.NetworkRequestErrorDialogFragment.ERROR_DIALOG_TYPE;
 import com.android.settingslib.Utils;
 import com.android.settingslib.wifi.AccessPoint;
 
 import java.util.ArrayList;
 import java.util.List;
 
+/**
+ * The Fragment sets up callback {@link NetworkRequestMatchCallback} with framework. To handle most
+ * behaviors of the callback when requesting wifi network, except for error message. When error
+ * happens, {@link NetworkRequestErrorDialogFragment} will be called to display error message.
+ */
 public class NetworkRequestDialogFragment extends InstrumentedDialogFragment implements
         DialogInterface.OnClickListener, NetworkRequestMatchCallback {
 
@@ -131,7 +137,7 @@
     @Override
     public void onCancel(@NonNull DialogInterface dialog) {
         super.onCancel(dialog);
-        // Finishes activity when user clicks back key or outside of dialog.
+        // Finishes the activity when user clicks back key or outside of the dialog.
         getActivity().finish();
     }
 
@@ -166,7 +172,7 @@
             switch (msg.what) {
                 case MESSAGE_STOP_SCAN_WIFI_LIST:
                     removeMessages(MESSAGE_STOP_SCAN_WIFI_LIST);
-                    stopScanningAndPopTimeoutDialog();
+                    stopScanningAndPopErrorDialog(ERROR_DIALOG_TYPE.TIME_OUT);
                     break;
                 default:
                     // Do nothing.
@@ -175,14 +181,18 @@
         }
     };
 
-    protected void stopScanningAndPopTimeoutDialog() {
+    protected void stopScanningAndPopErrorDialog(ERROR_DIALOG_TYPE type) {
         // Dismisses current dialog.
         dismiss();
 
         // Throws new timeout dialog.
-        final NetworkRequestTimeoutDialogFragment fragment = NetworkRequestTimeoutDialogFragment
+        final NetworkRequestErrorDialogFragment fragment = NetworkRequestErrorDialogFragment
                 .newInstance();
-        fragment.show(getActivity().getSupportFragmentManager(), null);
+        final Bundle bundle = new Bundle();
+        bundle.putSerializable(NetworkRequestErrorDialogFragment.DIALOG_TYPE, type);
+        fragment.setArguments(bundle);
+        fragment.show(getActivity().getSupportFragmentManager(),
+                NetworkRequestDialogFragment.class.getSimpleName());
     }
 
     @Override
@@ -239,7 +249,7 @@
 
     @Override
     public void onAbort() {
-        // TODO(b/117399926): We should have a UI notify user here.
+        stopScanningAndPopErrorDialog(ERROR_DIALOG_TYPE.ABORT);
     }
 
     @Override
diff --git a/src/com/android/settings/wifi/NetworkRequestErrorDialogFragment.java b/src/com/android/settings/wifi/NetworkRequestErrorDialogFragment.java
new file mode 100644
index 0000000..762b467
--- /dev/null
+++ b/src/com/android/settings/wifi/NetworkRequestErrorDialogFragment.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2018 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;
+
+import android.app.Dialog;
+import android.content.DialogInterface;
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.AlertDialog;
+
+import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.R;
+import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
+
+/**
+ * The dialog shows an error message when requesting network {@link NetworkRequestDialogFragment}.
+ * Contains multi-error types in {@code ERROR_DIALOG_TYPE}.
+ */
+public class NetworkRequestErrorDialogFragment extends InstrumentedDialogFragment {
+
+    public static final String DIALOG_TYPE = "DIALOG_ERROR_TYPE";
+
+    public enum ERROR_DIALOG_TYPE {TIME_OUT, ABORT}
+
+    public static NetworkRequestErrorDialogFragment newInstance() {
+        return new NetworkRequestErrorDialogFragment();
+    }
+
+    private NetworkRequestErrorDialogFragment() {
+        super();
+    }
+
+    @Override
+    public void onCancel(@NonNull DialogInterface dialog) {
+        super.onCancel(dialog);
+        // Wants to finish the activity when user clicks back key or outside of the dialog.
+        getActivity().finish();
+    }
+
+    @Override
+    public Dialog onCreateDialog(Bundle savedInstanceState) {
+        // Gets error type to construct dialog. Default is TIME_OUT dialog.
+        ERROR_DIALOG_TYPE msgType = ERROR_DIALOG_TYPE.TIME_OUT;
+        if (getArguments() != null) {
+            msgType = (ERROR_DIALOG_TYPE) getArguments().getSerializable(DIALOG_TYPE);
+        }
+
+        final AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
+        if (msgType == ERROR_DIALOG_TYPE.TIME_OUT) {
+            builder.setMessage(R.string.network_connection_timeout_dialog_message)
+                    .setPositiveButton(R.string.network_connection_timeout_dialog_ok,
+                            (dialog, which) -> startScanningDialog())
+                    .setNegativeButton(R.string.cancel, (dialog, which) -> getActivity().finish());
+        } else {
+            builder.setMessage(R.string.network_connection_errorstate_dialog_message)
+                    .setPositiveButton(R.string.okay, (dialog, which) -> getActivity().finish());
+        }
+        return builder.create();
+    }
+
+    @Override
+    public int getMetricsCategory() {
+        return MetricsProto.MetricsEvent.WIFI_SCANNING_NEEDED_DIALOG;
+    }
+
+    protected void startScanningDialog() {
+        final NetworkRequestDialogFragment fragment = NetworkRequestDialogFragment.newInstance();
+        fragment.show(getActivity().getSupportFragmentManager(),
+                NetworkRequestErrorDialogFragment.class.getSimpleName());
+    }
+}
diff --git a/src/com/android/settings/wifi/NetworkRequestTimeoutDialogFragment.java b/src/com/android/settings/wifi/NetworkRequestTimeoutDialogFragment.java
deleted file mode 100644
index 08f285b..0000000
--- a/src/com/android/settings/wifi/NetworkRequestTimeoutDialogFragment.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2018 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;
-
-import android.app.Dialog;
-import android.content.DialogInterface;
-import android.os.Bundle;
-import androidx.appcompat.app.AlertDialog;
-import com.android.internal.logging.nano.MetricsProto;
-import com.android.settings.R;
-import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
-
-public class NetworkRequestTimeoutDialogFragment extends InstrumentedDialogFragment implements
-    DialogInterface.OnClickListener {
-
-  public static NetworkRequestTimeoutDialogFragment newInstance() {
-    NetworkRequestTimeoutDialogFragment fragment = new NetworkRequestTimeoutDialogFragment();
-    return fragment;
-  }
-
-  @Override
-  public Dialog onCreateDialog(Bundle savedInstanceState) {
-    AlertDialog.Builder builder = new AlertDialog.Builder(getContext())
-        .setMessage(R.string.network_connection_timeout_dialog_message)
-        .setPositiveButton(R.string.network_connection_timeout_dialog_ok, this)
-        .setNegativeButton(R.string.cancel, null);
-    return builder.create();
-  }
-
-  @Override
-  public int getMetricsCategory() {
-    return MetricsProto.MetricsEvent.WIFI_SCANNING_NEEDED_DIALOG;
-  }
-
-  @Override
-  public void onClick(DialogInterface dialog, int which) {
-    switch (which) {
-      case DialogInterface.BUTTON_POSITIVE:
-        startScanningDialog();
-        break;
-      case DialogInterface.BUTTON_NEGATIVE:
-      default:
-        // Do nothing.
-        break;
-    }
-  }
-
-  protected void startScanningDialog() {
-    NetworkRequestDialogFragment fragment = NetworkRequestDialogFragment.newInstance();
-    fragment.show(getActivity().getSupportFragmentManager(), null);
-  }
-}
diff --git a/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java
index 2e806dd..8cf02b8 100644
--- a/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java
@@ -17,6 +17,7 @@
 package com.android.settings.wifi;
 
 import static com.google.common.truth.Truth.assertThat;
+
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
@@ -32,213 +33,220 @@
 import android.net.wifi.WifiManager.NetworkRequestUserSelectionCallback;
 import android.os.Bundle;
 import android.widget.Button;
+
 import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.FragmentActivity;
+
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl;
 import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
+import com.android.settings.wifi.NetworkRequestErrorDialogFragment.ERROR_DIALOG_TYPE;
 import com.android.settingslib.wifi.AccessPoint;
+
 import java.util.ArrayList;
 import java.util.List;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.Robolectric;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
+
 import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
+
 import org.robolectric.shadows.ShadowLooper;
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(shadows = {SettingsShadowResourcesImpl.class, ShadowAlertDialogCompat.class})
 public class NetworkRequestDialogFragmentTest {
 
-  final String KEY_SSID = "key_ssid";
+    final String KEY_SSID = "key_ssid";
 
-  private FragmentActivity mActivity;
-  private NetworkRequestDialogFragment networkRequestDialogFragment;
-  private Context mContext;
+    private FragmentActivity mActivity;
+    private NetworkRequestDialogFragment networkRequestDialogFragment;
+    private Context mContext;
 
-  @Before
-  public void setUp() {
-    mActivity = Robolectric.setupActivity(FragmentActivity.class);
-    networkRequestDialogFragment = spy(NetworkRequestDialogFragment.newInstance());
-    mContext = spy(RuntimeEnvironment.application);
-  }
-
-  @Test
-  public void display_shouldShowTheDialog() {
-    networkRequestDialogFragment.show(mActivity.getSupportFragmentManager(), null);
-    AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
-    assertThat(alertDialog).isNotNull();
-    assertThat(alertDialog.isShowing()).isTrue();
-  }
-
-  @Test
-  public void clickPositiveButton_shouldCloseTheDialog() {
-    networkRequestDialogFragment.show(mActivity.getSupportFragmentManager(), null);
-    AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
-    assertThat(alertDialog.isShowing()).isTrue();
-
-    Button positiveButton = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE);
-    assertThat(positiveButton).isNotNull();
-
-    positiveButton.performClick();
-    assertThat(alertDialog.isShowing()).isFalse();
-  }
-
-  @Test
-  public void onResumeAndWaitTimeout_shouldCallTimeoutDialog() {
-    FakeNetworkRequestDialogFragment fakeFragment = new FakeNetworkRequestDialogFragment();
-    FakeNetworkRequestDialogFragment spyFakeFragment = spy(fakeFragment);
-    spyFakeFragment.show(mActivity.getSupportFragmentManager(), null);
-
-    assertThat(fakeFragment.bCalledStopAndPop).isFalse();
-
-    ShadowLooper.getShadowMainLooper().runToEndOfTasks();
-
-    assertThat(fakeFragment.bCalledStopAndPop).isTrue();
-  }
-
-  class FakeNetworkRequestDialogFragment extends NetworkRequestDialogFragment {
-    boolean bCalledStopAndPop = false;
-
-    @Override
-    public void stopScanningAndPopTimeoutDialog() {
-      bCalledStopAndPop = true;
+    @Before
+    public void setUp() {
+        mActivity = Robolectric.setupActivity(FragmentActivity.class);
+        networkRequestDialogFragment = spy(NetworkRequestDialogFragment.newInstance());
+        mContext = spy(RuntimeEnvironment.application);
     }
-  }
 
-  @Test
-  public void onResume_shouldRegisterCallback() {
-    when(networkRequestDialogFragment.getContext()).thenReturn(mContext);
-    Context applicationContext = spy(RuntimeEnvironment.application.getApplicationContext());
-    when(mContext.getApplicationContext()).thenReturn(applicationContext);
-    WifiManager wifiManager = mock(WifiManager.class);
-    when(applicationContext.getSystemService(Context.WIFI_SERVICE)).thenReturn(wifiManager);
+    @Test
+    public void display_shouldShowTheDialog() {
+        networkRequestDialogFragment.show(mActivity.getSupportFragmentManager(), null);
+        AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+        assertThat(alertDialog).isNotNull();
+        assertThat(alertDialog.isShowing()).isTrue();
+    }
 
-    networkRequestDialogFragment.onResume();
+    @Test
+    public void clickPositiveButton_shouldCloseTheDialog() {
+        networkRequestDialogFragment.show(mActivity.getSupportFragmentManager(), null);
+        AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+        assertThat(alertDialog.isShowing()).isTrue();
 
-    verify(wifiManager).registerNetworkRequestMatchCallback(any(), any());
-  }
+        Button positiveButton = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE);
+        assertThat(positiveButton).isNotNull();
 
-  @Test
-  public void onPause_shouldUnRegisterCallback() {
-    when(networkRequestDialogFragment.getContext()).thenReturn(mContext);
-    Context applicationContext = spy(RuntimeEnvironment.application.getApplicationContext());
-    when(mContext.getApplicationContext()).thenReturn(applicationContext);
-    WifiManager wifiManager = mock(WifiManager.class);
-    when(applicationContext.getSystemService(Context.WIFI_SERVICE)).thenReturn(wifiManager);
+        positiveButton.performClick();
+        assertThat(alertDialog.isShowing()).isFalse();
+    }
 
-    networkRequestDialogFragment.onPause();
+    @Test
+    public void onResumeAndWaitTimeout_shouldCallTimeoutDialog() {
+        FakeNetworkRequestDialogFragment fakeFragment = new FakeNetworkRequestDialogFragment();
+        FakeNetworkRequestDialogFragment spyFakeFragment = spy(fakeFragment);
+        spyFakeFragment.show(mActivity.getSupportFragmentManager(), null);
 
-    verify(wifiManager).unregisterNetworkRequestMatchCallback(networkRequestDialogFragment);
-  }
+        assertThat(fakeFragment.bCalledStopAndPop).isFalse();
 
-  @Test
-  public void updateAccessPointList_onUserSelectionConnectSuccess_updateCorrectly() {
-    List<AccessPoint> accessPointList = spy(new ArrayList<>());
-    Bundle bundle = new Bundle();
-    bundle.putString(KEY_SSID, "Test AP 1");
-    accessPointList.add(new AccessPoint(mContext, bundle));
-    bundle.putString(KEY_SSID, "Test AP 2");
-    accessPointList.add(new AccessPoint(mContext, bundle));
-    bundle.putString(KEY_SSID, "Test AP 3");
-    accessPointList.add(new AccessPoint(mContext, bundle));
-    bundle.putString(KEY_SSID, "Test AP 4");
-    accessPointList.add(new AccessPoint(mContext, bundle));
+        ShadowLooper.getShadowMainLooper().runToEndOfTasks();
 
-    when(networkRequestDialogFragment.getAccessPointList()).thenReturn(accessPointList);
-    networkRequestDialogFragment.show(mActivity.getSupportFragmentManager(), null);
+        assertThat(fakeFragment.bCalledStopAndPop).isTrue();
+    }
 
-    // Test if config would update list.
-    WifiConfiguration config = new WifiConfiguration();
-    config.SSID = "Test AP 3";
-    networkRequestDialogFragment.onUserSelectionConnectSuccess(config);
+    class FakeNetworkRequestDialogFragment extends NetworkRequestDialogFragment {
+        boolean bCalledStopAndPop = false;
 
-    AccessPoint verifyAccessPoint = new AccessPoint(mContext, config);
-    verify(accessPointList, times(1)).set(2, verifyAccessPoint);
-  }
+        @Override
+        public void stopScanningAndPopErrorDialog(ERROR_DIALOG_TYPE type) {
+            bCalledStopAndPop = true;
+        }
+    }
 
-  @Test
-  public void updateAccessPointList_onUserSelectionConnectFailure_updateCorrectly() {
-    List<AccessPoint> accessPointList = spy(new ArrayList<>());
-    Bundle bundle = new Bundle();
-    bundle.putString(KEY_SSID, "Test AP 1");
-    accessPointList.add(new AccessPoint(mContext, bundle));
-    bundle.putString(KEY_SSID, "Test AP 2");
-    accessPointList.add(new AccessPoint(mContext, bundle));
-    bundle.putString(KEY_SSID, "Test AP 3");
-    accessPointList.add(new AccessPoint(mContext, bundle));
-    bundle.putString(KEY_SSID, "Test AP 4");
-    accessPointList.add(new AccessPoint(mContext, bundle));
+    @Test
+    public void onResume_shouldRegisterCallback() {
+        when(networkRequestDialogFragment.getContext()).thenReturn(mContext);
+        Context applicationContext = spy(RuntimeEnvironment.application.getApplicationContext());
+        when(mContext.getApplicationContext()).thenReturn(applicationContext);
+        WifiManager wifiManager = mock(WifiManager.class);
+        when(applicationContext.getSystemService(Context.WIFI_SERVICE)).thenReturn(wifiManager);
 
-    when(networkRequestDialogFragment.getAccessPointList()).thenReturn(accessPointList);
-    networkRequestDialogFragment.show(mActivity.getSupportFragmentManager(), null);
+        networkRequestDialogFragment.onResume();
 
-    // Test if config would update list.
-    WifiConfiguration config = new WifiConfiguration();
-    config.SSID = "Test AP 3";
-    networkRequestDialogFragment.onUserSelectionConnectFailure(config);
+        verify(wifiManager).registerNetworkRequestMatchCallback(any(), any());
+    }
 
-    AccessPoint verifyAccessPoint = new AccessPoint(mContext, config);
-    verify(accessPointList, times(1)).set(2, verifyAccessPoint);
-  }
+    @Test
+    public void onPause_shouldUnRegisterCallback() {
+        when(networkRequestDialogFragment.getContext()).thenReturn(mContext);
+        Context applicationContext = spy(RuntimeEnvironment.application.getApplicationContext());
+        when(mContext.getApplicationContext()).thenReturn(applicationContext);
+        WifiManager wifiManager = mock(WifiManager.class);
+        when(applicationContext.getSystemService(Context.WIFI_SERVICE)).thenReturn(wifiManager);
 
-  @Test
-  public void onUserSelectionCallbackRegistration_shouldCallSelect() {
-    List<AccessPoint> accessPointList = spy(new ArrayList<>());
-    Bundle bundle = new Bundle();
-    bundle.putString(KEY_SSID, "Test AP 1");
-    accessPointList.add(new AccessPoint(mContext, bundle));
-    bundle.putString(KEY_SSID, "Test AP 2");
-    accessPointList.add(new AccessPoint(mContext, bundle));
-    bundle.putString(KEY_SSID, "Test AP 3");
-    AccessPoint clickedAccessPoint = new AccessPoint(mContext, bundle);
-    accessPointList.add(clickedAccessPoint);
-    bundle.putString(KEY_SSID, "Test AP 4");
-    accessPointList.add(new AccessPoint(mContext, bundle));
-    when(networkRequestDialogFragment.getAccessPointList()).thenReturn(accessPointList);
+        networkRequestDialogFragment.onPause();
 
-    NetworkRequestUserSelectionCallback selectionCallback = mock(
-        NetworkRequestUserSelectionCallback.class);
-    AlertDialog dialog = mock(AlertDialog.class);
-    networkRequestDialogFragment.onUserSelectionCallbackRegistration(selectionCallback);
+        verify(wifiManager).unregisterNetworkRequestMatchCallback(networkRequestDialogFragment);
+    }
 
-    networkRequestDialogFragment.onClick(dialog, 2);
+    @Test
+    public void updateAccessPointList_onUserSelectionConnectSuccess_updateCorrectly() {
+        List<AccessPoint> accessPointList = spy(new ArrayList<>());
+        Bundle bundle = new Bundle();
+        bundle.putString(KEY_SSID, "Test AP 1");
+        accessPointList.add(new AccessPoint(mContext, bundle));
+        bundle.putString(KEY_SSID, "Test AP 2");
+        accessPointList.add(new AccessPoint(mContext, bundle));
+        bundle.putString(KEY_SSID, "Test AP 3");
+        accessPointList.add(new AccessPoint(mContext, bundle));
+        bundle.putString(KEY_SSID, "Test AP 4");
+        accessPointList.add(new AccessPoint(mContext, bundle));
 
-    verify(selectionCallback, times(1)).select(clickedAccessPoint.getConfig());
-  }
+        when(networkRequestDialogFragment.getAccessPointList()).thenReturn(accessPointList);
+        networkRequestDialogFragment.show(mActivity.getSupportFragmentManager(), null);
 
-  @Test
-  public void onMatch_shouldUpdatedList() {
-    // Prepares WifiManager.
-    when(networkRequestDialogFragment.getContext()).thenReturn(mContext);
-    Context applicationContext = spy(RuntimeEnvironment.application.getApplicationContext());
-    when(mContext.getApplicationContext()).thenReturn(applicationContext);
-    WifiManager wifiManager = mock(WifiManager.class);
-    when(applicationContext.getSystemService(Context.WIFI_SERVICE)).thenReturn(wifiManager);
+        // Test if config would update list.
+        WifiConfiguration config = new WifiConfiguration();
+        config.SSID = "Test AP 3";
+        networkRequestDialogFragment.onUserSelectionConnectSuccess(config);
 
-    List<WifiConfiguration> wifiConfigurationList = new ArrayList<>();
-    WifiConfiguration config = new WifiConfiguration();
-    final String SSID_AP1 = "Test AP 1";
-    config.SSID = SSID_AP1;
-    wifiConfigurationList.add(config);
-    config = new WifiConfiguration();
-    final String SSID_AP2 = "Test AP 2";
-    config.SSID = SSID_AP2;
-    wifiConfigurationList.add(config);
+        AccessPoint verifyAccessPoint = new AccessPoint(mContext, config);
+        verify(accessPointList, times(1)).set(2, verifyAccessPoint);
+    }
 
-    // Prepares callback converted data.
-    List<ScanResult> scanResults = new ArrayList<>();
-    when(wifiManager.getAllMatchingWifiConfigs(scanResults)).thenReturn(wifiConfigurationList);
+    @Test
+    public void updateAccessPointList_onUserSelectionConnectFailure_updateCorrectly() {
+        List<AccessPoint> accessPointList = spy(new ArrayList<>());
+        Bundle bundle = new Bundle();
+        bundle.putString(KEY_SSID, "Test AP 1");
+        accessPointList.add(new AccessPoint(mContext, bundle));
+        bundle.putString(KEY_SSID, "Test AP 2");
+        accessPointList.add(new AccessPoint(mContext, bundle));
+        bundle.putString(KEY_SSID, "Test AP 3");
+        accessPointList.add(new AccessPoint(mContext, bundle));
+        bundle.putString(KEY_SSID, "Test AP 4");
+        accessPointList.add(new AccessPoint(mContext, bundle));
 
-    networkRequestDialogFragment.onMatch(scanResults);
+        when(networkRequestDialogFragment.getAccessPointList()).thenReturn(accessPointList);
+        networkRequestDialogFragment.show(mActivity.getSupportFragmentManager(), null);
 
-    List<AccessPoint> accessPointList = networkRequestDialogFragment.getAccessPointList();
-    assertThat(accessPointList).isNotEmpty();
-    assertThat(accessPointList.size()).isEqualTo(2);
-    assertThat(accessPointList.get(0).getSsid()).isEqualTo(SSID_AP1);
-    assertThat(accessPointList.get(1).getSsid()).isEqualTo(SSID_AP2);
-  }
+        // Test if config would update list.
+        WifiConfiguration config = new WifiConfiguration();
+        config.SSID = "Test AP 3";
+        networkRequestDialogFragment.onUserSelectionConnectFailure(config);
+
+        AccessPoint verifyAccessPoint = new AccessPoint(mContext, config);
+        verify(accessPointList, times(1)).set(2, verifyAccessPoint);
+    }
+
+    @Test
+    public void onUserSelectionCallbackRegistration_shouldCallSelect() {
+        List<AccessPoint> accessPointList = spy(new ArrayList<>());
+        Bundle bundle = new Bundle();
+        bundle.putString(KEY_SSID, "Test AP 1");
+        accessPointList.add(new AccessPoint(mContext, bundle));
+        bundle.putString(KEY_SSID, "Test AP 2");
+        accessPointList.add(new AccessPoint(mContext, bundle));
+        bundle.putString(KEY_SSID, "Test AP 3");
+        AccessPoint clickedAccessPoint = new AccessPoint(mContext, bundle);
+        accessPointList.add(clickedAccessPoint);
+        bundle.putString(KEY_SSID, "Test AP 4");
+        accessPointList.add(new AccessPoint(mContext, bundle));
+        when(networkRequestDialogFragment.getAccessPointList()).thenReturn(accessPointList);
+
+        NetworkRequestUserSelectionCallback selectionCallback = mock(
+                NetworkRequestUserSelectionCallback.class);
+        AlertDialog dialog = mock(AlertDialog.class);
+        networkRequestDialogFragment.onUserSelectionCallbackRegistration(selectionCallback);
+
+        networkRequestDialogFragment.onClick(dialog, 2);
+
+        verify(selectionCallback, times(1)).select(clickedAccessPoint.getConfig());
+    }
+
+    @Test
+    public void onMatch_shouldUpdatedList() {
+        // Prepares WifiManager.
+        when(networkRequestDialogFragment.getContext()).thenReturn(mContext);
+        Context applicationContext = spy(RuntimeEnvironment.application.getApplicationContext());
+        when(mContext.getApplicationContext()).thenReturn(applicationContext);
+        WifiManager wifiManager = mock(WifiManager.class);
+        when(applicationContext.getSystemService(Context.WIFI_SERVICE)).thenReturn(wifiManager);
+
+        List<WifiConfiguration> wifiConfigurationList = new ArrayList<>();
+        WifiConfiguration config = new WifiConfiguration();
+        final String SSID_AP1 = "Test AP 1";
+        config.SSID = SSID_AP1;
+        wifiConfigurationList.add(config);
+        config = new WifiConfiguration();
+        final String SSID_AP2 = "Test AP 2";
+        config.SSID = SSID_AP2;
+        wifiConfigurationList.add(config);
+
+        // Prepares callback converted data.
+        List<ScanResult> scanResults = new ArrayList<>();
+        when(wifiManager.getAllMatchingWifiConfigs(scanResults)).thenReturn(wifiConfigurationList);
+
+        networkRequestDialogFragment.onMatch(scanResults);
+
+        List<AccessPoint> accessPointList = networkRequestDialogFragment.getAccessPointList();
+        assertThat(accessPointList).isNotEmpty();
+        assertThat(accessPointList.size()).isEqualTo(2);
+        assertThat(accessPointList.get(0).getSsid()).isEqualTo(SSID_AP1);
+        assertThat(accessPointList.get(1).getSsid()).isEqualTo(SSID_AP2);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/wifi/NetworkRequestErrorDialogFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/NetworkRequestErrorDialogFragmentTest.java
new file mode 100644
index 0000000..c6659a5
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/wifi/NetworkRequestErrorDialogFragmentTest.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2018 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;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.internal.verification.VerificationModeFactory.times;
+
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.widget.Button;
+
+import androidx.appcompat.app.AlertDialog;
+import androidx.fragment.app.FragmentActivity;
+
+import com.android.settings.R;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl;
+import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
+import com.android.settings.wifi.NetworkRequestErrorDialogFragment.ERROR_DIALOG_TYPE;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.Robolectric;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(shadows = {SettingsShadowResourcesImpl.class, ShadowAlertDialogCompat.class})
+public class NetworkRequestErrorDialogFragmentTest {
+
+    private FragmentActivity mActivity;
+    private NetworkRequestErrorDialogFragment mFragment;
+
+    @Before
+    public void setUp() {
+        mActivity = Robolectric.setupActivity(FragmentActivity.class);
+        mFragment = spy(NetworkRequestErrorDialogFragment.newInstance());
+        mFragment.show(mActivity.getSupportFragmentManager(), null);
+    }
+
+    @Test
+    public void display_shouldShowTimeoutDialog() {
+        AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+
+        assertThat(alertDialog).isNotNull();
+        assertThat(alertDialog.isShowing()).isTrue();
+
+        ShadowAlertDialogCompat shadowAlertDialog = ShadowAlertDialogCompat.shadowOf(alertDialog);
+        assertThat(RuntimeEnvironment.application
+                .getString(R.string.network_connection_timeout_dialog_message))
+                .isEqualTo(shadowAlertDialog.getMessage());
+    }
+
+    @Test
+    public void display_shouldShowAbortDialog() {
+        mFragment = spy(NetworkRequestErrorDialogFragment.newInstance());
+        Bundle bundle = new Bundle();
+        bundle.putSerializable(NetworkRequestErrorDialogFragment.DIALOG_TYPE,
+                ERROR_DIALOG_TYPE.ABORT);
+        mFragment.setArguments(bundle);
+        mFragment.show(mActivity.getSupportFragmentManager(), null);
+
+        AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+
+        assertThat(alertDialog).isNotNull();
+        assertThat(alertDialog.isShowing()).isTrue();
+
+        ShadowAlertDialogCompat shadowAlertDialog = ShadowAlertDialogCompat.shadowOf(alertDialog);
+        assertThat(RuntimeEnvironment.application
+                .getString(R.string.network_connection_errorstate_dialog_message))
+                .isEqualTo(shadowAlertDialog.getMessage());
+    }
+
+    @Test
+    public void clickPositiveButton_shouldCallStartScanningDialog() {
+        AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+        assertThat(alertDialog.isShowing()).isTrue();
+
+        Button positiveButton = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE);
+        assertThat(positiveButton).isNotNull();
+
+        positiveButton.performClick();
+        verify(mFragment, times(1)).startScanningDialog();
+    }
+
+    @Test
+    public void clickNegativeButton_shouldCloseTheDialog() {
+        AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+        assertThat(alertDialog.isShowing()).isTrue();
+
+        Button negativeButton = alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE);
+        assertThat(negativeButton).isNotNull();
+
+        negativeButton.performClick();
+        assertThat(alertDialog.isShowing()).isFalse();
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/wifi/NetworkRequestTimeoutDialogFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/NetworkRequestTimeoutDialogFragmentTest.java
deleted file mode 100644
index ed28e60..0000000
--- a/tests/robotests/src/com/android/settings/wifi/NetworkRequestTimeoutDialogFragmentTest.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (C) 2018 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;
-
-import static com.google.common.truth.Truth.assertThat;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.internal.verification.VerificationModeFactory.times;
-
-import android.content.DialogInterface;
-import android.widget.Button;
-import androidx.appcompat.app.AlertDialog;
-import androidx.fragment.app.FragmentActivity;
-import com.android.settings.R;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl;
-import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.Robolectric;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(shadows = {SettingsShadowResourcesImpl.class, ShadowAlertDialogCompat.class})
-public class NetworkRequestTimeoutDialogFragmentTest {
-
-  private FragmentActivity mActivity;
-  private NetworkRequestTimeoutDialogFragment mFragment;
-
-  @Before
-  public void setUp() {
-    mActivity = Robolectric.setupActivity(FragmentActivity.class);
-    mFragment = spy(NetworkRequestTimeoutDialogFragment.newInstance());
-    mFragment.show(mActivity.getSupportFragmentManager(), null);
-  }
-
-  @Test
-  public void display_shouldShowTheDialog() {
-    AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
-
-    assertThat(alertDialog).isNotNull();
-    assertThat(alertDialog.isShowing()).isTrue();
-
-    ShadowAlertDialogCompat shadowAlertDialog = ShadowAlertDialogCompat.shadowOf(alertDialog);
-    assertThat(RuntimeEnvironment.application
-        .getString(R.string.network_connection_timeout_dialog_message))
-        .isEqualTo(shadowAlertDialog.getMessage());
-  }
-
-  @Test
-  public void clickPositiveButton_shouldCallStartScanningDialog() {
-    AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
-    assertThat(alertDialog.isShowing()).isTrue();
-
-    Button positiveButton = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE);
-    assertThat(positiveButton).isNotNull();
-
-    positiveButton.performClick();
-    verify(mFragment, times(1)).startScanningDialog();
-  }
-
-  @Test
-  public void clickNegativeButton_shouldCloseTheDialog() {
-    AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
-    assertThat(alertDialog.isShowing()).isTrue();
-
-    Button negativeButton = alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE);
-    assertThat(negativeButton).isNotNull();
-
-    negativeButton.performClick();
-    assertThat(alertDialog.isShowing()).isFalse();
-  }
-}
