diff --git a/src/com/android/settings/wifi/NetworkRequestDialogFragment.java b/src/com/android/settings/wifi/NetworkRequestDialogFragment.java index 5fe156c3dbf..56390471df5 100644 --- a/src/com/android/settings/wifi/NetworkRequestDialogFragment.java +++ b/src/com/android/settings/wifi/NetworkRequestDialogFragment.java @@ -16,7 +16,7 @@ package com.android.settings.wifi; -import static com.android.settings.wifi.WifiUtils.getWifiEntrySecurity; +import static com.android.wifitrackerlib.Utils.getSecurityTypesFromScanResult; import static java.util.stream.Collectors.toList; @@ -77,8 +77,12 @@ public class NetworkRequestDialogFragment extends NetworkRequestDialogBaseFragme private static final int MAX_NUMBER_LIST_ITEM = 5; private boolean mShowLimitedItem = true; + private static class MatchWifi { + String mSsid; + List mSecurityTypes; + } + private List mMatchWifis = new ArrayList<>(); @VisibleForTesting List mFilteredWifiEntries = new ArrayList<>(); - @VisibleForTesting List mMatchedScanResults = new ArrayList<>(); private WifiEntryAdapter mDialogAdapter; private NetworkRequestUserSelectionCallback mUserSelectionCallback; @@ -237,7 +241,7 @@ public class NetworkRequestDialogFragment extends NetworkRequestDialogBaseFragme /** Called when the state of Wifi has changed. */ @Override public void onWifiStateChanged() { - if (mMatchedScanResults.size() == 0) { + if (mMatchWifis.size() == 0) { return; } updateWifiEntries(); @@ -249,7 +253,7 @@ public class NetworkRequestDialogFragment extends NetworkRequestDialogBaseFragme */ @Override public void onWifiEntriesChanged() { - if (mMatchedScanResults.size() == 0) { + if (mMatchWifis.size() == 0) { return; } updateWifiEntries(); @@ -275,16 +279,24 @@ public class NetworkRequestDialogFragment extends NetworkRequestDialogBaseFragme wifiEntries.addAll(mWifiPickerTracker.getWifiEntries()); mFilteredWifiEntries.clear(); - mFilteredWifiEntries.addAll(wifiEntries.stream().filter(entry -> { - for (ScanResult matchedScanResult : mMatchedScanResults) { - if (TextUtils.equals(entry.getSsid(), matchedScanResult.SSID) - && entry.getSecurity() == getWifiEntrySecurity(matchedScanResult)) { + mFilteredWifiEntries.addAll(wifiEntries.stream() + .filter(entry -> isMatchedWifiEntry(entry)) + .limit(mShowLimitedItem ? MAX_NUMBER_LIST_ITEM : Long.MAX_VALUE) + .collect(toList())); + } + + private boolean isMatchedWifiEntry(WifiEntry entry) { + for (MatchWifi wifi : mMatchWifis) { + if (!TextUtils.equals(entry.getSsid(), wifi.mSsid)) { + continue; + } + for (Integer security : wifi.mSecurityTypes) { + if (entry.getSecurityTypes().contains(security)) { return true; } } - return false; - }).limit(mShowLimitedItem ? MAX_NUMBER_LIST_ITEM : Long.MAX_VALUE) - .collect(toList())); + } + return false; } private class WifiEntryAdapter extends ArrayAdapter { @@ -350,7 +362,14 @@ public class NetworkRequestDialogFragment extends NetworkRequestDialogBaseFragme @Override public void onMatch(List scanResults) { - mMatchedScanResults = scanResults; + mMatchWifis.clear(); + for (ScanResult scanResult : scanResults) { + MatchWifi matchWifi = new MatchWifi(); + matchWifi.mSsid = scanResult.SSID; + matchWifi.mSecurityTypes = getSecurityTypesFromScanResult(scanResult); + mMatchWifis.add(matchWifi); + } + updateWifiEntries(); updateUi(); } diff --git a/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java index e08a14a469d..e4d39828c7f 100644 --- a/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java +++ b/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java @@ -16,6 +16,9 @@ package com.android.settings.wifi; +import static com.android.wifitrackerlib.WifiEntry.SECURITY_PSK; +import static com.android.wifitrackerlib.WifiEntry.SECURITY_SAE; + import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; @@ -46,16 +49,20 @@ import com.android.wifitrackerlib.WifiEntry; import com.android.wifitrackerlib.WifiPickerTracker; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InOrder; -import org.mockito.MockitoAnnotations; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; @RunWith(RobolectricTestRunner.class) @@ -63,15 +70,34 @@ import java.util.List; public class NetworkRequestDialogFragmentTest { private static final String KEY_SSID = "key_ssid"; - private static final String KEY_SECURITY = "key_security"; + private static final String TEST_CAPABILITIES_OPEN = "[ESS]"; + private static final String TEST_CAPABILITIES_WPA2_PSK = "[WPA2-PSK-CCMP][ESS]"; + private static final String TEST_CAPABILITIES_WPA3_SAE = "[RSN-PSK+SAE-CCMP][ESS]"; private static final String TEST_APP_NAME = "TestAppName"; + @Rule + public final MockitoRule mMockitoRule = MockitoJUnit.rule(); + @Mock + WifiPickerTracker mWifiPickerTracker; + @Mock + WifiEntry mWifiEntry; + private FragmentActivity mActivity; private NetworkRequestDialogFragment networkRequestDialogFragment; + ScanResult mScanResult = new ScanResult(); + @Before public void setUp() { - MockitoAnnotations.initMocks(this); + when(mWifiEntry.getSsid()).thenReturn(KEY_SSID); + when(mWifiEntry.getSecurityTypes()).thenReturn(Arrays.asList(SECURITY_PSK, SECURITY_SAE)); + when(mWifiEntry.getSecurity()).thenReturn(SECURITY_PSK); + when(mWifiPickerTracker.getConnectedWifiEntry()).thenReturn(null); + when(mWifiPickerTracker.getWifiEntries()).thenReturn(Arrays.asList(mWifiEntry)); + + mScanResult.SSID = KEY_SSID; + mScanResult.capabilities = TEST_CAPABILITIES_OPEN; + FakeFeatureFactory fakeFeatureFactory = FakeFeatureFactory.setupForTest(); when(fakeFeatureFactory.wifiTrackerLibProvider.createWifiPickerTracker( any(), any(), any(), any(), any(), anyLong(), anyLong(), any())) @@ -81,7 +107,7 @@ public class NetworkRequestDialogFragmentTest { new Intent().putExtra(NetworkRequestDialogFragment.EXTRA_APP_NAME, TEST_APP_NAME)).setup().get(); networkRequestDialogFragment = spy(NetworkRequestDialogFragment.newInstance()); - networkRequestDialogFragment.mWifiPickerTracker = mock(WifiPickerTracker.class); + networkRequestDialogFragment.mWifiPickerTracker = mWifiPickerTracker; } @Test @@ -147,12 +173,10 @@ public class NetworkRequestDialogFragmentTest { @Test public void onWifiStateChanged_nonEmptyMatchedScanResults_shouldUpdateWifiEntries() { final InOrder inOrder = inOrder(networkRequestDialogFragment); + mScanResult.capabilities = TEST_CAPABILITIES_OPEN; + networkRequestDialogFragment.onMatch(Arrays.asList(mScanResult)); - final List scanResults = new ArrayList<>(); - networkRequestDialogFragment.mMatchedScanResults = scanResults; - ScanResult scanResult = mock(ScanResult.class); - networkRequestDialogFragment.mMatchedScanResults.add(scanResult); - networkRequestDialogFragment.onMatch(scanResults); + networkRequestDialogFragment.onWifiStateChanged(); inOrder.verify(networkRequestDialogFragment).updateWifiEntries(); inOrder.verify(networkRequestDialogFragment).updateUi(); @@ -161,12 +185,10 @@ public class NetworkRequestDialogFragmentTest { @Test public void onWifiEntriesChanged_nonEmptyMatchedScanResults_shouldUpdateWifiEntries() { final InOrder inOrder = inOrder(networkRequestDialogFragment); + mScanResult.capabilities = TEST_CAPABILITIES_OPEN; + networkRequestDialogFragment.onMatch(Arrays.asList(mScanResult)); - final List scanResults = new ArrayList<>(); - networkRequestDialogFragment.mMatchedScanResults = scanResults; - ScanResult scanResult = mock(ScanResult.class); - networkRequestDialogFragment.mMatchedScanResults.add(scanResult); - networkRequestDialogFragment.onMatch(scanResults); + networkRequestDialogFragment.onWifiEntriesChanged(); inOrder.verify(networkRequestDialogFragment).updateWifiEntries(); inOrder.verify(networkRequestDialogFragment).updateUi(); @@ -280,4 +302,34 @@ public class NetworkRequestDialogFragmentTest { // Check verify(selectionCallback, times(1)).reject(); } + + @Test + public void updateWifiEntries_noMatchSecurityWifi_filteredWifiIsEmpty() { + mScanResult.capabilities = TEST_CAPABILITIES_OPEN; + networkRequestDialogFragment.onMatch(Arrays.asList(mScanResult)); + + networkRequestDialogFragment.updateWifiEntries(); + + assertThat(networkRequestDialogFragment.mFilteredWifiEntries.size()).isEqualTo(0); + } + + @Test + public void updateWifiEntries_matchWpa2Wifi_filteredWifiNotEmpty() { + mScanResult.capabilities = TEST_CAPABILITIES_WPA2_PSK; + networkRequestDialogFragment.onMatch(Arrays.asList(mScanResult)); + + networkRequestDialogFragment.updateWifiEntries(); + + assertThat(networkRequestDialogFragment.mFilteredWifiEntries.size()).isNotEqualTo(0); + } + + @Test + public void updateWifiEntries_matchWpa3Wifi_filteredWifiNotEmpty() { + mScanResult.capabilities = TEST_CAPABILITIES_WPA3_SAE; + networkRequestDialogFragment.onMatch(Arrays.asList(mScanResult)); + + networkRequestDialogFragment.updateWifiEntries(); + + assertThat(networkRequestDialogFragment.mFilteredWifiEntries.size()).isNotEqualTo(0); + } }