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"; 209e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe 210e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe /** 211e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe * The look up key for an int that indicates why softAP started failed 212e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe * currently support general and no_channel 213e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe * @see #SAP_START_FAILURE_GENERAL 214e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe * @see #SAP_START_FAILURE_NO_CHANNEL 215e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe * 216e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe * @hide 217e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe */ 218e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe public static final String EXTRA_WIFI_AP_FAILURE_REASON = "wifi_ap_error_code"; 2195321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 2205321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * The previous Wi-Fi state. 2215321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2225321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #EXTRA_WIFI_AP_STATE 2235321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2245321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide 2255321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 2265321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff public static final String EXTRA_PREVIOUS_WIFI_AP_STATE = "previous_wifi_state"; 2275321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 2285321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Wi-Fi AP is currently being disabled. The state will change to 2295321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * {@link #WIFI_AP_STATE_DISABLED} if it finishes successfully. 2305321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2315321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_CHANGED_ACTION 2325321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #getWifiApState() 2335321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2345321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide 2355321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 236a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff public static final int WIFI_AP_STATE_DISABLING = 10; 2375321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 2385321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Wi-Fi AP is disabled. 2395321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2405321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_CHANGED_ACTION 2415321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #getWifiState() 2425321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2435321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide 2445321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 245a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff public static final int WIFI_AP_STATE_DISABLED = 11; 2465321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 2475321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Wi-Fi AP is currently being enabled. The state will change to 2485321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * {@link #WIFI_AP_STATE_ENABLED} if it finishes successfully. 2495321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2505321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_CHANGED_ACTION 2515321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #getWifiApState() 2525321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2535321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide 2545321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 255a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff public static final int WIFI_AP_STATE_ENABLING = 12; 2565321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 2575321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Wi-Fi AP is enabled. 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_ENABLED = 13; 2655321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 2665321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Wi-Fi AP is in a failed state. This state will occur when an error occurs during 2675321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * enabling or disabling 2685321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2695321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_CHANGED_ACTION 2705321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #getWifiApState() 2715321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2725321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide 2735321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 274a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff public static final int WIFI_AP_STATE_FAILED = 14; 2755321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 277e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe * If WIFI AP start failed, this reason code means there is no legal channel exists on 278e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe * user selected band by regulatory 279e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe * 280e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe * @hide 281e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe */ 282e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe public static final int SAP_START_FAILURE_GENERAL= 0; 283e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe 284e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe /** 285e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe * All other reason for AP start failed besides SAP_START_FAILURE_GENERAL 286e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe * 287e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe * @hide 288e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe */ 289e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe public static final int SAP_START_FAILURE_NO_CHANNEL = 1; 290e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe /** 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Broadcast intent action indicating that a connection to the supplicant has 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * been established (and it is now possible 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to perform Wi-Fi operations) or the connection to the supplicant has been 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * lost. One extra provides the connection state as a boolean, where {@code true} 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * means CONNECTED. 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_SUPPLICANT_CONNECTED 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String SUPPLICANT_CONNECTION_CHANGE_ACTION = 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android.net.wifi.supplicant.CONNECTION_CHANGE"; 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The lookup key for a boolean that indicates whether a connection to 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the supplicant daemon has been gained or lost. {@code true} means 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a connection now exists. 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve it with {@link android.content.Intent#getBooleanExtra(String,boolean)}. 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_SUPPLICANT_CONNECTED = "connected"; 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Broadcast intent action indicating that the state of Wi-Fi connectivity 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * has changed. One extra provides the new state 3113550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * in the form of a {@link android.net.NetworkInfo} object. If the new 3123550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * state is CONNECTED, additional extras may provide the BSSID and WifiInfo of 3133550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * the access point. 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as a {@code String}. 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_NETWORK_INFO 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_BSSID 3173550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * @see #EXTRA_WIFI_INFO 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String NETWORK_STATE_CHANGED_ACTION = "android.net.wifi.STATE_CHANGE"; 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The lookup key for a {@link android.net.NetworkInfo} object associated with the 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wi-Fi network. Retrieve with 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getParcelableExtra(String)}. 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_NETWORK_INFO = "networkInfo"; 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The lookup key for a String giving the BSSID of the access point to which 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * we are connected. Only present when the new state is CONNECTED. 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve with 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getStringExtra(String)}. 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_BSSID = "bssid"; 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3353550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * The lookup key for a {@link android.net.wifi.WifiInfo} object giving the 3363550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * information about the access point to which we are connected. Only present 3373550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * when the new state is CONNECTED. Retrieve with 3383550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * {@link android.content.Intent#getParcelableExtra(String)}. 3393550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy */ 3403550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy public static final String EXTRA_WIFI_INFO = "wifiInfo"; 3413550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy /** 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Broadcast intent action indicating that the state of establishing a connection to 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an access point has changed.One extra provides the new 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link SupplicantState}. Note that the supplicant state is Wi-Fi specific, and 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is not generally the most useful thing to look at if you are just interested in 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the overall state of connectivity. 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_NEW_STATE 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_SUPPLICANT_ERROR 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String SUPPLICANT_STATE_CHANGED_ACTION = 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android.net.wifi.supplicant.STATE_CHANGE"; 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The lookup key for a {@link SupplicantState} describing the new state 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve with 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getParcelableExtra(String)}. 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_NEW_STATE = "newState"; 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The lookup key for a {@link SupplicantState} describing the supplicant 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * error code if any 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve with 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getIntExtra(String, int)}. 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #ERROR_AUTHENTICATING 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_SUPPLICANT_ERROR = "supplicantError"; 368fcb659b66756ac02bd1491ae1365b27e8509a890Irfan Sheriff 369fcb659b66756ac02bd1491ae1365b27e8509a890Irfan Sheriff /** 370be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff * Broadcast intent action indicating that the configured networks changed. 3711b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * This can be as a result of adding/updating/deleting a network. If 3721b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * {@link #EXTRA_MULTIPLE_NETWORKS_CHANGED} is set to true the new configuration 3731b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * can be retreived with the {@link #EXTRA_WIFI_CONFIGURATION} extra. If multiple 3741b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * Wi-Fi configurations changed, {@link #EXTRA_WIFI_CONFIGURATION} will not be present. 375e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @hide 376e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff */ 377e75c0b8e3becd9f875679a5240f3b1e26d089a3fChelsea Derrick @SystemApi 378be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff public static final String CONFIGURED_NETWORKS_CHANGED_ACTION = 379be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff "android.net.wifi.CONFIGURED_NETWORKS_CHANGE"; 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3811b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * The lookup key for a (@link android.net.wifi.WifiConfiguration} object representing 3821b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * the changed Wi-Fi configuration when the {@link #CONFIGURED_NETWORKS_CHANGED_ACTION} 3831b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * broadcast is sent. 3841b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @hide 3851b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood */ 386e75c0b8e3becd9f875679a5240f3b1e26d089a3fChelsea Derrick @SystemApi 3871b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood public static final String EXTRA_WIFI_CONFIGURATION = "wifiConfiguration"; 3881b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood /** 3891b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * Multiple network configurations have changed. 3901b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @see #CONFIGURED_NETWORKS_CHANGED_ACTION 3911b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * 3921b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @hide 3931b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood */ 394e75c0b8e3becd9f875679a5240f3b1e26d089a3fChelsea Derrick @SystemApi 3951b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood public static final String EXTRA_MULTIPLE_NETWORKS_CHANGED = "multipleChanges"; 3961b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood /** 3971b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * The lookup key for an integer indicating the reason a Wi-Fi network configuration 3981b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * has changed. Only present if {@link #EXTRA_MULTIPLE_NETWORKS_CHANGED} is {@code false} 3991b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @see #CONFIGURED_NETWORKS_CHANGED_ACTION 4001b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @hide 4011b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood */ 402e75c0b8e3becd9f875679a5240f3b1e26d089a3fChelsea Derrick @SystemApi 4031b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood public static final String EXTRA_CHANGE_REASON = "changeReason"; 4041b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood /** 4051b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * The configuration is new and was added. 4061b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @hide 4071b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood */ 408e75c0b8e3becd9f875679a5240f3b1e26d089a3fChelsea Derrick @SystemApi 4091b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood public static final int CHANGE_REASON_ADDED = 0; 4101b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood /** 4111b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * The configuration was removed and is no longer present in the system's list of 4121b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * configured networks. 4131b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @hide 4141b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood */ 415e75c0b8e3becd9f875679a5240f3b1e26d089a3fChelsea Derrick @SystemApi 4161b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood public static final int CHANGE_REASON_REMOVED = 1; 4171b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood /** 4181b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * The configuration has changed as a result of explicit action or because the system 4191b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * took an automated action such as disabling a malfunctioning configuration. 4201b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @hide 4211b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood */ 422e75c0b8e3becd9f875679a5240f3b1e26d089a3fChelsea Derrick @SystemApi 4231b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood public static final int CHANGE_REASON_CONFIG_CHANGE = 2; 4241b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood /** 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * An access point scan has completed, and results are available from the supplicant. 426a0d929e505432a8c84f3899696c910db16bd73bfVinit Deshpande * Call {@link #getScanResults()} to obtain the results. {@link #EXTRA_RESULTS_UPDATED} 427a0d929e505432a8c84f3899696c910db16bd73bfVinit Deshpande * indicates if the scan was completed successfully. 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String SCAN_RESULTS_AVAILABLE_ACTION = "android.net.wifi.SCAN_RESULTS"; 43129ad7c7000393751a0ab0e1a17912db7866d4ff8Vinit Deshpande 43229ad7c7000393751a0ab0e1a17912db7866d4ff8Vinit Deshpande /** 433a0d929e505432a8c84f3899696c910db16bd73bfVinit Deshpande * Lookup key for a {@code boolean} representing the result of previous {@link #startScan} 434a0d929e505432a8c84f3899696c910db16bd73bfVinit Deshpande * operation, reported with {@link #SCAN_RESULTS_AVAILABLE_ACTION}. 435a0d929e505432a8c84f3899696c910db16bd73bfVinit Deshpande * @return true scan was successful, results are updated 43629ad7c7000393751a0ab0e1a17912db7866d4ff8Vinit Deshpande * @return false scan was not successful, results haven't been updated since previous scan 43729ad7c7000393751a0ab0e1a17912db7866d4ff8Vinit Deshpande */ 43829ad7c7000393751a0ab0e1a17912db7866d4ff8Vinit Deshpande public static final String EXTRA_RESULTS_UPDATED = "resultsUpdated"; 43929ad7c7000393751a0ab0e1a17912db7866d4ff8Vinit Deshpande 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4410451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * A batch of access point scans has been completed and the results areavailable. 4420451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * Call {@link #getBatchedScanResults()} to obtain the results. 4430451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @hide pending review 4440451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt */ 4450451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 4460451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt public static final String BATCHED_SCAN_RESULTS_AVAILABLE_ACTION = 4470451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt "android.net.wifi.BATCHED_RESULTS"; 4480451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt /** 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The RSSI (signal strength) has changed. 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_NEW_RSSI 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String RSSI_CHANGED_ACTION = "android.net.wifi.RSSI_CHANGED"; 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The lookup key for an {@code int} giving the new RSSI in dBm. 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_NEW_RSSI = "newRssi"; 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 460be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff * Broadcast intent action indicating that the link configuration 4610d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * changed on wifi. 4620d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @hide 4630d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff */ 464be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff public static final String LINK_CONFIGURATION_CHANGED_ACTION = 465be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff "android.net.wifi.LINK_CONFIGURATION_CHANGED"; 466f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 4670d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff /** 46837e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt * The lookup key for a {@link android.net.LinkProperties} object associated with the 4690d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * Wi-Fi network. Retrieve with 4700d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * {@link android.content.Intent#getParcelableExtra(String)}. 4710d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @hide 4720d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff */ 47337e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt public static final String EXTRA_LINK_PROPERTIES = "linkProperties"; 4740d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff 4750d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff /** 476f9cb86aebe9647e0fe0137fc198ba16c017445c6Robert Greenwalt * The lookup key for a {@link android.net.NetworkCapabilities} object associated with the 477f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Wi-Fi network. Retrieve with 478f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * {@link android.content.Intent#getParcelableExtra(String)}. 479f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * @hide 480f61101f6266be243c481d163b95e65d67b8d1669Wink Saville */ 481f9cb86aebe9647e0fe0137fc198ba16c017445c6Robert Greenwalt public static final String EXTRA_NETWORK_CAPABILITIES = "networkCapabilities"; 482f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 483f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The network IDs of the configured networks could have changed. 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String NETWORK_IDS_CHANGED_ACTION = "android.net.wifi.NETWORK_IDS_CHANGED"; 48837e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4901ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * Activity Action: Show a system activity that allows the user to enable 4911ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * scans to be available even with Wi-Fi turned off. 4921ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * 4931ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * <p>Notification of the result of this activity is posted using the 4941ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * {@link android.app.Activity#onActivityResult} callback. The 4951ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * <code>resultCode</code> 4961ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * will be {@link android.app.Activity#RESULT_OK} if scan always mode has 4971ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * been turned on or {@link android.app.Activity#RESULT_CANCELED} if the user 4981ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * has rejected the request or an error has occurred. 4991ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff */ 5001ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 5011ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff public static final String ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE = 5021ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff "android.net.wifi.action.REQUEST_SCAN_ALWAYS_AVAILABLE"; 5031ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff 5041ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff /** 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Activity Action: Pick a Wi-Fi network to connect to. 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Input: Nothing. 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Output: Nothing. 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ACTION_PICK_WIFI_NETWORK = "android.net.wifi.PICK_WIFI_NETWORK"; 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 51399001278289036a3c645e599ed832943ff1b6e15Eric Shienbrood * In this Wi-Fi lock mode, Wi-Fi will be kept active, 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and will behave normally, i.e., it will attempt to automatically 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * establish a connection to a remembered access point that is 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * within range, and will do periodic scans if there are remembered 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * access points but none are in range. 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WIFI_MODE_FULL = 1; 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 52199001278289036a3c645e599ed832943ff1b6e15Eric Shienbrood * In this Wi-Fi lock mode, Wi-Fi will be kept active, 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * but the only operation that will be supported is initiation of 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * scans, and the subsequent reporting of scan results. No attempts 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be made to automatically connect to remembered access points, 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * nor will periodic scans be automatically performed looking for 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * remembered access points. Scans must be explicitly requested by 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an application in this mode. 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WIFI_MODE_SCAN_ONLY = 2; 530652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff /** 531652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * In this Wi-Fi lock mode, Wi-Fi will be kept active as in mode 532652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * {@link #WIFI_MODE_FULL} but it operates at high performance 533652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * with minimum packet loss and low packet latency even when 534652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * the device screen is off. This mode will consume more power 535652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * and hence should be used only when there is a need for such 536652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * an active connection. 537652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * <p> 538652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * An example use case is when a voice connection needs to be 539652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * kept active even after the device screen goes off. Holding the 540652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * regular {@link #WIFI_MODE_FULL} lock will keep the wifi 541652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * connection active, but the connection can be lossy. 542652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * Holding a {@link #WIFI_MODE_FULL_HIGH_PERF} lock for the 543652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * duration of the voice call will improve the call quality. 544652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * <p> 545652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * When there is no support from the hardware, this lock mode 546652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * will have the same behavior as {@link #WIFI_MODE_FULL} 547652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff */ 548652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff public static final int WIFI_MODE_FULL_HIGH_PERF = 3; 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Anything worse than or equal to this will show 0 bars. */ 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int MIN_RSSI = -100; 552652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Anything better than or equal to this will show the max bars. */ 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int MAX_RSSI = -55; 55536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff 55636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff /** 557ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff * Number of RSSI levels used in the framework to initiate 558ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff * {@link #RSSI_CHANGED_ACTION} broadcast 559ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff * @hide 560ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff */ 561ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff public static final int RSSI_LEVELS = 5; 562ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff 563ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff /** 56436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * Auto settings in the driver. The driver could choose to operate on both 56536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * 2.4 GHz and 5 GHz or make a dynamic decision on selecting the band. 56636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @hide 56736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff */ 56836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff public static final int WIFI_FREQUENCY_BAND_AUTO = 0; 56936f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff 57036f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff /** 57136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * Operation on 5 GHz alone 57236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @hide 57336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff */ 57436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff public static final int WIFI_FREQUENCY_BAND_5GHZ = 1; 57536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff 57636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff /** 57736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * Operation on 2.4 GHz alone 57836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @hide 57936f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff */ 58036f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff public static final int WIFI_FREQUENCY_BAND_2GHZ = 2; 58136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff 582227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff /** List of asyncronous notifications 583227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * @hide 584227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff */ 585227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff public static final int DATA_ACTIVITY_NOTIFICATION = 1; 586227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 587227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff //Lowest bit indicates data reception and the second lowest 588227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff //bit indicates data transmitted 589227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff /** @hide */ 590227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff public static final int DATA_ACTIVITY_NONE = 0x00; 591227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff /** @hide */ 592227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff public static final int DATA_ACTIVITY_IN = 0x01; 593227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff /** @hide */ 594227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff public static final int DATA_ACTIVITY_OUT = 0x02; 595227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff /** @hide */ 596227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff public static final int DATA_ACTIVITY_INOUT = 0x03; 597227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 598ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde /** @hide */ 599ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde public static final boolean DEFAULT_POOR_NETWORK_AVOIDANCE_ENABLED = false; 600ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde 601617750604c69e6068f68266d0e30324273aa990eMike Lockwood /* Maximum number of active locks we allow. 602617750604c69e6068f68266d0e30324273aa990eMike Lockwood * This limit was added to prevent apps from creating a ridiculous number 603617750604c69e6068f68266d0e30324273aa990eMike Lockwood * of locks and crashing the system by overflowing the global ref table. 604617750604c69e6068f68266d0e30324273aa990eMike Lockwood */ 605617750604c69e6068f68266d0e30324273aa990eMike Lockwood private static final int MAX_ACTIVE_LOCKS = 50; 606617750604c69e6068f68266d0e30324273aa990eMike Lockwood 607617750604c69e6068f68266d0e30324273aa990eMike Lockwood /* Number of currently active WifiLocks and MulticastLocks */ 608617750604c69e6068f68266d0e30324273aa990eMike Lockwood private int mActiveLockCount; 609617750604c69e6068f68266d0e30324273aa990eMike Lockwood 61088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff private Context mContext; 61188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff IWifiManager mService; 6121022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti private final int mTargetSdkVersion; 61388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff 61488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff private static final int INVALID_KEY = 0; 615302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static int sListenerKey = 1; 616302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static final SparseArray sListenerMap = new SparseArray(); 617302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static final Object sListenerMapLock = new Object(); 61888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff 619302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static AsyncChannel sAsyncChannel; 620302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static CountDownLatch sConnected; 6211022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti private static ConnectivityManager sCM; 62288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff 623302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static final Object sThreadRefLock = new Object(); 624cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff private static int sThreadRefCount; 625cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff private static HandlerThread sHandlerThread; 626cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff 6271022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti @GuardedBy("sCM") 6281022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti // TODO: Introduce refcounting and make this a per-process static callback, instead of a 6291022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti // per-WifiManager callback. 6301022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti private PinningNetworkCallback mNetworkCallback; 6311022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new WifiManager instance. 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Applications will almost always want to use 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Context#getSystemService Context.getSystemService()} to retrieve 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the standard {@link android.content.Context#WIFI_SERVICE Context.WIFI_SERVICE}. 63788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @param context the application context 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param service the Binder interface 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide - hide this because it takes in a parameter of type IWifiManager, which 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is a system private class. 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 64288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public WifiManager(Context context, IWifiManager service) { 64388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff mContext = context; 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService = service; 6451022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti mTargetSdkVersion = context.getApplicationInfo().targetSdkVersion; 64688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff init(); 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a list of all the networks configured in the supplicant. 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Not all fields of WifiConfiguration are returned. Only the following 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * fields are filled in: 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>networkId</li> 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>SSID</li> 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>BSSID</li> 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>priority</li> 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>allowedProtocols</li> 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>allowedKeyManagement</li> 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>allowedAuthAlgorithms</li> 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>allowedPairwiseCiphers</li> 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>allowedGroupCiphers</li> 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a list of network configurations in the form of a list 66559358536d2f14b27cdc7386daeabc2b6dca8e177Irfan Sheriff * of {@link WifiConfiguration} objects. Upon failure to fetch or 66659358536d2f14b27cdc7386daeabc2b6dca8e177Irfan Sheriff * when when Wi-Fi is turned off, it can be null. 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public List<WifiConfiguration> getConfiguredNetworks() { 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.getConfiguredNetworks(); 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 672f6d3d148d50562823e5f953ddd9c084266ac4c1bJan Nordqvist Log.w(TAG, "Caught RemoteException trying to get configured networks: " + e); 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 677758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong /** @hide */ 678758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong @SystemApi 679758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong public List<WifiConfiguration> getPrivilegedConfiguredNetworks() { 680758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong try { 681758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong return mService.getPrivilegedConfiguredNetworks(); 682758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong } catch (RemoteException e) { 683758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong return null; 684758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong } 685758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong } 686758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong 6874eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle /** @hide */ 6884eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle @SystemApi 6894eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle public WifiConnectionStatistics getConnectionStatistics() { 6904eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle try { 6914eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle return mService.getConnectionStatistics(); 6924eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle } catch (RemoteException e) { 6934eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle return null; 6944eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle } 6954eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle } 6964eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 698b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande * Returns a WifiConfiguration matching this ScanResult 699b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande * @param scanResult scanResult that represents the BSSID 700b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande * @return {@link WifiConfiguration} that matches this BSSID or null 701b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande * @hide 702b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande */ 703b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande public WifiConfiguration getMatchingWifiConfig(ScanResult scanResult) { 704b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande try { 705b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande return mService.getMatchingWifiConfig(scanResult); 706b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande } catch (RemoteException e) { 707b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande return null; 708b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande } 709b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande } 710b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande 711b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande /** 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a new network description to the set of configured networks. 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The {@code networkId} field of the supplied configuration object 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is ignored. 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p/> 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The new network will be marked DISABLED by default. To enable it, 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * called {@link #enableNetwork}. 718227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param config the set of variables that describe the configuration, 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * contained in a {@link WifiConfiguration} object. 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the ID of the newly created network description. This is used in 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * other operations to specified the network to be acted upon. 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns {@code -1} on failure. 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int addNetwork(WifiConfiguration config) { 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (config == null) { 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.networkId = -1; 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return addOrUpdateNetwork(config); 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Update the network description of an existing configured network. 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param config the set of variables that describe the configuration, 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * contained in a {@link WifiConfiguration} object. It may 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be sparse, so that only the items that are being changed 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are non-<code>null</code>. The {@code networkId} field 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * must be set to the ID of the existing network being updated. 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns the {@code networkId} of the supplied 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@code WifiConfiguration} on success. 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <br/> 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns {@code -1} on failure, including when the {@code networkId} 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * field of the {@code WifiConfiguration} does not refer to an 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * existing network. 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int updateNetwork(WifiConfiguration config) { 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (config == null || config.networkId < 0) { 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return addOrUpdateNetwork(config); 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Internal method for doing the RPC that creates a new network description 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or updates an existing one. 758227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param config The possibly sparse object containing the variables that 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are to set or updated in the network description. 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the ID of the network on success, {@code -1} on failure. 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int addOrUpdateNetwork(WifiConfiguration config) { 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.addOrUpdateNetwork(config); 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Remove the specified network from the list of configured networks. 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This may result in the asynchronous delivery of state change 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * events. 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param netId the integer that identifies the network configuration 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to the supplicant 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean removeNetwork(int netId) { 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.removeNetwork(netId); 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Allow a previously configured network to be associated with. If 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <code>disableOthers</code> is true, then all other configured 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * networks are disabled, and an attempt to connect to the selected 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * network is initiated. This may result in the asynchronous delivery 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of state change events. 7931022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * <p> 7941022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * <b>Note:</b> If an application's target SDK version is 795976f044b2b3eff2ce968e3ea59022414180c268dLorenzo Colitti * {@link android.os.Build.VERSION_CODES#LOLLIPOP} or newer, network 7961022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * communication may not use Wi-Fi even if Wi-Fi is connected; traffic may 7971022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * instead be sent through another network, such as cellular data, 7981022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * Bluetooth tethering, or Ethernet. For example, traffic will never use a 7991022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * Wi-Fi network that does not provide Internet access (e.g. a wireless 8001022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * printer), if another network that does offer Internet access (e.g. 8011022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * cellular data) is available. Applications that need to ensure that their 8021022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * network traffic uses Wi-Fi should use APIs such as 8031022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * {@link Network#bindSocket(java.net.Socket)}, 8041022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * {@link Network#openConnection(java.net.URL)}, or 8051022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * {@link ConnectivityManager#bindProcessToNetwork} to do so. 8061022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param netId the ID of the network in the list of configured networks 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param disableOthers if true, disable all other networks. The way to 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * select a particular network to connect to is specify {@code true} 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for this parameter. 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean enableNetwork(int netId, boolean disableOthers) { 814976f044b2b3eff2ce968e3ea59022414180c268dLorenzo Colitti final boolean pin = disableOthers && mTargetSdkVersion < Build.VERSION_CODES.LOLLIPOP; 8151022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti if (pin) { 8161022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti registerPinningNetworkCallback(); 8171022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti } 8181022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti 8191022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti boolean success; 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8211022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti success = mService.enableNetwork(netId, disableOthers); 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 8231022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti success = false; 8241022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti } 8251022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti 8261022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti if (pin && !success) { 8271022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti unregisterPinningNetworkCallback(); 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8291022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti 8301022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti return success; 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Disable a configured network. The specified network will not be 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a candidate for associating. This may result in the asynchronous 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * delivery of state change events. 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param netId the ID of the network as returned by {@link #addNetwork}. 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean disableNetwork(int netId) { 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.disableNetwork(netId); 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Disassociate from the currently active access point. This may result 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the asynchronous delivery of state change events. 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean disconnect() { 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 855e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff mService.disconnect(); 856e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff return true; 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reconnect to the currently active access point, if we are currently 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * disconnected. This may result in the asynchronous delivery of state 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * change events. 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean reconnect() { 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 870e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff mService.reconnect(); 871e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff return true; 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reconnect to the currently active access point, even if we are already 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * connected. This may result in the asynchronous delivery of state 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * change events. 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean reassociate() { 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 885e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff mService.reassociate(); 886e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff return true; 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Check that the supplicant daemon is responding to requests. 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if we were able to communicate with the supplicant and 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it returned the expected response to the PING message. 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean pingSupplicant() { 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mService == null) 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.pingSupplicant(); 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 908738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * Get a list of available channels for customized scan. 909738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 910738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * @see {@link WifiChannel} 911738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 912738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * @return the channel list, or null if not available 913738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * @hide 914738803fee62a98f244250996380820c4923e7f7bYuhao Zheng */ 915738803fee62a98f244250996380820c4923e7f7bYuhao Zheng public List<WifiChannel> getChannelList() { 916738803fee62a98f244250996380820c4923e7f7bYuhao Zheng try { 917738803fee62a98f244250996380820c4923e7f7bYuhao Zheng return mService.getChannelList(); 918738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } catch (RemoteException e) { 919738803fee62a98f244250996380820c4923e7f7bYuhao Zheng return null; 920738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } 921738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } 922738803fee62a98f244250996380820c4923e7f7bYuhao Zheng 92373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /* Keep this list in sync with wifi_hal.h */ 92473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 92573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_INFRA = 0x0001; // Basic infrastructure mode 92673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 92773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_INFRA_5G = 0x0002; // Support for 5 GHz Band 92873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 92973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_PASSPOINT = 0x0004; // Support for GAS/ANQP 93073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 93173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_P2P = 0x0008; // Wifi-Direct 93273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 93373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_MOBILE_HOTSPOT = 0x0010; // Soft AP 93473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 93573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_SCANNER = 0x0020; // WifiScanner APIs 93673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 93773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_NAN = 0x0040; // Neighbor Awareness Networking 93873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 93973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_D2D_RTT = 0x0080; // Device-to-device RTT 94073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 94173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_D2AP_RTT = 0x0100; // Device-to-AP RTT 94273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 94373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_BATCH_SCAN = 0x0200; // Batched Scan (deprecated) 94473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 94573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_PNO = 0x0400; // Preferred network offload 94673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 94773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_ADDITIONAL_STA = 0x0800; // Support for two STAs 94873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 94973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_TDLS = 0x1000; // Tunnel directed link setup 95073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 95173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_TDLS_OFFCHANNEL = 0x2000; // Support for TDLS off channel 95273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 95373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_EPR = 0x4000; // Enhanced power reporting 954ddfd35dbf9aab0ff196e1d7046ebe6bcd972c7a5Pierre Vandwalle /** @hide */ 955ddfd35dbf9aab0ff196e1d7046ebe6bcd972c7a5Pierre Vandwalle public static final int WIFI_FEATURE_AP_STA = 0x8000; // Support for AP STA Concurrency 956ddfd35dbf9aab0ff196e1d7046ebe6bcd972c7a5Pierre Vandwalle /** @hide */ 957ddfd35dbf9aab0ff196e1d7046ebe6bcd972c7a5Pierre Vandwalle public static final int WIFI_FEATURE_LINK_LAYER_STATS = 0x10000; // Link layer stats collection 958ddfd35dbf9aab0ff196e1d7046ebe6bcd972c7a5Pierre Vandwalle /** @hide */ 959ddfd35dbf9aab0ff196e1d7046ebe6bcd972c7a5Pierre Vandwalle public static final int WIFI_FEATURE_LOGGER = 0x20000; // WiFi Logger 960ddfd35dbf9aab0ff196e1d7046ebe6bcd972c7a5Pierre Vandwalle /** @hide */ 961ddfd35dbf9aab0ff196e1d7046ebe6bcd972c7a5Pierre Vandwalle public static final int WIFI_FEATURE_HAL_EPNO = 0x40000; // WiFi PNO enhanced 96273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 96373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande private int getSupportedFeatures() { 96473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande try { 96573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return mService.getSupportedFeatures(); 96673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } catch (RemoteException e) { 96773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return 0; 96873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 96973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 97073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 97173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande private boolean isFeatureSupported(int feature) { 97273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return (getSupportedFeatures() & feature) == feature; 97373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 97473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 97573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports 5 GHz band 97673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 97773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean is5GHzBandSupported() { 97873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_INFRA_5G); 97973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 98073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 98173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 98273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports passpoint 98373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 98473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 98573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isPasspointSupported() { 98673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_PASSPOINT); 98773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 98873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 98973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 99073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports WifiP2pManager (Wi-Fi Direct) 99173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 99273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isP2pSupported() { 99373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_P2P); 99473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 99573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 99673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 99773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports portable Wi-Fi hotspot 99873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 99973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 100073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande @SystemApi 100173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isPortableHotspotSupported() { 100273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_MOBILE_HOTSPOT); 100373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 100473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 100573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 100673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports WifiScanner APIs 100773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 100873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 100973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande @SystemApi 101073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isWifiScannerSupported() { 101173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_SCANNER); 101273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 101373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 101473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 101573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports Neighbour Awareness Network APIs 101673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 101773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 101873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isNanSupported() { 101973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_NAN); 102073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 102173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 102273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 102373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports Device-to-device RTT 102473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 102573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 102673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande @SystemApi 102773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isDeviceToDeviceRttSupported() { 102873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_D2D_RTT); 102973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 103073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 103173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 103273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports Device-to-AP RTT 103373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 103473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande @SystemApi 103573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isDeviceToApRttSupported() { 103673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_D2AP_RTT); 103773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 103873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 103973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 104073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports offloaded connectivity scan 104173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 104273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isPreferredNetworkOffloadSupported() { 104373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_PNO); 104473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 104573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 104673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 104773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports multiple simultaneous connections 104873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 104973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 105073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isAdditionalStaSupported() { 105173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_ADDITIONAL_STA); 105273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 105373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 105473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 105573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports Tunnel Directed Link Setup 105673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 105773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isTdlsSupported() { 105873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_TDLS); 105973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 106073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 106173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 106273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports Off Channel Tunnel Directed Link Setup 106373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 106473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 106573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isOffChannelTdlsSupported() { 106673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_TDLS_OFFCHANNEL); 106773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 106873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 106973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 107073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports advanced power/performance counters 107173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 107273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isEnhancedPowerReportingSupported() { 1073ddfd35dbf9aab0ff196e1d7046ebe6bcd972c7a5Pierre Vandwalle return isFeatureSupported(WIFI_FEATURE_LINK_LAYER_STATS); 107473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 107573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 107673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 107773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * Return the record of {@link WifiActivityEnergyInfo} object that 107873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * has the activity and energy info. This can be used to ascertain what 107973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * the controller has been up to, since the last sample. 108073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @param updateType Type of info, cached vs refreshed. 108173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * 108273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return a record with {@link WifiActivityEnergyInfo} or null if 108373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * report is unavailable or unsupported 108473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 108573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 108673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public WifiActivityEnergyInfo getControllerActivityEnergyInfo(int updateType) { 108773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande if (mService == null) return null; 108873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande try { 108973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande WifiActivityEnergyInfo record; 109073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande if (!isEnhancedPowerReportingSupported()) { 109173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return null; 109273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 109373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande synchronized(this) { 109473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande record = mService.reportActivityInfo(); 109520903b392b78e5f3dc0ce8b782154adc77853468Pierre Vandwalle if (record != null && record.isValid()) { 109673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return record; 109773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } else { 109873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return null; 109973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 110073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 110173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } catch (RemoteException e) { 110273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande Log.e(TAG, "getControllerActivityEnergyInfo: " + e); 110373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 110473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return null; 110573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 110673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 1107738803fee62a98f244250996380820c4923e7f7bYuhao Zheng /** 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Request a scan for access points. Returns immediately. The availability 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the results is made known later by means of an asynchronous event sent 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on completion of the scan. 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded, i.e., the scan was initiated 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1113a5ec95cdb1a7d2024249277dff1f99d0046c9b56Mike Lockwood public boolean startScan() { 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1115738803fee62a98f244250996380820c4923e7f7bYuhao Zheng mService.startScan(null, null); 11166942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie return true; 11176942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie } catch (RemoteException e) { 11186942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie return false; 11196942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie } 11206942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie } 11216942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie 11226942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie /** @hide */ 1123c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie @SystemApi 11246942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie public boolean startScan(WorkSource workSource) { 11256942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie try { 1126738803fee62a98f244250996380820c4923e7f7bYuhao Zheng mService.startScan(null, workSource); 1127738803fee62a98f244250996380820c4923e7f7bYuhao Zheng return true; 1128738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } catch (RemoteException e) { 1129738803fee62a98f244250996380820c4923e7f7bYuhao Zheng return false; 1130738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } 1131738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } 1132738803fee62a98f244250996380820c4923e7f7bYuhao Zheng 1133738803fee62a98f244250996380820c4923e7f7bYuhao Zheng /** 1134da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle * startLocationRestrictedScan() 1135da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle * Trigger a scan which will not make use of DFS channels and is thus not suitable for 1136da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle * establishing wifi connection. 1137da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle * @hide 1138da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle */ 1139da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle @SystemApi 1140da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle public boolean startLocationRestrictedScan(WorkSource workSource) { 1141da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle try { 1142da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle mService.startLocationRestrictedScan(workSource); 1143da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle return true; 1144da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle } catch (RemoteException e) { 1145da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle return false; 1146da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle } 1147da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle } 1148da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle 1149da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle /** 1150738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * Request a scan for access points in specified channel list. Each channel is specified by its 1151738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * frequency in MHz, e.g. "5500" (do NOT include "DFS" even though it is). The availability of 1152738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * the results is made known later in the same way as {@link #startScan}. 1153738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 1154738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * Note: 1155738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 1156738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 1. Customized scan is for non-connection purposes, i.e. it won't trigger a wifi connection 1157738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * even though it finds some known networks. 1158738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 1159738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 2. Customized scan result may include access points that is not specified in the channel 1160738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * list. An app will need to do frequency filtering if it wants to get pure results for the 1161738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * channel list it specified. 1162738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 1163738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * @hide 1164738803fee62a98f244250996380820c4923e7f7bYuhao Zheng */ 1165738803fee62a98f244250996380820c4923e7f7bYuhao Zheng public boolean startCustomizedScan(ScanSettings requested) { 1166738803fee62a98f244250996380820c4923e7f7bYuhao Zheng try { 1167738803fee62a98f244250996380820c4923e7f7bYuhao Zheng mService.startScan(requested, null); 1168738803fee62a98f244250996380820c4923e7f7bYuhao Zheng return true; 1169738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } catch (RemoteException e) { 1170738803fee62a98f244250996380820c4923e7f7bYuhao Zheng return false; 1171738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } 1172738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } 1173738803fee62a98f244250996380820c4923e7f7bYuhao Zheng 1174738803fee62a98f244250996380820c4923e7f7bYuhao Zheng /** @hide */ 1175738803fee62a98f244250996380820c4923e7f7bYuhao Zheng public boolean startCustomizedScan(ScanSettings requested, WorkSource workSource) { 1176738803fee62a98f244250996380820c4923e7f7bYuhao Zheng try { 1177738803fee62a98f244250996380820c4923e7f7bYuhao Zheng mService.startScan(requested, workSource); 1178e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff return true; 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11850451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * Request a batched scan for access points. To end your requested batched scan, 11860451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * call stopBatchedScan with the same Settings. 11870451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * 11880451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * If there are mulitple requests for batched scans, the more demanding settings will 11890451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * take precidence. 11900451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * 11910451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @param requested {@link BatchedScanSettings} the scan settings requested. 11920451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @return false on known error 11930451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @hide 11940451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt */ 11950451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt public boolean requestBatchedScan(BatchedScanSettings requested) { 11960451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt try { 1197a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt return mService.requestBatchedScan(requested, new Binder(), null); 1198a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } catch (RemoteException e) { return false; } 1199a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 1200a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt /** @hide */ 1201a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt public boolean requestBatchedScan(BatchedScanSettings requested, WorkSource workSource) { 1202a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt try { 1203a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt return mService.requestBatchedScan(requested, new Binder(), workSource); 12040451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } catch (RemoteException e) { return false; } 12050451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } 12060451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt 12070451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt /** 12080451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * Check if the Batched Scan feature is supported. 12090451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * 12100451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @return false if not supported. 12110451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @hide 12120451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt */ 1213c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie @SystemApi 12140451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt public boolean isBatchedScanSupported() { 12150451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt try { 12160451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt return mService.isBatchedScanSupported(); 12170451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } catch (RemoteException e) { return false; } 12180451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } 12190451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt 12200451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt /** 12210451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * End a requested batch scan for this applicaiton. Note that batched scan may 12220451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * still occur if other apps are using them. 1223126755cf41710d52554d747f3d3667eb0a3c2694Robert Greenwalt * 1224126755cf41710d52554d747f3d3667eb0a3c2694Robert Greenwalt * @param requested {@link BatchedScanSettings} the scan settings you previously requested 1225126755cf41710d52554d747f3d3667eb0a3c2694Robert Greenwalt * and now wish to stop. A value of null here will stop all scans requested by the 1226126755cf41710d52554d747f3d3667eb0a3c2694Robert Greenwalt * calling App. 12270451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @hide 12280451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt */ 12290451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt public void stopBatchedScan(BatchedScanSettings requested) { 12300451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt try { 123182f4218c0d5dbc10404db8cf31f0284140d80175Robert Greenwalt mService.stopBatchedScan(requested); 12320451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } catch (RemoteException e) {} 12330451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } 12340451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt 12350451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt /** 12360451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * Retrieve the latest batched scan result. This should be called immediately after 12370451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * {@link BATCHED_SCAN_RESULTS_AVAILABLE_ACTION} is received. 12380451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @hide 12390451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt */ 1240c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie @SystemApi 12410451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt public List<BatchedScanResult> getBatchedScanResults() { 12420451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt try { 124395d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn return mService.getBatchedScanResults(mContext.getOpPackageName()); 12440451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } catch (RemoteException e) { 12450451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt return null; 12460451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } 12470451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } 12480451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt 12490451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt /** 12508e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * Force a re-reading of batched scan results. This will attempt 12518e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * to read more information from the chip, but will do so at the expense 12528e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * of previous data. Rate limited to the current scan frequency. 12538e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * 12548e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * pollBatchedScan will always wait 1 period from the start of the batch 12558e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * before trying to read from the chip, so if your #scans/batch == 1 this will 12568e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * have no effect. 12578e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * 12588e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * If you had already waited 1 period before calling, this should have 12598e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * immediate (though async) effect. 12608e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * 12618e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * If you call before that 1 period is up this will set up a timer and fetch 12628e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * results when the 1 period is up. 12638e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * 12648e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * Servicing a pollBatchedScan request (immediate or after timed delay) starts a 12658e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * new batch, so if you were doing 10 scans/batch and called in the 4th scan, you 12668e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * would get data in the 4th and then again 10 scans later. 12678e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * @hide 12688e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt */ 12698e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt public void pollBatchedScan() { 12708e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt try { 12718e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt mService.pollBatchedScan(); 12728e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt } catch (RemoteException e) { } 12738e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt } 12748e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt 12758e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt /** 1276b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales * Creates a configuration token describing the network referenced by {@code netId} 1277b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales * of MIME type application/vnd.wfa.wsc. Can be used to configure WiFi networks via NFC. 1278b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales * 1279b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales * @return hex-string encoded configuration token 1280b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales * @hide 1281b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales */ 1282b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales public String getWpsNfcConfigurationToken(int netId) { 1283b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales try { 1284b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales return mService.getWpsNfcConfigurationToken(netId); 1285b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales } catch (RemoteException e) { 1286b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales return null; 1287b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales } 1288b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales } 1289b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales 1290b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales /** 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return dynamic information about the current Wi-Fi connection, if any is active. 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the Wi-Fi information, contained in {@link WifiInfo}. 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public WifiInfo getConnectionInfo() { 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.getConnectionInfo(); 12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the results of the latest access point scan. 1304cb13aebfec313a3433ed0f53cc2e3b6dbaf888d0Fyodor Kupolov * @return the list of access points found in the most recent scan. An app must hold 1305cb13aebfec313a3433ed0f53cc2e3b6dbaf888d0Fyodor Kupolov * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION ACCESS_COARSE_LOCATION} or 1306959991b957fb58672aef17c46a7662941f138e19Fyodor Kupolov * {@link android.Manifest.permission#ACCESS_FINE_LOCATION ACCESS_FINE_LOCATION} permission 1307cb13aebfec313a3433ed0f53cc2e3b6dbaf888d0Fyodor Kupolov * in order to get valid results. 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public List<ScanResult> getScanResults() { 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 131195d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn return mService.getScanResults(mContext.getOpPackageName()); 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13181ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * Check if scanning is always available. 13191ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * 13201ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * If this return {@code true}, apps can issue {@link #startScan} and fetch scan results 13211ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * even when Wi-Fi is turned off. 13221ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * 13231ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * To change this setting, see {@link #ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE}. 13241ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff */ 13257ea33eac4b57aabf9326d60f52e3ed85217ac846Irfan Sheriff public boolean isScanAlwaysAvailable() { 13261ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff try { 13277ea33eac4b57aabf9326d60f52e3ed85217ac846Irfan Sheriff return mService.isScanAlwaysAvailable(); 13281ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff } catch (RemoteException e) { 13291ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff return false; 13301ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff } 13311ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff } 13321ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff 13331ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff /** 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Tell the supplicant to persist the current list of configured networks. 13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Note: It is possible for this method to change the network IDs of 13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * existing networks. You should assume the network IDs can be different 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * after calling this method. 1339227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean saveConfiguration() { 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.saveConfiguration(); 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1351ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff * Set the country code. 1352ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff * @param countryCode country code in ISO 3166 format. 1353ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff * @param persist {@code true} if this needs to be remembered 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1355ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff * @hide 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1357ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff public void setCountryCode(String country, boolean persist) { 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1359ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff mService.setCountryCode(country, persist); 1360ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff } catch (RemoteException e) { } 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1364b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe * get the country code. 1365b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe * @return the country code in ISO 3166 format. 1366b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe * 1367b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe * @hide 1368b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe */ 1369b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe public String getCountryCode() { 1370b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe try { 1371b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe String country = mService.getCountryCode(); 1372b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe return(country); 1373b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe } catch (RemoteException e) { 1374b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe return null; 1375b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe } 1376b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe } 1377b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe 1378b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe /** 137936f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * Set the operational frequency band. 138036f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @param band One of 138136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * {@link #WIFI_FREQUENCY_BAND_AUTO}, 138236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * {@link #WIFI_FREQUENCY_BAND_5GHZ}, 138336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * {@link #WIFI_FREQUENCY_BAND_2GHZ}, 138436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @param persist {@code true} if this needs to be remembered 138536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @hide 138636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff */ 138736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff public void setFrequencyBand(int band, boolean persist) { 138836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff try { 138936f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff mService.setFrequencyBand(band, persist); 139036f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } catch (RemoteException e) { } 139136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } 139236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff 139336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff /** 139436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * Get the operational frequency band. 139536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @return One of 139636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * {@link #WIFI_FREQUENCY_BAND_AUTO}, 139736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * {@link #WIFI_FREQUENCY_BAND_5GHZ}, 139836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * {@link #WIFI_FREQUENCY_BAND_2GHZ} or 139936f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * {@code -1} on failure. 140036f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @hide 140136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff */ 140236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff public int getFrequencyBand() { 140336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff try { 140436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff return mService.getFrequencyBand(); 140536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } catch (RemoteException e) { 140636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff return -1; 140736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } 140836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } 140936f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff 141036f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff /** 141136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * Check if the chipset supports dual frequency band (2.4 GHz and 5 GHz) 141236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @return {@code true} if supported, {@code false} otherwise. 141336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @hide 141436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff */ 141536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff public boolean isDualBandSupported() { 141636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff try { 141736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff return mService.isDualBandSupported(); 141836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } catch (RemoteException e) { 141936f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff return false; 142036f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } 142136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } 142236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff 142336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff /** 14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the DHCP-assigned addresses from the last successful DHCP request, 14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if any. 14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the DHCP information 14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public DhcpInfo getDhcpInfo() { 14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.getDhcpInfo(); 14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Enable or disable Wi-Fi. 14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param enabled {@code true} to enable, {@code false} to disable. 14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeds (or if the existing state 14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is the same as the requested state). 14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean setWifiEnabled(boolean enabled) { 14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.setWifiEnabled(enabled); 14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets the Wi-Fi enabled state. 14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return One of {@link #WIFI_STATE_DISABLED}, 14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #WIFI_STATE_DISABLING}, {@link #WIFI_STATE_ENABLED}, 14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #WIFI_STATE_ENABLING}, {@link #WIFI_STATE_UNKNOWN} 14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isWifiEnabled() 14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getWifiState() { 14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.getWifiEnabledState(); 14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return WIFI_STATE_UNKNOWN; 14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1464227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1466227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * Return whether Wi-Fi is enabled or disabled. 14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if Wi-Fi is enabled 14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getWifiState() 14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isWifiEnabled() { 14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getWifiState() == WIFI_STATE_ENABLED; 14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1473227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1475f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * Return TX packet counter, for CTS test of WiFi watchdog. 1476f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * @param listener is the interface to receive result 1477f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * 1478f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * @hide for CTS test only 1479f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng */ 1480f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public void getTxPacketCount(TxPacketCountListener listener) { 1481f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng validateChannel(); 1482302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(RSSI_PKTCNT_FETCH, 0, putListener(listener)); 1483f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng } 1484f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng 1485f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** 14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Calculates the level of the signal. This should be used any time a signal 14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is being shown. 1488227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rssi The power of the signal measured in RSSI. 14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param numLevels The number of levels to consider in the calculated 14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * level. 14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A level of the signal, given in the range of 0 to numLevels-1 14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (both inclusive). 14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static int calculateSignalLevel(int rssi, int numLevels) { 14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (rssi <= MIN_RSSI) { 14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (rssi >= MAX_RSSI) { 14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return numLevels - 1; 15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 15014c0d81b8add0372cc7194b17cc6d2bfc58baacd1Daniel Sandler float inputRange = (MAX_RSSI - MIN_RSSI); 15024c0d81b8add0372cc7194b17cc6d2bfc58baacd1Daniel Sandler float outputRange = (numLevels - 1); 15034c0d81b8add0372cc7194b17cc6d2bfc58baacd1Daniel Sandler return (int)((float)(rssi - MIN_RSSI) * outputRange / inputRange); 15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1506227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Compares two signal strengths. 1509227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rssiA The power of the first signal measured in RSSI. 15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rssiB The power of the second signal measured in RSSI. 15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns <0 if the first signal is weaker than the second signal, 15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 0 if the two signals have the same strength, and >0 if the first 15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * signal is stronger than the second signal. 15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static int compareSignalLevel(int rssiA, int rssiB) { 15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return rssiA - rssiB; 15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15215321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Start AccessPoint mode with the specified 15225321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * configuration. If the radio is already running in 15235321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * AP mode, update the new configuration 15245321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Note that starting in access point mode disables station 15255321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * mode operation 15265321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @param wifiConfig SSID, security and channel details as 15275321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * part of WifiConfiguration 15285321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @return {@code true} if the operation succeeds, {@code false} otherwise 15295321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 15305321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide Dont open up yet 15315321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 15325321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff public boolean setWifiApEnabled(WifiConfiguration wifiConfig, boolean enabled) { 15335321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff try { 1534ffcea7ae7316ab748a49f5e8f6c6798356f35719Irfan Sheriff mService.setWifiApEnabled(wifiConfig, enabled); 1535ffcea7ae7316ab748a49f5e8f6c6798356f35719Irfan Sheriff return true; 15365321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } catch (RemoteException e) { 15375321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff return false; 15385321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } 15395321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } 15405321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff 15415321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 15425321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Gets the Wi-Fi enabled state. 15435321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @return One of {@link #WIFI_AP_STATE_DISABLED}, 15445321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * {@link #WIFI_AP_STATE_DISABLING}, {@link #WIFI_AP_STATE_ENABLED}, 15455321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * {@link #WIFI_AP_STATE_ENABLING}, {@link #WIFI_AP_STATE_FAILED} 15465321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #isWifiApEnabled() 15475321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 15485321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide Dont open yet 15495321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 15505321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff public int getWifiApState() { 15515321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff try { 15525321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff return mService.getWifiApEnabledState(); 15535321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } catch (RemoteException e) { 15545321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff return WIFI_AP_STATE_FAILED; 15555321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } 15565321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } 15575321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff 15585321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 15595321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Return whether Wi-Fi AP is enabled or disabled. 15605321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @return {@code true} if Wi-Fi AP is enabled 15615321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #getWifiApState() 15625321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 15635321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide Dont open yet 15645321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 15655321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff public boolean isWifiApEnabled() { 15665321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff return getWifiApState() == WIFI_AP_STATE_ENABLED; 15675321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } 15685321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff 15695321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 15709ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff * Gets the Wi-Fi AP Configuration. 15719ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff * @return AP details in WifiConfiguration 15729ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff * 15739ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff * @hide Dont open yet 15749ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff */ 15759ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff public WifiConfiguration getWifiApConfiguration() { 15769ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff try { 15779ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff return mService.getWifiApConfiguration(); 15789ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff } catch (RemoteException e) { 15799ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff return null; 15809ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff } 15819ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff } 15829ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff 15839ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff /** 1584e9b056f8860296a08f93f4b7d2a0971c746c227bJan Nordqvist * Builds a WifiConfiguration from Hotspot 2.0 MIME file. 1585e9b056f8860296a08f93f4b7d2a0971c746c227bJan Nordqvist * @return AP details in WifiConfiguration 1586e9b056f8860296a08f93f4b7d2a0971c746c227bJan Nordqvist * 1587e9b056f8860296a08f93f4b7d2a0971c746c227bJan Nordqvist * @hide Dont open yet 1588e9b056f8860296a08f93f4b7d2a0971c746c227bJan Nordqvist */ 1589e9b056f8860296a08f93f4b7d2a0971c746c227bJan Nordqvist public WifiConfiguration buildWifiConfig(String uriString, String mimeType, byte[] data) { 1590e9b056f8860296a08f93f4b7d2a0971c746c227bJan Nordqvist try { 1591e9b056f8860296a08f93f4b7d2a0971c746c227bJan Nordqvist return mService.buildWifiConfig(uriString, mimeType, data); 1592e9b056f8860296a08f93f4b7d2a0971c746c227bJan Nordqvist } catch (RemoteException e) { 1593f6d3d148d50562823e5f953ddd9c084266ac4c1bJan Nordqvist Log.w(TAG, "Caught RemoteException trying to build wifi config: " + e); 15949ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff return null; 15959ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff } 15969ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff } 15979ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff 15989ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff /** 159917b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff * Sets the Wi-Fi AP Configuration. 160017b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff * @return {@code true} if the operation succeeded, {@code false} otherwise 160117b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff * 160217b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff * @hide Dont open yet 160317b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff */ 160417b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff public boolean setWifiApConfiguration(WifiConfiguration wifiConfig) { 160517b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff try { 160617b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff mService.setWifiApConfiguration(wifiConfig); 160717b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff return true; 160817b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff } catch (RemoteException e) { 160917b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff return false; 161017b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff } 161117b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff } 161217b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff 16130d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff /** 16140d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * Start the driver and connect to network. 16150d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 16160d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * This function will over-ride WifiLock and device idle status. For example, 16170d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * even if the device is idle or there is only a scan-only lock held, 16180d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * a start wifi would mean that wifi connection is kept active until 16190d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * a stopWifi() is sent. 16200d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 16210d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * This API is used by WifiStateTracker 16220d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 16230d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @return {@code true} if the operation succeeds else {@code false} 16240d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @hide 16250d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff */ 16260d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff public boolean startWifi() { 16270d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff try { 16280d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff mService.startWifi(); 16290d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return true; 16300d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } catch (RemoteException e) { 16310d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return false; 16320d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 16330d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 16340d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff 16350d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff /** 16360d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * Disconnect from a network (if any) and stop the driver. 16370d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 16380d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * This function will over-ride WifiLock and device idle status. Wi-Fi 16390d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * stays inactive until a startWifi() is issued. 16400d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 16410d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * This API is used by WifiStateTracker 16420d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 16430d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @return {@code true} if the operation succeeds else {@code false} 16440d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @hide 16450d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff */ 16460d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff public boolean stopWifi() { 16470d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff try { 16480d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff mService.stopWifi(); 16490d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return true; 16500d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } catch (RemoteException e) { 16510d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return false; 16520d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 16530d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 16540d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff 16550d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff /** 16560d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * Add a bssid to the supplicant blacklist 16570d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 16580d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * This API is used by WifiWatchdogService 16590d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 16600d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @return {@code true} if the operation succeeds else {@code false} 16610d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @hide 16620d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff */ 16630d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff public boolean addToBlacklist(String bssid) { 16640d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff try { 16650d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff mService.addToBlacklist(bssid); 16660d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return true; 16670d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } catch (RemoteException e) { 16680d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return false; 16690d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 16700d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 16710d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff 16720d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff /** 16730d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * Clear the supplicant blacklist 16740d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 16750d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * This API is used by WifiWatchdogService 16760d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 16770d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @return {@code true} if the operation succeeds else {@code false} 16780d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @hide 16790d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff */ 16800d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff public boolean clearBlacklist() { 16810d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff try { 16820d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff mService.clearBlacklist(); 16830d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return true; 16840d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } catch (RemoteException e) { 16850d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return false; 16860d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 16870d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 16880d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff 168964f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde 169064f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde /** 1691b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * Enable/Disable TDLS on a specific local route. 169264f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde * 1693b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * <p> 1694b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * TDLS enables two wireless endpoints to talk to each other directly 1695b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * without going through the access point that is managing the local 1696b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * network. It saves bandwidth and improves quality of the link. 1697b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * </p> 1698b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * <p> 1699b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * This API enables/disables the option of using TDLS. If enabled, the 1700b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * underlying hardware is free to use TDLS or a hop through the access 1701b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * point. If disabled, existing TDLS session is torn down and 1702b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * hardware is restricted to use access point for transferring wireless 1703b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * packets. Default value for all routes is 'disabled', meaning restricted 1704b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * to use access point for transferring packets. 1705b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * </p> 170664f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde * 170764f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde * @param remoteIPAddress IP address of the endpoint to setup TDLS with 170864f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde * @param enable true = setup and false = tear down TDLS 170964f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde */ 1710b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde public void setTdlsEnabled(InetAddress remoteIPAddress, boolean enable) { 171164f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde try { 171264f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde mService.enableTdls(remoteIPAddress.getHostAddress(), enable); 171364f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde } catch (RemoteException e) { 171464f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde // Just ignore the exception 171564f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde } 171664f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde } 171764f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde 171864f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde /** 1719b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * Similar to {@link #setTdlsEnabled(InetAddress, boolean) }, except 1720b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * this version allows you to specify remote endpoint with a MAC address. 172164f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde * @param remoteMacAddress MAC address of the remote endpoint such as 00:00:0c:9f:f2:ab 172264f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde * @param enable true = setup and false = tear down TDLS 172364f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde */ 1724b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde public void setTdlsEnabledWithMacAddress(String remoteMacAddress, boolean enable) { 172564f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde try { 172664f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde mService.enableTdlsWithMacAddress(remoteMacAddress, enable); 172764f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde } catch (RemoteException e) { 172864f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde // Just ignore the exception 172964f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde } 173064f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde } 173164f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde 1732e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff /* TODO: deprecate synchronous API and open up the following API */ 1733ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 1734d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff private static final int BASE = Protocol.BASE_WIFI_MANAGER; 1735d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1736ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff /* Commands to WifiService */ 1737ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff /** @hide */ 1738d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int CONNECT_NETWORK = BASE + 1; 1739d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 1740d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int CONNECT_NETWORK_FAILED = BASE + 2; 1741d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 1742d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int CONNECT_NETWORK_SUCCEEDED = BASE + 3; 1743d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1744d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 1745d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int FORGET_NETWORK = BASE + 4; 1746d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 1747d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int FORGET_NETWORK_FAILED = BASE + 5; 1748ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff /** @hide */ 1749d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int FORGET_NETWORK_SUCCEEDED = BASE + 6; 1750d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1751ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff /** @hide */ 1752d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int SAVE_NETWORK = BASE + 7; 1753ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff /** @hide */ 1754d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int SAVE_NETWORK_FAILED = BASE + 8; 17558dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy /** @hide */ 1756d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int SAVE_NETWORK_SUCCEEDED = BASE + 9; 1757ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 1758ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff /** @hide */ 1759d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int START_WPS = BASE + 10; 1760d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 1761d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int START_WPS_SUCCEEDED = BASE + 11; 1762d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 1763d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int WPS_FAILED = BASE + 12; 176486a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff /** @hide */ 1765d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int WPS_COMPLETED = BASE + 13; 1766d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1767d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 176886a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int CANCEL_WPS = BASE + 14; 176986a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff /** @hide */ 177086a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int CANCEL_WPS_FAILED = BASE + 15; 177186a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff /** @hide */ 177286a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int CANCEL_WPS_SUCCEDED = BASE + 16; 177386a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff 177486a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff /** @hide */ 177586a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int DISABLE_NETWORK = BASE + 17; 1776d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 177786a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int DISABLE_NETWORK_FAILED = BASE + 18; 1778d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 177986a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int DISABLE_NETWORK_SUCCEEDED = BASE + 19; 1780ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 1781f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** @hide */ 1782f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public static final int RSSI_PKTCNT_FETCH = BASE + 20; 1783f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** @hide */ 1784f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public static final int RSSI_PKTCNT_FETCH_SUCCEEDED = BASE + 21; 1785f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** @hide */ 1786f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public static final int RSSI_PKTCNT_FETCH_FAILED = BASE + 22; 1787f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng 1788d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 1789d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Passed with {@link ActionListener#onFailure}. 1790d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Indicates that the operation failed due to an internal error. 179173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 1792d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 179386a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int ERROR = 0; 1794d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1795d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 1796d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Passed with {@link ActionListener#onFailure}. 1797d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Indicates that the operation is already in progress 179873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 1799d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 180086a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int IN_PROGRESS = 1; 1801d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1802d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 1803d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Passed with {@link ActionListener#onFailure}. 1804d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Indicates that the operation failed because the framework is busy and 1805d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * unable to service the request 180673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 1807d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 180886a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int BUSY = 2; 1809d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1810d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /* WPS specific errors */ 1811674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande /** WPS overlap detected */ 181286a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int WPS_OVERLAP_ERROR = 3; 1813674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande /** WEP on WPS is prohibited */ 181486a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int WPS_WEP_PROHIBITED = 4; 1815674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande /** TKIP only prohibited */ 181686a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int WPS_TKIP_ONLY_PROHIBITED = 5; 1817674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande /** Authentication failure on WPS */ 181886a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int WPS_AUTH_FAILURE = 6; 1819674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande /** WPS timed out */ 182086a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int WPS_TIMED_OUT = 7; 1821d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 182210652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde /** 182310652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde * Passed with {@link ActionListener#onFailure}. 182410652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde * Indicates that the operation failed due to invalid inputs 182573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 182610652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde */ 182710652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde public static final int INVALID_ARGS = 8; 182810652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde 1829ae81483a15bb3811cfc221970ea290599b43d4deSky Faber /** 1830ae81483a15bb3811cfc221970ea290599b43d4deSky Faber * Passed with {@link ActionListener#onFailure}. 1831ae81483a15bb3811cfc221970ea290599b43d4deSky Faber * Indicates that the operation failed due to user permissions. 1832ae81483a15bb3811cfc221970ea290599b43d4deSky Faber * @hide 1833ae81483a15bb3811cfc221970ea290599b43d4deSky Faber */ 1834ae81483a15bb3811cfc221970ea290599b43d4deSky Faber public static final int NOT_AUTHORIZED = 9; 1835ae81483a15bb3811cfc221970ea290599b43d4deSky Faber 183673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 183773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * Interface for callback invocation on an application action 183873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 183973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 1840d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public interface ActionListener { 1841d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** The operation succeeded */ 1842d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public void onSuccess(); 1843d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 1844d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * The operation failed 1845d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param reason The reason for failure could be one of 1846d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * {@link #ERROR}, {@link #IN_PROGRESS} or {@link #BUSY} 1847d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 1848d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public void onFailure(int reason); 1849d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1850d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1851674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande /** Interface for callback invocation on a start WPS action */ 185273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static abstract class WpsCallback { 1853d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** WPS start succeeded */ 185473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public abstract void onStarted(String pin); 1855d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1856d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** WPS operation completed succesfully */ 185773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public abstract void onSucceeded(); 1858d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1859d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 1860d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * WPS operation failed 1861d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param reason The reason for failure could be one of 186273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * {@link #WPS_TKIP_ONLY_PROHIBITED}, {@link #WPS_OVERLAP_ERROR}, 186373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * {@link #WPS_WEP_PROHIBITED}, {@link #WPS_TIMED_OUT} or {@link #WPS_AUTH_FAILURE} 186473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * and some generic errors. 1865d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 186673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public abstract void onFailed(int reason); 1867d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1868d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1869f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** Interface for callback invocation on a TX packet count poll action {@hide} */ 1870f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public interface TxPacketCountListener { 1871f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** 1872f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * The operation succeeded 1873f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * @param count TX packet counter 1874f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng */ 1875f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public void onSuccess(int count); 1876f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** 1877f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * The operation failed 1878f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * @param reason The reason for failure could be one of 1879f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * {@link #ERROR}, {@link #IN_PROGRESS} or {@link #BUSY} 1880f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng */ 1881f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public void onFailure(int reason); 1882f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng } 1883f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng 1884302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static class ServiceHandler extends Handler { 188588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff ServiceHandler(Looper looper) { 188688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff super(looper); 1887d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1888d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 188988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff @Override 189088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void handleMessage(Message message) { 189188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff Object listener = removeListener(message.arg2); 189288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff switch (message.what) { 189388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED: 189488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (message.arg1 == AsyncChannel.STATUS_SUCCESSFUL) { 1895302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(AsyncChannel.CMD_CHANNEL_FULL_CONNECTION); 189688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } else { 189788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff Log.e(TAG, "Failed to set up channel connection"); 189888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff // This will cause all further async API calls on the WifiManager 189988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff // to fail and throw an exception 1900302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel = null; 190188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 1902302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sConnected.countDown(); 190388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 190488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED: 190588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff // Ignore 190688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 190788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case AsyncChannel.CMD_CHANNEL_DISCONNECTED: 190888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff Log.e(TAG, "Channel connection lost"); 190988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff // This will cause all further async API calls on the WifiManager 191088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff // to fail and throw an exception 1911302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel = null; 1912fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff getLooper().quit(); 191388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 191488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff /* ActionListeners grouped together */ 191588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.CONNECT_NETWORK_FAILED: 191688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.FORGET_NETWORK_FAILED: 191788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.SAVE_NETWORK_FAILED: 191888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.DISABLE_NETWORK_FAILED: 191988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener != null) { 192088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff ((ActionListener) listener).onFailure(message.arg1); 192188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 192288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 192388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff /* ActionListeners grouped together */ 192488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.CONNECT_NETWORK_SUCCEEDED: 192588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.FORGET_NETWORK_SUCCEEDED: 192688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.SAVE_NETWORK_SUCCEEDED: 192788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.DISABLE_NETWORK_SUCCEEDED: 192888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener != null) { 192988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff ((ActionListener) listener).onSuccess(); 193088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 193188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 193288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.START_WPS_SUCCEEDED: 193388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener != null) { 193488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff WpsResult result = (WpsResult) message.obj; 193573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande ((WpsCallback) listener).onStarted(result.pin); 193688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff //Listener needs to stay until completion or failure 1937302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff synchronized(sListenerMapLock) { 1938302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sListenerMap.put(message.arg2, listener); 1939d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 194088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 194188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 194288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.WPS_COMPLETED: 194388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener != null) { 194473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande ((WpsCallback) listener).onSucceeded(); 194588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 194688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 194788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.WPS_FAILED: 194888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener != null) { 194973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande ((WpsCallback) listener).onFailed(message.arg1); 195073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 195173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande break; 195273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande case WifiManager.CANCEL_WPS_SUCCEDED: 195373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande if (listener != null) { 195473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande ((WpsCallback) listener).onSucceeded(); 195573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 195673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande break; 195773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande case WifiManager.CANCEL_WPS_FAILED: 195873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande if (listener != null) { 195973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande ((WpsCallback) listener).onFailed(message.arg1); 196088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 1961f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng break; 1962f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng case WifiManager.RSSI_PKTCNT_FETCH_SUCCEEDED: 1963f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng if (listener != null) { 1964f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng RssiPacketCountInfo info = (RssiPacketCountInfo) message.obj; 1965f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng if (info != null) 1966f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng ((TxPacketCountListener) listener).onSuccess(info.txgood + info.txbad); 1967f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng else 1968f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng ((TxPacketCountListener) listener).onFailure(ERROR); 1969f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng } 1970f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng break; 1971f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng case WifiManager.RSSI_PKTCNT_FETCH_FAILED: 1972f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng if (listener != null) { 1973f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng ((TxPacketCountListener) listener).onFailure(message.arg1); 1974f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng } 197588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 197688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff default: 197788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff //ignore 197888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 1979d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1980d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 198188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 1982d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1983302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static int putListener(Object listener) { 198488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener == null) return INVALID_KEY; 198588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff int key; 1986302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff synchronized (sListenerMapLock) { 198788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff do { 1988302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff key = sListenerKey++; 198988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } while (key == INVALID_KEY); 1990302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sListenerMap.put(key, listener); 1991d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 199288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff return key; 199388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 1994d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1995302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static Object removeListener(int key) { 199688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (key == INVALID_KEY) return null; 1997302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff synchronized (sListenerMapLock) { 1998302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff Object listener = sListenerMap.get(key); 1999302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sListenerMap.remove(key); 200088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff return listener; 2001d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 2002d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 2003ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 200488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff private void init() { 2005cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff synchronized (sThreadRefLock) { 2006cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff if (++sThreadRefCount == 1) { 2007302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff Messenger messenger = getWifiServiceMessenger(); 2008302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff if (messenger == null) { 2009302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel = null; 2010302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff return; 2011302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff } 2012302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff 2013cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff sHandlerThread = new HandlerThread("WifiManager"); 2014302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel = new AsyncChannel(); 2015302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sConnected = new CountDownLatch(1); 2016302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff 2017cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff sHandlerThread.start(); 2018302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff Handler handler = new ServiceHandler(sHandlerThread.getLooper()); 2019302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.connect(mContext, handler, messenger); 2020302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff try { 2021302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sConnected.await(); 2022302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff } catch (InterruptedException e) { 2023302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff Log.e(TAG, "interrupted wait at init"); 2024302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff } 2025cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff } 2026cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff } 2027d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 2028ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 202988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff private void validateChannel() { 2030302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff if (sAsyncChannel == null) throw new IllegalStateException( 203135bbe27d58ccf01ffd170b0f617a568bc843a49eIrfan Sheriff "No permission to access and change wifi or a bad initialization"); 203288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 203388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff 20341022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti private void initConnectivityManager() { 20351022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti // TODO: what happens if an app calls a WifiManager API before ConnectivityManager is 20361022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti // registered? Can we fix this by starting ConnectivityService before WifiService? 20371022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti if (sCM == null) { 20381022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti sCM = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); 20391022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti if (sCM == null) { 20401022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti throw new IllegalStateException("Bad luck, ConnectivityService not started."); 20411022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti } 20421022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti } 20431022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti } 20441022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti 20451022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti /** 20461022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * A NetworkCallback that pins the process to the first wifi network to connect. 20471022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * 20481022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * We use this to maintain compatibility with pre-M apps that call WifiManager.enableNetwork() 20491022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * to connect to a Wi-Fi network that has no Internet access, and then assume that they will be 20501022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * able to use that network because it's the system default. 20511022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * 20521022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * In order to maintain compatibility with apps that call setProcessDefaultNetwork themselves, 20531022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * we try not to set the default network unless they have already done so, and we try not to 20541022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * clear the default network unless we set it ourselves. 20551022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * 20561022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * This should maintain behaviour that's compatible with L, which would pin the whole system to 20571022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * any wifi network that was created via enableNetwork(..., true) until that network 20581022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * disconnected. 20591022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * 20601022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * Note that while this hack allows network traffic to flow, it is quite limited. For example: 20611022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * 20621022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * 1. setProcessDefaultNetwork only affects this process, so: 20631022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * - Any subprocesses spawned by this process will not be pinned to Wi-Fi. 20641022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * - If this app relies on any other apps on the device also being on Wi-Fi, that won't work 20651022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * either, because other apps on the device will not be pinned. 20661022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * 2. The behaviour of other APIs is not modified. For example: 20671022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * - getActiveNetworkInfo will return the system default network, not Wi-Fi. 20681022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * - There will be no CONNECTIVITY_ACTION broadcasts about TYPE_WIFI. 20691022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * - getProcessDefaultNetwork will not return null, so if any apps are relying on that, they 20701022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * will be surprised as well. 20711022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti */ 20721022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti private class PinningNetworkCallback extends NetworkCallback { 20731022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti private Network mPinnedNetwork; 20741022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti 20751022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti @Override 20761022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti public void onPreCheck(Network network) { 20771022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti if (sCM.getProcessDefaultNetwork() == null && mPinnedNetwork == null) { 20781022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti sCM.setProcessDefaultNetwork(network); 20791022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti mPinnedNetwork = network; 20801022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti Log.d(TAG, "Wifi alternate reality enabled on network " + network); 20811022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti } 20821022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti } 20831022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti 20841022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti @Override 20851022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti public void onLost(Network network) { 20861022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti if (network.equals(mPinnedNetwork) && network.equals(sCM.getProcessDefaultNetwork())) { 20871022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti sCM.setProcessDefaultNetwork(null); 20881022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti Log.d(TAG, "Wifi alternate reality disabled on network " + network); 20891022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti mPinnedNetwork = null; 20901022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti unregisterPinningNetworkCallback(); 20911022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti } 20921022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti } 20931022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti } 20941022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti 20951022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti private void registerPinningNetworkCallback() { 20961022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti initConnectivityManager(); 20971022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti synchronized (sCM) { 20981022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti if (mNetworkCallback == null) { 20991022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti // TODO: clear all capabilities. 21001022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti NetworkRequest request = new NetworkRequest.Builder() 21011022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) 21021022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) 21031022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti .build(); 21041022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti mNetworkCallback = new PinningNetworkCallback(); 2105fa57c489f621cd10add639cf7df59f630a7f41a4Lorenzo Colitti try { 2106fa57c489f621cd10add639cf7df59f630a7f41a4Lorenzo Colitti sCM.registerNetworkCallback(request, mNetworkCallback); 2107fa57c489f621cd10add639cf7df59f630a7f41a4Lorenzo Colitti } catch (SecurityException e) { 2108fa57c489f621cd10add639cf7df59f630a7f41a4Lorenzo Colitti Log.d(TAG, "Failed to register network callback", e); 2109fa57c489f621cd10add639cf7df59f630a7f41a4Lorenzo Colitti } 21101022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti } 21111022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti } 21121022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti } 21131022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti 21141022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti private void unregisterPinningNetworkCallback() { 21151022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti initConnectivityManager(); 21161022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti synchronized (sCM) { 21171022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti if (mNetworkCallback != null) { 2118fa57c489f621cd10add639cf7df59f630a7f41a4Lorenzo Colitti try { 2119fa57c489f621cd10add639cf7df59f630a7f41a4Lorenzo Colitti sCM.unregisterNetworkCallback(mNetworkCallback); 2120fa57c489f621cd10add639cf7df59f630a7f41a4Lorenzo Colitti } catch (SecurityException e) { 2121fa57c489f621cd10add639cf7df59f630a7f41a4Lorenzo Colitti Log.d(TAG, "Failed to unregister network callback", e); 2122fa57c489f621cd10add639cf7df59f630a7f41a4Lorenzo Colitti } 21231022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti mNetworkCallback = null; 21241022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti } 21251022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti } 21261022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti } 21271022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti 2128e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff /** 2129e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * Connect to a network with the given configuration. The network also 2130e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * gets added to the supplicant configuration. 2131e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 2132e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * For a new network, this function is used instead of a 2133e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * sequence of addNetwork(), enableNetwork(), saveConfiguration() and 2134e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * reconnect() 2135e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 2136e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @param config the set of variables that describe the configuration, 2137e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * contained in a {@link WifiConfiguration} object. 2138d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 213988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 214088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 214188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * 2142e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @hide 2143e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff */ 214488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void connect(WifiConfiguration config, ActionListener listener) { 2145d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (config == null) throw new IllegalArgumentException("config cannot be null"); 214688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 2147ab26407124cf861eacfe7bf0f2a1ef25f4b3a7bdIrfan Sheriff // Use INVALID_NETWORK_ID for arg1 when passing a config object 2148ab26407124cf861eacfe7bf0f2a1ef25f4b3a7bdIrfan Sheriff // arg1 is used to pass network id when the network already exists 2149302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(CONNECT_NETWORK, WifiConfiguration.INVALID_NETWORK_ID, 215088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff putListener(listener), config); 2151e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff } 2152e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff 2153e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff /** 2154e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * Connect to a network with the given networkId. 2155e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 2156e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * This function is used instead of a enableNetwork(), saveConfiguration() and 2157e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * reconnect() 2158e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 2159e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @param networkId the network id identifiying the network in the 2160e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * supplicant configuration list 2161d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 216288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 216388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 2164e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @hide 2165e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff */ 216688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void connect(int networkId, ActionListener listener) { 2167d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (networkId < 0) throw new IllegalArgumentException("Network id cannot be negative"); 216888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 2169302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(CONNECT_NETWORK, networkId, putListener(listener)); 2170e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff } 2171e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff 2172e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff /** 2173e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * Save the given network in the supplicant config. If the network already 2174e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * exists, the configuration is updated. A new network is enabled 2175e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * by default. 2176e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 2177e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * For a new network, this function is used instead of a 2178e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * sequence of addNetwork(), enableNetwork() and saveConfiguration(). 2179e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 2180e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * For an existing network, it accomplishes the task of updateNetwork() 2181e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * and saveConfiguration() 2182e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 2183e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @param config the set of variables that describe the configuration, 2184e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * contained in a {@link WifiConfiguration} object. 2185d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 218688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 218788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 2188e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @hide 2189e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff */ 219088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void save(WifiConfiguration config, ActionListener listener) { 2191d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (config == null) throw new IllegalArgumentException("config cannot be null"); 219288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 2193302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(SAVE_NETWORK, 0, putListener(listener), config); 2194e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff } 2195e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff 2196e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff /** 2197e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * Delete the network in the supplicant config. 2198e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 2199e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * This function is used instead of a sequence of removeNetwork() 2200e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * and saveConfiguration(). 2201e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 2202e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @param config the set of variables that describe the configuration, 2203e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * contained in a {@link WifiConfiguration} object. 2204d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 220588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 220688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 2207e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @hide 2208e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff */ 220988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void forget(int netId, ActionListener listener) { 2210d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (netId < 0) throw new IllegalArgumentException("Network id cannot be negative"); 221188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 2212302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(FORGET_NETWORK, netId, putListener(listener)); 2213d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 2214d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 2215d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 2216d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Disable network 2217d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * 2218d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param netId is the network Id 2219d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 222088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 222188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 2222d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @hide 2223d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 222488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void disable(int netId, ActionListener listener) { 2225d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (netId < 0) throw new IllegalArgumentException("Network id cannot be negative"); 222688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 2227302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(DISABLE_NETWORK, netId, putListener(listener)); 2228e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff } 2229e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff 223017b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff /** 223193e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle * Disable ephemeral Network 223293e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle * 223393e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle * @param SSID, in the format of WifiConfiguration's SSID. 223493e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle * @hide 223593e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle */ 223693e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle public void disableEphemeralNetwork(String SSID) { 223793e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle if (SSID == null) throw new IllegalArgumentException("SSID cannot be null"); 223893e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle try { 223993e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle mService.disableEphemeralNetwork(SSID); 224093e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle } catch (RemoteException e) { 224193e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle } 224293e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle } 224393e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle 224493e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle /** 224502fb46a297c4f645f2a30b574151401dd0978521Irfan Sheriff * Start Wi-fi Protected Setup 22465ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff * 2247c3eb1556446c932b5674adc40af8ff9bfc3a1880Vinit Deshpande * @param config WPS configuration (does not support {@link WpsInfo#LABEL}) 2248d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 224988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 225088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 22515ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff */ 225273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public void startWps(WpsInfo config, WpsCallback listener) { 2253d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (config == null) throw new IllegalArgumentException("config cannot be null"); 225488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 2255302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(START_WPS, 0, putListener(listener), config); 2256f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff } 2257f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff 2258f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff /** 225986a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff * Cancel any ongoing Wi-fi Protected Setup 226086a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff * 226186a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff * @param listener for callbacks on success or failure. Can be null. 226288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 226388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 226486a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff */ 226573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public void cancelWps(WpsCallback listener) { 226688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 2267302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(CANCEL_WPS, 0, putListener(listener)); 226886a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff } 226986a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff 227086a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff /** 2271227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * Get a reference to WifiService handler. This is used by a client to establish 2272227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * an AsyncChannel communication with WifiService 2273227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 2274227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * @return Messenger pointing to the WifiService handler 2275227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * @hide 2276227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff */ 227707573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff public Messenger getWifiServiceMessenger() { 2278227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff try { 227907573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff return mService.getWifiServiceMessenger(); 2280227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff } catch (RemoteException e) { 2281227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff return null; 228235bbe27d58ccf01ffd170b0f617a568bc843a49eIrfan Sheriff } catch (SecurityException e) { 228335bbe27d58ccf01ffd170b0f617a568bc843a49eIrfan Sheriff return null; 2284227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff } 2285227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff } 2286227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 228707573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff 228807573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff /** 22894aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff * Returns the file in which IP and proxy configuration data is stored 22904aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff * @hide 22914aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff */ 22924aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff public String getConfigFile() { 22934aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff try { 22944aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff return mService.getConfigFile(); 22954aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff } catch (RemoteException e) { 22964aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff return null; 22974aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff } 22984aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff } 22994aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff 23004aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff /** 23019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Allows an application to keep the Wi-Fi radio awake. 23029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Normally the Wi-Fi radio may turn off when the user has not used the device in a while. 2303227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * Acquiring a WifiLock will keep the radio on until the lock is released. Multiple 23049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * applications may hold WifiLocks, and the radio will only be allowed to turn off when no 23059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WifiLocks are held in any application. 2306d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * <p> 23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Before using a WifiLock, consider carefully if your application requires Wi-Fi access, or 23089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * could function over a mobile network, if available. A program that needs to download large 23099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * files should hold a WifiLock to ensure that the download will complete, but a program whose 23109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * network usage is occasional or low-bandwidth should not hold a WifiLock to avoid adversely 23119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * affecting battery life. 2312d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * <p> 23139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Note that WifiLocks cannot override the user-level "Wi-Fi Enabled" setting, nor Airplane 23149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Mode. They simply keep the radio from turning off when Wi-Fi is already on but the device 23159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is idle. 2316d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * <p> 2317d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * Any application using a WifiLock must request the {@code android.permission.WAKE_LOCK} 2318d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * permission in an {@code <uses-permission>} element of the application's manifest. 23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public class WifiLock { 23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mTag; 23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final IBinder mBinder; 23239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mRefCount; 23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLockType; 23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mRefCounted; 23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mHeld; 23277e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn private WorkSource mWorkSource; 23289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private WifiLock(int lockType, String tag) { 23309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTag = tag; 23319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLockType = lockType; 23329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBinder = new Binder(); 23339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRefCount = 0; 23349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRefCounted = true; 23359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeld = false; 23369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 23399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Locks the Wi-Fi radio on until {@link #release} is called. 23409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this WifiLock is reference-counted, each call to {@code acquire} will increment the 2342227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * reference count, and the radio will remain locked as long as the reference count is 23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * above zero. 23449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this WifiLock is not reference-counted, the first call to {@code acquire} will lock 23469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the radio, but subsequent calls will be ignored. Only one call to {@link #release} 23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be required, regardless of the number of times that {@code acquire} is called. 23489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 23499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void acquire() { 23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mBinder) { 23512c02da2bc62c4dfef684ea381be02a4e568b73d0Irfan Sheriff if (mRefCounted ? (++mRefCount == 1) : (!mHeld)) { 23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 23537e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mService.acquireWifiLock(mBinder, mLockType, mTag, mWorkSource); 2354617750604c69e6068f68266d0e30324273aa990eMike Lockwood synchronized (WifiManager.this) { 2355617750604c69e6068f68266d0e30324273aa990eMike Lockwood if (mActiveLockCount >= MAX_ACTIVE_LOCKS) { 2356617750604c69e6068f68266d0e30324273aa990eMike Lockwood mService.releaseWifiLock(mBinder); 2357617750604c69e6068f68266d0e30324273aa990eMike Lockwood throw new UnsupportedOperationException( 2358617750604c69e6068f68266d0e30324273aa990eMike Lockwood "Exceeded maximum number of wifi locks"); 2359617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 2360617750604c69e6068f68266d0e30324273aa990eMike Lockwood mActiveLockCount++; 2361617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ignore) { 23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeld = true; 23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unlocks the Wi-Fi radio, allowing it to turn off when the device is idle. 23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this WifiLock is reference-counted, each call to {@code release} will decrement the 23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * reference count, and the radio will be unlocked only when the reference count reaches 23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * zero. If the reference count goes below zero (that is, if {@code release} is called 23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a greater number of times than {@link #acquire}), an exception is thrown. 23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this WifiLock is not reference-counted, the first call to {@code release} (after 23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the radio was locked using {@link #acquire}) will unlock the radio, and subsequent 23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * calls will be ignored. 23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void release() { 23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mBinder) { 23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRefCounted ? (--mRefCount == 0) : (mHeld)) { 23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.releaseWifiLock(mBinder); 2386617750604c69e6068f68266d0e30324273aa990eMike Lockwood synchronized (WifiManager.this) { 2387617750604c69e6068f68266d0e30324273aa990eMike Lockwood mActiveLockCount--; 2388617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ignore) { 23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeld = false; 23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRefCount < 0) { 23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("WifiLock under-locked " + mTag); 23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Controls whether this is a reference-counted or non-reference-counted WifiLock. 24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reference-counted WifiLocks keep track of the number of calls to {@link #acquire} and 24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #release}, and only allow the radio to sleep when every call to {@link #acquire} 24049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * has been balanced with a call to {@link #release}. Non-reference-counted WifiLocks 24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * lock the radio whenever {@link #acquire} is called and it is unlocked, and unlock the 24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * radio whenever {@link #release} is called and it is locked. 24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param refCounted true if this WifiLock should keep a reference count 24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setReferenceCounted(boolean refCounted) { 24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRefCounted = refCounted; 24129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 24159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Checks whether this WifiLock is currently held. 24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if this WifiLock is held, false otherwise 24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isHeld() { 24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mBinder) { 24219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mHeld; 24229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24257e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void setWorkSource(WorkSource ws) { 24267e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mBinder) { 24277e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (ws != null && ws.size() == 0) { 24287e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn ws = null; 24297e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 24307e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn boolean changed = true; 24317e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (ws == null) { 24327e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mWorkSource = null; 24337e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } else { 2434a31510e47a0f0c2525702c2f10a85064322a28f2David Christie ws.clearNames(); 2435a31510e47a0f0c2525702c2f10a85064322a28f2David Christie if (mWorkSource == null) { 2436a31510e47a0f0c2525702c2f10a85064322a28f2David Christie changed = mWorkSource != null; 2437a31510e47a0f0c2525702c2f10a85064322a28f2David Christie mWorkSource = new WorkSource(ws); 2438a31510e47a0f0c2525702c2f10a85064322a28f2David Christie } else { 2439a31510e47a0f0c2525702c2f10a85064322a28f2David Christie changed = mWorkSource.diff(ws); 2440a31510e47a0f0c2525702c2f10a85064322a28f2David Christie if (changed) { 2441a31510e47a0f0c2525702c2f10a85064322a28f2David Christie mWorkSource.set(ws); 2442a31510e47a0f0c2525702c2f10a85064322a28f2David Christie } 24437e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 24447e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 24457e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (changed && mHeld) { 24467e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn try { 24477e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mService.updateWifiLockWorkSource(mBinder, mWorkSource); 24487e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } catch (RemoteException e) { 24497e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 24507e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 24517e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 24527e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 24537e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 24549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 24559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String s1, s2, s3; 24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mBinder) { 24579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s1 = Integer.toHexString(System.identityHashCode(this)); 24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s2 = mHeld ? "held; " : ""; 24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRefCounted) { 24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s3 = "refcounted: refcount = " + mRefCount; 24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s3 = "not refcounted"; 24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "WifiLock{ " + s1 + "; " + s2 + s3 + " }"; 24659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void finalize() throws Throwable { 24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.finalize(); 24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mBinder) { 24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mHeld) { 24739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 24749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.releaseWifiLock(mBinder); 2475617750604c69e6068f68266d0e30324273aa990eMike Lockwood synchronized (WifiManager.this) { 2476617750604c69e6068f68266d0e30324273aa990eMike Lockwood mActiveLockCount--; 2477617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 24789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ignore) { 24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates a new WifiLock. 24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 24885876a4273e67271f0eca607af9520f7e5abbe4f3Irfan Sheriff * @param lockType the type of lock to create. See {@link #WIFI_MODE_FULL}, 2489652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * {@link #WIFI_MODE_FULL_HIGH_PERF} and {@link #WIFI_MODE_SCAN_ONLY} for 2490652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * descriptions of the types of Wi-Fi locks. 2491652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * @param tag a tag for the WifiLock to identify it in debugging messages. This string is 2492652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * never shown to the user under normal conditions, but should be descriptive 24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * enough to identify your application and the specific WifiLock within it, if it 24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * holds multiple WifiLocks. 24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a new, unacquired WifiLock with the given tag. 24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see WifiLock 24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public WifiLock createWifiLock(int lockType, String tag) { 25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new WifiLock(lockType, tag); 25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2503652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff 25049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates a new WifiLock. 25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param tag a tag for the WifiLock to identify it in debugging messages. This string is 25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * never shown to the user under normal conditions, but should be descriptive 25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * enough to identify your application and the specific WifiLock within it, if it 25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * holds multiple WifiLocks. 25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a new, unacquired WifiLock with the given tag. 25139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 25149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see WifiLock 25159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public WifiLock createWifiLock(String tag) { 25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new WifiLock(WIFI_MODE_FULL, tag); 25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25195347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 2520fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 25215347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt /** 2522fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Create a new MulticastLock 25235347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt * 2524fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * @param tag a tag for the MulticastLock to identify it in debugging 252541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * messages. This string is never shown to the user under 252641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * normal conditions, but should be descriptive enough to 252741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * identify your application and the specific MulticastLock 252841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * within it, if it holds multiple MulticastLocks. 25295347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt * 2530fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * @return a new, unacquired MulticastLock with the given tag. 2531fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 2532fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * @see MulticastLock 25335347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt */ 2534fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public MulticastLock createMulticastLock(String tag) { 2535fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt return new MulticastLock(tag); 25365347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 25375347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 25385347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt /** 2539fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Allows an application to receive Wifi Multicast packets. 2540fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Normally the Wifi stack filters out packets not explicitly 2541fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * addressed to this device. Acquring a MulticastLock will 2542fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * cause the stack to receive packets addressed to multicast 2543fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * addresses. Processing these extra packets can cause a noticable 254441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * battery drain and should be disabled when not needed. 25455347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt */ 2546fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public class MulticastLock { 2547fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt private String mTag; 2548fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt private final IBinder mBinder; 254941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt private int mRefCount; 255041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt private boolean mRefCounted; 2551fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt private boolean mHeld; 2552fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 2553fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt private MulticastLock(String tag) { 2554fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt mTag = tag; 2555fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt mBinder = new Binder(); 255641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt mRefCount = 0; 255741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt mRefCounted = true; 2558fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt mHeld = false; 2559fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2560fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 2561fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt /** 2562fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Locks Wifi Multicast on until {@link #release} is called. 2563fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 256441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * If this MulticastLock is reference-counted each call to 256541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * {@code acquire} will increment the reference count, and the 256641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * wifi interface will receive multicast packets as long as the 256741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * reference count is above zero. 256841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * 256941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * If this MulticastLock is not reference-counted, the first call to 257041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * {@code acquire} will turn on the multicast packets, but subsequent 257141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * calls will be ignored. Only one call to {@link #release} will 257241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * be required, regardless of the number of times that {@code acquire} 257341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * is called. 2574fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 2575fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Note that other applications may also lock Wifi Multicast on. 2576fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Only they can relinquish their lock. 2577fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 2578fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Also note that applications cannot leave Multicast locked on. 2579fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * When an app exits or crashes, any Multicast locks will be released. 2580fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt */ 2581fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public void acquire() { 2582fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt synchronized (mBinder) { 25832c02da2bc62c4dfef684ea381be02a4e568b73d0Irfan Sheriff if (mRefCounted ? (++mRefCount == 1) : (!mHeld)) { 2584fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt try { 2585fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt mService.acquireMulticastLock(mBinder, mTag); 2586617750604c69e6068f68266d0e30324273aa990eMike Lockwood synchronized (WifiManager.this) { 2587617750604c69e6068f68266d0e30324273aa990eMike Lockwood if (mActiveLockCount >= MAX_ACTIVE_LOCKS) { 2588617750604c69e6068f68266d0e30324273aa990eMike Lockwood mService.releaseMulticastLock(); 2589617750604c69e6068f68266d0e30324273aa990eMike Lockwood throw new UnsupportedOperationException( 2590617750604c69e6068f68266d0e30324273aa990eMike Lockwood "Exceeded maximum number of wifi locks"); 2591617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 2592617750604c69e6068f68266d0e30324273aa990eMike Lockwood mActiveLockCount++; 2593617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 2594fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } catch (RemoteException ignore) { 2595fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 259641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt mHeld = true; 2597fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2598fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2599fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2600fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 2601fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt /** 2602fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Unlocks Wifi Multicast, restoring the filter of packets 2603fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * not addressed specifically to this device and saving power. 2604fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 260541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * If this MulticastLock is reference-counted, each call to 260641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * {@code release} will decrement the reference count, and the 260741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * multicast packets will only stop being received when the reference 260841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * count reaches zero. If the reference count goes below zero (that 260941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * is, if {@code release} is called a greater number of times than 261041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * {@link #acquire}), an exception is thrown. 261141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * 261241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * If this MulticastLock is not reference-counted, the first call to 261341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * {@code release} (after the radio was multicast locked using 26144a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn * {@link #acquire}) will unlock the multicast, and subsequent calls 261541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * will be ignored. 261641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * 2617fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Note that if any other Wifi Multicast Locks are still outstanding 2618fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * this {@code release} call will not have an immediate effect. Only 2619fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * when all applications have released all their Multicast Locks will 2620fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * the Multicast filter be turned back on. 2621fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 2622fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Also note that when an app exits or crashes all of its Multicast 2623fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Locks will be automatically released. 2624fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt */ 2625fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public void release() { 2626fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt synchronized (mBinder) { 262741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt if (mRefCounted ? (--mRefCount == 0) : (mHeld)) { 2628fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt try { 2629fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt mService.releaseMulticastLock(); 2630617750604c69e6068f68266d0e30324273aa990eMike Lockwood synchronized (WifiManager.this) { 2631617750604c69e6068f68266d0e30324273aa990eMike Lockwood mActiveLockCount--; 2632617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 2633fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } catch (RemoteException ignore) { 2634fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 263541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt mHeld = false; 263641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt } 263741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt if (mRefCount < 0) { 263841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt throw new RuntimeException("MulticastLock under-locked " 263941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt + mTag); 2640fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2641fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2642fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2643fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 2644fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt /** 264541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * Controls whether this is a reference-counted or non-reference- 264641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * counted MulticastLock. 264741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * 264841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * Reference-counted MulticastLocks keep track of the number of calls 264941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * to {@link #acquire} and {@link #release}, and only stop the 265041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * reception of multicast packets when every call to {@link #acquire} 265141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * has been balanced with a call to {@link #release}. Non-reference- 265241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * counted MulticastLocks allow the reception of multicast packets 265341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * whenever {@link #acquire} is called and stop accepting multicast 265441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * packets whenever {@link #release} is called. 265541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * 265641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * @param refCounted true if this MulticastLock should keep a reference 265741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * count 265841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt */ 265941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt public void setReferenceCounted(boolean refCounted) { 266041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt mRefCounted = refCounted; 266141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt } 266241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt 266341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt /** 2664fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Checks whether this MulticastLock is currently held. 2665fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 2666fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * @return true if this MulticastLock is held, false otherwise 2667fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt */ 2668fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public boolean isHeld() { 2669fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt synchronized (mBinder) { 2670fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt return mHeld; 2671fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2672fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2673fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 2674fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public String toString() { 267541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt String s1, s2, s3; 2676fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt synchronized (mBinder) { 2677fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt s1 = Integer.toHexString(System.identityHashCode(this)); 2678fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt s2 = mHeld ? "held; " : ""; 267941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt if (mRefCounted) { 268041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt s3 = "refcounted: refcount = " + mRefCount; 268141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt } else { 268241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt s3 = "not refcounted"; 268341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt } 268441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt return "MulticastLock{ " + s1 + "; " + s2 + s3 + " }"; 2685fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2686fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2687fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 2688fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt @Override 2689fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt protected void finalize() throws Throwable { 2690fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt super.finalize(); 269141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt setReferenceCounted(false); 2692fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt release(); 26935347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 26945347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 26955347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 26965347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt /** 2697fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Check multicast filter status. 26985347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt * 2699fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * @return true if multicast packets are allowed. 27005347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt * 27015347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt * @hide pending API council approval 27025347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt */ 2703fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public boolean isMulticastEnabled() { 27045347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt try { 2705fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt return mService.isMulticastEnabled(); 27065347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } catch (RemoteException e) { 27075347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt return false; 27085347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 27095347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 2710e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt 2711e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt /** 2712e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt * Initialize the multicast filtering to 'on' 2713e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt * @hide no intent to publish 2714e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt */ 2715e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt public boolean initializeMulticastFiltering() { 2716e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt try { 2717e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt mService.initializeMulticastFiltering(); 2718e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt return true; 2719e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt } catch (RemoteException e) { 2720e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt return false; 2721e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt } 2722e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt } 2723da6da0907b28d4704aabbdb1bbeb4300954670d1Irfan Sheriff 2724fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff protected void finalize() throws Throwable { 2725fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff try { 2726cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff synchronized (sThreadRefLock) { 2727302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff if (--sThreadRefCount == 0 && sAsyncChannel != null) { 2728302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.disconnect(); 2729cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff } 2730939caef712f306a1c80ea27e9f41ef6e3ea9e0f1Irfan Sheriff } 2731fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff } finally { 2732fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff super.finalize(); 2733fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff } 2734fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff } 27355fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle 27365fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle /** 27375fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle * Set wifi verbose log. Called from developer settings. 27385fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle * @hide 27395fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle */ 27405fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle public void enableVerboseLogging (int verbose) { 27415fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle try { 27425fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle mService.enableVerboseLogging(verbose); 2743f5af4a972598611c46d4bf169919e23b7375a5a9vandwalle } catch (Exception e) { 2744f5af4a972598611c46d4bf169919e23b7375a5a9vandwalle //ignore any failure here 2745f5af4a972598611c46d4bf169919e23b7375a5a9vandwalle Log.e(TAG, "enableVerboseLogging " + e.toString()); 27465fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } 27475fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } 27485fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle 27495fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle /** 27505fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle * Get the WiFi verbose logging level.This is used by settings 27515fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle * to decide what to show within the picker. 27525fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle * @hide 27535fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle */ 27545fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle public int getVerboseLoggingLevel() { 27555fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle try { 27565fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle return mService.getVerboseLoggingLevel(); 27575fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } catch (RemoteException e) { 27585fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle return 0; 27595fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } 27605fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } 2761d524c78d9358e2fa1e67124468cffa5284870c62vandwalle 2762d524c78d9358e2fa1e67124468cffa5284870c62vandwalle /** 2763d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * Set wifi Aggressive Handover. Called from developer settings. 2764d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * @hide 2765d524c78d9358e2fa1e67124468cffa5284870c62vandwalle */ 2766d524c78d9358e2fa1e67124468cffa5284870c62vandwalle public void enableAggressiveHandover(int enabled) { 2767d524c78d9358e2fa1e67124468cffa5284870c62vandwalle try { 2768d524c78d9358e2fa1e67124468cffa5284870c62vandwalle mService.enableAggressiveHandover(enabled); 2769d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } catch (RemoteException e) { 2770d524c78d9358e2fa1e67124468cffa5284870c62vandwalle 2771d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 2772d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 2773d524c78d9358e2fa1e67124468cffa5284870c62vandwalle 2774d524c78d9358e2fa1e67124468cffa5284870c62vandwalle /** 2775d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * Get the WiFi Handover aggressiveness.This is used by settings 2776d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * to decide what to show within the picker. 2777d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * @hide 2778d524c78d9358e2fa1e67124468cffa5284870c62vandwalle */ 2779d524c78d9358e2fa1e67124468cffa5284870c62vandwalle public int getAggressiveHandover() { 2780d524c78d9358e2fa1e67124468cffa5284870c62vandwalle try { 2781d524c78d9358e2fa1e67124468cffa5284870c62vandwalle return mService.getAggressiveHandover(); 2782d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } catch (RemoteException e) { 2783d524c78d9358e2fa1e67124468cffa5284870c62vandwalle return 0; 2784d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 2785d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 2786d524c78d9358e2fa1e67124468cffa5284870c62vandwalle 2787d524c78d9358e2fa1e67124468cffa5284870c62vandwalle /** 2788d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * Set setting for allowing Scans when traffic is ongoing. 2789d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * @hide 2790d524c78d9358e2fa1e67124468cffa5284870c62vandwalle */ 2791d524c78d9358e2fa1e67124468cffa5284870c62vandwalle public void setAllowScansWithTraffic(int enabled) { 2792d524c78d9358e2fa1e67124468cffa5284870c62vandwalle try { 2793d524c78d9358e2fa1e67124468cffa5284870c62vandwalle mService.setAllowScansWithTraffic(enabled); 2794d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } catch (RemoteException e) { 2795d524c78d9358e2fa1e67124468cffa5284870c62vandwalle 2796d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 2797d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 2798d524c78d9358e2fa1e67124468cffa5284870c62vandwalle 2799d524c78d9358e2fa1e67124468cffa5284870c62vandwalle /** 2800d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * Get setting for allowing Scans when traffic is ongoing. 2801d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * @hide 2802d524c78d9358e2fa1e67124468cffa5284870c62vandwalle */ 2803d524c78d9358e2fa1e67124468cffa5284870c62vandwalle public int getAllowScansWithTraffic() { 2804d524c78d9358e2fa1e67124468cffa5284870c62vandwalle try { 2805d524c78d9358e2fa1e67124468cffa5284870c62vandwalle return mService.getAllowScansWithTraffic(); 2806d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } catch (RemoteException e) { 2807d524c78d9358e2fa1e67124468cffa5284870c62vandwalle return 0; 2808d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 2809d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 281073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 28115914caff06f9790238bea0536acfbf533cee9046Pierre Vandwalle /** 2812984dc850b4caeb4470e52bce773935be5305cf8eStuart Scott * Resets all wifi manager settings back to factory defaults. 2813984dc850b4caeb4470e52bce773935be5305cf8eStuart Scott * 2814984dc850b4caeb4470e52bce773935be5305cf8eStuart Scott * @hide 2815984dc850b4caeb4470e52bce773935be5305cf8eStuart Scott */ 2816984dc850b4caeb4470e52bce773935be5305cf8eStuart Scott public void factoryReset() { 2817f1fb39763d87dabe254b6ed64ac8f20145035bc0Stuart Scott try { 2818f1fb39763d87dabe254b6ed64ac8f20145035bc0Stuart Scott mService.factoryReset(); 2819f1fb39763d87dabe254b6ed64ac8f20145035bc0Stuart Scott } catch (RemoteException e) { 2820984dc850b4caeb4470e52bce773935be5305cf8eStuart Scott } 2821984dc850b4caeb4470e52bce773935be5305cf8eStuart Scott } 28227094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe 28237094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe /** 28247094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe * Get Network object of current wifi network 28257094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe * @return Get Network object of current wifi network 28267094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe * @hide 28277094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe */ 28287094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe public Network getCurrentNetwork() { 28297094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe try { 28307094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe return mService.getCurrentNetwork(); 28317094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe } catch (RemoteException e) { 28327094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe return null; 28337094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe } 28347094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe } 2835358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle 2836358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle /** 2837e8de06d2feb6680df15c1473fb72efb214ced744xinhe * Framework layer autojoin enable/disable when device is associated 2838e8de06d2feb6680df15c1473fb72efb214ced744xinhe * this will enable/disable autojoin scan and switch network when connected 2839e8de06d2feb6680df15c1473fb72efb214ced744xinhe * @return true -- if set successful false -- if set failed 2840358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle * @hide 2841358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle */ 2842e8de06d2feb6680df15c1473fb72efb214ced744xinhe public boolean enableAutoJoinWhenAssociated(boolean enabled) { 2843358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle try { 2844e8de06d2feb6680df15c1473fb72efb214ced744xinhe return mService.enableAutoJoinWhenAssociated(enabled); 2845358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle } catch (RemoteException e) { 2846e8de06d2feb6680df15c1473fb72efb214ced744xinhe return false; 2847358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle } 2848358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle } 2849358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle 2850358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle /** 2851e8de06d2feb6680df15c1473fb72efb214ced744xinhe * Get setting for Framework layer autojoin enable status 2852358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle * @hide 2853358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle */ 2854e8de06d2feb6680df15c1473fb72efb214ced744xinhe public boolean getEnableAutoJoinWhenAssociated() { 2855358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle try { 2856e8de06d2feb6680df15c1473fb72efb214ced744xinhe return mService.getEnableAutoJoinWhenAssociated(); 2857358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle } catch (RemoteException e) { 2858e8de06d2feb6680df15c1473fb72efb214ced744xinhe return false; 2859358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle } 2860358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle } 2861358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle /** 2862e8de06d2feb6680df15c1473fb72efb214ced744xinhe * Set setting for enabling autojoin Offload thru Wifi HAL layer 2863358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle * @hide 2864358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle */ 2865e8de06d2feb6680df15c1473fb72efb214ced744xinhe public void setHalBasedAutojoinOffload(int enabled) { 2866358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle try { 2867e8de06d2feb6680df15c1473fb72efb214ced744xinhe mService.setHalBasedAutojoinOffload(enabled); 2868358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle } catch (RemoteException e) { 2869358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle 2870358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle } 2871358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle } 2872358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle 2873358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle /** 2874e8de06d2feb6680df15c1473fb72efb214ced744xinhe * Get setting for enabling autojoin Offload thru Wifi HAL layer 2875358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle * @hide 2876358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle */ 2877e8de06d2feb6680df15c1473fb72efb214ced744xinhe public int getHalBasedAutojoinOffload() { 2878358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle try { 2879e8de06d2feb6680df15c1473fb72efb214ced744xinhe return mService.getHalBasedAutojoinOffload(); 2880358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle } catch (RemoteException e) { 2881358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle } 2882358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle return 0; 2883358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle } 2884651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff} 2885