diff --git a/res/values/strings.xml b/res/values/strings.xml index 0116ed40663..bdc00818c3e 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -10252,7 +10252,9 @@ No devices found. Make sure the device is turned on and available to connect. - Scan again + Try again + + Something came up. The application has cancelled the request to choose a device. diff --git a/src/com/android/settings/wifi/NetworkRequestDialogFragment.java b/src/com/android/settings/wifi/NetworkRequestDialogFragment.java index a1d862064c2..efb3f8cd3a5 100644 --- a/src/com/android/settings/wifi/NetworkRequestDialogFragment.java +++ b/src/com/android/settings/wifi/NetworkRequestDialogFragment.java @@ -44,12 +44,18 @@ import android.widget.TextView; 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 @@ public class NetworkRequestDialogFragment extends InstrumentedDialogFragment imp @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 @@ public class NetworkRequestDialogFragment extends InstrumentedDialogFragment imp 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 @@ public class NetworkRequestDialogFragment extends InstrumentedDialogFragment imp } }; - 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 @@ public class NetworkRequestDialogFragment extends InstrumentedDialogFragment imp @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 00000000000..762b467b4c5 --- /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 08f285b0b8c..00000000000 --- 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 2e806ddfed0..8cf02b82964 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; 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 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 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 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 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 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 scanResults = new ArrayList<>(); - when(wifiManager.getAllMatchingWifiConfigs(scanResults)).thenReturn(wifiConfigurationList); + @Test + public void updateAccessPointList_onUserSelectionConnectFailure_updateCorrectly() { + List 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 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 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 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 scanResults = new ArrayList<>(); + when(wifiManager.getAllMatchingWifiConfigs(scanResults)).thenReturn(wifiConfigurationList); + + networkRequestDialogFragment.onMatch(scanResults); + + List 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 00000000000..c6659a5e3cf --- /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 ed28e60c0a1..00000000000 --- 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(); - } -}