Implement persisting time for onUserSelectionConnectSuccess.

When onUserSelectionConnectSuccess callbacks, holding a second for user
to be aware of success connection. Then, go to destory network request dialog.

Bug: 117399926
Test: make RunSettingsRoboTests -j32 ROBOTEST_FILTER=com.android.settings.wifi.NetworkRequestDialogFragmentTest
Change-Id: I12d8fb2e8955cf24ddad43d1fe8b863682b6ae32
diff --git a/src/com/android/settings/wifi/NetworkRequestDialogFragment.java b/src/com/android/settings/wifi/NetworkRequestDialogFragment.java
index 7a1bdb4..06e36e5 100644
--- a/src/com/android/settings/wifi/NetworkRequestDialogFragment.java
+++ b/src/com/android/settings/wifi/NetworkRequestDialogFragment.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.wifi;
 
-import android.app.Activity;
 import android.app.Dialog;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -67,9 +66,15 @@
     /** Message sent to us to stop scanning wifi and pop up timeout dialog. */
     private static final int MESSAGE_STOP_SCAN_WIFI_LIST = 0;
 
+    /** Message sent to us to finish activity. */
+    private static final int MESSAGE_FINISH_ACTIVITY = 1;
+
     /** Spec defines there should be 5 wifi ap on the list at most. */
     private static final int MAX_NUMBER_LIST_ITEM = 5;
 
+    /** Holding time to let user be aware that selected wifi ap is connected */
+    private static final int DELAY_TIME_USER_AWARE_CONNECTED_MS = 1 * 1000;
+
     /** Delayed time to stop scanning wifi. */
     private static final int DELAY_TIME_STOP_SCAN_MS = 30 * 1000;
 
@@ -155,7 +160,9 @@
     public void onCancel(@NonNull DialogInterface dialog) {
         super.onCancel(dialog);
         // Finishes the activity when user clicks back key or outside of the dialog.
-        getActivity().finish();
+        if (getActivity() != null) {
+            getActivity().finish();
+        }
     }
 
     @Override
