Home | History | Annotate | Download | only in wifi
      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.ScanResult;
     23 import android.net.wifi.WifiConfiguration;
     24 import android.net.wifi.WifiInfo;
     25 import android.os.Bundle;
     26 import android.support.annotation.Keep;
     27 
     28 import com.android.settingslib.wifi.AccessPoint.Speed;
     29 
     30 import java.util.ArrayList;
     31 
     32 /**
     33 * Build and return a valid AccessPoint.
     34 *
     35 * Only intended for testing the AccessPoint class or creating Access points to be used in testing
     36 * applications. AccessPoints were designed to only be populated by the mechanisms of scan results
     37 * and wifi configurations.
     38 */
     39 @Keep
     40 public class TestAccessPointBuilder {
     41     // match the private values in WifiManager
     42     private static final int MIN_RSSI = -100;
     43     private static final int MAX_RSSI = -55;
     44 
     45     // set some sensible defaults
     46     private String mBssid = null;
     47     private int mSpeed = Speed.NONE;
     48     private int mRssi = AccessPoint.UNREACHABLE_RSSI;
     49     private int mNetworkId = WifiConfiguration.INVALID_NETWORK_ID;
     50     private String ssid = "TestSsid";
     51     private NetworkInfo mNetworkInfo = null;
     52     private String mFqdn = null;
     53     private String mProviderFriendlyName = null;
     54     private int mSecurity = AccessPoint.SECURITY_NONE;
     55     private WifiConfiguration mWifiConfig;
     56     private WifiInfo mWifiInfo;
     57     private boolean mIsCarrierAp = false;
     58     private String mCarrierName = null;
     59 
     60     Context mContext;
     61     private ArrayList<ScanResult> mScanResultCache;
     62     private ArrayList<TimestampedScoredNetwork> mScoredNetworkCache;
     63 
     64     @Keep
     65     public TestAccessPointBuilder(Context context) {
     66         mContext = context;
     67     }
     68 
     69     @Keep
     70     public AccessPoint build() {
     71         Bundle bundle = new Bundle();
     72 
     73         WifiConfiguration wifiConfig = new WifiConfiguration();
     74         wifiConfig.networkId = mNetworkId;
     75         wifiConfig.BSSID = mBssid;
     76 
     77         bundle.putString(AccessPoint.KEY_SSID, ssid);
     78         bundle.putParcelable(AccessPoint.KEY_CONFIG, wifiConfig);
     79         bundle.putParcelable(AccessPoint.KEY_NETWORKINFO, mNetworkInfo);
     80         bundle.putParcelable(AccessPoint.KEY_WIFIINFO, mWifiInfo);
     81         if (mFqdn != null) {
     82             bundle.putString(AccessPoint.KEY_FQDN, mFqdn);
     83         }
     84         if (mProviderFriendlyName != null) {
     85             bundle.putString(AccessPoint.KEY_PROVIDER_FRIENDLY_NAME, mProviderFriendlyName);
     86         }
     87         if (mScanResultCache != null) {
     88             bundle.putParcelableArrayList(AccessPoint.KEY_SCANRESULTCACHE, mScanResultCache);
     89         }
     90         if (mScoredNetworkCache != null) {
     91             bundle.putParcelableArrayList(AccessPoint.KEY_SCOREDNETWORKCACHE, mScoredNetworkCache);
     92         }
     93         bundle.putInt(AccessPoint.KEY_SECURITY, mSecurity);
     94         bundle.putInt(AccessPoint.KEY_SPEED, mSpeed);
     95         bundle.putBoolean(AccessPoint.KEY_IS_CARRIER_AP, mIsCarrierAp);
     96         if (mCarrierName != null) {
     97             bundle.putString(AccessPoint.KEY_CARRIER_NAME, mCarrierName);
     98         }
     99 
    100         AccessPoint ap = new AccessPoint(mContext, bundle);
    101         ap.setRssi(mRssi);
    102         return ap;
    103     }
    104 
    105     @Keep
    106     public TestAccessPointBuilder setActive(boolean active) {
    107         if (active) {
    108             mNetworkInfo = new NetworkInfo(
    109                 ConnectivityManager.TYPE_DUMMY,
    110                 ConnectivityManager.TYPE_DUMMY,
    111                 "TestNetwork",
    112                 "TestNetwork");
    113         } else {
    114             mNetworkInfo = null;
    115         }
    116         return this;
    117     }
    118 
    119     /**
    120      * Set the rssi based upon the desired signal level.
    121      *
    122      * <p>Side effect: if this AccessPoint was previously unreachable,
    123      * setting the level will also make it reachable.
    124      */
    125     @Keep
    126     public TestAccessPointBuilder setLevel(int level) {
    127         // Reversal of WifiManager.calculateSignalLevels
    128         if (level == 0) {
    129             mRssi = MIN_RSSI;
    130         } else if (level >= AccessPoint.SIGNAL_LEVELS) {
    131             mRssi = MAX_RSSI;
    132         } else {
    133             float inputRange = MAX_RSSI - MIN_RSSI;
    134             float outputRange = AccessPoint.SIGNAL_LEVELS - 1;
    135             mRssi = (int) (level * inputRange / outputRange + MIN_RSSI);
    136         }
    137         return this;
    138     }
    139 
    140     @Keep
    141     public TestAccessPointBuilder setNetworkInfo(NetworkInfo info) {
    142         mNetworkInfo = info;
    143         return this;
    144     }
    145 
    146     @Keep
    147     public TestAccessPointBuilder setRssi(int rssi) {
    148         mRssi = rssi;
    149         return this;
    150     }
    151 
    152     public TestAccessPointBuilder setSpeed(int speed) {
    153         mSpeed = speed;
    154         return this;
    155     }
    156 
    157     /**
    158     * Set whether the AccessPoint is reachable.
    159     * Side effect: if the signal level was not previously set,
    160     * making an AccessPoint reachable will set the signal to the minimum level.
    161     */
    162     @Keep
    163     public TestAccessPointBuilder setReachable(boolean reachable) {
    164         if (reachable) {
    165             // only override the mRssi if it hasn't been set yet
    166             if (mRssi == AccessPoint.UNREACHABLE_RSSI) {
    167                 mRssi = MIN_RSSI;
    168             }
    169         } else {
    170             mRssi = AccessPoint.UNREACHABLE_RSSI;
    171         }
    172         return this;
    173     }
    174 
    175     @Keep
    176     public TestAccessPointBuilder setSaved(boolean saved){
    177         if (saved) {
    178              mNetworkId = 1;
    179         } else {
    180              mNetworkId = WifiConfiguration.INVALID_NETWORK_ID;
    181         }
    182         return this;
    183     }
    184 
    185     @Keep
    186     public TestAccessPointBuilder setSecurity(int security) {
    187         mSecurity = security;
    188         return this;
    189     }
    190 
    191     @Keep
    192     public TestAccessPointBuilder setSsid(String newSsid) {
    193         ssid = newSsid;
    194         return this;
    195     }
    196 
    197     @Keep
    198     public TestAccessPointBuilder setFqdn(String fqdn) {
    199         mFqdn = fqdn;
    200         return this;
    201     }
    202 
    203     @Keep
    204     public TestAccessPointBuilder setProviderFriendlyName(String friendlyName) {
    205         mProviderFriendlyName = friendlyName;
    206         return this;
    207     }
    208 
    209     @Keep
    210     public TestAccessPointBuilder setWifiInfo(WifiInfo info) {
    211         mWifiInfo = info;
    212         return this;
    213     }
    214 
    215     /**
    216      * Set the networkId in the WifiConfig.
    217      *
    218      * <p>Setting this to a value other than {@link WifiConfiguration#INVALID_NETWORK_ID} makes this
    219      * AccessPoint a saved network.
    220      */
    221     @Keep
    222     public TestAccessPointBuilder setNetworkId(int networkId) {
    223         mNetworkId = networkId;
    224         return this;
    225     }
    226 
    227     public TestAccessPointBuilder setBssid(String bssid) {
    228         mBssid = bssid;
    229         return this;
    230     }
    231 
    232     public TestAccessPointBuilder setScanResultCache(ArrayList<ScanResult> scanResultCache) {
    233         mScanResultCache = scanResultCache;
    234         return this;
    235     }
    236 
    237     public TestAccessPointBuilder setIsCarrierAp(boolean isCarrierAp) {
    238         mIsCarrierAp = isCarrierAp;
    239         return this;
    240     }
    241 
    242     public TestAccessPointBuilder setCarrierName(String carrierName) {
    243         mCarrierName = carrierName;
    244         return this;
    245     }
    246 
    247     public TestAccessPointBuilder setScoredNetworkCache(
    248             ArrayList<TimestampedScoredNetwork> scoredNetworkCache) {
    249         mScoredNetworkCache = scoredNetworkCache;
    250         return this;
    251     }
    252 }
    253