1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.settingslib.wifi;
18 
19 import android.content.Context;
20 import android.net.ConnectivityManager;
21 import android.net.NetworkInfo;
22 import android.net.wifi.WifiConfiguration;
23 import android.net.wifi.WifiInfo;
24 import android.os.Bundle;
25 
26 /**
27 * Build and return a valid AccessPoint.
28 *
29 * Only intended for testing the AccessPoint class;
30 * AccessPoints were designed to only be populated
31 * by the mechanisms of scan results and wifi configurations.
32 */
33 public class TestAccessPointBuilder {
34     // match the private values in WifiManager
35     private static final int MIN_RSSI = -100;
36     private static final int MAX_RSSI = -55;
37 
38     // set some sensible defaults
39     private int mRssi = AccessPoint.UNREACHABLE_RSSI;
40     private int mNetworkId = WifiConfiguration.INVALID_NETWORK_ID;
41     private String ssid = "TestSsid";
42     private NetworkInfo mNetworkInfo = null;
43     private String mFqdn = null;
44     private String mProviderFriendlyName = null;
45     private WifiConfiguration mWifiConfig;
46     private WifiInfo mWifiInfo;
47 
48     Context mContext;
49 
TestAccessPointBuilder(Context context)50     public TestAccessPointBuilder(Context context) {
51         mContext = context;
52     }
53 
build()54     public AccessPoint build() {
55         Bundle bundle = new Bundle();
56 
57         WifiConfiguration wifiConfig = new WifiConfiguration();
58         wifiConfig.networkId = mNetworkId;
59 
60         bundle.putString(AccessPoint.KEY_SSID, ssid);
61         bundle.putParcelable(AccessPoint.KEY_CONFIG, wifiConfig);
62         bundle.putParcelable(AccessPoint.KEY_NETWORKINFO, mNetworkInfo);
63         bundle.putParcelable(AccessPoint.KEY_WIFIINFO, mWifiInfo);
64         if (mFqdn != null) {
65             bundle.putString(AccessPoint.KEY_FQDN, mFqdn);
66         }
67         if (mProviderFriendlyName != null) {
68             bundle.putString(AccessPoint.KEY_PROVIDER_FRIENDLY_NAME, mProviderFriendlyName);
69         }
70         AccessPoint ap = new AccessPoint(mContext, bundle);
71         ap.setRssi(mRssi);
72         return ap;
73     }
74 
setActive(boolean active)75     public TestAccessPointBuilder setActive(boolean active) {
76         if (active) {
77             mNetworkInfo = new NetworkInfo(
78                 ConnectivityManager.TYPE_DUMMY,
79                 ConnectivityManager.TYPE_DUMMY,
80                 "TestNetwork",
81                 "TestNetwork");
82         } else {
83             mNetworkInfo = null;
84         }
85         return this;
86     }
87 
88     /**
89      * Set the rssi based upon the desired signal level.
90      *
91      * <p>Side effect: if this AccessPoint was previously unreachable,
92      * setting the level will also make it reachable.
93      */
setLevel(int level)94     public TestAccessPointBuilder setLevel(int level) {
95         // Reversal of WifiManager.calculateSignalLevels
96         if (level == 0) {
97             mRssi = MIN_RSSI;
98         } else if (level >= AccessPoint.SIGNAL_LEVELS) {
99             mRssi = MAX_RSSI;
100         } else {
101             float inputRange = MAX_RSSI - MIN_RSSI;
102             float outputRange = AccessPoint.SIGNAL_LEVELS - 1;
103             mRssi = (int) (level * inputRange / outputRange + MIN_RSSI);
104         }
105         return this;
106     }
107 
setNetworkInfo(NetworkInfo info)108     public TestAccessPointBuilder setNetworkInfo(NetworkInfo info) {
109         mNetworkInfo = info;
110         return this;
111     }
112 
setRssi(int rssi)113     public TestAccessPointBuilder setRssi(int rssi) {
114         mRssi = rssi;
115         return this;
116     }
117 
118     /**
119     * Set whether the AccessPoint is reachable.
120     * Side effect: if the signal level was not previously set,
121     * making an AccessPoint reachable will set the signal to the minimum level.
122     */
setReachable(boolean reachable)123     public TestAccessPointBuilder setReachable(boolean reachable) {
124         if (reachable) {
125             // only override the mRssi if it hasn't been set yet
126             if (mRssi == AccessPoint.UNREACHABLE_RSSI) {
127                 mRssi = MIN_RSSI;
128             }
129         } else {
130             mRssi = AccessPoint.UNREACHABLE_RSSI;
131         }
132         return this;
133     }
134 
setSaved(boolean saved)135     public TestAccessPointBuilder setSaved(boolean saved){
136         if (saved) {
137              mNetworkId = 1;
138         } else {
139              mNetworkId = WifiConfiguration.INVALID_NETWORK_ID;
140         }
141         return this;
142     }
143 
setSsid(String newSsid)144     public TestAccessPointBuilder setSsid(String newSsid) {
145         ssid = newSsid;
146         return this;
147     }
148 
setFqdn(String fqdn)149     public TestAccessPointBuilder setFqdn(String fqdn) {
150         mFqdn = fqdn;
151         return this;
152     }
153 
setProviderFriendlyName(String friendlyName)154     public TestAccessPointBuilder setProviderFriendlyName(String friendlyName) {
155         mProviderFriendlyName = friendlyName;
156         return this;
157     }
158 
setWifiInfo(WifiInfo info)159     public TestAccessPointBuilder setWifiInfo(WifiInfo info) {
160         mWifiInfo = info;
161         return this;
162     }
163 
164     /**
165      * Set the networkId in the WifiConfig.
166      *
167      * <p>Setting this to a value other than {@link WifiConfiguration#INVALID_NETWORK_ID} makes this
168      * AccessPoint a saved network.
169      */
setNetworkId(int networkId)170     public TestAccessPointBuilder setNetworkId(int networkId) {
171         mNetworkId = networkId;
172         return this;
173     }
174 }
175