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