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