Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c4d05973 authored by Weng Su's avatar Weng Su
Browse files

Check multiple security types for Wi-Fi NetworkRequest

- The WifiEntry already support multiple security types simultaneously from framework

- For backward compatibility, WifiEntry supports both getSecurity and getSecurityTypes methods

- However, the getSecurity method can only return one type of security, causing NetworkRequest to fail to match another type of security
  - WifiEntry:      getSecurity:WPA2   // getSecurityTypes:{WPA2, WPA3}
  - ReqeustNetwork: getSecurity:WPA3

- Need to use getSecurityTypes to check for matching WifiEntry

Bug: 205943818
Bug: 249713442
Test: manual test
make RunSettingsRoboTests ROBOTEST_FILTER=NetworkRequestDialogFragmentTest

Merged-In: I8848ccd1cb0589284a48ddaa77591f5bf3b41932
Change-Id: I8848ccd1cb0589284a48ddaa77591f5bf3b41932
(cherry picked from commit a88c0648)
parent 47fa8933
Loading
Loading
Loading
Loading
+31 −12
Original line number Original line Diff line number Diff line
@@ -16,7 +16,7 @@


package com.android.settings.wifi;
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;
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 static final int MAX_NUMBER_LIST_ITEM = 5;
    private boolean mShowLimitedItem = true;
    private boolean mShowLimitedItem = true;


    private static class MatchWifi {
        String mSsid;
        List<Integer> mSecurityTypes;
    }
    private List<MatchWifi> mMatchWifis = new ArrayList<>();
    @VisibleForTesting List<WifiEntry> mFilteredWifiEntries = new ArrayList<>();
    @VisibleForTesting List<WifiEntry> mFilteredWifiEntries = new ArrayList<>();
    @VisibleForTesting List<ScanResult> mMatchedScanResults = new ArrayList<>();
    private WifiEntryAdapter mDialogAdapter;
    private WifiEntryAdapter mDialogAdapter;
    private NetworkRequestUserSelectionCallback mUserSelectionCallback;
    private NetworkRequestUserSelectionCallback mUserSelectionCallback;


