1 package com.android.server.wifi; 2 3 import android.net.wifi.WifiConfiguration; 4 import android.util.Log; 5 6 import com.android.server.wifi.hotspot2.Utils; 7 import com.android.server.wifi.hotspot2.pps.HomeSP; 8 9 import java.util.ArrayList; 10 import java.util.Collection; 11 import java.util.HashMap; 12 import java.util.HashSet; 13 import java.util.Iterator; 14 import java.util.List; 15 import java.util.Map; 16 17 public class ConfigurationMap { 18 private final Map<Integer, WifiConfiguration> mPerID = new HashMap<>(); 19 private final Map<Integer, WifiConfiguration> mPerConfigKey = new HashMap<>(); 20 private final Map<String, Integer> mPerFQDN = new HashMap<>(); 21 22 // RW methods: 23 public WifiConfiguration put(int netid, WifiConfiguration config) { 24 WifiConfiguration current = mPerID.put(netid, config); 25 mPerConfigKey.put(config.configKey().hashCode(), config); // This is ridiculous... 26 if (config.FQDN != null && config.FQDN.length() > 0) { 27 mPerFQDN.put(config.FQDN, netid); 28 } 29 return current; 30 } 31 32 public void populatePasspointData(Collection<HomeSP> homeSPs, WifiNative wifiNative) { 33 mPerFQDN.clear(); 34 35 for (HomeSP homeSp : homeSPs) { 36 String fqdn = homeSp.getFQDN(); 37 Log.d(WifiConfigStore.TAG, "Looking for " + fqdn); 38 for (WifiConfiguration config : mPerID.values()) { 39 Log.d(WifiConfigStore.TAG, "Testing " + config.SSID); 40 41 String id_str = Utils.unquote(wifiNative.getNetworkVariable( 42 config.networkId, WifiConfigStore.idStringVarName)); 43 if (id_str != null && id_str.equals(fqdn) && config.enterpriseConfig != null) { 44 Log.d(WifiConfigStore.TAG, "Matched " + id_str + " with " + config.networkId); 45 config.FQDN = fqdn; 46 config.providerFriendlyName = homeSp.getFriendlyName(); 47 48 HashSet<Long> roamingConsortiumIds = homeSp.getRoamingConsortiums(); 49 config.roamingConsortiumIds = new long[roamingConsortiumIds.size()]; 50 int i = 0; 51 for (long id : roamingConsortiumIds) { 52 config.roamingConsortiumIds[i] = id; 53 i++; 54 } 55 IMSIParameter imsiParameter = homeSp.getCredential().getImsi(); 56 config.enterpriseConfig.setPlmn( 57 imsiParameter != null ? imsiParameter.toString() : null); 58 config.enterpriseConfig.setRealm(homeSp.getCredential().getRealm()); 59 mPerFQDN.put(fqdn, config.networkId); 60 } 61 } 62 } 63 64 Log.d(WifiConfigStore.TAG, "loaded " + mPerFQDN.size() + " passpoint configs"); 65 } 66 67 public WifiConfiguration remove(int netID) { 68 WifiConfiguration config = mPerID.remove(netID); 69 if (config == null) { 70 return null; 71 } 72 mPerConfigKey.remove(config.configKey().hashCode()); 73 74 Iterator<Map.Entry<String, Integer>> entries = mPerFQDN.entrySet().iterator(); 75 while (entries.hasNext()) { 76 if (entries.next().getValue() == netID) { 77 entries.remove(); 78 break; 79 } 80 } 81 return config; 82 } 83 84 public void clear() { 85 mPerID.clear(); 86 mPerConfigKey.clear(); 87 mPerFQDN.clear(); 88 } 89 90 // RO methods: 91 public WifiConfiguration get(int netid) { 92 return mPerID.get(netid); 93 } 94 95 public int size() { 96 return mPerID.size(); 97 } 98 99 public boolean isEmpty() { 100 return mPerID.size() == 0; 101 } 102 103 public WifiConfiguration getByFQDN(String fqdn) { 104 Integer id = mPerFQDN.get(fqdn); 105 return id != null ? mPerID.get(id) : null; 106 } 107 108 public WifiConfiguration getByConfigKey(String key) { 109 if (key == null) { 110 return null; 111 } 112 for (WifiConfiguration config : mPerID.values()) { 113 if (config.configKey().equals(key)) { 114 return config; 115 } 116 } 117 return null; 118 } 119 120 public WifiConfiguration getByConfigKeyID(int id) { 121 return mPerConfigKey.get(id); 122 } 123 124 public Collection<WifiConfiguration> getEnabledNetworks() { 125 List<WifiConfiguration> list = new ArrayList<>(); 126 for (WifiConfiguration config : mPerID.values()) { 127 if (config.status != WifiConfiguration.Status.DISABLED) { 128 list.add(config); 129 } 130 } 131 return list; 132 } 133 134 public WifiConfiguration getEphemeral(String ssid) { 135 for (WifiConfiguration config : mPerID.values()) { 136 if (ssid.equals(config.SSID) && config.ephemeral) { 137 return config; 138 } 139 } 140 return null; 141 } 142 143 public Collection<WifiConfiguration> values() { 144 return mPerID.values(); 145 } 146 } 147