WifiManager.java revision f5af4a972598611c46d4bf169919e23b7375a5a9
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; 21ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriffimport android.content.Context; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.DhcpInfo; 23738803fee62a98f244250996380820c4923e7f7bYuhao Zhengimport android.net.wifi.ScanSettings; 24738803fee62a98f244250996380820c4923e7f7bYuhao Zhengimport android.net.wifi.WifiChannel; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler; 2888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriffimport android.os.HandlerThread; 29d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriffimport android.os.Looper; 30d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriffimport android.os.Message; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 327e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackbornimport android.os.WorkSource; 33227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriffimport android.os.Messenger; 3488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriffimport android.util.Log; 35d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriffimport android.util.SparseArray; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3764f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapndeimport java.net.InetAddress; 3888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriffimport java.util.concurrent.CountDownLatch; 3988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff 40ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriffimport com.android.internal.util.AsyncChannel; 41d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriffimport com.android.internal.util.Protocol; 42ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class provides the primary API for managing all aspects of Wi-Fi 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * connectivity. Get an instance of this class by calling 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Context#getSystemService(String) Context.getSystemService(Context.WIFI_SERVICE)}. 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * It deals with several categories of items: 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The list of configured networks. The list can be viewed and updated, 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and attributes of individual entries can be modified.</li> 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The currently active Wi-Fi network, if any. Connectivity can be 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * established or torn down, and dynamic information about the state of 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the network can be queried.</li> 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Results of access point scans, containing enough information to 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * make decisions about what access point to connect to.</li> 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>It defines the names of various Intent actions that are broadcast 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * upon any sort of change in Wi-Fi state. 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is the API to use when performing Wi-Fi specific operations. To 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * perform operations that pertain to network connectivity at an abstract 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * level, use {@link android.net.ConnectivityManager}. 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class WifiManager { 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff private static final String TAG = "WifiManager"; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Supplicant error codes: 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The error code if there was a problem authenticating. 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int ERROR_AUTHENTICATING = 1; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7689710842585404ea33f941afeb2c321e706005e9Robert Greenwalt * Broadcast intent action indicating whether Wi-Fi scanning is allowed currently 7789710842585404ea33f941afeb2c321e706005e9Robert Greenwalt * @hide 7889710842585404ea33f941afeb2c321e706005e9Robert Greenwalt */ 7989710842585404ea33f941afeb2c321e706005e9Robert Greenwalt public static final String WIFI_SCAN_AVAILABLE = "wifi_scan_available"; 8089710842585404ea33f941afeb2c321e706005e9Robert Greenwalt 8189710842585404ea33f941afeb2c321e706005e9Robert Greenwalt /** 8289710842585404ea33f941afeb2c321e706005e9Robert Greenwalt * Extra int indicating scan availability, WIFI_STATE_ENABLED and WIFI_STATE_DISABLED 8389710842585404ea33f941afeb2c321e706005e9Robert Greenwalt * @hide 8489710842585404ea33f941afeb2c321e706005e9Robert Greenwalt */ 8589710842585404ea33f941afeb2c321e706005e9Robert Greenwalt public static final String EXTRA_SCAN_AVAILABLE = "scan_enabled"; 8689710842585404ea33f941afeb2c321e706005e9Robert Greenwalt 8789710842585404ea33f941afeb2c321e706005e9Robert Greenwalt /** 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Broadcast intent action indicating that Wi-Fi has been enabled, disabled, 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * enabling, disabling, or unknown. One extra provides this state as an int. 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Another extra provides the previous state, if available. 91227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_WIFI_STATE 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_PREVIOUS_WIFI_STATE 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String WIFI_STATE_CHANGED_ACTION = 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android.net.wifi.WIFI_STATE_CHANGED"; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The lookup key for an int that indicates whether Wi-Fi is enabled, 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * disabled, enabling, disabling, or unknown. Retrieve it with 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getIntExtra(String,int)}. 102227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_DISABLED 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_DISABLING 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_ENABLED 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_ENABLING 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_UNKNOWN 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_WIFI_STATE = "wifi_state"; 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The previous Wi-Fi state. 112227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_WIFI_STATE 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_PREVIOUS_WIFI_STATE = "previous_wifi_state"; 116227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wi-Fi is currently being disabled. The state will change to {@link #WIFI_STATE_DISABLED} if 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it finishes successfully. 120227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_CHANGED_ACTION 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getWifiState() 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WIFI_STATE_DISABLING = 0; 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wi-Fi is disabled. 127227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_CHANGED_ACTION 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getWifiState() 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WIFI_STATE_DISABLED = 1; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wi-Fi is currently being enabled. The state will change to {@link #WIFI_STATE_ENABLED} if 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it finishes successfully. 135227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_CHANGED_ACTION 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getWifiState() 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WIFI_STATE_ENABLING = 2; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wi-Fi is enabled. 142227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_CHANGED_ACTION 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getWifiState() 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WIFI_STATE_ENABLED = 3; 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wi-Fi is in an unknown state. This state will occur when an error happens while enabling 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or disabling. 150227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_CHANGED_ACTION 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getWifiState() 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WIFI_STATE_UNKNOWN = 4; 1555321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff 1565321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 1575321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Broadcast intent action indicating that Wi-Fi AP has been enabled, disabled, 1585321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * enabling, disabling, or failed. 1595321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 1605321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide 1615321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 1625321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff public static final String WIFI_AP_STATE_CHANGED_ACTION = 1635321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff "android.net.wifi.WIFI_AP_STATE_CHANGED"; 1645321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff 1655321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 1665321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * The lookup key for an int that indicates whether Wi-Fi AP is enabled, 1675321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * disabled, enabling, disabling, or failed. Retrieve it with 1685321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * {@link android.content.Intent#getIntExtra(String,int)}. 1695321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 1705321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_DISABLED 1715321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_DISABLING 1725321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_ENABLED 1735321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_ENABLING 1745321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_FAILED 1755321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 1765321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide 1775321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 1785321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff public static final String EXTRA_WIFI_AP_STATE = "wifi_state"; 1795321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 1805321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * The previous Wi-Fi state. 1815321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 1825321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #EXTRA_WIFI_AP_STATE 1835321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 1845321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide 1855321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 1865321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff public static final String EXTRA_PREVIOUS_WIFI_AP_STATE = "previous_wifi_state"; 1875321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 1885321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Wi-Fi AP is currently being disabled. The state will change to 1895321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * {@link #WIFI_AP_STATE_DISABLED} if it finishes successfully. 1905321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 1915321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_CHANGED_ACTION 1925321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #getWifiApState() 1935321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 1945321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide 1955321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 196a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff public static final int WIFI_AP_STATE_DISABLING = 10; 1975321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 1985321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Wi-Fi AP is disabled. 1995321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2005321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_CHANGED_ACTION 2015321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #getWifiState() 2025321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2035321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide 2045321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 205a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff public static final int WIFI_AP_STATE_DISABLED = 11; 2065321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 2075321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Wi-Fi AP is currently being enabled. The state will change to 2085321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * {@link #WIFI_AP_STATE_ENABLED} if it finishes successfully. 2095321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2105321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_CHANGED_ACTION 2115321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #getWifiApState() 2125321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2135321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide 2145321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 215a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff public static final int WIFI_AP_STATE_ENABLING = 12; 2165321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 2175321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Wi-Fi AP is enabled. 2185321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2195321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_CHANGED_ACTION 2205321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #getWifiApState() 2215321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2225321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide 2235321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 224a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff public static final int WIFI_AP_STATE_ENABLED = 13; 2255321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 2265321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Wi-Fi AP is in a failed state. This state will occur when an error occurs during 2275321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * enabling or disabling 2285321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2295321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_CHANGED_ACTION 2305321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #getWifiApState() 2315321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2325321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide 2335321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 234a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff public static final int WIFI_AP_STATE_FAILED = 14; 2355321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Broadcast intent action indicating that a connection to the supplicant has 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * been established (and it is now possible 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to perform Wi-Fi operations) or the connection to the supplicant has been 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * lost. One extra provides the connection state as a boolean, where {@code true} 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * means CONNECTED. 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_SUPPLICANT_CONNECTED 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String SUPPLICANT_CONNECTION_CHANGE_ACTION = 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android.net.wifi.supplicant.CONNECTION_CHANGE"; 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The lookup key for a boolean that indicates whether a connection to 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the supplicant daemon has been gained or lost. {@code true} means 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a connection now exists. 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve it with {@link android.content.Intent#getBooleanExtra(String,boolean)}. 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_SUPPLICANT_CONNECTED = "connected"; 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Broadcast intent action indicating that the state of Wi-Fi connectivity 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * has changed. One extra provides the new state 2573550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * in the form of a {@link android.net.NetworkInfo} object. If the new 2583550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * state is CONNECTED, additional extras may provide the BSSID and WifiInfo of 2593550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * the access point. 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as a {@code String}. 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_NETWORK_INFO 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_BSSID 2633550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * @see #EXTRA_WIFI_INFO 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String NETWORK_STATE_CHANGED_ACTION = "android.net.wifi.STATE_CHANGE"; 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The lookup key for a {@link android.net.NetworkInfo} object associated with the 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wi-Fi network. Retrieve with 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getParcelableExtra(String)}. 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_NETWORK_INFO = "networkInfo"; 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The lookup key for a String giving the BSSID of the access point to which 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * we are connected. Only present when the new state is CONNECTED. 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve with 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getStringExtra(String)}. 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_BSSID = "bssid"; 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2813550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * The lookup key for a {@link android.net.wifi.WifiInfo} object giving the 2823550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * information about the access point to which we are connected. Only present 2833550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * when the new state is CONNECTED. Retrieve with 2843550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * {@link android.content.Intent#getParcelableExtra(String)}. 2853550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy */ 2863550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy public static final String EXTRA_WIFI_INFO = "wifiInfo"; 2873550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy /** 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Broadcast intent action indicating that the state of establishing a connection to 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an access point has changed.One extra provides the new 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link SupplicantState}. Note that the supplicant state is Wi-Fi specific, and 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is not generally the most useful thing to look at if you are just interested in 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the overall state of connectivity. 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_NEW_STATE 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_SUPPLICANT_ERROR 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String SUPPLICANT_STATE_CHANGED_ACTION = 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android.net.wifi.supplicant.STATE_CHANGE"; 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The lookup key for a {@link SupplicantState} describing the new state 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve with 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getParcelableExtra(String)}. 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_NEW_STATE = "newState"; 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The lookup key for a {@link SupplicantState} describing the supplicant 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * error code if any 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve with 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getIntExtra(String, int)}. 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #ERROR_AUTHENTICATING 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_SUPPLICANT_ERROR = "supplicantError"; 314fcb659b66756ac02bd1491ae1365b27e8509a890Irfan Sheriff 315fcb659b66756ac02bd1491ae1365b27e8509a890Irfan Sheriff /** 316be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff * Broadcast intent action indicating that the configured networks changed. 3171b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * This can be as a result of adding/updating/deleting a network. If 3181b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * {@link #EXTRA_MULTIPLE_NETWORKS_CHANGED} is set to true the new configuration 3191b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * can be retreived with the {@link #EXTRA_WIFI_CONFIGURATION} extra. If multiple 3201b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * Wi-Fi configurations changed, {@link #EXTRA_WIFI_CONFIGURATION} will not be present. 321e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @hide 322e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff */ 323be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff public static final String CONFIGURED_NETWORKS_CHANGED_ACTION = 324be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff "android.net.wifi.CONFIGURED_NETWORKS_CHANGE"; 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3261b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * The lookup key for a (@link android.net.wifi.WifiConfiguration} object representing 3271b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * the changed Wi-Fi configuration when the {@link #CONFIGURED_NETWORKS_CHANGED_ACTION} 3281b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * broadcast is sent. 3291b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @hide 3301b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood */ 3311b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood public static final String EXTRA_WIFI_CONFIGURATION = "wifiConfiguration"; 3321b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood /** 3331b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * Multiple network configurations have changed. 3341b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @see #CONFIGURED_NETWORKS_CHANGED_ACTION 3351b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * 3361b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @hide 3371b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood */ 3381b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood public static final String EXTRA_MULTIPLE_NETWORKS_CHANGED = "multipleChanges"; 3391b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood /** 3401b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * The lookup key for an integer indicating the reason a Wi-Fi network configuration 3411b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * has changed. Only present if {@link #EXTRA_MULTIPLE_NETWORKS_CHANGED} is {@code false} 3421b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @see #CONFIGURED_NETWORKS_CHANGED_ACTION 3431b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @hide 3441b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood */ 3451b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood public static final String EXTRA_CHANGE_REASON = "changeReason"; 3461b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood /** 3471b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * The configuration is new and was added. 3481b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @hide 3491b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood */ 3501b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood public static final int CHANGE_REASON_ADDED = 0; 3511b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood /** 3521b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * The configuration was removed and is no longer present in the system's list of 3531b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * configured networks. 3541b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @hide 3551b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood */ 3561b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood public static final int CHANGE_REASON_REMOVED = 1; 3571b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood /** 3581b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * The configuration has changed as a result of explicit action or because the system 3591b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * took an automated action such as disabling a malfunctioning configuration. 3601b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @hide 3611b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood */ 3621b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood public static final int CHANGE_REASON_CONFIG_CHANGE = 2; 3631b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood /** 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * An access point scan has completed, and results are available from the supplicant. 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Call {@link #getScanResults()} to obtain the results. 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String SCAN_RESULTS_AVAILABLE_ACTION = "android.net.wifi.SCAN_RESULTS"; 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3700451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * A batch of access point scans has been completed and the results areavailable. 3710451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * Call {@link #getBatchedScanResults()} to obtain the results. 3720451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @hide pending review 3730451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt */ 3740451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 3750451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt public static final String BATCHED_SCAN_RESULTS_AVAILABLE_ACTION = 3760451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt "android.net.wifi.BATCHED_RESULTS"; 3770451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt /** 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The RSSI (signal strength) has changed. 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_NEW_RSSI 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String RSSI_CHANGED_ACTION = "android.net.wifi.RSSI_CHANGED"; 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The lookup key for an {@code int} giving the new RSSI in dBm. 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_NEW_RSSI = "newRssi"; 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 389be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff * Broadcast intent action indicating that the link configuration 3900d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * changed on wifi. 3910d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @hide 3920d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff */ 393be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff public static final String LINK_CONFIGURATION_CHANGED_ACTION = 394be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff "android.net.wifi.LINK_CONFIGURATION_CHANGED"; 395f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 3960d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff /** 39737e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt * The lookup key for a {@link android.net.LinkProperties} object associated with the 3980d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * Wi-Fi network. Retrieve with 3990d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * {@link android.content.Intent#getParcelableExtra(String)}. 4000d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @hide 4010d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff */ 40237e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt public static final String EXTRA_LINK_PROPERTIES = "linkProperties"; 4030d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff 4040d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff /** 405f9cb86aebe9647e0fe0137fc198ba16c017445c6Robert Greenwalt * The lookup key for a {@link android.net.NetworkCapabilities} object associated with the 406f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Wi-Fi network. Retrieve with 407f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * {@link android.content.Intent#getParcelableExtra(String)}. 408f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * @hide 409f61101f6266be243c481d163b95e65d67b8d1669Wink Saville */ 410f9cb86aebe9647e0fe0137fc198ba16c017445c6Robert Greenwalt public static final String EXTRA_NETWORK_CAPABILITIES = "networkCapabilities"; 411f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 412f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The network IDs of the configured networks could have changed. 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String NETWORK_IDS_CHANGED_ACTION = "android.net.wifi.NETWORK_IDS_CHANGED"; 41737e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4191ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * Activity Action: Show a system activity that allows the user to enable 4201ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * scans to be available even with Wi-Fi turned off. 4211ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * 4221ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * <p>Notification of the result of this activity is posted using the 4231ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * {@link android.app.Activity#onActivityResult} callback. The 4241ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * <code>resultCode</code> 4251ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * will be {@link android.app.Activity#RESULT_OK} if scan always mode has 4261ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * been turned on or {@link android.app.Activity#RESULT_CANCELED} if the user 4271ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * has rejected the request or an error has occurred. 4281ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff */ 4291ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 4301ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff public static final String ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE = 4311ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff "android.net.wifi.action.REQUEST_SCAN_ALWAYS_AVAILABLE"; 4321ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff 4331ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff /** 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Activity Action: Pick a Wi-Fi network to connect to. 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Input: Nothing. 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Output: Nothing. 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ACTION_PICK_WIFI_NETWORK = "android.net.wifi.PICK_WIFI_NETWORK"; 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 44299001278289036a3c645e599ed832943ff1b6e15Eric Shienbrood * In this Wi-Fi lock mode, Wi-Fi will be kept active, 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and will behave normally, i.e., it will attempt to automatically 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * establish a connection to a remembered access point that is 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * within range, and will do periodic scans if there are remembered 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * access points but none are in range. 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WIFI_MODE_FULL = 1; 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 45099001278289036a3c645e599ed832943ff1b6e15Eric Shienbrood * In this Wi-Fi lock mode, Wi-Fi will be kept active, 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * but the only operation that will be supported is initiation of 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * scans, and the subsequent reporting of scan results. No attempts 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be made to automatically connect to remembered access points, 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * nor will periodic scans be automatically performed looking for 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * remembered access points. Scans must be explicitly requested by 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an application in this mode. 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WIFI_MODE_SCAN_ONLY = 2; 459652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff /** 460652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * In this Wi-Fi lock mode, Wi-Fi will be kept active as in mode 461652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * {@link #WIFI_MODE_FULL} but it operates at high performance 462652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * with minimum packet loss and low packet latency even when 463652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * the device screen is off. This mode will consume more power 464652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * and hence should be used only when there is a need for such 465652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * an active connection. 466652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * <p> 467652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * An example use case is when a voice connection needs to be 468652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * kept active even after the device screen goes off. Holding the 469652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * regular {@link #WIFI_MODE_FULL} lock will keep the wifi 470652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * connection active, but the connection can be lossy. 471652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * Holding a {@link #WIFI_MODE_FULL_HIGH_PERF} lock for the 472652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * duration of the voice call will improve the call quality. 473652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * <p> 474652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * When there is no support from the hardware, this lock mode 475652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * will have the same behavior as {@link #WIFI_MODE_FULL} 476652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff */ 477652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff public static final int WIFI_MODE_FULL_HIGH_PERF = 3; 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Anything worse than or equal to this will show 0 bars. */ 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int MIN_RSSI = -100; 481652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Anything better than or equal to this will show the max bars. */ 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int MAX_RSSI = -55; 48436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff 48536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff /** 486ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff * Number of RSSI levels used in the framework to initiate 487ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff * {@link #RSSI_CHANGED_ACTION} broadcast 488ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff * @hide 489ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff */ 490ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff public static final int RSSI_LEVELS = 5; 491ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff 492ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff /** 49336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * Auto settings in the driver. The driver could choose to operate on both 49436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * 2.4 GHz and 5 GHz or make a dynamic decision on selecting the band. 49536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @hide 49636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff */ 49736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff public static final int WIFI_FREQUENCY_BAND_AUTO = 0; 49836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff 49936f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff /** 50036f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * Operation on 5 GHz alone 50136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @hide 50236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff */ 50336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff public static final int WIFI_FREQUENCY_BAND_5GHZ = 1; 50436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff 50536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff /** 50636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * Operation on 2.4 GHz alone 50736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @hide 50836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff */ 50936f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff public static final int WIFI_FREQUENCY_BAND_2GHZ = 2; 51036f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff 511227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff /** List of asyncronous notifications 512227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * @hide 513227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff */ 514227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff public static final int DATA_ACTIVITY_NOTIFICATION = 1; 515227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 516227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff //Lowest bit indicates data reception and the second lowest 517227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff //bit indicates data transmitted 518227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff /** @hide */ 519227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff public static final int DATA_ACTIVITY_NONE = 0x00; 520227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff /** @hide */ 521227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff public static final int DATA_ACTIVITY_IN = 0x01; 522227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff /** @hide */ 523227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff public static final int DATA_ACTIVITY_OUT = 0x02; 524227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff /** @hide */ 525227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff public static final int DATA_ACTIVITY_INOUT = 0x03; 526227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 527ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde /** @hide */ 528ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde public static final boolean DEFAULT_POOR_NETWORK_AVOIDANCE_ENABLED = false; 529ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde 530617750604c69e6068f68266d0e30324273aa990eMike Lockwood /* Maximum number of active locks we allow. 531617750604c69e6068f68266d0e30324273aa990eMike Lockwood * This limit was added to prevent apps from creating a ridiculous number 532617750604c69e6068f68266d0e30324273aa990eMike Lockwood * of locks and crashing the system by overflowing the global ref table. 533617750604c69e6068f68266d0e30324273aa990eMike Lockwood */ 534617750604c69e6068f68266d0e30324273aa990eMike Lockwood private static final int MAX_ACTIVE_LOCKS = 50; 535617750604c69e6068f68266d0e30324273aa990eMike Lockwood 536617750604c69e6068f68266d0e30324273aa990eMike Lockwood /* Number of currently active WifiLocks and MulticastLocks */ 537617750604c69e6068f68266d0e30324273aa990eMike Lockwood private int mActiveLockCount; 538617750604c69e6068f68266d0e30324273aa990eMike Lockwood 53988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff private Context mContext; 54088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff IWifiManager mService; 54188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff 54288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff private static final int INVALID_KEY = 0; 543302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static int sListenerKey = 1; 544302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static final SparseArray sListenerMap = new SparseArray(); 545302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static final Object sListenerMapLock = new Object(); 54688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff 547302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static AsyncChannel sAsyncChannel; 548302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static CountDownLatch sConnected; 54988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff 550302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static final Object sThreadRefLock = new Object(); 551cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff private static int sThreadRefCount; 552cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff private static HandlerThread sHandlerThread; 553cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new WifiManager instance. 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Applications will almost always want to use 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Context#getSystemService Context.getSystemService()} to retrieve 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the standard {@link android.content.Context#WIFI_SERVICE Context.WIFI_SERVICE}. 55988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @param context the application context 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param service the Binder interface 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide - hide this because it takes in a parameter of type IWifiManager, which 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is a system private class. 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 56488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public WifiManager(Context context, IWifiManager service) { 56588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff mContext = context; 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService = service; 56788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff init(); 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a list of all the networks configured in the supplicant. 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Not all fields of WifiConfiguration are returned. Only the following 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * fields are filled in: 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>networkId</li> 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>SSID</li> 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>BSSID</li> 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>priority</li> 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>allowedProtocols</li> 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>allowedKeyManagement</li> 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>allowedAuthAlgorithms</li> 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>allowedPairwiseCiphers</li> 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>allowedGroupCiphers</li> 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a list of network configurations in the form of a list 58659358536d2f14b27cdc7386daeabc2b6dca8e177Irfan Sheriff * of {@link WifiConfiguration} objects. Upon failure to fetch or 58759358536d2f14b27cdc7386daeabc2b6dca8e177Irfan Sheriff * when when Wi-Fi is turned off, it can be null. 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public List<WifiConfiguration> getConfiguredNetworks() { 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.getConfiguredNetworks(); 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a new network description to the set of configured networks. 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The {@code networkId} field of the supplied configuration object 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is ignored. 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p/> 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The new network will be marked DISABLED by default. To enable it, 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * called {@link #enableNetwork}. 604227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param config the set of variables that describe the configuration, 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * contained in a {@link WifiConfiguration} object. 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the ID of the newly created network description. This is used in 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * other operations to specified the network to be acted upon. 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns {@code -1} on failure. 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int addNetwork(WifiConfiguration config) { 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (config == null) { 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.networkId = -1; 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return addOrUpdateNetwork(config); 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Update the network description of an existing configured network. 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param config the set of variables that describe the configuration, 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * contained in a {@link WifiConfiguration} object. It may 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be sparse, so that only the items that are being changed 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are non-<code>null</code>. The {@code networkId} field 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * must be set to the ID of the existing network being updated. 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns the {@code networkId} of the supplied 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@code WifiConfiguration} on success. 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <br/> 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns {@code -1} on failure, including when the {@code networkId} 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * field of the {@code WifiConfiguration} does not refer to an 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * existing network. 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int updateNetwork(WifiConfiguration config) { 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (config == null || config.networkId < 0) { 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return addOrUpdateNetwork(config); 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Internal method for doing the RPC that creates a new network description 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or updates an existing one. 644227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param config The possibly sparse object containing the variables that 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are to set or updated in the network description. 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the ID of the network on success, {@code -1} on failure. 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int addOrUpdateNetwork(WifiConfiguration config) { 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.addOrUpdateNetwork(config); 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Remove the specified network from the list of configured networks. 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This may result in the asynchronous delivery of state change 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * events. 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param netId the integer that identifies the network configuration 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to the supplicant 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean removeNetwork(int netId) { 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.removeNetwork(netId); 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Allow a previously configured network to be associated with. If 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <code>disableOthers</code> is true, then all other configured 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * networks are disabled, and an attempt to connect to the selected 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * network is initiated. This may result in the asynchronous delivery 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of state change events. 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param netId the ID of the network in the list of configured networks 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param disableOthers if true, disable all other networks. The way to 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * select a particular network to connect to is specify {@code true} 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for this parameter. 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean enableNetwork(int netId, boolean disableOthers) { 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.enableNetwork(netId, disableOthers); 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Disable a configured network. The specified network will not be 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a candidate for associating. This may result in the asynchronous 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * delivery of state change events. 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param netId the ID of the network as returned by {@link #addNetwork}. 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean disableNetwork(int netId) { 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.disableNetwork(netId); 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Disassociate from the currently active access point. This may result 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the asynchronous delivery of state change events. 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean disconnect() { 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 715e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff mService.disconnect(); 716e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff return true; 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reconnect to the currently active access point, if we are currently 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * disconnected. This may result in the asynchronous delivery of state 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * change events. 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean reconnect() { 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 730e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff mService.reconnect(); 731e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff return true; 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reconnect to the currently active access point, even if we are already 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * connected. This may result in the asynchronous delivery of state 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * change events. 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean reassociate() { 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 745e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff mService.reassociate(); 746e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff return true; 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Check that the supplicant daemon is responding to requests. 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if we were able to communicate with the supplicant and 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it returned the expected response to the PING message. 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean pingSupplicant() { 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mService == null) 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.pingSupplicant(); 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 768738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * Get a list of available channels for customized scan. 769738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 770738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * @see {@link WifiChannel} 771738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 772738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * @return the channel list, or null if not available 773738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * @hide 774738803fee62a98f244250996380820c4923e7f7bYuhao Zheng */ 775738803fee62a98f244250996380820c4923e7f7bYuhao Zheng public List<WifiChannel> getChannelList() { 776738803fee62a98f244250996380820c4923e7f7bYuhao Zheng try { 777738803fee62a98f244250996380820c4923e7f7bYuhao Zheng return mService.getChannelList(); 778738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } catch (RemoteException e) { 779738803fee62a98f244250996380820c4923e7f7bYuhao Zheng return null; 780738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } 781738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } 782738803fee62a98f244250996380820c4923e7f7bYuhao Zheng 783738803fee62a98f244250996380820c4923e7f7bYuhao Zheng /** 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Request a scan for access points. Returns immediately. The availability 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the results is made known later by means of an asynchronous event sent 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on completion of the scan. 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded, i.e., the scan was initiated 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 789a5ec95cdb1a7d2024249277dff1f99d0046c9b56Mike Lockwood public boolean startScan() { 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 791738803fee62a98f244250996380820c4923e7f7bYuhao Zheng mService.startScan(null, null); 7926942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie return true; 7936942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie } catch (RemoteException e) { 7946942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie return false; 7956942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie } 7966942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie } 7976942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie 7986942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie /** @hide */ 7996942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie public boolean startScan(WorkSource workSource) { 8006942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie try { 801738803fee62a98f244250996380820c4923e7f7bYuhao Zheng mService.startScan(null, workSource); 802738803fee62a98f244250996380820c4923e7f7bYuhao Zheng return true; 803738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } catch (RemoteException e) { 804738803fee62a98f244250996380820c4923e7f7bYuhao Zheng return false; 805738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } 806738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } 807738803fee62a98f244250996380820c4923e7f7bYuhao Zheng 808738803fee62a98f244250996380820c4923e7f7bYuhao Zheng /** 809738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * Request a scan for access points in specified channel list. Each channel is specified by its 810738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * frequency in MHz, e.g. "5500" (do NOT include "DFS" even though it is). The availability of 811738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * the results is made known later in the same way as {@link #startScan}. 812738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 813738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * Note: 814738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 815738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 1. Customized scan is for non-connection purposes, i.e. it won't trigger a wifi connection 816738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * even though it finds some known networks. 817738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 818738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 2. Customized scan result may include access points that is not specified in the channel 819738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * list. An app will need to do frequency filtering if it wants to get pure results for the 820738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * channel list it specified. 821738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * 822738803fee62a98f244250996380820c4923e7f7bYuhao Zheng * @hide 823738803fee62a98f244250996380820c4923e7f7bYuhao Zheng */ 824738803fee62a98f244250996380820c4923e7f7bYuhao Zheng public boolean startCustomizedScan(ScanSettings requested) { 825738803fee62a98f244250996380820c4923e7f7bYuhao Zheng try { 826738803fee62a98f244250996380820c4923e7f7bYuhao Zheng mService.startScan(requested, null); 827738803fee62a98f244250996380820c4923e7f7bYuhao Zheng return true; 828738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } catch (RemoteException e) { 829738803fee62a98f244250996380820c4923e7f7bYuhao Zheng return false; 830738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } 831738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } 832738803fee62a98f244250996380820c4923e7f7bYuhao Zheng 833738803fee62a98f244250996380820c4923e7f7bYuhao Zheng /** @hide */ 834738803fee62a98f244250996380820c4923e7f7bYuhao Zheng public boolean startCustomizedScan(ScanSettings requested, WorkSource workSource) { 835738803fee62a98f244250996380820c4923e7f7bYuhao Zheng try { 836738803fee62a98f244250996380820c4923e7f7bYuhao Zheng mService.startScan(requested, workSource); 837e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff return true; 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8440451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * Request a batched scan for access points. To end your requested batched scan, 8450451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * call stopBatchedScan with the same Settings. 8460451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * 8470451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * If there are mulitple requests for batched scans, the more demanding settings will 8480451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * take precidence. 8490451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * 8500451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @param requested {@link BatchedScanSettings} the scan settings requested. 8510451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @return false on known error 8520451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @hide 8530451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt */ 8540451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt public boolean requestBatchedScan(BatchedScanSettings requested) { 8550451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt try { 856a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt return mService.requestBatchedScan(requested, new Binder(), null); 857a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } catch (RemoteException e) { return false; } 858a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 859a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt /** @hide */ 860a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt public boolean requestBatchedScan(BatchedScanSettings requested, WorkSource workSource) { 861a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt try { 862a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt return mService.requestBatchedScan(requested, new Binder(), workSource); 8630451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } catch (RemoteException e) { return false; } 8640451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } 8650451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt 8660451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt /** 8670451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * Check if the Batched Scan feature is supported. 8680451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * 8690451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @return false if not supported. 8700451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @hide 8710451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt */ 8720451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt public boolean isBatchedScanSupported() { 8730451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt try { 8740451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt return mService.isBatchedScanSupported(); 8750451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } catch (RemoteException e) { return false; } 8760451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } 8770451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt 8780451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt /** 8790451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * End a requested batch scan for this applicaiton. Note that batched scan may 8800451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * still occur if other apps are using them. 881126755cf41710d52554d747f3d3667eb0a3c2694Robert Greenwalt * 882126755cf41710d52554d747f3d3667eb0a3c2694Robert Greenwalt * @param requested {@link BatchedScanSettings} the scan settings you previously requested 883126755cf41710d52554d747f3d3667eb0a3c2694Robert Greenwalt * and now wish to stop. A value of null here will stop all scans requested by the 884126755cf41710d52554d747f3d3667eb0a3c2694Robert Greenwalt * calling App. 8850451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @hide 8860451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt */ 8870451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt public void stopBatchedScan(BatchedScanSettings requested) { 8880451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt try { 88982f4218c0d5dbc10404db8cf31f0284140d80175Robert Greenwalt mService.stopBatchedScan(requested); 8900451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } catch (RemoteException e) {} 8910451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } 8920451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt 8930451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt /** 8940451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * Retrieve the latest batched scan result. This should be called immediately after 8950451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * {@link BATCHED_SCAN_RESULTS_AVAILABLE_ACTION} is received. 8960451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @hide 8970451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt */ 8980451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt public List<BatchedScanResult> getBatchedScanResults() { 8990451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt try { 90095d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn return mService.getBatchedScanResults(mContext.getOpPackageName()); 9010451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } catch (RemoteException e) { 9020451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt return null; 9030451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } 9040451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } 9050451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt 9060451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt /** 9078e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * Force a re-reading of batched scan results. This will attempt 9088e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * to read more information from the chip, but will do so at the expense 9098e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * of previous data. Rate limited to the current scan frequency. 9108e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * 9118e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * pollBatchedScan will always wait 1 period from the start of the batch 9128e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * before trying to read from the chip, so if your #scans/batch == 1 this will 9138e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * have no effect. 9148e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * 9158e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * If you had already waited 1 period before calling, this should have 9168e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * immediate (though async) effect. 9178e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * 9188e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * If you call before that 1 period is up this will set up a timer and fetch 9198e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * results when the 1 period is up. 9208e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * 9218e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * Servicing a pollBatchedScan request (immediate or after timed delay) starts a 9228e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * new batch, so if you were doing 10 scans/batch and called in the 4th scan, you 9238e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * would get data in the 4th and then again 10 scans later. 9248e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt * @hide 9258e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt */ 9268e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt public void pollBatchedScan() { 9278e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt try { 9288e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt mService.pollBatchedScan(); 9298e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt } catch (RemoteException e) { } 9308e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt } 9318e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt 9328e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt /** 933b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales * Creates a configuration token describing the network referenced by {@code netId} 934b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales * of MIME type application/vnd.wfa.wsc. Can be used to configure WiFi networks via NFC. 935b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales * 936b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales * @return hex-string encoded configuration token 937b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales * @hide 938b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales */ 939b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales public String getWpsNfcConfigurationToken(int netId) { 940b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales try { 941b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales return mService.getWpsNfcConfigurationToken(netId); 942b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales } catch (RemoteException e) { 943b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales return null; 944b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales } 945b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales } 946b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales 947b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales /** 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return dynamic information about the current Wi-Fi connection, if any is active. 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the Wi-Fi information, contained in {@link WifiInfo}. 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public WifiInfo getConnectionInfo() { 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.getConnectionInfo(); 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the results of the latest access point scan. 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the list of access points found in the most recent scan. 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public List<ScanResult> getScanResults() { 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 96595d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn return mService.getScanResults(mContext.getOpPackageName()); 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9721ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * Check if scanning is always available. 9731ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * 9741ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * If this return {@code true}, apps can issue {@link #startScan} and fetch scan results 9751ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * even when Wi-Fi is turned off. 9761ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * 9771ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * To change this setting, see {@link #ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE}. 9781ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff */ 9797ea33eac4b57aabf9326d60f52e3ed85217ac846Irfan Sheriff public boolean isScanAlwaysAvailable() { 9801ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff try { 9817ea33eac4b57aabf9326d60f52e3ed85217ac846Irfan Sheriff return mService.isScanAlwaysAvailable(); 9821ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff } catch (RemoteException e) { 9831ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff return false; 9841ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff } 9851ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff } 9861ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff 9871ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff /** 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Tell the supplicant to persist the current list of configured networks. 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Note: It is possible for this method to change the network IDs of 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * existing networks. You should assume the network IDs can be different 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * after calling this method. 993227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean saveConfiguration() { 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.saveConfiguration(); 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1005ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff * Set the country code. 1006ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff * @param countryCode country code in ISO 3166 format. 1007ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff * @param persist {@code true} if this needs to be remembered 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1009ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff * @hide 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1011ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff public void setCountryCode(String country, boolean persist) { 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1013ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff mService.setCountryCode(country, persist); 1014ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff } catch (RemoteException e) { } 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 101836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * Set the operational frequency band. 101936f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @param band One of 102036f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * {@link #WIFI_FREQUENCY_BAND_AUTO}, 102136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * {@link #WIFI_FREQUENCY_BAND_5GHZ}, 102236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * {@link #WIFI_FREQUENCY_BAND_2GHZ}, 102336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @param persist {@code true} if this needs to be remembered 102436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @hide 102536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff */ 102636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff public void setFrequencyBand(int band, boolean persist) { 102736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff try { 102836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff mService.setFrequencyBand(band, persist); 102936f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } catch (RemoteException e) { } 103036f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } 103136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff 103236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff /** 103336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * Get the operational frequency band. 103436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @return One of 103536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * {@link #WIFI_FREQUENCY_BAND_AUTO}, 103636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * {@link #WIFI_FREQUENCY_BAND_5GHZ}, 103736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * {@link #WIFI_FREQUENCY_BAND_2GHZ} or 103836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * {@code -1} on failure. 103936f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @hide 104036f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff */ 104136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff public int getFrequencyBand() { 104236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff try { 104336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff return mService.getFrequencyBand(); 104436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } catch (RemoteException e) { 104536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff return -1; 104636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } 104736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } 104836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff 104936f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff /** 105036f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * Check if the chipset supports dual frequency band (2.4 GHz and 5 GHz) 105136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @return {@code true} if supported, {@code false} otherwise. 105236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @hide 105336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff */ 105436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff public boolean isDualBandSupported() { 105536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff try { 105636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff return mService.isDualBandSupported(); 105736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } catch (RemoteException e) { 105836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff return false; 105936f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } 106036f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } 106136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff 106236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff /** 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the DHCP-assigned addresses from the last successful DHCP request, 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if any. 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the DHCP information 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public DhcpInfo getDhcpInfo() { 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.getDhcpInfo(); 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Enable or disable Wi-Fi. 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param enabled {@code true} to enable, {@code false} to disable. 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeds (or if the existing state 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is the same as the requested state). 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean setWifiEnabled(boolean enabled) { 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.setWifiEnabled(enabled); 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets the Wi-Fi enabled state. 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return One of {@link #WIFI_STATE_DISABLED}, 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #WIFI_STATE_DISABLING}, {@link #WIFI_STATE_ENABLED}, 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #WIFI_STATE_ENABLING}, {@link #WIFI_STATE_UNKNOWN} 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isWifiEnabled() 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getWifiState() { 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.getWifiEnabledState(); 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return WIFI_STATE_UNKNOWN; 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1103227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1105227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * Return whether Wi-Fi is enabled or disabled. 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if Wi-Fi is enabled 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getWifiState() 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isWifiEnabled() { 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getWifiState() == WIFI_STATE_ENABLED; 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1112227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1114f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * Return TX packet counter, for CTS test of WiFi watchdog. 1115f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * @param listener is the interface to receive result 1116f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * 1117f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * @hide for CTS test only 1118f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng */ 1119f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public void getTxPacketCount(TxPacketCountListener listener) { 1120f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng validateChannel(); 1121302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(RSSI_PKTCNT_FETCH, 0, putListener(listener)); 1122f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng } 1123f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng 1124f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Calculates the level of the signal. This should be used any time a signal 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is being shown. 1127227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rssi The power of the signal measured in RSSI. 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param numLevels The number of levels to consider in the calculated 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * level. 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A level of the signal, given in the range of 0 to numLevels-1 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (both inclusive). 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static int calculateSignalLevel(int rssi, int numLevels) { 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (rssi <= MIN_RSSI) { 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (rssi >= MAX_RSSI) { 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return numLevels - 1; 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11404c0d81b8add0372cc7194b17cc6d2bfc58baacd1Daniel Sandler float inputRange = (MAX_RSSI - MIN_RSSI); 11414c0d81b8add0372cc7194b17cc6d2bfc58baacd1Daniel Sandler float outputRange = (numLevels - 1); 11424c0d81b8add0372cc7194b17cc6d2bfc58baacd1Daniel Sandler return (int)((float)(rssi - MIN_RSSI) * outputRange / inputRange); 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1145227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Compares two signal strengths. 1148227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rssiA The power of the first signal measured in RSSI. 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rssiB The power of the second signal measured in RSSI. 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns <0 if the first signal is weaker than the second signal, 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 0 if the two signals have the same strength, and >0 if the first 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * signal is stronger than the second signal. 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static int compareSignalLevel(int rssiA, int rssiB) { 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return rssiA - rssiB; 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11605321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Start AccessPoint mode with the specified 11615321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * configuration. If the radio is already running in 11625321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * AP mode, update the new configuration 11635321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Note that starting in access point mode disables station 11645321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * mode operation 11655321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @param wifiConfig SSID, security and channel details as 11665321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * part of WifiConfiguration 11675321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @return {@code true} if the operation succeeds, {@code false} otherwise 11685321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 11695321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide Dont open up yet 11705321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 11715321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff public boolean setWifiApEnabled(WifiConfiguration wifiConfig, boolean enabled) { 11725321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff try { 1173ffcea7ae7316ab748a49f5e8f6c6798356f35719Irfan Sheriff mService.setWifiApEnabled(wifiConfig, enabled); 1174ffcea7ae7316ab748a49f5e8f6c6798356f35719Irfan Sheriff return true; 11755321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } catch (RemoteException e) { 11765321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff return false; 11775321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } 11785321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } 11795321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff 11805321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 11815321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Gets the Wi-Fi enabled state. 11825321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @return One of {@link #WIFI_AP_STATE_DISABLED}, 11835321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * {@link #WIFI_AP_STATE_DISABLING}, {@link #WIFI_AP_STATE_ENABLED}, 11845321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * {@link #WIFI_AP_STATE_ENABLING}, {@link #WIFI_AP_STATE_FAILED} 11855321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #isWifiApEnabled() 11865321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 11875321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide Dont open yet 11885321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 11895321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff public int getWifiApState() { 11905321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff try { 11915321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff return mService.getWifiApEnabledState(); 11925321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } catch (RemoteException e) { 11935321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff return WIFI_AP_STATE_FAILED; 11945321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } 11955321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } 11965321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff 11975321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 11985321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Return whether Wi-Fi AP is enabled or disabled. 11995321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @return {@code true} if Wi-Fi AP is enabled 12005321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #getWifiApState() 12015321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 12025321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide Dont open yet 12035321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 12045321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff public boolean isWifiApEnabled() { 12055321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff return getWifiApState() == WIFI_AP_STATE_ENABLED; 12065321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } 12075321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff 12085321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 12099ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff * Gets the Wi-Fi AP Configuration. 12109ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff * @return AP details in WifiConfiguration 12119ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff * 12129ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff * @hide Dont open yet 12139ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff */ 12149ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff public WifiConfiguration getWifiApConfiguration() { 12159ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff try { 12169ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff return mService.getWifiApConfiguration(); 12179ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff } catch (RemoteException e) { 12189ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff return null; 12199ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff } 12209ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff } 12219ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff 12229ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff /** 122317b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff * Sets the Wi-Fi AP Configuration. 122417b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff * @return {@code true} if the operation succeeded, {@code false} otherwise 122517b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff * 122617b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff * @hide Dont open yet 122717b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff */ 122817b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff public boolean setWifiApConfiguration(WifiConfiguration wifiConfig) { 122917b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff try { 123017b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff mService.setWifiApConfiguration(wifiConfig); 123117b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff return true; 123217b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff } catch (RemoteException e) { 123317b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff return false; 123417b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff } 123517b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff } 123617b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff 12370d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff /** 12380d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * Start the driver and connect to network. 12390d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 12400d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * This function will over-ride WifiLock and device idle status. For example, 12410d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * even if the device is idle or there is only a scan-only lock held, 12420d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * a start wifi would mean that wifi connection is kept active until 12430d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * a stopWifi() is sent. 12440d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 12450d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * This API is used by WifiStateTracker 12460d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 12470d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @return {@code true} if the operation succeeds else {@code false} 12480d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @hide 12490d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff */ 12500d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff public boolean startWifi() { 12510d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff try { 12520d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff mService.startWifi(); 12530d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return true; 12540d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } catch (RemoteException e) { 12550d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return false; 12560d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 12570d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 12580d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff 12590d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff /** 12600d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * Disconnect from a network (if any) and stop the driver. 12610d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 12620d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * This function will over-ride WifiLock and device idle status. Wi-Fi 12630d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * stays inactive until a startWifi() is issued. 12640d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 12650d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * This API is used by WifiStateTracker 12660d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 12670d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @return {@code true} if the operation succeeds else {@code false} 12680d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @hide 12690d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff */ 12700d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff public boolean stopWifi() { 12710d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff try { 12720d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff mService.stopWifi(); 12730d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return true; 12740d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } catch (RemoteException e) { 12750d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return false; 12760d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 12770d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 12780d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff 12790d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff /** 12800d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * Add a bssid to the supplicant blacklist 12810d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 12820d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * This API is used by WifiWatchdogService 12830d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 12840d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @return {@code true} if the operation succeeds else {@code false} 12850d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @hide 12860d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff */ 12870d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff public boolean addToBlacklist(String bssid) { 12880d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff try { 12890d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff mService.addToBlacklist(bssid); 12900d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return true; 12910d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } catch (RemoteException e) { 12920d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return false; 12930d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 12940d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 12950d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff 12960d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff /** 12970d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * Clear the supplicant blacklist 12980d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 12990d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * This API is used by WifiWatchdogService 13000d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * 13010d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @return {@code true} if the operation succeeds else {@code false} 13020d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @hide 13030d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff */ 13040d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff public boolean clearBlacklist() { 13050d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff try { 13060d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff mService.clearBlacklist(); 13070d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return true; 13080d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } catch (RemoteException e) { 13090d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff return false; 13100d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 13110d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff } 13120d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff 131364f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde 131464f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde /** 1315b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * Enable/Disable TDLS on a specific local route. 131664f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde * 1317b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * <p> 1318b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * TDLS enables two wireless endpoints to talk to each other directly 1319b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * without going through the access point that is managing the local 1320b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * network. It saves bandwidth and improves quality of the link. 1321b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * </p> 1322b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * <p> 1323b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * This API enables/disables the option of using TDLS. If enabled, the 1324b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * underlying hardware is free to use TDLS or a hop through the access 1325b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * point. If disabled, existing TDLS session is torn down and 1326b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * hardware is restricted to use access point for transferring wireless 1327b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * packets. Default value for all routes is 'disabled', meaning restricted 1328b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * to use access point for transferring packets. 1329b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * </p> 133064f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde * 133164f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde * @param remoteIPAddress IP address of the endpoint to setup TDLS with 133264f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde * @param enable true = setup and false = tear down TDLS 133364f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde */ 1334b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde public void setTdlsEnabled(InetAddress remoteIPAddress, boolean enable) { 133564f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde try { 133664f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde mService.enableTdls(remoteIPAddress.getHostAddress(), enable); 133764f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde } catch (RemoteException e) { 133864f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde // Just ignore the exception 133964f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde } 134064f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde } 134164f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde 134264f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde /** 1343b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * Similar to {@link #setTdlsEnabled(InetAddress, boolean) }, except 1344b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * this version allows you to specify remote endpoint with a MAC address. 134564f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde * @param remoteMacAddress MAC address of the remote endpoint such as 00:00:0c:9f:f2:ab 134664f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde * @param enable true = setup and false = tear down TDLS 134764f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde */ 1348b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde public void setTdlsEnabledWithMacAddress(String remoteMacAddress, boolean enable) { 134964f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde try { 135064f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde mService.enableTdlsWithMacAddress(remoteMacAddress, enable); 135164f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde } catch (RemoteException e) { 135264f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde // Just ignore the exception 135364f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde } 135464f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde } 135564f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde 1356e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff /* TODO: deprecate synchronous API and open up the following API */ 1357ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 1358d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff private static final int BASE = Protocol.BASE_WIFI_MANAGER; 1359d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1360ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff /* Commands to WifiService */ 1361ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff /** @hide */ 1362d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int CONNECT_NETWORK = BASE + 1; 1363d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 1364d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int CONNECT_NETWORK_FAILED = BASE + 2; 1365d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 1366d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int CONNECT_NETWORK_SUCCEEDED = BASE + 3; 1367d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1368d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 1369d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int FORGET_NETWORK = BASE + 4; 1370d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 1371d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int FORGET_NETWORK_FAILED = BASE + 5; 1372ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff /** @hide */ 1373d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int FORGET_NETWORK_SUCCEEDED = BASE + 6; 1374d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1375ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff /** @hide */ 1376d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int SAVE_NETWORK = BASE + 7; 1377ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff /** @hide */ 1378d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int SAVE_NETWORK_FAILED = BASE + 8; 13798dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy /** @hide */ 1380d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int SAVE_NETWORK_SUCCEEDED = BASE + 9; 1381ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 1382ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff /** @hide */ 1383d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int START_WPS = BASE + 10; 1384d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 1385d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int START_WPS_SUCCEEDED = BASE + 11; 1386d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 1387d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int WPS_FAILED = BASE + 12; 138886a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff /** @hide */ 1389d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int WPS_COMPLETED = BASE + 13; 1390d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1391d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 139286a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int CANCEL_WPS = BASE + 14; 139386a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff /** @hide */ 139486a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int CANCEL_WPS_FAILED = BASE + 15; 139586a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff /** @hide */ 139686a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int CANCEL_WPS_SUCCEDED = BASE + 16; 139786a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff 139886a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff /** @hide */ 139986a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int DISABLE_NETWORK = BASE + 17; 1400d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 140186a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int DISABLE_NETWORK_FAILED = BASE + 18; 1402d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 140386a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int DISABLE_NETWORK_SUCCEEDED = BASE + 19; 1404ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 1405f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** @hide */ 1406f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public static final int RSSI_PKTCNT_FETCH = BASE + 20; 1407f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** @hide */ 1408f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public static final int RSSI_PKTCNT_FETCH_SUCCEEDED = BASE + 21; 1409f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** @hide */ 1410f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public static final int RSSI_PKTCNT_FETCH_FAILED = BASE + 22; 1411f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng 1412d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1413d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 1414d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Passed with {@link ActionListener#onFailure}. 1415d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Indicates that the operation failed due to an internal error. 1416d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 141786a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int ERROR = 0; 1418d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1419d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 1420d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Passed with {@link ActionListener#onFailure}. 1421d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Indicates that the operation is already in progress 1422d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 142386a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int IN_PROGRESS = 1; 1424d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1425d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 1426d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Passed with {@link ActionListener#onFailure}. 1427d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Indicates that the operation failed because the framework is busy and 1428d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * unable to service the request 1429d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 143086a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int BUSY = 2; 1431d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1432d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /* WPS specific errors */ 1433674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande /** WPS overlap detected */ 143486a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int WPS_OVERLAP_ERROR = 3; 1435674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande /** WEP on WPS is prohibited */ 143686a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int WPS_WEP_PROHIBITED = 4; 1437674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande /** TKIP only prohibited */ 143886a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int WPS_TKIP_ONLY_PROHIBITED = 5; 1439674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande /** Authentication failure on WPS */ 144086a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int WPS_AUTH_FAILURE = 6; 1441674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande /** WPS timed out */ 144286a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int WPS_TIMED_OUT = 7; 1443d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 144410652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde /** 144510652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde * Passed with {@link ActionListener#onFailure}. 144610652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde * Indicates that the operation failed due to invalid inputs 144710652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde */ 144810652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde public static final int INVALID_ARGS = 8; 144910652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde 1450ae81483a15bb3811cfc221970ea290599b43d4deSky Faber /** 1451ae81483a15bb3811cfc221970ea290599b43d4deSky Faber * Passed with {@link ActionListener#onFailure}. 1452ae81483a15bb3811cfc221970ea290599b43d4deSky Faber * Indicates that the operation failed due to user permissions. 1453ae81483a15bb3811cfc221970ea290599b43d4deSky Faber * 1454ae81483a15bb3811cfc221970ea290599b43d4deSky Faber * @hide 1455ae81483a15bb3811cfc221970ea290599b43d4deSky Faber */ 1456ae81483a15bb3811cfc221970ea290599b43d4deSky Faber public static final int NOT_AUTHORIZED = 9; 1457ae81483a15bb3811cfc221970ea290599b43d4deSky Faber 1458674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande /** Interface for callback invocation on an application action */ 1459d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public interface ActionListener { 1460d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** The operation succeeded */ 1461d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public void onSuccess(); 1462d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 1463d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * The operation failed 1464d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param reason The reason for failure could be one of 1465d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * {@link #ERROR}, {@link #IN_PROGRESS} or {@link #BUSY} 1466d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 1467d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public void onFailure(int reason); 1468d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1469d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1470674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande /** Interface for callback invocation on a start WPS action */ 1471d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public interface WpsListener { 1472d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** WPS start succeeded */ 1473d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public void onStartSuccess(String pin); 1474d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1475d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** WPS operation completed succesfully */ 1476d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public void onCompletion(); 1477d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1478d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 1479d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * WPS operation failed 1480d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param reason The reason for failure could be one of 1481d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * {@link #IN_PROGRESS}, {@link #WPS_OVERLAP_ERROR},{@link #ERROR} or {@link #BUSY} 1482d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 1483d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public void onFailure(int reason); 1484d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1485d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1486f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** Interface for callback invocation on a TX packet count poll action {@hide} */ 1487f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public interface TxPacketCountListener { 1488f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** 1489f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * The operation succeeded 1490f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * @param count TX packet counter 1491f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng */ 1492f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public void onSuccess(int count); 1493f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** 1494f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * The operation failed 1495f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * @param reason The reason for failure could be one of 1496f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * {@link #ERROR}, {@link #IN_PROGRESS} or {@link #BUSY} 1497f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng */ 1498f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public void onFailure(int reason); 1499f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng } 1500f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng 1501302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static class ServiceHandler extends Handler { 150288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff ServiceHandler(Looper looper) { 150388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff super(looper); 1504d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1505d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 150688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff @Override 150788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void handleMessage(Message message) { 150888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff Object listener = removeListener(message.arg2); 150988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff switch (message.what) { 151088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED: 151188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (message.arg1 == AsyncChannel.STATUS_SUCCESSFUL) { 1512302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(AsyncChannel.CMD_CHANNEL_FULL_CONNECTION); 151388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } else { 151488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff Log.e(TAG, "Failed to set up channel connection"); 151588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff // This will cause all further async API calls on the WifiManager 151688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff // to fail and throw an exception 1517302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel = null; 151888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 1519302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sConnected.countDown(); 152088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 152188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED: 152288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff // Ignore 152388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 152488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case AsyncChannel.CMD_CHANNEL_DISCONNECTED: 152588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff Log.e(TAG, "Channel connection lost"); 152688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff // This will cause all further async API calls on the WifiManager 152788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff // to fail and throw an exception 1528302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel = null; 1529fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff getLooper().quit(); 153088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 153188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff /* ActionListeners grouped together */ 153288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.CONNECT_NETWORK_FAILED: 153388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.FORGET_NETWORK_FAILED: 153488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.SAVE_NETWORK_FAILED: 153588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.CANCEL_WPS_FAILED: 153688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.DISABLE_NETWORK_FAILED: 153788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener != null) { 153888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff ((ActionListener) listener).onFailure(message.arg1); 153988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 154088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 154188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff /* ActionListeners grouped together */ 154288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.CONNECT_NETWORK_SUCCEEDED: 154388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.FORGET_NETWORK_SUCCEEDED: 154488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.SAVE_NETWORK_SUCCEEDED: 154588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.CANCEL_WPS_SUCCEDED: 154688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.DISABLE_NETWORK_SUCCEEDED: 154788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener != null) { 154888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff ((ActionListener) listener).onSuccess(); 154988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 155088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 155188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.START_WPS_SUCCEEDED: 155288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener != null) { 155388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff WpsResult result = (WpsResult) message.obj; 155488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff ((WpsListener) listener).onStartSuccess(result.pin); 155588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff //Listener needs to stay until completion or failure 1556302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff synchronized(sListenerMapLock) { 1557302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sListenerMap.put(message.arg2, listener); 1558d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 155988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 156088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 156188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.WPS_COMPLETED: 156288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener != null) { 156388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff ((WpsListener) listener).onCompletion(); 156488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 156588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 156688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.WPS_FAILED: 156788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener != null) { 156888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff ((WpsListener) listener).onFailure(message.arg1); 156988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 1570f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng break; 1571f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng case WifiManager.RSSI_PKTCNT_FETCH_SUCCEEDED: 1572f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng if (listener != null) { 1573f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng RssiPacketCountInfo info = (RssiPacketCountInfo) message.obj; 1574f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng if (info != null) 1575f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng ((TxPacketCountListener) listener).onSuccess(info.txgood + info.txbad); 1576f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng else 1577f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng ((TxPacketCountListener) listener).onFailure(ERROR); 1578f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng } 1579f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng break; 1580f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng case WifiManager.RSSI_PKTCNT_FETCH_FAILED: 1581f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng if (listener != null) { 1582f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng ((TxPacketCountListener) listener).onFailure(message.arg1); 1583f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng } 158488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 158588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff default: 158688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff //ignore 158788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 1588d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1589d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 159088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 1591d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1592302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static int putListener(Object listener) { 159388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener == null) return INVALID_KEY; 159488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff int key; 1595302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff synchronized (sListenerMapLock) { 159688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff do { 1597302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff key = sListenerKey++; 159888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } while (key == INVALID_KEY); 1599302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sListenerMap.put(key, listener); 1600d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 160188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff return key; 160288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 1603d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1604302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static Object removeListener(int key) { 160588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (key == INVALID_KEY) return null; 1606302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff synchronized (sListenerMapLock) { 1607302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff Object listener = sListenerMap.get(key); 1608302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sListenerMap.remove(key); 160988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff return listener; 1610d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1611d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1612ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 161388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff private void init() { 1614cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff synchronized (sThreadRefLock) { 1615cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff if (++sThreadRefCount == 1) { 1616302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff Messenger messenger = getWifiServiceMessenger(); 1617302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff if (messenger == null) { 1618302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel = null; 1619302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff return; 1620302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff } 1621302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff 1622cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff sHandlerThread = new HandlerThread("WifiManager"); 1623302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel = new AsyncChannel(); 1624302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sConnected = new CountDownLatch(1); 1625302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff 1626cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff sHandlerThread.start(); 1627302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff Handler handler = new ServiceHandler(sHandlerThread.getLooper()); 1628302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.connect(mContext, handler, messenger); 1629302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff try { 1630302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sConnected.await(); 1631302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff } catch (InterruptedException e) { 1632302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff Log.e(TAG, "interrupted wait at init"); 1633302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff } 1634cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff } 1635cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff } 1636d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1637ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 163888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff private void validateChannel() { 1639302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff if (sAsyncChannel == null) throw new IllegalStateException( 164035bbe27d58ccf01ffd170b0f617a568bc843a49eIrfan Sheriff "No permission to access and change wifi or a bad initialization"); 164188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 164288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff 1643e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff /** 1644e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * Connect to a network with the given configuration. The network also 1645e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * gets added to the supplicant configuration. 1646e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 1647e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * For a new network, this function is used instead of a 1648e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * sequence of addNetwork(), enableNetwork(), saveConfiguration() and 1649e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * reconnect() 1650e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 1651e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @param config the set of variables that describe the configuration, 1652e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * contained in a {@link WifiConfiguration} object. 1653d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 165488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 165588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 165688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * 1657e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @hide 1658e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff */ 165988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void connect(WifiConfiguration config, ActionListener listener) { 1660d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (config == null) throw new IllegalArgumentException("config cannot be null"); 166188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 1662ab26407124cf861eacfe7bf0f2a1ef25f4b3a7bdIrfan Sheriff // Use INVALID_NETWORK_ID for arg1 when passing a config object 1663ab26407124cf861eacfe7bf0f2a1ef25f4b3a7bdIrfan Sheriff // arg1 is used to pass network id when the network already exists 1664302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(CONNECT_NETWORK, WifiConfiguration.INVALID_NETWORK_ID, 166588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff putListener(listener), config); 1666e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff } 1667e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff 1668e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff /** 1669e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * Connect to a network with the given networkId. 1670e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 1671e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * This function is used instead of a enableNetwork(), saveConfiguration() and 1672e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * reconnect() 1673e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 1674e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @param networkId the network id identifiying the network in the 1675e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * supplicant configuration list 1676d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 167788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 167888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 1679e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @hide 1680e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff */ 168188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void connect(int networkId, ActionListener listener) { 1682d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (networkId < 0) throw new IllegalArgumentException("Network id cannot be negative"); 168388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 1684302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(CONNECT_NETWORK, networkId, putListener(listener)); 1685e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff } 1686e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff 1687e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff /** 1688e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * Save the given network in the supplicant config. If the network already 1689e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * exists, the configuration is updated. A new network is enabled 1690e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * by default. 1691e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 1692e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * For a new network, this function is used instead of a 1693e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * sequence of addNetwork(), enableNetwork() and saveConfiguration(). 1694e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 1695e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * For an existing network, it accomplishes the task of updateNetwork() 1696e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * and saveConfiguration() 1697e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 1698e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @param config the set of variables that describe the configuration, 1699e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * contained in a {@link WifiConfiguration} object. 1700d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 170188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 170288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 1703e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @hide 1704e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff */ 170588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void save(WifiConfiguration config, ActionListener listener) { 1706d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (config == null) throw new IllegalArgumentException("config cannot be null"); 170788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 1708302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(SAVE_NETWORK, 0, putListener(listener), config); 1709e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff } 1710e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff 1711e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff /** 1712e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * Delete the network in the supplicant config. 1713e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 1714e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * This function is used instead of a sequence of removeNetwork() 1715e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * and saveConfiguration(). 1716e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 1717e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @param config the set of variables that describe the configuration, 1718e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * contained in a {@link WifiConfiguration} object. 1719d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 172088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 172188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 1722e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @hide 1723e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff */ 172488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void forget(int netId, ActionListener listener) { 1725d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (netId < 0) throw new IllegalArgumentException("Network id cannot be negative"); 172688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 1727302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(FORGET_NETWORK, netId, putListener(listener)); 1728d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1729d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1730d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 1731d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Disable network 1732d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * 1733d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param netId is the network Id 1734d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 173588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 173688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 1737d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @hide 1738d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 173988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void disable(int netId, ActionListener listener) { 1740d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (netId < 0) throw new IllegalArgumentException("Network id cannot be negative"); 174188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 1742302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(DISABLE_NETWORK, netId, putListener(listener)); 1743e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff } 1744e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff 174517b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff /** 174602fb46a297c4f645f2a30b574151401dd0978521Irfan Sheriff * Start Wi-fi Protected Setup 17475ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff * 174802fb46a297c4f645f2a30b574151401dd0978521Irfan Sheriff * @param config WPS configuration 1749d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 175088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 175188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 17525ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff */ 175388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void startWps(WpsInfo config, WpsListener listener) { 1754d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (config == null) throw new IllegalArgumentException("config cannot be null"); 175588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 1756302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(START_WPS, 0, putListener(listener), config); 1757f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff } 1758f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff 1759f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff /** 176086a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff * Cancel any ongoing Wi-fi Protected Setup 176186a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff * 176286a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff * @param listener for callbacks on success or failure. Can be null. 176388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 176488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 176586a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff */ 176688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void cancelWps(ActionListener listener) { 176788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 1768302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(CANCEL_WPS, 0, putListener(listener)); 176986a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff } 177086a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff 177186a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff /** 1772227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * Get a reference to WifiService handler. This is used by a client to establish 1773227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * an AsyncChannel communication with WifiService 1774227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 1775227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * @return Messenger pointing to the WifiService handler 1776227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * @hide 1777227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff */ 177807573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff public Messenger getWifiServiceMessenger() { 1779227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff try { 178007573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff return mService.getWifiServiceMessenger(); 1781227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff } catch (RemoteException e) { 1782227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff return null; 178335bbe27d58ccf01ffd170b0f617a568bc843a49eIrfan Sheriff } catch (SecurityException e) { 178435bbe27d58ccf01ffd170b0f617a568bc843a49eIrfan Sheriff return null; 1785227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff } 1786227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff } 1787227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 178807573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff 178907573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff /** 17904aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff * Returns the file in which IP and proxy configuration data is stored 17914aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff * @hide 17924aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff */ 17934aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff public String getConfigFile() { 17944aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff try { 17954aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff return mService.getConfigFile(); 17964aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff } catch (RemoteException e) { 17974aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff return null; 17984aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff } 17994aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff } 18004aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff 18014aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff /** 18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Allows an application to keep the Wi-Fi radio awake. 18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Normally the Wi-Fi radio may turn off when the user has not used the device in a while. 1804227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * Acquiring a WifiLock will keep the radio on until the lock is released. Multiple 18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * applications may hold WifiLocks, and the radio will only be allowed to turn off when no 18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WifiLocks are held in any application. 1807d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * <p> 18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Before using a WifiLock, consider carefully if your application requires Wi-Fi access, or 18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * could function over a mobile network, if available. A program that needs to download large 18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * files should hold a WifiLock to ensure that the download will complete, but a program whose 18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * network usage is occasional or low-bandwidth should not hold a WifiLock to avoid adversely 18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * affecting battery life. 1813d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * <p> 18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Note that WifiLocks cannot override the user-level "Wi-Fi Enabled" setting, nor Airplane 18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Mode. They simply keep the radio from turning off when Wi-Fi is already on but the device 18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is idle. 1817d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * <p> 1818d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * Any application using a WifiLock must request the {@code android.permission.WAKE_LOCK} 1819d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * permission in an {@code <uses-permission>} element of the application's manifest. 18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public class WifiLock { 18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mTag; 18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final IBinder mBinder; 18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mRefCount; 18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLockType; 18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mRefCounted; 18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mHeld; 18287e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn private WorkSource mWorkSource; 18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private WifiLock(int lockType, String tag) { 18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTag = tag; 18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLockType = lockType; 18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBinder = new Binder(); 18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRefCount = 0; 18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRefCounted = true; 18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeld = false; 18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Locks the Wi-Fi radio on until {@link #release} is called. 18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this WifiLock is reference-counted, each call to {@code acquire} will increment the 1843227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * reference count, and the radio will remain locked as long as the reference count is 18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * above zero. 18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this WifiLock is not reference-counted, the first call to {@code acquire} will lock 18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the radio, but subsequent calls will be ignored. Only one call to {@link #release} 18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be required, regardless of the number of times that {@code acquire} is called. 18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void acquire() { 18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mBinder) { 18522c02da2bc62c4dfef684ea381be02a4e568b73d0Irfan Sheriff if (mRefCounted ? (++mRefCount == 1) : (!mHeld)) { 18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 18547e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mService.acquireWifiLock(mBinder, mLockType, mTag, mWorkSource); 1855617750604c69e6068f68266d0e30324273aa990eMike Lockwood synchronized (WifiManager.this) { 1856617750604c69e6068f68266d0e30324273aa990eMike Lockwood if (mActiveLockCount >= MAX_ACTIVE_LOCKS) { 1857617750604c69e6068f68266d0e30324273aa990eMike Lockwood mService.releaseWifiLock(mBinder); 1858617750604c69e6068f68266d0e30324273aa990eMike Lockwood throw new UnsupportedOperationException( 1859617750604c69e6068f68266d0e30324273aa990eMike Lockwood "Exceeded maximum number of wifi locks"); 1860617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 1861617750604c69e6068f68266d0e30324273aa990eMike Lockwood mActiveLockCount++; 1862617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ignore) { 18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeld = true; 18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unlocks the Wi-Fi radio, allowing it to turn off when the device is idle. 18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this WifiLock is reference-counted, each call to {@code release} will decrement the 18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * reference count, and the radio will be unlocked only when the reference count reaches 18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * zero. If the reference count goes below zero (that is, if {@code release} is called 18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a greater number of times than {@link #acquire}), an exception is thrown. 18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this WifiLock is not reference-counted, the first call to {@code release} (after 18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the radio was locked using {@link #acquire}) will unlock the radio, and subsequent 18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * calls will be ignored. 18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void release() { 18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mBinder) { 18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRefCounted ? (--mRefCount == 0) : (mHeld)) { 18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.releaseWifiLock(mBinder); 1887617750604c69e6068f68266d0e30324273aa990eMike Lockwood synchronized (WifiManager.this) { 1888617750604c69e6068f68266d0e30324273aa990eMike Lockwood mActiveLockCount--; 1889617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ignore) { 18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeld = false; 18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRefCount < 0) { 18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("WifiLock under-locked " + mTag); 18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Controls whether this is a reference-counted or non-reference-counted WifiLock. 19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reference-counted WifiLocks keep track of the number of calls to {@link #acquire} and 19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #release}, and only allow the radio to sleep when every call to {@link #acquire} 19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * has been balanced with a call to {@link #release}. Non-reference-counted WifiLocks 19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * lock the radio whenever {@link #acquire} is called and it is unlocked, and unlock the 19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * radio whenever {@link #release} is called and it is locked. 19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param refCounted true if this WifiLock should keep a reference count 19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setReferenceCounted(boolean refCounted) { 19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRefCounted = refCounted; 19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Checks whether this WifiLock is currently held. 19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if this WifiLock is held, false otherwise 19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isHeld() { 19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mBinder) { 19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mHeld; 19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19267e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void setWorkSource(WorkSource ws) { 19277e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mBinder) { 19287e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (ws != null && ws.size() == 0) { 19297e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn ws = null; 19307e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 19317e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn boolean changed = true; 19327e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (ws == null) { 19337e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mWorkSource = null; 19347e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } else { 1935a31510e47a0f0c2525702c2f10a85064322a28f2David Christie ws.clearNames(); 1936a31510e47a0f0c2525702c2f10a85064322a28f2David Christie if (mWorkSource == null) { 1937a31510e47a0f0c2525702c2f10a85064322a28f2David Christie changed = mWorkSource != null; 1938a31510e47a0f0c2525702c2f10a85064322a28f2David Christie mWorkSource = new WorkSource(ws); 1939a31510e47a0f0c2525702c2f10a85064322a28f2David Christie } else { 1940a31510e47a0f0c2525702c2f10a85064322a28f2David Christie changed = mWorkSource.diff(ws); 1941a31510e47a0f0c2525702c2f10a85064322a28f2David Christie if (changed) { 1942a31510e47a0f0c2525702c2f10a85064322a28f2David Christie mWorkSource.set(ws); 1943a31510e47a0f0c2525702c2f10a85064322a28f2David Christie } 19447e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 19457e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 19467e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (changed && mHeld) { 19477e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn try { 19487e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mService.updateWifiLockWorkSource(mBinder, mWorkSource); 19497e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } catch (RemoteException e) { 19507e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 19517e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 19527e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 19537e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 19547e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String s1, s2, s3; 19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mBinder) { 19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s1 = Integer.toHexString(System.identityHashCode(this)); 19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s2 = mHeld ? "held; " : ""; 19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRefCounted) { 19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s3 = "refcounted: refcount = " + mRefCount; 19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s3 = "not refcounted"; 19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "WifiLock{ " + s1 + "; " + s2 + s3 + " }"; 19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void finalize() throws Throwable { 19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.finalize(); 19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mBinder) { 19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mHeld) { 19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.releaseWifiLock(mBinder); 1976617750604c69e6068f68266d0e30324273aa990eMike Lockwood synchronized (WifiManager.this) { 1977617750604c69e6068f68266d0e30324273aa990eMike Lockwood mActiveLockCount--; 1978617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ignore) { 19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates a new WifiLock. 19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19895876a4273e67271f0eca607af9520f7e5abbe4f3Irfan Sheriff * @param lockType the type of lock to create. See {@link #WIFI_MODE_FULL}, 1990652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * {@link #WIFI_MODE_FULL_HIGH_PERF} and {@link #WIFI_MODE_SCAN_ONLY} for 1991652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * descriptions of the types of Wi-Fi locks. 1992652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * @param tag a tag for the WifiLock to identify it in debugging messages. This string is 1993652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * never shown to the user under normal conditions, but should be descriptive 19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * enough to identify your application and the specific WifiLock within it, if it 19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * holds multiple WifiLocks. 19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a new, unacquired WifiLock with the given tag. 19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see WifiLock 20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public WifiLock createWifiLock(int lockType, String tag) { 20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new WifiLock(lockType, tag); 20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2004652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff 20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates a new WifiLock. 20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param tag a tag for the WifiLock to identify it in debugging messages. This string is 20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * never shown to the user under normal conditions, but should be descriptive 20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * enough to identify your application and the specific WifiLock within it, if it 20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * holds multiple WifiLocks. 20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a new, unacquired WifiLock with the given tag. 20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see WifiLock 20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public WifiLock createWifiLock(String tag) { 20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new WifiLock(WIFI_MODE_FULL, tag); 20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20205347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 2021fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 20225347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt /** 2023fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Create a new MulticastLock 20245347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt * 2025fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * @param tag a tag for the MulticastLock to identify it in debugging 202641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * messages. This string is never shown to the user under 202741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * normal conditions, but should be descriptive enough to 202841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * identify your application and the specific MulticastLock 202941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * within it, if it holds multiple MulticastLocks. 20305347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt * 2031fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * @return a new, unacquired MulticastLock with the given tag. 2032fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 2033fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * @see MulticastLock 20345347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt */ 2035fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public MulticastLock createMulticastLock(String tag) { 2036fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt return new MulticastLock(tag); 20375347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 20385347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 20395347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt /** 2040fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Allows an application to receive Wifi Multicast packets. 2041fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Normally the Wifi stack filters out packets not explicitly 2042fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * addressed to this device. Acquring a MulticastLock will 2043fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * cause the stack to receive packets addressed to multicast 2044fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * addresses. Processing these extra packets can cause a noticable 204541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * battery drain and should be disabled when not needed. 20465347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt */ 2047fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public class MulticastLock { 2048fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt private String mTag; 2049fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt private final IBinder mBinder; 205041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt private int mRefCount; 205141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt private boolean mRefCounted; 2052fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt private boolean mHeld; 2053fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 2054fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt private MulticastLock(String tag) { 2055fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt mTag = tag; 2056fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt mBinder = new Binder(); 205741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt mRefCount = 0; 205841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt mRefCounted = true; 2059fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt mHeld = false; 2060fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2061fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 2062fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt /** 2063fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Locks Wifi Multicast on until {@link #release} is called. 2064fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 206541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * If this MulticastLock is reference-counted each call to 206641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * {@code acquire} will increment the reference count, and the 206741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * wifi interface will receive multicast packets as long as the 206841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * reference count is above zero. 206941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * 207041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * If this MulticastLock is not reference-counted, the first call to 207141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * {@code acquire} will turn on the multicast packets, but subsequent 207241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * calls will be ignored. Only one call to {@link #release} will 207341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * be required, regardless of the number of times that {@code acquire} 207441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * is called. 2075fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 2076fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Note that other applications may also lock Wifi Multicast on. 2077fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Only they can relinquish their lock. 2078fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 2079fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Also note that applications cannot leave Multicast locked on. 2080fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * When an app exits or crashes, any Multicast locks will be released. 2081fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt */ 2082fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public void acquire() { 2083fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt synchronized (mBinder) { 20842c02da2bc62c4dfef684ea381be02a4e568b73d0Irfan Sheriff if (mRefCounted ? (++mRefCount == 1) : (!mHeld)) { 2085fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt try { 2086fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt mService.acquireMulticastLock(mBinder, mTag); 2087617750604c69e6068f68266d0e30324273aa990eMike Lockwood synchronized (WifiManager.this) { 2088617750604c69e6068f68266d0e30324273aa990eMike Lockwood if (mActiveLockCount >= MAX_ACTIVE_LOCKS) { 2089617750604c69e6068f68266d0e30324273aa990eMike Lockwood mService.releaseMulticastLock(); 2090617750604c69e6068f68266d0e30324273aa990eMike Lockwood throw new UnsupportedOperationException( 2091617750604c69e6068f68266d0e30324273aa990eMike Lockwood "Exceeded maximum number of wifi locks"); 2092617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 2093617750604c69e6068f68266d0e30324273aa990eMike Lockwood mActiveLockCount++; 2094617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 2095fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } catch (RemoteException ignore) { 2096fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 209741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt mHeld = true; 2098fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2099fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2100fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2101fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 2102fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt /** 2103fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Unlocks Wifi Multicast, restoring the filter of packets 2104fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * not addressed specifically to this device and saving power. 2105fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 210641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * If this MulticastLock is reference-counted, each call to 210741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * {@code release} will decrement the reference count, and the 210841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * multicast packets will only stop being received when the reference 210941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * count reaches zero. If the reference count goes below zero (that 211041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * is, if {@code release} is called a greater number of times than 211141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * {@link #acquire}), an exception is thrown. 211241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * 211341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * If this MulticastLock is not reference-counted, the first call to 211441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * {@code release} (after the radio was multicast locked using 21154a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn * {@link #acquire}) will unlock the multicast, and subsequent calls 211641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * will be ignored. 211741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * 2118fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Note that if any other Wifi Multicast Locks are still outstanding 2119fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * this {@code release} call will not have an immediate effect. Only 2120fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * when all applications have released all their Multicast Locks will 2121fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * the Multicast filter be turned back on. 2122fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 2123fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Also note that when an app exits or crashes all of its Multicast 2124fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Locks will be automatically released. 2125fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt */ 2126fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public void release() { 2127fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt synchronized (mBinder) { 212841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt if (mRefCounted ? (--mRefCount == 0) : (mHeld)) { 2129fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt try { 2130fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt mService.releaseMulticastLock(); 2131617750604c69e6068f68266d0e30324273aa990eMike Lockwood synchronized (WifiManager.this) { 2132617750604c69e6068f68266d0e30324273aa990eMike Lockwood mActiveLockCount--; 2133617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 2134fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } catch (RemoteException ignore) { 2135fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 213641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt mHeld = false; 213741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt } 213841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt if (mRefCount < 0) { 213941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt throw new RuntimeException("MulticastLock under-locked " 214041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt + mTag); 2141fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2142fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2143fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2144fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 2145fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt /** 214641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * Controls whether this is a reference-counted or non-reference- 214741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * counted MulticastLock. 214841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * 214941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * Reference-counted MulticastLocks keep track of the number of calls 215041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * to {@link #acquire} and {@link #release}, and only stop the 215141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * reception of multicast packets when every call to {@link #acquire} 215241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * has been balanced with a call to {@link #release}. Non-reference- 215341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * counted MulticastLocks allow the reception of multicast packets 215441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * whenever {@link #acquire} is called and stop accepting multicast 215541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * packets whenever {@link #release} is called. 215641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * 215741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * @param refCounted true if this MulticastLock should keep a reference 215841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * count 215941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt */ 216041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt public void setReferenceCounted(boolean refCounted) { 216141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt mRefCounted = refCounted; 216241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt } 216341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt 216441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt /** 2165fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Checks whether this MulticastLock is currently held. 2166fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 2167fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * @return true if this MulticastLock is held, false otherwise 2168fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt */ 2169fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public boolean isHeld() { 2170fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt synchronized (mBinder) { 2171fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt return mHeld; 2172fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2173fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2174fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 2175fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public String toString() { 217641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt String s1, s2, s3; 2177fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt synchronized (mBinder) { 2178fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt s1 = Integer.toHexString(System.identityHashCode(this)); 2179fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt s2 = mHeld ? "held; " : ""; 218041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt if (mRefCounted) { 218141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt s3 = "refcounted: refcount = " + mRefCount; 218241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt } else { 218341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt s3 = "not refcounted"; 218441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt } 218541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt return "MulticastLock{ " + s1 + "; " + s2 + s3 + " }"; 2186fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2187fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2188fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 2189fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt @Override 2190fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt protected void finalize() throws Throwable { 2191fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt super.finalize(); 219241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt setReferenceCounted(false); 2193fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt release(); 21945347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 21955347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 21965347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 21975347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt /** 2198fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Check multicast filter status. 21995347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt * 2200fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * @return true if multicast packets are allowed. 22015347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt * 22025347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt * @hide pending API council approval 22035347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt */ 2204fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public boolean isMulticastEnabled() { 22055347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt try { 2206fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt return mService.isMulticastEnabled(); 22075347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } catch (RemoteException e) { 22085347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt return false; 22095347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 22105347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 2211e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt 2212e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt /** 2213e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt * Initialize the multicast filtering to 'on' 2214e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt * @hide no intent to publish 2215e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt */ 2216e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt public boolean initializeMulticastFiltering() { 2217e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt try { 2218e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt mService.initializeMulticastFiltering(); 2219e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt return true; 2220e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt } catch (RemoteException e) { 2221e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt return false; 2222e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt } 2223e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt } 2224da6da0907b28d4704aabbdb1bbeb4300954670d1Irfan Sheriff 2225fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff protected void finalize() throws Throwable { 2226fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff try { 2227cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff synchronized (sThreadRefLock) { 2228302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff if (--sThreadRefCount == 0 && sAsyncChannel != null) { 2229302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.disconnect(); 2230cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff } 2231939caef712f306a1c80ea27e9f41ef6e3ea9e0f1Irfan Sheriff } 2232fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff } finally { 2233fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff super.finalize(); 2234fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff } 2235fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff } 22365fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle 22375fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle /** 22385fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle * Set wifi verbose log. Called from developer settings. 22395fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle * @hide 22405fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle */ 22415fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle public void enableVerboseLogging (int verbose) { 22425fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle try { 22435fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle mService.enableVerboseLogging(verbose); 2244f5af4a972598611c46d4bf169919e23b7375a5a9vandwalle } catch (Exception e) { 2245f5af4a972598611c46d4bf169919e23b7375a5a9vandwalle //ignore any failure here 2246f5af4a972598611c46d4bf169919e23b7375a5a9vandwalle Log.e(TAG, "enableVerboseLogging " + e.toString()); 22475fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } 22485fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } 22495fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle 22505fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle /** 22515fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle * Get the WiFi verbose logging level.This is used by settings 22525fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle * to decide what to show within the picker. 22535fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle * @hide 22545fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle */ 22555fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle public int getVerboseLoggingLevel() { 22565fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle try { 22575fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle return mService.getVerboseLoggingLevel(); 22585fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } catch (RemoteException e) { 22595fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle return 0; 22605fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } 22615fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } 2262d524c78d9358e2fa1e67124468cffa5284870c62vandwalle 2263d524c78d9358e2fa1e67124468cffa5284870c62vandwalle /** 2264d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * Set wifi Aggressive Handover. Called from developer settings. 2265d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * @hide 2266d524c78d9358e2fa1e67124468cffa5284870c62vandwalle */ 2267d524c78d9358e2fa1e67124468cffa5284870c62vandwalle public void enableAggressiveHandover(int enabled) { 2268d524c78d9358e2fa1e67124468cffa5284870c62vandwalle try { 2269d524c78d9358e2fa1e67124468cffa5284870c62vandwalle mService.enableAggressiveHandover(enabled); 2270d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } catch (RemoteException e) { 2271d524c78d9358e2fa1e67124468cffa5284870c62vandwalle 2272d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 2273d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 2274d524c78d9358e2fa1e67124468cffa5284870c62vandwalle 2275d524c78d9358e2fa1e67124468cffa5284870c62vandwalle /** 2276d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * Get the WiFi Handover aggressiveness.This is used by settings 2277d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * to decide what to show within the picker. 2278d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * @hide 2279d524c78d9358e2fa1e67124468cffa5284870c62vandwalle */ 2280d524c78d9358e2fa1e67124468cffa5284870c62vandwalle public int getAggressiveHandover() { 2281d524c78d9358e2fa1e67124468cffa5284870c62vandwalle try { 2282d524c78d9358e2fa1e67124468cffa5284870c62vandwalle return mService.getAggressiveHandover(); 2283d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } catch (RemoteException e) { 2284d524c78d9358e2fa1e67124468cffa5284870c62vandwalle return 0; 2285d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 2286d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 2287d524c78d9358e2fa1e67124468cffa5284870c62vandwalle 2288d524c78d9358e2fa1e67124468cffa5284870c62vandwalle /** 2289d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * Set setting for allowing Scans when traffic is ongoing. 2290d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * @hide 2291d524c78d9358e2fa1e67124468cffa5284870c62vandwalle */ 2292d524c78d9358e2fa1e67124468cffa5284870c62vandwalle public void setAllowScansWithTraffic(int enabled) { 2293d524c78d9358e2fa1e67124468cffa5284870c62vandwalle try { 2294d524c78d9358e2fa1e67124468cffa5284870c62vandwalle mService.setAllowScansWithTraffic(enabled); 2295d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } catch (RemoteException e) { 2296d524c78d9358e2fa1e67124468cffa5284870c62vandwalle 2297d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 2298d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 2299d524c78d9358e2fa1e67124468cffa5284870c62vandwalle 2300d524c78d9358e2fa1e67124468cffa5284870c62vandwalle /** 2301d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * Get setting for allowing Scans when traffic is ongoing. 2302d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * @hide 2303d524c78d9358e2fa1e67124468cffa5284870c62vandwalle */ 2304d524c78d9358e2fa1e67124468cffa5284870c62vandwalle public int getAllowScansWithTraffic() { 2305d524c78d9358e2fa1e67124468cffa5284870c62vandwalle try { 2306d524c78d9358e2fa1e67124468cffa5284870c62vandwalle return mService.getAllowScansWithTraffic(); 2307d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } catch (RemoteException e) { 2308d524c78d9358e2fa1e67124468cffa5284870c62vandwalle return 0; 2309d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 2310d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 2311651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff} 2312