From 3bb3808043b0f1b7b581c02c1e509ded5f9b8103 Mon Sep 17 00:00:00 2001 From: Arc Wang Date: Tue, 31 Mar 2020 17:01:22 +0800 Subject: [PATCH 1/2] [Wi-Fi] Fix Wi-Fi picker context menu 'Connect' button 1. Display the Wi-Fi dialog with MODE_CONNECT. 2. Connect with the WifiConfiguration from WifiConfigController2#getConfig() if it's available. Bug: 152826354 Test: make RunSettingsRoboTests ROBOTEST_FILTER=WifiSettings2 Change-Id: Ifbe2ac30b1c37c8eab3227ac0561fdd2de5cb706 --- .../android/settings/wifi/WifiDialog2.java | 4 ++ .../android/settings/wifi/WifiSettings2.java | 27 ++++++--- .../settings/wifi/WifiSettings2Test.java | 58 +++++++++++++++++++ 3 files changed, 82 insertions(+), 7 deletions(-) diff --git a/src/com/android/settings/wifi/WifiDialog2.java b/src/com/android/settings/wifi/WifiDialog2.java index acd6f17d36b..dc546f3c231 100644 --- a/src/com/android/settings/wifi/WifiDialog2.java +++ b/src/com/android/settings/wifi/WifiDialog2.java @@ -214,4 +214,8 @@ public class WifiDialog2 extends AlertDialog implements WifiConfigUiBase2, public void setCancelButton(CharSequence text) { setButton(BUTTON_NEGATIVE, text, this); } + + public WifiEntry getWifiEntry() { + return mWifiEntry; + } } diff --git a/src/com/android/settings/wifi/WifiSettings2.java b/src/com/android/settings/wifi/WifiSettings2.java index 13ccdc3695b..51bdcede318 100644 --- a/src/com/android/settings/wifi/WifiSettings2.java +++ b/src/com/android/settings/wifi/WifiSettings2.java @@ -954,18 +954,30 @@ public class WifiSettings2 extends RestrictedSettingsFragment @Override public void onForget(WifiDialog2 dialog) { - forget(mDialogWifiEntry); + forget(dialog.getWifiEntry()); } @Override public void onSubmit(WifiDialog2 dialog) { - final int dialogMode = mDialog.getController().getMode(); + final int dialogMode = dialog.getMode(); + final WifiConfiguration config = dialog.getController().getConfig(); + final WifiEntry wifiEntry = dialog.getWifiEntry(); if (dialogMode == WifiConfigUiBase2.MODE_MODIFY) { - mWifiManager.save(mDialogWifiEntry.getWifiConfiguration(), mSaveListener); + if (config == null) { + Toast.makeText(getContext(), R.string.wifi_failed_save_message, + Toast.LENGTH_SHORT).show(); + } else { + mWifiManager.save(config, mSaveListener); + } } else if (dialogMode == WifiConfigUiBase2.MODE_CONNECT - || (dialogMode == WifiConfigUiBase2.MODE_VIEW && mDialogWifiEntry.canConnect())) { - connect(mDialogWifiEntry, false /* editIfNoConfig */, false /* fullScreenEdit*/); + || (dialogMode == WifiConfigUiBase2.MODE_VIEW && wifiEntry.canConnect())) { + if (config == null) { + connect(wifiEntry, false /* editIfNoConfig */, + false /* fullScreenEdit*/); + } else { + mWifiManager.connect(config, new WifiConnectActionListener()); + } } } @@ -981,7 +993,8 @@ public class WifiSettings2 extends RestrictedSettingsFragment wifiEntry.forget(null /* callback */); } - private void connect(WifiEntry wifiEntry, boolean editIfNoConfig, boolean fullScreenEdit) { + @VisibleForTesting + void connect(WifiEntry wifiEntry, boolean editIfNoConfig, boolean fullScreenEdit) { mMetricsFeatureProvider.action(getActivity(), SettingsEnums.ACTION_WIFI_CONNECT, wifiEntry.isSaved()); @@ -1034,7 +1047,7 @@ public class WifiSettings2 extends RestrictedSettingsFragment if (mFullScreenEdit) { launchConfigNewNetworkFragment(mConnectWifiEntry); } else { - showDialog(mConnectWifiEntry, WifiConfigUiBase2.MODE_MODIFY); + showDialog(mConnectWifiEntry, WifiConfigUiBase2.MODE_CONNECT); } } } else if (status == CONNECT_STATUS_FAILURE_UNKNOWN) { diff --git a/tests/robotests/src/com/android/settings/wifi/WifiSettings2Test.java b/tests/robotests/src/com/android/settings/wifi/WifiSettings2Test.java index bd6b20f71d0..b259cc39b4f 100644 --- a/tests/robotests/src/com/android/settings/wifi/WifiSettings2Test.java +++ b/tests/robotests/src/com/android/settings/wifi/WifiSettings2Test.java @@ -15,6 +15,9 @@ */ package com.android.settings.wifi; +import static com.android.settings.wifi.WifiConfigUiBase2.MODE_CONNECT; +import static com.android.settings.wifi.WifiConfigUiBase2.MODE_MODIFY; + import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; @@ -34,6 +37,7 @@ import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.res.Resources; +import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiManager; import android.os.Bundle; import android.os.PowerManager; @@ -64,6 +68,7 @@ import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; +import org.robolectric.shadows.ShadowToast; @RunWith(RobolectricTestRunner.class) public class WifiSettings2Test { @@ -303,4 +308,57 @@ public class WifiSettings2Test { mWifiSettings2.onNumSavedSubscriptionsChanged(); } + + @Test + public void onSubmit_modeModifyNoConfig_toastErrorMessage() { + WifiDialog2 dialog = createWifiDialog2(MODE_MODIFY, null /* config */); + + mWifiSettings2.onSubmit(dialog); + + assertThat(ShadowToast.getTextOfLatestToast()).isEqualTo( + mContext.getString(R.string.wifi_failed_save_message)); + } + + @Test + public void onSubmit_modeModifyHasConfig_saveWifiManager() { + final WifiConfiguration config = mock(WifiConfiguration.class); + WifiDialog2 dialog = createWifiDialog2(MODE_MODIFY, config); + + mWifiSettings2.onSubmit(dialog); + + verify(mWifiManager).save(eq(config), any()); + } + + @Test + public void onSubmit_modeConnectNoConfig_connectWifiEntry() { + WifiDialog2 dialog = createWifiDialog2(MODE_CONNECT, null /* config */); + final WifiEntry wifiEntry = dialog.getWifiEntry(); + + mWifiSettings2.onAttach(mContext); + mWifiSettings2.onSubmit(dialog); + + verify(mWifiSettings2).connect(wifiEntry, false /* editIfNoConfig */, + false /* fullScreenEdit*/); + } + + @Test + public void onSubmit_modeConnectHasConfig_connectWifiManager() { + final WifiConfiguration config = mock(WifiConfiguration.class); + WifiDialog2 dialog = createWifiDialog2(MODE_CONNECT, config); + + mWifiSettings2.onSubmit(dialog); + + verify(mWifiManager).connect(eq(config), any(WifiManager.ActionListener.class)); + } + + private WifiDialog2 createWifiDialog2(int mode, WifiConfiguration config) { + final WifiEntry wifiEntry = mock(WifiEntry.class); + when(wifiEntry.canConnect()).thenReturn(true); + final WifiConfigController2 controller = mock(WifiConfigController2.class); + when(controller.getConfig()).thenReturn(config); + final WifiDialog2 wifiDialog2 = spy(WifiDialog2.createModal(mContext, null /* listener */, + wifiEntry, mode)); + when(wifiDialog2.getController()).thenReturn(controller); + return wifiDialog2; + } } From a76669656f5adc598f56887261d7bc22095b45b4 Mon Sep 17 00:00:00 2001 From: Arc Wang Date: Tue, 31 Mar 2020 11:49:07 +0800 Subject: [PATCH 2/2] [Wi-Fi] Wi-Fi picker scrolls to top after a user clicked to connect After a connect success callback, Wi-Fi picker scrolls to the connected Wi-Fi network after it's added in. Bug: 152576795 Test: make RunSettingsRoboTests ROBOTEST_FILTER=WifiSettings2 manual Click a Wi-Fi network or it's context menu 'Connect' button to connect and see if UI scroll to the top. Change-Id: Ia96af86c9ed552324089f97db104975e28f6c1c7 --- src/com/android/settings/wifi/WifiSettings2.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/wifi/WifiSettings2.java b/src/com/android/settings/wifi/WifiSettings2.java index 51bdcede318..f73891dfb53 100644 --- a/src/com/android/settings/wifi/WifiSettings2.java +++ b/src/com/android/settings/wifi/WifiSettings2.java @@ -647,6 +647,7 @@ public class WifiSettings2 extends RestrictedSettingsFragment setOffMessage(); setAdditionalSettingsSummaries(); setProgressBarVisible(false); + mClickedConnect = false; break; } } @@ -739,6 +740,11 @@ public class WifiSettings2 extends RestrictedSettingsFragment pref.setOnGearClickListener(preference -> { launchNetworkDetailsFragment(pref); }); + + if (mClickedConnect) { + mClickedConnect = false; + scrollToPreference(mConnectedWifiEntryPreferenceCategory); + } } } else { mConnectedWifiEntryPreferenceCategory.removeAll(); @@ -1007,7 +1013,7 @@ public class WifiSettings2 extends RestrictedSettingsFragment private class WifiConnectActionListener implements WifiManager.ActionListener { @Override public void onSuccess() { - // Do nothing. + mClickedConnect = true; } @Override @@ -1041,7 +1047,9 @@ public class WifiSettings2 extends RestrictedSettingsFragment return; } - if (status == ConnectCallback.CONNECT_STATUS_FAILURE_NO_CONFIG) { + if (status == ConnectCallback.CONNECT_STATUS_SUCCESS) { + mClickedConnect = true; + } else if (status == ConnectCallback.CONNECT_STATUS_FAILURE_NO_CONFIG) { if (mEditIfNoConfig) { // Edit an unsaved secure Wi-Fi network. if (mFullScreenEdit) {