131891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvistpackage com.android.server.wifi;
231891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist
30fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowskiimport android.content.pm.UserInfo;
431891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvistimport android.net.wifi.WifiConfiguration;
5bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowskiimport android.os.UserHandle;
60fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowskiimport android.os.UserManager;
731891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist
831891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvistimport java.util.ArrayList;
931891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvistimport java.util.Collection;
1031891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvistimport java.util.HashMap;
113d995b8a3a508e957e3dac2e508956020cd9abfeRoshan Piusimport java.util.HashSet;
1231891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvistimport java.util.Iterator;
1331891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvistimport java.util.List;
1431891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvistimport java.util.Map;
153d995b8a3a508e957e3dac2e508956020cd9abfeRoshan Piusimport java.util.Set;
1631891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist
1731891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvistpublic class ConfigurationMap {
1831891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist    private final Map<Integer, WifiConfiguration> mPerID = new HashMap<>();
1931891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist    private final Map<Integer, WifiConfiguration> mPerConfigKey = new HashMap<>();
20bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
21bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    private final Map<Integer, WifiConfiguration> mPerIDForCurrentUser = new HashMap<>();
22bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    private final Map<String, WifiConfiguration> mPerFQDNForCurrentUser = new HashMap<>();
233d995b8a3a508e957e3dac2e508956020cd9abfeRoshan Pius    /**
243d995b8a3a508e957e3dac2e508956020cd9abfeRoshan Pius     * List of all hidden networks in the current user's configuration.
253d995b8a3a508e957e3dac2e508956020cd9abfeRoshan Pius     * Use this list as a param for directed scanning .
263d995b8a3a508e957e3dac2e508956020cd9abfeRoshan Pius     */
273d995b8a3a508e957e3dac2e508956020cd9abfeRoshan Pius    private final Set<Integer> mHiddenNetworkIdsForCurrentUser = new HashSet<>();
28bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
290fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski    private final UserManager mUserManager;
300fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski
31bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    private int mCurrentUserId = UserHandle.USER_SYSTEM;
3231891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist
330fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski    ConfigurationMap(UserManager userManager) {
340fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        mUserManager = userManager;
350fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski    }
360fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski
3731891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist    // RW methods:
38bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    public WifiConfiguration put(WifiConfiguration config) {
39bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        final WifiConfiguration current = mPerID.put(config.networkId, config);
4031891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist        mPerConfigKey.put(config.configKey().hashCode(), config);   // This is ridiculous...
410fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        if (WifiConfigurationUtil.isVisibleToAnyProfile(config,
420fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski                mUserManager.getProfiles(mCurrentUserId))) {
43bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            mPerIDForCurrentUser.put(config.networkId, config);
44bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            if (config.FQDN != null && config.FQDN.length() > 0) {
45bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                mPerFQDNForCurrentUser.put(config.FQDN, config);
46bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            }
473d995b8a3a508e957e3dac2e508956020cd9abfeRoshan Pius            if (config.hiddenSSID) {
483d995b8a3a508e957e3dac2e508956020cd9abfeRoshan Pius                mHiddenNetworkIdsForCurrentUser.add(config.networkId);
493d995b8a3a508e957e3dac2e508956020cd9abfeRoshan Pius            }
5031891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist        }
5131891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist        return current;
5231891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist    }
5331891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist
5431891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist    public WifiConfiguration remove(int netID) {
5531891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist        WifiConfiguration config = mPerID.remove(netID);
5631891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist        if (config == null) {
5731891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist            return null;
5831891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist        }
5931891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist        mPerConfigKey.remove(config.configKey().hashCode());
6031891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist
61bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        mPerIDForCurrentUser.remove(netID);
62bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        Iterator<Map.Entry<String, WifiConfiguration>> entries =
63bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                mPerFQDNForCurrentUser.entrySet().iterator();
6431891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist        while (entries.hasNext()) {
65bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            if (entries.next().getValue().networkId == netID) {
6631891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist                entries.remove();
6731891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist                break;
6831891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist            }
6931891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist        }
703d995b8a3a508e957e3dac2e508956020cd9abfeRoshan Pius        mHiddenNetworkIdsForCurrentUser.remove(netID);
7131891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist        return config;
7231891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist    }
7331891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist
7431891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist    public void clear() {
7531891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist        mPerID.clear();
7631891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist        mPerConfigKey.clear();
77bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        mPerIDForCurrentUser.clear();
78bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        mPerFQDNForCurrentUser.clear();
793d995b8a3a508e957e3dac2e508956020cd9abfeRoshan Pius        mHiddenNetworkIdsForCurrentUser.clear();
80bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    }
81bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
82bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    /**
83bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     * Handles the switch to a different foreground user:
84bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     * - Hides private network configurations belonging to the previous foreground user
85bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     * - Reveals private network configurations belonging to the new foreground user
86bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     *
87bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     * @param userId the id of the new foreground user
88bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     * @return a list of {@link WifiConfiguration}s that became hidden because of the user switch
89bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     */
90bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    public List<WifiConfiguration> handleUserSwitch(int userId) {
91bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        mPerIDForCurrentUser.clear();
92bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        mPerFQDNForCurrentUser.clear();
933d995b8a3a508e957e3dac2e508956020cd9abfeRoshan Pius        mHiddenNetworkIdsForCurrentUser.clear();
94bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
950fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        final List<UserInfo> previousUserProfiles = mUserManager.getProfiles(mCurrentUserId);
96bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        mCurrentUserId = userId;
970fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        final List<UserInfo> currentUserProfiles = mUserManager.getProfiles(mCurrentUserId);
98bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
99bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        final List<WifiConfiguration> hiddenConfigurations = new ArrayList<>();
100bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        for (Map.Entry<Integer, WifiConfiguration> entry : mPerID.entrySet()) {
101bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            final WifiConfiguration config = entry.getValue();
1020fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski            if (WifiConfigurationUtil.isVisibleToAnyProfile(config, currentUserProfiles)) {
103bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                mPerIDForCurrentUser.put(entry.getKey(), config);
104bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                if (config.FQDN != null && config.FQDN.length() > 0) {
105bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                    mPerFQDNForCurrentUser.put(config.FQDN, config);
106bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                }
1073d995b8a3a508e957e3dac2e508956020cd9abfeRoshan Pius                if (config.hiddenSSID) {
1083d995b8a3a508e957e3dac2e508956020cd9abfeRoshan Pius                    mHiddenNetworkIdsForCurrentUser.add(config.networkId);
1093d995b8a3a508e957e3dac2e508956020cd9abfeRoshan Pius                }
1100fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski            } else if (WifiConfigurationUtil.isVisibleToAnyProfile(config, previousUserProfiles)) {
111bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                hiddenConfigurations.add(config);
112bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            }
113bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        }
114bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
115bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        return hiddenConfigurations;
11631891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist    }
11731891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist
11831891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist    // RO methods:
119bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    public WifiConfiguration getForAllUsers(int netid) {
12031891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist        return mPerID.get(netid);
12131891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist    }
12231891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist
123bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    public WifiConfiguration getForCurrentUser(int netid) {
124bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        return mPerIDForCurrentUser.get(netid);
125bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    }
126bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
127bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    public int sizeForAllUsers() {
12831891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist        return mPerID.size();
12931891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist    }
13031891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist
131bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    public int sizeForCurrentUser() {
132bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        return mPerIDForCurrentUser.size();
13331891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist    }
13431891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist
135bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    public WifiConfiguration getByFQDNForCurrentUser(String fqdn) {
136bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        return mPerFQDNForCurrentUser.get(fqdn);
13731891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist    }
13831891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist
139bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    public WifiConfiguration getByConfigKeyForCurrentUser(String key) {
14031891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist        if (key == null) {
14131891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist            return null;
14231891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist        }
143bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        for (WifiConfiguration config : mPerIDForCurrentUser.values()) {
14431891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist            if (config.configKey().equals(key)) {
14531891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist                return config;
14631891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist            }
14731891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist        }
14831891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist        return null;
14931891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist    }
15031891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist
151bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    public WifiConfiguration getByConfigKeyIDForAllUsers(int id) {
15231891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist        return mPerConfigKey.get(id);
15331891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist    }
15431891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist
155bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    public Collection<WifiConfiguration> getEnabledNetworksForCurrentUser() {
15631891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist        List<WifiConfiguration> list = new ArrayList<>();
157bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        for (WifiConfiguration config : mPerIDForCurrentUser.values()) {
15831891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist            if (config.status != WifiConfiguration.Status.DISABLED) {
15931891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist                list.add(config);
16031891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist            }
16131891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist        }
16231891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist        return list;
16331891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist    }
16431891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist
165bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    public WifiConfiguration getEphemeralForCurrentUser(String ssid) {
166bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        for (WifiConfiguration config : mPerIDForCurrentUser.values()) {
16731891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist            if (ssid.equals(config.SSID) && config.ephemeral) {
16831891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist                return config;
16931891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist            }
17031891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist        }
17131891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist        return null;
17231891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist    }
17331891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist
174bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    public Collection<WifiConfiguration> valuesForAllUsers() {
17531891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist        return mPerID.values();
17631891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist    }
177bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
178bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    public Collection<WifiConfiguration> valuesForCurrentUser() {
179bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        return mPerIDForCurrentUser.values();
180bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    }
1813d995b8a3a508e957e3dac2e508956020cd9abfeRoshan Pius
1823d995b8a3a508e957e3dac2e508956020cd9abfeRoshan Pius    public Set<Integer> getHiddenNetworkIdsForCurrentUser() {
1833d995b8a3a508e957e3dac2e508956020cd9abfeRoshan Pius        return mHiddenNetworkIdsForCurrentUser;
1843d995b8a3a508e957e3dac2e508956020cd9abfeRoshan Pius    }
18531891afce40b903ada9b24ec12e3648ae6aa27b2Jan Nordqvist}
186