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