WifiManager.java revision c3eb1556446c932b5674adc40af8ff9bfc3a1880
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 /** 1014738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * Request a scan for access points in specified channel list. Each channel is specified by its 1015738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * frequency in MHz, e.g. "5500" (do NOT include "DFS" even though it is). The availability of 1016738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * the results is made known later in the same way as {@link #startScan}. 1017738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 1018738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * Note: 1019738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 1020738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 1. Customized scan is for non-connection purposes, i.e. it won't trigger a wifi connection 1021738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * even though it finds some known networks. 1022738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 1023738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 2. Customized scan result may include access points that is not specified in the channel 1024738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * list. An app will need to do frequency filtering if it wants to get pure results for the 1025738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * channel list it specified. 1026738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 1027738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * @hide 1028738803fee62a98f244250996380820c4923e7f7bYuhao Zheng */ 1029738803fee62a98f244250996380820c4923e7f7bYuhao Zheng public boolean startCustomizedScan(ScanSettings requested) { 1030738803fee62a98f244250996380820c4923e7f7bYuhao Zheng try { 1031738803fee62a98f244250996380820c4923e7f7bYuhao Zheng mService.startScan(requested, null); 1032738803fee62a98f244250996380820c4923e7f7bYuhao Zheng return true; 1033738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } catch (RemoteException e) { 1034738803fee62a98f244250996380820c4923e7f7bYuhao Zheng return false; 1035738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } 1036738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } 1037738803fee62a98f244250996380820c4923e7f7bYuhao Zheng 1038738803fee62a98f244250996380820c4923e7f7bYuhao Zheng /** @hide */ 1039738803fee62a98f244250996380820c4923e7f7bYuhao Zheng public boolean startCustomizedScan(ScanSettings requested, WorkSource workSource) { 1040738803fee62a98f244250996380820c4923e7f7bYuhao Zheng try { 1041738803fee62a98f244250996380820c4923e7f7bYuhao Zheng mService.startScan(requested, workSource); 1042e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff return true; 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10490451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * Request a batched scan for access points. To end your requested batched scan, 10500451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * call stopBatchedScan with the same Settings. 10510451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * 10520451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * If there are mulitple requests for batched scans, the more demanding settings will 10530451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * take precidence. 10540451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * 10550451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @param requested {@link BatchedScanSettings} the scan settings requested. 10560451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @return false on known error 10570451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @hide 10580451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt */ 10590451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt public boolean requestBatchedScan(BatchedScanSettings requested) { 10600451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt try { 1061a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt return mService.requestBatchedScan(requested, new Binder(), null); 1062a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } catch (RemoteException e) { return false; } 1063a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 1064a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt /** @hide */ 1065a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt public boolean requestBatchedScan(BatchedScanSettings requested, WorkSource workSource) { 1066a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt try { 1067a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt return mService.requestBatchedScan(requested, new Binder(), workSource); 10680451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } catch (RemoteException e) { return false; } 10690451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } 10700451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt 10710451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt /** 10720451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * Check if the Batched Scan feature is supported. 10730451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * 10740451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @return false if not supported. 10750451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @hide 10760451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt */ 1077c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie @SystemApi 10780451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt public boolean isBatchedScanSupported() { 10790451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt try { 10800451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt return mService.isBatchedScanSupported(); 10810451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } catch (RemoteException e) { return false; } 10820451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } 10830451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt 10840451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt /** 10850451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * End a requested batch scan for this applicaiton. Note that batched scan may 10860451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * still occur if other apps are using them. 1087126755cf41710d52554d747f3d3667eb0a3c2694Robert Greenwalt * 1088126755cf41710d52554d747f3d3667eb0a3c2694Robert Greenwalt * @param requested {@link BatchedScanSettings} the scan settings you previously requested 1089126755cf41710d52554d747f3d3667eb0a3c2694Robert Greenwalt * and now wish to stop. A value of null here will stop all scans requested by the 1090126755cf41710d52554d747f3d3667eb0a3c2694Robert Greenwalt * calling App. 10910451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @hide 10920451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt */ 10930451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt public void stopBatchedScan(BatchedScanSettings requested) { 10940451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt try { 109582f4218c0d5dbc10404db8cf31f0284140d80175Robert Greenwalt mService.stopBatchedScan(requested); 10960451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } catch (RemoteException e) {} 10970451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } 10980451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt 10990451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt /** 11000451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * Retrieve the latest batched scan result. This should be called immediately after 11010451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * {@link BATCHED_SCAN_RESULTS_AVAILABLE_ACTION} is received. 11020451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @hide 11030451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt */ 1104c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie @SystemApi 11050451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt public List<BatchedScanResult> getBatchedScanResults() { 11060451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt try { 110795d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn return mService.getBatchedScanResults(mContext.getOpPackageName()); 11080451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } catch (RemoteException e) { 11090451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt return null; 11100451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } 11110451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } 11120451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt 11130451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt /** 11148e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * Force a re-reading of batched scan results. This will attempt 11158e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * to read more information from the chip, but will do so at the expense 11168e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * of previous data. Rate limited to the current scan frequency. 11178e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * 11188e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * pollBatchedScan will always wait 1 period from the start of the batch 11198e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * before trying to read from the chip, so if your #scans/batch == 1 this will 11208e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * have no effect. 11218e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * 11228e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * If you had already waited 1 period before calling, this should have 11238e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * immediate (though async) effect. 11248e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * 11258e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * If you call before that 1 period is up this will set up a timer and fetch 11268e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * results when the 1 period is up. 11278e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * 11288e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * Servicing a pollBatchedScan request (immediate or after timed delay) starts a 11298e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * new batch, so if you were doing 10 scans/batch and called in the 4th scan, you 11308e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * would get data in the 4th and then again 10 scans later. 11318e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * @hide 11328e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt */ 11338e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt public void pollBatchedScan() { 11348e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt try { 11358e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt mService.pollBatchedScan(); 11368e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt } catch (RemoteException e) { } 11378e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt } 11388e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt 11398e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt /** 1140b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales * Creates a configuration token describing the network referenced by {@code netId} 1141b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales * of MIME type application/vnd.wfa.wsc. Can be used to configure WiFi networks via NFC. 1142b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales * 1143b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales * @return hex-string encoded configuration token 1144b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales * @hide 1145b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales */ 1146b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales public String getWpsNfcConfigurationToken(int netId) { 1147b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales try { 1148b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales return mService.getWpsNfcConfigurationToken(netId); 1149b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales } catch (RemoteException e) { 1150b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales return null; 1151b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales } 1152b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales } 1153b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales 1154b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales /** 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return dynamic information about the current Wi-Fi connection, if any is active. 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the Wi-Fi information, contained in {@link WifiInfo}. 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public WifiInfo getConnectionInfo() { 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.getConnectionInfo(); 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the results of the latest access point scan. 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the list of access points found in the most recent scan. 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public List<ScanResult> getScanResults() { 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 117295d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn return mService.getScanResults(mContext.getOpPackageName()); 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11791ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * Check if scanning is always available. 11801ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * 11811ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * If this return {@code true}, apps can issue {@link #startScan} and fetch scan results 11821ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * even when Wi-Fi is turned off. 11831ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * 11841ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * To change this setting, see {@link #ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE}. 11851ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff */ 11867ea33eac4b57aabf9326d60f52e3ed85217ac846Irfan Sheriff public boolean isScanAlwaysAvailable() { 11871ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff try { 11887ea33eac4b57aabf9326d60f52e3ed85217ac846Irfan Sheriff return mService.isScanAlwaysAvailable(); 11891ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff } catch (RemoteException e) { 11901ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff return false; 11911ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff } 11921ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff } 11931ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff 11941ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff /** 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Tell the supplicant to persist the current list of configured networks. 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Note: It is possible for this method to change the network IDs of 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * existing networks. You should assume the network IDs can be different 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * after calling this method. 1200227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean saveConfiguration() { 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.saveConfiguration(); 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1212ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff * Set the country code. 1213ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff * @param countryCode country code in ISO 3166 format. 1214ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff * @param persist {@code true} if this needs to be remembered 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1216ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff * @hide 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1218ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff public void setCountryCode(String country, boolean persist) { 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1220ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff mService.setCountryCode(country, persist); 1221ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff } catch (RemoteException e) { } 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 122536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * Set the operational frequency band. 122636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @param band One of 122736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * {@link #WIFI_FREQUENCY_BAND_AUTO}, 122836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * {@link #WIFI_FREQUENCY_BAND_5GHZ}, 122936f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * {@link #WIFI_FREQUENCY_BAND_2GHZ}, 123036f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @param persist {@code true} if this needs to be remembered 123136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @hide 123236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff */ 123336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff public void setFrequencyBand(int band, boolean persist) { 123436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff try { 123536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff mService.setFrequencyBand(band, persist); 123636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } catch (RemoteException e) { } 123736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } 123836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff 123936f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff /** 124036f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * Get the operational frequency band. 124136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @return One of 124236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * {@link #WIFI_FREQUENCY_BAND_AUTO}, 124336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * {@link #WIFI_FREQUENCY_BAND_5GHZ}, 124436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * {@link #WIFI_FREQUENCY_BAND_2GHZ} or 124536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * {@code -1} on failure. 124636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @hide 124736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff */ 124836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff public int getFrequencyBand() { 124936f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff try { 125036f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff return mService.getFrequencyBand(); 125136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } catch (RemoteException e) { 125236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff return -1; 125336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } 125436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } 125536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff 125636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff /** 125736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * Check if the chipset supports dual frequency band (2.4 GHz and 5 GHz) 125836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @return {@code true} if supported, {@code false} otherwise. 125936f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @hide 126036f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff */ 126136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff public boolean isDualBandSupported() { 126236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff try { 126336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff return mService.isDualBandSupported(); 126436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } catch (RemoteException e) { 126536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff return false; 126636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } 126736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } 126836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff 126936f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff /** 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the DHCP-assigned addresses from the last successful DHCP request, 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if any. 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the DHCP information 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public DhcpInfo getDhcpInfo() { 12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.getDhcpInfo(); 12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Enable or disable Wi-Fi. 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param enabled {@code true} to enable, {@code false} to disable. 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeds (or if the existing state 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is the same as the requested state). 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean setWifiEnabled(boolean enabled) { 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.setWifiEnabled(enabled); 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets the Wi-Fi enabled state. 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return One of {@link #WIFI_STATE_DISABLED}, 12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #WIFI_STATE_DISABLING}, {@link #WIFI_STATE_ENABLED}, 13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #WIFI_STATE_ENABLING}, {@link #WIFI_STATE_UNKNOWN} 13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isWifiEnabled() 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getWifiState() { 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.getWifiEnabledState(); 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return WIFI_STATE_UNKNOWN; 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1310227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1312227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * Return whether Wi-Fi is enabled or disabled. 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if Wi-Fi is enabled 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getWifiState() 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isWifiEnabled() { 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getWifiState() == WIFI_STATE_ENABLED; 13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1319227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1321f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * Return TX packet counter, for CTS test of WiFi watchdog. 1322f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * @param listener is the interface to receive result 1323f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * 1324f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * @hide for CTS test only 1325f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng */ 1326f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public void getTxPacketCount(TxPacketCountListener listener) { 1327f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng validateChannel(); 1328302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(RSSI_PKTCNT_FETCH, 0, putListener(listener)); 1329f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng } 1330f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng 1331f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Calculates the level of the signal. This should be used any time a signal 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is being shown. 1334227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rssi The power of the signal measured in RSSI. 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param numLevels The number of levels to consider in the calculated 13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * level. 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A level of the signal, given in the range of 0 to numLevels-1 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (both inclusive). 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static int calculateSignalLevel(int rssi, int numLevels) { 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (rssi <= MIN_RSSI) { 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (rssi >= MAX_RSSI) { 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return numLevels - 1; 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 13474c0d81b8add0372cc7194b17cc6d2bfc58baacd1Daniel Sandler float inputRange = (MAX_RSSI - MIN_RSSI); 13484c0d81b8add0372cc7194b17cc6d2bfc58baacd1Daniel Sandler float outputRange = (numLevels - 1); 13494c0d81b8add0372cc7194b17cc6d2bfc58baacd1Daniel Sandler return (int)((float)(rssi - MIN_RSSI) * outputRange / inputRange); 13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1352227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Compares two signal strengths. 1355227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rssiA The power of the first signal measured in RSSI. 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rssiB The power of the second signal measured in RSSI. 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns <0 if the first signal is weaker than the second signal, 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 0 if the two signals have the same strength, and >0 if the first 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * signal is stronger than the second signal. 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static int compareSignalLevel(int rssiA, int rssiB) { 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return rssiA - rssiB; 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13675321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Start AccessPoint mode with the specified 13685321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * configuration. If the radio is already running in 13695321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * AP mode, update the new configuration 13705321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Note that starting in access point mode disables station 13715321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * mode operation 13725321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @param wifiConfig SSID, security and channel details as 13735321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * part of WifiConfiguration 13745321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @return {@code true} if the operation succeeds, {@code false} otherwise 13755321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 13765321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide Dont open up yet 13775321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 13785321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff public boolean setWifiApEnabled(WifiConfiguration wifiConfig, boolean enabled) { 13795321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff try { 1380ffcea7ae7316ab748a49f5e8f6c6798356f35719Irfan Sheriff mService.setWifiApEnabled(wifiConfig, enabled); 1381ffcea7ae7316ab748a49f5e8f6c6798356f35719Irfan Sheriff return true; 13825321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } catch (RemoteException e) { 13835321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff return false; 13845321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } 13855321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } 13865321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff 13875321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 13885321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Gets the Wi-Fi enabled state. 13895321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @return One of {@link #WIFI_AP_STATE_DISABLED}, 13905321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * {@link #WIFI_AP_STATE_DISABLING}, {@link #WIFI_AP_STATE_ENABLED}, 13915321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * {@link #WIFI_AP_STATE_ENABLING}, {@link #WIFI_AP_STATE_FAILED} 13925321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #isWifiApEnabled() 13935321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 13945321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide Dont open yet 13955321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 13965321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff public int getWifiApState() { 13975321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff try { 13985321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff return mService.getWifiApEnabledState(); 13995321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } catch (RemoteException e) { 14005321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff return WIFI_AP_STATE_FAILED; 14015321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } 14025321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } 14035321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff 14045321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 14055321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Return whether Wi-Fi AP is enabled or disabled. 14065321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @return {@code true} if Wi-Fi AP is enabled 14075321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #getWifiApState() 14085321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 14095321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide Dont open yet 14105321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 14115321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff public boolean isWifiApEnabled() { 14125321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff return getWifiApState() == WIFI_AP_STATE_ENABLED; 14135321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } 14145321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff 14155321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 14169ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff * Gets the Wi-Fi AP Configuration. 14179ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff * @return AP details in WifiConfiguration 14189ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff * 14199ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff * @hide Dont open yet 14209ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff */ 14219ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff public WifiConfiguration getWifiApConfiguration() { 14229ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff try { 14239ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff return mService.getWifiApConfiguration(); 14249ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff } catch (RemoteException e) { 14259ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff return null; 14269ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff } 14279ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff } 14289ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff 14299ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff /** 143017b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff * Sets the Wi-Fi AP Configuration. 143117b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff * @return {@code true} if the operation succeeded, {@code false} otherwise 143217b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff * 143317b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff * @hide Dont open yet 143417b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff */ 143517b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff public boolean setWifiApConfiguration(WifiConfiguration wifiConfig) { 143617b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff try { 143717b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff mService.setWifiApConfiguration(wifiConfig); 143817b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff return true; 143917b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff } catch (RemoteException e) { 144017b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff return false; 144117b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff } 144217b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff } 144317b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff 14440d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff /** 14450d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * Start the driver and connect to network. 14460d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 14470d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * This function will over-ride WifiLock and device idle status. For example, 14480d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * even if the device is idle or there is only a scan-only lock held, 14490d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * a start wifi would mean that wifi connection is kept active until 14500d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * a stopWifi() is sent. 14510d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 14520d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * This API is used by WifiStateTracker 14530d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 14540d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @return {@code true} if the operation succeeds else {@code false} 14550d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @hide 14560d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff */ 14570d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff public boolean startWifi() { 14580d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff try { 14590d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff mService.startWifi(); 14600d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return true; 14610d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } catch (RemoteException e) { 14620d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return false; 14630d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 14640d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 14650d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff 14660d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff /** 14670d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * Disconnect from a network (if any) and stop the driver. 14680d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 14690d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * This function will over-ride WifiLock and device idle status. Wi-Fi 14700d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * stays inactive until a startWifi() is issued. 14710d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 14720d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * This API is used by WifiStateTracker 14730d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 14740d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @return {@code true} if the operation succeeds else {@code false} 14750d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @hide 14760d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff */ 14770d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff public boolean stopWifi() { 14780d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff try { 14790d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff mService.stopWifi(); 14800d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return true; 14810d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } catch (RemoteException e) { 14820d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return false; 14830d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 14840d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 14850d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff 14860d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff /** 14870d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * Add a bssid to the supplicant blacklist 14880d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 14890d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * This API is used by WifiWatchdogService 14900d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 14910d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @return {@code true} if the operation succeeds else {@code false} 14920d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @hide 14930d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff */ 14940d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff public boolean addToBlacklist(String bssid) { 14950d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff try { 14960d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff mService.addToBlacklist(bssid); 14970d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return true; 14980d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } catch (RemoteException e) { 14990d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return false; 15000d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 15010d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 15020d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff 15030d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff /** 15040d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * Clear the supplicant blacklist 15050d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 15060d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * This API is used by WifiWatchdogService 15070d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 15080d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @return {@code true} if the operation succeeds else {@code false} 15090d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @hide 15100d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff */ 15110d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff public boolean clearBlacklist() { 15120d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff try { 15130d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff mService.clearBlacklist(); 15140d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return true; 15150d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } catch (RemoteException e) { 15160d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return false; 15170d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 15180d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 15190d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff 152064f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde 152164f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde /** 1522b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * Enable/Disable TDLS on a specific local route. 152364f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde * 1524b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * <p> 1525b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * TDLS enables two wireless endpoints to talk to each other directly 1526b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * without going through the access point that is managing the local 1527b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * network. It saves bandwidth and improves quality of the link. 1528b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * </p> 1529b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * <p> 1530b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * This API enables/disables the option of using TDLS. If enabled, the 1531b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * underlying hardware is free to use TDLS or a hop through the access 1532b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * point. If disabled, existing TDLS session is torn down and 1533b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * hardware is restricted to use access point for transferring wireless 1534b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * packets. Default value for all routes is 'disabled', meaning restricted 1535b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * to use access point for transferring packets. 1536b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * </p> 153764f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde * 153864f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde * @param remoteIPAddress IP address of the endpoint to setup TDLS with 153964f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde * @param enable true = setup and false = tear down TDLS 154064f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde */ 1541b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde public void setTdlsEnabled(InetAddress remoteIPAddress, boolean enable) { 154264f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde try { 154364f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde mService.enableTdls(remoteIPAddress.getHostAddress(), enable); 154464f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde } catch (RemoteException e) { 154564f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde // Just ignore the exception 154664f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde } 154764f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde } 154864f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde 154964f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde /** 1550b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * Similar to {@link #setTdlsEnabled(InetAddress, boolean) }, except 1551b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * this version allows you to specify remote endpoint with a MAC address. 155264f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde * @param remoteMacAddress MAC address of the remote endpoint such as 00:00:0c:9f:f2:ab 155364f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde * @param enable true = setup and false = tear down TDLS 155464f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde */ 1555b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde public void setTdlsEnabledWithMacAddress(String remoteMacAddress, boolean enable) { 155664f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde try { 155764f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde mService.enableTdlsWithMacAddress(remoteMacAddress, enable); 155864f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde } catch (RemoteException e) { 155964f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde // Just ignore the exception 156064f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde } 156164f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde } 156264f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde 1563e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff /* TODO: deprecate synchronous API and open up the following API */ 1564ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 1565d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff private static final int BASE = Protocol.BASE_WIFI_MANAGER; 1566d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1567ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff /* Commands to WifiService */ 1568ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff /** @hide */ 1569d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int CONNECT_NETWORK = BASE + 1; 1570d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 1571d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int CONNECT_NETWORK_FAILED = BASE + 2; 1572d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 1573d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int CONNECT_NETWORK_SUCCEEDED = BASE + 3; 1574d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1575d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 1576d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int FORGET_NETWORK = BASE + 4; 1577d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 1578d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int FORGET_NETWORK_FAILED = BASE + 5; 1579ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff /** @hide */ 1580d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int FORGET_NETWORK_SUCCEEDED = BASE + 6; 1581d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1582ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff /** @hide */ 1583d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int SAVE_NETWORK = BASE + 7; 1584ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff /** @hide */ 1585d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int SAVE_NETWORK_FAILED = BASE + 8; 15868dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy /** @hide */ 1587d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int SAVE_NETWORK_SUCCEEDED = BASE + 9; 1588ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 1589ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff /** @hide */ 1590d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int START_WPS = BASE + 10; 1591d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 1592d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int START_WPS_SUCCEEDED = BASE + 11; 1593d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 1594d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int WPS_FAILED = BASE + 12; 159586a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff /** @hide */ 1596d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int WPS_COMPLETED = BASE + 13; 1597d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1598d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 159986a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int CANCEL_WPS = BASE + 14; 160086a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff /** @hide */ 160186a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int CANCEL_WPS_FAILED = BASE + 15; 160286a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff /** @hide */ 160386a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int CANCEL_WPS_SUCCEDED = BASE + 16; 160486a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff 160586a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff /** @hide */ 160686a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int DISABLE_NETWORK = BASE + 17; 1607d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 160886a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int DISABLE_NETWORK_FAILED = BASE + 18; 1609d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 161086a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int DISABLE_NETWORK_SUCCEEDED = BASE + 19; 1611ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 1612f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** @hide */ 1613f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public static final int RSSI_PKTCNT_FETCH = BASE + 20; 1614f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** @hide */ 1615f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public static final int RSSI_PKTCNT_FETCH_SUCCEEDED = BASE + 21; 1616f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** @hide */ 1617f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public static final int RSSI_PKTCNT_FETCH_FAILED = BASE + 22; 1618f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng 1619d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1620d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 1621d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Passed with {@link ActionListener#onFailure}. 1622d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Indicates that the operation failed due to an internal error. 162373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 1624d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 162586a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int ERROR = 0; 1626d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1627d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 1628d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Passed with {@link ActionListener#onFailure}. 1629d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Indicates that the operation is already in progress 163073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 1631d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 163286a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int IN_PROGRESS = 1; 1633d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1634d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 1635d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Passed with {@link ActionListener#onFailure}. 1636d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Indicates that the operation failed because the framework is busy and 1637d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * unable to service the request 163873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 1639d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 164086a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int BUSY = 2; 1641d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1642d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /* WPS specific errors */ 1643674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande /** WPS overlap detected */ 164486a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int WPS_OVERLAP_ERROR = 3; 1645674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande /** WEP on WPS is prohibited */ 164686a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int WPS_WEP_PROHIBITED = 4; 1647674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande /** TKIP only prohibited */ 164886a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int WPS_TKIP_ONLY_PROHIBITED = 5; 1649674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande /** Authentication failure on WPS */ 165086a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int WPS_AUTH_FAILURE = 6; 1651674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande /** WPS timed out */ 165286a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int WPS_TIMED_OUT = 7; 1653d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 165410652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde /** 165510652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde * Passed with {@link ActionListener#onFailure}. 165610652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde * Indicates that the operation failed due to invalid inputs 165773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 165810652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde */ 165910652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde public static final int INVALID_ARGS = 8; 166010652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde 1661ae81483a15bb3811cfc221970ea290599b43d4deSky Faber /** 1662ae81483a15bb3811cfc221970ea290599b43d4deSky Faber * Passed with {@link ActionListener#onFailure}. 1663ae81483a15bb3811cfc221970ea290599b43d4deSky Faber * Indicates that the operation failed due to user permissions. 1664ae81483a15bb3811cfc221970ea290599b43d4deSky Faber * @hide 1665ae81483a15bb3811cfc221970ea290599b43d4deSky Faber */ 1666ae81483a15bb3811cfc221970ea290599b43d4deSky Faber public static final int NOT_AUTHORIZED = 9; 1667ae81483a15bb3811cfc221970ea290599b43d4deSky Faber 166873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 166973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * Interface for callback invocation on an application action 167073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 167173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 1672d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public interface ActionListener { 1673d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** The operation succeeded */ 1674d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public void onSuccess(); 1675d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 1676d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * The operation failed 1677d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param reason The reason for failure could be one of 1678d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * {@link #ERROR}, {@link #IN_PROGRESS} or {@link #BUSY} 1679d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 1680d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public void onFailure(int reason); 1681d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1682d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1683674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande /** Interface for callback invocation on a start WPS action */ 168473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static abstract class WpsCallback { 1685d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** WPS start succeeded */ 168673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public abstract void onStarted(String pin); 1687d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1688d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** WPS operation completed succesfully */ 168973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public abstract void onSucceeded(); 1690d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1691d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 1692d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * WPS operation failed 1693d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param reason The reason for failure could be one of 169473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * {@link #WPS_TKIP_ONLY_PROHIBITED}, {@link #WPS_OVERLAP_ERROR}, 169573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * {@link #WPS_WEP_PROHIBITED}, {@link #WPS_TIMED_OUT} or {@link #WPS_AUTH_FAILURE} 169673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * and some generic errors. 1697d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 169873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public abstract void onFailed(int reason); 1699d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1700d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1701f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** Interface for callback invocation on a TX packet count poll action {@hide} */ 1702f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public interface TxPacketCountListener { 1703f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** 1704f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * The operation succeeded 1705f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * @param count TX packet counter 1706f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng */ 1707f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public void onSuccess(int count); 1708f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** 1709f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * The operation failed 1710f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * @param reason The reason for failure could be one of 1711f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * {@link #ERROR}, {@link #IN_PROGRESS} or {@link #BUSY} 1712f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng */ 1713f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public void onFailure(int reason); 1714f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng } 1715f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng 1716302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static class ServiceHandler extends Handler { 171788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff ServiceHandler(Looper looper) { 171888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff super(looper); 1719d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1720d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 172188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff @Override 172288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void handleMessage(Message message) { 172388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff Object listener = removeListener(message.arg2); 172488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff switch (message.what) { 172588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED: 172688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (message.arg1 == AsyncChannel.STATUS_SUCCESSFUL) { 1727302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(AsyncChannel.CMD_CHANNEL_FULL_CONNECTION); 172888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } else { 172988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff Log.e(TAG, "Failed to set up channel connection"); 173088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff // This will cause all further async API calls on the WifiManager 173188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff // to fail and throw an exception 1732302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel = null; 173388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 1734302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sConnected.countDown(); 173588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 173688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED: 173788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff // Ignore 173888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 173988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case AsyncChannel.CMD_CHANNEL_DISCONNECTED: 174088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff Log.e(TAG, "Channel connection lost"); 174188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff // This will cause all further async API calls on the WifiManager 174288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff // to fail and throw an exception 1743302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel = null; 1744fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff getLooper().quit(); 174588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 174688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff /* ActionListeners grouped together */ 174788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.CONNECT_NETWORK_FAILED: 174888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.FORGET_NETWORK_FAILED: 174988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.SAVE_NETWORK_FAILED: 175088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.DISABLE_NETWORK_FAILED: 175188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener != null) { 175288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff ((ActionListener) listener).onFailure(message.arg1); 175388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 175488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 175588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff /* ActionListeners grouped together */ 175688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.CONNECT_NETWORK_SUCCEEDED: 175788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.FORGET_NETWORK_SUCCEEDED: 175888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.SAVE_NETWORK_SUCCEEDED: 175988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.DISABLE_NETWORK_SUCCEEDED: 176088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener != null) { 176188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff ((ActionListener) listener).onSuccess(); 176288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 176388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 176488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.START_WPS_SUCCEEDED: 176588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener != null) { 176688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff WpsResult result = (WpsResult) message.obj; 176773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande ((WpsCallback) listener).onStarted(result.pin); 176888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff //Listener needs to stay until completion or failure 1769302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff synchronized(sListenerMapLock) { 1770302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sListenerMap.put(message.arg2, listener); 1771d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 177288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 177388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 177488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.WPS_COMPLETED: 177588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener != null) { 177673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande ((WpsCallback) listener).onSucceeded(); 177788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 177888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 177988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.WPS_FAILED: 178088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener != null) { 178173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande ((WpsCallback) listener).onFailed(message.arg1); 178273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 178373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande break; 178473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande case WifiManager.CANCEL_WPS_SUCCEDED: 178573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande if (listener != null) { 178673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande ((WpsCallback) listener).onSucceeded(); 178773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 178873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande break; 178973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande case WifiManager.CANCEL_WPS_FAILED: 179073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande if (listener != null) { 179173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande ((WpsCallback) listener).onFailed(message.arg1); 179288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 1793f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng break; 1794f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng case WifiManager.RSSI_PKTCNT_FETCH_SUCCEEDED: 1795f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng if (listener != null) { 1796f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng RssiPacketCountInfo info = (RssiPacketCountInfo) message.obj; 1797f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng if (info != null) 1798f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng ((TxPacketCountListener) listener).onSuccess(info.txgood + info.txbad); 1799f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng else 1800f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng ((TxPacketCountListener) listener).onFailure(ERROR); 1801f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng } 1802f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng break; 1803f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng case WifiManager.RSSI_PKTCNT_FETCH_FAILED: 1804f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng if (listener != null) { 1805f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng ((TxPacketCountListener) listener).onFailure(message.arg1); 1806f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng } 180788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 180888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff default: 180988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff //ignore 181088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 1811d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1812d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 181388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 1814d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1815302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static int putListener(Object listener) { 181688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener == null) return INVALID_KEY; 181788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff int key; 1818302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff synchronized (sListenerMapLock) { 181988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff do { 1820302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff key = sListenerKey++; 182188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } while (key == INVALID_KEY); 1822302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sListenerMap.put(key, listener); 1823d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 182488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff return key; 182588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 1826d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1827302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static Object removeListener(int key) { 182888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (key == INVALID_KEY) return null; 1829302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff synchronized (sListenerMapLock) { 1830302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff Object listener = sListenerMap.get(key); 1831302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sListenerMap.remove(key); 183288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff return listener; 1833d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1834d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1835ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 183688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff private void init() { 1837cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff synchronized (sThreadRefLock) { 1838cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff if (++sThreadRefCount == 1) { 1839302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff Messenger messenger = getWifiServiceMessenger(); 1840302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff if (messenger == null) { 1841302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel = null; 1842302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff return; 1843302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff } 1844302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff 1845cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff sHandlerThread = new HandlerThread("WifiManager"); 1846302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel = new AsyncChannel(); 1847302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sConnected = new CountDownLatch(1); 1848302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff 1849cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff sHandlerThread.start(); 1850302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff Handler handler = new ServiceHandler(sHandlerThread.getLooper()); 1851302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.connect(mContext, handler, messenger); 1852302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff try { 1853302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sConnected.await(); 1854302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff } catch (InterruptedException e) { 1855302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff Log.e(TAG, "interrupted wait at init"); 1856302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff } 1857cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff } 1858cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff } 1859d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1860ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 186188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff private void validateChannel() { 1862302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff if (sAsyncChannel == null) throw new IllegalStateException( 186335bbe27d58ccf01ffd170b0f617a568bc843a49eIrfan Sheriff "No permission to access and change wifi or a bad initialization"); 186488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 186588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff 1866e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff /** 1867e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * Connect to a network with the given configuration. The network also 1868e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * gets added to the supplicant configuration. 1869e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 1870e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * For a new network, this function is used instead of a 1871e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * sequence of addNetwork(), enableNetwork(), saveConfiguration() and 1872e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * reconnect() 1873e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 1874e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @param config the set of variables that describe the configuration, 1875e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * contained in a {@link WifiConfiguration} object. 1876d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 187788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 187888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 187988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * 1880e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @hide 1881e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff */ 188288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void connect(WifiConfiguration config, ActionListener listener) { 1883d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (config == null) throw new IllegalArgumentException("config cannot be null"); 188488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 1885ab26407124cf861eacfe7bf0f2a1ef25f4b3a7bdIrfan Sheriff // Use INVALID_NETWORK_ID for arg1 when passing a config object 1886ab26407124cf861eacfe7bf0f2a1ef25f4b3a7bdIrfan Sheriff // arg1 is used to pass network id when the network already exists 1887302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(CONNECT_NETWORK, WifiConfiguration.INVALID_NETWORK_ID, 188888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff putListener(listener), config); 1889e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff } 1890e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff 1891e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff /** 1892e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * Connect to a network with the given networkId. 1893e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 1894e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * This function is used instead of a enableNetwork(), saveConfiguration() and 1895e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * reconnect() 1896e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 1897e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @param networkId the network id identifiying the network in the 1898e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * supplicant configuration list 1899d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 190088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 190188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 1902e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @hide 1903e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff */ 190488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void connect(int networkId, ActionListener listener) { 1905d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (networkId < 0) throw new IllegalArgumentException("Network id cannot be negative"); 190688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 1907302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(CONNECT_NETWORK, networkId, putListener(listener)); 1908e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff } 1909e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff 1910e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff /** 1911e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * Save the given network in the supplicant config. If the network already 1912e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * exists, the configuration is updated. A new network is enabled 1913e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * by default. 1914e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 1915e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * For a new network, this function is used instead of a 1916e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * sequence of addNetwork(), enableNetwork() and saveConfiguration(). 1917e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 1918e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * For an existing network, it accomplishes the task of updateNetwork() 1919e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * and saveConfiguration() 1920e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 1921e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @param config the set of variables that describe the configuration, 1922e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * contained in a {@link WifiConfiguration} object. 1923d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 192488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 192588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 1926e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @hide 1927e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff */ 192888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void save(WifiConfiguration config, ActionListener listener) { 1929d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (config == null) throw new IllegalArgumentException("config cannot be null"); 193088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 1931302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(SAVE_NETWORK, 0, putListener(listener), config); 1932e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff } 1933e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff 1934e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff /** 1935e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * Delete the network in the supplicant config. 1936e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 1937e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * This function is used instead of a sequence of removeNetwork() 1938e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * and saveConfiguration(). 1939e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 1940e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @param config the set of variables that describe the configuration, 1941e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * contained in a {@link WifiConfiguration} object. 1942d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 194388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 194488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 1945e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @hide 1946e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff */ 194788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void forget(int netId, ActionListener listener) { 1948d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (netId < 0) throw new IllegalArgumentException("Network id cannot be negative"); 194988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 1950302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(FORGET_NETWORK, netId, putListener(listener)); 1951d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1952d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1953d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 1954d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Disable network 1955d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * 1956d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param netId is the network Id 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 1960d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @hide 1961d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 196288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void disable(int netId, ActionListener listener) { 1963d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (netId < 0) throw new IllegalArgumentException("Network id cannot be negative"); 196488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 1965302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(DISABLE_NETWORK, netId, putListener(listener)); 1966e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff } 1967e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff 196817b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff /** 196902fb46a297c4f645f2a30b574151401dd0978521Irfan Sheriff * Start Wi-fi Protected Setup 19705ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff * 1971c3eb1556446c932b5674adc40af8ff9bfc3a1880Vinit Deshpande * @param config WPS configuration (does not support {@link WpsInfo#LABEL}) 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 19755ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff */ 197673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public void startWps(WpsInfo config, WpsCallback listener) { 1977d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (config == null) throw new IllegalArgumentException("config cannot be null"); 197888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 1979302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(START_WPS, 0, putListener(listener), config); 1980f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff } 1981f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff 1982f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff /** 198386a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff * Cancel any ongoing Wi-fi Protected Setup 198486a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff * 198586a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff * @param listener for callbacks on success or failure. Can be null. 198688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 198788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 198886a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff */ 198973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public void cancelWps(WpsCallback listener) { 199088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 1991302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(CANCEL_WPS, 0, putListener(listener)); 199286a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff } 199386a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff 199486a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff /** 1995227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * Get a reference to WifiService handler. This is used by a client to establish 1996227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * an AsyncChannel communication with WifiService 1997227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 1998227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * @return Messenger pointing to the WifiService handler 1999227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * @hide 2000227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff */ 200107573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff public Messenger getWifiServiceMessenger() { 2002227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff try { 200307573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff return mService.getWifiServiceMessenger(); 2004227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff } catch (RemoteException e) { 2005227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff return null; 200635bbe27d58ccf01ffd170b0f617a568bc843a49eIrfan Sheriff } catch (SecurityException e) { 200735bbe27d58ccf01ffd170b0f617a568bc843a49eIrfan Sheriff return null; 2008227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff } 2009227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff } 2010227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 201107573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff 201207573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff /** 20134aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff * Returns the file in which IP and proxy configuration data is stored 20144aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff * @hide 20154aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff */ 20164aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff public String getConfigFile() { 20174aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff try { 20184aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff return mService.getConfigFile(); 20194aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff } catch (RemoteException e) { 20204aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff return null; 20214aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff } 20224aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff } 20234aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff 20244aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff /** 20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Allows an application to keep the Wi-Fi radio awake. 20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Normally the Wi-Fi radio may turn off when the user has not used the device in a while. 2027227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * Acquiring a WifiLock will keep the radio on until the lock is released. Multiple 20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * applications may hold WifiLocks, and the radio will only be allowed to turn off when no 20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WifiLocks are held in any application. 2030d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * <p> 20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Before using a WifiLock, consider carefully if your application requires Wi-Fi access, or 20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * could function over a mobile network, if available. A program that needs to download large 20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * files should hold a WifiLock to ensure that the download will complete, but a program whose 20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * network usage is occasional or low-bandwidth should not hold a WifiLock to avoid adversely 20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * affecting battery life. 2036d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * <p> 20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Note that WifiLocks cannot override the user-level "Wi-Fi Enabled" setting, nor Airplane 20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Mode. They simply keep the radio from turning off when Wi-Fi is already on but the device 20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is idle. 2040d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * <p> 2041d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * Any application using a WifiLock must request the {@code android.permission.WAKE_LOCK} 2042d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * permission in an {@code <uses-permission>} element of the application's manifest. 20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public class WifiLock { 20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mTag; 20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final IBinder mBinder; 20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mRefCount; 20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLockType; 20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mRefCounted; 20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mHeld; 20517e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn private WorkSource mWorkSource; 20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private WifiLock(int lockType, String tag) { 20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTag = tag; 20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLockType = lockType; 20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBinder = new Binder(); 20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRefCount = 0; 20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRefCounted = true; 20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeld = false; 20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Locks the Wi-Fi radio on until {@link #release} is called. 20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this WifiLock is reference-counted, each call to {@code acquire} will increment the 2066227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * reference count, and the radio will remain locked as long as the reference count is 20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * above zero. 20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this WifiLock is not reference-counted, the first call to {@code acquire} will lock 20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the radio, but subsequent calls will be ignored. Only one call to {@link #release} 20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be required, regardless of the number of times that {@code acquire} is called. 20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void acquire() { 20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mBinder) { 20752c02da2bc62c4dfef684ea381be02a4e568b73d0Irfan Sheriff if (mRefCounted ? (++mRefCount == 1) : (!mHeld)) { 20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 20777e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mService.acquireWifiLock(mBinder, mLockType, mTag, mWorkSource); 2078617750604c69e6068f68266d0e30324273aa990eMike Lockwood synchronized (WifiManager.this) { 2079617750604c69e6068f68266d0e30324273aa990eMike Lockwood if (mActiveLockCount >= MAX_ACTIVE_LOCKS) { 2080617750604c69e6068f68266d0e30324273aa990eMike Lockwood mService.releaseWifiLock(mBinder); 2081617750604c69e6068f68266d0e30324273aa990eMike Lockwood throw new UnsupportedOperationException( 2082617750604c69e6068f68266d0e30324273aa990eMike Lockwood "Exceeded maximum number of wifi locks"); 2083617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 2084617750604c69e6068f68266d0e30324273aa990eMike Lockwood mActiveLockCount++; 2085617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ignore) { 20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeld = true; 20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unlocks the Wi-Fi radio, allowing it to turn off when the device is idle. 20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this WifiLock is reference-counted, each call to {@code release} will decrement the 20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * reference count, and the radio will be unlocked only when the reference count reaches 20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * zero. If the reference count goes below zero (that is, if {@code release} is called 20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a greater number of times than {@link #acquire}), an exception is thrown. 21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this WifiLock is not reference-counted, the first call to {@code release} (after 21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the radio was locked using {@link #acquire}) will unlock the radio, and subsequent 21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * calls will be ignored. 21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void release() { 21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mBinder) { 21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRefCounted ? (--mRefCount == 0) : (mHeld)) { 21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.releaseWifiLock(mBinder); 2110617750604c69e6068f68266d0e30324273aa990eMike Lockwood synchronized (WifiManager.this) { 2111617750604c69e6068f68266d0e30324273aa990eMike Lockwood mActiveLockCount--; 2112617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ignore) { 21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeld = false; 21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRefCount < 0) { 21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("WifiLock under-locked " + mTag); 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 /** 21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Controls whether this is a reference-counted or non-reference-counted WifiLock. 21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reference-counted WifiLocks keep track of the number of calls to {@link #acquire} and 21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #release}, and only allow the radio to sleep when every call to {@link #acquire} 21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * has been balanced with a call to {@link #release}. Non-reference-counted WifiLocks 21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * lock the radio whenever {@link #acquire} is called and it is unlocked, and unlock the 21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * radio whenever {@link #release} is called and it is locked. 21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param refCounted true if this WifiLock should keep a reference count 21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setReferenceCounted(boolean refCounted) { 21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRefCounted = refCounted; 21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Checks whether this WifiLock is currently held. 21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if this WifiLock is held, false otherwise 21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isHeld() { 21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mBinder) { 21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mHeld; 21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21497e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void setWorkSource(WorkSource ws) { 21507e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mBinder) { 21517e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (ws != null && ws.size() == 0) { 21527e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn ws = null; 21537e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 21547e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn boolean changed = true; 21557e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (ws == null) { 21567e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mWorkSource = null; 21577e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } else { 2158a31510e47a0f0c2525702c2f10a85064322a28f2David Christie ws.clearNames(); 2159a31510e47a0f0c2525702c2f10a85064322a28f2David Christie if (mWorkSource == null) { 2160a31510e47a0f0c2525702c2f10a85064322a28f2David Christie changed = mWorkSource != null; 2161a31510e47a0f0c2525702c2f10a85064322a28f2David Christie mWorkSource = new WorkSource(ws); 2162a31510e47a0f0c2525702c2f10a85064322a28f2David Christie } else { 2163a31510e47a0f0c2525702c2f10a85064322a28f2David Christie changed = mWorkSource.diff(ws); 2164a31510e47a0f0c2525702c2f10a85064322a28f2David Christie if (changed) { 2165a31510e47a0f0c2525702c2f10a85064322a28f2David Christie mWorkSource.set(ws); 2166a31510e47a0f0c2525702c2f10a85064322a28f2David Christie } 21677e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 21687e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 21697e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (changed && mHeld) { 21707e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn try { 21717e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mService.updateWifiLockWorkSource(mBinder, mWorkSource); 21727e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } catch (RemoteException e) { 21737e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 21747e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 21757e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 21767e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 21777e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String s1, s2, s3; 21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mBinder) { 21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s1 = Integer.toHexString(System.identityHashCode(this)); 21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s2 = mHeld ? "held; " : ""; 21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRefCounted) { 21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s3 = "refcounted: refcount = " + mRefCount; 21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s3 = "not refcounted"; 21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "WifiLock{ " + s1 + "; " + s2 + s3 + " }"; 21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void finalize() throws Throwable { 21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.finalize(); 21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mBinder) { 21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mHeld) { 21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.releaseWifiLock(mBinder); 2199617750604c69e6068f68266d0e30324273aa990eMike Lockwood synchronized (WifiManager.this) { 2200617750604c69e6068f68266d0e30324273aa990eMike Lockwood mActiveLockCount--; 2201617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ignore) { 22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates a new WifiLock. 22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 22125876a4273e67271f0eca607af9520f7e5abbe4f3Irfan Sheriff * @param lockType the type of lock to create. See {@link #WIFI_MODE_FULL}, 2213652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * {@link #WIFI_MODE_FULL_HIGH_PERF} and {@link #WIFI_MODE_SCAN_ONLY} for 2214652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * descriptions of the types of Wi-Fi locks. 2215652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * @param tag a tag for the WifiLock to identify it in debugging messages. This string is 2216652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * never shown to the user under normal conditions, but should be descriptive 22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * enough to identify your application and the specific WifiLock within it, if it 22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * holds multiple WifiLocks. 22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a new, unacquired WifiLock with the given tag. 22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see WifiLock 22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public WifiLock createWifiLock(int lockType, String tag) { 22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new WifiLock(lockType, tag); 22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2227652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff 22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates a new WifiLock. 22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param tag a tag for the WifiLock to identify it in debugging messages. This string is 22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * never shown to the user under normal conditions, but should be descriptive 22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * enough to identify your application and the specific WifiLock within it, if it 22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * holds multiple WifiLocks. 22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a new, unacquired WifiLock with the given tag. 22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see WifiLock 22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public WifiLock createWifiLock(String tag) { 22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new WifiLock(WIFI_MODE_FULL, tag); 22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22435347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 2244fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 22455347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt /** 2246fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Create a new MulticastLock 22475347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt * 2248fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * @param tag a tag for the MulticastLock to identify it in debugging 224941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * messages. This string is never shown to the user under 225041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * normal conditions, but should be descriptive enough to 225141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * identify your application and the specific MulticastLock 225241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * within it, if it holds multiple MulticastLocks. 22535347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt * 2254fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * @return a new, unacquired MulticastLock with the given tag. 2255fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 2256fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * @see MulticastLock 22575347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt */ 2258fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public MulticastLock createMulticastLock(String tag) { 2259fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt return new MulticastLock(tag); 22605347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 22615347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 22625347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt /** 2263fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Allows an application to receive Wifi Multicast packets. 2264fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Normally the Wifi stack filters out packets not explicitly 2265fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * addressed to this device. Acquring a MulticastLock will 2266fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * cause the stack to receive packets addressed to multicast 2267fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * addresses. Processing these extra packets can cause a noticable 226841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * battery drain and should be disabled when not needed. 22695347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt */ 2270fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public class MulticastLock { 2271fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt private String mTag; 2272fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt private final IBinder mBinder; 227341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt private int mRefCount; 227441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt private boolean mRefCounted; 2275fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt private boolean mHeld; 2276fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 2277fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt private MulticastLock(String tag) { 2278fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt mTag = tag; 2279fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt mBinder = new Binder(); 228041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt mRefCount = 0; 228141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt mRefCounted = true; 2282fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt mHeld = false; 2283fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2284fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 2285fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt /** 2286fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Locks Wifi Multicast on until {@link #release} is called. 2287fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 228841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * If this MulticastLock is reference-counted each call to 228941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * {@code acquire} will increment the reference count, and the 229041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * wifi interface will receive multicast packets as long as the 229141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * reference count is above zero. 229241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * 229341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * If this MulticastLock is not reference-counted, the first call to 229441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * {@code acquire} will turn on the multicast packets, but subsequent 229541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * calls will be ignored. Only one call to {@link #release} will 229641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * be required, regardless of the number of times that {@code acquire} 229741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * is called. 2298fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 2299fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Note that other applications may also lock Wifi Multicast on. 2300fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Only they can relinquish their lock. 2301fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 2302fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Also note that applications cannot leave Multicast locked on. 2303fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * When an app exits or crashes, any Multicast locks will be released. 2304fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt */ 2305fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public void acquire() { 2306fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt synchronized (mBinder) { 23072c02da2bc62c4dfef684ea381be02a4e568b73d0Irfan Sheriff if (mRefCounted ? (++mRefCount == 1) : (!mHeld)) { 2308fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt try { 2309fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt mService.acquireMulticastLock(mBinder, mTag); 2310617750604c69e6068f68266d0e30324273aa990eMike Lockwood synchronized (WifiManager.this) { 2311617750604c69e6068f68266d0e30324273aa990eMike Lockwood if (mActiveLockCount >= MAX_ACTIVE_LOCKS) { 2312617750604c69e6068f68266d0e30324273aa990eMike Lockwood mService.releaseMulticastLock(); 2313617750604c69e6068f68266d0e30324273aa990eMike Lockwood throw new UnsupportedOperationException( 2314617750604c69e6068f68266d0e30324273aa990eMike Lockwood "Exceeded maximum number of wifi locks"); 2315617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 2316617750604c69e6068f68266d0e30324273aa990eMike Lockwood mActiveLockCount++; 2317617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 2318fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } catch (RemoteException ignore) { 2319fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 232041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt mHeld = true; 2321fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2322fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2323fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2324fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 2325fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt /** 2326fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Unlocks Wifi Multicast, restoring the filter of packets 2327fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * not addressed specifically to this device and saving power. 2328fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 232941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * If this MulticastLock is reference-counted, each call to 233041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * {@code release} will decrement the reference count, and the 233141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * multicast packets will only stop being received when the reference 233241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * count reaches zero. If the reference count goes below zero (that 233341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * is, if {@code release} is called a greater number of times than 233441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * {@link #acquire}), an exception is thrown. 233541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * 233641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * If this MulticastLock is not reference-counted, the first call to 233741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * {@code release} (after the radio was multicast locked using 23384a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn * {@link #acquire}) will unlock the multicast, and subsequent calls 233941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * will be ignored. 234041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * 2341fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Note that if any other Wifi Multicast Locks are still outstanding 2342fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * this {@code release} call will not have an immediate effect. Only 2343fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * when all applications have released all their Multicast Locks will 2344fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * the Multicast filter be turned back on. 2345fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 2346fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Also note that when an app exits or crashes all of its Multicast 2347fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Locks will be automatically released. 2348fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt */ 2349fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public void release() { 2350fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt synchronized (mBinder) { 235141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt if (mRefCounted ? (--mRefCount == 0) : (mHeld)) { 2352fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt try { 2353fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt mService.releaseMulticastLock(); 2354617750604c69e6068f68266d0e30324273aa990eMike Lockwood synchronized (WifiManager.this) { 2355617750604c69e6068f68266d0e30324273aa990eMike Lockwood mActiveLockCount--; 2356617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 2357fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } catch (RemoteException ignore) { 2358fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 235941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt mHeld = false; 236041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt } 236141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt if (mRefCount < 0) { 236241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt throw new RuntimeException("MulticastLock under-locked " 236341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt + mTag); 2364fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2365fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2366fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2367fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 2368fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt /** 236941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * Controls whether this is a reference-counted or non-reference- 237041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * counted MulticastLock. 237141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * 237241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * Reference-counted MulticastLocks keep track of the number of calls 237341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * to {@link #acquire} and {@link #release}, and only stop the 237441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * reception of multicast packets when every call to {@link #acquire} 237541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * has been balanced with a call to {@link #release}. Non-reference- 237641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * counted MulticastLocks allow the reception of multicast packets 237741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * whenever {@link #acquire} is called and stop accepting multicast 237841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * packets whenever {@link #release} is called. 237941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * 238041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * @param refCounted true if this MulticastLock should keep a reference 238141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * count 238241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt */ 238341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt public void setReferenceCounted(boolean refCounted) { 238441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt mRefCounted = refCounted; 238541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt } 238641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt 238741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt /** 2388fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Checks whether this MulticastLock is currently held. 2389fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 2390fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * @return true if this MulticastLock is held, false otherwise 2391fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt */ 2392fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public boolean isHeld() { 2393fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt synchronized (mBinder) { 2394fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt return mHeld; 2395fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2396fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2397fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 2398fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public String toString() { 239941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt String s1, s2, s3; 2400fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt synchronized (mBinder) { 2401fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt s1 = Integer.toHexString(System.identityHashCode(this)); 2402fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt s2 = mHeld ? "held; " : ""; 240341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt if (mRefCounted) { 240441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt s3 = "refcounted: refcount = " + mRefCount; 240541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt } else { 240641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt s3 = "not refcounted"; 240741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt } 240841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt return "MulticastLock{ " + s1 + "; " + s2 + s3 + " }"; 2409fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2410fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2411fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 2412fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt @Override 2413fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt protected void finalize() throws Throwable { 2414fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt super.finalize(); 241541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt setReferenceCounted(false); 2416fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt release(); 24175347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 24185347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 24195347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 24205347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt /** 2421fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Check multicast filter status. 24225347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt * 2423fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * @return true if multicast packets are allowed. 24245347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt * 24255347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt * @hide pending API council approval 24265347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt */ 2427fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public boolean isMulticastEnabled() { 24285347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt try { 2429fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt return mService.isMulticastEnabled(); 24305347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } catch (RemoteException e) { 24315347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt return false; 24325347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 24335347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 2434e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt 2435e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt /** 2436e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt * Initialize the multicast filtering to 'on' 2437e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt * @hide no intent to publish 2438e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt */ 2439e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt public boolean initializeMulticastFiltering() { 2440e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt try { 2441e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt mService.initializeMulticastFiltering(); 2442e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt return true; 2443e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt } catch (RemoteException e) { 2444e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt return false; 2445e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt } 2446e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt } 2447da6da0907b28d4704aabbdb1bbeb4300954670d1Irfan Sheriff 2448fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff protected void finalize() throws Throwable { 2449fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff try { 2450cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff synchronized (sThreadRefLock) { 2451302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff if (--sThreadRefCount == 0 && sAsyncChannel != null) { 2452302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.disconnect(); 2453cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff } 2454939caef712f306a1c80ea27e9f41ef6e3ea9e0f1Irfan Sheriff } 2455fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff } finally { 2456fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff super.finalize(); 2457fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff } 2458fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff } 24595fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle 24605fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle /** 24615fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle * Set wifi verbose log. Called from developer settings. 24625fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle * @hide 24635fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle */ 24645fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle public void enableVerboseLogging (int verbose) { 24655fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle try { 24665fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle mService.enableVerboseLogging(verbose); 2467f5af4a972598611c46d4bf169919e23b7375a5a9vandwalle } catch (Exception e) { 2468f5af4a972598611c46d4bf169919e23b7375a5a9vandwalle //ignore any failure here 2469f5af4a972598611c46d4bf169919e23b7375a5a9vandwalle Log.e(TAG, "enableVerboseLogging " + e.toString()); 24705fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } 24715fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } 24725fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle 24735fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle /** 24745fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle * Get the WiFi verbose logging level.This is used by settings 24755fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle * to decide what to show within the picker. 24765fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle * @hide 24775fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle */ 24785fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle public int getVerboseLoggingLevel() { 24795fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle try { 24805fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle return mService.getVerboseLoggingLevel(); 24815fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } catch (RemoteException e) { 24825fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle return 0; 24835fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } 24845fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } 2485d524c78d9358e2fa1e67124468cffa5284870c62vandwalle 2486d524c78d9358e2fa1e67124468cffa5284870c62vandwalle /** 2487d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * Set wifi Aggressive Handover. Called from developer settings. 2488d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * @hide 2489d524c78d9358e2fa1e67124468cffa5284870c62vandwalle */ 2490d524c78d9358e2fa1e67124468cffa5284870c62vandwalle public void enableAggressiveHandover(int enabled) { 2491d524c78d9358e2fa1e67124468cffa5284870c62vandwalle try { 2492d524c78d9358e2fa1e67124468cffa5284870c62vandwalle mService.enableAggressiveHandover(enabled); 2493d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } catch (RemoteException e) { 2494d524c78d9358e2fa1e67124468cffa5284870c62vandwalle 2495d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 2496d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 2497d524c78d9358e2fa1e67124468cffa5284870c62vandwalle 2498d524c78d9358e2fa1e67124468cffa5284870c62vandwalle /** 2499d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * Get the WiFi Handover aggressiveness.This is used by settings 2500d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * to decide what to show within the picker. 2501d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * @hide 2502d524c78d9358e2fa1e67124468cffa5284870c62vandwalle */ 2503d524c78d9358e2fa1e67124468cffa5284870c62vandwalle public int getAggressiveHandover() { 2504d524c78d9358e2fa1e67124468cffa5284870c62vandwalle try { 2505d524c78d9358e2fa1e67124468cffa5284870c62vandwalle return mService.getAggressiveHandover(); 2506d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } catch (RemoteException e) { 2507d524c78d9358e2fa1e67124468cffa5284870c62vandwalle return 0; 2508d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 2509d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 2510d524c78d9358e2fa1e67124468cffa5284870c62vandwalle 2511d524c78d9358e2fa1e67124468cffa5284870c62vandwalle /** 2512d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * Set setting for allowing Scans when traffic is ongoing. 2513d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * @hide 2514d524c78d9358e2fa1e67124468cffa5284870c62vandwalle */ 2515d524c78d9358e2fa1e67124468cffa5284870c62vandwalle public void setAllowScansWithTraffic(int enabled) { 2516d524c78d9358e2fa1e67124468cffa5284870c62vandwalle try { 2517d524c78d9358e2fa1e67124468cffa5284870c62vandwalle mService.setAllowScansWithTraffic(enabled); 2518d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } catch (RemoteException e) { 2519d524c78d9358e2fa1e67124468cffa5284870c62vandwalle 2520d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 2521d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 2522d524c78d9358e2fa1e67124468cffa5284870c62vandwalle 2523d524c78d9358e2fa1e67124468cffa5284870c62vandwalle /** 2524d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * Get setting for allowing Scans when traffic is ongoing. 2525d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * @hide 2526d524c78d9358e2fa1e67124468cffa5284870c62vandwalle */ 2527d524c78d9358e2fa1e67124468cffa5284870c62vandwalle public int getAllowScansWithTraffic() { 2528d524c78d9358e2fa1e67124468cffa5284870c62vandwalle try { 2529d524c78d9358e2fa1e67124468cffa5284870c62vandwalle return mService.getAllowScansWithTraffic(); 2530d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } catch (RemoteException e) { 2531d524c78d9358e2fa1e67124468cffa5284870c62vandwalle return 0; 2532d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 2533d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 253473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 253573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 253673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 2537651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff} 2538