diff options
17 files changed, 256 insertions, 151 deletions
diff --git a/service/java/com/android/server/wifi/ClientModeImpl.java b/service/java/com/android/server/wifi/ClientModeImpl.java index 01492f939..3b0bd6af0 100644 --- a/service/java/com/android/server/wifi/ClientModeImpl.java +++ b/service/java/com/android/server/wifi/ClientModeImpl.java @@ -6025,6 +6025,7 @@ public class ClientModeImpl extends StateMachine { result = new NetworkUpdateResult(netId); } final int networkId = result.getNetworkId(); + mWifiConfigManager.userEnabledNetwork(networkId); if (!mWifiConfigManager.enableNetwork(networkId, true, callingUid, null) || !mWifiConfigManager.updateLastConnectUid(networkId, callingUid)) { logi("connect Allowing uid " + callingUid diff --git a/service/java/com/android/server/wifi/NetworkSuggestionNominator.java b/service/java/com/android/server/wifi/NetworkSuggestionNominator.java index bc5873484..4f34b1aee 100644 --- a/service/java/com/android/server/wifi/NetworkSuggestionNominator.java +++ b/service/java/com/android/server/wifi/NetworkSuggestionNominator.java @@ -24,7 +24,6 @@ import android.util.Pair; import com.android.server.wifi.WifiNetworkSuggestionsManager.ExtendedWifiNetworkSuggestion; import com.android.server.wifi.hotspot2.PasspointNetworkNominateHelper; -import com.android.server.wifi.util.ScanResultUtil; import com.android.server.wifi.util.TelephonyUtil; import java.util.ArrayList; @@ -77,18 +76,14 @@ public class NetworkSuggestionNominator implements WifiNetworkSelector.NetworkNo WifiConfiguration currentNetwork, String currentBssid, boolean connected, boolean untrustedNetworkAllowed, @NonNull OnConnectableListener onConnectableListener) { + if (scanDetails.isEmpty()) { + return; + } MatchMetaInfo matchMetaInfo = new MatchMetaInfo(); Set<ExtendedWifiNetworkSuggestion> autoJoinDisabledSuggestions = new HashSet<>(); - List<ScanDetail> filteredScanDetails = scanDetails.stream().filter(scanDetail -> - !mWifiConfigManager.wasEphemeralNetworkDeleted( - ScanResultUtil.createQuotedSSID(scanDetail.getScanResult().SSID))) - .collect(Collectors.toList()); - if (filteredScanDetails.isEmpty()) { - return; - } - findMatchedPasspointSuggestionNetworks(filteredScanDetails, matchMetaInfo); - findMatchedSuggestionNetworks(filteredScanDetails, matchMetaInfo, + findMatchedPasspointSuggestionNetworks(scanDetails, matchMetaInfo); + findMatchedSuggestionNetworks(scanDetails, matchMetaInfo, autoJoinDisabledSuggestions); if (matchMetaInfo.isEmpty()) { @@ -139,12 +134,19 @@ public class NetworkSuggestionNominator implements WifiNetworkSelector.NetworkNo } Set<ExtendedWifiNetworkSuggestion> autojoinEnableSuggestions = new HashSet<>(); for (ExtendedWifiNetworkSuggestion ewns : matchingExtNetworkSuggestions) { - if (ewns.isAutojoinEnabled - && isSimBasedNetworkAvailableToAutoConnect(ewns.wns.wifiConfiguration)) { - autojoinEnableSuggestions.add(ewns); - } else { + if (!ewns.isAutojoinEnabled + || !isSimBasedNetworkAvailableToAutoConnect(ewns.wns.wifiConfiguration)) { autoJoinDisabledSuggestions.add(ewns); + continue; + } + if (mWifiConfigManager + .isNetworkTemporarilyDisabledByUser(ewns.wns.wifiConfiguration.SSID)) { + mLocalLog.log("Ignoring user disabled SSID: " + + ewns.wns.wifiConfiguration.SSID); + autoJoinDisabledSuggestions.add(ewns); + continue; } + autojoinEnableSuggestions.add(ewns); } if (autojoinEnableSuggestions.isEmpty()) { diff --git a/service/java/com/android/server/wifi/SavedNetworkNominator.java b/service/java/com/android/server/wifi/SavedNetworkNominator.java index fdfa8914c..d263b2f90 100644 --- a/service/java/com/android/server/wifi/SavedNetworkNominator.java +++ b/service/java/com/android/server/wifi/SavedNetworkNominator.java @@ -121,6 +121,11 @@ public class SavedNetworkNominator implements WifiNetworkSelector.NetworkNominat // TODO (b/112196799): another side effect status.setSeenInLastQualifiedNetworkSelection(true); + if (mWifiConfigManager.isNetworkTemporarilyDisabledByUser(network.SSID)) { + mLocalLog.log("Ignoring user disabled SSID: " + network.SSID); + continue; + } + if (!status.isNetworkEnabled()) { continue; } else if (network.BSSID != null && !network.BSSID.equals("any") diff --git a/service/java/com/android/server/wifi/ScoredNetworkNominator.java b/service/java/com/android/server/wifi/ScoredNetworkNominator.java index 0f71e7f01..4999ef102 100644 --- a/service/java/com/android/server/wifi/ScoredNetworkNominator.java +++ b/service/java/com/android/server/wifi/ScoredNetworkNominator.java @@ -131,9 +131,9 @@ public class ScoredNetworkNominator implements WifiNetworkSelector.NetworkNomina ScanDetail scanDetail = scanDetails.get(i); ScanResult scanResult = scanDetail.getScanResult(); if (scanResult == null) continue; - if (mWifiConfigManager.wasEphemeralNetworkDeleted( + if (mWifiConfigManager.isNetworkTemporarilyDisabledByUser( ScanResultUtil.createQuotedSSID(scanResult.SSID))) { - debugLog("Ignoring disabled ephemeral SSID: " + scanResult.SSID); + debugLog("Ignoring user disabled SSID: " + scanResult.SSID); continue; } final WifiConfiguration configuredNetwork = diff --git a/service/java/com/android/server/wifi/WifiConfigManager.java b/service/java/com/android/server/wifi/WifiConfigManager.java index a40298391..73a773e25 100644 --- a/service/java/com/android/server/wifi/WifiConfigManager.java +++ b/service/java/com/android/server/wifi/WifiConfigManager.java @@ -52,6 +52,7 @@ import android.util.Pair; import com.android.internal.annotations.VisibleForTesting; import com.android.server.wifi.hotspot2.PasspointManager; +import com.android.server.wifi.util.MissingCounterTimerLockList; import com.android.server.wifi.util.TelephonyUtil; import com.android.server.wifi.util.WifiPermissionsUtil; import com.android.server.wifi.util.WifiPermissionsWrapper; @@ -186,10 +187,13 @@ public class WifiConfigManager { MacAddress.fromString(WifiInfo.DEFAULT_MAC_ADDRESS); /** - * Expiration timeout for deleted ephemeral ssids. (1 day) + * Expiration timeout for user disconnect network. (1 hour) */ @VisibleForTesting - public static final long DELETED_EPHEMERAL_SSID_EXPIRY_MS = (long) 1000 * 60 * 60 * 24; + public static final long USER_DISCONNECT_NETWORK_BLOCK_EXPIRY_MS = (long) 1000 * 60 * 60; + + @VisibleForTesting + public static final int SCAN_RESULT_MISSING_COUNT_THRESHOLD = 1; /** * General sorting algorithm of all networks for scanning purposes: @@ -244,14 +248,14 @@ public class WifiConfigManager { */ private final Map<Integer, ScanDetailCache> mScanDetailCaches; /** - * Framework keeps a list of ephemeral SSIDs that where deleted by user, + * Framework keeps a list of networks that where temporarily disabled by user, * framework knows not to autoconnect again even if the app/scorer recommends it. - * The entries are deleted after 24 hours. - * The SSIDs are encoded in a String as per definition of WifiConfiguration.SSID field. - * - * The map stores the SSID and the wall clock time when the network was deleted. + * Network will be based on FQDN for passpoint and SSID for non-passpoint. + * List will be deleted when Wifi turn off, device restart or network settings reset. + * Also when user manfully select to connect network will unblock that network. */ - private final Map<String, Long> mDeletedEphemeralSsidsToTimeMap; + private final MissingCounterTimerLockList<String> mUserTemporarilyDisabledList; + /** * Framework keeps a mapping from configKey to the randomized MAC address so that @@ -342,7 +346,8 @@ public class WifiConfigManager { mConfiguredNetworks = new ConfigurationMap(userManager); mScanDetailCaches = new HashMap<>(16, 0.75f); - mDeletedEphemeralSsidsToTimeMap = new HashMap<>(); + mUserTemporarilyDisabledList = + new MissingCounterTimerLockList<>(SCAN_RESULT_MISSING_COUNT_THRESHOLD, mClock); mRandomizedMacAddressMapping = new HashMap<>(); mListeners = new ArrayList<>(); @@ -1253,13 +1258,9 @@ public class WifiConfigManager { Log.e(TAG, "Failed to add network to config map", e); return new NetworkUpdateResult(WifiConfiguration.INVALID_NETWORK_ID); } - - if (mDeletedEphemeralSsidsToTimeMap.remove(config.SSID) != null) { - updateNetworkSelectionStatus( - newInternalConfig, NetworkSelectionStatus.DISABLED_NONE); - if (mVerboseLoggingEnabled) { - Log.v(TAG, "Removed from ephemeral blacklist: " + config.SSID); - } + // Add or update user saved network or saved passpoint network will re-enable network. + if (!newInternalConfig.fromWifiNetworkSuggestion) { + userEnabledNetwork(newInternalConfig.networkId); } // Stage the backup of the SettingsProvider package which backs this up. @@ -2771,86 +2772,87 @@ public class WifiConfigManager { return hiddenList; } - private @Nullable WifiConfiguration getInternalEphemeralConfiguredNetwork( - @NonNull String ssid) { - for (WifiConfiguration config : getInternalConfiguredNetworks()) { - if ((config.ephemeral || config.isPasspoint()) && TextUtils.equals(config.SSID, ssid)) { - return config; - } + /** + * Check if the provided network was temporarily disabled by the user and still blocked. + * + * @param network Input can be SSID or FQDN. And caller must ensure that the SSID passed thru + * this API matched the WifiConfiguration.SSID rules, and thus be surrounded by + * quotes. + * @return true if network is blocking, otherwise false. + */ + public boolean isNetworkTemporarilyDisabledByUser(String network) { + if (mUserTemporarilyDisabledList.isLocked(network)) { + return true; } - return null; + mUserTemporarilyDisabledList.remove(network); + return false; } /** - * Check if the provided ephemeral network was deleted by the user or not. This call also clears - * the SSID from the deleted ephemeral network map, if the duration has expired the - * timeout specified by {@link #DELETED_EPHEMERAL_SSID_EXPIRY_MS}. + * User temporarily disable a network and will be block to auto-join when network is still + * nearby. + * + * The network will be re-enabled when: + * a) User select to connect the network. + * b) The network is not in range for {@link #USER_DISCONNECT_NETWORK_BLOCK_EXPIRY_MS} + * c) Toggle wifi off, reset network settings or device reboot. * - * @param ssid caller must ensure that the SSID passed thru this API match - * the WifiConfiguration.SSID rules, and thus be surrounded by quotes. - * @return true if network was deleted, false otherwise. + * @param network Input can be SSID or FQDN. And caller must ensure that the SSID passed thru + * this API matched the WifiConfiguration.SSID rules, and thus be surrounded by + * quotes. */ - public boolean wasEphemeralNetworkDeleted(String ssid) { - if (!mDeletedEphemeralSsidsToTimeMap.containsKey(ssid)) { - return false; - } - long deletedTimeInMs = mDeletedEphemeralSsidsToTimeMap.get(ssid); - long nowInMs = mClock.getWallClockMillis(); - // Clear the ssid from the map if the age > |DELETED_EPHEMERAL_SSID_EXPIRY_MS|. - if (nowInMs - deletedTimeInMs > DELETED_EPHEMERAL_SSID_EXPIRY_MS) { - mDeletedEphemeralSsidsToTimeMap.remove(ssid); - WifiConfiguration foundConfig = getInternalEphemeralConfiguredNetwork(ssid); - if (foundConfig != null) { - updateNetworkSelectionStatus( - foundConfig, NetworkSelectionStatus.DISABLED_NONE); + public void userTemporarilyDisabledNetwork(String network) { + mUserTemporarilyDisabledList.add(network, USER_DISCONNECT_NETWORK_BLOCK_EXPIRY_MS); + Log.d(TAG, "Temporarily disable network: " + network + " num=" + + mUserTemporarilyDisabledList.size()); + removeUserChoiceFromDisabledNetwork(network); + } + + /** + * Update the user temporarily disabled network list with networks in range. + * @param networks networks in range in String format, FQDN or SSID. And caller must ensure + * that the SSID passed thru this API matched the WifiConfiguration.SSID rules, + * and thus be surrounded by quotes. + */ + public void updateUserDisabledList(List<String> networks) { + mUserTemporarilyDisabledList.update(new HashSet<>(networks)); + } + + private void removeUserChoiceFromDisabledNetwork( + @NonNull String network) { + for (WifiConfiguration config : getInternalConfiguredNetworks()) { + if (TextUtils.equals(config.SSID, network) || TextUtils.equals(config.FQDN, network)) { + removeConnectChoiceFromAllNetworks(config.getKey()); } - return false; } - return true; } /** - * Disable an ephemeral or Passpoint SSID for the purpose of network selection. - * - * The network will be re-enabled when: - * a) The user creates a network for that SSID and then forgets. - * b) The time specified by {@link #DELETED_EPHEMERAL_SSID_EXPIRY_MS} expires after the disable. - * - * @param ssid caller must ensure that the SSID passed thru this API match - * the WifiConfiguration.SSID rules, and thus be surrounded by quotes. - * @return the {@link WifiConfiguration} corresponding to this SSID, if any, so that we can - * disconnect if this is the current network. + * User enabled network manually, maybe trigger by user select to connect network. + * @param networkId enabled network id. */ - public WifiConfiguration disableEphemeralNetwork(String ssid) { - if (ssid == null) { - return null; + public void userEnabledNetwork(int networkId) { + WifiConfiguration configuration = getInternalConfiguredNetwork(networkId); + if (configuration == null) { + return; } - WifiConfiguration foundConfig = getInternalEphemeralConfiguredNetwork(ssid); - if (foundConfig == null) return null; - // Store the ssid & the wall clock time at which the network was disabled. - mDeletedEphemeralSsidsToTimeMap.put(ssid, mClock.getWallClockMillis()); - // Also, mark the ephemeral permanently blacklisted. Will be taken out of blacklist - // when the ssid is taken out of |mDeletedEphemeralSsidsToTimeMap|. - updateNetworkSelectionStatus(foundConfig, NetworkSelectionStatus.DISABLED_BY_WIFI_MANAGER); - Log.d(TAG, "Forget ephemeral SSID " + ssid + " num=" - + mDeletedEphemeralSsidsToTimeMap.size()); - if (foundConfig.ephemeral) { - Log.d(TAG, "Found ephemeral config in disableEphemeralNetwork: " - + foundConfig.networkId); - } else if (foundConfig.isPasspoint()) { - Log.d(TAG, "Found Passpoint config in disableEphemeralNetwork: " - + foundConfig.networkId + ", FQDN: " + foundConfig.FQDN); + String network; + if (configuration.isPasspoint()) { + network = configuration.FQDN; + } else { + network = configuration.SSID; } - removeConnectChoiceFromAllNetworks(foundConfig.getKey()); - return foundConfig; + mUserTemporarilyDisabledList.remove(network); + Log.d(TAG, "Enable disabled network: " + network + " num=" + + mUserTemporarilyDisabledList.size()); } /** * Clear all deleted ephemeral networks. */ @VisibleForTesting - public void clearDeletedEphemeralNetworks() { - mDeletedEphemeralSsidsToTimeMap.clear(); + public void clearUserTemporarilyDisabledList() { + mUserTemporarilyDisabledList.clear(); } /** @@ -3015,7 +3017,7 @@ public class WifiConfigManager { private void clearInternalData() { localLog("clearInternalData: Clearing all internal data"); mConfiguredNetworks.clear(); - mDeletedEphemeralSsidsToTimeMap.clear(); + mUserTemporarilyDisabledList.clear(); mRandomizedMacAddressMapping.clear(); mScanDetailCaches.clear(); clearLastSelectedNetwork(); @@ -3044,7 +3046,7 @@ public class WifiConfigManager { mConfiguredNetworks.remove(config.networkId); } } - mDeletedEphemeralSsidsToTimeMap.clear(); + mUserTemporarilyDisabledList.clear(); mScanDetailCaches.clear(); clearLastSelectedNetwork(); return removedNetworkIds; diff --git a/service/java/com/android/server/wifi/WifiConnectivityManager.java b/service/java/com/android/server/wifi/WifiConnectivityManager.java index e04897f92..415e29df2 100644 --- a/service/java/com/android/server/wifi/WifiConnectivityManager.java +++ b/service/java/com/android/server/wifi/WifiConnectivityManager.java @@ -288,6 +288,8 @@ public class WifiConnectivityManager { mWifiChannelUtilization.refreshChannelStatsAndChannelUtilization( mStateMachine.getWifiLinkLayerStats(), WifiChannelUtilization.UNKNOWN_FREQ); + updateUserDisabledList(scanDetails); + // Check if any blocklisted BSSIDs can be freed. Set<String> bssidBlocklist = mBssidBlocklistMonitor.updateAndGetBssidBlocklist(); @@ -381,6 +383,23 @@ public class WifiConnectivityManager { return null; } + private void updateUserDisabledList(List<ScanDetail> scanDetails) { + List<String> results = new ArrayList<>(); + List<ScanResult> passpointAp = new ArrayList<>(); + for (ScanDetail scanDetail : scanDetails) { + results.add(ScanResultUtil.createQuotedSSID(scanDetail.getScanResult().SSID)); + if (!scanDetail.getScanResult().isPasspointNetwork()) { + continue; + } + passpointAp.add(scanDetail.getScanResult()); + } + if (!passpointAp.isEmpty()) { + results.addAll(new ArrayList<>(mWifiInjector.getPasspointManager() + .getAllMatchingPasspointProfilesForScanResults(passpointAp).keySet())); + } + mConfigManager.updateUserDisabledList(results); + } + /** * Set whether bluetooth is in the connected state */ diff --git a/service/java/com/android/server/wifi/WifiNetworkFactory.java b/service/java/com/android/server/wifi/WifiNetworkFactory.java index fcea03754..7352e8d0a 100644 --- a/service/java/com/android/server/wifi/WifiNetworkFactory.java +++ b/service/java/com/android/server/wifi/WifiNetworkFactory.java @@ -1391,7 +1391,7 @@ public class WifiNetworkFactory extends NetworkFactory { findUserApprovedAccessPointForActiveRequestFromActiveMatchedScanResults(); } if (approvedScanResult != null - && !mWifiConfigManager.wasEphemeralNetworkDeleted( + && !mWifiConfigManager.isNetworkTemporarilyDisabledByUser( ScanResultUtil.createQuotedSSID(approvedScanResult.SSID))) { Log.v(TAG, "Approved access point found in matching scan results. " + "Triggering connect " + approvedScanResult); diff --git a/service/java/com/android/server/wifi/WifiServiceImpl.java b/service/java/com/android/server/wifi/WifiServiceImpl.java index 5b84c38a6..5c384f595 100644 --- a/service/java/com/android/server/wifi/WifiServiceImpl.java +++ b/service/java/com/android/server/wifi/WifiServiceImpl.java @@ -3011,10 +3011,10 @@ public class WifiServiceImpl extends BaseWifiService { } /** - * Disable an ephemeral network, i.e. network that is created thru a WiFi Scorer + * Temporarily disable a network, should be trigger when user disconnect a network */ @Override - public void disableEphemeralNetwork(String SSID, String packageName) { + public void disableEphemeralNetwork(String network, String packageName) { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.CHANGE_WIFI_STATE, "WifiService"); if (!isPrivileged(Binder.getCallingPid(), Binder.getCallingUid())) { @@ -3023,7 +3023,7 @@ public class WifiServiceImpl extends BaseWifiService { return; } mLog.info("disableEphemeralNetwork uid=%").c(Binder.getCallingUid()).flush(); - mWifiThreadRunner.post(() -> mWifiConfigManager.disableEphemeralNetwork(SSID)); + mWifiThreadRunner.post(() -> mWifiConfigManager.userTemporarilyDisabledNetwork(network)); } private final BroadcastReceiver mReceiver = new BroadcastReceiver() { @@ -3377,7 +3377,7 @@ public class WifiServiceImpl extends BaseWifiService { } mWifiThreadRunner.post(() -> { mPasspointManager.clearAnqpRequestsAndFlushCache(); - mWifiConfigManager.clearDeletedEphemeralNetworks(); + mWifiConfigManager.clearUserTemporarilyDisabledList(); mWifiConfigManager.removeAllEphemeralOrPasspointConfiguredNetworks(); mClientModeImpl.clearNetworkRequestUserApprovedAccessPoints(); mWifiNetworkSuggestionsManager.clear(); diff --git a/service/java/com/android/server/wifi/WifiShellCommand.java b/service/java/com/android/server/wifi/WifiShellCommand.java index 4dba42c80..b5198ddf9 100644 --- a/service/java/com/android/server/wifi/WifiShellCommand.java +++ b/service/java/com/android/server/wifi/WifiShellCommand.java @@ -247,8 +247,8 @@ public class WifiShellCommand extends BasicShellCommandHandler { mClientModeImpl.removeNetworkRequestUserApprovedAccessPointsForApp(packageName); return 0; } - case "clear-deleted-ephemeral-networks": { - mWifiConfigManager.clearDeletedEphemeralNetworks(); + case "clear-user-disabled-networks": { + mWifiConfigManager.clearUserTemporarilyDisabledList(); return 0; } case "send-link-probe": { @@ -475,8 +475,8 @@ public class WifiShellCommand extends BasicShellCommandHandler { pw.println(" Clear the user choice on Imsi protection exemption for carrier"); pw.println(" network-requests-remove-user-approved-access-points <package name>"); pw.println(" Removes all user approved network requests for the app."); - pw.println(" clear-deleted-ephemeral-networks"); - pw.println(" Clears the deleted ephemeral networks list."); + pw.println(" clear-user-disabled-networks"); + pw.println(" Clears the user disabled networks list."); pw.println(" send-link-probe"); pw.println(" Manually triggers a link probe."); pw.println(" force-softap-channel enabled <int> | disabled"); diff --git a/service/java/com/android/server/wifi/hotspot2/PasspointNetworkNominateHelper.java b/service/java/com/android/server/wifi/hotspot2/PasspointNetworkNominateHelper.java index ca9a52fcb..27c8331ec 100644 --- a/service/java/com/android/server/wifi/hotspot2/PasspointNetworkNominateHelper.java +++ b/service/java/com/android/server/wifi/hotspot2/PasspointNetworkNominateHelper.java @@ -94,13 +94,6 @@ public class PasspointNetworkNominateHelper { + WifiNetworkSelector.toScanId(scanDetail.getScanResult())); continue; } - if (mWifiConfigManager.wasEphemeralNetworkDeleted( - ScanResultUtil.createQuotedSSID(scanDetail.getScanResult().SSID))) { - // If the user previously disconnects this network, don't select it. - mLocalLog.log("Ignoring disabled the SSID of Passpoint AP: " - + WifiNetworkSelector.toScanId(scanDetail.getScanResult())); - continue; - } filteredScanDetails.add(scanDetail); } @@ -170,6 +163,10 @@ public class PasspointNetworkNominateHelper { if (config == null) { continue; } + if (mWifiConfigManager.isNetworkTemporarilyDisabledByUser(config.FQDN)) { + mLocalLog.log("Ignoring user disabled FQDN: " + config.FQDN); + continue; + } results.add(Pair.create(candidate.mScanDetail, config)); } } diff --git a/tests/wifitests/src/com/android/server/wifi/ClientModeImplTest.java b/tests/wifitests/src/com/android/server/wifi/ClientModeImplTest.java index 846b452d1..2e276e82a 100644 --- a/tests/wifitests/src/com/android/server/wifi/ClientModeImplTest.java +++ b/tests/wifitests/src/com/android/server/wifi/ClientModeImplTest.java @@ -893,6 +893,7 @@ public class ClientModeImplTest extends WifiBaseTest { mCmi.connect(null, config.networkId, mock(Binder.class), connectActionListener, 0, Binder.getCallingUid()); mLooper.dispatchAll(); + verify(mWifiConfigManager).userEnabledNetwork(config.networkId); verify(connectActionListener).onSuccess(); } diff --git a/tests/wifitests/src/com/android/server/wifi/NetworkSuggestionNominatorTest.java b/tests/wifitests/src/com/android/server/wifi/NetworkSuggestionNominatorTest.java index 1ce8d6eae..82925a43f 100644 --- a/tests/wifitests/src/com/android/server/wifi/NetworkSuggestionNominatorTest.java +++ b/tests/wifitests/src/com/android/server/wifi/NetworkSuggestionNominatorTest.java @@ -408,8 +408,8 @@ public class NetworkSuggestionNominatorTest extends WifiBaseTest { assertTrue(connectableNetworks.isEmpty()); - verify(mWifiConfigManager, times(scanSsids.length)) - .wasEphemeralNetworkDeleted(anyString()); + verify(mWifiConfigManager, times(suggestionSsids.length)) + .isNetworkTemporarilyDisabledByUser(anyString()); verify(mWifiConfigManager).getConfiguredNetwork(eq( suggestions[0].wns.wifiConfiguration.getKey())); verify(mWifiConfigManager).addOrUpdateNetwork(any(), anyInt(), anyString()); @@ -466,8 +466,8 @@ public class NetworkSuggestionNominatorTest extends WifiBaseTest { validateConnectableNetworks(connectableNetworks, new String[] {scanSsids[0]}); // check for any saved networks. - verify(mWifiConfigManager, times(scanSsids.length)) - .wasEphemeralNetworkDeleted(anyString()); + verify(mWifiConfigManager, times(suggestionSsids.length)) + .isNetworkTemporarilyDisabledByUser(anyString()); verify(mWifiConfigManager) .getConfiguredNetwork(suggestions[0].wns.wifiConfiguration.getKey()); verify(mWifiConfigManager).addOrUpdateNetwork( @@ -513,7 +513,8 @@ public class NetworkSuggestionNominatorTest extends WifiBaseTest { // setup config manager interactions. setupAddToWifiConfigManager(suggestions[0].wns.wifiConfiguration); // Network was disabled by the user. - when(mWifiConfigManager.wasEphemeralNetworkDeleted(suggestionSsids[0])).thenReturn(true); + when(mWifiConfigManager.isNetworkTemporarilyDisabledByUser(suggestionSsids[0])) + .thenReturn(true); List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>(); mNetworkSuggestionNominator.nominateNetworks( @@ -523,10 +524,11 @@ public class NetworkSuggestionNominatorTest extends WifiBaseTest { assertTrue(connectableNetworks.isEmpty()); - verify(mWifiConfigManager, times(scanSsids.length)).wasEphemeralNetworkDeleted(anyString()); - // Verify we did not try to add any new networks or other interactions with + verify(mWifiConfigManager, times(suggestionSsids.length)) + .isNetworkTemporarilyDisabledByUser(anyString()); + // Verify we did try to add any new networks or other interactions with // WifiConfigManager. - verifyNoMoreInteractions(mWifiConfigManager); + verifyAddToWifiConfigManager(suggestions[0].wns.wifiConfiguration); } /** @@ -580,8 +582,8 @@ public class NetworkSuggestionNominatorTest extends WifiBaseTest { assertTrue(connectableNetworks.isEmpty()); - verify(mWifiConfigManager, times(scanSsids.length)) - .wasEphemeralNetworkDeleted(anyString()); + verify(mWifiConfigManager, times(suggestionSsids.length)) + .isNetworkTemporarilyDisabledByUser(anyString()); verify(mWifiConfigManager).getConfiguredNetwork(eq( suggestions[0].wns.wifiConfiguration.getKey())); verify(mWifiConfigManager).addOrUpdateNetwork( @@ -649,8 +651,8 @@ public class NetworkSuggestionNominatorTest extends WifiBaseTest { validateConnectableNetworks(connectableNetworks, new String[] {scanSsids[0]}); - verify(mWifiConfigManager, times(scanSsids.length)) - .wasEphemeralNetworkDeleted(anyString()); + verify(mWifiConfigManager, times(suggestionSsids.length)) + .isNetworkTemporarilyDisabledByUser(anyString()); verify(mWifiConfigManager).getConfiguredNetwork(eq( suggestions[0].wns.wifiConfiguration.getKey())); verify(mWifiConfigManager).addOrUpdateNetwork( diff --git a/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java b/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java index 08c4eac9a..6e5147bd3 100644 --- a/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java +++ b/tests/wifitests/src/com/android/server/wifi/WifiConfigManagerTest.java @@ -2964,7 +2964,7 @@ public class WifiConfigManagerTest extends WifiBaseTest { } assertTrue(sharedNetwork1Id != WifiConfiguration.INVALID_NETWORK_ID); assertTrue(sharedNetwork2Id != WifiConfiguration.INVALID_NETWORK_ID); - assertFalse(mWifiConfigManager.wasEphemeralNetworkDeleted(TEST_SSID)); + assertFalse(mWifiConfigManager.isNetworkTemporarilyDisabledByUser(TEST_SSID)); // Set up the user 2 store data that is loaded at user switch. List<WifiConfiguration> user2Networks = new ArrayList<WifiConfiguration>() { @@ -2992,7 +2992,7 @@ public class WifiConfigManagerTest extends WifiBaseTest { } assertEquals(sharedNetwork1Id, updatedSharedNetwork1Id); assertEquals(sharedNetwork2Id, updatedSharedNetwork2Id); - assertFalse(mWifiConfigManager.wasEphemeralNetworkDeleted(TEST_SSID)); + assertFalse(mWifiConfigManager.isNetworkTemporarilyDisabledByUser(TEST_SSID)); } /** @@ -4572,27 +4572,25 @@ public class WifiConfigManagerTest extends WifiBaseTest { /** * Verifies the deletion of ephemeral network using - * {@link WifiConfigManager#disableEphemeralNetwork(String)}. + * {@link WifiConfigManager#userTemporarilyDisabledNetwork(String)}. */ @Test - public void testDisableEphemeralNetwork() throws Exception { - WifiConfiguration ephemeralNetwork = WifiConfigurationTestUtil.createEphemeralNetwork(); + public void testUserDisableNetwork() throws Exception { + WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork(); List<WifiConfiguration> networks = new ArrayList<>(); - networks.add(ephemeralNetwork); - - verifyAddEphemeralNetworkToWifiConfigManager(ephemeralNetwork); - + networks.add(openNetwork); + verifyAddNetworkToWifiConfigManager(openNetwork); List<WifiConfiguration> retrievedNetworks = mWifiConfigManager.getConfiguredNetworksWithPasswords(); WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate( networks, retrievedNetworks); - verifyExpiryOfTimeout(ephemeralNetwork); + verifyExpiryOfTimeout(openNetwork); } /** * Verifies the disconnection of Passpoint network using - * {@link WifiConfigManager#disableEphemeralNetwork(String)}. + * {@link WifiConfigManager#userTemporarilyDisabledNetwork(String)}. */ @Test public void testDisablePasspointNetwork() throws Exception { @@ -4613,8 +4611,8 @@ public class WifiConfigManagerTest extends WifiBaseTest { /** * Verifies the disconnection of Passpoint network using - * {@link WifiConfigManager#disableEphemeralNetwork(String)} and ensures that any user choice - * set over other networks is removed. + * {@link WifiConfigManager#userTemporarilyDisabledNetwork(String)} and ensures that any user + * choice set over other networks is removed. */ @Test public void testDisablePasspointNetworkRemovesUserChoice() throws Exception { @@ -4636,32 +4634,71 @@ public class WifiConfigManagerTest extends WifiBaseTest { retrievedSavedNetwork.getNetworkSelectionStatus().getConnectChoice()); // Disable the passpoint network & ensure the user choice is now removed from saved network. - mWifiConfigManager.disableEphemeralNetwork(passpointNetwork.SSID); + mWifiConfigManager.userTemporarilyDisabledNetwork(passpointNetwork.FQDN); retrievedSavedNetwork = mWifiConfigManager.getConfiguredNetwork(savedNetwork.networkId); assertNull(retrievedSavedNetwork.getNetworkSelectionStatus().getConnectChoice()); } + @Test + public void testUserEnableDisabledNetwork() { + WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork(); + List<WifiConfiguration> networks = new ArrayList<>(); + networks.add(openNetwork); + verifyAddNetworkToWifiConfigManager(openNetwork); + List<WifiConfiguration> retrievedNetworks = + mWifiConfigManager.getConfiguredNetworksWithPasswords(); + WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate( + networks, retrievedNetworks); + + mWifiConfigManager.userTemporarilyDisabledNetwork(openNetwork.SSID); + assertTrue(mWifiConfigManager.isNetworkTemporarilyDisabledByUser(openNetwork.SSID)); + mWifiConfigManager.userEnabledNetwork(retrievedNetworks.get(0).networkId); + assertFalse(mWifiConfigManager.isNetworkTemporarilyDisabledByUser(openNetwork.SSID)); + } + + @Test + public void testUserAddOrUpdateSavedNetworkEnableNetwork() { + WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork(); + List<WifiConfiguration> networks = new ArrayList<>(); + networks.add(openNetwork); + mWifiConfigManager.userTemporarilyDisabledNetwork(openNetwork.SSID); + assertTrue(mWifiConfigManager.isNetworkTemporarilyDisabledByUser(openNetwork.SSID)); + + verifyAddNetworkToWifiConfigManager(openNetwork); + List<WifiConfiguration> retrievedNetworks = + mWifiConfigManager.getConfiguredNetworksWithPasswords(); + WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate( + networks, retrievedNetworks); + assertFalse(mWifiConfigManager.isNetworkTemporarilyDisabledByUser(openNetwork.SSID)); + } + private void verifyExpiryOfTimeout(WifiConfiguration config) { // Disable the ephemeral network. long disableTimeMs = 546643L; long currentTimeMs = disableTimeMs; when(mClock.getWallClockMillis()).thenReturn(currentTimeMs); - mWifiConfigManager.disableEphemeralNetwork(config.SSID); - + String network = config.isPasspoint() ? config.FQDN : config.SSID; + mWifiConfigManager.userTemporarilyDisabledNetwork(network); + // Before timer is triggered, timer will not expiry will enable network. + currentTimeMs = disableTimeMs + + WifiConfigManager.USER_DISCONNECT_NETWORK_BLOCK_EXPIRY_MS + 1; + when(mClock.getWallClockMillis()).thenReturn(currentTimeMs); + assertTrue(mWifiConfigManager.isNetworkTemporarilyDisabledByUser(network)); + for (int i = 0; i < WifiConfigManager.SCAN_RESULT_MISSING_COUNT_THRESHOLD; i++) { + mWifiConfigManager.updateUserDisabledList(new ArrayList<>()); + } // Before the expiry of timeout. - currentTimeMs = disableTimeMs + WifiConfigManager.DELETED_EPHEMERAL_SSID_EXPIRY_MS - 1; + currentTimeMs = currentTimeMs + + WifiConfigManager.USER_DISCONNECT_NETWORK_BLOCK_EXPIRY_MS - 1; when(mClock.getWallClockMillis()).thenReturn(currentTimeMs); - assertTrue(mWifiConfigManager.wasEphemeralNetworkDeleted(config.SSID)); - assertTrue(mWifiConfigManager.getConfiguredNetwork(config.networkId) - .getNetworkSelectionStatus().isNetworkPermanentlyDisabled()); + assertTrue(mWifiConfigManager.isNetworkTemporarilyDisabledByUser(network)); // After the expiry of timeout. - currentTimeMs = disableTimeMs + WifiConfigManager.DELETED_EPHEMERAL_SSID_EXPIRY_MS + 1; + currentTimeMs = currentTimeMs + + WifiConfigManager.USER_DISCONNECT_NETWORK_BLOCK_EXPIRY_MS + 1; when(mClock.getWallClockMillis()).thenReturn(currentTimeMs); - assertFalse(mWifiConfigManager.wasEphemeralNetworkDeleted(config.SSID)); - assertFalse(mWifiConfigManager.getConfiguredNetwork(config.networkId) - .getNetworkSelectionStatus().isNetworkPermanentlyDisabled()); + assertFalse(mWifiConfigManager.isNetworkTemporarilyDisabledByUser(network)); } private NetworkUpdateResult verifyAddOrUpdateNetworkWithProxySettingsAndPermissions( diff --git a/tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java b/tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java index acac4f2f4..a3424f39f 100644 --- a/tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java +++ b/tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java @@ -50,6 +50,8 @@ import android.util.LocalLog; import androidx.test.filters.SmallTest; +import com.android.server.wifi.hotspot2.PasspointManager; +import com.android.server.wifi.util.ScanResultUtil; import com.android.wifi.resources.R; import org.junit.After; @@ -68,8 +70,10 @@ import java.io.StringWriter; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.concurrent.Executor; import java.util.stream.Collectors; @@ -107,6 +111,7 @@ public class WifiConnectivityManagerTest extends WifiBaseTest { when(mWifiInjector.getWifiScoreCard()).thenReturn(mWifiScoreCard); when(mWifiInjector.getWifiNetworkSuggestionsManager()) .thenReturn(mWifiNetworkSuggestionsManager); + when(mWifiInjector.getPasspointManager()).thenReturn(mPasspointManager); mWifiConnectivityManager = createConnectivityManager(); verify(mWifiConfigManager).addOnNetworkUpdateListener(anyObject()); mWifiConnectivityManager.setTrustedConnectionAllowed(true); @@ -175,6 +180,7 @@ public class WifiConnectivityManagerTest extends WifiBaseTest { @Mock private WifiChannelUtilization mWifiChannelUtilization; @Mock private ScoringParams mScoringParams; @Mock private WifiScoreCard mWifiScoreCard; + @Mock private PasspointManager mPasspointManager; @Mock private WifiScoreCard.PerNetwork mPerNetwork; @Mock private WifiScoreCard.PerNetwork mPerNetwork1; @Mock WifiCandidates.Candidate mCandidate1; @@ -209,6 +215,8 @@ public class WifiConnectivityManagerTest extends WifiBaseTest { private static final int TEST_FREQUENCY_3 = 5240; private static final int HIGH_MVMT_SCAN_DELAY_MS = 10000; private static final int HIGH_MVMT_RSSI_DELTA = 10; + private static final String TEST_FQDN = "FQDN"; + private static final String TEST_SSID = "SSID"; Context mockContext() { Context context = mock(Context.class); @@ -1682,6 +1690,37 @@ public class WifiConnectivityManagerTest extends WifiBaseTest { } /** + * Verify when new scanResults are available, UserDisabledList will be updated. + */ + @Test + public void verifyUserDisabledListUpdated() { + mResources.setBoolean( + R.bool.config_wifi_framework_use_single_radio_chain_scan_results_network_selection, + true); + verify(mWifiConfigManager, never()).updateUserDisabledList(anyList()); + Set<String> updateNetworks = new HashSet<>(); + mScanData = createScanDataWithDifferentRadioChainInfos(); + int i = 0; + for (ScanResult scanResult : mScanData.getResults()) { + scanResult.SSID = TEST_SSID + i; + updateNetworks.add(ScanResultUtil.createQuotedSSID(scanResult.SSID)); + i++; + } + updateNetworks.add(TEST_FQDN); + mScanData.getResults()[0].setFlag(ScanResult.FLAG_PASSPOINT_NETWORK); + HashMap<String, Map<Integer, List<ScanResult>>> passpointNetworks = new HashMap<>(); + passpointNetworks.put(TEST_FQDN, new HashMap<>()); + when(mPasspointManager.getAllMatchingPasspointProfilesForScanResults(any())) + .thenReturn(passpointNetworks); + + mWifiConnectivityManager.forceConnectivityScan(WIFI_WORK_SOURCE); + ArgumentCaptor<ArrayList<String>> listArgumentCaptor = + ArgumentCaptor.forClass(ArrayList.class); + verify(mWifiConfigManager).updateUserDisabledList(listArgumentCaptor.capture()); + assertEquals(updateNetworks, new HashSet<>(listArgumentCaptor.getValue())); + } + + /** * Verify that a blacklisted BSSID becomes available only after * BSSID_BLACKLIST_EXPIRE_TIME_MS. */ diff --git a/tests/wifitests/src/com/android/server/wifi/WifiNetworkFactoryTest.java b/tests/wifitests/src/com/android/server/wifi/WifiNetworkFactoryTest.java index 52c43ce7a..c25648d53 100644 --- a/tests/wifitests/src/com/android/server/wifi/WifiNetworkFactoryTest.java +++ b/tests/wifitests/src/com/android/server/wifi/WifiNetworkFactoryTest.java @@ -2120,7 +2120,7 @@ public class WifiNetworkFactoryTest extends WifiBaseTest { reset(mNetworkRequestMatchCallback, mWifiScanner, mAlarmManager, mClientModeImpl); // 2. Simulate user forgeting the network. - when(mWifiConfigManager.wasEphemeralNetworkDeleted( + when(mWifiConfigManager.isNetworkTemporarilyDisabledByUser( ScanResultUtil.createQuotedSSID(mTestScanDatas[0].getResults()[0].SSID))) .thenReturn(true); diff --git a/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java b/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java index 36904e041..8ecac08bc 100644 --- a/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java +++ b/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java @@ -4102,7 +4102,7 @@ public class WifiServiceImplTest extends WifiBaseTest { verify(mPasspointManager).removeProvider(anyInt(), anyBoolean(), eq(config.getUniqueId()), isNull()); verify(mPasspointManager).clearAnqpRequestsAndFlushCache(); - verify(mWifiConfigManager).clearDeletedEphemeralNetworks(); + verify(mWifiConfigManager).clearUserTemporarilyDisabledList(); verify(mWifiConfigManager).removeAllEphemeralOrPasspointConfiguredNetworks(); verify(mClientModeImpl).clearNetworkRequestUserApprovedAccessPoints(); verify(mWifiNetworkSuggestionsManager).clear(); @@ -4482,7 +4482,7 @@ public class WifiServiceImplTest extends WifiBaseTest { anyInt(), anyInt())).thenReturn(PackageManager.PERMISSION_GRANTED); mWifiServiceImpl.disableEphemeralNetwork(new String(), TEST_PACKAGE_NAME); mLooper.dispatchAll(); - verify(mWifiConfigManager).disableEphemeralNetwork(anyString()); + verify(mWifiConfigManager).userTemporarilyDisabledNetwork(anyString()); } /** @@ -4495,7 +4495,7 @@ public class WifiServiceImplTest extends WifiBaseTest { anyInt(), anyInt())).thenReturn(PackageManager.PERMISSION_DENIED); mWifiServiceImpl.disableEphemeralNetwork(new String(), TEST_PACKAGE_NAME); mLooper.dispatchAll(); - verify(mWifiConfigManager, never()).disableEphemeralNetwork(anyString()); + verify(mWifiConfigManager, never()).userTemporarilyDisabledNetwork(anyString()); } /** diff --git a/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointNetworkNominateHelperTest.java b/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointNetworkNominateHelperTest.java index 0be5035ad..493be0fd9 100644 --- a/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointNetworkNominateHelperTest.java +++ b/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointNetworkNominateHelperTest.java @@ -516,7 +516,7 @@ public class PasspointNetworkNominateHelperTest { when(mWifiConfigManager.addOrUpdateNetwork(any(WifiConfiguration.class), anyInt())) .thenReturn(new NetworkUpdateResult(TEST_NETWORK_ID)); when(mWifiConfigManager.getConfiguredNetwork(TEST_NETWORK_ID)).thenReturn(TEST_CONFIG1); - when(mWifiConfigManager.wasEphemeralNetworkDeleted("\"" + TEST_SSID1 + "\"")) + when(mWifiConfigManager.isNetworkTemporarilyDisabledByUser(TEST_FQDN1)) .thenReturn(true); List<Pair<ScanDetail, WifiConfiguration>> candidates = mNominateHelper .getPasspointNetworkCandidates(scanDetails, false); |