blob: 0fb56eabaa851e740552785c5a6431e61ab5d451 [file] [log] [blame]
package com.android.server.wifi;
import android.net.wifi.WifiConfiguration;
import android.util.Log;
import com.android.server.wifi.hotspot2.Utils;
import com.android.server.wifi.hotspot2.pps.HomeSP;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class ConfigurationMap {
private final Map<Integer, WifiConfiguration> mPerID = new HashMap<>();
private final Map<Integer, WifiConfiguration> mPerConfigKey = new HashMap<>();
private final Map<String, Integer> mPerFQDN = new HashMap<>();
// RW methods:
public WifiConfiguration put(int netid, WifiConfiguration config) {
WifiConfiguration current = mPerID.put(netid, config);
mPerConfigKey.put(config.configKey().hashCode(), config); // This is ridiculous...
if (config.FQDN != null && config.FQDN.length() > 0) {
mPerFQDN.put(config.FQDN, netid);
}
return current;
}
public void populatePasspointData(Collection<HomeSP> homeSPs, WifiNative wifiNative) {
mPerFQDN.clear();
for (HomeSP homeSp : homeSPs) {
String fqdn = homeSp.getFQDN();
Log.d(WifiConfigStore.TAG, "Looking for " + fqdn);
for (WifiConfiguration config : mPerID.values()) {
Log.d(WifiConfigStore.TAG, "Testing " + config.SSID);
String id_str = Utils.unquote(wifiNative.getNetworkVariable(
config.networkId, WifiConfigStore.idStringVarName));
if (id_str != null && id_str.equals(fqdn) && config.enterpriseConfig != null) {
Log.d(WifiConfigStore.TAG, "Matched " + id_str + " with " + config.networkId);
config.FQDN = fqdn;
config.providerFriendlyName = homeSp.getFriendlyName();
HashSet<Long> roamingConsortiumIds = homeSp.getRoamingConsortiums();
config.roamingConsortiumIds = new long[roamingConsortiumIds.size()];
int i = 0;
for (long id : roamingConsortiumIds) {
config.roamingConsortiumIds[i] = id;
i++;
}
IMSIParameter imsiParameter = homeSp.getCredential().getImsi();
config.enterpriseConfig.setPlmn(
imsiParameter != null ? imsiParameter.toString() : null);
config.enterpriseConfig.setRealm(homeSp.getCredential().getRealm());
mPerFQDN.put(fqdn, config.networkId);
}
}
}
Log.d(WifiConfigStore.TAG, "loaded " + mPerFQDN.size() + " passpoint configs");
}
public WifiConfiguration remove(int netID) {
WifiConfiguration config = mPerID.remove(netID);
if (config == null) {
return null;
}
mPerConfigKey.remove(config.configKey().hashCode());
Iterator<Map.Entry<String, Integer>> entries = mPerFQDN.entrySet().iterator();
while (entries.hasNext()) {
if (entries.next().getValue() == netID) {
entries.remove();
break;
}
}
return config;
}
public void clear() {
mPerID.clear();
mPerConfigKey.clear();
mPerFQDN.clear();
}
// RO methods:
public WifiConfiguration get(int netid) {
return mPerID.get(netid);
}
public int size() {
return mPerID.size();
}
public boolean isEmpty() {
return mPerID.size() == 0;
}
public WifiConfiguration getByFQDN(String fqdn) {
Integer id = mPerFQDN.get(fqdn);
return id != null ? mPerID.get(id) : null;
}
public WifiConfiguration getByConfigKey(String key) {
if (key == null) {
return null;
}
for (WifiConfiguration config : mPerID.values()) {
if (config.configKey().equals(key)) {
return config;
}
}
return null;
}
public WifiConfiguration getByConfigKeyID(int id) {
return mPerConfigKey.get(id);
}
public Collection<WifiConfiguration> getEnabledNetworks() {
List<WifiConfiguration> list = new ArrayList<>();
for (WifiConfiguration config : mPerID.values()) {
if (config.status != WifiConfiguration.Status.DISABLED) {
list.add(config);
}
}
return list;
}
public WifiConfiguration getEphemeral(String ssid) {
for (WifiConfiguration config : mPerID.values()) {
if (ssid.equals(config.SSID) && config.ephemeral) {
return config;
}
}
return null;
}
public Collection<WifiConfiguration> values() {
return mPerID.values();
}
}