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