@@ -237,7 +241,7 @@ public class NetworkRequestDialogFragment extends NetworkRequestDialogBaseFragme
    /** Called when the state of Wifi has changed. */
    /** Called when the state of Wifi has changed. */
    @Override
    @Override
    public void onWifiStateChanged() {
    public void onWifiStateChanged() {
        if (mMatchedScanResults.size() == 0) {
        if (mMatchWifis.size() == 0) {
            return;
            return;
        }
        }
        updateWifiEntries();
        updateWifiEntries();
@@ -249,7 +253,7 @@ public class NetworkRequestDialogFragment extends NetworkRequestDialogBaseFragme
     */
     */
    @Override
    @Override
    public void onWifiEntriesChanged() {
    public void onWifiEntriesChanged() {
        if (mMatchedScanResults.size() == 0) {
        if (mMatchWifis.size() == 0) {
            return;
            return;
        }
        }
        updateWifiEntries();
        updateWifiEntries();
@@ -275,16 +279,24 @@ public class NetworkRequestDialogFragment extends NetworkRequestDialogBaseFragme
        wifiEntries.addAll(mWifiPickerTracker.getWifiEntries());
        wifiEntries.addAll(mWifiPickerTracker.getWifiEntries());


        mFilteredWifiEntries.clear();
        mFilteredWifiEntries.clear();
        mFilteredWifiEntries.addAll(wifiEntries.stream().filter(entry -> {
        mFilteredWifiEntries.addAll(wifiEntries.stream()
            for (ScanResult matchedScanResult : mMatchedScanResults) {
                .filter(entry -> isMatchedWifiEntry(entry))
                if (TextUtils.equals(entry.getSsid(), matchedScanResult.SSID)
                .limit(mShowLimitedItem ? MAX_NUMBER_LIST_ITEM : Long.MAX_VALUE)
                        && entry.getSecurity() == getWifiEntrySecurity(matchedScanResult)) {
                .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 true;
                }
                }
            }
            }
        }
        return false;
        return false;
        }).limit(mShowLimitedItem ? MAX_NUMBER_LIST_ITEM : Long.MAX_VALUE)
                .collect(toList()));
    }
    }


    private class WifiEntryAdapter extends ArrayAdapter<WifiEntry> {
    private class WifiEntryAdapter extends ArrayAdapter<WifiEntry> {
@@ -350,7 +362,14 @@ public class NetworkRequestDialogFragment extends NetworkRequestDialogBaseFragme


    @Override
    @Override
    public void onMatch(List<ScanResult> scanResults) {
    public void onMatch(List<ScanResult> 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();
        updateWifiEntries();
        updateUi();
        updateUi();
    }
    }
+66 −14
Original line number Original line Diff line number Diff line
@@ -16,6 +16,9 @@


package com.android.settings.wifi;
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 com.google.common.truth.Truth.assertThat;


import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.any;
@@ -46,16 +49,20 @@ import com.android.wifitrackerlib.WifiEntry;
import com.android.wifitrackerlib.WifiPickerTracker;
import com.android.wifitrackerlib.WifiPickerTracker;


import org.junit.Before;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runner.RunWith;
import org.mockito.InOrder;
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.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.robolectric.annotation.Config;


import java.util.ArrayList;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.List;


@RunWith(RobolectricTestRunner.class)
@RunWith(RobolectricTestRunner.class)
@@ -63,15 +70,34 @@ import java.util.List;
public class NetworkRequestDialogFragmentTest {
public class NetworkRequestDialogFragmentTest {


    private static final String KEY_SSID = "key_ssid";
    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";
    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 FragmentActivity mActivity;
    private NetworkRequestDialogFragment networkRequestDialogFragment;
    private NetworkRequestDialogFragment networkRequestDialogFragment;


    ScanResult mScanResult = new ScanResult();

    @Before
    @Before
    public void setUp() {
    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();
        FakeFeatureFactory fakeFeatureFactory = FakeFeatureFactory.setupForTest();
        when(fakeFeatureFactory.wifiTrackerLibProvider.createWifiPickerTracker(
        when(fakeFeatureFactory.wifiTrackerLibProvider.createWifiPickerTracker(
                any(), any(), any(), any(), any(), anyLong(), anyLong(), any()))
                any(), any(), any(), any(), any(), anyLong(), anyLong(), any()))
@@ -81,7 +107,7 @@ public class NetworkRequestDialogFragmentTest {
                new Intent().putExtra(NetworkRequestDialogFragment.EXTRA_APP_NAME,
                new Intent().putExtra(NetworkRequestDialogFragment.EXTRA_APP_NAME,
                        TEST_APP_NAME)).setup().get();
                        TEST_APP_NAME)).setup().get();
        networkRequestDialogFragment = spy(NetworkRequestDialogFragment.newInstance());
        networkRequestDialogFragment = spy(NetworkRequestDialogFragment.newInstance());
        networkRequestDialogFragment.mWifiPickerTracker = mock(WifiPickerTracker.class);
        networkRequestDialogFragment.mWifiPickerTracker = mWifiPickerTracker;
    }
    }


    @Test
    @Test
@@ -147,12 +173,10 @@ public class NetworkRequestDialogFragmentTest {
    @Test
    @Test
    public void onWifiStateChanged_nonEmptyMatchedScanResults_shouldUpdateWifiEntries() {
    public void onWifiStateChanged_nonEmptyMatchedScanResults_shouldUpdateWifiEntries() {
        final InOrder inOrder = inOrder(networkRequestDialogFragment);
        final InOrder inOrder = inOrder(networkRequestDialogFragment);
        mScanResult.capabilities = TEST_CAPABILITIES_OPEN;
        networkRequestDialogFragment.onMatch(Arrays.asList(mScanResult));


        final List<ScanResult> scanResults = new ArrayList<>();
        networkRequestDialogFragment.onWifiStateChanged();
        networkRequestDialogFragment.mMatchedScanResults = scanResults;
        ScanResult scanResult = mock(ScanResult.class);
        networkRequestDialogFragment.mMatchedScanResults.add(scanResult);
        networkRequestDialogFragment.onMatch(scanResults);


        inOrder.verify(networkRequestDialogFragment).updateWifiEntries();
        inOrder.verify(networkRequestDialogFragment).updateWifiEntries();
        inOrder.verify(networkRequestDialogFragment).updateUi();
        inOrder.verify(networkRequestDialogFragment).updateUi();
@@ -161,12 +185,10 @@ public class NetworkRequestDialogFragmentTest {
    @Test
    @Test
    public void onWifiEntriesChanged_nonEmptyMatchedScanResults_shouldUpdateWifiEntries() {
    public void onWifiEntriesChanged_nonEmptyMatchedScanResults_shouldUpdateWifiEntries() {
        final InOrder inOrder = inOrder(networkRequestDialogFragment);
        final InOrder inOrder = inOrder(networkRequestDialogFragment);
        mScanResult.capabilities = TEST_CAPABILITIES_OPEN;
        networkRequestDialogFragment.onMatch(Arrays.asList(mScanResult));


        final List<ScanResult> scanResults = new ArrayList<>();
        networkRequestDialogFragment.onWifiEntriesChanged();
        networkRequestDialogFragment.mMatchedScanResults = scanResults;
        ScanResult scanResult = mock(ScanResult.class);
        networkRequestDialogFragment.mMatchedScanResults.add(scanResult);
        networkRequestDialogFragment.onMatch(scanResults);


        inOrder.verify(networkRequestDialogFragment).updateWifiEntries();
        inOrder.verify(networkRequestDialogFragment).updateWifiEntries();
        inOrder.verify(networkRequestDialogFragment).updateUi();
        inOrder.verify(networkRequestDialogFragment).updateUi();
@@ -280,4 +302,34 @@ public class NetworkRequestDialogFragmentTest {
        // Check
        // Check
        verify(selectionCallback, times(1)).reject();
        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);
    }
}
}