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; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.DhcpInfo; 24738803fee62a98f244250996380820c4923e7f7bYuhao Zhengimport android.net.wifi.ScanSettings; 25738803fee62a98f244250996380820c4923e7f7bYuhao Zhengimport android.net.wifi.WifiChannel; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler; 2988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriffimport android.os.HandlerThread; 30d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriffimport android.os.Looper; 31d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriffimport android.os.Message; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 337e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackbornimport android.os.WorkSource; 34227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriffimport android.os.Messenger; 3588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriffimport android.util.Log; 36d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriffimport android.util.SparseArray; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3864f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapndeimport java.net.InetAddress; 3988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriffimport java.util.concurrent.CountDownLatch; 4088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff 41ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriffimport com.android.internal.util.AsyncChannel; 42d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriffimport com.android.internal.util.Protocol; 43ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class provides the primary API for managing all aspects of Wi-Fi 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * connectivity. Get an instance of this class by calling 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Context#getSystemService(String) Context.getSystemService(Context.WIFI_SERVICE)}. 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * It deals with several categories of items: 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The list of configured networks. The list can be viewed and updated, 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and attributes of individual entries can be modified.</li> 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The currently active Wi-Fi network, if any. Connectivity can be 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * established or torn down, and dynamic information about the state of 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the network can be queried.</li> 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Results of access point scans, containing enough information to 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * make decisions about what access point to connect to.</li> 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>It defines the names of various Intent actions that are broadcast 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * upon any sort of change in Wi-Fi state. 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is the API to use when performing Wi-Fi specific operations. To 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * perform operations that pertain to network connectivity at an abstract 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * level, use {@link android.net.ConnectivityManager}. 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class WifiManager { 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff private static final String TAG = "WifiManager"; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Supplicant error codes: 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The error code if there was a problem authenticating. 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int ERROR_AUTHENTICATING = 1; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7789710842585404ea33f941afeb2c321e706005e9Robert Greenwalt * Broadcast intent action indicating whether Wi-Fi scanning is allowed currently 7889710842585404ea33f941afeb2c321e706005e9Robert Greenwalt * @hide 7989710842585404ea33f941afeb2c321e706005e9Robert Greenwalt */ 8089710842585404ea33f941afeb2c321e706005e9Robert Greenwalt public static final String WIFI_SCAN_AVAILABLE = "wifi_scan_available"; 8189710842585404ea33f941afeb2c321e706005e9Robert Greenwalt 8289710842585404ea33f941afeb2c321e706005e9Robert Greenwalt /** 8389710842585404ea33f941afeb2c321e706005e9Robert Greenwalt * Extra int indicating scan availability, WIFI_STATE_ENABLED and WIFI_STATE_DISABLED 8489710842585404ea33f941afeb2c321e706005e9Robert Greenwalt * @hide 8589710842585404ea33f941afeb2c321e706005e9Robert Greenwalt */ 86cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong public static final String EXTRA_SCAN_AVAILABLE = "scan_enabled"; 87cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong 88cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong /** 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Broadcast intent action indicating that Wi-Fi has been enabled, disabled, 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * enabling, disabling, or unknown. One extra provides this state as an int. 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Another extra provides the previous state, if available. 92227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_WIFI_STATE 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_PREVIOUS_WIFI_STATE 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String WIFI_STATE_CHANGED_ACTION = 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android.net.wifi.WIFI_STATE_CHANGED"; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The lookup key for an int that indicates whether Wi-Fi is enabled, 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * disabled, enabling, disabling, or unknown. Retrieve it with 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getIntExtra(String,int)}. 103227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_DISABLED 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_DISABLING 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_ENABLED 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_ENABLING 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_UNKNOWN 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_WIFI_STATE = "wifi_state"; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The previous Wi-Fi state. 113227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_WIFI_STATE 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_PREVIOUS_WIFI_STATE = "previous_wifi_state"; 117227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wi-Fi is currently being disabled. The state will change to {@link #WIFI_STATE_DISABLED} if 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it finishes successfully. 121227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_CHANGED_ACTION 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getWifiState() 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WIFI_STATE_DISABLING = 0; 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wi-Fi is disabled. 128227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_CHANGED_ACTION 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getWifiState() 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WIFI_STATE_DISABLED = 1; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wi-Fi is currently being enabled. The state will change to {@link #WIFI_STATE_ENABLED} if 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it finishes successfully. 136227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_CHANGED_ACTION 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getWifiState() 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WIFI_STATE_ENABLING = 2; 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wi-Fi is enabled. 143227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_CHANGED_ACTION 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getWifiState() 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WIFI_STATE_ENABLED = 3; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wi-Fi is in an unknown state. This state will occur when an error happens while enabling 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or disabling. 151227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_CHANGED_ACTION 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getWifiState() 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WIFI_STATE_UNKNOWN = 4; 1565321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff 1575321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 1585321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Broadcast intent action indicating that Wi-Fi AP has been enabled, disabled, 1595321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * enabling, disabling, or failed. 1605321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 1615321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide 1625321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 1635321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff public static final String WIFI_AP_STATE_CHANGED_ACTION = 1645321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff "android.net.wifi.WIFI_AP_STATE_CHANGED"; 1655321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff 1665321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 1675321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * The lookup key for an int that indicates whether Wi-Fi AP is enabled, 1685321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * disabled, enabling, disabling, or failed. Retrieve it with 1695321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * {@link android.content.Intent#getIntExtra(String,int)}. 1705321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 1715321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_DISABLED 1725321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_DISABLING 1735321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_ENABLED 1745321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_ENABLING 1755321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_FAILED 1765321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 1775321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide 1785321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 1795321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff public static final String EXTRA_WIFI_AP_STATE = "wifi_state"; 1805321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 1815321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * The previous Wi-Fi state. 1825321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 1835321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #EXTRA_WIFI_AP_STATE 1845321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 1855321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide 1865321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 1875321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff public static final String EXTRA_PREVIOUS_WIFI_AP_STATE = "previous_wifi_state"; 1885321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 1895321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Wi-Fi AP is currently being disabled. The state will change to 1905321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * {@link #WIFI_AP_STATE_DISABLED} if it finishes successfully. 1915321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 1925321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_CHANGED_ACTION 1935321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #getWifiApState() 1945321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 1955321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide 1965321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 197a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff public static final int WIFI_AP_STATE_DISABLING = 10; 1985321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 1995321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Wi-Fi AP is disabled. 2005321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2015321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_CHANGED_ACTION 2025321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #getWifiState() 2035321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2045321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide 2055321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 206a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff public static final int WIFI_AP_STATE_DISABLED = 11; 2075321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 2085321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Wi-Fi AP is currently being enabled. The state will change to 2095321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * {@link #WIFI_AP_STATE_ENABLED} if it finishes successfully. 2105321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2115321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_CHANGED_ACTION 2125321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #getWifiApState() 2135321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2145321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide 2155321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 216a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff public static final int WIFI_AP_STATE_ENABLING = 12; 2175321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 2185321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Wi-Fi AP is enabled. 2195321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2205321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_CHANGED_ACTION 2215321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #getWifiApState() 2225321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2235321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide 2245321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 225a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff public static final int WIFI_AP_STATE_ENABLED = 13; 2265321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 2275321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Wi-Fi AP is in a failed state. This state will occur when an error occurs during 2285321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * enabling or disabling 2295321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2305321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_CHANGED_ACTION 2315321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #getWifiApState() 2325321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2335321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide 2345321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 235a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff public static final int WIFI_AP_STATE_FAILED = 14; 2365321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Broadcast intent action indicating that a connection to the supplicant has 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * been established (and it is now possible 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to perform Wi-Fi operations) or the connection to the supplicant has been 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * lost. One extra provides the connection state as a boolean, where {@code true} 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * means CONNECTED. 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_SUPPLICANT_CONNECTED 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String SUPPLICANT_CONNECTION_CHANGE_ACTION = 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android.net.wifi.supplicant.CONNECTION_CHANGE"; 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The lookup key for a boolean that indicates whether a connection to 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the supplicant daemon has been gained or lost. {@code true} means 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a connection now exists. 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve it with {@link android.content.Intent#getBooleanExtra(String,boolean)}. 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_SUPPLICANT_CONNECTED = "connected"; 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Broadcast intent action indicating that the state of Wi-Fi connectivity 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * has changed. One extra provides the new state 2583550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * in the form of a {@link android.net.NetworkInfo} object. If the new 2593550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * state is CONNECTED, additional extras may provide the BSSID and WifiInfo of 2603550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * the access point. 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as a {@code String}. 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_NETWORK_INFO 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_BSSID 2643550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * @see #EXTRA_WIFI_INFO 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String NETWORK_STATE_CHANGED_ACTION = "android.net.wifi.STATE_CHANGE"; 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The lookup key for a {@link android.net.NetworkInfo} object associated with the 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wi-Fi network. Retrieve with 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getParcelableExtra(String)}. 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_NETWORK_INFO = "networkInfo"; 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The lookup key for a String giving the BSSID of the access point to which 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * we are connected. Only present when the new state is CONNECTED. 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve with 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getStringExtra(String)}. 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_BSSID = "bssid"; 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2823550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * The lookup key for a {@link android.net.wifi.WifiInfo} object giving the 2833550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * information about the access point to which we are connected. Only present 2843550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * when the new state is CONNECTED. Retrieve with 2853550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * {@link android.content.Intent#getParcelableExtra(String)}. 2863550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy */ 2873550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy public static final String EXTRA_WIFI_INFO = "wifiInfo"; 2883550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy /** 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Broadcast intent action indicating that the state of establishing a connection to 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an access point has changed.One extra provides the new 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link SupplicantState}. Note that the supplicant state is Wi-Fi specific, and 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is not generally the most useful thing to look at if you are just interested in 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the overall state of connectivity. 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_NEW_STATE 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_SUPPLICANT_ERROR 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String SUPPLICANT_STATE_CHANGED_ACTION = 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android.net.wifi.supplicant.STATE_CHANGE"; 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The lookup key for a {@link SupplicantState} describing the new state 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve with 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getParcelableExtra(String)}. 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_NEW_STATE = "newState"; 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The lookup key for a {@link SupplicantState} describing the supplicant 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * error code if any 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve with 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getIntExtra(String, int)}. 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #ERROR_AUTHENTICATING 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_SUPPLICANT_ERROR = "supplicantError"; 315fcb659b66756ac02bd1491ae1365b27e8509a890Irfan Sheriff 316fcb659b66756ac02bd1491ae1365b27e8509a890Irfan Sheriff /** 317be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff * Broadcast intent action indicating that the configured networks changed. 3181b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * This can be as a result of adding/updating/deleting a network. If 3191b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * {@link #EXTRA_MULTIPLE_NETWORKS_CHANGED} is set to true the new configuration 3201b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * can be retreived with the {@link #EXTRA_WIFI_CONFIGURATION} extra. If multiple 3211b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * Wi-Fi configurations changed, {@link #EXTRA_WIFI_CONFIGURATION} will not be present. 322e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @hide 323e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff */ 324e75c0b8e3becd9f875679a5240f3b1e26d089a3fChelsea Derrick @SystemApi 325be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff public static final String CONFIGURED_NETWORKS_CHANGED_ACTION = 326be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff "android.net.wifi.CONFIGURED_NETWORKS_CHANGE"; 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3281b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * The lookup key for a (@link android.net.wifi.WifiConfiguration} object representing 3291b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * the changed Wi-Fi configuration when the {@link #CONFIGURED_NETWORKS_CHANGED_ACTION} 3301b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * broadcast is sent. 3311b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @hide 3321b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood */ 333e75c0b8e3becd9f875679a5240f3b1e26d089a3fChelsea Derrick @SystemApi 3341b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood public static final String EXTRA_WIFI_CONFIGURATION = "wifiConfiguration"; 3351b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood /** 3361b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * Multiple network configurations have changed. 3371b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @see #CONFIGURED_NETWORKS_CHANGED_ACTION 3381b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * 3391b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @hide 3401b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood */ 341e75c0b8e3becd9f875679a5240f3b1e26d089a3fChelsea Derrick @SystemApi 3421b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood public static final String EXTRA_MULTIPLE_NETWORKS_CHANGED = "multipleChanges"; 3431b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood /** 3441b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * The lookup key for an integer indicating the reason a Wi-Fi network configuration 3451b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * has changed. Only present if {@link #EXTRA_MULTIPLE_NETWORKS_CHANGED} is {@code false} 3461b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @see #CONFIGURED_NETWORKS_CHANGED_ACTION 3471b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @hide 3481b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood */ 349e75c0b8e3becd9f875679a5240f3b1e26d089a3fChelsea Derrick @SystemApi 3501b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood public static final String EXTRA_CHANGE_REASON = "changeReason"; 3511b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood /** 3521b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * The configuration is new and was added. 3531b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @hide 3541b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood */ 355e75c0b8e3becd9f875679a5240f3b1e26d089a3fChelsea Derrick @SystemApi 3561b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood public static final int CHANGE_REASON_ADDED = 0; 3571b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood /** 3581b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * The configuration was removed and is no longer present in the system's list of 3591b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * configured networks. 3601b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @hide 3611b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood */ 362e75c0b8e3becd9f875679a5240f3b1e26d089a3fChelsea Derrick @SystemApi 3631b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood public static final int CHANGE_REASON_REMOVED = 1; 3641b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood /** 3651b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * The configuration has changed as a result of explicit action or because the system 3661b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * took an automated action such as disabling a malfunctioning configuration. 3671b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @hide 3681b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood */ 369e75c0b8e3becd9f875679a5240f3b1e26d089a3fChelsea Derrick @SystemApi 3701b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood public static final int CHANGE_REASON_CONFIG_CHANGE = 2; 3711b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood /** 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * An access point scan has completed, and results are available from the supplicant. 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Call {@link #getScanResults()} to obtain the results. 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String SCAN_RESULTS_AVAILABLE_ACTION = "android.net.wifi.SCAN_RESULTS"; 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3780451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * A batch of access point scans has been completed and the results areavailable. 3790451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * Call {@link #getBatchedScanResults()} to obtain the results. 3800451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @hide pending review 3810451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt */ 3820451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 3830451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt public static final String BATCHED_SCAN_RESULTS_AVAILABLE_ACTION = 3840451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt "android.net.wifi.BATCHED_RESULTS"; 3850451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt /** 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The RSSI (signal strength) has changed. 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_NEW_RSSI 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String RSSI_CHANGED_ACTION = "android.net.wifi.RSSI_CHANGED"; 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The lookup key for an {@code int} giving the new RSSI in dBm. 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_NEW_RSSI = "newRssi"; 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 397be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff * Broadcast intent action indicating that the link configuration 3980d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * changed on wifi. 3990d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @hide 4000d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff */ 401be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff public static final String LINK_CONFIGURATION_CHANGED_ACTION = 402be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff "android.net.wifi.LINK_CONFIGURATION_CHANGED"; 403f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 4040d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff /** 40537e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt * The lookup key for a {@link android.net.LinkProperties} object associated with the 4060d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * Wi-Fi network. Retrieve with 4070d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * {@link android.content.Intent#getParcelableExtra(String)}. 4080d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @hide 4090d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff */ 41037e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt public static final String EXTRA_LINK_PROPERTIES = "linkProperties"; 4110d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff 4120d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff /** 413f9cb86aebe9647e0fe0137fc198ba16c017445c6Robert Greenwalt * The lookup key for a {@link android.net.NetworkCapabilities} object associated with the 414f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Wi-Fi network. Retrieve with 415f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * {@link android.content.Intent#getParcelableExtra(String)}. 416f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * @hide 417f61101f6266be243c481d163b95e65d67b8d1669Wink Saville */ 418f9cb86aebe9647e0fe0137fc198ba16c017445c6Robert Greenwalt public static final String EXTRA_NETWORK_CAPABILITIES = "networkCapabilities"; 419f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 420f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The network IDs of the configured networks could have changed. 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String NETWORK_IDS_CHANGED_ACTION = "android.net.wifi.NETWORK_IDS_CHANGED"; 42537e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4271ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * Activity Action: Show a system activity that allows the user to enable 4281ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * scans to be available even with Wi-Fi turned off. 4291ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * 4301ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * <p>Notification of the result of this activity is posted using the 4311ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * {@link android.app.Activity#onActivityResult} callback. The 4321ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * <code>resultCode</code> 4331ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * will be {@link android.app.Activity#RESULT_OK} if scan always mode has 4341ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * been turned on or {@link android.app.Activity#RESULT_CANCELED} if the user 4351ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * has rejected the request or an error has occurred. 4361ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff */ 4371ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 4381ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff public static final String ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE = 4391ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff "android.net.wifi.action.REQUEST_SCAN_ALWAYS_AVAILABLE"; 4401ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff 4411ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff /** 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Activity Action: Pick a Wi-Fi network to connect to. 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Input: Nothing. 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Output: Nothing. 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ACTION_PICK_WIFI_NETWORK = "android.net.wifi.PICK_WIFI_NETWORK"; 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 45099001278289036a3c645e599ed832943ff1b6e15Eric Shienbrood * In this Wi-Fi lock mode, Wi-Fi will be kept active, 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and will behave normally, i.e., it will attempt to automatically 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * establish a connection to a remembered access point that is 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * within range, and will do periodic scans if there are remembered 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * access points but none are in range. 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WIFI_MODE_FULL = 1; 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 45899001278289036a3c645e599ed832943ff1b6e15Eric Shienbrood * In this Wi-Fi lock mode, Wi-Fi will be kept active, 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * but the only operation that will be supported is initiation of 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * scans, and the subsequent reporting of scan results. No attempts 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be made to automatically connect to remembered access points, 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * nor will periodic scans be automatically performed looking for 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * remembered access points. Scans must be explicitly requested by 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an application in this mode. 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WIFI_MODE_SCAN_ONLY = 2; 467652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff /** 468652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * In this Wi-Fi lock mode, Wi-Fi will be kept active as in mode 469652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * {@link #WIFI_MODE_FULL} but it operates at high performance 470652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * with minimum packet loss and low packet latency even when 471652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * the device screen is off. This mode will consume more power 472652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * and hence should be used only when there is a need for such 473652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * an active connection. 474652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * <p> 475652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * An example use case is when a voice connection needs to be 476652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * kept active even after the device screen goes off. Holding the 477652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * regular {@link #WIFI_MODE_FULL} lock will keep the wifi 478652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * connection active, but the connection can be lossy. 479652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * Holding a {@link #WIFI_MODE_FULL_HIGH_PERF} lock for the 480652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * duration of the voice call will improve the call quality. 481652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * <p> 482652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * When there is no support from the hardware, this lock mode 483652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * will have the same behavior as {@link #WIFI_MODE_FULL} 484652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff */ 485652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff public static final int WIFI_MODE_FULL_HIGH_PERF = 3; 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Anything worse than or equal to this will show 0 bars. */ 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int MIN_RSSI = -100; 489652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Anything better than or equal to this will show the max bars. */ 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int MAX_RSSI = -55; 49236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff 49336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff /** 494ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff * Number of RSSI levels used in the framework to initiate 495ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff * {@link #RSSI_CHANGED_ACTION} broadcast 496ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff * @hide 497ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff */ 498ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff public static final int RSSI_LEVELS = 5; 499ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff 500ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff /** 50136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * Auto settings in the driver. The driver could choose to operate on both 50236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * 2.4 GHz and 5 GHz or make a dynamic decision on selecting the band. 50336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @hide 50436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff */ 50536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff public static final int WIFI_FREQUENCY_BAND_AUTO = 0; 50636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff 50736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff /** 50836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * Operation on 5 GHz alone 50936f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @hide 51036f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff */ 51136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff public static final int WIFI_FREQUENCY_BAND_5GHZ = 1; 51236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff 51336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff /** 51436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * Operation on 2.4 GHz alone 51536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @hide 51636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff */ 51736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff public static final int WIFI_FREQUENCY_BAND_2GHZ = 2; 51836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff 519227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff /** List of asyncronous notifications 520227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * @hide 521227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff */ 522227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff public static final int DATA_ACTIVITY_NOTIFICATION = 1; 523227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 524227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff //Lowest bit indicates data reception and the second lowest 525227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff //bit indicates data transmitted 526227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff /** @hide */ 527227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff public static final int DATA_ACTIVITY_NONE = 0x00; 528227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff /** @hide */ 529227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff public static final int DATA_ACTIVITY_IN = 0x01; 530227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff /** @hide */ 531227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff public static final int DATA_ACTIVITY_OUT = 0x02; 532227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff /** @hide */ 533227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff public static final int DATA_ACTIVITY_INOUT = 0x03; 534227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 535ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde /** @hide */ 536ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde public static final boolean DEFAULT_POOR_NETWORK_AVOIDANCE_ENABLED = false; 537ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde 538617750604c69e6068f68266d0e30324273aa990eMike Lockwood /* Maximum number of active locks we allow. 539617750604c69e6068f68266d0e30324273aa990eMike Lockwood * This limit was added to prevent apps from creating a ridiculous number 540617750604c69e6068f68266d0e30324273aa990eMike Lockwood * of locks and crashing the system by overflowing the global ref table. 541617750604c69e6068f68266d0e30324273aa990eMike Lockwood */ 542617750604c69e6068f68266d0e30324273aa990eMike Lockwood private static final int MAX_ACTIVE_LOCKS = 50; 543617750604c69e6068f68266d0e30324273aa990eMike Lockwood 544617750604c69e6068f68266d0e30324273aa990eMike Lockwood /* Number of currently active WifiLocks and MulticastLocks */ 545617750604c69e6068f68266d0e30324273aa990eMike Lockwood private int mActiveLockCount; 546617750604c69e6068f68266d0e30324273aa990eMike Lockwood 54788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff private Context mContext; 54888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff IWifiManager mService; 54988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff 55088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff private static final int INVALID_KEY = 0; 551302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static int sListenerKey = 1; 552302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static final SparseArray sListenerMap = new SparseArray(); 553302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static final Object sListenerMapLock = new Object(); 55488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff 555302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static AsyncChannel sAsyncChannel; 556302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static CountDownLatch sConnected; 55788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff 558302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static final Object sThreadRefLock = new Object(); 559cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff private static int sThreadRefCount; 560cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff private static HandlerThread sHandlerThread; 561cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new WifiManager instance. 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Applications will almost always want to use 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Context#getSystemService Context.getSystemService()} to retrieve 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the standard {@link android.content.Context#WIFI_SERVICE Context.WIFI_SERVICE}. 56788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @param context the application context 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param service the Binder interface 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide - hide this because it takes in a parameter of type IWifiManager, which 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is a system private class. 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 57288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public WifiManager(Context context, IWifiManager service) { 57388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff mContext = context; 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService = service; 57588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff init(); 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a list of all the networks configured in the supplicant. 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Not all fields of WifiConfiguration are returned. Only the following 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * fields are filled in: 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>networkId</li> 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>SSID</li> 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>BSSID</li> 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>priority</li> 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>allowedProtocols</li> 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>allowedKeyManagement</li> 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>allowedAuthAlgorithms</li> 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>allowedPairwiseCiphers</li> 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>allowedGroupCiphers</li> 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a list of network configurations in the form of a list 59459358536d2f14b27cdc7386daeabc2b6dca8e177Irfan Sheriff * of {@link WifiConfiguration} objects. Upon failure to fetch or 59559358536d2f14b27cdc7386daeabc2b6dca8e177Irfan Sheriff * when when Wi-Fi is turned off, it can be null. 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public List<WifiConfiguration> getConfiguredNetworks() { 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.getConfiguredNetworks(); 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 605758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong /** @hide */ 606758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong @SystemApi 607758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong public List<WifiConfiguration> getPrivilegedConfiguredNetworks() { 608758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong try { 609758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong return mService.getPrivilegedConfiguredNetworks(); 610758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong } catch (RemoteException e) { 611758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong return null; 612758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong } 613758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong } 614758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong 6154eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle /** @hide */ 6164eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle @SystemApi 6174eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle public WifiConnectionStatistics getConnectionStatistics() { 6184eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle try { 6194eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle return mService.getConnectionStatistics(); 6204eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle } catch (RemoteException e) { 6214eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle return null; 6224eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle } 6234eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle } 6244eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a new network description to the set of configured networks. 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The {@code networkId} field of the supplied configuration object 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is ignored. 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p/> 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The new network will be marked DISABLED by default. To enable it, 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * called {@link #enableNetwork}. 632227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param config the set of variables that describe the configuration, 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * contained in a {@link WifiConfiguration} object. 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the ID of the newly created network description. This is used in 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * other operations to specified the network to be acted upon. 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns {@code -1} on failure. 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int addNetwork(WifiConfiguration config) { 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (config == null) { 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.networkId = -1; 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return addOrUpdateNetwork(config); 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Update the network description of an existing configured network. 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param config the set of variables that describe the configuration, 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * contained in a {@link WifiConfiguration} object. It may 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be sparse, so that only the items that are being changed 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are non-<code>null</code>. The {@code networkId} field 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * must be set to the ID of the existing network being updated. 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns the {@code networkId} of the supplied 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@code WifiConfiguration} on success. 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <br/> 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns {@code -1} on failure, including when the {@code networkId} 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * field of the {@code WifiConfiguration} does not refer to an 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * existing network. 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int updateNetwork(WifiConfiguration config) { 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (config == null || config.networkId < 0) { 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return addOrUpdateNetwork(config); 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Internal method for doing the RPC that creates a new network description 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or updates an existing one. 672227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param config The possibly sparse object containing the variables that 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are to set or updated in the network description. 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the ID of the network on success, {@code -1} on failure. 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int addOrUpdateNetwork(WifiConfiguration config) { 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.addOrUpdateNetwork(config); 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Remove the specified network from the list of configured networks. 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This may result in the asynchronous delivery of state change 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * events. 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param netId the integer that identifies the network configuration 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to the supplicant 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean removeNetwork(int netId) { 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.removeNetwork(netId); 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Allow a previously configured network to be associated with. If 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <code>disableOthers</code> is true, then all other configured 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * networks are disabled, and an attempt to connect to the selected 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * network is initiated. This may result in the asynchronous delivery 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of state change events. 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param netId the ID of the network in the list of configured networks 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param disableOthers if true, disable all other networks. The way to 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * select a particular network to connect to is specify {@code true} 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for this parameter. 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean enableNetwork(int netId, boolean disableOthers) { 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.enableNetwork(netId, disableOthers); 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Disable a configured network. The specified network will not be 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a candidate for associating. This may result in the asynchronous 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * delivery of state change events. 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param netId the ID of the network as returned by {@link #addNetwork}. 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean disableNetwork(int netId) { 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.disableNetwork(netId); 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Disassociate from the currently active access point. This may result 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the asynchronous delivery of state change events. 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean disconnect() { 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 743e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff mService.disconnect(); 744e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff return true; 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reconnect to the currently active access point, if we are currently 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * disconnected. This may result in the asynchronous delivery of state 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * change events. 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean reconnect() { 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 758e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff mService.reconnect(); 759e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff return true; 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reconnect to the currently active access point, even if we are already 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * connected. This may result in the asynchronous delivery of state 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * change events. 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean reassociate() { 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 773e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff mService.reassociate(); 774e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff return true; 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Check that the supplicant daemon is responding to requests. 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if we were able to communicate with the supplicant and 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it returned the expected response to the PING message. 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean pingSupplicant() { 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mService == null) 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.pingSupplicant(); 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 796738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * Get a list of available channels for customized scan. 797738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 798738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * @see {@link WifiChannel} 799738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 800738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * @return the channel list, or null if not available 801738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * @hide 802738803fee62a98f244250996380820c4923e7f7bYuhao Zheng */ 803738803fee62a98f244250996380820c4923e7f7bYuhao Zheng public List<WifiChannel> getChannelList() { 804738803fee62a98f244250996380820c4923e7f7bYuhao Zheng try { 805738803fee62a98f244250996380820c4923e7f7bYuhao Zheng return mService.getChannelList(); 806738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } catch (RemoteException e) { 807738803fee62a98f244250996380820c4923e7f7bYuhao Zheng return null; 808738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } 809738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } 810738803fee62a98f244250996380820c4923e7f7bYuhao Zheng 81173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /* Keep this list in sync with wifi_hal.h */ 81273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 81373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_INFRA = 0x0001; // Basic infrastructure mode 81473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 81573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_INFRA_5G = 0x0002; // Support for 5 GHz Band 81673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 81773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_PASSPOINT = 0x0004; // Support for GAS/ANQP 81873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 81973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_P2P = 0x0008; // Wifi-Direct 82073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 82173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_MOBILE_HOTSPOT = 0x0010; // Soft AP 82273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 82373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_SCANNER = 0x0020; // WifiScanner APIs 82473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 82573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_NAN = 0x0040; // Neighbor Awareness Networking 82673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 82773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_D2D_RTT = 0x0080; // Device-to-device RTT 82873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 82973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_D2AP_RTT = 0x0100; // Device-to-AP RTT 83073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 83173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_BATCH_SCAN = 0x0200; // Batched Scan (deprecated) 83273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 83373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_PNO = 0x0400; // Preferred network offload 83473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 83573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_ADDITIONAL_STA = 0x0800; // Support for two STAs 83673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 83773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_TDLS = 0x1000; // Tunnel directed link setup 83873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 83973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_TDLS_OFFCHANNEL = 0x2000; // Support for TDLS off channel 84073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 84173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_EPR = 0x4000; // Enhanced power reporting 84273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 84373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande private int getSupportedFeatures() { 84473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande try { 84573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return mService.getSupportedFeatures(); 84673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } catch (RemoteException e) { 84773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return 0; 84873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 84973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 85073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 85173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande private boolean isFeatureSupported(int feature) { 85273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return (getSupportedFeatures() & feature) == feature; 85373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 85473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 85573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports 5 GHz band 85673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 85773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean is5GHzBandSupported() { 85873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_INFRA_5G); 85973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 86073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 86173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 86273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports passpoint 86373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 86473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 86573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isPasspointSupported() { 86673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_PASSPOINT); 86773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 86873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 86973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 87073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports WifiP2pManager (Wi-Fi Direct) 87173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 87273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isP2pSupported() { 87373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_P2P); 87473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 87573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 87673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 87773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports portable Wi-Fi hotspot 87873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 87973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 88073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande @SystemApi 88173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isPortableHotspotSupported() { 88273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_MOBILE_HOTSPOT); 88373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 88473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 88573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 88673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports WifiScanner APIs 88773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 88873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 88973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande @SystemApi 89073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isWifiScannerSupported() { 89173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_SCANNER); 89273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 89373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 89473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 89573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports Neighbour Awareness Network APIs 89673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 89773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 89873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isNanSupported() { 89973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_NAN); 90073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 90173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 90273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 90373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports Device-to-device RTT 90473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 90573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 90673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande @SystemApi 90773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isDeviceToDeviceRttSupported() { 90873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_D2D_RTT); 90973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 91073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 91173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 91273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports Device-to-AP RTT 91373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 91473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande @SystemApi 91573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isDeviceToApRttSupported() { 91673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_D2AP_RTT); 91773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 91873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 91973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 92073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports offloaded connectivity scan 92173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 92273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isPreferredNetworkOffloadSupported() { 92373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_PNO); 92473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 92573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 92673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 92773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports multiple simultaneous connections 92873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 92973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 93073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isAdditionalStaSupported() { 93173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_ADDITIONAL_STA); 93273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 93373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 93473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 93573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports Tunnel Directed Link Setup 93673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 93773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isTdlsSupported() { 93873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_TDLS); 93973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 94073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 94173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 94273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports Off Channel Tunnel Directed Link Setup 94373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 94473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 94573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isOffChannelTdlsSupported() { 94673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_TDLS_OFFCHANNEL); 94773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 94873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 94973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 95073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports advanced power/performance counters 95173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 95273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isEnhancedPowerReportingSupported() { 95373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_EPR); 95473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 95573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 95673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 95773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * Return the record of {@link WifiActivityEnergyInfo} object that 95873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * has the activity and energy info. This can be used to ascertain what 95973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * the controller has been up to, since the last sample. 96073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @param updateType Type of info, cached vs refreshed. 96173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * 96273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return a record with {@link WifiActivityEnergyInfo} or null if 96373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * report is unavailable or unsupported 96473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 96573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 96673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public WifiActivityEnergyInfo getControllerActivityEnergyInfo(int updateType) { 96773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande if (mService == null) return null; 96873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande try { 96973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande WifiActivityEnergyInfo record; 97073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande if (!isEnhancedPowerReportingSupported()) { 97173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return null; 97273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 97373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande synchronized(this) { 97473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande record = mService.reportActivityInfo(); 97573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande if (record.isValid()) { 97673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return record; 97773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } else { 97873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return null; 97973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 98073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 98173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } catch (RemoteException e) { 98273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande Log.e(TAG, "getControllerActivityEnergyInfo: " + e); 98373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 98473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return null; 98573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 98673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 987738803fee62a98f244250996380820c4923e7f7bYuhao Zheng /** 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Request a scan for access points. Returns immediately. The availability 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the results is made known later by means of an asynchronous event sent 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on completion of the scan. 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded, i.e., the scan was initiated 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 993a5ec95cdb1a7d2024249277dff1f99d0046c9b56Mike Lockwood public boolean startScan() { 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 995738803fee62a98f244250996380820c4923e7f7bYuhao Zheng mService.startScan(null, null); 9966942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie return true; 9976942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie } catch (RemoteException e) { 9986942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie return false; 9996942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie } 10006942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie } 10016942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie 10026942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie /** @hide */ 1003c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie @SystemApi 10046942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie public boolean startScan(WorkSource workSource) { 10056942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie try { 1006738803fee62a98f244250996380820c4923e7f7bYuhao Zheng mService.startScan(null, workSource); 1007738803fee62a98f244250996380820c4923e7f7bYuhao Zheng return true; 1008738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } catch (RemoteException e) { 1009738803fee62a98f244250996380820c4923e7f7bYuhao Zheng return false; 1010738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } 1011738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } 1012738803fee62a98f244250996380820c4923e7f7bYuhao Zheng 1013738803fee62a98f244250996380820c4923e7f7bYuhao Zheng /** 1014da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle * startLocationRestrictedScan() 1015da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle * Trigger a scan which will not make use of DFS channels and is thus not suitable for 1016da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle * establishing wifi connection. 1017da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle * @hide 1018da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle */ 1019da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle @SystemApi 1020da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle public boolean startLocationRestrictedScan(WorkSource workSource) { 1021da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle try { 1022da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle mService.startLocationRestrictedScan(workSource); 1023da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle return true; 1024da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle } catch (RemoteException e) { 1025da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle return false; 1026da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle } 1027da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle } 1028da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle 1029da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle /** 1030738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * Request a scan for access points in specified channel list. Each channel is specified by its 1031738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * frequency in MHz, e.g. "5500" (do NOT include "DFS" even though it is). The availability of 1032738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * the results is made known later in the same way as {@link #startScan}. 1033738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 1034738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * Note: 1035738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 1036738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 1. Customized scan is for non-connection purposes, i.e. it won't trigger a wifi connection 1037738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * even though it finds some known networks. 1038738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 1039738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 2. Customized scan result may include access points that is not specified in the channel 1040738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * list. An app will need to do frequency filtering if it wants to get pure results for the 1041738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * channel list it specified. 1042738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 1043738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * @hide 1044738803fee62a98f244250996380820c4923e7f7bYuhao Zheng */ 1045738803fee62a98f244250996380820c4923e7f7bYuhao Zheng public boolean startCustomizedScan(ScanSettings requested) { 1046738803fee62a98f244250996380820c4923e7f7bYuhao Zheng try { 1047738803fee62a98f244250996380820c4923e7f7bYuhao Zheng mService.startScan(requested, null); 1048738803fee62a98f244250996380820c4923e7f7bYuhao Zheng return true; 1049738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } catch (RemoteException e) { 1050738803fee62a98f244250996380820c4923e7f7bYuhao Zheng return false; 1051738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } 1052738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } 1053738803fee62a98f244250996380820c4923e7f7bYuhao Zheng 1054738803fee62a98f244250996380820c4923e7f7bYuhao Zheng /** @hide */ 1055738803fee62a98f244250996380820c4923e7f7bYuhao Zheng public boolean startCustomizedScan(ScanSettings requested, WorkSource workSource) { 1056738803fee62a98f244250996380820c4923e7f7bYuhao Zheng try { 1057738803fee62a98f244250996380820c4923e7f7bYuhao Zheng mService.startScan(requested, workSource); 1058e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff return true; 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10650451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * Request a batched scan for access points. To end your requested batched scan, 10660451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * call stopBatchedScan with the same Settings. 10670451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * 10680451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * If there are mulitple requests for batched scans, the more demanding settings will 10690451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * take precidence. 10700451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * 10710451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @param requested {@link BatchedScanSettings} the scan settings requested. 10720451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @return false on known error 10730451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @hide 10740451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt */ 10750451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt public boolean requestBatchedScan(BatchedScanSettings requested) { 10760451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt try { 1077a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt return mService.requestBatchedScan(requested, new Binder(), null); 1078a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } catch (RemoteException e) { return false; } 1079a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 1080a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt /** @hide */ 1081a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt public boolean requestBatchedScan(BatchedScanSettings requested, WorkSource workSource) { 1082a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt try { 1083a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt return mService.requestBatchedScan(requested, new Binder(), workSource); 10840451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } catch (RemoteException e) { return false; } 10850451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } 10860451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt 10870451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt /** 10880451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * Check if the Batched Scan feature is supported. 10890451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * 10900451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @return false if not supported. 10910451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @hide 10920451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt */ 1093c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie @SystemApi 10940451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt public boolean isBatchedScanSupported() { 10950451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt try { 10960451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt return mService.isBatchedScanSupported(); 10970451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } catch (RemoteException e) { return false; } 10980451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } 10990451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt 11000451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt /** 11010451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * End a requested batch scan for this applicaiton. Note that batched scan may 11020451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * still occur if other apps are using them. 1103126755cf41710d52554d747f3d3667eb0a3c2694Robert Greenwalt * 1104126755cf41710d52554d747f3d3667eb0a3c2694Robert Greenwalt * @param requested {@link BatchedScanSettings} the scan settings you previously requested 1105126755cf41710d52554d747f3d3667eb0a3c2694Robert Greenwalt * and now wish to stop. A value of null here will stop all scans requested by the 1106126755cf41710d52554d747f3d3667eb0a3c2694Robert Greenwalt * calling App. 11070451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @hide 11080451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt */ 11090451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt public void stopBatchedScan(BatchedScanSettings requested) { 11100451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt try { 111182f4218c0d5dbc10404db8cf31f0284140d80175Robert Greenwalt mService.stopBatchedScan(requested); 11120451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } catch (RemoteException e) {} 11130451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } 11140451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt 11150451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt /** 11160451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * Retrieve the latest batched scan result. This should be called immediately after 11170451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * {@link BATCHED_SCAN_RESULTS_AVAILABLE_ACTION} is received. 11180451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @hide 11190451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt */ 1120c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie @SystemApi 11210451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt public List<BatchedScanResult> getBatchedScanResults() { 11220451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt try { 112395d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn return mService.getBatchedScanResults(mContext.getOpPackageName()); 11240451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } catch (RemoteException e) { 11250451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt return null; 11260451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } 11270451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } 11280451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt 11290451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt /** 11308e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * Force a re-reading of batched scan results. This will attempt 11318e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * to read more information from the chip, but will do so at the expense 11328e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * of previous data. Rate limited to the current scan frequency. 11338e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * 11348e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * pollBatchedScan will always wait 1 period from the start of the batch 11358e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * before trying to read from the chip, so if your #scans/batch == 1 this will 11368e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * have no effect. 11378e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * 11388e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * If you had already waited 1 period before calling, this should have 11398e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * immediate (though async) effect. 11408e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * 11418e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * If you call before that 1 period is up this will set up a timer and fetch 11428e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * results when the 1 period is up. 11438e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * 11448e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * Servicing a pollBatchedScan request (immediate or after timed delay) starts a 11458e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * new batch, so if you were doing 10 scans/batch and called in the 4th scan, you 11468e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * would get data in the 4th and then again 10 scans later. 11478e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * @hide 11488e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt */ 11498e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt public void pollBatchedScan() { 11508e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt try { 11518e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt mService.pollBatchedScan(); 11528e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt } catch (RemoteException e) { } 11538e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt } 11548e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt 11558e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt /** 1156b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales * Creates a configuration token describing the network referenced by {@code netId} 1157b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales * of MIME type application/vnd.wfa.wsc. Can be used to configure WiFi networks via NFC. 1158b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales * 1159b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales * @return hex-string encoded configuration token 1160b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales * @hide 1161b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales */ 1162b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales public String getWpsNfcConfigurationToken(int netId) { 1163b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales try { 1164b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales return mService.getWpsNfcConfigurationToken(netId); 1165b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales } catch (RemoteException e) { 1166b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales return null; 1167b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales } 1168b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales } 1169b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales 1170b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales /** 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return dynamic information about the current Wi-Fi connection, if any is active. 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the Wi-Fi information, contained in {@link WifiInfo}. 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public WifiInfo getConnectionInfo() { 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.getConnectionInfo(); 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the results of the latest access point scan. 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the list of access points found in the most recent scan. 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public List<ScanResult> getScanResults() { 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 118895d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn return mService.getScanResults(mContext.getOpPackageName()); 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11951ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * Check if scanning is always available. 11961ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * 11971ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * If this return {@code true}, apps can issue {@link #startScan} and fetch scan results 11981ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * even when Wi-Fi is turned off. 11991ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * 12001ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * To change this setting, see {@link #ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE}. 12011ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff */ 12027ea33eac4b57aabf9326d60f52e3ed85217ac846Irfan Sheriff public boolean isScanAlwaysAvailable() { 12031ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff try { 12047ea33eac4b57aabf9326d60f52e3ed85217ac846Irfan Sheriff return mService.isScanAlwaysAvailable(); 12051ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff } catch (RemoteException e) { 12061ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff return false; 12071ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff } 12081ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff } 12091ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff 12101ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff /** 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Tell the supplicant to persist the current list of configured networks. 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Note: It is possible for this method to change the network IDs of 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * existing networks. You should assume the network IDs can be different 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * after calling this method. 1216227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded 12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean saveConfiguration() { 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.saveConfiguration(); 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1228ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff * Set the country code. 1229ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff * @param countryCode country code in ISO 3166 format. 1230ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff * @param persist {@code true} if this needs to be remembered 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1232ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff * @hide 12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1234ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff public void setCountryCode(String country, boolean persist) { 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1236ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff mService.setCountryCode(country, persist); 1237ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff } catch (RemoteException e) { } 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 124136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * Set the operational frequency band. 124236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @param band One of 124336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * {@link #WIFI_FREQUENCY_BAND_AUTO}, 124436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * {@link #WIFI_FREQUENCY_BAND_5GHZ}, 124536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * {@link #WIFI_FREQUENCY_BAND_2GHZ}, 124636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @param persist {@code true} if this needs to be remembered 124736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @hide 124836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff */ 124936f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff public void setFrequencyBand(int band, boolean persist) { 125036f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff try { 125136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff mService.setFrequencyBand(band, persist); 125236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } catch (RemoteException e) { } 125336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } 125436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff 125536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff /** 125636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * Get the operational frequency band. 125736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @return One of 125836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * {@link #WIFI_FREQUENCY_BAND_AUTO}, 125936f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * {@link #WIFI_FREQUENCY_BAND_5GHZ}, 126036f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * {@link #WIFI_FREQUENCY_BAND_2GHZ} or 126136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * {@code -1} on failure. 126236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @hide 126336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff */ 126436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff public int getFrequencyBand() { 126536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff try { 126636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff return mService.getFrequencyBand(); 126736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } catch (RemoteException e) { 126836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff return -1; 126936f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } 127036f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } 127136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff 127236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff /** 127336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * Check if the chipset supports dual frequency band (2.4 GHz and 5 GHz) 127436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @return {@code true} if supported, {@code false} otherwise. 127536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @hide 127636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff */ 127736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff public boolean isDualBandSupported() { 127836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff try { 127936f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff return mService.isDualBandSupported(); 128036f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } catch (RemoteException e) { 128136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff return false; 128236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } 128336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } 128436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff 128536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff /** 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the DHCP-assigned addresses from the last successful DHCP request, 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if any. 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the DHCP information 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public DhcpInfo getDhcpInfo() { 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.getDhcpInfo(); 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Enable or disable Wi-Fi. 13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param enabled {@code true} to enable, {@code false} to disable. 13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeds (or if the existing state 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is the same as the requested state). 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean setWifiEnabled(boolean enabled) { 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.setWifiEnabled(enabled); 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets the Wi-Fi enabled state. 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return One of {@link #WIFI_STATE_DISABLED}, 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #WIFI_STATE_DISABLING}, {@link #WIFI_STATE_ENABLED}, 13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #WIFI_STATE_ENABLING}, {@link #WIFI_STATE_UNKNOWN} 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isWifiEnabled() 13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getWifiState() { 13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.getWifiEnabledState(); 13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return WIFI_STATE_UNKNOWN; 13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1326227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1328227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * Return whether Wi-Fi is enabled or disabled. 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if Wi-Fi is enabled 13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getWifiState() 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isWifiEnabled() { 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getWifiState() == WIFI_STATE_ENABLED; 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1335227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1337f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * Return TX packet counter, for CTS test of WiFi watchdog. 1338f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * @param listener is the interface to receive result 1339f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * 1340f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * @hide for CTS test only 1341f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng */ 1342f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public void getTxPacketCount(TxPacketCountListener listener) { 1343f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng validateChannel(); 1344302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(RSSI_PKTCNT_FETCH, 0, putListener(listener)); 1345f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng } 1346f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng 1347f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Calculates the level of the signal. This should be used any time a signal 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is being shown. 1350227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rssi The power of the signal measured in RSSI. 13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param numLevels The number of levels to consider in the calculated 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * level. 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A level of the signal, given in the range of 0 to numLevels-1 13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (both inclusive). 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static int calculateSignalLevel(int rssi, int numLevels) { 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (rssi <= MIN_RSSI) { 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (rssi >= MAX_RSSI) { 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return numLevels - 1; 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 13634c0d81b8add0372cc7194b17cc6d2bfc58baacd1Daniel Sandler float inputRange = (MAX_RSSI - MIN_RSSI); 13644c0d81b8add0372cc7194b17cc6d2bfc58baacd1Daniel Sandler float outputRange = (numLevels - 1); 13654c0d81b8add0372cc7194b17cc6d2bfc58baacd1Daniel Sandler return (int)((float)(rssi - MIN_RSSI) * outputRange / inputRange); 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1368227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Compares two signal strengths. 1371227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rssiA The power of the first signal measured in RSSI. 13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rssiB The power of the second signal measured in RSSI. 13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns <0 if the first signal is weaker than the second signal, 13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 0 if the two signals have the same strength, and >0 if the first 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * signal is stronger than the second signal. 13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static int compareSignalLevel(int rssiA, int rssiB) { 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return rssiA - rssiB; 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13835321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Start AccessPoint mode with the specified 13845321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * configuration. If the radio is already running in 13855321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * AP mode, update the new configuration 13865321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Note that starting in access point mode disables station 13875321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * mode operation 13885321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @param wifiConfig SSID, security and channel details as 13895321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * part of WifiConfiguration 13905321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @return {@code true} if the operation succeeds, {@code false} otherwise 13915321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 13925321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide Dont open up yet 13935321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 13945321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff public boolean setWifiApEnabled(WifiConfiguration wifiConfig, boolean enabled) { 13955321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff try { 1396ffcea7ae7316ab748a49f5e8f6c6798356f35719Irfan Sheriff mService.setWifiApEnabled(wifiConfig, enabled); 1397ffcea7ae7316ab748a49f5e8f6c6798356f35719Irfan Sheriff return true; 13985321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } catch (RemoteException e) { 13995321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff return false; 14005321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } 14015321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } 14025321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff 14035321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 14045321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Gets the Wi-Fi enabled state. 14055321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @return One of {@link #WIFI_AP_STATE_DISABLED}, 14065321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * {@link #WIFI_AP_STATE_DISABLING}, {@link #WIFI_AP_STATE_ENABLED}, 14075321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * {@link #WIFI_AP_STATE_ENABLING}, {@link #WIFI_AP_STATE_FAILED} 14085321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #isWifiApEnabled() 14095321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 14105321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide Dont open yet 14115321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 14125321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff public int getWifiApState() { 14135321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff try { 14145321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff return mService.getWifiApEnabledState(); 14155321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } catch (RemoteException e) { 14165321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff return WIFI_AP_STATE_FAILED; 14175321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } 14185321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } 14195321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff 14205321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 14215321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Return whether Wi-Fi AP is enabled or disabled. 14225321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @return {@code true} if Wi-Fi AP is enabled 14235321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #getWifiApState() 14245321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 14255321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide Dont open yet 14265321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 14275321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff public boolean isWifiApEnabled() { 14285321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff return getWifiApState() == WIFI_AP_STATE_ENABLED; 14295321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } 14305321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff 14315321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 14329ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff * Gets the Wi-Fi AP Configuration. 14339ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff * @return AP details in WifiConfiguration 14349ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff * 14359ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff * @hide Dont open yet 14369ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff */ 14379ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff public WifiConfiguration getWifiApConfiguration() { 14389ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff try { 14399ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff return mService.getWifiApConfiguration(); 14409ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff } catch (RemoteException e) { 14419ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff return null; 14429ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff } 14439ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff } 14449ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff 14459ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff /** 144617b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff * Sets the Wi-Fi AP Configuration. 144717b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff * @return {@code true} if the operation succeeded, {@code false} otherwise 144817b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff * 144917b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff * @hide Dont open yet 145017b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff */ 145117b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff public boolean setWifiApConfiguration(WifiConfiguration wifiConfig) { 145217b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff try { 145317b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff mService.setWifiApConfiguration(wifiConfig); 145417b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff return true; 145517b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff } catch (RemoteException e) { 145617b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff return false; 145717b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff } 145817b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff } 145917b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff 14600d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff /** 14610d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * Start the driver and connect to network. 14620d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 14630d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * This function will over-ride WifiLock and device idle status. For example, 14640d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * even if the device is idle or there is only a scan-only lock held, 14650d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * a start wifi would mean that wifi connection is kept active until 14660d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * a stopWifi() is sent. 14670d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 14680d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * This API is used by WifiStateTracker 14690d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 14700d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @return {@code true} if the operation succeeds else {@code false} 14710d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @hide 14720d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff */ 14730d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff public boolean startWifi() { 14740d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff try { 14750d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff mService.startWifi(); 14760d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return true; 14770d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } catch (RemoteException e) { 14780d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return false; 14790d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 14800d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 14810d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff 14820d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff /** 14830d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * Disconnect from a network (if any) and stop the driver. 14840d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 14850d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * This function will over-ride WifiLock and device idle status. Wi-Fi 14860d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * stays inactive until a startWifi() is issued. 14870d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 14880d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * This API is used by WifiStateTracker 14890d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 14900d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @return {@code true} if the operation succeeds else {@code false} 14910d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @hide 14920d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff */ 14930d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff public boolean stopWifi() { 14940d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff try { 14950d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff mService.stopWifi(); 14960d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return true; 14970d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } catch (RemoteException e) { 14980d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return false; 14990d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 15000d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 15010d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff 15020d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff /** 15030d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * Add a bssid to the supplicant blacklist 15040d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 15050d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * This API is used by WifiWatchdogService 15060d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 15070d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @return {@code true} if the operation succeeds else {@code false} 15080d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @hide 15090d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff */ 15100d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff public boolean addToBlacklist(String bssid) { 15110d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff try { 15120d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff mService.addToBlacklist(bssid); 15130d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return true; 15140d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } catch (RemoteException e) { 15150d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return false; 15160d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 15170d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 15180d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff 15190d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff /** 15200d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * Clear the supplicant blacklist 15210d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 15220d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * This API is used by WifiWatchdogService 15230d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 15240d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @return {@code true} if the operation succeeds else {@code false} 15250d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @hide 15260d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff */ 15270d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff public boolean clearBlacklist() { 15280d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff try { 15290d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff mService.clearBlacklist(); 15300d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return true; 15310d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } catch (RemoteException e) { 15320d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return false; 15330d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 15340d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 15350d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff 153664f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde 153764f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde /** 1538b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * Enable/Disable TDLS on a specific local route. 153964f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde * 1540b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * <p> 1541b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * TDLS enables two wireless endpoints to talk to each other directly 1542b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * without going through the access point that is managing the local 1543b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * network. It saves bandwidth and improves quality of the link. 1544b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * </p> 1545b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * <p> 1546b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * This API enables/disables the option of using TDLS. If enabled, the 1547b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * underlying hardware is free to use TDLS or a hop through the access 1548b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * point. If disabled, existing TDLS session is torn down and 1549b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * hardware is restricted to use access point for transferring wireless 1550b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * packets. Default value for all routes is 'disabled', meaning restricted 1551b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * to use access point for transferring packets. 1552b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * </p> 155364f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde * 155464f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde * @param remoteIPAddress IP address of the endpoint to setup TDLS with 155564f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde * @param enable true = setup and false = tear down TDLS 155664f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde */ 1557b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde public void setTdlsEnabled(InetAddress remoteIPAddress, boolean enable) { 155864f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde try { 155964f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde mService.enableTdls(remoteIPAddress.getHostAddress(), enable); 156064f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde } catch (RemoteException e) { 156164f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde // Just ignore the exception 156264f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde } 156364f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde } 156464f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde 156564f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde /** 1566b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * Similar to {@link #setTdlsEnabled(InetAddress, boolean) }, except 1567b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * this version allows you to specify remote endpoint with a MAC address. 156864f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde * @param remoteMacAddress MAC address of the remote endpoint such as 00:00:0c:9f:f2:ab 156964f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde * @param enable true = setup and false = tear down TDLS 157064f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde */ 1571b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde public void setTdlsEnabledWithMacAddress(String remoteMacAddress, boolean enable) { 157264f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde try { 157364f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde mService.enableTdlsWithMacAddress(remoteMacAddress, enable); 157464f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde } catch (RemoteException e) { 157564f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde // Just ignore the exception 157664f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde } 157764f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde } 157864f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde 1579e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff /* TODO: deprecate synchronous API and open up the following API */ 1580ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 1581d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff private static final int BASE = Protocol.BASE_WIFI_MANAGER; 1582d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1583ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff /* Commands to WifiService */ 1584ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff /** @hide */ 1585d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int CONNECT_NETWORK = BASE + 1; 1586d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 1587d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int CONNECT_NETWORK_FAILED = BASE + 2; 1588d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 1589d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int CONNECT_NETWORK_SUCCEEDED = BASE + 3; 1590d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1591d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 1592d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int FORGET_NETWORK = BASE + 4; 1593d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 1594d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int FORGET_NETWORK_FAILED = BASE + 5; 1595ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff /** @hide */ 1596d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int FORGET_NETWORK_SUCCEEDED = BASE + 6; 1597d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1598ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff /** @hide */ 1599d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int SAVE_NETWORK = BASE + 7; 1600ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff /** @hide */ 1601d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int SAVE_NETWORK_FAILED = BASE + 8; 16028dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy /** @hide */ 1603d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int SAVE_NETWORK_SUCCEEDED = BASE + 9; 1604ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 1605ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff /** @hide */ 1606d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int START_WPS = BASE + 10; 1607d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 1608d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int START_WPS_SUCCEEDED = BASE + 11; 1609d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 1610d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int WPS_FAILED = BASE + 12; 161186a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff /** @hide */ 1612d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int WPS_COMPLETED = BASE + 13; 1613d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1614d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 161586a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int CANCEL_WPS = BASE + 14; 161686a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff /** @hide */ 161786a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int CANCEL_WPS_FAILED = BASE + 15; 161886a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff /** @hide */ 161986a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int CANCEL_WPS_SUCCEDED = BASE + 16; 162086a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff 162186a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff /** @hide */ 162286a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int DISABLE_NETWORK = BASE + 17; 1623d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 162486a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int DISABLE_NETWORK_FAILED = BASE + 18; 1625d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 162686a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int DISABLE_NETWORK_SUCCEEDED = BASE + 19; 1627ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 1628f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** @hide */ 1629f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public static final int RSSI_PKTCNT_FETCH = BASE + 20; 1630f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** @hide */ 1631f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public static final int RSSI_PKTCNT_FETCH_SUCCEEDED = BASE + 21; 1632f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** @hide */ 1633f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public static final int RSSI_PKTCNT_FETCH_FAILED = BASE + 22; 1634f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng 1635d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 1636d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Passed with {@link ActionListener#onFailure}. 1637d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Indicates that the operation failed due to an internal error. 163873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 1639d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 164086a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int ERROR = 0; 1641d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1642d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 1643d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Passed with {@link ActionListener#onFailure}. 1644d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Indicates that the operation is already in progress 164573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 1646d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 164786a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int IN_PROGRESS = 1; 1648d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1649d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 1650d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Passed with {@link ActionListener#onFailure}. 1651d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Indicates that the operation failed because the framework is busy and 1652d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * unable to service the request 165373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 1654d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 165586a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int BUSY = 2; 1656d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1657d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /* WPS specific errors */ 1658674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande /** WPS overlap detected */ 165986a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int WPS_OVERLAP_ERROR = 3; 1660674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande /** WEP on WPS is prohibited */ 166186a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int WPS_WEP_PROHIBITED = 4; 1662674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande /** TKIP only prohibited */ 166386a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int WPS_TKIP_ONLY_PROHIBITED = 5; 1664674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande /** Authentication failure on WPS */ 166586a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int WPS_AUTH_FAILURE = 6; 1666674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande /** WPS timed out */ 166786a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int WPS_TIMED_OUT = 7; 1668d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 166910652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde /** 167010652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde * Passed with {@link ActionListener#onFailure}. 167110652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde * Indicates that the operation failed due to invalid inputs 167273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 167310652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde */ 167410652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde public static final int INVALID_ARGS = 8; 167510652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde 1676ae81483a15bb3811cfc221970ea290599b43d4deSky Faber /** 1677ae81483a15bb3811cfc221970ea290599b43d4deSky Faber * Passed with {@link ActionListener#onFailure}. 1678ae81483a15bb3811cfc221970ea290599b43d4deSky Faber * Indicates that the operation failed due to user permissions. 1679ae81483a15bb3811cfc221970ea290599b43d4deSky Faber * @hide 1680ae81483a15bb3811cfc221970ea290599b43d4deSky Faber */ 1681ae81483a15bb3811cfc221970ea290599b43d4deSky Faber public static final int NOT_AUTHORIZED = 9; 1682ae81483a15bb3811cfc221970ea290599b43d4deSky Faber 168373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 168473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * Interface for callback invocation on an application action 168573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 168673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 1687d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public interface ActionListener { 1688d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** The operation succeeded */ 1689d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public void onSuccess(); 1690d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 1691d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * The operation failed 1692d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param reason The reason for failure could be one of 1693d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * {@link #ERROR}, {@link #IN_PROGRESS} or {@link #BUSY} 1694d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 1695d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public void onFailure(int reason); 1696d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1697d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1698674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande /** Interface for callback invocation on a start WPS action */ 169973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static abstract class WpsCallback { 1700d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** WPS start succeeded */ 170173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public abstract void onStarted(String pin); 1702d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1703d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** WPS operation completed succesfully */ 170473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public abstract void onSucceeded(); 1705d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1706d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 1707d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * WPS operation failed 1708d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param reason The reason for failure could be one of 170973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * {@link #WPS_TKIP_ONLY_PROHIBITED}, {@link #WPS_OVERLAP_ERROR}, 171073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * {@link #WPS_WEP_PROHIBITED}, {@link #WPS_TIMED_OUT} or {@link #WPS_AUTH_FAILURE} 171173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * and some generic errors. 1712d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 171373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public abstract void onFailed(int reason); 1714d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1715d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1716f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** Interface for callback invocation on a TX packet count poll action {@hide} */ 1717f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public interface TxPacketCountListener { 1718f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** 1719f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * The operation succeeded 1720f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * @param count TX packet counter 1721f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng */ 1722f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public void onSuccess(int count); 1723f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** 1724f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * The operation failed 1725f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * @param reason The reason for failure could be one of 1726f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * {@link #ERROR}, {@link #IN_PROGRESS} or {@link #BUSY} 1727f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng */ 1728f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public void onFailure(int reason); 1729f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng } 1730f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng 1731302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static class ServiceHandler extends Handler { 173288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff ServiceHandler(Looper looper) { 173388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff super(looper); 1734d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1735d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 173688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff @Override 173788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void handleMessage(Message message) { 173888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff Object listener = removeListener(message.arg2); 173988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff switch (message.what) { 174088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED: 174188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (message.arg1 == AsyncChannel.STATUS_SUCCESSFUL) { 1742302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(AsyncChannel.CMD_CHANNEL_FULL_CONNECTION); 174388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } else { 174488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff Log.e(TAG, "Failed to set up channel connection"); 174588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff // This will cause all further async API calls on the WifiManager 174688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff // to fail and throw an exception 1747302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel = null; 174888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 1749302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sConnected.countDown(); 175088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 175188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED: 175288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff // Ignore 175388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 175488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case AsyncChannel.CMD_CHANNEL_DISCONNECTED: 175588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff Log.e(TAG, "Channel connection lost"); 175688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff // This will cause all further async API calls on the WifiManager 175788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff // to fail and throw an exception 1758302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel = null; 1759fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff getLooper().quit(); 176088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 176188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff /* ActionListeners grouped together */ 176288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.CONNECT_NETWORK_FAILED: 176388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.FORGET_NETWORK_FAILED: 176488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.SAVE_NETWORK_FAILED: 176588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.DISABLE_NETWORK_FAILED: 176688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener != null) { 176788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff ((ActionListener) listener).onFailure(message.arg1); 176888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 176988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 177088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff /* ActionListeners grouped together */ 177188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.CONNECT_NETWORK_SUCCEEDED: 177288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.FORGET_NETWORK_SUCCEEDED: 177388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.SAVE_NETWORK_SUCCEEDED: 177488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.DISABLE_NETWORK_SUCCEEDED: 177588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener != null) { 177688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff ((ActionListener) listener).onSuccess(); 177788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 177888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 177988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.START_WPS_SUCCEEDED: 178088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener != null) { 178188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff WpsResult result = (WpsResult) message.obj; 178273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande ((WpsCallback) listener).onStarted(result.pin); 178388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff //Listener needs to stay until completion or failure 1784302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff synchronized(sListenerMapLock) { 1785302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sListenerMap.put(message.arg2, listener); 1786d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 178788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 178888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 178988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.WPS_COMPLETED: 179088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener != null) { 179173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande ((WpsCallback) listener).onSucceeded(); 179288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 179388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 179488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.WPS_FAILED: 179588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener != null) { 179673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande ((WpsCallback) listener).onFailed(message.arg1); 179773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 179873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande break; 179973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande case WifiManager.CANCEL_WPS_SUCCEDED: 180073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande if (listener != null) { 180173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande ((WpsCallback) listener).onSucceeded(); 180273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 180373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande break; 180473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande case WifiManager.CANCEL_WPS_FAILED: 180573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande if (listener != null) { 180673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande ((WpsCallback) listener).onFailed(message.arg1); 180788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 1808f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng break; 1809f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng case WifiManager.RSSI_PKTCNT_FETCH_SUCCEEDED: 1810f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng if (listener != null) { 1811f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng RssiPacketCountInfo info = (RssiPacketCountInfo) message.obj; 1812f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng if (info != null) 1813f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng ((TxPacketCountListener) listener).onSuccess(info.txgood + info.txbad); 1814f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng else 1815f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng ((TxPacketCountListener) listener).onFailure(ERROR); 1816f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng } 1817f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng break; 1818f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng case WifiManager.RSSI_PKTCNT_FETCH_FAILED: 1819f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng if (listener != null) { 1820f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng ((TxPacketCountListener) listener).onFailure(message.arg1); 1821f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng } 182288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 182388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff default: 182488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff //ignore 182588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 1826d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1827d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 182888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 1829d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1830302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static int putListener(Object listener) { 183188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener == null) return INVALID_KEY; 183288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff int key; 1833302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff synchronized (sListenerMapLock) { 183488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff do { 1835302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff key = sListenerKey++; 183688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } while (key == INVALID_KEY); 1837302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sListenerMap.put(key, listener); 1838d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 183988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff return key; 184088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 1841d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1842302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static Object removeListener(int key) { 184388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (key == INVALID_KEY) return null; 1844302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff synchronized (sListenerMapLock) { 1845302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff Object listener = sListenerMap.get(key); 1846302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sListenerMap.remove(key); 184788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff return listener; 1848d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1849d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1850ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 185188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff private void init() { 1852cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff synchronized (sThreadRefLock) { 1853cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff if (++sThreadRefCount == 1) { 1854302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff Messenger messenger = getWifiServiceMessenger(); 1855302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff if (messenger == null) { 1856302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel = null; 1857302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff return; 1858302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff } 1859302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff 1860cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff sHandlerThread = new HandlerThread("WifiManager"); 1861302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel = new AsyncChannel(); 1862302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sConnected = new CountDownLatch(1); 1863302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff 1864cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff sHandlerThread.start(); 1865302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff Handler handler = new ServiceHandler(sHandlerThread.getLooper()); 1866302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.connect(mContext, handler, messenger); 1867302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff try { 1868302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sConnected.await(); 1869302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff } catch (InterruptedException e) { 1870302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff Log.e(TAG, "interrupted wait at init"); 1871302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff } 1872cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff } 1873cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff } 1874d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1875ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 187688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff private void validateChannel() { 1877302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff if (sAsyncChannel == null) throw new IllegalStateException( 187835bbe27d58ccf01ffd170b0f617a568bc843a49eIrfan Sheriff "No permission to access and change wifi or a bad initialization"); 187988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 188088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff 1881e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff /** 1882e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * Connect to a network with the given configuration. The network also 1883e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * gets added to the supplicant configuration. 1884e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 1885e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * For a new network, this function is used instead of a 1886e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * sequence of addNetwork(), enableNetwork(), saveConfiguration() and 1887e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * reconnect() 1888e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 1889e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @param config the set of variables that describe the configuration, 1890e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * contained in a {@link WifiConfiguration} object. 1891d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 189288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 189388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 189488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * 1895e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @hide 1896e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff */ 189788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void connect(WifiConfiguration config, ActionListener listener) { 1898d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (config == null) throw new IllegalArgumentException("config cannot be null"); 189988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 1900ab26407124cf861eacfe7bf0f2a1ef25f4b3a7bdIrfan Sheriff // Use INVALID_NETWORK_ID for arg1 when passing a config object 1901ab26407124cf861eacfe7bf0f2a1ef25f4b3a7bdIrfan Sheriff // arg1 is used to pass network id when the network already exists 1902302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(CONNECT_NETWORK, WifiConfiguration.INVALID_NETWORK_ID, 190388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff putListener(listener), config); 1904e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff } 1905e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff 1906e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff /** 1907e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * Connect to a network with the given networkId. 1908e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 1909e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * This function is used instead of a enableNetwork(), saveConfiguration() and 1910e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * reconnect() 1911e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 1912e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @param networkId the network id identifiying the network in the 1913e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * supplicant configuration list 1914d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 191588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 191688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 1917e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @hide 1918e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff */ 191988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void connect(int networkId, ActionListener listener) { 1920d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (networkId < 0) throw new IllegalArgumentException("Network id cannot be negative"); 192188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 1922302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(CONNECT_NETWORK, networkId, putListener(listener)); 1923e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff } 1924e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff 1925e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff /** 1926e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * Save the given network in the supplicant config. If the network already 1927e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * exists, the configuration is updated. A new network is enabled 1928e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * by default. 1929e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 1930e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * For a new network, this function is used instead of a 1931e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * sequence of addNetwork(), enableNetwork() and saveConfiguration(). 1932e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 1933e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * For an existing network, it accomplishes the task of updateNetwork() 1934e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * and saveConfiguration() 1935e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 1936e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @param config the set of variables that describe the configuration, 1937e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * contained in a {@link WifiConfiguration} object. 1938d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 193988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 194088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 1941e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @hide 1942e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff */ 194388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void save(WifiConfiguration config, ActionListener listener) { 1944d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (config == null) throw new IllegalArgumentException("config cannot be null"); 194588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 1946302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(SAVE_NETWORK, 0, putListener(listener), config); 1947e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff } 1948e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff 1949e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff /** 1950e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * Delete the network in the supplicant config. 1951e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 1952e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * This function is used instead of a sequence of removeNetwork() 1953e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * and saveConfiguration(). 1954e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 1955e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @param config the set of variables that describe the configuration, 1956e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * contained in a {@link WifiConfiguration} object. 1957d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 195888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 195988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 1960e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @hide 1961e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff */ 196288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void forget(int netId, ActionListener listener) { 1963d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (netId < 0) throw new IllegalArgumentException("Network id cannot be negative"); 196488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 1965302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(FORGET_NETWORK, netId, putListener(listener)); 1966d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1967d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1968d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 1969d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Disable network 1970d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * 1971d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param netId is the network Id 1972d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 197388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 197488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 1975d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @hide 1976d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 197788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void disable(int netId, ActionListener listener) { 1978d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (netId < 0) throw new IllegalArgumentException("Network id cannot be negative"); 197988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 1980302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(DISABLE_NETWORK, netId, putListener(listener)); 1981e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff } 1982e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff 198317b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff /** 198493e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle * Disable ephemeral Network 198593e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle * 198693e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle * @param SSID, in the format of WifiConfiguration's SSID. 198793e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle * @hide 198893e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle */ 198993e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle public void disableEphemeralNetwork(String SSID) { 199093e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle if (SSID == null) throw new IllegalArgumentException("SSID cannot be null"); 199193e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle try { 199293e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle mService.disableEphemeralNetwork(SSID); 199393e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle } catch (RemoteException e) { 199493e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle } 199593e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle } 199693e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle 199793e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle /** 199802fb46a297c4f645f2a30b574151401dd0978521Irfan Sheriff * Start Wi-fi Protected Setup 19995ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff * 2000c3eb1556446c932b5674adc40af8ff9bfc3a1880Vinit Deshpande * @param config WPS configuration (does not support {@link WpsInfo#LABEL}) 2001d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 200288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 200388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 20045ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff */ 200573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public void startWps(WpsInfo config, WpsCallback listener) { 2006d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (config == null) throw new IllegalArgumentException("config cannot be null"); 200788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 2008302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(START_WPS, 0, putListener(listener), config); 2009f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff } 2010f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff 2011f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff /** 201286a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff * Cancel any ongoing Wi-fi Protected Setup 201386a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff * 201486a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff * @param listener for callbacks on success or failure. Can be null. 201588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 201688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 201786a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff */ 201873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public void cancelWps(WpsCallback listener) { 201988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 2020302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(CANCEL_WPS, 0, putListener(listener)); 202186a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff } 202286a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff 202386a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff /** 2024227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * Get a reference to WifiService handler. This is used by a client to establish 2025227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * an AsyncChannel communication with WifiService 2026227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 2027227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * @return Messenger pointing to the WifiService handler 2028227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * @hide 2029227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff */ 203007573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff public Messenger getWifiServiceMessenger() { 2031227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff try { 203207573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff return mService.getWifiServiceMessenger(); 2033227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff } catch (RemoteException e) { 2034227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff return null; 203535bbe27d58ccf01ffd170b0f617a568bc843a49eIrfan Sheriff } catch (SecurityException e) { 203635bbe27d58ccf01ffd170b0f617a568bc843a49eIrfan Sheriff return null; 2037227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff } 2038227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff } 2039227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 204007573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff 204107573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff /** 20424aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff * Returns the file in which IP and proxy configuration data is stored 20434aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff * @hide 20444aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff */ 20454aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff public String getConfigFile() { 20464aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff try { 20474aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff return mService.getConfigFile(); 20484aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff } catch (RemoteException e) { 20494aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff return null; 20504aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff } 20514aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff } 20524aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff 20534aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff /** 20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Allows an application to keep the Wi-Fi radio awake. 20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Normally the Wi-Fi radio may turn off when the user has not used the device in a while. 2056227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * Acquiring a WifiLock will keep the radio on until the lock is released. Multiple 20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * applications may hold WifiLocks, and the radio will only be allowed to turn off when no 20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WifiLocks are held in any application. 2059d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * <p> 20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Before using a WifiLock, consider carefully if your application requires Wi-Fi access, or 20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * could function over a mobile network, if available. A program that needs to download large 20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * files should hold a WifiLock to ensure that the download will complete, but a program whose 20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * network usage is occasional or low-bandwidth should not hold a WifiLock to avoid adversely 20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * affecting battery life. 2065d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * <p> 20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Note that WifiLocks cannot override the user-level "Wi-Fi Enabled" setting, nor Airplane 20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Mode. They simply keep the radio from turning off when Wi-Fi is already on but the device 20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is idle. 2069d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * <p> 2070d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * Any application using a WifiLock must request the {@code android.permission.WAKE_LOCK} 2071d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * permission in an {@code <uses-permission>} element of the application's manifest. 20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public class WifiLock { 20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mTag; 20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final IBinder mBinder; 20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mRefCount; 20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLockType; 20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mRefCounted; 20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mHeld; 20807e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn private WorkSource mWorkSource; 20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private WifiLock(int lockType, String tag) { 20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTag = tag; 20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLockType = lockType; 20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBinder = new Binder(); 20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRefCount = 0; 20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRefCounted = true; 20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeld = false; 20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Locks the Wi-Fi radio on until {@link #release} is called. 20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this WifiLock is reference-counted, each call to {@code acquire} will increment the 2095227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * reference count, and the radio will remain locked as long as the reference count is 20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * above zero. 20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this WifiLock is not reference-counted, the first call to {@code acquire} will lock 20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the radio, but subsequent calls will be ignored. Only one call to {@link #release} 21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be required, regardless of the number of times that {@code acquire} is called. 21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void acquire() { 21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mBinder) { 21042c02da2bc62c4dfef684ea381be02a4e568b73d0Irfan Sheriff if (mRefCounted ? (++mRefCount == 1) : (!mHeld)) { 21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 21067e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mService.acquireWifiLock(mBinder, mLockType, mTag, mWorkSource); 2107617750604c69e6068f68266d0e30324273aa990eMike Lockwood synchronized (WifiManager.this) { 2108617750604c69e6068f68266d0e30324273aa990eMike Lockwood if (mActiveLockCount >= MAX_ACTIVE_LOCKS) { 2109617750604c69e6068f68266d0e30324273aa990eMike Lockwood mService.releaseWifiLock(mBinder); 2110617750604c69e6068f68266d0e30324273aa990eMike Lockwood throw new UnsupportedOperationException( 2111617750604c69e6068f68266d0e30324273aa990eMike Lockwood "Exceeded maximum number of wifi locks"); 2112617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 2113617750604c69e6068f68266d0e30324273aa990eMike Lockwood mActiveLockCount++; 2114617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ignore) { 21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeld = true; 21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unlocks the Wi-Fi radio, allowing it to turn off when the device is idle. 21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this WifiLock is reference-counted, each call to {@code release} will decrement the 21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * reference count, and the radio will be unlocked only when the reference count reaches 21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * zero. If the reference count goes below zero (that is, if {@code release} is called 21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a greater number of times than {@link #acquire}), an exception is thrown. 21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this WifiLock is not reference-counted, the first call to {@code release} (after 21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the radio was locked using {@link #acquire}) will unlock the radio, and subsequent 21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * calls will be ignored. 21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void release() { 21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mBinder) { 21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRefCounted ? (--mRefCount == 0) : (mHeld)) { 21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.releaseWifiLock(mBinder); 2139617750604c69e6068f68266d0e30324273aa990eMike Lockwood synchronized (WifiManager.this) { 2140617750604c69e6068f68266d0e30324273aa990eMike Lockwood mActiveLockCount--; 2141617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ignore) { 21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeld = false; 21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRefCount < 0) { 21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("WifiLock under-locked " + mTag); 21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Controls whether this is a reference-counted or non-reference-counted WifiLock. 21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reference-counted WifiLocks keep track of the number of calls to {@link #acquire} and 21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #release}, and only allow the radio to sleep when every call to {@link #acquire} 21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * has been balanced with a call to {@link #release}. Non-reference-counted WifiLocks 21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * lock the radio whenever {@link #acquire} is called and it is unlocked, and unlock the 21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * radio whenever {@link #release} is called and it is locked. 21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param refCounted true if this WifiLock should keep a reference count 21629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setReferenceCounted(boolean refCounted) { 21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRefCounted = refCounted; 21659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Checks whether this WifiLock is currently held. 21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if this WifiLock is held, false otherwise 21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isHeld() { 21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mBinder) { 21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mHeld; 21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21787e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void setWorkSource(WorkSource ws) { 21797e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mBinder) { 21807e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (ws != null && ws.size() == 0) { 21817e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn ws = null; 21827e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 21837e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn boolean changed = true; 21847e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (ws == null) { 21857e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mWorkSource = null; 21867e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } else { 2187a31510e47a0f0c2525702c2f10a85064322a28f2David Christie ws.clearNames(); 2188a31510e47a0f0c2525702c2f10a85064322a28f2David Christie if (mWorkSource == null) { 2189a31510e47a0f0c2525702c2f10a85064322a28f2David Christie changed = mWorkSource != null; 2190a31510e47a0f0c2525702c2f10a85064322a28f2David Christie mWorkSource = new WorkSource(ws); 2191a31510e47a0f0c2525702c2f10a85064322a28f2David Christie } else { 2192a31510e47a0f0c2525702c2f10a85064322a28f2David Christie changed = mWorkSource.diff(ws); 2193a31510e47a0f0c2525702c2f10a85064322a28f2David Christie if (changed) { 2194a31510e47a0f0c2525702c2f10a85064322a28f2David Christie mWorkSource.set(ws); 2195a31510e47a0f0c2525702c2f10a85064322a28f2David Christie } 21967e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 21977e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 21987e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (changed && mHeld) { 21997e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn try { 22007e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mService.updateWifiLockWorkSource(mBinder, mWorkSource); 22017e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } catch (RemoteException e) { 22027e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 22037e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 22047e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 22057e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 22067e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String s1, s2, s3; 22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mBinder) { 22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s1 = Integer.toHexString(System.identityHashCode(this)); 22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s2 = mHeld ? "held; " : ""; 22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRefCounted) { 22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s3 = "refcounted: refcount = " + mRefCount; 22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s3 = "not refcounted"; 22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "WifiLock{ " + s1 + "; " + s2 + s3 + " }"; 22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void finalize() throws Throwable { 22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.finalize(); 22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mBinder) { 22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mHeld) { 22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.releaseWifiLock(mBinder); 2228617750604c69e6068f68266d0e30324273aa990eMike Lockwood synchronized (WifiManager.this) { 2229617750604c69e6068f68266d0e30324273aa990eMike Lockwood mActiveLockCount--; 2230617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ignore) { 22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates a new WifiLock. 22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 22415876a4273e67271f0eca607af9520f7e5abbe4f3Irfan Sheriff * @param lockType the type of lock to create. See {@link #WIFI_MODE_FULL}, 2242652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * {@link #WIFI_MODE_FULL_HIGH_PERF} and {@link #WIFI_MODE_SCAN_ONLY} for 2243652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * descriptions of the types of Wi-Fi locks. 2244652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * @param tag a tag for the WifiLock to identify it in debugging messages. This string is 2245652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * never shown to the user under normal conditions, but should be descriptive 22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * enough to identify your application and the specific WifiLock within it, if it 22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * holds multiple WifiLocks. 22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a new, unacquired WifiLock with the given tag. 22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see WifiLock 22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public WifiLock createWifiLock(int lockType, String tag) { 22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new WifiLock(lockType, tag); 22559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2256652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff 22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates a new WifiLock. 22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param tag a tag for the WifiLock to identify it in debugging messages. This string is 22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * never shown to the user under normal conditions, but should be descriptive 22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * enough to identify your application and the specific WifiLock within it, if it 22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * holds multiple WifiLocks. 22649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 22659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a new, unacquired WifiLock with the given tag. 22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see WifiLock 22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public WifiLock createWifiLock(String tag) { 22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new WifiLock(WIFI_MODE_FULL, tag); 22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22725347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 2273fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 22745347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt /** 2275fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Create a new MulticastLock 22765347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt * 2277fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * @param tag a tag for the MulticastLock to identify it in debugging 227841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * messages. This string is never shown to the user under 227941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * normal conditions, but should be descriptive enough to 228041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * identify your application and the specific MulticastLock 228141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * within it, if it holds multiple MulticastLocks. 22825347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt * 2283fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * @return a new, unacquired MulticastLock with the given tag. 2284fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 2285fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * @see MulticastLock 22865347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt */ 2287fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public MulticastLock createMulticastLock(String tag) { 2288fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt return new MulticastLock(tag); 22895347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 22905347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 22915347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt /** 2292fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Allows an application to receive Wifi Multicast packets. 2293fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Normally the Wifi stack filters out packets not explicitly 2294fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * addressed to this device. Acquring a MulticastLock will 2295fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * cause the stack to receive packets addressed to multicast 2296fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * addresses. Processing these extra packets can cause a noticable 229741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * battery drain and should be disabled when not needed. 22985347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt */ 2299fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public class MulticastLock { 2300fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt private String mTag; 2301fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt private final IBinder mBinder; 230241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt private int mRefCount; 230341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt private boolean mRefCounted; 2304fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt private boolean mHeld; 2305fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 2306fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt private MulticastLock(String tag) { 2307fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt mTag = tag; 2308fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt mBinder = new Binder(); 230941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt mRefCount = 0; 231041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt mRefCounted = true; 2311fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt mHeld = false; 2312fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2313fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 2314fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt /** 2315fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Locks Wifi Multicast on until {@link #release} is called. 2316fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 231741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * If this MulticastLock is reference-counted each call to 231841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * {@code acquire} will increment the reference count, and the 231941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * wifi interface will receive multicast packets as long as the 232041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * reference count is above zero. 232141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * 232241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * If this MulticastLock is not reference-counted, the first call to 232341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * {@code acquire} will turn on the multicast packets, but subsequent 232441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * calls will be ignored. Only one call to {@link #release} will 232541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * be required, regardless of the number of times that {@code acquire} 232641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * is called. 2327fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 2328fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Note that other applications may also lock Wifi Multicast on. 2329fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Only they can relinquish their lock. 2330fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 2331fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Also note that applications cannot leave Multicast locked on. 2332fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * When an app exits or crashes, any Multicast locks will be released. 2333fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt */ 2334fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public void acquire() { 2335fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt synchronized (mBinder) { 23362c02da2bc62c4dfef684ea381be02a4e568b73d0Irfan Sheriff if (mRefCounted ? (++mRefCount == 1) : (!mHeld)) { 2337fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt try { 2338fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt mService.acquireMulticastLock(mBinder, mTag); 2339617750604c69e6068f68266d0e30324273aa990eMike Lockwood synchronized (WifiManager.this) { 2340617750604c69e6068f68266d0e30324273aa990eMike Lockwood if (mActiveLockCount >= MAX_ACTIVE_LOCKS) { 2341617750604c69e6068f68266d0e30324273aa990eMike Lockwood mService.releaseMulticastLock(); 2342617750604c69e6068f68266d0e30324273aa990eMike Lockwood throw new UnsupportedOperationException( 2343617750604c69e6068f68266d0e30324273aa990eMike Lockwood "Exceeded maximum number of wifi locks"); 2344617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 2345617750604c69e6068f68266d0e30324273aa990eMike Lockwood mActiveLockCount++; 2346617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 2347fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } catch (RemoteException ignore) { 2348fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 234941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt mHeld = true; 2350fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2351fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2352fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2353fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 2354fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt /** 2355fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Unlocks Wifi Multicast, restoring the filter of packets 2356fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * not addressed specifically to this device and saving power. 2357fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 235841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * If this MulticastLock is reference-counted, each call to 235941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * {@code release} will decrement the reference count, and the 236041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * multicast packets will only stop being received when the reference 236141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * count reaches zero. If the reference count goes below zero (that 236241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * is, if {@code release} is called a greater number of times than 236341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * {@link #acquire}), an exception is thrown. 236441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * 236541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * If this MulticastLock is not reference-counted, the first call to 236641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * {@code release} (after the radio was multicast locked using 23674a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn * {@link #acquire}) will unlock the multicast, and subsequent calls 236841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * will be ignored. 236941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * 2370fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Note that if any other Wifi Multicast Locks are still outstanding 2371fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * this {@code release} call will not have an immediate effect. Only 2372fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * when all applications have released all their Multicast Locks will 2373fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * the Multicast filter be turned back on. 2374fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 2375fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Also note that when an app exits or crashes all of its Multicast 2376fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Locks will be automatically released. 2377fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt */ 2378fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public void release() { 2379fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt synchronized (mBinder) { 238041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt if (mRefCounted ? (--mRefCount == 0) : (mHeld)) { 2381fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt try { 2382fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt mService.releaseMulticastLock(); 2383617750604c69e6068f68266d0e30324273aa990eMike Lockwood synchronized (WifiManager.this) { 2384617750604c69e6068f68266d0e30324273aa990eMike Lockwood mActiveLockCount--; 2385617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 2386fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } catch (RemoteException ignore) { 2387fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 238841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt mHeld = false; 238941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt } 239041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt if (mRefCount < 0) { 239141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt throw new RuntimeException("MulticastLock under-locked " 239241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt + mTag); 2393fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2394fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2395fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2396fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 2397fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt /** 239841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * Controls whether this is a reference-counted or non-reference- 239941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * counted MulticastLock. 240041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * 240141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * Reference-counted MulticastLocks keep track of the number of calls 240241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * to {@link #acquire} and {@link #release}, and only stop the 240341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * reception of multicast packets when every call to {@link #acquire} 240441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * has been balanced with a call to {@link #release}. Non-reference- 240541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * counted MulticastLocks allow the reception of multicast packets 240641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * whenever {@link #acquire} is called and stop accepting multicast 240741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * packets whenever {@link #release} is called. 240841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * 240941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * @param refCounted true if this MulticastLock should keep a reference 241041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * count 241141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt */ 241241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt public void setReferenceCounted(boolean refCounted) { 241341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt mRefCounted = refCounted; 241441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt } 241541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt 241641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt /** 2417fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Checks whether this MulticastLock is currently held. 2418fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 2419fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * @return true if this MulticastLock is held, false otherwise 2420fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt */ 2421fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public boolean isHeld() { 2422fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt synchronized (mBinder) { 2423fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt return mHeld; 2424fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2425fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2426fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 2427fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public String toString() { 242841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt String s1, s2, s3; 2429fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt synchronized (mBinder) { 2430fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt s1 = Integer.toHexString(System.identityHashCode(this)); 2431fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt s2 = mHeld ? "held; " : ""; 243241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt if (mRefCounted) { 243341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt s3 = "refcounted: refcount = " + mRefCount; 243441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt } else { 243541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt s3 = "not refcounted"; 243641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt } 243741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt return "MulticastLock{ " + s1 + "; " + s2 + s3 + " }"; 2438fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2439fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2440fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 2441fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt @Override 2442fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt protected void finalize() throws Throwable { 2443fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt super.finalize(); 244441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt setReferenceCounted(false); 2445fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt release(); 24465347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 24475347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 24485347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 24495347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt /** 2450fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Check multicast filter status. 24515347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt * 2452fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * @return true if multicast packets are allowed. 24535347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt * 24545347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt * @hide pending API council approval 24555347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt */ 2456fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public boolean isMulticastEnabled() { 24575347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt try { 2458fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt return mService.isMulticastEnabled(); 24595347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } catch (RemoteException e) { 24605347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt return false; 24615347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 24625347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 2463e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt 2464e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt /** 2465e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt * Initialize the multicast filtering to 'on' 2466e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt * @hide no intent to publish 2467e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt */ 2468e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt public boolean initializeMulticastFiltering() { 2469e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt try { 2470e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt mService.initializeMulticastFiltering(); 2471e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt return true; 2472e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt } catch (RemoteException e) { 2473e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt return false; 2474e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt } 2475e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt } 2476da6da0907b28d4704aabbdb1bbeb4300954670d1Irfan Sheriff 2477fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff protected void finalize() throws Throwable { 2478fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff try { 2479cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff synchronized (sThreadRefLock) { 2480302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff if (--sThreadRefCount == 0 && sAsyncChannel != null) { 2481302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.disconnect(); 2482cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff } 2483939caef712f306a1c80ea27e9f41ef6e3ea9e0f1Irfan Sheriff } 2484fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff } finally { 2485fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff super.finalize(); 2486fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff } 2487fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff } 24885fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle 24895fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle /** 24905fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle * Set wifi verbose log. Called from developer settings. 24915fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle * @hide 24925fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle */ 24935fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle public void enableVerboseLogging (int verbose) { 24945fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle try { 24955fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle mService.enableVerboseLogging(verbose); 2496f5af4a972598611c46d4bf169919e23b7375a5a9vandwalle } catch (Exception e) { 2497f5af4a972598611c46d4bf169919e23b7375a5a9vandwalle //ignore any failure here 2498f5af4a972598611c46d4bf169919e23b7375a5a9vandwalle Log.e(TAG, "enableVerboseLogging " + e.toString()); 24995fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } 25005fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } 25015fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle 25025fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle /** 25035fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle * Get the WiFi verbose logging level.This is used by settings 25045fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle * to decide what to show within the picker. 25055fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle * @hide 25065fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle */ 25075fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle public int getVerboseLoggingLevel() { 25085fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle try { 25095fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle return mService.getVerboseLoggingLevel(); 25105fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } catch (RemoteException e) { 25115fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle return 0; 25125fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } 25135fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } 2514d524c78d9358e2fa1e67124468cffa5284870c62vandwalle 2515d524c78d9358e2fa1e67124468cffa5284870c62vandwalle /** 2516d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * Set wifi Aggressive Handover. Called from developer settings. 2517d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * @hide 2518d524c78d9358e2fa1e67124468cffa5284870c62vandwalle */ 2519d524c78d9358e2fa1e67124468cffa5284870c62vandwalle public void enableAggressiveHandover(int enabled) { 2520d524c78d9358e2fa1e67124468cffa5284870c62vandwalle try { 2521d524c78d9358e2fa1e67124468cffa5284870c62vandwalle mService.enableAggressiveHandover(enabled); 2522d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } catch (RemoteException e) { 2523d524c78d9358e2fa1e67124468cffa5284870c62vandwalle 2524d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 2525d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 2526d524c78d9358e2fa1e67124468cffa5284870c62vandwalle 2527d524c78d9358e2fa1e67124468cffa5284870c62vandwalle /** 2528d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * Get the WiFi Handover aggressiveness.This is used by settings 2529d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * to decide what to show within the picker. 2530d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * @hide 2531d524c78d9358e2fa1e67124468cffa5284870c62vandwalle */ 2532d524c78d9358e2fa1e67124468cffa5284870c62vandwalle public int getAggressiveHandover() { 2533d524c78d9358e2fa1e67124468cffa5284870c62vandwalle try { 2534d524c78d9358e2fa1e67124468cffa5284870c62vandwalle return mService.getAggressiveHandover(); 2535d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } catch (RemoteException e) { 2536d524c78d9358e2fa1e67124468cffa5284870c62vandwalle return 0; 2537d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 2538d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 2539d524c78d9358e2fa1e67124468cffa5284870c62vandwalle 2540d524c78d9358e2fa1e67124468cffa5284870c62vandwalle /** 2541d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * Set setting for allowing Scans when traffic is ongoing. 2542d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * @hide 2543d524c78d9358e2fa1e67124468cffa5284870c62vandwalle */ 2544d524c78d9358e2fa1e67124468cffa5284870c62vandwalle public void setAllowScansWithTraffic(int enabled) { 2545d524c78d9358e2fa1e67124468cffa5284870c62vandwalle try { 2546d524c78d9358e2fa1e67124468cffa5284870c62vandwalle mService.setAllowScansWithTraffic(enabled); 2547d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } catch (RemoteException e) { 2548d524c78d9358e2fa1e67124468cffa5284870c62vandwalle 2549d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 2550d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 2551d524c78d9358e2fa1e67124468cffa5284870c62vandwalle 2552d524c78d9358e2fa1e67124468cffa5284870c62vandwalle /** 2553d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * Get setting for allowing Scans when traffic is ongoing. 2554d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * @hide 2555d524c78d9358e2fa1e67124468cffa5284870c62vandwalle */ 2556d524c78d9358e2fa1e67124468cffa5284870c62vandwalle public int getAllowScansWithTraffic() { 2557d524c78d9358e2fa1e67124468cffa5284870c62vandwalle try { 2558d524c78d9358e2fa1e67124468cffa5284870c62vandwalle return mService.getAllowScansWithTraffic(); 2559d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } catch (RemoteException e) { 2560d524c78d9358e2fa1e67124468cffa5284870c62vandwalle return 0; 2561d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 2562d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 256373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 256473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 256573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 2566651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff} 2567