@@ -177,6 +184,8 @@
     @Override
     public void onDestroy() {
         super.onDestroy();
+
+        mHandler.removeMessages(MESSAGE_FINISH_ACTIVITY);
         if (mFilterWifiTracker != null) {
             mFilterWifiTracker.onDestroy();
             mFilterWifiTracker = null;
@@ -207,7 +216,10 @@
             switch (msg.what) {
                 case MESSAGE_STOP_SCAN_WIFI_LIST:
                     removeMessages(MESSAGE_STOP_SCAN_WIFI_LIST);
-                    stopScanningAndPopErrorDialog(ERROR_DIALOG_TYPE.TIME_OUT);
+                    stopScanningAndMaybePopErrorDialog(ERROR_DIALOG_TYPE.TIME_OUT);
+                    break;
+                case MESSAGE_FINISH_ACTIVITY:
+                    stopScanningAndMaybePopErrorDialog(/* ERROR_DIALOG_TYPE */ null);
                     break;
                 default:
                     // Do nothing.
@@ -216,18 +228,29 @@
         }
     };
 
-    protected void stopScanningAndPopErrorDialog(ERROR_DIALOG_TYPE type) {
+    protected void stopScanningAndMaybePopErrorDialog(ERROR_DIALOG_TYPE type) {
         // Dismisses current dialog.
-        dismiss();
+        final Dialog dialog =  getDialog();
+        if (dialog != null && dialog.isShowing()) {
+            dismiss();
+        }
 
-        // Throws new timeout dialog.
-        final NetworkRequestErrorDialogFragment fragment = NetworkRequestErrorDialogFragment
-                .newInstance();
-        final Bundle bundle = new Bundle();
-        bundle.putSerializable(NetworkRequestErrorDialogFragment.DIALOG_TYPE, type);
-        fragment.setArguments(bundle);
-        fragment.show(getActivity().getSupportFragmentManager(),
-                NetworkRequestDialogFragment.class.getSimpleName());
+        if (type  == null) {
+            // If no error, finishes activity.
+            if (getActivity() != null) {
+                getActivity().finish();
+            }
+        } else {
+            // Throws error dialog.
+            final NetworkRequestErrorDialogFragment fragment = NetworkRequestErrorDialogFragment
+                    .newInstance();
+            final Bundle bundle = new Bundle();
+            bundle.putSerializable(NetworkRequestErrorDialogFragment.DIALOG_TYPE, type);
+            fragment.setArguments(bundle);
+            fragment.show(getActivity().getSupportFragmentManager(),
+                    NetworkRequestDialogFragment.class.getSimpleName());
+        }
+
     }
 
     @Override
@@ -284,7 +307,7 @@
 
     @Override
     public void onAbort() {
-        stopScanningAndPopErrorDialog(ERROR_DIALOG_TYPE.ABORT);
+        stopScanningAndMaybePopErrorDialog(ERROR_DIALOG_TYPE.ABORT);
     }
 
     @Override
@@ -295,10 +318,13 @@
 
     @Override
     public void onMatch(List<ScanResult> scanResults) {
-        mHandler.removeMessages(MESSAGE_STOP_SCAN_WIFI_LIST);
-        renewAccessPointList(scanResults);
+        // Shouldn't need to renew cached list, since input result is empty.
+        if (scanResults != null && scanResults.size() > 0) {
+            mHandler.removeMessages(MESSAGE_STOP_SCAN_WIFI_LIST);
+            renewAccessPointList(scanResults);
 
-        notifyAdapterRefresh();
+            notifyAdapterRefresh();
+        }
     }
 
     // Updates internal AccessPoint list from WifiTracker. scanResults are used to update key list
@@ -329,17 +355,24 @@
 
     @Override
     public void onUserSelectionConnectSuccess(WifiConfiguration wificonfiguration) {
-        // Dismisses current dialog and finishes Activity, since connection is success.
-        dismiss();
-        final Activity activity = getActivity();
-        if (activity != null) {
-            activity.finish();
+        // Removes the progress icon.
+        final Dialog dialog = getDialog();
+        if (dialog != null) {
+            final View view = dialog.findViewById(R.id.network_request_title_progress);
+            if (view != null) {
+                view.setVisibility(View.GONE);
+            }
         }
+
+        // Posts delay to finish self since connection is success.
+        mHandler.removeMessages(MESSAGE_STOP_SCAN_WIFI_LIST);
+        mHandler.sendEmptyMessageDelayed(MESSAGE_FINISH_ACTIVITY,
+                DELAY_TIME_USER_AWARE_CONNECTED_MS);
     }
 
     @Override
     public void onUserSelectionConnectFailure(WifiConfiguration wificonfiguration) {
-        stopScanningAndPopErrorDialog(ERROR_DIALOG_TYPE.ABORT);
+        stopScanningAndMaybePopErrorDialog(ERROR_DIALOG_TYPE.ABORT);
     }
 
     private final class FilterWifiTracker {
diff --git a/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java
index e64fae7..17516e9 100644
--- a/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java
@@ -111,14 +111,17 @@
         ShadowLooper.getShadowMainLooper().runToEndOfTasks();
 
         assertThat(fakeFragment.bCalledStopAndPop).isTrue();
+        assertThat(fakeFragment.errorType).isEqualTo(ERROR_DIALOG_TYPE.TIME_OUT);
     }
 
     class FakeNetworkRequestDialogFragment extends NetworkRequestDialogFragment {
         boolean bCalledStopAndPop = false;
+        ERROR_DIALOG_TYPE errorType = null;
 
         @Override
-        public void stopScanningAndPopErrorDialog(ERROR_DIALOG_TYPE type) {
+        public void stopScanningAndMaybePopErrorDialog(ERROR_DIALOG_TYPE type) {
             bCalledStopAndPop = true;
+            errorType = type;
         }
     }
 
@@ -150,22 +153,28 @@
 
     @Test
     public void updateAccessPointList_onUserSelectionConnectSuccess_shouldCloseTheDialog() {
-        List<AccessPoint> accessPointList = createAccessPointList();
-        when(networkRequestDialogFragment.getAccessPointList()).thenReturn(accessPointList);
-        networkRequestDialogFragment.show(mActivity.getSupportFragmentManager(), null);
-        AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
-        assertThat(alertDialog.isShowing()).isTrue();
+        // Assert
+        FakeNetworkRequestDialogFragment fakeFragment = new FakeNetworkRequestDialogFragment();
+        FakeNetworkRequestDialogFragment spyFakeFragment = spy(fakeFragment);
 
-        // Test if config would update list.
+        List<AccessPoint> accessPointList = createAccessPointList();
+        when(spyFakeFragment.getAccessPointList()).thenReturn(accessPointList);
+
+        spyFakeFragment.show(mActivity.getSupportFragmentManager(), null);
+
+        // Action
         WifiConfiguration config = new WifiConfiguration();
         config.SSID = "Test AP 3";
-        networkRequestDialogFragment.onUserSelectionConnectSuccess(config);
+        spyFakeFragment.onUserSelectionConnectSuccess(config);
 
-        assertThat(alertDialog.isShowing()).isFalse();
+        // Check
+        ShadowLooper.getShadowMainLooper().runToEndOfTasks();
+        assertThat(fakeFragment.bCalledStopAndPop).isTrue();
+        assertThat(fakeFragment.errorType).isNull();
     }
 
     @Test
-    public void updateAccessPointList_onUserSelectionConnectFailure_shouldCallTimeoutDialog() {
+    public void updateAccessPointList_onUserSelectionConnectFailure_shouldCallAbortDialog() {
         FakeNetworkRequestDialogFragment fakeFragment = new FakeNetworkRequestDialogFragment();
         FakeNetworkRequestDialogFragment spyFakeFragment = spy(fakeFragment);
         List<AccessPoint> accessPointList = createAccessPointList();
@@ -181,6 +190,7 @@
         fakeFragment.onUserSelectionConnectFailure(config);
 
         assertThat(fakeFragment.bCalledStopAndPop).isTrue();
+        assertThat(fakeFragment.errorType).isEqualTo(ERROR_DIALOG_TYPE.ABORT);
     }
 
     @Test