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(); } }