1 package com.android.server.wifi; 2 3 import android.content.pm.UserInfo; 4 import android.net.wifi.WifiConfiguration; 5 import android.os.UserHandle; 6 import android.os.UserManager; 7 8 import java.util.ArrayList; 9 import java.util.Collection; 10 import java.util.HashMap; 11 import java.util.HashSet; 12 import java.util.Iterator; 13 import java.util.List; 14 import java.util.Map; 15 import java.util.Set; 16 17 public class ConfigurationMap { 18 private final Map<Integer, WifiConfiguration> mPerID = 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(UserManager userManager) { 28 mUserManager = userManager; 29 } 30 31 // RW methods: 32 public WifiConfiguration put(WifiConfiguration config) { 33 final WifiConfiguration current = mPerID.put(config.networkId, config); 34 if (WifiConfigurationUtil.isVisibleToAnyProfile(config, 35 mUserManager.getProfiles(mCurrentUserId))) { 36 mPerIDForCurrentUser.put(config.networkId, config); 37 if (config.FQDN != null && config.FQDN.length() > 0) { 38 mPerFQDNForCurrentUser.put(config.FQDN, config); 39 } 40 } 41 return current; 42 } 43 44 public WifiConfiguration remove(int netID) { 45 WifiConfiguration config = mPerID.remove(netID); 46 if (config == null) { 47 return null; 48 } 49 50 mPerIDForCurrentUser.remove(netID); 51 Iterator<Map.Entry<String, WifiConfiguration>> entries = 52 mPerFQDNForCurrentUser.entrySet().iterator(); 53 while (entries.hasNext()) { 54 if (entries.next().getValue().networkId == netID) { 55 entries.remove(); 56 break; 57 } 58 } 59 return config; 60 } 61 62 public void clear() { 63 mPerID.clear(); 64 mPerIDForCurrentUser.clear(); 65 mPerFQDNForCurrentUser.clear(); 66 } 67 68 /** 69 * Sets the new foreground user ID. 70 * 71 * @param userId the id of the new foreground user 72 */ 73 public void setNewUser(int userId) { 74 mCurrentUserId = userId; 75 } 76 77 // RO methods: 78 public WifiConfiguration getForAllUsers(int netid) { 79 return mPerID.get(netid); 80 } 81 82 public WifiConfiguration getForCurrentUser(int netid) { 83 return mPerIDForCurrentUser.get(netid); 84 } 85 86 public int sizeForAllUsers() { 87 return mPerID.size(); 88 } 89 90 public int sizeForCurrentUser() { 91 return mPerIDForCurrentUser.size(); 92 } 93 94 public WifiConfiguration getByFQDNForCurrentUser(String fqdn) { 95 return mPerFQDNForCurrentUser.get(fqdn); 96 } 97 98 public WifiConfiguration getByConfigKeyForCurrentUser(String key) { 99 if (key == null) { 100 return null; 101 } 102 for (WifiConfiguration config : mPerIDForCurrentUser.values()) { 103 if (config.configKey().equals(key)) { 104 return config; 105 } 106 } 107 return null; 108 } 109 110 public Collection<WifiConfiguration> getEnabledNetworksForCurrentUser() { 111 List<WifiConfiguration> list = new ArrayList<>(); 112 for (WifiConfiguration config : mPerIDForCurrentUser.values()) { 113 if (config.status != WifiConfiguration.Status.DISABLED) { 114 list.add(config); 115 } 116 } 117 return list; 118 } 119 120 public WifiConfiguration getEphemeralForCurrentUser(String ssid) { 121 for (WifiConfiguration config : mPerIDForCurrentUser.values()) { 122 if (ssid.equals(config.SSID) && config.ephemeral) { 123 return config; 124 } 125 } 126 return null; 127 } 128 129 public Collection<WifiConfiguration> valuesForAllUsers() { 130 return mPerID.values(); 131 } 132 133 public Collection<WifiConfiguration> valuesForCurrentUser() { 134 return mPerIDForCurrentUser.values(); 135 } 136 } 137