diff options
-rw-r--r-- | service/java/com/android/server/wifi/WifiNetworkFactory.java | 37 | ||||
-rw-r--r-- | tests/wifitests/src/com/android/server/wifi/WifiNetworkFactoryTest.java | 8 |
2 files changed, 42 insertions, 3 deletions
diff --git a/service/java/com/android/server/wifi/WifiNetworkFactory.java b/service/java/com/android/server/wifi/WifiNetworkFactory.java index d094cca9d..4d420ffb4 100644 --- a/service/java/com/android/server/wifi/WifiNetworkFactory.java +++ b/service/java/com/android/server/wifi/WifiNetworkFactory.java @@ -706,6 +706,11 @@ public class WifiNetworkFactory extends NetworkFactory { WifiConfiguration existingSavedNetwork = mWifiConfigManager.getConfiguredNetwork(network.configKey()); if (existingSavedNetwork != null) { + if (WifiConfigurationUtil.hasCredentialChanged(existingSavedNetwork, network)) { + // TODO (b/142035508): What if the user has a saved network with different + // credentials? + Log.w(TAG, "Network config already present in config manager, reusing"); + } return existingSavedNetwork.networkId; } NetworkUpdateResult networkUpdateResult = @@ -718,6 +723,32 @@ public class WifiNetworkFactory extends NetworkFactory { return networkUpdateResult.netId; } + // Helper method to remove the provided network configuration from WifiConfigManager, if it was + // added by an app's specifier request. + private void disconnectAndRemoveNetworkFromWifiConfigManager( + @Nullable WifiConfiguration network) { + // Trigger a disconnect first. + mWifiInjector.getClientModeImpl().disconnectCommand(); + + if (network == null) return; + WifiConfiguration wcmNetwork = + mWifiConfigManager.getConfiguredNetwork(network.configKey()); + if (wcmNetwork == null) { + Log.e(TAG, "Network not present in config manager"); + return; + } + // Remove the network if it was added previously by an app's specifier request. + if (wcmNetwork.ephemeral && wcmNetwork.fromWifiNetworkSpecifier) { + boolean success = + mWifiConfigManager.removeNetwork(wcmNetwork.networkId, wcmNetwork.creatorUid); + if (!success) { + Log.e(TAG, "Failed to remove network from config manager"); + } else if (mVerboseLoggingEnabled) { + Log.v(TAG, "Removed network from config manager " + wcmNetwork.networkId); + } + } + } + // Helper method to trigger a connection request & schedule a timeout alarm to track the // connection request. private void connectToNetwork(@NonNull WifiConfiguration network) { @@ -755,7 +786,6 @@ public class WifiNetworkFactory extends NetworkFactory { networkToConnect.SSID = network.SSID; // Set the WifiConfiguration.BSSID field to prevent roaming. networkToConnect.BSSID = findBestBssidFromActiveMatchedScanResultsForNetwork(network); - // Mark the network ephemeral so that it's automatically removed at the end of connection. networkToConnect.ephemeral = true; networkToConnect.fromWifiNetworkSpecifier = true; @@ -763,7 +793,8 @@ public class WifiNetworkFactory extends NetworkFactory { mUserSelectedNetwork = networkToConnect; // Disconnect from the current network before issuing a new connect request. - mWifiInjector.getClientModeImpl().disconnectCommand(); + disconnectAndRemoveNetworkFromWifiConfigManager(mUserSelectedNetwork); + // Trigger connection to the network. connectToNetwork(networkToConnect); // Triggered connection to network, now wait for the connection status. @@ -967,7 +998,7 @@ public class WifiNetworkFactory extends NetworkFactory { // Invoked at the termination of current connected request processing. private void teardownForConnectedNetwork() { Log.i(TAG, "Disconnecting from network on reset"); - mWifiInjector.getClientModeImpl().disconnectCommand(); + disconnectAndRemoveNetworkFromWifiConfigManager(mUserSelectedNetwork); mConnectedSpecificNetworkRequest = null; mConnectedSpecificNetworkRequestSpecifier = null; // ensure there is no active request in progress. diff --git a/tests/wifitests/src/com/android/server/wifi/WifiNetworkFactoryTest.java b/tests/wifitests/src/com/android/server/wifi/WifiNetworkFactoryTest.java index e23aa1254..a0c965a54 100644 --- a/tests/wifitests/src/com/android/server/wifi/WifiNetworkFactoryTest.java +++ b/tests/wifitests/src/com/android/server/wifi/WifiNetworkFactoryTest.java @@ -1635,9 +1635,17 @@ public class WifiNetworkFactoryTest extends WifiBaseTest { verify(mAlarmManager).cancel(mConnectionTimeoutAlarmListenerArgumentCaptor.getValue()); // Now release the network request. + WifiConfiguration wcmNetwork = new WifiConfiguration(mSelectedNetwork); + wcmNetwork.networkId = TEST_NETWORK_ID_1; + wcmNetwork.creatorUid = TEST_UID_1; + wcmNetwork.fromWifiNetworkSpecifier = true; + wcmNetwork.ephemeral = true; + when(mWifiConfigManager.getConfiguredNetwork(mSelectedNetwork.configKey())) + .thenReturn(wcmNetwork); mWifiNetworkFactory.releaseNetworkFor(mNetworkRequest); // Verify that we triggered a disconnect. verify(mClientModeImpl, times(2)).disconnectCommand(); + verify(mWifiConfigManager).removeNetwork(TEST_NETWORK_ID_1, TEST_UID_1); // Re-enable connectivity manager . verify(mWifiConnectivityManager).setSpecificNetworkRequestInProgress(false); } |