Home | History | Annotate | Download | only in wifi
      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