ConfigurationMap.java revision c0d8226ffa0e51c143271fead90dd3e8c6594d01
1package com.android.server.wifi; 2 3import android.net.wifi.WifiConfiguration; 4import android.util.Log; 5 6import com.android.server.wifi.hotspot2.Utils; 7import com.android.server.wifi.hotspot2.pps.HomeSP; 8 9import java.util.ArrayList; 10import java.util.Collection; 11import java.util.HashMap; 12import java.util.HashSet; 13import java.util.Iterator; 14import java.util.List; 15import java.util.Map; 16 17public 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 config.enterpriseConfig.setPlmn(homeSp.getCredential().getImsi()); 56 config.enterpriseConfig.setRealm(homeSp.getCredential().getRealm()); 57 mPerFQDN.put(fqdn, config.networkId); 58 } 59 } 60 } 61 62 Log.d(WifiConfigStore.TAG, "loaded " + mPerFQDN.size() + " passpoint configs"); 63 } 64 65 public WifiConfiguration remove(int netID) { 66 WifiConfiguration config = mPerID.remove(netID); 67 if (config == null) { 68 return null; 69 } 70 mPerConfigKey.remove(config.configKey().hashCode()); 71 72 Iterator<Map.Entry<String, Integer>> entries = mPerFQDN.entrySet().iterator(); 73 while (entries.hasNext()) { 74 if (entries.next().getValue() == netID) { 75 entries.remove(); 76 break; 77 } 78 } 79 return config; 80 } 81 82 public void clear() { 83 mPerID.clear(); 84 mPerConfigKey.clear(); 85 mPerFQDN.clear(); 86 } 87 88 // RO methods: 89 public WifiConfiguration get(int netid) { 90 return mPerID.get(netid); 91 } 92 93 public int size() { 94 return mPerID.size(); 95 } 96 97 public boolean isEmpty() { 98 return mPerID.size() == 0; 99 } 100 101 public WifiConfiguration getByFQDN(String fqdn) { 102 Integer id = mPerFQDN.get(fqdn); 103 return id != null ? mPerID.get(id) : null; 104 } 105 106 public WifiConfiguration getByConfigKey(String key) { 107 if (key == null) { 108 return null; 109 } 110 for (WifiConfiguration config : mPerID.values()) { 111 if (config.configKey().equals(key)) { 112 return config; 113 } 114 } 115 return null; 116 } 117 118 public WifiConfiguration getByConfigKeyID(int id) { 119 return mPerConfigKey.get(id); 120 } 121 122 public Collection<WifiConfiguration> getEnabledNetworks() { 123 List<WifiConfiguration> list = new ArrayList<>(); 124 for (WifiConfiguration config : mPerID.values()) { 125 if (config.status != WifiConfiguration.Status.DISABLED) { 126 list.add(config); 127 } 128 } 129 return list; 130 } 131 132 public WifiConfiguration getEphemeral(String ssid) { 133 for (WifiConfiguration config : mPerID.values()) { 134 if (ssid.equals(config.SSID) && config.ephemeral) { 135 return config; 136 } 137 } 138 return null; 139 } 140 141 public Collection<WifiConfiguration> values() { 142 return mPerID.values(); 143 } 144} 145