WifiManager.java revision f9cb86aebe9647e0fe0137fc198ba16c017445c6
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 * @hide 1417d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 141886a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int ERROR = 0; 1419d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1420d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 1421d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Passed with {@link ActionListener#onFailure}. 1422d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Indicates that the operation is already in progress 1423d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @hide 1424d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 142586a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int IN_PROGRESS = 1; 1426d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1427d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 1428d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Passed with {@link ActionListener#onFailure}. 1429d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Indicates that the operation failed because the framework is busy and 1430d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * unable to service the request 1431d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @hide 1432d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 143386a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int BUSY = 2; 1434d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1435d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /* WPS specific errors */ 1436d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** WPS overlap detected {@hide} */ 143786a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int WPS_OVERLAP_ERROR = 3; 143886a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff /** WEP on WPS is prohibited {@hide} */ 143986a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int WPS_WEP_PROHIBITED = 4; 144086a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff /** TKIP only prohibited {@hide} */ 144186a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int WPS_TKIP_ONLY_PROHIBITED = 5; 144286a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff /** Authentication failure on WPS {@hide} */ 144386a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int WPS_AUTH_FAILURE = 6; 144486a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff /** WPS timed out {@hide} */ 144586a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int WPS_TIMED_OUT = 7; 1446d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 144710652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde /** 144810652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde * Passed with {@link ActionListener#onFailure}. 144910652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde * Indicates that the operation failed due to invalid inputs 145010652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde * @hide 145110652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde */ 145210652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde public static final int INVALID_ARGS = 8; 145310652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde 1454d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** Interface for callback invocation on an application action {@hide} */ 1455d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public interface ActionListener { 1456d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** The operation succeeded */ 1457d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public void onSuccess(); 1458d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 1459d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * The operation failed 1460d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param reason The reason for failure could be one of 1461d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * {@link #ERROR}, {@link #IN_PROGRESS} or {@link #BUSY} 1462d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 1463d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public void onFailure(int reason); 1464d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1465d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1466d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** Interface for callback invocation on a start WPS action {@hide} */ 1467d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public interface WpsListener { 1468d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** WPS start succeeded */ 1469d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public void onStartSuccess(String pin); 1470d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1471d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** WPS operation completed succesfully */ 1472d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public void onCompletion(); 1473d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1474d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 1475d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * WPS operation failed 1476d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param reason The reason for failure could be one of 1477d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * {@link #IN_PROGRESS}, {@link #WPS_OVERLAP_ERROR},{@link #ERROR} or {@link #BUSY} 1478d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 1479d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public void onFailure(int reason); 1480d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1481d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1482f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** Interface for callback invocation on a TX packet count poll action {@hide} */ 1483f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public interface TxPacketCountListener { 1484f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** 1485f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * The operation succeeded 1486f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * @param count TX packet counter 1487f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng */ 1488f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public void onSuccess(int count); 1489f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** 1490f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * The operation failed 1491f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * @param reason The reason for failure could be one of 1492f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * {@link #ERROR}, {@link #IN_PROGRESS} or {@link #BUSY} 1493f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng */ 1494f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public void onFailure(int reason); 1495f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng } 1496f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng 1497302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static class ServiceHandler extends Handler { 149888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff ServiceHandler(Looper looper) { 149988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff super(looper); 1500d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1501d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 150288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff @Override 150388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void handleMessage(Message message) { 150488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff Object listener = removeListener(message.arg2); 150588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff switch (message.what) { 150688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED: 150788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (message.arg1 == AsyncChannel.STATUS_SUCCESSFUL) { 1508302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(AsyncChannel.CMD_CHANNEL_FULL_CONNECTION); 150988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } else { 151088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff Log.e(TAG, "Failed to set up channel connection"); 151188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff // This will cause all further async API calls on the WifiManager 151288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff // to fail and throw an exception 1513302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel = null; 151488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 1515302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sConnected.countDown(); 151688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 151788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED: 151888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff // Ignore 151988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 152088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case AsyncChannel.CMD_CHANNEL_DISCONNECTED: 152188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff Log.e(TAG, "Channel connection lost"); 152288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff // This will cause all further async API calls on the WifiManager 152388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff // to fail and throw an exception 1524302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel = null; 1525fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff getLooper().quit(); 152688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 152788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff /* ActionListeners grouped together */ 152888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.CONNECT_NETWORK_FAILED: 152988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.FORGET_NETWORK_FAILED: 153088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.SAVE_NETWORK_FAILED: 153188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.CANCEL_WPS_FAILED: 153288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.DISABLE_NETWORK_FAILED: 153388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener != null) { 153488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff ((ActionListener) listener).onFailure(message.arg1); 153588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 153688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 153788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff /* ActionListeners grouped together */ 153888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.CONNECT_NETWORK_SUCCEEDED: 153988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.FORGET_NETWORK_SUCCEEDED: 154088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.SAVE_NETWORK_SUCCEEDED: 154188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.CANCEL_WPS_SUCCEDED: 154288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.DISABLE_NETWORK_SUCCEEDED: 154388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener != null) { 154488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff ((ActionListener) listener).onSuccess(); 154588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 154688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 154788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.START_WPS_SUCCEEDED: 154888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener != null) { 154988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff WpsResult result = (WpsResult) message.obj; 155088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff ((WpsListener) listener).onStartSuccess(result.pin); 155188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff //Listener needs to stay until completion or failure 1552302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff synchronized(sListenerMapLock) { 1553302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sListenerMap.put(message.arg2, listener); 1554d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 155588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 155688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 155788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.WPS_COMPLETED: 155888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener != null) { 155988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff ((WpsListener) listener).onCompletion(); 156088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 156188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 156288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.WPS_FAILED: 156388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener != null) { 156488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff ((WpsListener) listener).onFailure(message.arg1); 156588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 1566f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng break; 1567f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng case WifiManager.RSSI_PKTCNT_FETCH_SUCCEEDED: 1568f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng if (listener != null) { 1569f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng RssiPacketCountInfo info = (RssiPacketCountInfo) message.obj; 1570f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng if (info != null) 1571f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng ((TxPacketCountListener) listener).onSuccess(info.txgood + info.txbad); 1572f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng else 1573f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng ((TxPacketCountListener) listener).onFailure(ERROR); 1574f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng } 1575f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng break; 1576f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng case WifiManager.RSSI_PKTCNT_FETCH_FAILED: 1577f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng if (listener != null) { 1578f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng ((TxPacketCountListener) listener).onFailure(message.arg1); 1579f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng } 158088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 158188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff default: 158288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff //ignore 158388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 1584d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1585d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 158688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 1587d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1588302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static int putListener(Object listener) { 158988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener == null) return INVALID_KEY; 159088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff int key; 1591302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff synchronized (sListenerMapLock) { 159288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff do { 1593302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff key = sListenerKey++; 159488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } while (key == INVALID_KEY); 1595302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sListenerMap.put(key, listener); 1596d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 159788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff return key; 159888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 1599d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1600302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff private static Object removeListener(int key) { 160188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (key == INVALID_KEY) return null; 1602302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff synchronized (sListenerMapLock) { 1603302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff Object listener = sListenerMap.get(key); 1604302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sListenerMap.remove(key); 160588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff return listener; 1606d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1607d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1608ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 160988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff private void init() { 1610cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff synchronized (sThreadRefLock) { 1611cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff if (++sThreadRefCount == 1) { 1612302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff Messenger messenger = getWifiServiceMessenger(); 1613302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff if (messenger == null) { 1614302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel = null; 1615302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff return; 1616302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff } 1617302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff 1618cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff sHandlerThread = new HandlerThread("WifiManager"); 1619302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel = new AsyncChannel(); 1620302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sConnected = new CountDownLatch(1); 1621302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff 1622cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff sHandlerThread.start(); 1623302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff Handler handler = new ServiceHandler(sHandlerThread.getLooper()); 1624302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.connect(mContext, handler, messenger); 1625302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff try { 1626302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sConnected.await(); 1627302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff } catch (InterruptedException e) { 1628302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff Log.e(TAG, "interrupted wait at init"); 1629302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff } 1630cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff } 1631cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff } 1632d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1633ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 163488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff private void validateChannel() { 1635302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff if (sAsyncChannel == null) throw new IllegalStateException( 163635bbe27d58ccf01ffd170b0f617a568bc843a49eIrfan Sheriff "No permission to access and change wifi or a bad initialization"); 163788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 163888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff 1639e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff /** 1640e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * Connect to a network with the given configuration. The network also 1641e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * gets added to the supplicant configuration. 1642e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 1643e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * For a new network, this function is used instead of a 1644e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * sequence of addNetwork(), enableNetwork(), saveConfiguration() and 1645e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * reconnect() 1646e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 1647e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @param config the set of variables that describe the configuration, 1648e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * contained in a {@link WifiConfiguration} object. 1649d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 165088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 165188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 165288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * 1653e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @hide 1654e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff */ 165588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void connect(WifiConfiguration config, ActionListener listener) { 1656d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (config == null) throw new IllegalArgumentException("config cannot be null"); 165788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 1658ab26407124cf861eacfe7bf0f2a1ef25f4b3a7bdIrfan Sheriff // Use INVALID_NETWORK_ID for arg1 when passing a config object 1659ab26407124cf861eacfe7bf0f2a1ef25f4b3a7bdIrfan Sheriff // arg1 is used to pass network id when the network already exists 1660302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(CONNECT_NETWORK, WifiConfiguration.INVALID_NETWORK_ID, 166188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff putListener(listener), config); 1662e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff } 1663e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff 1664e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff /** 1665e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * Connect to a network with the given networkId. 1666e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 1667e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * This function is used instead of a enableNetwork(), saveConfiguration() and 1668e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * reconnect() 1669e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 1670e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @param networkId the network id identifiying the network in the 1671e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * supplicant configuration list 1672d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 167388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 167488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 1675e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @hide 1676e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff */ 167788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void connect(int networkId, ActionListener listener) { 1678d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (networkId < 0) throw new IllegalArgumentException("Network id cannot be negative"); 167988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 1680302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(CONNECT_NETWORK, networkId, putListener(listener)); 1681e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff } 1682e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff 1683e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff /** 1684e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * Save the given network in the supplicant config. If the network already 1685e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * exists, the configuration is updated. A new network is enabled 1686e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * by default. 1687e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 1688e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * For a new network, this function is used instead of a 1689e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * sequence of addNetwork(), enableNetwork() and saveConfiguration(). 1690e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 1691e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * For an existing network, it accomplishes the task of updateNetwork() 1692e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * and saveConfiguration() 1693e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 1694e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @param config the set of variables that describe the configuration, 1695e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * contained in a {@link WifiConfiguration} object. 1696d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 169788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 169888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 1699e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @hide 1700e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff */ 170188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void save(WifiConfiguration config, ActionListener listener) { 1702d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (config == null) throw new IllegalArgumentException("config cannot be null"); 170388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 1704302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(SAVE_NETWORK, 0, putListener(listener), config); 1705e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff } 1706e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff 1707e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff /** 1708e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * Delete the network in the supplicant config. 1709e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 1710e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * This function is used instead of a sequence of removeNetwork() 1711e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * and saveConfiguration(). 1712e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 1713e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @param config the set of variables that describe the configuration, 1714e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * contained in a {@link WifiConfiguration} object. 1715d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 171688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 171788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 1718e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @hide 1719e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff */ 172088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void forget(int netId, ActionListener listener) { 1721d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (netId < 0) throw new IllegalArgumentException("Network id cannot be negative"); 172288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 1723302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(FORGET_NETWORK, netId, putListener(listener)); 1724d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 1725d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 1726d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 1727d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Disable network 1728d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * 1729d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param netId is the network Id 1730d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 173188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 173288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 1733d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @hide 1734d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 173588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void disable(int netId, ActionListener listener) { 1736d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (netId < 0) throw new IllegalArgumentException("Network id cannot be negative"); 173788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 1738302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(DISABLE_NETWORK, netId, putListener(listener)); 1739e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff } 1740e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff 174117b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff /** 174202fb46a297c4f645f2a30b574151401dd0978521Irfan Sheriff * Start Wi-fi Protected Setup 17435ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff * 174402fb46a297c4f645f2a30b574151401dd0978521Irfan Sheriff * @param config WPS configuration 1745d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 174688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 174788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 17485ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff * @hide 17495ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff */ 175088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void startWps(WpsInfo config, WpsListener listener) { 1751d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (config == null) throw new IllegalArgumentException("config cannot be null"); 175288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 1753302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(START_WPS, 0, putListener(listener), config); 1754f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff } 1755f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff 1756f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff /** 175786a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff * Cancel any ongoing Wi-fi Protected Setup 175886a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff * 175986a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff * @param listener for callbacks on success or failure. Can be null. 176088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 176188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 176286a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff * @hide 176386a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff */ 176488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void cancelWps(ActionListener listener) { 176588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff validateChannel(); 1766302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.sendMessage(CANCEL_WPS, 0, putListener(listener)); 176786a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff } 176886a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff 176986a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff /** 1770227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * Get a reference to WifiService handler. This is used by a client to establish 1771227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * an AsyncChannel communication with WifiService 1772227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 1773227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * @return Messenger pointing to the WifiService handler 1774227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * @hide 1775227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff */ 177607573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff public Messenger getWifiServiceMessenger() { 1777227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff try { 177807573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff return mService.getWifiServiceMessenger(); 1779227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff } catch (RemoteException e) { 1780227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff return null; 178135bbe27d58ccf01ffd170b0f617a568bc843a49eIrfan Sheriff } catch (SecurityException e) { 178235bbe27d58ccf01ffd170b0f617a568bc843a49eIrfan Sheriff return null; 1783227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff } 1784227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff } 1785227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 1786227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff /** 178707573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff * Get a reference to WifiStateMachine handler. 178807573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff * @return Messenger pointing to the WifiService handler 178907573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff * @hide 179007573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff */ 179107573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff public Messenger getWifiStateMachineMessenger() { 179207573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff try { 179307573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff return mService.getWifiStateMachineMessenger(); 179407573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff } catch (RemoteException e) { 179507573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff return null; 179607573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff } 179707573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff } 179807573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff 179907573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff /** 18004aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff * Returns the file in which IP and proxy configuration data is stored 18014aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff * @hide 18024aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff */ 18034aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff public String getConfigFile() { 18044aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff try { 18054aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff return mService.getConfigFile(); 18064aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff } catch (RemoteException e) { 18074aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff return null; 18084aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff } 18094aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff } 18104aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff 18114aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff /** 18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Allows an application to keep the Wi-Fi radio awake. 18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Normally the Wi-Fi radio may turn off when the user has not used the device in a while. 1814227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * Acquiring a WifiLock will keep the radio on until the lock is released. Multiple 18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * applications may hold WifiLocks, and the radio will only be allowed to turn off when no 18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WifiLocks are held in any application. 1817d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * <p> 18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Before using a WifiLock, consider carefully if your application requires Wi-Fi access, or 18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * could function over a mobile network, if available. A program that needs to download large 18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * files should hold a WifiLock to ensure that the download will complete, but a program whose 18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * network usage is occasional or low-bandwidth should not hold a WifiLock to avoid adversely 18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * affecting battery life. 1823d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * <p> 18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Note that WifiLocks cannot override the user-level "Wi-Fi Enabled" setting, nor Airplane 18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Mode. They simply keep the radio from turning off when Wi-Fi is already on but the device 18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is idle. 1827d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * <p> 1828d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * Any application using a WifiLock must request the {@code android.permission.WAKE_LOCK} 1829d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * permission in an {@code <uses-permission>} element of the application's manifest. 18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public class WifiLock { 18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mTag; 18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final IBinder mBinder; 18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mRefCount; 18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLockType; 18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mRefCounted; 18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mHeld; 18387e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn private WorkSource mWorkSource; 18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private WifiLock(int lockType, String tag) { 18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTag = tag; 18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLockType = lockType; 18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBinder = new Binder(); 18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRefCount = 0; 18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRefCounted = true; 18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeld = false; 18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Locks the Wi-Fi radio on until {@link #release} is called. 18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this WifiLock is reference-counted, each call to {@code acquire} will increment the 1853227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * reference count, and the radio will remain locked as long as the reference count is 18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * above zero. 18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this WifiLock is not reference-counted, the first call to {@code acquire} will lock 18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the radio, but subsequent calls will be ignored. Only one call to {@link #release} 18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be required, regardless of the number of times that {@code acquire} is called. 18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void acquire() { 18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mBinder) { 18622c02da2bc62c4dfef684ea381be02a4e568b73d0Irfan Sheriff if (mRefCounted ? (++mRefCount == 1) : (!mHeld)) { 18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 18647e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mService.acquireWifiLock(mBinder, mLockType, mTag, mWorkSource); 1865617750604c69e6068f68266d0e30324273aa990eMike Lockwood synchronized (WifiManager.this) { 1866617750604c69e6068f68266d0e30324273aa990eMike Lockwood if (mActiveLockCount >= MAX_ACTIVE_LOCKS) { 1867617750604c69e6068f68266d0e30324273aa990eMike Lockwood mService.releaseWifiLock(mBinder); 1868617750604c69e6068f68266d0e30324273aa990eMike Lockwood throw new UnsupportedOperationException( 1869617750604c69e6068f68266d0e30324273aa990eMike Lockwood "Exceeded maximum number of wifi locks"); 1870617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 1871617750604c69e6068f68266d0e30324273aa990eMike Lockwood mActiveLockCount++; 1872617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ignore) { 18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeld = true; 18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unlocks the Wi-Fi radio, allowing it to turn off when the device is idle. 18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this WifiLock is reference-counted, each call to {@code release} will decrement the 18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * reference count, and the radio will be unlocked only when the reference count reaches 18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * zero. If the reference count goes below zero (that is, if {@code release} is called 18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a greater number of times than {@link #acquire}), an exception is thrown. 18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this WifiLock is not reference-counted, the first call to {@code release} (after 18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the radio was locked using {@link #acquire}) will unlock the radio, and subsequent 18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * calls will be ignored. 18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void release() { 18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mBinder) { 18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRefCounted ? (--mRefCount == 0) : (mHeld)) { 18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.releaseWifiLock(mBinder); 1897617750604c69e6068f68266d0e30324273aa990eMike Lockwood synchronized (WifiManager.this) { 1898617750604c69e6068f68266d0e30324273aa990eMike Lockwood mActiveLockCount--; 1899617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ignore) { 19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeld = false; 19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRefCount < 0) { 19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("WifiLock under-locked " + mTag); 19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Controls whether this is a reference-counted or non-reference-counted WifiLock. 19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reference-counted WifiLocks keep track of the number of calls to {@link #acquire} and 19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #release}, and only allow the radio to sleep when every call to {@link #acquire} 19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * has been balanced with a call to {@link #release}. Non-reference-counted WifiLocks 19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * lock the radio whenever {@link #acquire} is called and it is unlocked, and unlock the 19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * radio whenever {@link #release} is called and it is locked. 19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param refCounted true if this WifiLock should keep a reference count 19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setReferenceCounted(boolean refCounted) { 19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRefCounted = refCounted; 19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Checks whether this WifiLock is currently held. 19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if this WifiLock is held, false otherwise 19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isHeld() { 19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mBinder) { 19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mHeld; 19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19367e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void setWorkSource(WorkSource ws) { 19377e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mBinder) { 19387e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (ws != null && ws.size() == 0) { 19397e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn ws = null; 19407e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 19417e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn boolean changed = true; 19427e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (ws == null) { 19437e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mWorkSource = null; 19447e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } else { 1945a31510e47a0f0c2525702c2f10a85064322a28f2David Christie ws.clearNames(); 1946a31510e47a0f0c2525702c2f10a85064322a28f2David Christie if (mWorkSource == null) { 1947a31510e47a0f0c2525702c2f10a85064322a28f2David Christie changed = mWorkSource != null; 1948a31510e47a0f0c2525702c2f10a85064322a28f2David Christie mWorkSource = new WorkSource(ws); 1949a31510e47a0f0c2525702c2f10a85064322a28f2David Christie } else { 1950a31510e47a0f0c2525702c2f10a85064322a28f2David Christie changed = mWorkSource.diff(ws); 1951a31510e47a0f0c2525702c2f10a85064322a28f2David Christie if (changed) { 1952a31510e47a0f0c2525702c2f10a85064322a28f2David Christie mWorkSource.set(ws); 1953a31510e47a0f0c2525702c2f10a85064322a28f2David Christie } 19547e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 19557e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 19567e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (changed && mHeld) { 19577e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn try { 19587e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mService.updateWifiLockWorkSource(mBinder, mWorkSource); 19597e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } catch (RemoteException e) { 19607e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 19617e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 19627e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 19637e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 19647e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String s1, s2, s3; 19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mBinder) { 19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s1 = Integer.toHexString(System.identityHashCode(this)); 19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s2 = mHeld ? "held; " : ""; 19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRefCounted) { 19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s3 = "refcounted: refcount = " + mRefCount; 19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s3 = "not refcounted"; 19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "WifiLock{ " + s1 + "; " + s2 + s3 + " }"; 19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void finalize() throws Throwable { 19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.finalize(); 19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mBinder) { 19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mHeld) { 19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.releaseWifiLock(mBinder); 1986617750604c69e6068f68266d0e30324273aa990eMike Lockwood synchronized (WifiManager.this) { 1987617750604c69e6068f68266d0e30324273aa990eMike Lockwood mActiveLockCount--; 1988617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ignore) { 19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates a new WifiLock. 19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19995876a4273e67271f0eca607af9520f7e5abbe4f3Irfan Sheriff * @param lockType the type of lock to create. See {@link #WIFI_MODE_FULL}, 2000652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * {@link #WIFI_MODE_FULL_HIGH_PERF} and {@link #WIFI_MODE_SCAN_ONLY} for 2001652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * descriptions of the types of Wi-Fi locks. 2002652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * @param tag a tag for the WifiLock to identify it in debugging messages. This string is 2003652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * never shown to the user under normal conditions, but should be descriptive 20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * enough to identify your application and the specific WifiLock within it, if it 20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * holds multiple WifiLocks. 20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a new, unacquired WifiLock with the given tag. 20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see WifiLock 20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public WifiLock createWifiLock(int lockType, String tag) { 20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new WifiLock(lockType, tag); 20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2014652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff 20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates a new WifiLock. 20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param tag a tag for the WifiLock to identify it in debugging messages. This string is 20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * never shown to the user under normal conditions, but should be descriptive 20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * enough to identify your application and the specific WifiLock within it, if it 20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * holds multiple WifiLocks. 20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a new, unacquired WifiLock with the given tag. 20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see WifiLock 20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public WifiLock createWifiLock(String tag) { 20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new WifiLock(WIFI_MODE_FULL, tag); 20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20305347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 2031fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 20325347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt /** 2033fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Create a new MulticastLock 20345347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt * 2035fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * @param tag a tag for the MulticastLock to identify it in debugging 203641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * messages. This string is never shown to the user under 203741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * normal conditions, but should be descriptive enough to 203841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * identify your application and the specific MulticastLock 203941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * within it, if it holds multiple MulticastLocks. 20405347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt * 2041fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * @return a new, unacquired MulticastLock with the given tag. 2042fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 2043fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * @see MulticastLock 20445347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt */ 2045fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public MulticastLock createMulticastLock(String tag) { 2046fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt return new MulticastLock(tag); 20475347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 20485347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 20495347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt /** 2050fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Allows an application to receive Wifi Multicast packets. 2051fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Normally the Wifi stack filters out packets not explicitly 2052fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * addressed to this device. Acquring a MulticastLock will 2053fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * cause the stack to receive packets addressed to multicast 2054fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * addresses. Processing these extra packets can cause a noticable 205541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * battery drain and should be disabled when not needed. 20565347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt */ 2057fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public class MulticastLock { 2058fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt private String mTag; 2059fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt private final IBinder mBinder; 206041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt private int mRefCount; 206141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt private boolean mRefCounted; 2062fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt private boolean mHeld; 2063fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 2064fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt private MulticastLock(String tag) { 2065fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt mTag = tag; 2066fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt mBinder = new Binder(); 206741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt mRefCount = 0; 206841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt mRefCounted = true; 2069fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt mHeld = false; 2070fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2071fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 2072fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt /** 2073fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Locks Wifi Multicast on until {@link #release} is called. 2074fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 207541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * If this MulticastLock is reference-counted each call to 207641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * {@code acquire} will increment the reference count, and the 207741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * wifi interface will receive multicast packets as long as the 207841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * reference count is above zero. 207941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * 208041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * If this MulticastLock is not reference-counted, the first call to 208141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * {@code acquire} will turn on the multicast packets, but subsequent 208241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * calls will be ignored. Only one call to {@link #release} will 208341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * be required, regardless of the number of times that {@code acquire} 208441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * is called. 2085fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 2086fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Note that other applications may also lock Wifi Multicast on. 2087fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Only they can relinquish their lock. 2088fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 2089fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Also note that applications cannot leave Multicast locked on. 2090fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * When an app exits or crashes, any Multicast locks will be released. 2091fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt */ 2092fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public void acquire() { 2093fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt synchronized (mBinder) { 20942c02da2bc62c4dfef684ea381be02a4e568b73d0Irfan Sheriff if (mRefCounted ? (++mRefCount == 1) : (!mHeld)) { 2095fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt try { 2096fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt mService.acquireMulticastLock(mBinder, mTag); 2097617750604c69e6068f68266d0e30324273aa990eMike Lockwood synchronized (WifiManager.this) { 2098617750604c69e6068f68266d0e30324273aa990eMike Lockwood if (mActiveLockCount >= MAX_ACTIVE_LOCKS) { 2099617750604c69e6068f68266d0e30324273aa990eMike Lockwood mService.releaseMulticastLock(); 2100617750604c69e6068f68266d0e30324273aa990eMike Lockwood throw new UnsupportedOperationException( 2101617750604c69e6068f68266d0e30324273aa990eMike Lockwood "Exceeded maximum number of wifi locks"); 2102617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 2103617750604c69e6068f68266d0e30324273aa990eMike Lockwood mActiveLockCount++; 2104617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 2105fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } catch (RemoteException ignore) { 2106fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 210741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt mHeld = true; 2108fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2109fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2110fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2111fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 2112fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt /** 2113fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Unlocks Wifi Multicast, restoring the filter of packets 2114fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * not addressed specifically to this device and saving power. 2115fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 211641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * If this MulticastLock is reference-counted, each call to 211741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * {@code release} will decrement the reference count, and the 211841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * multicast packets will only stop being received when the reference 211941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * count reaches zero. If the reference count goes below zero (that 212041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * is, if {@code release} is called a greater number of times than 212141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * {@link #acquire}), an exception is thrown. 212241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * 212341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * If this MulticastLock is not reference-counted, the first call to 212441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * {@code release} (after the radio was multicast locked using 21254a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn * {@link #acquire}) will unlock the multicast, and subsequent calls 212641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * will be ignored. 212741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * 2128fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Note that if any other Wifi Multicast Locks are still outstanding 2129fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * this {@code release} call will not have an immediate effect. Only 2130fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * when all applications have released all their Multicast Locks will 2131fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * the Multicast filter be turned back on. 2132fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 2133fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Also note that when an app exits or crashes all of its Multicast 2134fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Locks will be automatically released. 2135fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt */ 2136fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public void release() { 2137fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt synchronized (mBinder) { 213841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt if (mRefCounted ? (--mRefCount == 0) : (mHeld)) { 2139fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt try { 2140fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt mService.releaseMulticastLock(); 2141617750604c69e6068f68266d0e30324273aa990eMike Lockwood synchronized (WifiManager.this) { 2142617750604c69e6068f68266d0e30324273aa990eMike Lockwood mActiveLockCount--; 2143617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 2144fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } catch (RemoteException ignore) { 2145fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 214641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt mHeld = false; 214741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt } 214841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt if (mRefCount < 0) { 214941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt throw new RuntimeException("MulticastLock under-locked " 215041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt + mTag); 2151fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2152fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2153fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2154fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 2155fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt /** 215641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * Controls whether this is a reference-counted or non-reference- 215741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * counted MulticastLock. 215841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * 215941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * Reference-counted MulticastLocks keep track of the number of calls 216041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * to {@link #acquire} and {@link #release}, and only stop the 216141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * reception of multicast packets when every call to {@link #acquire} 216241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * has been balanced with a call to {@link #release}. Non-reference- 216341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * counted MulticastLocks allow the reception of multicast packets 216441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * whenever {@link #acquire} is called and stop accepting multicast 216541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * packets whenever {@link #release} is called. 216641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * 216741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * @param refCounted true if this MulticastLock should keep a reference 216841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * count 216941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt */ 217041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt public void setReferenceCounted(boolean refCounted) { 217141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt mRefCounted = refCounted; 217241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt } 217341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt 217441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt /** 2175fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Checks whether this MulticastLock is currently held. 2176fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 2177fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * @return true if this MulticastLock is held, false otherwise 2178fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt */ 2179fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public boolean isHeld() { 2180fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt synchronized (mBinder) { 2181fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt return mHeld; 2182fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2183fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2184fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 2185fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public String toString() { 218641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt String s1, s2, s3; 2187fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt synchronized (mBinder) { 2188fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt s1 = Integer.toHexString(System.identityHashCode(this)); 2189fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt s2 = mHeld ? "held; " : ""; 219041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt if (mRefCounted) { 219141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt s3 = "refcounted: refcount = " + mRefCount; 219241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt } else { 219341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt s3 = "not refcounted"; 219441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt } 219541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt return "MulticastLock{ " + s1 + "; " + s2 + s3 + " }"; 2196fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2197fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 2198fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 2199fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt @Override 2200fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt protected void finalize() throws Throwable { 2201fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt super.finalize(); 220241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt setReferenceCounted(false); 2203fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt release(); 22045347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 22055347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 22065347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 22075347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt /** 2208fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Check multicast filter status. 22095347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt * 2210fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * @return true if multicast packets are allowed. 22115347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt * 22125347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt * @hide pending API council approval 22135347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt */ 2214fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public boolean isMulticastEnabled() { 22155347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt try { 2216fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt return mService.isMulticastEnabled(); 22175347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } catch (RemoteException e) { 22185347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt return false; 22195347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 22205347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 2221e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt 2222e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt /** 2223e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt * Initialize the multicast filtering to 'on' 2224e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt * @hide no intent to publish 2225e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt */ 2226e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt public boolean initializeMulticastFiltering() { 2227e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt try { 2228e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt mService.initializeMulticastFiltering(); 2229e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt return true; 2230e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt } catch (RemoteException e) { 2231e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt return false; 2232e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt } 2233e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt } 2234da6da0907b28d4704aabbdb1bbeb4300954670d1Irfan Sheriff 2235fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff protected void finalize() throws Throwable { 2236fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff try { 2237cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff synchronized (sThreadRefLock) { 2238302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff if (--sThreadRefCount == 0 && sAsyncChannel != null) { 2239302b06de7ea7ac97ac4a2189213a1133220bfdc8Irfan Sheriff sAsyncChannel.disconnect(); 2240cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff } 2241939caef712f306a1c80ea27e9f41ef6e3ea9e0f1Irfan Sheriff } 2242fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff } finally { 2243fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff super.finalize(); 2244fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff } 2245fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff } 2246651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff} 2247