diff --git a/src/com/android/settings/wifi/NetworkRequestDialogFragment.java b/src/com/android/settings/wifi/NetworkRequestDialogFragment.java
index eb7d78f..4762403 100644
--- a/src/com/android/settings/wifi/NetworkRequestDialogFragment.java
+++ b/src/com/android/settings/wifi/NetworkRequestDialogFragment.java
@@ -340,6 +340,7 @@
         // Throws error dialog.
         final NetworkRequestErrorDialogFragment fragment = NetworkRequestErrorDialogFragment
                 .newInstance();
+        fragment.setRejectCallback(mUserSelectionCallback);
         final Bundle bundle = new Bundle();
         bundle.putSerializable(NetworkRequestErrorDialogFragment.DIALOG_TYPE, type);
         fragment.setArguments(bundle);
diff --git a/src/com/android/settings/wifi/NetworkRequestErrorDialogFragment.java b/src/com/android/settings/wifi/NetworkRequestErrorDialogFragment.java
index 261d313..9819474 100644
--- a/src/com/android/settings/wifi/NetworkRequestErrorDialogFragment.java
+++ b/src/com/android/settings/wifi/NetworkRequestErrorDialogFragment.java
@@ -20,8 +20,10 @@
 import android.app.settings.SettingsEnums;
 import android.content.DialogInterface;
 import android.os.Bundle;
+import android.net.wifi.WifiManager.NetworkRequestUserSelectionCallback;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.appcompat.app.AlertDialog;
 
 import com.android.settings.R;
@@ -36,6 +38,8 @@
     public static final String DIALOG_TYPE = "DIALOG_ERROR_TYPE";
 
     public enum ERROR_DIALOG_TYPE {TIME_OUT, ABORT}
+    @Nullable
+    private NetworkRequestUserSelectionCallback mRejectCallback;
 
     public static NetworkRequestErrorDialogFragment newInstance() {
         return new NetworkRequestErrorDialogFragment();
@@ -49,7 +53,7 @@
     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();
+        rejectNetworkRequestAndFinish();
     }
 
     @Override
@@ -65,10 +69,12 @@
             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());
+                    .setNegativeButton(R.string.cancel,
+                            (dialog, which) -> rejectNetworkRequestAndFinish());
         } else {
             builder.setMessage(R.string.network_connection_errorstate_dialog_message)
-                    .setPositiveButton(R.string.okay, (dialog, which) -> getActivity().finish());
+                    .setPositiveButton(R.string.okay,
+                            (dialog, which) -> rejectNetworkRequestAndFinish());
         }
         return builder.create();
     }
@@ -78,9 +84,23 @@
         return SettingsEnums.WIFI_SCANNING_NEEDED_DIALOG;
     }
 
+    // Sets the callback for fragment to reject this request.
+    public void setRejectCallback(NetworkRequestUserSelectionCallback rejectCallback) {
+        mRejectCallback = rejectCallback;
+    }
+
     protected void startScanningDialog() {
         final NetworkRequestDialogFragment fragment = NetworkRequestDialogFragment.newInstance();
         fragment.show(getActivity().getSupportFragmentManager(),
                 NetworkRequestErrorDialogFragment.class.getSimpleName());
     }
+
+    private void rejectNetworkRequestAndFinish() {
+        if (getActivity() != null) {
+            if (mRejectCallback != null) {
+                mRejectCallback.reject();
+            }
+            getActivity().finish();
+        }
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/wifi/NetworkRequestErrorDialogFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/NetworkRequestErrorDialogFragmentTest.java
index 303f6af..c7b1a89 100644
--- a/tests/robotests/src/com/android/settings/wifi/NetworkRequestErrorDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/NetworkRequestErrorDialogFragmentTest.java
@@ -18,11 +18,13 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.Mockito.mock;
 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.net.wifi.WifiManager.NetworkRequestUserSelectionCallback;
 import android.os.Bundle;
 import android.widget.Button;
 
@@ -32,6 +34,8 @@
 import com.android.settings.R;
 import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
 import com.android.settings.wifi.NetworkRequestErrorDialogFragment.ERROR_DIALOG_TYPE;
+import com.android.settingslib.wifi.WifiTracker;
+import com.android.settingslib.wifi.WifiTrackerFactory;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -47,12 +51,17 @@
 
     private FragmentActivity mActivity;
     private NetworkRequestErrorDialogFragment mFragment;
+    private WifiTracker mWifiTracker;
 
     @Before
     public void setUp() {
         mActivity = Robolectric.setupActivity(FragmentActivity.class);
         mFragment = spy(NetworkRequestErrorDialogFragment.newInstance());
         mFragment.show(mActivity.getSupportFragmentManager(), null);
+
+        // Prevents NPE when calling up NetworkRequestDialogFragment.
+        mWifiTracker = mock(WifiTracker.class);
+        WifiTrackerFactory.setTestingWifiTracker(mWifiTracker);
     }
 
     @Test
@@ -111,4 +120,17 @@
         negativeButton.performClick();
         assertThat(alertDialog.isShowing()).isFalse();
     }
+
+    @Test
+    public void clickNegativeButton_shouldCallReject() {
+        final NetworkRequestUserSelectionCallback rejectCallback =
+                mock(NetworkRequestUserSelectionCallback.class);
+        mFragment.setRejectCallback(rejectCallback);
+
+        final AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+        final Button negativeButton = alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE);
+        negativeButton.performClick();
+
+        verify(rejectCallback, times(1)).reject();
+    }
 }
