ConfigurationMap.java revision bcdabb1fa1894fcca610692ec94459fe623afa74
1package com.android.server.wifi; 2 3import android.net.wifi.WifiConfiguration; 4import android.os.UserHandle; 5 6import java.util.ArrayList; 7import java.util.Collection; 8import java.util.HashMap; 9import java.util.Iterator; 10import java.util.List; 11import java.util.Map; 12 13public class ConfigurationMap { 14 private final Map<Integer, WifiConfiguration> mPerID = new HashMap<>(); 15 private final Map<Integer, WifiConfiguration> mPerConfigKey = new HashMap<>(); 16 17 private final Map<Integer, WifiConfiguration> mPerIDForCurrentUser = new HashMap<>(); 18 private final Map<String, WifiConfiguration> mPerFQDNForCurrentUser = new HashMap<>(); 19 20 private int mCurrentUserId = UserHandle.USER_SYSTEM; 21 22 // RW methods: 23 public WifiConfiguration put(WifiConfiguration config) { 24 final WifiConfiguration current = mPerID.put(config.networkId, config); 25 mPerConfigKey.put(config.configKey().hashCode(), config); // This is ridiculous... 26 if (config.isVisibleToUser(mCurrentUserId)) { 27 mPerIDForCurrentUser.put(config.networkId, config); 28 if (config.FQDN != null && config.FQDN.length() > 0) { 29 mPerFQDNForCurrentUser.put(config.FQDN, config); 30 } 31 } 32 return current; 33 } 34 35 public WifiConfiguration remove(int netID) { 36 WifiConfiguration config = mPerID.remove(netID); 37 if (config == null) { 38 return null; 39 } 40 mPerConfigKey.remove(config.configKey().hashCode()); 41 42 mPerIDForCurrentUser.remove(netID); 43 Iterator<Map.Entry<String, WifiConfiguration>> entries = 44 mPerFQDNForCurrentUser.entrySet().iterator(); 45 while (entries.hasNext()) { 46 if (entries.next().getValue().networkId == netID) { 47 entries.remove(); 48 break; 49 } 50 } 51 return config; 52 } 53 54 public void clear() { 55 mPerID.clear(); 56 mPerConfigKey.clear(); 57 mPerIDForCurrentUser.clear(); 58 mPerFQDNForCurrentUser.clear(); 59 } 60 61 /** 62 * Handles the switch to a different foreground user: 63 * - Hides private network configurations belonging to the previous foreground user 64 * - Reveals private network configurations belonging to the new foreground user 65 * 66 * @param userId the id of the new foreground user 67 * @return a list of {@link WifiConfiguration}s that became hidden because of the user switch 68 */ 69 public List<WifiConfiguration> handleUserSwitch(int userId) { 70 mPerIDForCurrentUser.clear(); 71 mPerFQDNForCurrentUser.clear(); 72 73 final int previousUserId = mCurrentUserId; 74 mCurrentUserId = userId; 75 76 final List<WifiConfiguration> hiddenConfigurations = new ArrayList<>(); 77 for (Map.Entry<Integer, WifiConfiguration> entry : mPerID.entrySet()) { 78 final WifiConfiguration config = entry.getValue(); 79 if (config.isVisibleToUser(mCurrentUserId)) { 80 mPerIDForCurrentUser.put(entry.getKey(), config); 81 if (config.FQDN != null && config.FQDN.length() > 0) { 82 mPerFQDNForCurrentUser.put(config.FQDN, config); 83 } 84 } else if (config.isVisibleToUser(previousUserId)) { 85 hiddenConfigurations.add(config); 86 } 87 } 88 89 return hiddenConfigurations; 90 } 91 92 // RO methods: 93 public WifiConfiguration getForAllUsers(int netid) { 94 return mPerID.get(netid); 95 } 96 97 public WifiConfiguration getForCurrentUser(int netid) { 98 return mPerIDForCurrentUser.get(netid); 99 } 100 101 public int sizeForAllUsers() { 102 return mPerID.size(); 103 } 104 105 public int sizeForCurrentUser() { 106 return mPerIDForCurrentUser.size(); 107 } 108 109 public WifiConfiguration getByFQDNForCurrentUser(String fqdn) { 110 return mPerFQDNForCurrentUser.get(fqdn); 111 } 112 113 public WifiConfiguration getByConfigKeyForCurrentUser(String key) { 114 if (key == null) { 115 return null; 116 } 117 for (WifiConfiguration config : mPerIDForCurrentUser.values()) { 118 if (config.configKey().equals(key)) { 119 return config; 120 } 121 } 122 return null; 123 } 124 125 public WifiConfiguration getByConfigKeyIDForAllUsers(int id) { 126 return mPerConfigKey.get(id); 127 } 128 129 public Collection<WifiConfiguration> getEnabledNetworksForCurrentUser() { 130 List<WifiConfiguration> list = new ArrayList<>(); 131 for (WifiConfiguration config : mPerIDForCurrentUser.values()) { 132 if (config.status != WifiConfiguration.Status.DISABLED) { 133 list.add(config); 134 } 135 } 136 return list; 137 } 138 139 public WifiConfiguration getEphemeralForCurrentUser(String ssid) { 140 for (WifiConfiguration config : mPerIDForCurrentUser.values()) { 141 if (ssid.equals(config.SSID) && config.ephemeral) { 142 return config; 143 } 144 } 145 return null; 146 } 147 148 public Collection<WifiConfiguration> valuesForAllUsers() { 149 return mPerID.values(); 150 } 151 152 public Collection<WifiConfiguration> valuesForCurrentUser() { 153 return mPerIDForCurrentUser.values(); 154 } 155} 156