WifiManager.java revision cb13aebfec313a3433ed0f53cc2e3b6dbaf888d0
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.net.wifi; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.annotation.SdkConstant; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.annotation.SdkConstant.SdkConstantType; 21cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tongimport android.annotation.SystemApi; 22ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriffimport android.content.Context; 231022dde719ca430f062f9e628574d70ae1320677Lorenzo Colittiimport android.net.ConnectivityManager; 241022dde719ca430f062f9e628574d70ae1320677Lorenzo Colittiimport android.net.ConnectivityManager.NetworkCallback; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.DhcpInfo; 261022dde719ca430f062f9e628574d70ae1320677Lorenzo Colittiimport android.net.Network; 271022dde719ca430f062f9e628574d70ae1320677Lorenzo Colittiimport android.net.NetworkCapabilities; 281022dde719ca430f062f9e628574d70ae1320677Lorenzo Colittiimport android.net.NetworkRequest; 29738803fee62a98f244250996380820c4923e7f7bYuhao Zhengimport android.net.wifi.ScanSettings; 30738803fee62a98f244250996380820c4923e7f7bYuhao Zhengimport android.net.wifi.WifiChannel; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder; 321022dde719ca430f062f9e628574d70ae1320677Lorenzo Colittiimport android.os.Build; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler; 3588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriffimport android.os.HandlerThread; 36d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriffimport android.os.Looper; 37d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriffimport android.os.Message; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 397e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackbornimport android.os.WorkSource; 40227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriffimport android.os.Messenger; 4188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriffimport android.util.Log; 42d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriffimport android.util.SparseArray; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4464f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapndeimport java.net.InetAddress; 4588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriffimport java.util.concurrent.CountDownLatch; 4688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff 471022dde719ca430f062f9e628574d70ae1320677Lorenzo Colittiimport com.android.internal.annotations.GuardedBy; 48ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriffimport com.android.internal.util.AsyncChannel; 49d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriffimport com.android.internal.util.Protocol; 50ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class provides the primary API for managing all aspects of Wi-Fi 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * connectivity. Get an instance of this class by calling 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Context#getSystemService(String) Context.getSystemService(Context.WIFI_SERVICE)}. 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * It deals with several categories of items: 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The list of configured networks. The list can be viewed and updated, 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and attributes of individual entries can be modified.</li> 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The currently active Wi-Fi network, if any. Connectivity can be 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * established or torn down, and dynamic information about the state of 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the network can be queried.</li> 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Results of access point scans, containing enough information to 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * make decisions about what access point to connect to.</li> 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>It defines the names of various Intent actions that are broadcast 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * upon any sort of change in Wi-Fi state. 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is the API to use when performing Wi-Fi specific operations. To 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * perform operations that pertain to network connectivity at an abstract 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * level, use {@link android.net.ConnectivityManager}. 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class WifiManager { 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff private static final String TAG = "WifiManager"; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Supplicant error codes: 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The error code if there was a problem authenticating. 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int ERROR_AUTHENTICATING = 1; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8489710842585404ea33f941afeb2c321e706005e9Robert Greenwalt * Broadcast intent action indicating whether Wi-Fi scanning is allowed currently 8589710842585404ea33f941afeb2c321e706005e9Robert Greenwalt * @hide 8689710842585404ea33f941afeb2c321e706005e9Robert Greenwalt */ 8789710842585404ea33f941afeb2c321e706005e9Robert Greenwalt public static final String WIFI_SCAN_AVAILABLE = "wifi_scan_available"; 8889710842585404ea33f941afeb2c321e706005e9Robert Greenwalt 8989710842585404ea33f941afeb2c321e706005e9Robert Greenwalt /** 9089710842585404ea33f941afeb2c321e706005e9Robert Greenwalt * Extra int indicating scan availability, WIFI_STATE_ENABLED and WIFI_STATE_DISABLED 9189710842585404ea33f941afeb2c321e706005e9Robert Greenwalt * @hide 9289710842585404ea33f941afeb2c321e706005e9Robert Greenwalt */ 93cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong public static final String EXTRA_SCAN_AVAILABLE = "scan_enabled"; 94cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong 95cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong /** 96cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong * Broadcast intent action indicating that the credential of a Wi-Fi network 97cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong * has been changed. One extra provides the ssid of the network. Another 98cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong * extra provides the event type, whether the credential is saved or forgot. 99cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong * @hide 100cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong */ 101cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong @SystemApi 102cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong public static final String WIFI_CREDENTIAL_CHANGED_ACTION = 103cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong "android.net.wifi.WIFI_CREDENTIAL_CHANGED"; 104cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong /** @hide */ 105cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong @SystemApi 106cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong public static final String EXTRA_WIFI_CREDENTIAL_EVENT_TYPE = "et"; 107cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong /** @hide */ 108cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong @SystemApi 109cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong public static final String EXTRA_WIFI_CREDENTIAL_SSID = "ssid"; 110cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong /** @hide */ 111cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong @SystemApi 112cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong public static final int WIFI_CREDENTIAL_SAVED = 0; 113cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong /** @hide */ 114cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong @SystemApi 115cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong public static final int WIFI_CREDENTIAL_FORGOT = 1; 11689710842585404ea33f941afeb2c321e706005e9Robert Greenwalt 11789710842585404ea33f941afeb2c321e706005e9Robert Greenwalt /** 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Broadcast intent action indicating that Wi-Fi has been enabled, disabled, 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * enabling, disabling, or unknown. One extra provides this state as an int. 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Another extra provides the previous state, if available. 121227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_WIFI_STATE 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_PREVIOUS_WIFI_STATE 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String WIFI_STATE_CHANGED_ACTION = 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android.net.wifi.WIFI_STATE_CHANGED"; 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The lookup key for an int that indicates whether Wi-Fi is enabled, 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * disabled, enabling, disabling, or unknown. Retrieve it with 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getIntExtra(String,int)}. 132227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_DISABLED 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_DISABLING 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_ENABLED 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_ENABLING 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_UNKNOWN 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_WIFI_STATE = "wifi_state"; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The previous Wi-Fi state. 142227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_WIFI_STATE 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_PREVIOUS_WIFI_STATE = "previous_wifi_state"; 146227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wi-Fi is currently being disabled. The state will change to {@link #WIFI_STATE_DISABLED} if 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it finishes successfully. 150227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_CHANGED_ACTION 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getWifiState() 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WIFI_STATE_DISABLING = 0; 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wi-Fi is disabled. 157227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_CHANGED_ACTION 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getWifiState() 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WIFI_STATE_DISABLED = 1; 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wi-Fi is currently being enabled. The state will change to {@link #WIFI_STATE_ENABLED} if 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it finishes successfully. 165227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_CHANGED_ACTION 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getWifiState() 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WIFI_STATE_ENABLING = 2; 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wi-Fi is enabled. 172227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_CHANGED_ACTION 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getWifiState() 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WIFI_STATE_ENABLED = 3; 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wi-Fi is in an unknown state. This state will occur when an error happens while enabling 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or disabling. 180227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_CHANGED_ACTION 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getWifiState() 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WIFI_STATE_UNKNOWN = 4; 1855321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff 1865321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 1875321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Broadcast intent action indicating that Wi-Fi AP has been enabled, disabled, 1885321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * enabling, disabling, or failed. 1895321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 1905321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide 1915321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 1925321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff public static final String WIFI_AP_STATE_CHANGED_ACTION = 1935321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff "android.net.wifi.WIFI_AP_STATE_CHANGED"; 1945321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff 1955321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 1965321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * The lookup key for an int that indicates whether Wi-Fi AP is enabled, 1975321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * disabled, enabling, disabling, or failed. Retrieve it with 1985321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * {@link android.content.Intent#getIntExtra(String,int)}. 1995321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2005321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_DISABLED 2015321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_DISABLING 2025321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_ENABLED 2035321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_ENABLING 2045321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_FAILED 2055321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2065321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide 2075321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 2085321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff public static final String EXTRA_WIFI_AP_STATE = "wifi_state"; 2095321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 2105321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * The previous Wi-Fi state. 2115321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2125321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #EXTRA_WIFI_AP_STATE 2135321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2145321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide 2155321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 2165321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff public static final String EXTRA_PREVIOUS_WIFI_AP_STATE = "previous_wifi_state"; 2175321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 2185321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Wi-Fi AP is currently being disabled. The state will change to 2195321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * {@link #WIFI_AP_STATE_DISABLED} if it finishes successfully. 2205321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2215321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_CHANGED_ACTION 2225321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #getWifiApState() 2235321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2245321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide 2255321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 226a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff public static final int WIFI_AP_STATE_DISABLING = 10; 2275321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 2285321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Wi-Fi AP is disabled. 2295321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2305321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_CHANGED_ACTION 2315321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #getWifiState() 2325321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2335321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide 2345321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 235a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff public static final int WIFI_AP_STATE_DISABLED = 11; 2365321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 2375321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Wi-Fi AP is currently being enabled. The state will change to 2385321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * {@link #WIFI_AP_STATE_ENABLED} if it finishes successfully. 2395321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2405321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_CHANGED_ACTION 2415321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #getWifiApState() 2425321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2435321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide 2445321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 245a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff public static final int WIFI_AP_STATE_ENABLING = 12; 2465321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 2475321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Wi-Fi AP is enabled. 2485321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2495321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_CHANGED_ACTION 2505321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #getWifiApState() 2515321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2525321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide 2535321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 254a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff public static final int WIFI_AP_STATE_ENABLED = 13; 2555321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 2565321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Wi-Fi AP is in a failed state. This state will occur when an error occurs during 2575321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * enabling or disabling 2585321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2595321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_CHANGED_ACTION 2605321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #getWifiApState() 2615321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2625321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide 2635321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 264a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff public static final int WIFI_AP_STATE_FAILED = 14; 2655321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Broadcast intent action indicating that a connection to the supplicant has 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * been established (and it is now possible 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to perform Wi-Fi operations) or the connection to the supplicant has been 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * lost. One extra provides the connection state as a boolean, where {@code true} 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * means CONNECTED. 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_SUPPLICANT_CONNECTED 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String SUPPLICANT_CONNECTION_CHANGE_ACTION = 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android.net.wifi.supplicant.CONNECTION_CHANGE"; 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The lookup key for a boolean that indicates whether a connection to 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the supplicant daemon has been gained or lost. {@code true} means 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a connection now exists. 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve it with {@link android.content.Intent#getBooleanExtra(String,boolean)}. 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_SUPPLICANT_CONNECTED = "connected"; 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Broadcast intent action indicating that the state of Wi-Fi connectivity 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * has changed. One extra provides the new state 2873550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * in the form of a {@link android.net.NetworkInfo} object. If the new 2883550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * state is CONNECTED, additional extras may provide the BSSID and WifiInfo of 2893550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * the access point. 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as a {@code String}. 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_NETWORK_INFO 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_BSSID 2933550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * @see #EXTRA_WIFI_INFO 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String NETWORK_STATE_CHANGED_ACTION = "android.net.wifi.STATE_CHANGE"; 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The lookup key for a {@link android.net.NetworkInfo} object associated with the 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wi-Fi network. Retrieve with 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getParcelableExtra(String)}. 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_NETWORK_INFO = "networkInfo"; 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The lookup key for a String giving the BSSID of the access point to which 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * we are connected. Only present when the new state is CONNECTED. 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve with 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getStringExtra(String)}. 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_BSSID = "bssid"; 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3113550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * The lookup key for a {@link android.net.wifi.WifiInfo} object giving the 3123550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * information about the access point to which we are connected. Only present 3133550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * when the new state is CONNECTED. Retrieve with 3143550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * {@link android.content.Intent#getParcelableExtra(String)}. 3153550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy */ 3163550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy public static final String EXTRA_WIFI_INFO = "wifiInfo"; 3173550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy /** 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Broadcast intent action indicating that the state of establishing a connection to 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an access point has changed.One extra provides the new 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link SupplicantState}. Note that the supplicant state is Wi-Fi specific, and 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is not generally the most useful thing to look at if you are just interested in 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the overall state of connectivity. 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_NEW_STATE 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_SUPPLICANT_ERROR 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String SUPPLICANT_STATE_CHANGED_ACTION = 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android.net.wifi.supplicant.STATE_CHANGE"; 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The lookup key for a {@link SupplicantState} describing the new state 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve with 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getParcelableExtra(String)}. 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_NEW_STATE = "newState"; 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The lookup key for a {@link SupplicantState} describing the supplicant 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * error code if any 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve with 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getIntExtra(String, int)}. 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #ERROR_AUTHENTICATING 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_SUPPLICANT_ERROR = "supplicantError"; 344fcb659b66756ac02bd1491ae1365b27e8509a890Irfan Sheriff 345fcb659b66756ac02bd1491ae1365b27e8509a890Irfan Sheriff /** 346be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff * Broadcast intent action indicating that the configured networks changed. 3471b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * This can be as a result of adding/updating/deleting a network. If 3481b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * {@link #EXTRA_MULTIPLE_NETWORKS_CHANGED} is set to true the new configuration 3491b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * can be retreived with the {@link #EXTRA_WIFI_CONFIGURATION} extra. If multiple 3501b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * Wi-Fi configurations changed, {@link #EXTRA_WIFI_CONFIGURATION} will not be present. 351e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @hide 352e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff */ 353e75c0b8e3becd9f875679a5240f3b1e26d089a3fChelsea Derrick @SystemApi 354be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff public static final String CONFIGURED_NETWORKS_CHANGED_ACTION = 355be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff "android.net.wifi.CONFIGURED_NETWORKS_CHANGE"; 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3571b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * The lookup key for a (@link android.net.wifi.WifiConfiguration} object representing 3581b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * the changed Wi-Fi configuration when the {@link #CONFIGURED_NETWORKS_CHANGED_ACTION} 3591b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * broadcast is sent. 3601b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @hide 3611b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood */ 362e75c0b8e3becd9f875679a5240f3b1e26d089a3fChelsea Derrick @SystemApi 3631b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood public static final String EXTRA_WIFI_CONFIGURATION = "wifiConfiguration"; 3641b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood /** 3651b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * Multiple network configurations have changed. 3661b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @see #CONFIGURED_NETWORKS_CHANGED_ACTION 3671b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * 3681b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @hide 3691b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood */ 370e75c0b8e3becd9f875679a5240f3b1e26d089a3fChelsea Derrick @SystemApi 3711b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood public static final String EXTRA_MULTIPLE_NETWORKS_CHANGED = "multipleChanges"; 3721b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood /** 3731b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * The lookup key for an integer indicating the reason a Wi-Fi network configuration 3741b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * has changed. Only present if {@link #EXTRA_MULTIPLE_NETWORKS_CHANGED} is {@code false} 3751b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @see #CONFIGURED_NETWORKS_CHANGED_ACTION 3761b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @hide 3771b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood */ 378e75c0b8e3becd9f875679a5240f3b1e26d089a3fChelsea Derrick @SystemApi 3791b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood public static final String EXTRA_CHANGE_REASON = "changeReason"; 3801b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood /** 3811b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * The configuration is new and was added. 3821b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @hide 3831b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood */ 384e75c0b8e3becd9f875679a5240f3b1e26d089a3fChelsea Derrick @SystemApi 3851b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood public static final int CHANGE_REASON_ADDED = 0; 3861b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood /** 3871b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * The configuration was removed and is no longer present in the system's list of 3881b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * configured networks. 3891b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @hide 3901b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood */ 391e75c0b8e3becd9f875679a5240f3b1e26d089a3fChelsea Derrick @SystemApi 3921b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood public static final int CHANGE_REASON_REMOVED = 1; 3931b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood /** 3941b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * The configuration has changed as a result of explicit action or because the system 3951b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * took an automated action such as disabling a malfunctioning configuration. 3961b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @hide 3971b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood */ 398e75c0b8e3becd9f875679a5240f3b1e26d089a3fChelsea Derrick @SystemApi 3991b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood public static final int CHANGE_REASON_CONFIG_CHANGE = 2; 4001b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood /** 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * An access point scan has completed, and results are available from the supplicant. 402a0d929e505432a8c84f3899696c910db16bd73bfVinit Deshpande * Call {@link #getScanResults()} to obtain the results. {@link #EXTRA_RESULTS_UPDATED} 403a0d929e505432a8c84f3899696c910db16bd73bfVinit Deshpande * indicates if the scan was completed successfully. 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String SCAN_RESULTS_AVAILABLE_ACTION = "android.net.wifi.SCAN_RESULTS"; 40729ad7c7000393751a0ab0e1a17912db7866d4ff8Vinit Deshpande 40829ad7c7000393751a0ab0e1a17912db7866d4ff8Vinit Deshpande /** 409a0d929e505432a8c84f3899696c910db16bd73bfVinit Deshpande * Lookup key for a {@code boolean} representing the result of previous {@link #startScan} 410a0d929e505432a8c84f3899696c910db16bd73bfVinit Deshpande * operation, reported with {@link #SCAN_RESULTS_AVAILABLE_ACTION}. 411a0d929e505432a8c84f3899696c910db16bd73bfVinit Deshpande * @return true scan was successful, results are updated 41229ad7c7000393751a0ab0e1a17912db7866d4ff8Vinit Deshpande * @return false scan was not successful, results haven't been updated since previous scan 41329ad7c7000393751a0ab0e1a17912db7866d4ff8Vinit Deshpande */ 41429ad7c7000393751a0ab0e1a17912db7866d4ff8Vinit Deshpande public static final String EXTRA_RESULTS_UPDATED = "resultsUpdated"; 41529ad7c7000393751a0ab0e1a17912db7866d4ff8Vinit Deshpande 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4170451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * A batch of access point scans has been completed and the results areavailable. 4180451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * Call {@link #getBatchedScanResults()} to obtain the results. 4190451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @hide pending review 4200451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt */ 4210451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 4220451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt public static final String BATCHED_SCAN_RESULTS_AVAILABLE_ACTION = 4230451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt "android.net.wifi.BATCHED_RESULTS"; 4240451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt /** 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The RSSI (signal strength) has changed. 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_NEW_RSSI 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String RSSI_CHANGED_ACTION = "android.net.wifi.RSSI_CHANGED"; 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The lookup key for an {@code int} giving the new RSSI in dBm. 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_NEW_RSSI = "newRssi"; 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 436be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff * Broadcast intent action indicating that the link configuration 4370d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * changed on wifi. 4380d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @hide 4390d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff */ 440be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff public static final String LINK_CONFIGURATION_CHANGED_ACTION = 441be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff "android.net.wifi.LINK_CONFIGURATION_CHANGED"; 442f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 4430d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff /** 44437e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt * The lookup key for a {@link android.net.LinkProperties} object associated with the 4450d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * Wi-Fi network. Retrieve with 4460d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * {@link android.content.Intent#getParcelableExtra(String)}. 4470d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @hide 4480d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff */ 44937e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt public static final String EXTRA_LINK_PROPERTIES = "linkProperties"; 4500d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff 4510d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff /** 452f9cb86aebe9647e0fe0137fc198ba16c017445c6Robert Greenwalt * The lookup key for a {@link android.net.NetworkCapabilities} object associated with the 453f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Wi-Fi network. Retrieve with 454f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * {@link android.content.Intent#getParcelableExtra(String)}. 455f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * @hide 456f61101f6266be243c481d163b95e65d67b8d1669Wink Saville */ 457f9cb86aebe9647e0fe0137fc198ba16c017445c6Robert Greenwalt public static final String EXTRA_NETWORK_CAPABILITIES = "networkCapabilities"; 458f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 459f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The network IDs of the configured networks could have changed. 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String NETWORK_IDS_CHANGED_ACTION = "android.net.wifi.NETWORK_IDS_CHANGED"; 46437e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4661ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * Activity Action: Show a system activity that allows the user to enable 4671ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * scans to be available even with Wi-Fi turned off. 4681ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * 4691ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * <p>Notification of the result of this activity is posted using the 4701ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * {@link android.app.Activity#onActivityResult} callback. The 4711ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * <code>resultCode</code> 4721ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * will be {@link android.app.Activity#RESULT_OK} if scan always mode has 4731ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * been turned on or {@link android.app.Activity#RESULT_CANCELED} if the user 4741ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * has rejected the request or an error has occurred. 4751ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff */ 4761ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 4771ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff public static final String ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE = 4781ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff "android.net.wifi.action.REQUEST_SCAN_ALWAYS_AVAILABLE"; 4791ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff 4801ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff /** 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Activity Action: Pick a Wi-Fi network to connect to. 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Input: Nothing. 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Output: Nothing. 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ACTION_PICK_WIFI_NETWORK = "android.net.wifi.PICK_WIFI_NETWORK"; 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 48999001278289036a3c645e599ed832943ff1b6e15Eric Shienbrood * In this Wi-Fi lock mode, Wi-Fi will be kept active, 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and will behave normally, i.e., it will attempt to automatically 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * establish a connection to a remembered access point that is 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * within range, and will do periodic scans if there are remembered 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * access points but none are in range. 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WIFI_MODE_FULL = 1; 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 49799001278289036a3c645e599ed832943ff1b6e15Eric Shienbrood * In this Wi-Fi lock mode, Wi-Fi will be kept active, 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * but the only operation that will be supported is initiation of 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * scans, and the subsequent reporting of scan results. No attempts 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be made to automatically connect to remembered access points, 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * nor will periodic scans be automatically performed looking for 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * remembered access points. Scans must be explicitly requested by 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an application in this mode. 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WIFI_MODE_SCAN_ONLY = 2; 506652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff /** 507652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * In this Wi-Fi lock mode, Wi-Fi will be kept active as in mode 508652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * {@link #WIFI_MODE_FULL} but it operates at high performance 509652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * with minimum packet loss and low packet latency even when 510652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * the device screen is off. This mode will consume more power 511652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * and hence should be used only when there is a need for such 512652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * an active connection. 513652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * <p> 514652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * An example use case is when a voice connection needs to be 515652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * kept active even after the device screen goes off. Holding the 516652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * regular {@link #WIFI_MODE_FULL} lock will keep the wifi 517652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * connection active, but the connection can be lossy. 518652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * Holding a {@link #WIFI_MODE_FULL_HIGH_PERF} lock for the 519652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * duration of the voice call will improve the call quality. 520652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * <p> 521652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * When there is no support from the hardware, this lock mode 522652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * will have the same behavior as {@link #WIFI_MODE_FULL} 523652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff */ 524652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff public static final int WIFI_MODE_FULL_HIGH_PERF = 3; 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Anything worse than or equal to this will show 0 bars. */ 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int MIN_RSSI = -100; 528652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Anything better than or equal to this will show the max bars. */ 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int MAX_RSSI = -55; 53136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff 53236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff /** 533ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff * Number of RSSI levels used in the framework to initiate 534ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff * {@link #RSSI_CHANGED_ACTION} broadcast 535ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff * @hide 536ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff */ 537ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff public static final int RSSI_LEVELS = 5; 538ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff 539ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff /** 54036f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * Auto settings in the driver. The driver could choose to operate on both 54136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * 2.4 GHz and 5 GHz or make a dynamic decision on selecting the band. 54236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @hide 54336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff */ 54436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff public static final int WIFI_FREQUENCY_BAND_AUTO = 0; 54536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff 54636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff /** 54736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * Operation on 5 GHz alone 54836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @hide 54936f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff */ 55036f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff public static final int WIFI_FREQUENCY_BAND_5GHZ = 1; 55136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff 55236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff /** 55336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * Operation on 2.4 GHz alone 55436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @hide 55536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff */ 55636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff public static final int WIFI_FREQUENCY_BAND_2GHZ = 2; 55736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff 558227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff /** List of asyncronous notifications 559227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * @hide 560227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff */ 561227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff public static final int DATA_ACTIVITY_NOTIFICATION = 1; 562227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 563227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff //Lowest bit indicates data reception and the second lowest 564227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff //bit indicates data transmitted 565227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff /** @hide */ 566227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff public static final int DATA_ACTIVITY_NONE = 0x00; 567227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff /** @hide */ 568227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff public static final int DATA_ACTIVITY_IN = 0x01; 569227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff /** @hide */ 570227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff public static final int DATA_ACTIVITY_OUT = 0x02; 571227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff /** @hide */ 572227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff public static final int DATA_ACTIVITY_INOUT = 0x03; 573227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 574ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde /** @hide */ 575ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde public static final boolean DEFAULT_POOR_NETWORK_AVOIDANCE_ENABLED = false; 576ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde 577617750604c69e6068f68266d0e30324273aa990eMike Lockwood /* Maximum number of active locks we allow. 578617750604c69e6068f68266d0e30324273aa990eMike Lockwood * This limit was added to prevent apps from creating a ridiculous number 579617750604c69e6068f68266d0e30324273aa990eMike Lockwood * of locks and crashing the system by overflowing the global ref table. 580617750604c69e6068f68266d0e30324273aa990eMike Lockwood */ 581617750604c69e6068f68266d0e30324273aa990eMike Lockwood private static final int MAX_ACTIVE_LOCKS = 50; 582617750604c69e6068f68266d0e30324273aa990eMike Lockwood 583617750604c69e6068f68266d0e30324273aa990eMike Lockwood /* Number of currently active WifiLocks and MulticastLocks */ 584617750604c69e6068f68266d0e30324273aa990eMike Lockwood private int mActiveLockCount; 585617750604c69e6068f68266d0e30324273aa990eMike Lockwood 58688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff private Context mContext; 58788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff IWifiManager mService; 5881022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti private final int mTargetSdkVersion; 58988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff 59088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff private static final int INVALID_KEY = 0; 591302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static int sListenerKey = 1; 592302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static final SparseArray sListenerMap = new SparseArray(); 593302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static final Object sListenerMapLock = new Object(); 59488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff 595302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static AsyncChannel sAsyncChannel; 596302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static CountDownLatch sConnected; 5971022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti private static ConnectivityManager sCM; 59888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff 599302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static final Object sThreadRefLock = new Object(); 600cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff private static int sThreadRefCount; 601cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff private static HandlerThread sHandlerThread; 602cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff 6031022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti @GuardedBy("sCM") 6041022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti // TODO: Introduce refcounting and make this a per-process static callback, instead of a 6051022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti // per-WifiManager callback. 6061022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti private PinningNetworkCallback mNetworkCallback; 6071022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new WifiManager instance. 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Applications will almost always want to use 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Context#getSystemService Context.getSystemService()} to retrieve 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the standard {@link android.content.Context#WIFI_SERVICE Context.WIFI_SERVICE}. 61388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @param context the application context 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param service the Binder interface 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide - hide this because it takes in a parameter of type IWifiManager, which 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is a system private class. 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 61888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public WifiManager(Context context, IWifiManager service) { 61988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff mContext = context; 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService = service; 6211022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti mTargetSdkVersion = context.getApplicationInfo().targetSdkVersion; 62288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff init(); 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a list of all the networks configured in the supplicant. 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Not all fields of WifiConfiguration are returned. Only the following 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * fields are filled in: 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>networkId</li> 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>SSID</li> 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>BSSID</li> 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>priority</li> 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>allowedProtocols</li> 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>allowedKeyManagement</li> 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>allowedAuthAlgorithms</li> 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>allowedPairwiseCiphers</li> 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>allowedGroupCiphers</li> 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a list of network configurations in the form of a list 64159358536d2f14b27cdc7386daeabc2b6dca8e177Irfan Sheriff * of {@link WifiConfiguration} objects. Upon failure to fetch or 64259358536d2f14b27cdc7386daeabc2b6dca8e177Irfan Sheriff * when when Wi-Fi is turned off, it can be null. 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public List<WifiConfiguration> getConfiguredNetworks() { 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.getConfiguredNetworks(); 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 652758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong /** @hide */ 653758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong @SystemApi 654758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong public List<WifiConfiguration> getPrivilegedConfiguredNetworks() { 655758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong try { 656758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong return mService.getPrivilegedConfiguredNetworks(); 657758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong } catch (RemoteException e) { 658758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong return null; 659758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong } 660758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong } 661758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong 6624eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle /** @hide */ 6634eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle @SystemApi 6644eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle public WifiConnectionStatistics getConnectionStatistics() { 6654eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle try { 6664eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle return mService.getConnectionStatistics(); 6674eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle } catch (RemoteException e) { 6684eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle return null; 6694eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle } 6704eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle } 6714eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 673b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande * Returns a WifiConfiguration matching this ScanResult 674b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande * @param scanResult scanResult that represents the BSSID 675b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande * @return {@link WifiConfiguration} that matches this BSSID or null 676b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande * @hide 677b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande */ 678b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande public WifiConfiguration getMatchingWifiConfig(ScanResult scanResult) { 679b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande try { 680b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande return mService.getMatchingWifiConfig(scanResult); 681b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande } catch (RemoteException e) { 682b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande return null; 683b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande } 684b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande } 685b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande 686b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande /** 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a new network description to the set of configured networks. 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The {@code networkId} field of the supplied configuration object 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is ignored. 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p/> 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The new network will be marked DISABLED by default. To enable it, 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * called {@link #enableNetwork}. 693227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param config the set of variables that describe the configuration, 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * contained in a {@link WifiConfiguration} object. 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the ID of the newly created network description. This is used in 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * other operations to specified the network to be acted upon. 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns {@code -1} on failure. 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int addNetwork(WifiConfiguration config) { 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (config == null) { 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.networkId = -1; 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return addOrUpdateNetwork(config); 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Update the network description of an existing configured network. 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param config the set of variables that describe the configuration, 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * contained in a {@link WifiConfiguration} object. It may 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be sparse, so that only the items that are being changed 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are non-<code>null</code>. The {@code networkId} field 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * must be set to the ID of the existing network being updated. 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns the {@code networkId} of the supplied 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@code WifiConfiguration} on success. 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <br/> 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns {@code -1} on failure, including when the {@code networkId} 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * field of the {@code WifiConfiguration} does not refer to an 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * existing network. 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int updateNetwork(WifiConfiguration config) { 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (config == null || config.networkId < 0) { 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return addOrUpdateNetwork(config); 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Internal method for doing the RPC that creates a new network description 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or updates an existing one. 733227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param config The possibly sparse object containing the variables that 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are to set or updated in the network description. 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the ID of the network on success, {@code -1} on failure. 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int addOrUpdateNetwork(WifiConfiguration config) { 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.addOrUpdateNetwork(config); 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Remove the specified network from the list of configured networks. 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This may result in the asynchronous delivery of state change 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * events. 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param netId the integer that identifies the network configuration 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to the supplicant 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean removeNetwork(int netId) { 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.removeNetwork(netId); 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Allow a previously configured network to be associated with. If 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <code>disableOthers</code> is true, then all other configured 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * networks are disabled, and an attempt to connect to the selected 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * network is initiated. This may result in the asynchronous delivery 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of state change events. 7681022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * <p> 7691022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * <b>Note:</b> If an application's target SDK version is 770976f044b2b3eff2ce968e3ea59022414180c268dLorenzo Colitti * {@link android.os.Build.VERSION_CODES#LOLLIPOP} or newer, network 7711022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * communication may not use Wi-Fi even if Wi-Fi is connected; traffic may 7721022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * instead be sent through another network, such as cellular data, 7731022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * Bluetooth tethering, or Ethernet. For example, traffic will never use a 7741022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * Wi-Fi network that does not provide Internet access (e.g. a wireless 7751022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * printer), if another network that does offer Internet access (e.g. 7761022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * cellular data) is available. Applications that need to ensure that their 7771022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * network traffic uses Wi-Fi should use APIs such as 7781022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * {@link Network#bindSocket(java.net.Socket)}, 7791022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * {@link Network#openConnection(java.net.URL)}, or 7801022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * {@link ConnectivityManager#bindProcessToNetwork} to do so. 7811022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param netId the ID of the network in the list of configured networks 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param disableOthers if true, disable all other networks. The way to 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * select a particular network to connect to is specify {@code true} 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for this parameter. 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean enableNetwork(int netId, boolean disableOthers) { 789976f044b2b3eff2ce968e3ea59022414180c268dLorenzo Colitti final boolean pin = disableOthers && mTargetSdkVersion < Build.VERSION_CODES.LOLLIPOP; 7901022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti if (pin) { 7911022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti registerPinningNetworkCallback(); 7921022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti } 7931022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti 7941022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti boolean success; 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7961022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti success = mService.enableNetwork(netId, disableOthers); 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 7981022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti success = false; 7991022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti } 8001022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti 8011022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti if (pin && !success) { 8021022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti unregisterPinningNetworkCallback(); 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8041022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti 8051022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti return success; 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Disable a configured network. The specified network will not be 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a candidate for associating. This may result in the asynchronous 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * delivery of state change events. 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param netId the ID of the network as returned by {@link #addNetwork}. 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean disableNetwork(int netId) { 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.disableNetwork(netId); 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Disassociate from the currently active access point. This may result 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the asynchronous delivery of state change events. 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean disconnect() { 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 830e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff mService.disconnect(); 831e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff return true; 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reconnect to the currently active access point, if we are currently 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * disconnected. This may result in the asynchronous delivery of state 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * change events. 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean reconnect() { 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 845e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff mService.reconnect(); 846e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff return true; 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reconnect to the currently active access point, even if we are already 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * connected. This may result in the asynchronous delivery of state 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * change events. 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean reassociate() { 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 860e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff mService.reassociate(); 861e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff return true; 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Check that the supplicant daemon is responding to requests. 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if we were able to communicate with the supplicant and 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it returned the expected response to the PING message. 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean pingSupplicant() { 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mService == null) 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.pingSupplicant(); 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 883738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * Get a list of available channels for customized scan. 884738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 885738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * @see {@link WifiChannel} 886738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 887738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * @return the channel list, or null if not available 888738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * @hide 889738803fee62a98f244250996380820c4923e7f7bYuhao Zheng */ 890738803fee62a98f244250996380820c4923e7f7bYuhao Zheng public List<WifiChannel> getChannelList() { 891738803fee62a98f244250996380820c4923e7f7bYuhao Zheng try { 892738803fee62a98f244250996380820c4923e7f7bYuhao Zheng return mService.getChannelList(); 893738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } catch (RemoteException e) { 894738803fee62a98f244250996380820c4923e7f7bYuhao Zheng return null; 895738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } 896738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } 897738803fee62a98f244250996380820c4923e7f7bYuhao Zheng 89873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /* Keep this list in sync with wifi_hal.h */ 89973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 90073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_INFRA = 0x0001; // Basic infrastructure mode 90173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 90273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_INFRA_5G = 0x0002; // Support for 5 GHz Band 90373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 90473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_PASSPOINT = 0x0004; // Support for GAS/ANQP 90573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 90673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_P2P = 0x0008; // Wifi-Direct 90773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 90873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_MOBILE_HOTSPOT = 0x0010; // Soft AP 90973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 91073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_SCANNER = 0x0020; // WifiScanner APIs 91173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 91273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_NAN = 0x0040; // Neighbor Awareness Networking 91373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 91473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_D2D_RTT = 0x0080; // Device-to-device RTT 91573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 91673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_D2AP_RTT = 0x0100; // Device-to-AP RTT 91773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 91873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_BATCH_SCAN = 0x0200; // Batched Scan (deprecated) 91973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 92073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_PNO = 0x0400; // Preferred network offload 92173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 92273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_ADDITIONAL_STA = 0x0800; // Support for two STAs 92373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 92473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_TDLS = 0x1000; // Tunnel directed link setup 92573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 92673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_TDLS_OFFCHANNEL = 0x2000; // Support for TDLS off channel 92773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 92873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_EPR = 0x4000; // Enhanced power reporting 929ddfd35dbf9aab0ff196e1d7046ebe6bcd972c7a5Pierre Vandwalle /** @hide */ 930ddfd35dbf9aab0ff196e1d7046ebe6bcd972c7a5Pierre Vandwalle public static final int WIFI_FEATURE_AP_STA = 0x8000; // Support for AP STA Concurrency 931ddfd35dbf9aab0ff196e1d7046ebe6bcd972c7a5Pierre Vandwalle /** @hide */ 932ddfd35dbf9aab0ff196e1d7046ebe6bcd972c7a5Pierre Vandwalle public static final int WIFI_FEATURE_LINK_LAYER_STATS = 0x10000; // Link layer stats collection 933ddfd35dbf9aab0ff196e1d7046ebe6bcd972c7a5Pierre Vandwalle /** @hide */ 934ddfd35dbf9aab0ff196e1d7046ebe6bcd972c7a5Pierre Vandwalle public static final int WIFI_FEATURE_LOGGER = 0x20000; // WiFi Logger 935ddfd35dbf9aab0ff196e1d7046ebe6bcd972c7a5Pierre Vandwalle /** @hide */ 936ddfd35dbf9aab0ff196e1d7046ebe6bcd972c7a5Pierre Vandwalle public static final int WIFI_FEATURE_HAL_EPNO = 0x40000; // WiFi PNO enhanced 93773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 93873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande private int getSupportedFeatures() { 93973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande try { 94073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return mService.getSupportedFeatures(); 94173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } catch (RemoteException e) { 94273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return 0; 94373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 94473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 94573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 94673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande private boolean isFeatureSupported(int feature) { 94773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return (getSupportedFeatures() & feature) == feature; 94873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 94973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 95073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports 5 GHz band 95173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 95273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean is5GHzBandSupported() { 95373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_INFRA_5G); 95473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 95573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 95673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 95773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports passpoint 95873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 95973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 96073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isPasspointSupported() { 96173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_PASSPOINT); 96273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 96373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 96473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 96573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports WifiP2pManager (Wi-Fi Direct) 96673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 96773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isP2pSupported() { 96873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_P2P); 96973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 97073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 97173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 97273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports portable Wi-Fi hotspot 97373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 97473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 97573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande @SystemApi 97673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isPortableHotspotSupported() { 97773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_MOBILE_HOTSPOT); 97873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 97973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 98073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 98173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports WifiScanner APIs 98273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 98373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 98473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande @SystemApi 98573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isWifiScannerSupported() { 98673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_SCANNER); 98773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 98873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 98973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 99073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports Neighbour Awareness Network APIs 99173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 99273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 99373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isNanSupported() { 99473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_NAN); 99573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 99673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 99773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 99873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports Device-to-device RTT 99973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 100073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 100173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande @SystemApi 100273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isDeviceToDeviceRttSupported() { 100373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_D2D_RTT); 100473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 100573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 100673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 100773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports Device-to-AP RTT 100873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 100973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande @SystemApi 101073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isDeviceToApRttSupported() { 101173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_D2AP_RTT); 101273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 101373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 101473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 101573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports offloaded connectivity scan 101673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 101773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isPreferredNetworkOffloadSupported() { 101873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_PNO); 101973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 102073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 102173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 102273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports multiple simultaneous connections 102373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 102473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 102573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isAdditionalStaSupported() { 102673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_ADDITIONAL_STA); 102773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 102873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 102973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 103073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports Tunnel Directed Link Setup 103173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 103273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isTdlsSupported() { 103373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_TDLS); 103473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 103573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 103673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 103773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports Off Channel Tunnel Directed Link Setup 103873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 103973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 104073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isOffChannelTdlsSupported() { 104173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_TDLS_OFFCHANNEL); 104273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 104373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 104473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 104573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports advanced power/performance counters 104673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 104773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isEnhancedPowerReportingSupported() { 1048ddfd35dbf9aab0ff196e1d7046ebe6bcd972c7a5Pierre Vandwalle return isFeatureSupported(WIFI_FEATURE_LINK_LAYER_STATS); 104973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 105073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 105173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 105273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * Return the record of {@link WifiActivityEnergyInfo} object that 105373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * has the activity and energy info. This can be used to ascertain what 105473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * the controller has been up to, since the last sample. 105573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @param updateType Type of info, cached vs refreshed. 105673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * 105773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return a record with {@link WifiActivityEnergyInfo} or null if 105873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * report is unavailable or unsupported 105973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 106073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 106173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public WifiActivityEnergyInfo getControllerActivityEnergyInfo(int updateType) { 106273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande if (mService == null) return null; 106373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande try { 106473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande WifiActivityEnergyInfo record; 106573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande if (!isEnhancedPowerReportingSupported()) { 106673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return null; 106773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 106873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande synchronized(this) { 106973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande record = mService.reportActivityInfo(); 107020903b392b78e5f3dc0ce8b782154adc77853468Pierre Vandwalle if (record != null && record.isValid()) { 107173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return record; 107273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } else { 107373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return null; 107473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 107573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 107673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } catch (RemoteException e) { 107773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande Log.e(TAG, "getControllerActivityEnergyInfo: " + e); 107873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 107973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return null; 108073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 108173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 1082738803fee62a98f244250996380820c4923e7f7bYuhao Zheng /** 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Request a scan for access points. Returns immediately. The availability 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the results is made known later by means of an asynchronous event sent 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on completion of the scan. 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded, i.e., the scan was initiated 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1088a5ec95cdb1a7d2024249277dff1f99d0046c9b56Mike Lockwood public boolean startScan() { 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1090738803fee62a98f244250996380820c4923e7f7bYuhao Zheng mService.startScan(null, null); 10916942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie return true; 10926942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie } catch (RemoteException e) { 10936942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie return false; 10946942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie } 10956942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie } 10966942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie 10976942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie /** @hide */ 1098c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie @SystemApi 10996942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie public boolean startScan(WorkSource workSource) { 11006942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie try { 1101738803fee62a98f244250996380820c4923e7f7bYuhao Zheng mService.startScan(null, workSource); 1102738803fee62a98f244250996380820c4923e7f7bYuhao Zheng return true; 1103738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } catch (RemoteException e) { 1104738803fee62a98f244250996380820c4923e7f7bYuhao Zheng return false; 1105738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } 1106738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } 1107738803fee62a98f244250996380820c4923e7f7bYuhao Zheng 1108738803fee62a98f244250996380820c4923e7f7bYuhao Zheng /** 1109da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle * startLocationRestrictedScan() 1110da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle * Trigger a scan which will not make use of DFS channels and is thus not suitable for 1111da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle * establishing wifi connection. 1112da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle * @hide 1113da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle */ 1114da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle @SystemApi 1115da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle public boolean startLocationRestrictedScan(WorkSource workSource) { 1116da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle try { 1117da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle mService.startLocationRestrictedScan(workSource); 1118da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle return true; 1119da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle } catch (RemoteException e) { 1120da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle return false; 1121da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle } 1122da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle } 1123da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle 1124da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle /** 1125738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * Request a scan for access points in specified channel list. Each channel is specified by its 1126738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * frequency in MHz, e.g. "5500" (do NOT include "DFS" even though it is). The availability of 1127738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * the results is made known later in the same way as {@link #startScan}. 1128738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 1129738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * Note: 1130738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 1131738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 1. Customized scan is for non-connection purposes, i.e. it won't trigger a wifi connection 1132738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * even though it finds some known networks. 1133738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 1134738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 2. Customized scan result may include access points that is not specified in the channel 1135738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * list. An app will need to do frequency filtering if it wants to get pure results for the 1136738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * channel list it specified. 1137738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 1138738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * @hide 1139738803fee62a98f244250996380820c4923e7f7bYuhao Zheng */ 1140738803fee62a98f244250996380820c4923e7f7bYuhao Zheng public boolean startCustomizedScan(ScanSettings requested) { 1141738803fee62a98f244250996380820c4923e7f7bYuhao Zheng try { 1142738803fee62a98f244250996380820c4923e7f7bYuhao Zheng mService.startScan(requested, null); 1143738803fee62a98f244250996380820c4923e7f7bYuhao Zheng return true; 1144738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } catch (RemoteException e) { 1145738803fee62a98f244250996380820c4923e7f7bYuhao Zheng return false; 1146738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } 1147738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } 1148738803fee62a98f244250996380820c4923e7f7bYuhao Zheng 1149738803fee62a98f244250996380820c4923e7f7bYuhao Zheng /** @hide */ 1150738803fee62a98f244250996380820c4923e7f7bYuhao Zheng public boolean startCustomizedScan(ScanSettings requested, WorkSource workSource) { 1151738803fee62a98f244250996380820c4923e7f7bYuhao Zheng try { 1152738803fee62a98f244250996380820c4923e7f7bYuhao Zheng mService.startScan(requested, workSource); 1153e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff return true; 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11600451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * Request a batched scan for access points. To end your requested batched scan, 11610451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * call stopBatchedScan with the same Settings. 11620451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * 11630451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * If there are mulitple requests for batched scans, the more demanding settings will 11640451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * take precidence. 11650451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * 11660451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @param requested {@link BatchedScanSettings} the scan settings requested. 11670451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @return false on known error 11680451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @hide 11690451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt */ 11700451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt public boolean requestBatchedScan(BatchedScanSettings requested) { 11710451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt try { 1172a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt return mService.requestBatchedScan(requested, new Binder(), null); 1173a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } catch (RemoteException e) { return false; } 1174a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 1175a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt /** @hide */ 1176a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt public boolean requestBatchedScan(BatchedScanSettings requested, WorkSource workSource) { 1177a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt try { 1178a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt return mService.requestBatchedScan(requested, new Binder(), workSource); 11790451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } catch (RemoteException e) { return false; } 11800451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } 11810451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt 11820451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt /** 11830451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * Check if the Batched Scan feature is supported. 11840451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * 11850451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @return false if not supported. 11860451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @hide 11870451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt */ 1188c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie @SystemApi 11890451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt public boolean isBatchedScanSupported() { 11900451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt try { 11910451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt return mService.isBatchedScanSupported(); 11920451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } catch (RemoteException e) { return false; } 11930451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } 11940451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt 11950451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt /** 11960451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * End a requested batch scan for this applicaiton. Note that batched scan may 11970451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * still occur if other apps are using them. 1198126755cf41710d52554d747f3d3667eb0a3c2694Robert Greenwalt * 1199126755cf41710d52554d747f3d3667eb0a3c2694Robert Greenwalt * @param requested {@link BatchedScanSettings} the scan settings you previously requested 1200126755cf41710d52554d747f3d3667eb0a3c2694Robert Greenwalt * and now wish to stop. A value of null here will stop all scans requested by the 1201126755cf41710d52554d747f3d3667eb0a3c2694Robert Greenwalt * calling App. 12020451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @hide 12030451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt */ 12040451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt public void stopBatchedScan(BatchedScanSettings requested) { 12050451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt try { 120682f4218c0d5dbc10404db8cf31f0284140d80175Robert Greenwalt mService.stopBatchedScan(requested); 12070451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } catch (RemoteException e) {} 12080451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } 12090451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt 12100451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt /** 12110451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * Retrieve the latest batched scan result. This should be called immediately after 12120451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * {@link BATCHED_SCAN_RESULTS_AVAILABLE_ACTION} is received. 12130451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @hide 12140451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt */ 1215c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie @SystemApi 12160451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt public List<BatchedScanResult> getBatchedScanResults() { 12170451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt try { 121895d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn return mService.getBatchedScanResults(mContext.getOpPackageName()); 12190451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } catch (RemoteException e) { 12200451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt return null; 12210451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } 12220451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } 12230451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt 12240451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt /** 12258e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * Force a re-reading of batched scan results. This will attempt 12268e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * to read more information from the chip, but will do so at the expense 12278e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * of previous data. Rate limited to the current scan frequency. 12288e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * 12298e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * pollBatchedScan will always wait 1 period from the start of the batch 12308e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * before trying to read from the chip, so if your #scans/batch == 1 this will 12318e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * have no effect. 12328e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * 12338e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * If you had already waited 1 period before calling, this should have 12348e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * immediate (though async) effect. 12358e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * 12368e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * If you call before that 1 period is up this will set up a timer and fetch 12378e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * results when the 1 period is up. 12388e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * 12398e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * Servicing a pollBatchedScan request (immediate or after timed delay) starts a 12408e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * new batch, so if you were doing 10 scans/batch and called in the 4th scan, you 12418e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * would get data in the 4th and then again 10 scans later. 12428e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * @hide 12438e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt */ 12448e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt public void pollBatchedScan() { 12458e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt try { 12468e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt mService.pollBatchedScan(); 12478e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt } catch (RemoteException e) { } 12488e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt } 12498e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt 12508e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt /** 1251b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales * Creates a configuration token describing the network referenced by {@code netId} 1252b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales * of MIME type application/vnd.wfa.wsc. Can be used to configure WiFi networks via NFC. 1253b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales * 1254b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales * @return hex-string encoded configuration token 1255b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales * @hide 1256b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales */ 1257b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales public String getWpsNfcConfigurationToken(int netId) { 1258b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales try { 1259b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales return mService.getWpsNfcConfigurationToken(netId); 1260b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales } catch (RemoteException e) { 1261b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales return null; 1262b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales } 1263b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales } 1264b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales 1265b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales /** 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return dynamic information about the current Wi-Fi connection, if any is active. 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the Wi-Fi information, contained in {@link WifiInfo}. 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public WifiInfo getConnectionInfo() { 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.getConnectionInfo(); 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the results of the latest access point scan. 1279cb13aebfec313a3433ed0f53cc2e3b6dbaf888d0Fyodor Kupolov * @return the list of access points found in the most recent scan. An app must hold 1280cb13aebfec313a3433ed0f53cc2e3b6dbaf888d0Fyodor Kupolov * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION ACCESS_COARSE_LOCATION} or 1281cb13aebfec313a3433ed0f53cc2e3b6dbaf888d0Fyodor Kupolov * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION ACCESS_FINE_LOCATION} permission 1282cb13aebfec313a3433ed0f53cc2e3b6dbaf888d0Fyodor Kupolov * in order to get valid results. 12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public List<ScanResult> getScanResults() { 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 128695d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn return mService.getScanResults(mContext.getOpPackageName()); 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12931ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * Check if scanning is always available. 12941ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * 12951ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * If this return {@code true}, apps can issue {@link #startScan} and fetch scan results 12961ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * even when Wi-Fi is turned off. 12971ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * 12981ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * To change this setting, see {@link #ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE}. 12991ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff */ 13007ea33eac4b57aabf9326d60f52e3ed85217ac846Irfan Sheriff public boolean isScanAlwaysAvailable() { 13011ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff try { 13027ea33eac4b57aabf9326d60f52e3ed85217ac846Irfan Sheriff return mService.isScanAlwaysAvailable(); 13031ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff } catch (RemoteException e) { 13041ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff return false; 13051ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff } 13061ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff } 13071ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff 13081ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff /** 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Tell the supplicant to persist the current list of configured networks. 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Note: It is possible for this method to change the network IDs of 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * existing networks. You should assume the network IDs can be different 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * after calling this method. 1314227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded 13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean saveConfiguration() { 13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.saveConfiguration(); 13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1326ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff * Set the country code. 1327ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff * @param countryCode country code in ISO 3166 format. 1328ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff * @param persist {@code true} if this needs to be remembered 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1330ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff * @hide 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1332ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff public void setCountryCode(String country, boolean persist) { 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1334ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff mService.setCountryCode(country, persist); 1335ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff } catch (RemoteException e) { } 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1339b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe * get the country code. 1340b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe * @return the country code in ISO 3166 format. 1341b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe * 1342b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe * @hide 1343b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe */ 1344b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe public String getCountryCode() { 1345b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe try { 1346b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe String country = mService.getCountryCode(); 1347b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe return(country); 1348b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe } catch (RemoteException e) { 1349b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe return null; 1350b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe } 1351b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe } 1352b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe 1353b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe /** 135436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * Set the operational frequency band. 135536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @param band One of 135636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * {@link #WIFI_FREQUENCY_BAND_AUTO}, 135736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * {@link #WIFI_FREQUENCY_BAND_5GHZ}, 135836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * {@link #WIFI_FREQUENCY_BAND_2GHZ}, 135936f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @param persist {@code true} if this needs to be remembered 136036f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @hide 136136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff */ 136236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff public void setFrequencyBand(int band, boolean persist) { 136336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff try { 136436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff mService.setFrequencyBand(band, persist); 136536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } catch (RemoteException e) { } 136636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } 136736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff 136836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff /** 136936f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * Get the operational frequency band. 137036f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @return One of 137136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * {@link #WIFI_FREQUENCY_BAND_AUTO}, 137236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * {@link #WIFI_FREQUENCY_BAND_5GHZ}, 137336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * {@link #WIFI_FREQUENCY_BAND_2GHZ} or 137436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * {@code -1} on failure. 137536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @hide 137636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff */ 137736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff public int getFrequencyBand() { 137836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff try { 137936f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff return mService.getFrequencyBand(); 138036f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } catch (RemoteException e) { 138136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff return -1; 138236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } 138336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } 138436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff 138536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff /** 138636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * Check if the chipset supports dual frequency band (2.4 GHz and 5 GHz) 138736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @return {@code true} if supported, {@code false} otherwise. 138836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @hide 138936f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff */ 139036f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff public boolean isDualBandSupported() { 139136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff try { 139236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff return mService.isDualBandSupported(); 139336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } catch (RemoteException e) { 139436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff return false; 139536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } 139636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } 139736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff 139836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff /** 13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the DHCP-assigned addresses from the last successful DHCP request, 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if any. 14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the DHCP information 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public DhcpInfo getDhcpInfo() { 14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.getDhcpInfo(); 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Enable or disable Wi-Fi. 14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param enabled {@code true} to enable, {@code false} to disable. 14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeds (or if the existing state 14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is the same as the requested state). 14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean setWifiEnabled(boolean enabled) { 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.setWifiEnabled(enabled); 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets the Wi-Fi enabled state. 14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return One of {@link #WIFI_STATE_DISABLED}, 14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #WIFI_STATE_DISABLING}, {@link #WIFI_STATE_ENABLED}, 14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #WIFI_STATE_ENABLING}, {@link #WIFI_STATE_UNKNOWN} 14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isWifiEnabled() 14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getWifiState() { 14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.getWifiEnabledState(); 14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return WIFI_STATE_UNKNOWN; 14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1439227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1441227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * Return whether Wi-Fi is enabled or disabled. 14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if Wi-Fi is enabled 14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getWifiState() 14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isWifiEnabled() { 14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getWifiState() == WIFI_STATE_ENABLED; 14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1448227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1450f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * Return TX packet counter, for CTS test of WiFi watchdog. 1451f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * @param listener is the interface to receive result 1452f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * 1453f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * @hide for CTS test only 1454f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng */ 1455f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public void getTxPacketCount(TxPacketCountListener listener) { 1456f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng validateChannel(); 1457302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(RSSI_PKTCNT_FETCH, 0, putListener(listener)); 1458f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng } 1459f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng 1460f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** 14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Calculates the level of the signal. This should be used any time a signal 14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is being shown. 1463227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rssi The power of the signal measured in RSSI. 14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param numLevels The number of levels to consider in the calculated 14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * level. 14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A level of the signal, given in the range of 0 to numLevels-1 14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (both inclusive). 14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static int calculateSignalLevel(int rssi, int numLevels) { 14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (rssi <= MIN_RSSI) { 14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (rssi >= MAX_RSSI) { 14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return numLevels - 1; 14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 14764c0d81b8add0372cc7194b17cc6d2bfc58baacd1Daniel Sandler float inputRange = (MAX_RSSI - MIN_RSSI); 14774c0d81b8add0372cc7194b17cc6d2bfc58baacd1Daniel Sandler float outputRange = (numLevels - 1); 14784c0d81b8add0372cc7194b17cc6d2bfc58baacd1Daniel Sandler return (int)((float)(rssi - MIN_RSSI) * outputRange / inputRange); 14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1481227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Compares two signal strengths. 1484227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rssiA The power of the first signal measured in RSSI. 14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rssiB The power of the second signal measured in RSSI. 14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns <0 if the first signal is weaker than the second signal, 14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 0 if the two signals have the same strength, and >0 if the first 14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * signal is stronger than the second signal. 14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static int compareSignalLevel(int rssiA, int rssiB) { 14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return rssiA - rssiB; 14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14965321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Start AccessPoint mode with the specified 14975321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * configuration. If the radio is already running in 14985321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * AP mode, update the new configuration 14995321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Note that starting in access point mode disables station 15005321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * mode operation 15015321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @param wifiConfig SSID, security and channel details as 15025321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * part of WifiConfiguration 15035321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @return {@code true} if the operation succeeds, {@code false} otherwise 15045321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 15055321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide Dont open up yet 15065321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 15075321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff public boolean setWifiApEnabled(WifiConfiguration wifiConfig, boolean enabled) { 15085321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff try { 1509ffcea7ae7316ab748a49f5e8f6c6798356f35719Irfan Sheriff mService.setWifiApEnabled(wifiConfig, enabled); 1510ffcea7ae7316ab748a49f5e8f6c6798356f35719Irfan Sheriff return true; 15115321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } catch (RemoteException e) { 15125321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff return false; 15135321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } 15145321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } 15155321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff 15165321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 15175321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Gets the Wi-Fi enabled state. 15185321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @return One of {@link #WIFI_AP_STATE_DISABLED}, 15195321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * {@link #WIFI_AP_STATE_DISABLING}, {@link #WIFI_AP_STATE_ENABLED}, 15205321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * {@link #WIFI_AP_STATE_ENABLING}, {@link #WIFI_AP_STATE_FAILED} 15215321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #isWifiApEnabled() 15225321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 15235321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide Dont open yet 15245321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 15255321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff public int getWifiApState() { 15265321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff try { 15275321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff return mService.getWifiApEnabledState(); 15285321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } catch (RemoteException e) { 15295321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff return WIFI_AP_STATE_FAILED; 15305321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } 15315321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } 15325321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff 15335321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 15345321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Return whether Wi-Fi AP is enabled or disabled. 15355321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @return {@code true} if Wi-Fi AP is enabled 15365321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #getWifiApState() 15375321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 15385321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide Dont open yet 15395321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 15405321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff public boolean isWifiApEnabled() { 15415321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff return getWifiApState() == WIFI_AP_STATE_ENABLED; 15425321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } 15435321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff 15445321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 15459ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff * Gets the Wi-Fi AP Configuration. 15469ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff * @return AP details in WifiConfiguration 15479ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff * 15489ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff * @hide Dont open yet 15499ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff */ 15509ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff public WifiConfiguration getWifiApConfiguration() { 15519ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff try { 15529ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff return mService.getWifiApConfiguration(); 15539ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff } catch (RemoteException e) { 15549ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff return null; 15559ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff } 15569ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff } 15579ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff 15589ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff /** 1559e9b056f8860296a08f93f4b7d2a0971c746c227bJan Nordqvist * Builds a WifiConfiguration from Hotspot 2.0 MIME file. 1560e9b056f8860296a08f93f4b7d2a0971c746c227bJan Nordqvist * @return AP details in WifiConfiguration 1561e9b056f8860296a08f93f4b7d2a0971c746c227bJan Nordqvist * 1562e9b056f8860296a08f93f4b7d2a0971c746c227bJan Nordqvist * @hide Dont open yet 1563e9b056f8860296a08f93f4b7d2a0971c746c227bJan Nordqvist */ 1564e9b056f8860296a08f93f4b7d2a0971c746c227bJan Nordqvist public WifiConfiguration buildWifiConfig(String uriString, String mimeType, byte[] data) { 1565e9b056f8860296a08f93f4b7d2a0971c746c227bJan Nordqvist try { 1566e9b056f8860296a08f93f4b7d2a0971c746c227bJan Nordqvist return mService.buildWifiConfig(uriString, mimeType, data); 1567e9b056f8860296a08f93f4b7d2a0971c746c227bJan Nordqvist } catch (RemoteException e) { 15689ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff return null; 15699ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff } 15709ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff } 15719ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff 15729ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff /** 157317b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff * Sets the Wi-Fi AP Configuration. 157417b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff * @return {@code true} if the operation succeeded, {@code false} otherwise 157517b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff * 157617b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff * @hide Dont open yet 157717b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff */ 157817b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff public boolean setWifiApConfiguration(WifiConfiguration wifiConfig) { 157917b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff try { 158017b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff mService.setWifiApConfiguration(wifiConfig); 158117b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff return true; 158217b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff } catch (RemoteException e) { 158317b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff return false; 158417b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff } 158517b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff } 158617b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff 15870d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff /** 15880d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * Start the driver and connect to network. 15890d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 15900d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * This function will over-ride WifiLock and device idle status. For example, 15910d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * even if the device is idle or there is only a scan-only lock held, 15920d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * a start wifi would mean that wifi connection is kept active until 15930d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * a stopWifi() is sent. 15940d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 15950d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * This API is used by WifiStateTracker 15960d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 15970d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @return {@code true} if the operation succeeds else {@code false} 15980d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @hide 15990d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff */ 16000d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff public boolean startWifi() { 16010d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff try { 16020d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff mService.startWifi(); 16030d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return true; 16040d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } catch (RemoteException e) { 16050d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return false; 16060d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 16070d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 16080d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff 16090d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff /** 16100d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * Disconnect from a network (if any) and stop the driver. 16110d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 16120d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * This function will over-ride WifiLock and device idle status. Wi-Fi 16130d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * stays inactive until a startWifi() is issued. 16140d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 16150d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * This API is used by WifiStateTracker 16160d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 16170d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @return {@code true} if the operation succeeds else {@code false} 16180d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @hide 16190d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff */ 16200d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff public boolean stopWifi() { 16210d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff try { 16220d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff mService.stopWifi(); 16230d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return true; 16240d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } catch (RemoteException e) { 16250d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return false; 16260d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 16270d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 16280d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff 16290d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff /** 16300d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * Add a bssid to the supplicant blacklist 16310d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 16320d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * This API is used by WifiWatchdogService 16330d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 16340d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @return {@code true} if the operation succeeds else {@code false} 16350d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @hide 16360d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff */ 16370d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff public boolean addToBlacklist(String bssid) { 16380d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff try { 16390d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff mService.addToBlacklist(bssid); 16400d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return true; 16410d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } catch (RemoteException e) { 16420d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return false; 16430d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 16440d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 16450d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff 16460d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff /** 16470d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * Clear the supplicant blacklist 16480d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 16490d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * This API is used by WifiWatchdogService 16500d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 16510d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @return {@code true} if the operation succeeds else {@code false} 16520d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @hide 16530d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff */ 16540d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff public boolean clearBlacklist() { 16550d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff try { 16560d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff mService.clearBlacklist(); 16570d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return true; 16580d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } catch (RemoteException e) { 16590d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return false; 16600d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 16610d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 16620d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff 166364f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde 166464f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde /** 1665b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * Enable/Disable TDLS on a specific local route. 166664f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde * 1667b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * <p> 1668b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * TDLS enables two wireless endpoints to talk to each other directly 1669b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * without going through the access point that is managing the local 1670b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * network. It saves bandwidth and improves quality of the link. 1671b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * </p> 1672b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * <p> 1673b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * This API enables/disables the option of using TDLS. If enabled, the 1674b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * underlying hardware is free to use TDLS or a hop through the access 1675b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * point. If disabled, existing TDLS session is torn down and 1676b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * hardware is restricted to use access point for transferring wireless 1677b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * packets. Default value for all routes is 'disabled', meaning restricted 1678b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * to use access point for transferring packets. 1679b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * </p> 168064f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde * 168164f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde * @param remoteIPAddress IP address of the endpoint to setup TDLS with 168264f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde * @param enable true = setup and false = tear down TDLS 168364f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde */ 1684b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde public void setTdlsEnabled(InetAddress remoteIPAddress, boolean enable) { 168564f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde try { 168664f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde mService.enableTdls(remoteIPAddress.getHostAddress(), enable); 168764f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde } catch (RemoteException e) { 168864f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde // Just ignore the exception 168964f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde } 169064f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde } 169164f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde 169264f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde /** 1693b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * Similar to {@link #setTdlsEnabled(InetAddress, boolean) }, except 1694b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * this version allows you to specify remote endpoint with a MAC address. 169564f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde * @param remoteMacAddress MAC address of the remote endpoint such as 00:00:0c:9f:f2:ab 169664f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde * @param enable true = setup and false = tear down TDLS 169764f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde */ 1698b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde public void setTdlsEnabledWithMacAddress(String remoteMacAddress, boolean enable) { 169964f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde try { 170064f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde mService.enableTdlsWithMacAddress(remoteMacAddress, enable); 170164f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde } catch (RemoteException e) { 170264f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde // Just ignore the exception 170364f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde } 170464f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde } 170564f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde 1706e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff /* TODO: deprecate synchronous API and open up the following API */ 1707ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 1708d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff private static final int BASE = Protocol.BASE_WIFI_MANAGER; 1709d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1710ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff /* Commands to WifiService */ 1711ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff /** @hide */ 1712d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int CONNECT_NETWORK = BASE + 1; 1713d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 1714d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int CONNECT_NETWORK_FAILED = BASE + 2; 1715d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 1716d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int CONNECT_NETWORK_SUCCEEDED = BASE + 3; 1717d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1718d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 1719d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int FORGET_NETWORK = BASE + 4; 1720d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 1721d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int FORGET_NETWORK_FAILED = BASE + 5; 1722ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff /** @hide */ 1723d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int FORGET_NETWORK_SUCCEEDED = BASE + 6; 1724d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1725ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff /** @hide */ 1726d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int SAVE_NETWORK = BASE + 7; 1727ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff /** @hide */ 1728d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int SAVE_NETWORK_FAILED = BASE + 8; 17298dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy /** @hide */ 1730d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int SAVE_NETWORK_SUCCEEDED = BASE + 9; 1731ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 1732ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff /** @hide */ 1733d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int START_WPS = BASE + 10; 1734d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 1735d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int START_WPS_SUCCEEDED = BASE + 11; 1736d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 1737d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int WPS_FAILED = BASE + 12; 173886a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff /** @hide */ 1739d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int WPS_COMPLETED = BASE + 13; 1740d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1741d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 174286a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int CANCEL_WPS = BASE + 14; 174386a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff /** @hide */ 174486a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int CANCEL_WPS_FAILED = BASE + 15; 174586a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff /** @hide */ 174686a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int CANCEL_WPS_SUCCEDED = BASE + 16; 174786a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff 174886a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff /** @hide */ 174986a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int DISABLE_NETWORK = BASE + 17; 1750d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 175186a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int DISABLE_NETWORK_FAILED = BASE + 18; 1752d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 175386a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int DISABLE_NETWORK_SUCCEEDED = BASE + 19; 1754ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 1755f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** @hide */ 1756f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public static final int RSSI_PKTCNT_FETCH = BASE + 20; 1757f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** @hide */ 1758f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public static final int RSSI_PKTCNT_FETCH_SUCCEEDED = BASE + 21; 1759f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** @hide */ 1760f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public static final int RSSI_PKTCNT_FETCH_FAILED = BASE + 22; 1761f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng 1762d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 1763d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Passed with {@link ActionListener#onFailure}. 1764d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Indicates that the operation failed due to an internal error. 176573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 1766d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 176786a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int ERROR = 0; 1768d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1769d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 1770d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Passed with {@link ActionListener#onFailure}. 1771d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Indicates that the operation is already in progress 177273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 1773d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 177486a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int IN_PROGRESS = 1; 1775d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1776d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 1777d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Passed with {@link ActionListener#onFailure}. 1778d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Indicates that the operation failed because the framework is busy and 1779d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * unable to service the request 178073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 1781d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 178286a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int BUSY = 2; 1783d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1784d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /* WPS specific errors */ 1785674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande /** WPS overlap detected */ 178686a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int WPS_OVERLAP_ERROR = 3; 1787674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande /** WEP on WPS is prohibited */ 178886a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int WPS_WEP_PROHIBITED = 4; 1789674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande /** TKIP only prohibited */ 179086a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int WPS_TKIP_ONLY_PROHIBITED = 5; 1791674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande /** Authentication failure on WPS */ 179286a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int WPS_AUTH_FAILURE = 6; 1793674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande /** WPS timed out */ 179486a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int WPS_TIMED_OUT = 7; 1795d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 179610652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde /** 179710652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde * Passed with {@link ActionListener#onFailure}. 179810652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde * Indicates that the operation failed due to invalid inputs 179973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 180010652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde */ 180110652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde public static final int INVALID_ARGS = 8; 180210652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde 1803ae81483a15bb3811cfc221970ea290599b43d4deSky Faber /** 1804ae81483a15bb3811cfc221970ea290599b43d4deSky Faber * Passed with {@link ActionListener#onFailure}. 1805ae81483a15bb3811cfc221970ea290599b43d4deSky Faber * Indicates that the operation failed due to user permissions. 1806ae81483a15bb3811cfc221970ea290599b43d4deSky Faber * @hide 1807ae81483a15bb3811cfc221970ea290599b43d4deSky Faber */ 1808ae81483a15bb3811cfc221970ea290599b43d4deSky Faber public static final int NOT_AUTHORIZED = 9; 1809ae81483a15bb3811cfc221970ea290599b43d4deSky Faber 181073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 181173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * Interface for callback invocation on an application action 181273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 181373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 1814d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public interface ActionListener { 1815d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** The operation succeeded */ 1816d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public void onSuccess(); 1817d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 1818d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * The operation failed 1819d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param reason The reason for failure could be one of 1820d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * {@link #ERROR}, {@link #IN_PROGRESS} or {@link #BUSY} 1821d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 1822d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public void onFailure(int reason); 1823d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1824d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1825674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande /** Interface for callback invocation on a start WPS action */ 182673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static abstract class WpsCallback { 1827d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** WPS start succeeded */ 182873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public abstract void onStarted(String pin); 1829d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1830d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** WPS operation completed succesfully */ 183173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public abstract void onSucceeded(); 1832d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1833d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 1834d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * WPS operation failed 1835d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param reason The reason for failure could be one of 183673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * {@link #WPS_TKIP_ONLY_PROHIBITED}, {@link #WPS_OVERLAP_ERROR}, 183773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * {@link #WPS_WEP_PROHIBITED}, {@link #WPS_TIMED_OUT} or {@link #WPS_AUTH_FAILURE} 183873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * and some generic errors. 1839d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 184073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public abstract void onFailed(int reason); 1841d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1842d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1843f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** Interface for callback invocation on a TX packet count poll action {@hide} */ 1844f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public interface TxPacketCountListener { 1845f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** 1846f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * The operation succeeded 1847f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * @param count TX packet counter 1848f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng */ 1849f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public void onSuccess(int count); 1850f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** 1851f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * The operation failed 1852f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * @param reason The reason for failure could be one of 1853f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * {@link #ERROR}, {@link #IN_PROGRESS} or {@link #BUSY} 1854f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng */ 1855f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public void onFailure(int reason); 1856f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng } 1857f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng 1858302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static class ServiceHandler extends Handler { 185988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff ServiceHandler(Looper looper) { 186088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff super(looper); 1861d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1862d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 186388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff @Override 186488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void handleMessage(Message message) { 186588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff Object listener = removeListener(message.arg2); 186688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff switch (message.what) { 186788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED: 186888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (message.arg1 == AsyncChannel.STATUS_SUCCESSFUL) { 1869302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(AsyncChannel.CMD_CHANNEL_FULL_CONNECTION); 187088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } else { 187188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff Log.e(TAG, "Failed to set up channel connection"); 187288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff // This will cause all further async API calls on the WifiManager 187388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff // to fail and throw an exception 1874302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel = null; 187588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 1876302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sConnected.countDown(); 187788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 187888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED: 187988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff // Ignore 188088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 188188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case AsyncChannel.CMD_CHANNEL_DISCONNECTED: 188288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff Log.e(TAG, "Channel connection lost"); 188388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff // This will cause all further async API calls on the WifiManager 188488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff // to fail and throw an exception 1885302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel = null; 1886fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff getLooper().quit(); 188788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 188888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff /* ActionListeners grouped together */ 188988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.CONNECT_NETWORK_FAILED: 189088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.FORGET_NETWORK_FAILED: 189188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.SAVE_NETWORK_FAILED: 189288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.DISABLE_NETWORK_FAILED: 189388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener != null) { 189488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff ((ActionListener) listener).onFailure(message.arg1); 189588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 189688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 189788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff /* ActionListeners grouped together */ 189888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.CONNECT_NETWORK_SUCCEEDED: 189988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.FORGET_NETWORK_SUCCEEDED: 190088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.SAVE_NETWORK_SUCCEEDED: 190188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.DISABLE_NETWORK_SUCCEEDED: 190288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener != null) { 190388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff ((ActionListener) listener).onSuccess(); 190488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 190588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 190688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.START_WPS_SUCCEEDED: 190788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener != null) { 190888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff WpsResult result = (WpsResult) message.obj; 190973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande ((WpsCallback) listener).onStarted(result.pin); 191088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff //Listener needs to stay until completion or failure 1911302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff synchronized(sListenerMapLock) { 1912302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sListenerMap.put(message.arg2, listener); 1913d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 191488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 191588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 191688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.WPS_COMPLETED: 191788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener != null) { 191873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande ((WpsCallback) listener).onSucceeded(); 191988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 192088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 192188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.WPS_FAILED: 192288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener != null) { 192373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande ((WpsCallback) listener).onFailed(message.arg1); 192473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 192573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande break; 192673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande case WifiManager.CANCEL_WPS_SUCCEDED: 192773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande if (listener != null) { 192873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande ((WpsCallback) listener).onSucceeded(); 192973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 193073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande break; 193173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande case WifiManager.CANCEL_WPS_FAILED: 193273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande if (listener != null) { 193373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande ((WpsCallback) listener).onFailed(message.arg1); 193488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 1935f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng break; 1936f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng case WifiManager.RSSI_PKTCNT_FETCH_SUCCEEDED: 1937f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng if (listener != null) { 1938f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng RssiPacketCountInfo info = (RssiPacketCountInfo) message.obj; 1939f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng if (info != null) 1940f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng ((TxPacketCountListener) listener).onSuccess(info.txgood + info.txbad); 1941f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng else 1942f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng ((TxPacketCountListener) listener).onFailure(ERROR); 1943f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng } 1944f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng break; 1945f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng case WifiManager.RSSI_PKTCNT_FETCH_FAILED: 1946f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng if (listener != null) { 1947f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng ((TxPacketCountListener) listener).onFailure(message.arg1); 1948f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng } 194988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 195088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff default: 195188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff //ignore 195288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 1953d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1954d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 195588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 1956d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1957302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static int putListener(Object listener) { 195888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener == null) return INVALID_KEY; 195988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff int key; 1960302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff synchronized (sListenerMapLock) { 196188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff do { 1962302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff key = sListenerKey++; 196388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } while (key == INVALID_KEY); 1964302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sListenerMap.put(key, listener); 1965d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 196688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff return key; 196788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 1968d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1969302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static Object removeListener(int key) { 197088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (key == INVALID_KEY) return null; 1971302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff synchronized (sListenerMapLock) { 1972302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff Object listener = sListenerMap.get(key); 1973302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sListenerMap.remove(key); 197488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff return listener; 1975d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1976d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1977ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 197888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff private void init() { 1979cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff synchronized (sThreadRefLock) { 1980cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff if (++sThreadRefCount == 1) { 1981302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff Messenger messenger = getWifiServiceMessenger(); 1982302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff if (messenger == null) { 1983302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel = null; 1984302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff return; 1985302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff } 1986302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff 1987cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff sHandlerThread = new HandlerThread("WifiManager"); 1988302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel = new AsyncChannel(); 1989302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sConnected = new CountDownLatch(1); 1990302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff 1991cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff sHandlerThread.start(); 1992302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff Handler handler = new ServiceHandler(sHandlerThread.getLooper()); 1993302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.connect(mContext, handler, messenger); 1994302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff try { 1995302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sConnected.await(); 1996302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff } catch (InterruptedException e) { 1997302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff Log.e(TAG, "interrupted wait at init"); 1998302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff } 1999cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff } 2000cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff } 2001d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 2002ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 200388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff private void validateChannel() { 2004302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff if (sAsyncChannel == null) throw new IllegalStateException( 200535bbe27d58ccf01ffd170b0f617a568bc843a49eIrfan Sheriff "No permission to access and change wifi or a bad initialization"); 200688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 200788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff 20081022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti private void initConnectivityManager() { 20091022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti // TODO: what happens if an app calls a WifiManager API before ConnectivityManager is 20101022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti // registered? Can we fix this by starting ConnectivityService before WifiService? 20111022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti if (sCM == null) { 20121022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti sCM = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); 20131022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti if (sCM == null) { 20141022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti throw new IllegalStateException("Bad luck, ConnectivityService not started."); 20151022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti } 20161022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti } 20171022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti } 20181022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti 20191022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti /** 20201022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * A NetworkCallback that pins the process to the first wifi network to connect. 20211022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * 20221022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * We use this to maintain compatibility with pre-M apps that call WifiManager.enableNetwork() 20231022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * to connect to a Wi-Fi network that has no Internet access, and then assume that they will be 20241022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * able to use that network because it's the system default. 20251022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * 20261022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * In order to maintain compatibility with apps that call setProcessDefaultNetwork themselves, 20271022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * we try not to set the default network unless they have already done so, and we try not to 20281022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * clear the default network unless we set it ourselves. 20291022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * 20301022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * This should maintain behaviour that's compatible with L, which would pin the whole system to 20311022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * any wifi network that was created via enableNetwork(..., true) until that network 20321022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * disconnected. 20331022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * 20341022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * Note that while this hack allows network traffic to flow, it is quite limited. For example: 20351022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * 20361022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * 1. setProcessDefaultNetwork only affects this process, so: 20371022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * - Any subprocesses spawned by this process will not be pinned to Wi-Fi. 20381022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * - If this app relies on any other apps on the device also being on Wi-Fi, that won't work 20391022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * either, because other apps on the device will not be pinned. 20401022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * 2. The behaviour of other APIs is not modified. For example: 20411022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * - getActiveNetworkInfo will return the system default network, not Wi-Fi. 20421022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * - There will be no CONNECTIVITY_ACTION broadcasts about TYPE_WIFI. 20431022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * - getProcessDefaultNetwork will not return null, so if any apps are relying on that, they 20441022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * will be surprised as well. 20451022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti */ 20461022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti private class PinningNetworkCallback extends NetworkCallback { 20471022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti private Network mPinnedNetwork; 20481022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti 20491022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti @Override 20501022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti public void onPreCheck(Network network) { 20511022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti if (sCM.getProcessDefaultNetwork() == null && mPinnedNetwork == null) { 20521022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti sCM.setProcessDefaultNetwork(network); 20531022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti mPinnedNetwork = network; 20541022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti Log.d(TAG, "Wifi alternate reality enabled on network " + network); 20551022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti } 20561022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti } 20571022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti 20581022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti @Override 20591022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti public void onLost(Network network) { 20601022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti if (network.equals(mPinnedNetwork) && network.equals(sCM.getProcessDefaultNetwork())) { 20611022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti sCM.setProcessDefaultNetwork(null); 20621022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti Log.d(TAG, "Wifi alternate reality disabled on network " + network); 20631022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti mPinnedNetwork = null; 20641022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti unregisterPinningNetworkCallback(); 20651022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti } 20661022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti } 20671022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti } 20681022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti 20691022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti private void registerPinningNetworkCallback() { 20701022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti initConnectivityManager(); 20711022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti synchronized (sCM) { 20721022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti if (mNetworkCallback == null) { 20731022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti // TODO: clear all capabilities. 20741022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti NetworkRequest request = new NetworkRequest.Builder() 20751022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) 20761022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) 20771022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti .build(); 20781022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti mNetworkCallback = new PinningNetworkCallback(); 2079fa57c489f621cd10add639cf7df59f630a7f41a4Lorenzo Colitti try { 2080fa57c489f621cd10add639cf7df59f630a7f41a4Lorenzo Colitti sCM.registerNetworkCallback(request, mNetworkCallback); 2081fa57c489f621cd10add639cf7df59f630a7f41a4Lorenzo Colitti } catch (SecurityException e) { 2082fa57c489f621cd10add639cf7df59f630a7f41a4Lorenzo Colitti Log.d(TAG, "Failed to register network callback", e); 2083fa57c489f621cd10add639cf7df59f630a7f41a4Lorenzo Colitti } 20841022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti } 20851022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti } 20861022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti } 20871022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti 20881022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti private void unregisterPinningNetworkCallback() { 20891022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti initConnectivityManager(); 20901022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti synchronized (sCM) { 20911022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti if (mNetworkCallback != null) { 2092fa57c489f621cd10add639cf7df59f630a7f41a4Lorenzo Colitti try { 2093fa57c489f621cd10add639cf7df59f630a7f41a4Lorenzo Colitti sCM.unregisterNetworkCallback(mNetworkCallback); 2094fa57c489f621cd10add639cf7df59f630a7f41a4Lorenzo Colitti } catch (SecurityException e) { 2095fa57c489f621cd10add639cf7df59f630a7f41a4Lorenzo Colitti Log.d(TAG, "Failed to unregister network callback", e); 2096fa57c489f621cd10add639cf7df59f630a7f41a4Lorenzo Colitti } 20971022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti mNetworkCallback = null; 20981022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti } 20991022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti } 21001022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti } 21011022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti 2102e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff /** 2103e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * Connect to a network with the given configuration. The network also 2104e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * gets added to the supplicant configuration. 2105e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 2106e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * For a new network, this function is used instead of a 2107e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * sequence of addNetwork(), enableNetwork(), saveConfiguration() and 2108e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * reconnect() 2109e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 2110e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @param config the set of variables that describe the configuration, 2111e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * contained in a {@link WifiConfiguration} object. 2112d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 211388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 211488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 211588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * 2116e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @hide 2117e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff */ 211888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void connect(WifiConfiguration config, ActionListener listener) { 2119d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (config == null) throw new IllegalArgumentException("config cannot be null"); 212088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 2121ab26407124cf861eacfe7bf0f2a1ef25f4b3a7bdIrfan Sheriff // Use INVALID_NETWORK_ID for arg1 when passing a config object 2122ab26407124cf861eacfe7bf0f2a1ef25f4b3a7bdIrfan Sheriff // arg1 is used to pass network id when the network already exists 2123302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(CONNECT_NETWORK, WifiConfiguration.INVALID_NETWORK_ID, 212488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff putListener(listener), config); 2125e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff } 2126e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff 2127e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff /** 2128e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * Connect to a network with the given networkId. 2129e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 2130e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * This function is used instead of a enableNetwork(), saveConfiguration() and 2131e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * reconnect() 2132e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 2133e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @param networkId the network id identifiying the network in the 2134e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * supplicant configuration list 2135d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 213688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 213788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 2138e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @hide 2139e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff */ 214088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void connect(int networkId, ActionListener listener) { 2141d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (networkId < 0) throw new IllegalArgumentException("Network id cannot be negative"); 214288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 2143302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(CONNECT_NETWORK, networkId, putListener(listener)); 2144e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff } 2145e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff 2146e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff /** 2147e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * Save the given network in the supplicant config. If the network already 2148e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * exists, the configuration is updated. A new network is enabled 2149e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * by default. 2150e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 2151e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * For a new network, this function is used instead of a 2152e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * sequence of addNetwork(), enableNetwork() and saveConfiguration(). 2153e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 2154e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * For an existing network, it accomplishes the task of updateNetwork() 2155e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * and saveConfiguration() 2156e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 2157e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @param config the set of variables that describe the configuration, 2158e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * contained in a {@link WifiConfiguration} object. 2159d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 216088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 216188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 2162e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @hide 2163e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff */ 216488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void save(WifiConfiguration config, ActionListener listener) { 2165d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (config == null) throw new IllegalArgumentException("config cannot be null"); 216688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 2167302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(SAVE_NETWORK, 0, putListener(listener), config); 2168e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff } 2169e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff 2170e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff /** 2171e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * Delete the network in the supplicant config. 2172e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 2173e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * This function is used instead of a sequence of removeNetwork() 2174e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * and saveConfiguration(). 2175e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 2176e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @param config the set of variables that describe the configuration, 2177e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * contained in a {@link WifiConfiguration} object. 2178d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 217988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 218088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 2181e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @hide 2182e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff */ 218388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void forget(int netId, ActionListener listener) { 2184d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (netId < 0) throw new IllegalArgumentException("Network id cannot be negative"); 218588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 2186302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(FORGET_NETWORK, netId, putListener(listener)); 2187d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 2188d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 2189d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 2190d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Disable network 2191d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * 2192d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param netId is the network Id 2193d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 219488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 219588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 2196d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @hide 2197d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 219888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void disable(int netId, ActionListener listener) { 2199d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (netId < 0) throw new IllegalArgumentException("Network id cannot be negative"); 220088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 2201302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(DISABLE_NETWORK, netId, putListener(listener)); 2202e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff } 2203e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff 220417b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff /** 220593e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle * Disable ephemeral Network 220693e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle * 220793e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle * @param SSID, in the format of WifiConfiguration's SSID. 220893e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle * @hide 220993e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle */ 221093e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle public void disableEphemeralNetwork(String SSID) { 221193e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle if (SSID == null) throw new IllegalArgumentException("SSID cannot be null"); 221293e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle try { 221393e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle mService.disableEphemeralNetwork(SSID); 221493e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle } catch (RemoteException e) { 221593e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle } 221693e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle } 221793e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle 221893e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle /** 221902fb46a297c4f645f2a30b574151401dd0978521Irfan Sheriff * Start Wi-fi Protected Setup 22205ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff * 2221c3eb1556446c932b5674adc40af8ff9bfc3a1880Vinit Deshpande * @param config WPS configuration (does not support {@link WpsInfo#LABEL}) 2222d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 222388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 222488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 22255ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff */ 222673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public void startWps(WpsInfo config, WpsCallback listener) { 2227d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (config == null) throw new IllegalArgumentException("config cannot be null"); 222888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 2229302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(START_WPS, 0, putListener(listener), config); 2230f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff } 2231f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff 2232f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff /** 223386a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff * Cancel any ongoing Wi-fi Protected Setup 223486a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff * 223586a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff * @param listener for callbacks on success or failure. Can be null. 223688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 223788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 223886a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff */ 223973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public void cancelWps(WpsCallback listener) { 224088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 2241302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(CANCEL_WPS, 0, putListener(listener)); 224286a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff } 224386a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff 224486a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff /** 2245227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * Get a reference to WifiService handler. This is used by a client to establish 2246227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * an AsyncChannel communication with WifiService 2247227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 2248227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * @return Messenger pointing to the WifiService handler 2249227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * @hide 2250227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff */ 225107573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff public Messenger getWifiServiceMessenger() { 2252227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff try { 225307573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff return mService.getWifiServiceMessenger(); 2254227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff } catch (RemoteException e) { 2255227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff return null; 225635bbe27d58ccf01ffd170b0f617a568bc843a49eIrfan Sheriff } catch (SecurityException e) { 225735bbe27d58ccf01ffd170b0f617a568bc843a49eIrfan Sheriff return null; 2258227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff } 2259227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff } 2260227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 226107573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff 226207573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff /** 22634aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff * Returns the file in which IP and proxy configuration data is stored 22644aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff * @hide 22654aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff */ 22664aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff public String getConfigFile() { 22674aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff try { 22684aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff return mService.getConfigFile(); 22694aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff } catch (RemoteException e) { 22704aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff return null; 22714aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff } 22724aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff } 22734aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff 22744aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff /** 22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Allows an application to keep the Wi-Fi radio awake. 22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Normally the Wi-Fi radio may turn off when the user has not used the device in a while. 2277227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * Acquiring a WifiLock will keep the radio on until the lock is released. Multiple 22789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * applications may hold WifiLocks, and the radio will only be allowed to turn off when no 22799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WifiLocks are held in any application. 2280d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * <p> 22819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Before using a WifiLock, consider carefully if your application requires Wi-Fi access, or 22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * could function over a mobile network, if available. A program that needs to download large 22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * files should hold a WifiLock to ensure that the download will complete, but a program whose 22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * network usage is occasional or low-bandwidth should not hold a WifiLock to avoid adversely 22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * affecting battery life. 2286d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * <p> 22879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Note that WifiLocks cannot override the user-level "Wi-Fi Enabled" setting, nor Airplane 22889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Mode. They simply keep the radio from turning off when Wi-Fi is already on but the device 22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is idle. 2290d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * <p> 2291d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * Any application using a WifiLock must request the {@code android.permission.WAKE_LOCK} 2292d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * permission in an {@code <uses-permission>} element of the application's manifest. 22939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public class WifiLock { 22959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mTag; 22969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final IBinder mBinder; 22979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mRefCount; 22989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLockType; 22999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mRefCounted; 23009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mHeld; 23017e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn private WorkSource mWorkSource; 23029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private WifiLock(int lockType, String tag) { 23049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTag = tag; 23059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLockType = lockType; 23069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBinder = new Binder(); 23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRefCount = 0; 23089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRefCounted = true; 23099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeld = false; 23109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 23139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Locks the Wi-Fi radio on until {@link #release} is called. 23149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 23159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this WifiLock is reference-counted, each call to {@code acquire} will increment the 2316227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * reference count, and the radio will remain locked as long as the reference count is 23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * above zero. 23189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this WifiLock is not reference-counted, the first call to {@code acquire} will lock 23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the radio, but subsequent calls will be ignored. Only one call to {@link #release} 23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be required, regardless of the number of times that {@code acquire} is called. 23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 23239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void acquire() { 23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mBinder) { 23252c02da2bc62c4dfef684ea381be02a4e568b73d0Irfan Sheriff if (mRefCounted ? (++mRefCount == 1) : (!mHeld)) { 23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 23277e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mService.acquireWifiLock(mBinder, mLockType, mTag, mWorkSource); 2328617750604c69e6068f68266d0e30324273aa990eMike Lockwood synchronized (WifiManager.this) { 2329617750604c69e6068f68266d0e30324273aa990eMike Lockwood if (mActiveLockCount >= MAX_ACTIVE_LOCKS) { 2330617750604c69e6068f68266d0e30324273aa990eMike Lockwood mService.releaseWifiLock(mBinder); 2331617750604c69e6068f68266d0e30324273aa990eMike Lockwood throw new UnsupportedOperationException( 2332617750604c69e6068f68266d0e30324273aa990eMike Lockwood "Exceeded maximum number of wifi locks"); 2333617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 2334617750604c69e6068f68266d0e30324273aa990eMike Lockwood mActiveLockCount++; 2335617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 23369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ignore) { 23379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeld = true; 23399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 23449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unlocks the Wi-Fi radio, allowing it to turn off when the device is idle. 23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 23469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this WifiLock is reference-counted, each call to {@code release} will decrement the 23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * reference count, and the radio will be unlocked only when the reference count reaches 23489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * zero. If the reference count goes below zero (that is, if {@code release} is called 23499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a greater number of times than {@link #acquire}), an exception is thrown. 23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this WifiLock is not reference-counted, the first call to {@code release} (after 23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the radio was locked using {@link #acquire}) will unlock the radio, and subsequent 23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * calls will be ignored. 23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void release() { 23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mBinder) { 23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRefCounted ? (--mRefCount == 0) : (mHeld)) { 23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.releaseWifiLock(mBinder); 2360617750604c69e6068f68266d0e30324273aa990eMike Lockwood synchronized (WifiManager.this) { 2361617750604c69e6068f68266d0e30324273aa990eMike Lockwood mActiveLockCount--; 2362617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ignore) { 23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeld = false; 23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRefCount < 0) { 23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("WifiLock under-locked " + mTag); 23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Controls whether this is a reference-counted or non-reference-counted WifiLock. 23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reference-counted WifiLocks keep track of the number of calls to {@link #acquire} and 23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #release}, and only allow the radio to sleep when every call to {@link #acquire} 23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * has been balanced with a call to {@link #release}. Non-reference-counted WifiLocks 23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * lock the radio whenever {@link #acquire} is called and it is unlocked, and unlock the 23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * radio whenever {@link #release} is called and it is locked. 23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param refCounted true if this WifiLock should keep a reference count 23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setReferenceCounted(boolean refCounted) { 23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRefCounted = refCounted; 23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Checks whether this WifiLock is currently held. 23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if this WifiLock is held, false otherwise 23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isHeld() { 23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mBinder) { 23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mHeld; 23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23997e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void setWorkSource(WorkSource ws) { 24007e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mBinder) { 24017e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (ws != null && ws.size() == 0) { 24027e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn ws = null; 24037e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 24047e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn boolean changed = true; 24057e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (ws == null) { 24067e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mWorkSource = null; 24077e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } else { 2408a31510e47a0f0c2525702c2f10a85064322a28f2David Christie ws.clearNames(); 2409a31510e47a0f0c2525702c2f10a85064322a28f2David Christie if (mWorkSource == null) { 2410a31510e47a0f0c2525702c2f10a85064322a28f2David Christie changed = mWorkSource != null; 2411a31510e47a0f0c2525702c2f10a85064322a28f2David Christie mWorkSource = new WorkSource(ws); 2412a31510e47a0f0c2525702c2f10a85064322a28f2David Christie } else { 2413a31510e47a0f0c2525702c2f10a85064322a28f2David Christie changed = mWorkSource.diff(ws); 2414a31510e47a0f0c2525702c2f10a85064322a28f2David Christie if (changed) { 2415a31510e47a0f0c2525702c2f10a85064322a28f2David Christie mWorkSource.set(ws); 2416a31510e47a0f0c2525702c2f10a85064322a28f2David Christie } 24177e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 24187e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 24197e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (changed && mHeld) { 24207e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn try { 24217e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mService.updateWifiLockWorkSource(mBinder, mWorkSource); 24227e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } catch (RemoteException e) { 24237e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 24247e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 24257e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 24267e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 24277e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 24289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 24299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String s1, s2, s3; 24309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mBinder) { 24319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s1 = Integer.toHexString(System.identityHashCode(this)); 24329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s2 = mHeld ? "held; " : ""; 24339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRefCounted) { 24349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s3 = "refcounted: refcount = " + mRefCount; 24359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 24369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s3 = "not refcounted"; 24379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "WifiLock{ " + s1 + "; " + s2 + s3 + " }"; 24399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void finalize() throws Throwable { 24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.finalize(); 24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mBinder) { 24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mHeld) { 24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.releaseWifiLock(mBinder); 2449617750604c69e6068f68266d0e30324273aa990eMike Lockwood synchronized (WifiManager.this) { 2450617750604c69e6068f68266d0e30324273aa990eMike Lockwood mActiveLockCount--; 2451617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 24529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ignore) { 24539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates a new WifiLock. 24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 24625876a4273e67271f0eca607af9520f7e5abbe4f3Irfan Sheriff * @param lockType the type of lock to create. See {@link #WIFI_MODE_FULL}, 2463652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * {@link #WIFI_MODE_FULL_HIGH_PERF} and {@link #WIFI_MODE_SCAN_ONLY} for 2464652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * descriptions of the types of Wi-Fi locks. 2465652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * @param tag a tag for the WifiLock to identify it in debugging messages. This string is 2466652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * never shown to the user under normal conditions, but should be descriptive 24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * enough to identify your application and the specific WifiLock within it, if it 24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * holds multiple WifiLocks. 24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a new, unacquired WifiLock with the given tag. 24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see WifiLock 24739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 24749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public WifiLock createWifiLock(int lockType, String tag) { 24759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new WifiLock(lockType, tag); 24769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2477652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff 24789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates a new WifiLock. 24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param tag a tag for the WifiLock to identify it in debugging messages. This string is 24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * never shown to the user under normal conditions, but should be descriptive 24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * enough to identify your application and the specific WifiLock within it, if it 24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * holds multiple WifiLocks. 24859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a new, unacquired WifiLock with the given tag. 24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 24889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see WifiLock 24899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public WifiLock createWifiLock(String tag) { 24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new WifiLock(WIFI_MODE_FULL, tag); 24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24935347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 2494fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 24955347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt /** 2496fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Create a new MulticastLock 24975347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt * 2498fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * @param tag a tag for the MulticastLock to identify it in debugging 249941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * messages. This string is never shown to the user under 250041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * normal conditions, but should be descriptive enough to 250141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * identify your application and the specific MulticastLock 250241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * within it, if it holds multiple MulticastLocks. 25035347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt * 2504fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * @return a new, unacquired MulticastLock with the given tag. 2505fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 2506fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * @see MulticastLock 25075347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt */ 2508fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public MulticastLock createMulticastLock(String tag) { 2509fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt return new MulticastLock(tag); 25105347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 25115347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 25125347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt /** 2513fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Allows an application to receive Wifi Multicast packets. 2514fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Normally the Wifi stack filters out packets not explicitly 2515fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * addressed to this device. Acquring a MulticastLock will 2516fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * cause the stack to receive packets addressed to multicast 2517fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * addresses. Processing these extra packets can cause a noticable 251841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * battery drain and should be disabled when not needed. 25195347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt */ 2520fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public class MulticastLock { 2521fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt private String mTag; 2522fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt private final IBinder mBinder; 252341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt private int mRefCount; 252441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt private boolean mRefCounted; 2525fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt private boolean mHeld; 2526fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 2527fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt private MulticastLock(String tag) { 2528fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt mTag = tag; 2529fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt mBinder = new Binder(); 253041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt mRefCount = 0; 253141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt mRefCounted = true; 2532fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt mHeld = false; 2533fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2534fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 2535fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt /** 2536fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Locks Wifi Multicast on until {@link #release} is called. 2537fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 253841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * If this MulticastLock is reference-counted each call to 253941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * {@code acquire} will increment the reference count, and the 254041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * wifi interface will receive multicast packets as long as the 254141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * reference count is above zero. 254241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * 254341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * If this MulticastLock is not reference-counted, the first call to 254441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * {@code acquire} will turn on the multicast packets, but subsequent 254541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * calls will be ignored. Only one call to {@link #release} will 254641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * be required, regardless of the number of times that {@code acquire} 254741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * is called. 2548fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 2549fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Note that other applications may also lock Wifi Multicast on. 2550fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Only they can relinquish their lock. 2551fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 2552fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Also note that applications cannot leave Multicast locked on. 2553fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * When an app exits or crashes, any Multicast locks will be released. 2554fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt */ 2555fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public void acquire() { 2556fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt synchronized (mBinder) { 25572c02da2bc62c4dfef684ea381be02a4e568b73d0Irfan Sheriff if (mRefCounted ? (++mRefCount == 1) : (!mHeld)) { 2558fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt try { 2559fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt mService.acquireMulticastLock(mBinder, mTag); 2560617750604c69e6068f68266d0e30324273aa990eMike Lockwood synchronized (WifiManager.this) { 2561617750604c69e6068f68266d0e30324273aa990eMike Lockwood if (mActiveLockCount >= MAX_ACTIVE_LOCKS) { 2562617750604c69e6068f68266d0e30324273aa990eMike Lockwood mService.releaseMulticastLock(); 2563617750604c69e6068f68266d0e30324273aa990eMike Lockwood throw new UnsupportedOperationException( 2564617750604c69e6068f68266d0e30324273aa990eMike Lockwood "Exceeded maximum number of wifi locks"); 2565617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 2566617750604c69e6068f68266d0e30324273aa990eMike Lockwood mActiveLockCount++; 2567617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 2568fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } catch (RemoteException ignore) { 2569fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 257041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt mHeld = true; 2571fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2572fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2573fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2574fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 2575fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt /** 2576fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Unlocks Wifi Multicast, restoring the filter of packets 2577fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * not addressed specifically to this device and saving power. 2578fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 257941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * If this MulticastLock is reference-counted, each call to 258041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * {@code release} will decrement the reference count, and the 258141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * multicast packets will only stop being received when the reference 258241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * count reaches zero. If the reference count goes below zero (that 258341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * is, if {@code release} is called a greater number of times than 258441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * {@link #acquire}), an exception is thrown. 258541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * 258641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * If this MulticastLock is not reference-counted, the first call to 258741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * {@code release} (after the radio was multicast locked using 25884a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn * {@link #acquire}) will unlock the multicast, and subsequent calls 258941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * will be ignored. 259041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * 2591fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Note that if any other Wifi Multicast Locks are still outstanding 2592fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * this {@code release} call will not have an immediate effect. Only 2593fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * when all applications have released all their Multicast Locks will 2594fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * the Multicast filter be turned back on. 2595fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 2596fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Also note that when an app exits or crashes all of its Multicast 2597fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Locks will be automatically released. 2598fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt */ 2599fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public void release() { 2600fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt synchronized (mBinder) { 260141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt if (mRefCounted ? (--mRefCount == 0) : (mHeld)) { 2602fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt try { 2603fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt mService.releaseMulticastLock(); 2604617750604c69e6068f68266d0e30324273aa990eMike Lockwood synchronized (WifiManager.this) { 2605617750604c69e6068f68266d0e30324273aa990eMike Lockwood mActiveLockCount--; 2606617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 2607fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } catch (RemoteException ignore) { 2608fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 260941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt mHeld = false; 261041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt } 261141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt if (mRefCount < 0) { 261241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt throw new RuntimeException("MulticastLock under-locked " 261341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt + mTag); 2614fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2615fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2616fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2617fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 2618fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt /** 261941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * Controls whether this is a reference-counted or non-reference- 262041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * counted MulticastLock. 262141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * 262241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * Reference-counted MulticastLocks keep track of the number of calls 262341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * to {@link #acquire} and {@link #release}, and only stop the 262441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * reception of multicast packets when every call to {@link #acquire} 262541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * has been balanced with a call to {@link #release}. Non-reference- 262641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * counted MulticastLocks allow the reception of multicast packets 262741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * whenever {@link #acquire} is called and stop accepting multicast 262841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * packets whenever {@link #release} is called. 262941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * 263041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * @param refCounted true if this MulticastLock should keep a reference 263141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * count 263241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt */ 263341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt public void setReferenceCounted(boolean refCounted) { 263441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt mRefCounted = refCounted; 263541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt } 263641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt 263741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt /** 2638fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Checks whether this MulticastLock is currently held. 2639fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 2640fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * @return true if this MulticastLock is held, false otherwise 2641fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt */ 2642fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public boolean isHeld() { 2643fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt synchronized (mBinder) { 2644fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt return mHeld; 2645fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2646fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2647fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 2648fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public String toString() { 264941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt String s1, s2, s3; 2650fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt synchronized (mBinder) { 2651fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt s1 = Integer.toHexString(System.identityHashCode(this)); 2652fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt s2 = mHeld ? "held; " : ""; 265341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt if (mRefCounted) { 265441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt s3 = "refcounted: refcount = " + mRefCount; 265541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt } else { 265641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt s3 = "not refcounted"; 265741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt } 265841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt return "MulticastLock{ " + s1 + "; " + s2 + s3 + " }"; 2659fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2660fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2661fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 2662fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt @Override 2663fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt protected void finalize() throws Throwable { 2664fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt super.finalize(); 266541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt setReferenceCounted(false); 2666fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt release(); 26675347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 26685347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 26695347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 26705347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt /** 2671fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Check multicast filter status. 26725347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt * 2673fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * @return true if multicast packets are allowed. 26745347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt * 26755347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt * @hide pending API council approval 26765347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt */ 2677fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public boolean isMulticastEnabled() { 26785347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt try { 2679fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt return mService.isMulticastEnabled(); 26805347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } catch (RemoteException e) { 26815347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt return false; 26825347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 26835347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 2684e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt 2685e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt /** 2686e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt * Initialize the multicast filtering to 'on' 2687e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt * @hide no intent to publish 2688e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt */ 2689e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt public boolean initializeMulticastFiltering() { 2690e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt try { 2691e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt mService.initializeMulticastFiltering(); 2692e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt return true; 2693e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt } catch (RemoteException e) { 2694e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt return false; 2695e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt } 2696e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt } 2697da6da0907b28d4704aabbdb1bbeb4300954670d1Irfan Sheriff 2698fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff protected void finalize() throws Throwable { 2699fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff try { 2700cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff synchronized (sThreadRefLock) { 2701302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff if (--sThreadRefCount == 0 && sAsyncChannel != null) { 2702302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.disconnect(); 2703cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff } 2704939caef712f306a1c80ea27e9f41ef6e3ea9e0f1Irfan Sheriff } 2705fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff } finally { 2706fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff super.finalize(); 2707fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff } 2708fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff } 27095fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle 27105fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle /** 27115fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle * Set wifi verbose log. Called from developer settings. 27125fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle * @hide 27135fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle */ 27145fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle public void enableVerboseLogging (int verbose) { 27155fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle try { 27165fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle mService.enableVerboseLogging(verbose); 2717f5af4a972598611c46d4bf169919e23b7375a5a9vandwalle } catch (Exception e) { 2718f5af4a972598611c46d4bf169919e23b7375a5a9vandwalle //ignore any failure here 2719f5af4a972598611c46d4bf169919e23b7375a5a9vandwalle Log.e(TAG, "enableVerboseLogging " + e.toString()); 27205fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } 27215fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } 27225fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle 27235fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle /** 27245fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle * Get the WiFi verbose logging level.This is used by settings 27255fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle * to decide what to show within the picker. 27265fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle * @hide 27275fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle */ 27285fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle public int getVerboseLoggingLevel() { 27295fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle try { 27305fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle return mService.getVerboseLoggingLevel(); 27315fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } catch (RemoteException e) { 27325fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle return 0; 27335fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } 27345fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } 2735d524c78d9358e2fa1e67124468cffa5284870c62vandwalle 2736d524c78d9358e2fa1e67124468cffa5284870c62vandwalle /** 2737d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * Set wifi Aggressive Handover. Called from developer settings. 2738d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * @hide 2739d524c78d9358e2fa1e67124468cffa5284870c62vandwalle */ 2740d524c78d9358e2fa1e67124468cffa5284870c62vandwalle public void enableAggressiveHandover(int enabled) { 2741d524c78d9358e2fa1e67124468cffa5284870c62vandwalle try { 2742d524c78d9358e2fa1e67124468cffa5284870c62vandwalle mService.enableAggressiveHandover(enabled); 2743d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } catch (RemoteException e) { 2744d524c78d9358e2fa1e67124468cffa5284870c62vandwalle 2745d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 2746d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 2747d524c78d9358e2fa1e67124468cffa5284870c62vandwalle 2748d524c78d9358e2fa1e67124468cffa5284870c62vandwalle /** 2749d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * Get the WiFi Handover aggressiveness.This is used by settings 2750d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * to decide what to show within the picker. 2751d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * @hide 2752d524c78d9358e2fa1e67124468cffa5284870c62vandwalle */ 2753d524c78d9358e2fa1e67124468cffa5284870c62vandwalle public int getAggressiveHandover() { 2754d524c78d9358e2fa1e67124468cffa5284870c62vandwalle try { 2755d524c78d9358e2fa1e67124468cffa5284870c62vandwalle return mService.getAggressiveHandover(); 2756d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } catch (RemoteException e) { 2757d524c78d9358e2fa1e67124468cffa5284870c62vandwalle return 0; 2758d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 2759d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 2760d524c78d9358e2fa1e67124468cffa5284870c62vandwalle 2761d524c78d9358e2fa1e67124468cffa5284870c62vandwalle /** 2762d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * Set setting for allowing Scans when traffic is ongoing. 2763d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * @hide 2764d524c78d9358e2fa1e67124468cffa5284870c62vandwalle */ 2765d524c78d9358e2fa1e67124468cffa5284870c62vandwalle public void setAllowScansWithTraffic(int enabled) { 2766d524c78d9358e2fa1e67124468cffa5284870c62vandwalle try { 2767d524c78d9358e2fa1e67124468cffa5284870c62vandwalle mService.setAllowScansWithTraffic(enabled); 2768d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } catch (RemoteException e) { 2769d524c78d9358e2fa1e67124468cffa5284870c62vandwalle 2770d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 2771d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 2772d524c78d9358e2fa1e67124468cffa5284870c62vandwalle 2773d524c78d9358e2fa1e67124468cffa5284870c62vandwalle /** 2774d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * Get setting for allowing Scans when traffic is ongoing. 2775d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * @hide 2776d524c78d9358e2fa1e67124468cffa5284870c62vandwalle */ 2777d524c78d9358e2fa1e67124468cffa5284870c62vandwalle public int getAllowScansWithTraffic() { 2778d524c78d9358e2fa1e67124468cffa5284870c62vandwalle try { 2779d524c78d9358e2fa1e67124468cffa5284870c62vandwalle return mService.getAllowScansWithTraffic(); 2780d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } catch (RemoteException e) { 2781d524c78d9358e2fa1e67124468cffa5284870c62vandwalle return 0; 2782d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 2783d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 278473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 27855914caff06f9790238bea0536acfbf533cee9046Pierre Vandwalle /** 27865914caff06f9790238bea0536acfbf533cee9046Pierre Vandwalle * Set setting for allowing Scans when infrastructure is associated 27875914caff06f9790238bea0536acfbf533cee9046Pierre Vandwalle * @hide 27885914caff06f9790238bea0536acfbf533cee9046Pierre Vandwalle */ 2789358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle public void setAllowScansWhileAssociated(int enabled) { 27905914caff06f9790238bea0536acfbf533cee9046Pierre Vandwalle try { 27915914caff06f9790238bea0536acfbf533cee9046Pierre Vandwalle mService.setAllowScansWhileAssociated(enabled); 27925914caff06f9790238bea0536acfbf533cee9046Pierre Vandwalle } catch (RemoteException e) { 279373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 27945914caff06f9790238bea0536acfbf533cee9046Pierre Vandwalle } 27955914caff06f9790238bea0536acfbf533cee9046Pierre Vandwalle } 279673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 27975914caff06f9790238bea0536acfbf533cee9046Pierre Vandwalle /** 27985914caff06f9790238bea0536acfbf533cee9046Pierre Vandwalle * Get setting for allowing Scans when infrastructure is associated 27995914caff06f9790238bea0536acfbf533cee9046Pierre Vandwalle * @hide 28005914caff06f9790238bea0536acfbf533cee9046Pierre Vandwalle */ 2801358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle public int getAllowScansWhileAssociated() { 28025914caff06f9790238bea0536acfbf533cee9046Pierre Vandwalle try { 28035914caff06f9790238bea0536acfbf533cee9046Pierre Vandwalle return mService.getAllowScansWhileAssociated(); 28045914caff06f9790238bea0536acfbf533cee9046Pierre Vandwalle } catch (RemoteException e) { 28055914caff06f9790238bea0536acfbf533cee9046Pierre Vandwalle } 2806358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle return 0; 28075914caff06f9790238bea0536acfbf533cee9046Pierre Vandwalle } 2808984dc850b4caeb4470e52bce773935be5305cf8eStuart Scott 2809984dc850b4caeb4470e52bce773935be5305cf8eStuart Scott /** 2810984dc850b4caeb4470e52bce773935be5305cf8eStuart Scott * Resets all wifi manager settings back to factory defaults. 2811984dc850b4caeb4470e52bce773935be5305cf8eStuart Scott * 2812984dc850b4caeb4470e52bce773935be5305cf8eStuart Scott * @hide 2813984dc850b4caeb4470e52bce773935be5305cf8eStuart Scott */ 2814984dc850b4caeb4470e52bce773935be5305cf8eStuart Scott public void factoryReset() { 2815f1fb39763d87dabe254b6ed64ac8f20145035bc0Stuart Scott try { 2816f1fb39763d87dabe254b6ed64ac8f20145035bc0Stuart Scott mService.factoryReset(); 2817f1fb39763d87dabe254b6ed64ac8f20145035bc0Stuart Scott } catch (RemoteException e) { 2818984dc850b4caeb4470e52bce773935be5305cf8eStuart Scott } 2819984dc850b4caeb4470e52bce773935be5305cf8eStuart Scott } 28207094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe 28217094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe /** 28227094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe * Get Network object of current wifi network 28237094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe * @return Get Network object of current wifi network 28247094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe * @hide 28257094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe */ 28267094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe public Network getCurrentNetwork() { 28277094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe try { 28287094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe return mService.getCurrentNetwork(); 28297094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe } catch (RemoteException e) { 28307094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe return null; 28317094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe } 28327094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe } 2833358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle 2834358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle /** 2835358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle * Set setting for enabling autojoin Offload thru Wifi HAL layer 2836358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle * @hide 2837358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle */ 2838358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle public void setHalBasedAutojoinOffload(int enabled) { 2839358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle try { 2840358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle mService.setHalBasedAutojoinOffload(enabled); 2841358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle } catch (RemoteException e) { 2842358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle 2843358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle } 2844358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle } 2845358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle 2846358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle /** 2847358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle * Get setting for enabling autojoin Offload thru Wifi HAL layer 2848358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle * @hide 2849358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle */ 2850358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle public int getHalBasedAutojoinOffload() { 2851358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle try { 2852358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle return mService.getHalBasedAutojoinOffload(); 2853358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle } catch (RemoteException e) { 2854358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle } 2855358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle return 0; 2856358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle } 2857358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle 2858358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle /** 2859358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle * Set setting for enabling network switching while wifi is associated 2860358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle * @hide 2861358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle */ 2862358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle public void setAllowNetworkSwitchingWhileAssociated(int enabled) { 2863358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle try { 2864358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle mService.setAllowNetworkSwitchingWhileAssociated(enabled); 2865358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle } catch (RemoteException e) { 2866358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle 2867358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle } 2868358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle } 2869358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle 2870358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle /** 2871358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle * Get setting for enabling network switching while wifi is associated 2872358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle * @hide 2873358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle */ 2874358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle public int getAllowNetworkSwitchingWhileAssociated() { 2875358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle try { 2876358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle return mService.getAllowNetworkSwitchingWhileAssociated(); 2877358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle } catch (RemoteException e) { 2878358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle } 2879358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle return 0; 2880358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle } 2881651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff} 2882