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 1942ae52899fbbbb7ffc958be1092a383f1283d19eRebecca Silbersteinimport android.annotation.Nullable; 20d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkeyimport android.annotation.RequiresPermission; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.annotation.SdkConstant; 22d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkeyimport android.annotation.SuppressLint; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.annotation.SdkConstant.SdkConstantType; 24cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tongimport android.annotation.SystemApi; 25d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkeyimport android.annotation.SystemService; 26ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriffimport android.content.Context; 27ec19db6bd46d112167e87556e8dacdd32ef911e9zhangshuxiaoimport android.content.pm.ParceledListSlice; 281022dde719ca430f062f9e628574d70ae1320677Lorenzo Colittiimport android.net.ConnectivityManager; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.DhcpInfo; 301022dde719ca430f062f9e628574d70ae1320677Lorenzo Colittiimport android.net.Network; 311022dde719ca430f062f9e628574d70ae1320677Lorenzo Colittiimport android.net.NetworkCapabilities; 321022dde719ca430f062f9e628574d70ae1320677Lorenzo Colittiimport android.net.NetworkRequest; 33e78c25e970a4bfebbcb25e6cd1caa366e1d27c42Peter Qiuimport android.net.wifi.hotspot2.OsuProvider; 3401894d8f6b661362cab36e6a997053fd078101a2Peter Qiuimport android.net.wifi.hotspot2.PasspointConfiguration; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder; 361022dde719ca430f062f9e628574d70ae1320677Lorenzo Colittiimport android.os.Build; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler; 38a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpandeimport android.os.IBinder; 39d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriffimport android.os.Looper; 40d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriffimport android.os.Message; 41a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpandeimport android.os.Messenger; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 437e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackbornimport android.os.WorkSource; 4488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriffimport android.util.Log; 45d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriffimport android.util.SparseArray; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 47ce74fc29b0247443199671d89d6bda58bb399a13Rebecca Silbersteinimport com.android.internal.annotations.GuardedBy; 485adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silbersteinimport com.android.internal.annotations.VisibleForTesting; 49ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriffimport com.android.internal.util.AsyncChannel; 50d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriffimport com.android.internal.util.Protocol; 51531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colittiimport com.android.server.net.NetworkPinner; 52ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 535adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silbersteinimport dalvik.system.CloseGuard; 545adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein 55b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silbersteinimport java.lang.ref.WeakReference; 56a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpandeimport java.net.InetAddress; 57720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silbersteinimport java.util.Collections; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 59a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpandeimport java.util.concurrent.CountDownLatch; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class provides the primary API for managing all aspects of Wi-Fi 63d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey * connectivity. 64d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey * <p> 65d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey * On releases before {@link android.os.Build.VERSION_CODES#N}, this object 66d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey * should only be obtained from an {@linkplain Context#getApplicationContext() 67d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey * application context}, and not from any other derived context to avoid memory 68d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey * leaks within the calling process. 69d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey * <p> 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * It deals with several categories of items: 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 72d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey * <li>The list of configured networks. The list can be viewed and updated, and 73d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey * attributes of individual entries can be modified.</li> 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The currently active Wi-Fi network, if any. Connectivity can be 75d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey * established or torn down, and dynamic information about the state of the 76d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey * network can be queried.</li> 77d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey * <li>Results of access point scans, containing enough information to make 78d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey * decisions about what access point to connect to.</li> 79d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey * <li>It defines the names of various Intent actions that are broadcast upon 80d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey * any sort of change in Wi-Fi state. 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 82d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey * This is the API to use when performing Wi-Fi specific operations. To perform 83d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey * operations that pertain to network connectivity at an abstract level, use 84d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey * {@link android.net.ConnectivityManager}. 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 86d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey@SystemService(Context.WIFI_SERVICE) 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class WifiManager { 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff private static final String TAG = "WifiManager"; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Supplicant error codes: 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The error code if there was a problem authenticating. 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int ERROR_AUTHENTICATING = 1; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 977b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao * The reason code if there is no error during authentication. 987b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao * It could also imply that there no authentication in progress, 997b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao * this reason code also serves as a reset value. 1007b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao * @hide 1017b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao */ 1027b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao public static final int ERROR_AUTH_FAILURE_NONE = 0; 1037b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao 1047b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao /** 1057b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao * The reason code if there was a timeout authenticating. 1067b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao * @hide 1077b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao */ 1087b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao public static final int ERROR_AUTH_FAILURE_TIMEOUT = 1; 1097b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao 1107b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao /** 1117b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao * The reason code if there was a wrong password while 1127b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao * authenticating. 1137b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao * @hide 1147b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao */ 1157b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao public static final int ERROR_AUTH_FAILURE_WRONG_PSWD = 2; 1167b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao 1177b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao /** 1187b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao * The reason code if there was EAP failure while 1197b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao * authenticating. 1207b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao * @hide 1217b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao */ 1227b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao public static final int ERROR_AUTH_FAILURE_EAP_FAILURE = 3; 1237b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao 1247b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao /** 12589710842585404ea33f941afeb2c321e706005e9Robert Greenwalt * Broadcast intent action indicating whether Wi-Fi scanning is allowed currently 12689710842585404ea33f941afeb2c321e706005e9Robert Greenwalt * @hide 12789710842585404ea33f941afeb2c321e706005e9Robert Greenwalt */ 12889710842585404ea33f941afeb2c321e706005e9Robert Greenwalt public static final String WIFI_SCAN_AVAILABLE = "wifi_scan_available"; 12989710842585404ea33f941afeb2c321e706005e9Robert Greenwalt 13089710842585404ea33f941afeb2c321e706005e9Robert Greenwalt /** 13189710842585404ea33f941afeb2c321e706005e9Robert Greenwalt * Extra int indicating scan availability, WIFI_STATE_ENABLED and WIFI_STATE_DISABLED 13289710842585404ea33f941afeb2c321e706005e9Robert Greenwalt * @hide 13389710842585404ea33f941afeb2c321e706005e9Robert Greenwalt */ 134cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong public static final String EXTRA_SCAN_AVAILABLE = "scan_enabled"; 135cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong 136cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong /** 137cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong * Broadcast intent action indicating that the credential of a Wi-Fi network 138cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong * has been changed. One extra provides the ssid of the network. Another 139cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong * extra provides the event type, whether the credential is saved or forgot. 140cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong * @hide 141cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong */ 142cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong @SystemApi 143cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong public static final String WIFI_CREDENTIAL_CHANGED_ACTION = 144cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong "android.net.wifi.WIFI_CREDENTIAL_CHANGED"; 145cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong /** @hide */ 146cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong @SystemApi 147cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong public static final String EXTRA_WIFI_CREDENTIAL_EVENT_TYPE = "et"; 148cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong /** @hide */ 149cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong @SystemApi 150cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong public static final String EXTRA_WIFI_CREDENTIAL_SSID = "ssid"; 151cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong /** @hide */ 152cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong @SystemApi 153cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong public static final int WIFI_CREDENTIAL_SAVED = 0; 154cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong /** @hide */ 155cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong @SystemApi 156cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong public static final int WIFI_CREDENTIAL_FORGOT = 1; 15789710842585404ea33f941afeb2c321e706005e9Robert Greenwalt 15889710842585404ea33f941afeb2c321e706005e9Robert Greenwalt /** 1594f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu * Broadcast intent action indicating that a Passpoint provider icon has been received. 1604f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu * 1615679145d9a416c74a59135656802365a6b931b25Peter Qiu * Included extras: 1625679145d9a416c74a59135656802365a6b931b25Peter Qiu * {@link #EXTRA_BSSID_LONG} 163ed1fc64efda22f3defb3a174b8823756aecefffePeter Qiu * {@link #EXTRA_FILENAME} 164ed1fc64efda22f3defb3a174b8823756aecefffePeter Qiu * {@link #EXTRA_ICON} 1655679145d9a416c74a59135656802365a6b931b25Peter Qiu * 1664f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu * Receiver Required Permission: android.Manifest.permission.ACCESS_WIFI_STATE 1674f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu * 1685679145d9a416c74a59135656802365a6b931b25Peter Qiu * <p>Note: The broadcast is only delivered to registered receivers - no manifest registered 1695679145d9a416c74a59135656802365a6b931b25Peter Qiu * components will be launched. 170ff323d3ce91ae159be9c23221dda33cbb3efb796Peter Qiu * 171ff323d3ce91ae159be9c23221dda33cbb3efb796Peter Qiu * @hide 1724f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu */ 1735679145d9a416c74a59135656802365a6b931b25Peter Qiu public static final String ACTION_PASSPOINT_ICON = "android.net.wifi.action.PASSPOINT_ICON"; 1744f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu /** 1755679145d9a416c74a59135656802365a6b931b25Peter Qiu * BSSID of an AP in long representation. The {@link #EXTRA_BSSID} contains BSSID in 1765679145d9a416c74a59135656802365a6b931b25Peter Qiu * String representation. 1774f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu * 1785679145d9a416c74a59135656802365a6b931b25Peter Qiu * Retrieve with {@link android.content.Intent#getLongExtra(String, long)}. 179ff323d3ce91ae159be9c23221dda33cbb3efb796Peter Qiu * 180ff323d3ce91ae159be9c23221dda33cbb3efb796Peter Qiu * @hide 1814f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu */ 1825679145d9a416c74a59135656802365a6b931b25Peter Qiu public static final String EXTRA_BSSID_LONG = "android.net.wifi.extra.BSSID_LONG"; 1834f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu /** 184ed1fc64efda22f3defb3a174b8823756aecefffePeter Qiu * Icon data. 1854f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu * 1865679145d9a416c74a59135656802365a6b931b25Peter Qiu * Retrieve with {@link android.content.Intent#getParcelableExtra(String)} and cast into 187ed1fc64efda22f3defb3a174b8823756aecefffePeter Qiu * {@link android.graphics.drawable.Icon}. 188ff323d3ce91ae159be9c23221dda33cbb3efb796Peter Qiu * 189ff323d3ce91ae159be9c23221dda33cbb3efb796Peter Qiu * @hide 1904f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu */ 191ed1fc64efda22f3defb3a174b8823756aecefffePeter Qiu public static final String EXTRA_ICON = "android.net.wifi.extra.ICON"; 192ed1fc64efda22f3defb3a174b8823756aecefffePeter Qiu /** 193ed1fc64efda22f3defb3a174b8823756aecefffePeter Qiu * Name of a file. 194ed1fc64efda22f3defb3a174b8823756aecefffePeter Qiu * 195ed1fc64efda22f3defb3a174b8823756aecefffePeter Qiu * Retrieve with {@link android.content.Intent#getStringExtra(String)}. 196ff323d3ce91ae159be9c23221dda33cbb3efb796Peter Qiu * 197ff323d3ce91ae159be9c23221dda33cbb3efb796Peter Qiu * @hide 198ed1fc64efda22f3defb3a174b8823756aecefffePeter Qiu */ 199ed1fc64efda22f3defb3a174b8823756aecefffePeter Qiu public static final String EXTRA_FILENAME = "android.net.wifi.extra.FILENAME"; 2004f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu 2014f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu /** 2024f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu * Broadcast intent action indicating a Passpoint OSU Providers List element has been received. 2034f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu * 2045679145d9a416c74a59135656802365a6b931b25Peter Qiu * Included extras: 2055679145d9a416c74a59135656802365a6b931b25Peter Qiu * {@link #EXTRA_BSSID_LONG} 2065679145d9a416c74a59135656802365a6b931b25Peter Qiu * {@link #EXTRA_ANQP_ELEMENT_DATA} 2075679145d9a416c74a59135656802365a6b931b25Peter Qiu * 2084f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu * Receiver Required Permission: android.Manifest.permission.ACCESS_WIFI_STATE 2095679145d9a416c74a59135656802365a6b931b25Peter Qiu * 2105679145d9a416c74a59135656802365a6b931b25Peter Qiu * <p>Note: The broadcast is only delivered to registered receivers - no manifest registered 2115679145d9a416c74a59135656802365a6b931b25Peter Qiu * components will be launched. 2125679145d9a416c74a59135656802365a6b931b25Peter Qiu * 213ff323d3ce91ae159be9c23221dda33cbb3efb796Peter Qiu * @hide 2144f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu */ 2154f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu public static final String ACTION_PASSPOINT_OSU_PROVIDERS_LIST = 2164f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu "android.net.wifi.action.PASSPOINT_OSU_PROVIDERS_LIST"; 2174f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu /** 2185679145d9a416c74a59135656802365a6b931b25Peter Qiu * Raw binary data of an ANQP (Access Network Query Protocol) element. 2194f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu * 2205679145d9a416c74a59135656802365a6b931b25Peter Qiu * Retrieve with {@link android.content.Intent#getByteArrayExtra(String)}. 221ff323d3ce91ae159be9c23221dda33cbb3efb796Peter Qiu * 222ff323d3ce91ae159be9c23221dda33cbb3efb796Peter Qiu * @hide 2234f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu */ 2245679145d9a416c74a59135656802365a6b931b25Peter Qiu public static final String EXTRA_ANQP_ELEMENT_DATA = 2255679145d9a416c74a59135656802365a6b931b25Peter Qiu "android.net.wifi.extra.ANQP_ELEMENT_DATA"; 2264f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu 2274f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu /** 2284f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu * Broadcast intent action indicating that a Passpoint Deauth Imminent frame has been received. 2294f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu * 2305679145d9a416c74a59135656802365a6b931b25Peter Qiu * Included extras: 2315679145d9a416c74a59135656802365a6b931b25Peter Qiu * {@link #EXTRA_BSSID_LONG} 2325679145d9a416c74a59135656802365a6b931b25Peter Qiu * {@link #EXTRA_ESS} 2335679145d9a416c74a59135656802365a6b931b25Peter Qiu * {@link #EXTRA_DELAY} 2345679145d9a416c74a59135656802365a6b931b25Peter Qiu * {@link #EXTRA_URL} 2355679145d9a416c74a59135656802365a6b931b25Peter Qiu * 2364f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu * Receiver Required Permission: android.Manifest.permission.ACCESS_WIFI_STATE 2375679145d9a416c74a59135656802365a6b931b25Peter Qiu * 2385679145d9a416c74a59135656802365a6b931b25Peter Qiu * <p>Note: The broadcast is only delivered to registered receivers - no manifest registered 2395679145d9a416c74a59135656802365a6b931b25Peter Qiu * components will be launched. 2405679145d9a416c74a59135656802365a6b931b25Peter Qiu * 241ff323d3ce91ae159be9c23221dda33cbb3efb796Peter Qiu * @hide 2424f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu */ 2434f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu public static final String ACTION_PASSPOINT_DEAUTH_IMMINENT = 2444f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu "android.net.wifi.action.PASSPOINT_DEAUTH_IMMINENT"; 2454f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu /** 2465679145d9a416c74a59135656802365a6b931b25Peter Qiu * Flag indicating BSS (Basic Service Set) or ESS (Extended Service Set). This will be set to 2475679145d9a416c74a59135656802365a6b931b25Peter Qiu * {@code true} for ESS. 2484f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu * 2495679145d9a416c74a59135656802365a6b931b25Peter Qiu * Retrieve with {@link android.content.Intent#getBooleanExtra(String, boolean)}. 250ff323d3ce91ae159be9c23221dda33cbb3efb796Peter Qiu * 251ff323d3ce91ae159be9c23221dda33cbb3efb796Peter Qiu * @hide 2524f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu */ 2535679145d9a416c74a59135656802365a6b931b25Peter Qiu public static final String EXTRA_ESS = "android.net.wifi.extra.ESS"; 2544f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu /** 2555679145d9a416c74a59135656802365a6b931b25Peter Qiu * Delay in seconds. 2564f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu * 2575679145d9a416c74a59135656802365a6b931b25Peter Qiu * Retrieve with {@link android.content.Intent#getIntExtra(String, int)}. 258ff323d3ce91ae159be9c23221dda33cbb3efb796Peter Qiu * 259ff323d3ce91ae159be9c23221dda33cbb3efb796Peter Qiu * @hide 2604f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu */ 2615679145d9a416c74a59135656802365a6b931b25Peter Qiu public static final String EXTRA_DELAY = "android.net.wifi.extra.DELAY"; 2624f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu /** 2635679145d9a416c74a59135656802365a6b931b25Peter Qiu * String representation of an URL. 2644f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu * 2655679145d9a416c74a59135656802365a6b931b25Peter Qiu * Retrieve with {@link android.content.Intent#getStringExtra(String)}. 266ff323d3ce91ae159be9c23221dda33cbb3efb796Peter Qiu * 267ff323d3ce91ae159be9c23221dda33cbb3efb796Peter Qiu * @hide 2684f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu */ 2695679145d9a416c74a59135656802365a6b931b25Peter Qiu public static final String EXTRA_URL = "android.net.wifi.extra.URL"; 2704f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu 2714f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu /** 2724f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu * Broadcast intent action indicating a Passpoint subscription remediation frame has been 2734f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu * received. 2744f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu * 2755679145d9a416c74a59135656802365a6b931b25Peter Qiu * Included extras: 2765679145d9a416c74a59135656802365a6b931b25Peter Qiu * {@link #EXTRA_BSSID_LONG} 2775679145d9a416c74a59135656802365a6b931b25Peter Qiu * {@link #EXTRA_SUBSCRIPTION_REMEDIATION_METHOD} 2785679145d9a416c74a59135656802365a6b931b25Peter Qiu * {@link #EXTRA_URL} 2795679145d9a416c74a59135656802365a6b931b25Peter Qiu * 2804f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu * Receiver Required Permission: android.Manifest.permission.ACCESS_WIFI_STATE 2815679145d9a416c74a59135656802365a6b931b25Peter Qiu * 282ff323d3ce91ae159be9c23221dda33cbb3efb796Peter Qiu * <p>Note: The broadcast is only delivered to registered receivers - no manifest registered 2835679145d9a416c74a59135656802365a6b931b25Peter Qiu * components will be launched. 284ff323d3ce91ae159be9c23221dda33cbb3efb796Peter Qiu * 285ff323d3ce91ae159be9c23221dda33cbb3efb796Peter Qiu * @hide 2864f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu */ 2874f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu public static final String ACTION_PASSPOINT_SUBSCRIPTION_REMEDIATION = 2884f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu "android.net.wifi.action.PASSPOINT_SUBSCRIPTION_REMEDIATION"; 2894f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu /** 2904f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu * The protocol supported by the subscription remediation server. The possible values are: 2914f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu * 0 - OMA DM 2924f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu * 1 - SOAP XML SPP 2934f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu * 2945679145d9a416c74a59135656802365a6b931b25Peter Qiu * Retrieve with {@link android.content.Intent#getIntExtra(String, int)}. 295ff323d3ce91ae159be9c23221dda33cbb3efb796Peter Qiu * 296ff323d3ce91ae159be9c23221dda33cbb3efb796Peter Qiu * @hide 2974f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu */ 2985679145d9a416c74a59135656802365a6b931b25Peter Qiu public static final String EXTRA_SUBSCRIPTION_REMEDIATION_METHOD = 2995679145d9a416c74a59135656802365a6b931b25Peter Qiu "android.net.wifi.extra.SUBSCRIPTION_REMEDIATION_METHOD"; 3004f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu 3014f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu /** 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Broadcast intent action indicating that Wi-Fi has been enabled, disabled, 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * enabling, disabling, or unknown. One extra provides this state as an int. 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Another extra provides the previous state, if available. 305227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_WIFI_STATE 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_PREVIOUS_WIFI_STATE 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String WIFI_STATE_CHANGED_ACTION = 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android.net.wifi.WIFI_STATE_CHANGED"; 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The lookup key for an int that indicates whether Wi-Fi is enabled, 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * disabled, enabling, disabling, or unknown. Retrieve it with 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getIntExtra(String,int)}. 316227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_DISABLED 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_DISABLING 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_ENABLED 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_ENABLING 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_UNKNOWN 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_WIFI_STATE = "wifi_state"; 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The previous Wi-Fi state. 326227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_WIFI_STATE 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_PREVIOUS_WIFI_STATE = "previous_wifi_state"; 330227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wi-Fi is currently being disabled. The state will change to {@link #WIFI_STATE_DISABLED} if 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it finishes successfully. 334227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_CHANGED_ACTION 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getWifiState() 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WIFI_STATE_DISABLING = 0; 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wi-Fi is disabled. 341227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_CHANGED_ACTION 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getWifiState() 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WIFI_STATE_DISABLED = 1; 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wi-Fi is currently being enabled. The state will change to {@link #WIFI_STATE_ENABLED} if 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it finishes successfully. 349227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_CHANGED_ACTION 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getWifiState() 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WIFI_STATE_ENABLING = 2; 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wi-Fi is enabled. 356227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_CHANGED_ACTION 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getWifiState() 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WIFI_STATE_ENABLED = 3; 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wi-Fi is in an unknown state. This state will occur when an error happens while enabling 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or disabling. 364227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #WIFI_STATE_CHANGED_ACTION 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getWifiState() 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WIFI_STATE_UNKNOWN = 4; 3695321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff 3705321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 3715321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Broadcast intent action indicating that Wi-Fi AP has been enabled, disabled, 3725321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * enabling, disabling, or failed. 3735321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 3745321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide 3755321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 376b8c7badbb5b0cf2d101ddfabdcf7c95135965eeaJeremy Klein @SystemApi 3775321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff public static final String WIFI_AP_STATE_CHANGED_ACTION = 3785321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff "android.net.wifi.WIFI_AP_STATE_CHANGED"; 3795321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff 3805321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 3815321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * The lookup key for an int that indicates whether Wi-Fi AP is enabled, 3825321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * disabled, enabling, disabling, or failed. Retrieve it with 3835321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * {@link android.content.Intent#getIntExtra(String,int)}. 3845321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 3855321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_DISABLED 3865321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_DISABLING 3875321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_ENABLED 3885321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_ENABLING 3895321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_FAILED 3905321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 3915321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide 3925321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 393b8c7badbb5b0cf2d101ddfabdcf7c95135965eeaJeremy Klein @SystemApi 3945321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff public static final String EXTRA_WIFI_AP_STATE = "wifi_state"; 395e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe 396e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe /** 397e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe * The look up key for an int that indicates why softAP started failed 398e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe * currently support general and no_channel 3995adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * @see #SAP_START_FAILURE_GENERIC 400e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe * @see #SAP_START_FAILURE_NO_CHANNEL 401e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe * 402e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe * @hide 403e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe */ 404e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe public static final String EXTRA_WIFI_AP_FAILURE_REASON = "wifi_ap_error_code"; 4055321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 4065321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * The previous Wi-Fi state. 4075321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 4085321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #EXTRA_WIFI_AP_STATE 4095321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 4105321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide 4115321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 412b8c7badbb5b0cf2d101ddfabdcf7c95135965eeaJeremy Klein @SystemApi 4135321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff public static final String EXTRA_PREVIOUS_WIFI_AP_STATE = "previous_wifi_state"; 4145321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 4154ac2cab8fd8cb6ef877f4e5c37f554f1a09b79dcRebecca Silberstein * The interface used for the softap. 4164ac2cab8fd8cb6ef877f4e5c37f554f1a09b79dcRebecca Silberstein * 4174ac2cab8fd8cb6ef877f4e5c37f554f1a09b79dcRebecca Silberstein * @hide 4184ac2cab8fd8cb6ef877f4e5c37f554f1a09b79dcRebecca Silberstein */ 4194ac2cab8fd8cb6ef877f4e5c37f554f1a09b79dcRebecca Silberstein public static final String EXTRA_WIFI_AP_INTERFACE_NAME = "wifi_ap_interface_name"; 4204ac2cab8fd8cb6ef877f4e5c37f554f1a09b79dcRebecca Silberstein /** 4214ac2cab8fd8cb6ef877f4e5c37f554f1a09b79dcRebecca Silberstein * The intended ip mode for this softap. 4224ac2cab8fd8cb6ef877f4e5c37f554f1a09b79dcRebecca Silberstein * @see #IFACE_IP_MODE_TETHERED 4234ac2cab8fd8cb6ef877f4e5c37f554f1a09b79dcRebecca Silberstein * @see #IFACE_IP_MODE_LOCAL_ONLY 4244ac2cab8fd8cb6ef877f4e5c37f554f1a09b79dcRebecca Silberstein * 4254ac2cab8fd8cb6ef877f4e5c37f554f1a09b79dcRebecca Silberstein * @hide 4264ac2cab8fd8cb6ef877f4e5c37f554f1a09b79dcRebecca Silberstein */ 4274ac2cab8fd8cb6ef877f4e5c37f554f1a09b79dcRebecca Silberstein public static final String EXTRA_WIFI_AP_MODE = "wifi_ap_mode"; 4284ac2cab8fd8cb6ef877f4e5c37f554f1a09b79dcRebecca Silberstein 4294ac2cab8fd8cb6ef877f4e5c37f554f1a09b79dcRebecca Silberstein /** 4305321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Wi-Fi AP is currently being disabled. The state will change to 4315321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * {@link #WIFI_AP_STATE_DISABLED} if it finishes successfully. 4325321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 4335321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_CHANGED_ACTION 4345321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #getWifiApState() 4355321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 4365321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide 4375321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 438b8c7badbb5b0cf2d101ddfabdcf7c95135965eeaJeremy Klein @SystemApi 439a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff public static final int WIFI_AP_STATE_DISABLING = 10; 4405321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 4415321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Wi-Fi AP is disabled. 4425321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 4435321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_CHANGED_ACTION 4445321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #getWifiState() 4455321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 4465321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide 4475321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 448b8c7badbb5b0cf2d101ddfabdcf7c95135965eeaJeremy Klein @SystemApi 449a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff public static final int WIFI_AP_STATE_DISABLED = 11; 4505321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 4515321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Wi-Fi AP is currently being enabled. The state will change to 4525321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * {@link #WIFI_AP_STATE_ENABLED} if it finishes successfully. 4535321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 4545321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_CHANGED_ACTION 4555321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #getWifiApState() 4565321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 4575321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide 4585321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 459b8c7badbb5b0cf2d101ddfabdcf7c95135965eeaJeremy Klein @SystemApi 460a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff public static final int WIFI_AP_STATE_ENABLING = 12; 4615321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 4625321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Wi-Fi AP is enabled. 4635321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 4645321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_CHANGED_ACTION 4655321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #getWifiApState() 4665321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 4675321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide 4685321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 469b8c7badbb5b0cf2d101ddfabdcf7c95135965eeaJeremy Klein @SystemApi 470a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff public static final int WIFI_AP_STATE_ENABLED = 13; 4715321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 4725321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Wi-Fi AP is in a failed state. This state will occur when an error occurs during 4735321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * enabling or disabling 4745321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 4755321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #WIFI_AP_STATE_CHANGED_ACTION 4765321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #getWifiApState() 4775321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 4785321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @hide 4795321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 480b8c7badbb5b0cf2d101ddfabdcf7c95135965eeaJeremy Klein @SystemApi 481a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff public static final int WIFI_AP_STATE_FAILED = 14; 4825321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 484e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe * If WIFI AP start failed, this reason code means there is no legal channel exists on 485e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe * user selected band by regulatory 486e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe * 487e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe * @hide 488e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe */ 489e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe public static final int SAP_START_FAILURE_GENERAL= 0; 490e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe 491e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe /** 492e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe * All other reason for AP start failed besides SAP_START_FAILURE_GENERAL 493e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe * 494e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe * @hide 495e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe */ 496e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe public static final int SAP_START_FAILURE_NO_CHANNEL = 1; 497720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein 498720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein /** 499bf4754361877ad93a92bea64407974f26eb7c494Rebecca Silberstein * Interface IP mode unspecified. 500bf4754361877ad93a92bea64407974f26eb7c494Rebecca Silberstein * 501bf4754361877ad93a92bea64407974f26eb7c494Rebecca Silberstein * @see updateInterfaceIpState(String, int) 502bf4754361877ad93a92bea64407974f26eb7c494Rebecca Silberstein * 503bf4754361877ad93a92bea64407974f26eb7c494Rebecca Silberstein * @hide 504bf4754361877ad93a92bea64407974f26eb7c494Rebecca Silberstein */ 505bf4754361877ad93a92bea64407974f26eb7c494Rebecca Silberstein public static final int IFACE_IP_MODE_UNSPECIFIED = -1; 506bf4754361877ad93a92bea64407974f26eb7c494Rebecca Silberstein 507bf4754361877ad93a92bea64407974f26eb7c494Rebecca Silberstein /** 508720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein * Interface IP mode for configuration error. 509720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein * 510720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein * @see updateInterfaceIpState(String, int) 511720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein * 512720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein * @hide 513720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein */ 514720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein public static final int IFACE_IP_MODE_CONFIGURATION_ERROR = 0; 515720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein 516720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein /** 517720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein * Interface IP mode for tethering. 518720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein * 519720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein * @see updateInterfaceIpState(String, int) 520720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein * 521720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein * @hide 522720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein */ 523720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein public static final int IFACE_IP_MODE_TETHERED = 1; 524720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein 525720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein /** 526720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein * Interface IP mode for Local Only Hotspot. 527720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein * 528720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein * @see updateInterfaceIpState(String, int) 529720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein * 530720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein * @hide 531720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein */ 532720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein public static final int IFACE_IP_MODE_LOCAL_ONLY = 2; 533720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein 534e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe /** 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Broadcast intent action indicating that a connection to the supplicant has 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * been established (and it is now possible 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to perform Wi-Fi operations) or the connection to the supplicant has been 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * lost. One extra provides the connection state as a boolean, where {@code true} 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * means CONNECTED. 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_SUPPLICANT_CONNECTED 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String SUPPLICANT_CONNECTION_CHANGE_ACTION = 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android.net.wifi.supplicant.CONNECTION_CHANGE"; 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The lookup key for a boolean that indicates whether a connection to 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the supplicant daemon has been gained or lost. {@code true} means 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a connection now exists. 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve it with {@link android.content.Intent#getBooleanExtra(String,boolean)}. 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_SUPPLICANT_CONNECTED = "connected"; 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Broadcast intent action indicating that the state of Wi-Fi connectivity 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * has changed. One extra provides the new state 5553550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * in the form of a {@link android.net.NetworkInfo} object. If the new 5563550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * state is CONNECTED, additional extras may provide the BSSID and WifiInfo of 5573550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * the access point. 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as a {@code String}. 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_NETWORK_INFO 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_BSSID 5613550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * @see #EXTRA_WIFI_INFO 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String NETWORK_STATE_CHANGED_ACTION = "android.net.wifi.STATE_CHANGE"; 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The lookup key for a {@link android.net.NetworkInfo} object associated with the 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wi-Fi network. Retrieve with 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getParcelableExtra(String)}. 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_NETWORK_INFO = "networkInfo"; 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The lookup key for a String giving the BSSID of the access point to which 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * we are connected. Only present when the new state is CONNECTED. 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve with 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getStringExtra(String)}. 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_BSSID = "bssid"; 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5793550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * The lookup key for a {@link android.net.wifi.WifiInfo} object giving the 5803550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * information about the access point to which we are connected. Only present 5813550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * when the new state is CONNECTED. Retrieve with 5823550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy * {@link android.content.Intent#getParcelableExtra(String)}. 5833550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy */ 5843550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy public static final String EXTRA_WIFI_INFO = "wifiInfo"; 5853550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy /** 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Broadcast intent action indicating that the state of establishing a connection to 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an access point has changed.One extra provides the new 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link SupplicantState}. Note that the supplicant state is Wi-Fi specific, and 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is not generally the most useful thing to look at if you are just interested in 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the overall state of connectivity. 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_NEW_STATE 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_SUPPLICANT_ERROR 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String SUPPLICANT_STATE_CHANGED_ACTION = 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android.net.wifi.supplicant.STATE_CHANGE"; 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The lookup key for a {@link SupplicantState} describing the new state 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve with 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getParcelableExtra(String)}. 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_NEW_STATE = "newState"; 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The lookup key for a {@link SupplicantState} describing the supplicant 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * error code if any 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve with 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Intent#getIntExtra(String, int)}. 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #ERROR_AUTHENTICATING 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_SUPPLICANT_ERROR = "supplicantError"; 612fcb659b66756ac02bd1491ae1365b27e8509a890Irfan Sheriff 613fcb659b66756ac02bd1491ae1365b27e8509a890Irfan Sheriff /** 6147b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao * The lookup key for a {@link SupplicantState} describing the supplicant 6157b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao * error reason if any 6167b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao * Retrieve with 6177b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao * {@link android.content.Intent#getIntExtra(String, int)}. 6187b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao * @see #ERROR_AUTH_FAILURE_#REASON_CODE 6197b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao * @hide 6207b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao */ 6217b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao public static final String EXTRA_SUPPLICANT_ERROR_REASON = "supplicantErrorReason"; 6227b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao 6237b38b035f5cd758c5ed56e1ac6fb724d5032aee9Sohani Rao /** 624be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff * Broadcast intent action indicating that the configured networks changed. 6251b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * This can be as a result of adding/updating/deleting a network. If 6261b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * {@link #EXTRA_MULTIPLE_NETWORKS_CHANGED} is set to true the new configuration 6271b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * can be retreived with the {@link #EXTRA_WIFI_CONFIGURATION} extra. If multiple 6281b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * Wi-Fi configurations changed, {@link #EXTRA_WIFI_CONFIGURATION} will not be present. 629e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @hide 630e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff */ 631e75c0b8e3becd9f875679a5240f3b1e26d089a3fChelsea Derrick @SystemApi 632be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff public static final String CONFIGURED_NETWORKS_CHANGED_ACTION = 633be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff "android.net.wifi.CONFIGURED_NETWORKS_CHANGE"; 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6351b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * The lookup key for a (@link android.net.wifi.WifiConfiguration} object representing 6361b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * the changed Wi-Fi configuration when the {@link #CONFIGURED_NETWORKS_CHANGED_ACTION} 6371b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * broadcast is sent. 6381b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @hide 6391b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood */ 640e75c0b8e3becd9f875679a5240f3b1e26d089a3fChelsea Derrick @SystemApi 6411b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood public static final String EXTRA_WIFI_CONFIGURATION = "wifiConfiguration"; 6421b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood /** 6431b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * Multiple network configurations have changed. 6441b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @see #CONFIGURED_NETWORKS_CHANGED_ACTION 6451b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * 6461b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @hide 6471b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood */ 648e75c0b8e3becd9f875679a5240f3b1e26d089a3fChelsea Derrick @SystemApi 6491b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood public static final String EXTRA_MULTIPLE_NETWORKS_CHANGED = "multipleChanges"; 6501b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood /** 6511b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * The lookup key for an integer indicating the reason a Wi-Fi network configuration 6521b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * has changed. Only present if {@link #EXTRA_MULTIPLE_NETWORKS_CHANGED} is {@code false} 6531b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @see #CONFIGURED_NETWORKS_CHANGED_ACTION 6541b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @hide 6551b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood */ 656e75c0b8e3becd9f875679a5240f3b1e26d089a3fChelsea Derrick @SystemApi 6571b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood public static final String EXTRA_CHANGE_REASON = "changeReason"; 6581b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood /** 6591b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * The configuration is new and was added. 6601b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @hide 6611b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood */ 662e75c0b8e3becd9f875679a5240f3b1e26d089a3fChelsea Derrick @SystemApi 6631b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood public static final int CHANGE_REASON_ADDED = 0; 6641b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood /** 6651b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * The configuration was removed and is no longer present in the system's list of 6661b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * configured networks. 6671b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @hide 6681b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood */ 669e75c0b8e3becd9f875679a5240f3b1e26d089a3fChelsea Derrick @SystemApi 6701b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood public static final int CHANGE_REASON_REMOVED = 1; 6711b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood /** 6721b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * The configuration has changed as a result of explicit action or because the system 6731b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * took an automated action such as disabling a malfunctioning configuration. 6741b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood * @hide 6751b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood */ 676e75c0b8e3becd9f875679a5240f3b1e26d089a3fChelsea Derrick @SystemApi 6771b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood public static final int CHANGE_REASON_CONFIG_CHANGE = 2; 6781b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood /** 67947e9400f1e186c423ca0de5db798212e3b02bfdbNingyuan Wang * An access point scan has completed, and results are available. 68047e9400f1e186c423ca0de5db798212e3b02bfdbNingyuan Wang * Call {@link #getScanResults()} to obtain the results. 68147e9400f1e186c423ca0de5db798212e3b02bfdbNingyuan Wang * The broadcast intent may contain an extra field with the key {@link #EXTRA_RESULTS_UPDATED} 68247e9400f1e186c423ca0de5db798212e3b02bfdbNingyuan Wang * and a {@code boolean} value indicating if the scan was successful. 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String SCAN_RESULTS_AVAILABLE_ACTION = "android.net.wifi.SCAN_RESULTS"; 68629ad7c7000393751a0ab0e1a17912db7866d4ff8Vinit Deshpande 68729ad7c7000393751a0ab0e1a17912db7866d4ff8Vinit Deshpande /** 68847e9400f1e186c423ca0de5db798212e3b02bfdbNingyuan Wang * Lookup key for a {@code boolean} extra in intent {@link #SCAN_RESULTS_AVAILABLE_ACTION} 68947e9400f1e186c423ca0de5db798212e3b02bfdbNingyuan Wang * representing if the scan was successful or not. 69047e9400f1e186c423ca0de5db798212e3b02bfdbNingyuan Wang * Scans may fail for multiple reasons, these may include: 69147e9400f1e186c423ca0de5db798212e3b02bfdbNingyuan Wang * <ol> 69247e9400f1e186c423ca0de5db798212e3b02bfdbNingyuan Wang * <li>A non-privileged app requested too many scans in a certain period of time. 69347e9400f1e186c423ca0de5db798212e3b02bfdbNingyuan Wang * This may lead to additional scan request rejections via "scan throttling". 69447e9400f1e186c423ca0de5db798212e3b02bfdbNingyuan Wang * See 69547e9400f1e186c423ca0de5db798212e3b02bfdbNingyuan Wang * <a href="https://developer.android.com/preview/features/background-location-limits.html"> 69647e9400f1e186c423ca0de5db798212e3b02bfdbNingyuan Wang * here</a> for details. 69747e9400f1e186c423ca0de5db798212e3b02bfdbNingyuan Wang * </li> 69847e9400f1e186c423ca0de5db798212e3b02bfdbNingyuan Wang * <li>The device is idle and scanning is disabled.</li> 69947e9400f1e186c423ca0de5db798212e3b02bfdbNingyuan Wang * <li>Wifi hardware reported a scan failure.</li> 70047e9400f1e186c423ca0de5db798212e3b02bfdbNingyuan Wang * </ol> 701a0d929e505432a8c84f3899696c910db16bd73bfVinit Deshpande * @return true scan was successful, results are updated 70229ad7c7000393751a0ab0e1a17912db7866d4ff8Vinit Deshpande * @return false scan was not successful, results haven't been updated since previous scan 70329ad7c7000393751a0ab0e1a17912db7866d4ff8Vinit Deshpande */ 70429ad7c7000393751a0ab0e1a17912db7866d4ff8Vinit Deshpande public static final String EXTRA_RESULTS_UPDATED = "resultsUpdated"; 70529ad7c7000393751a0ab0e1a17912db7866d4ff8Vinit Deshpande 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7070451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * A batch of access point scans has been completed and the results areavailable. 7080451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * Call {@link #getBatchedScanResults()} to obtain the results. 70988d93cd68a32e7110f9328ff522226126c7e493eMitchell Wills * @deprecated This API is nolonger supported. 71088d93cd68a32e7110f9328ff522226126c7e493eMitchell Wills * Use {@link android.net.wifi.WifiScanner} API 71188d93cd68a32e7110f9328ff522226126c7e493eMitchell Wills * @hide 7120451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt */ 71388d93cd68a32e7110f9328ff522226126c7e493eMitchell Wills @Deprecated 7140451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 7150451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt public static final String BATCHED_SCAN_RESULTS_AVAILABLE_ACTION = 7160451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt "android.net.wifi.BATCHED_RESULTS"; 7170451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt /** 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The RSSI (signal strength) has changed. 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #EXTRA_NEW_RSSI 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String RSSI_CHANGED_ACTION = "android.net.wifi.RSSI_CHANGED"; 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The lookup key for an {@code int} giving the new RSSI in dBm. 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String EXTRA_NEW_RSSI = "newRssi"; 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 729be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff * Broadcast intent action indicating that the link configuration 7300d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * changed on wifi. 7310d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @hide 7320d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff */ 733be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff public static final String LINK_CONFIGURATION_CHANGED_ACTION = 734be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff "android.net.wifi.LINK_CONFIGURATION_CHANGED"; 735f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 7360d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff /** 73737e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt * The lookup key for a {@link android.net.LinkProperties} object associated with the 7380d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * Wi-Fi network. Retrieve with 7390d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * {@link android.content.Intent#getParcelableExtra(String)}. 7400d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff * @hide 7410d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff */ 74237e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt public static final String EXTRA_LINK_PROPERTIES = "linkProperties"; 7430d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff 7440d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff /** 745f9cb86aebe9647e0fe0137fc198ba16c017445c6Robert Greenwalt * The lookup key for a {@link android.net.NetworkCapabilities} object associated with the 746f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * Wi-Fi network. Retrieve with 747f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * {@link android.content.Intent#getParcelableExtra(String)}. 748f61101f6266be243c481d163b95e65d67b8d1669Wink Saville * @hide 749f61101f6266be243c481d163b95e65d67b8d1669Wink Saville */ 750f9cb86aebe9647e0fe0137fc198ba16c017445c6Robert Greenwalt public static final String EXTRA_NETWORK_CAPABILITIES = "networkCapabilities"; 751f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 752f61101f6266be243c481d163b95e65d67b8d1669Wink Saville /** 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The network IDs of the configured networks could have changed. 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String NETWORK_IDS_CHANGED_ACTION = "android.net.wifi.NETWORK_IDS_CHANGED"; 75737e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7591ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * Activity Action: Show a system activity that allows the user to enable 7601ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * scans to be available even with Wi-Fi turned off. 7611ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * 7621ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * <p>Notification of the result of this activity is posted using the 7631ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * {@link android.app.Activity#onActivityResult} callback. The 7641ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * <code>resultCode</code> 7651ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * will be {@link android.app.Activity#RESULT_OK} if scan always mode has 7661ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * been turned on or {@link android.app.Activity#RESULT_CANCELED} if the user 7671ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * has rejected the request or an error has occurred. 7681ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff */ 7691ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 7701ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff public static final String ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE = 7711ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff "android.net.wifi.action.REQUEST_SCAN_ALWAYS_AVAILABLE"; 7721ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff 7731ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff /** 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Activity Action: Pick a Wi-Fi network to connect to. 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Input: Nothing. 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Output: Nothing. 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final String ACTION_PICK_WIFI_NETWORK = "android.net.wifi.PICK_WIFI_NETWORK"; 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7826c3032f16bd97d8137dc90ec8dce47842a4a9c20Svetoslav Ganov * Activity Action: Show UI to get user approval to enable WiFi. 7836c3032f16bd97d8137dc90ec8dce47842a4a9c20Svetoslav Ganov * <p>Input: {@link android.content.Intent#EXTRA_PACKAGE_NAME} string extra with 7846c3032f16bd97d8137dc90ec8dce47842a4a9c20Svetoslav Ganov * the name of the app requesting the action. 7856c3032f16bd97d8137dc90ec8dce47842a4a9c20Svetoslav Ganov * <p>Output: Nothing. 7866c3032f16bd97d8137dc90ec8dce47842a4a9c20Svetoslav Ganov * 7876c3032f16bd97d8137dc90ec8dce47842a4a9c20Svetoslav Ganov * @hide 7886c3032f16bd97d8137dc90ec8dce47842a4a9c20Svetoslav Ganov */ 7896c3032f16bd97d8137dc90ec8dce47842a4a9c20Svetoslav Ganov @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 7906c3032f16bd97d8137dc90ec8dce47842a4a9c20Svetoslav Ganov public static final String ACTION_REQUEST_ENABLE = "android.net.wifi.action.REQUEST_ENABLE"; 7916c3032f16bd97d8137dc90ec8dce47842a4a9c20Svetoslav Ganov 7926c3032f16bd97d8137dc90ec8dce47842a4a9c20Svetoslav Ganov /** 7936c3032f16bd97d8137dc90ec8dce47842a4a9c20Svetoslav Ganov * Activity Action: Show UI to get user approval to disable WiFi. 7946c3032f16bd97d8137dc90ec8dce47842a4a9c20Svetoslav Ganov * <p>Input: {@link android.content.Intent#EXTRA_PACKAGE_NAME} string extra with 7956c3032f16bd97d8137dc90ec8dce47842a4a9c20Svetoslav Ganov * the name of the app requesting the action. 7966c3032f16bd97d8137dc90ec8dce47842a4a9c20Svetoslav Ganov * <p>Output: Nothing. 7976c3032f16bd97d8137dc90ec8dce47842a4a9c20Svetoslav Ganov * 7986c3032f16bd97d8137dc90ec8dce47842a4a9c20Svetoslav Ganov * @hide 7996c3032f16bd97d8137dc90ec8dce47842a4a9c20Svetoslav Ganov */ 8006c3032f16bd97d8137dc90ec8dce47842a4a9c20Svetoslav Ganov @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 8016c3032f16bd97d8137dc90ec8dce47842a4a9c20Svetoslav Ganov public static final String ACTION_REQUEST_DISABLE = "android.net.wifi.action.REQUEST_DISABLE"; 8026c3032f16bd97d8137dc90ec8dce47842a4a9c20Svetoslav Ganov 8036c3032f16bd97d8137dc90ec8dce47842a4a9c20Svetoslav Ganov /** 804b7d13d53bf95c86ed3e65277dc072e3379c94f8eRebecca Silberstein * Internally used Wi-Fi lock mode representing the case were no locks are held. 805b7d13d53bf95c86ed3e65277dc072e3379c94f8eRebecca Silberstein * @hide 806b7d13d53bf95c86ed3e65277dc072e3379c94f8eRebecca Silberstein */ 807b7d13d53bf95c86ed3e65277dc072e3379c94f8eRebecca Silberstein public static final int WIFI_MODE_NO_LOCKS_HELD = 0; 808b7d13d53bf95c86ed3e65277dc072e3379c94f8eRebecca Silberstein 809b7d13d53bf95c86ed3e65277dc072e3379c94f8eRebecca Silberstein /** 81099001278289036a3c645e599ed832943ff1b6e15Eric Shienbrood * In this Wi-Fi lock mode, Wi-Fi will be kept active, 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and will behave normally, i.e., it will attempt to automatically 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * establish a connection to a remembered access point that is 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * within range, and will do periodic scans if there are remembered 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * access points but none are in range. 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WIFI_MODE_FULL = 1; 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 81899001278289036a3c645e599ed832943ff1b6e15Eric Shienbrood * In this Wi-Fi lock mode, Wi-Fi will be kept active, 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * but the only operation that will be supported is initiation of 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * scans, and the subsequent reporting of scan results. No attempts 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be made to automatically connect to remembered access points, 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * nor will periodic scans be automatically performed looking for 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * remembered access points. Scans must be explicitly requested by 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an application in this mode. 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WIFI_MODE_SCAN_ONLY = 2; 827652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff /** 828652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * In this Wi-Fi lock mode, Wi-Fi will be kept active as in mode 829652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * {@link #WIFI_MODE_FULL} but it operates at high performance 830652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * with minimum packet loss and low packet latency even when 831652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * the device screen is off. This mode will consume more power 832652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * and hence should be used only when there is a need for such 833652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * an active connection. 834652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * <p> 835652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * An example use case is when a voice connection needs to be 836652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * kept active even after the device screen goes off. Holding the 837652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * regular {@link #WIFI_MODE_FULL} lock will keep the wifi 838652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * connection active, but the connection can be lossy. 839652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * Holding a {@link #WIFI_MODE_FULL_HIGH_PERF} lock for the 840652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * duration of the voice call will improve the call quality. 841652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * <p> 842652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * When there is no support from the hardware, this lock mode 843652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * will have the same behavior as {@link #WIFI_MODE_FULL} 844652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff */ 845652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff public static final int WIFI_MODE_FULL_HIGH_PERF = 3; 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Anything worse than or equal to this will show 0 bars. */ 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int MIN_RSSI = -100; 849652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Anything better than or equal to this will show the max bars. */ 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int MAX_RSSI = -55; 85236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff 85336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff /** 854ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff * Number of RSSI levels used in the framework to initiate 855ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff * {@link #RSSI_CHANGED_ACTION} broadcast 856ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff * @hide 857ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff */ 858ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff public static final int RSSI_LEVELS = 5; 859ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff 860ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff /** 86136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * Auto settings in the driver. The driver could choose to operate on both 86236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * 2.4 GHz and 5 GHz or make a dynamic decision on selecting the band. 86336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @hide 86436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff */ 86536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff public static final int WIFI_FREQUENCY_BAND_AUTO = 0; 86636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff 86736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff /** 86836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * Operation on 5 GHz alone 86936f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @hide 87036f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff */ 87136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff public static final int WIFI_FREQUENCY_BAND_5GHZ = 1; 87236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff 87336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff /** 87436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * Operation on 2.4 GHz alone 87536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @hide 87636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff */ 87736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff public static final int WIFI_FREQUENCY_BAND_2GHZ = 2; 87836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff 879227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff /** List of asyncronous notifications 880227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * @hide 881227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff */ 882227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff public static final int DATA_ACTIVITY_NOTIFICATION = 1; 883227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 884227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff //Lowest bit indicates data reception and the second lowest 885227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff //bit indicates data transmitted 886227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff /** @hide */ 887227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff public static final int DATA_ACTIVITY_NONE = 0x00; 888227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff /** @hide */ 889227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff public static final int DATA_ACTIVITY_IN = 0x01; 890227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff /** @hide */ 891227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff public static final int DATA_ACTIVITY_OUT = 0x02; 892227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff /** @hide */ 893227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff public static final int DATA_ACTIVITY_INOUT = 0x03; 894227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 895ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde /** @hide */ 896ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde public static final boolean DEFAULT_POOR_NETWORK_AVOIDANCE_ENABLED = false; 897ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde 898617750604c69e6068f68266d0e30324273aa990eMike Lockwood /* Maximum number of active locks we allow. 899617750604c69e6068f68266d0e30324273aa990eMike Lockwood * This limit was added to prevent apps from creating a ridiculous number 900617750604c69e6068f68266d0e30324273aa990eMike Lockwood * of locks and crashing the system by overflowing the global ref table. 901617750604c69e6068f68266d0e30324273aa990eMike Lockwood */ 902617750604c69e6068f68266d0e30324273aa990eMike Lockwood private static final int MAX_ACTIVE_LOCKS = 50; 903617750604c69e6068f68266d0e30324273aa990eMike Lockwood 904617750604c69e6068f68266d0e30324273aa990eMike Lockwood /* Number of currently active WifiLocks and MulticastLocks */ 905617750604c69e6068f68266d0e30324273aa990eMike Lockwood private int mActiveLockCount; 906617750604c69e6068f68266d0e30324273aa990eMike Lockwood 90788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff private Context mContext; 90888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff IWifiManager mService; 9091022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti private final int mTargetSdkVersion; 91088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff 91188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff private static final int INVALID_KEY = 0; 912a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart private int mListenerKey = 1; 913a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart private final SparseArray mListenerMap = new SparseArray(); 914a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart private final Object mListenerMapLock = new Object(); 91588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff 916a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart private AsyncChannel mAsyncChannel; 917a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart private CountDownLatch mConnected; 918bf8cbb05e085c4504685883f3dd564f200405beaPaul Stewart private Looper mLooper; 919cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff 920b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein /* LocalOnlyHotspot callback message types */ 921b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein /** @hide */ 922b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein public static final int HOTSPOT_STARTED = 0; 923b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein /** @hide */ 924b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein public static final int HOTSPOT_STOPPED = 1; 925b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein /** @hide */ 926b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein public static final int HOTSPOT_FAILED = 2; 927b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein /** @hide */ 928b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein public static final int HOTSPOT_OBSERVER_REGISTERED = 3; 929b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein 930ce74fc29b0247443199671d89d6bda58bb399a13Rebecca Silberstein private final Object mLock = new Object(); // lock guarding access to the following vars 931ce74fc29b0247443199671d89d6bda58bb399a13Rebecca Silberstein @GuardedBy("mLock") 932ce74fc29b0247443199671d89d6bda58bb399a13Rebecca Silberstein private LocalOnlyHotspotCallbackProxy mLOHSCallbackProxy; 933ce74fc29b0247443199671d89d6bda58bb399a13Rebecca Silberstein @GuardedBy("mLock") 934ce74fc29b0247443199671d89d6bda58bb399a13Rebecca Silberstein private LocalOnlyHotspotObserverProxy mLOHSObserverProxy; 935ce74fc29b0247443199671d89d6bda58bb399a13Rebecca Silberstein 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new WifiManager instance. 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Applications will almost always want to use 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Context#getSystemService Context.getSystemService()} to retrieve 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the standard {@link android.content.Context#WIFI_SERVICE Context.WIFI_SERVICE}. 94188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @param context the application context 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param service the Binder interface 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide - hide this because it takes in a parameter of type IWifiManager, which 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is a system private class. 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 946bf8cbb05e085c4504685883f3dd564f200405beaPaul Stewart public WifiManager(Context context, IWifiManager service, Looper looper) { 94788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff mContext = context; 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService = service; 949bf8cbb05e085c4504685883f3dd564f200405beaPaul Stewart mLooper = looper; 9501022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti mTargetSdkVersion = context.getApplicationInfo().targetSdkVersion; 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 954fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius * Return a list of all the networks configured for the current foreground 955fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius * user. 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Not all fields of WifiConfiguration are returned. Only the following 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * fields are filled in: 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>networkId</li> 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>SSID</li> 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>BSSID</li> 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>priority</li> 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>allowedProtocols</li> 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>allowedKeyManagement</li> 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>allowedAuthAlgorithms</li> 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>allowedPairwiseCiphers</li> 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>allowedGroupCiphers</li> 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a list of network configurations in the form of a list 97059358536d2f14b27cdc7386daeabc2b6dca8e177Irfan Sheriff * of {@link WifiConfiguration} objects. Upon failure to fetch or 9710d3d1f825f399c62f2ba236b53bef17581e03a16Sungsoo Lim * when Wi-Fi is turned off, it can be null. 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public List<WifiConfiguration> getConfiguredNetworks() { 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 975ec19db6bd46d112167e87556e8dacdd32ef911e9zhangshuxiao ParceledListSlice<WifiConfiguration> parceledList = 976ec19db6bd46d112167e87556e8dacdd32ef911e9zhangshuxiao mService.getConfiguredNetworks(); 977ec19db6bd46d112167e87556e8dacdd32ef911e9zhangshuxiao if (parceledList == null) { 978ec19db6bd46d112167e87556e8dacdd32ef911e9zhangshuxiao return Collections.emptyList(); 979ec19db6bd46d112167e87556e8dacdd32ef911e9zhangshuxiao } 980ec19db6bd46d112167e87556e8dacdd32ef911e9zhangshuxiao return parceledList.getList(); 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 982c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 986758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong /** @hide */ 987758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong @SystemApi 988d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey @RequiresPermission(android.Manifest.permission.READ_WIFI_CREDENTIAL) 989758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong public List<WifiConfiguration> getPrivilegedConfiguredNetworks() { 990758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong try { 991ec19db6bd46d112167e87556e8dacdd32ef911e9zhangshuxiao ParceledListSlice<WifiConfiguration> parceledList = 992ec19db6bd46d112167e87556e8dacdd32ef911e9zhangshuxiao mService.getPrivilegedConfiguredNetworks(); 993ec19db6bd46d112167e87556e8dacdd32ef911e9zhangshuxiao if (parceledList == null) { 994ec19db6bd46d112167e87556e8dacdd32ef911e9zhangshuxiao return Collections.emptyList(); 995ec19db6bd46d112167e87556e8dacdd32ef911e9zhangshuxiao } 996ec19db6bd46d112167e87556e8dacdd32ef911e9zhangshuxiao return parceledList.getList(); 997758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong } catch (RemoteException e) { 998c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 999758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong } 1000758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong } 1001758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong 10028478911f5e9b066e2f68cdbeea9164d860be53a2Jeff Sharkey /** 10038478911f5e9b066e2f68cdbeea9164d860be53a2Jeff Sharkey * @hide 10048478911f5e9b066e2f68cdbeea9164d860be53a2Jeff Sharkey * @removed 10058478911f5e9b066e2f68cdbeea9164d860be53a2Jeff Sharkey */ 10064eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle @SystemApi 1007d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey @RequiresPermission(android.Manifest.permission.READ_WIFI_CREDENTIAL) 10084eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle public WifiConnectionStatistics getConnectionStatistics() { 10094eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle try { 10104eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle return mService.getConnectionStatistics(); 10114eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle } catch (RemoteException e) { 1012c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 10134eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle } 10144eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle } 10154eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1017b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande * Returns a WifiConfiguration matching this ScanResult 10181fe2a8cfa642d3ee6b5d409ac64241e19d1c5d32Peter Qiu * 1019b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande * @param scanResult scanResult that represents the BSSID 1020b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande * @return {@link WifiConfiguration} that matches this BSSID or null 1021e78c25e970a4bfebbcb25e6cd1caa366e1d27c42Peter Qiu * @throws UnsupportedOperationException if Passpoint is not enabled on the device. 1022b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande * @hide 1023b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande */ 1024b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande public WifiConfiguration getMatchingWifiConfig(ScanResult scanResult) { 1025b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande try { 1026b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande return mService.getMatchingWifiConfig(scanResult); 1027b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande } catch (RemoteException e) { 1028c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 1029b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande } 1030b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande } 1031b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande 1032b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande /** 1033e78c25e970a4bfebbcb25e6cd1caa366e1d27c42Peter Qiu * Returns a list of Hotspot 2.0 OSU (Online Sign-Up) providers associated with the given AP. 1034e78c25e970a4bfebbcb25e6cd1caa366e1d27c42Peter Qiu * 1035e78c25e970a4bfebbcb25e6cd1caa366e1d27c42Peter Qiu * An empty list will be returned if no match is found. 1036e78c25e970a4bfebbcb25e6cd1caa366e1d27c42Peter Qiu * 1037e78c25e970a4bfebbcb25e6cd1caa366e1d27c42Peter Qiu * @param scanResult scanResult that represents the BSSID 1038e78c25e970a4bfebbcb25e6cd1caa366e1d27c42Peter Qiu * @return list of {@link OsuProvider} 1039e78c25e970a4bfebbcb25e6cd1caa366e1d27c42Peter Qiu * @throws UnsupportedOperationException if Passpoint is not enabled on the device. 1040e78c25e970a4bfebbcb25e6cd1caa366e1d27c42Peter Qiu * @hide 1041e78c25e970a4bfebbcb25e6cd1caa366e1d27c42Peter Qiu */ 1042e78c25e970a4bfebbcb25e6cd1caa366e1d27c42Peter Qiu public List<OsuProvider> getMatchingOsuProviders(ScanResult scanResult) { 1043e78c25e970a4bfebbcb25e6cd1caa366e1d27c42Peter Qiu try { 1044e78c25e970a4bfebbcb25e6cd1caa366e1d27c42Peter Qiu return mService.getMatchingOsuProviders(scanResult); 1045e78c25e970a4bfebbcb25e6cd1caa366e1d27c42Peter Qiu } catch (RemoteException e) { 1046e78c25e970a4bfebbcb25e6cd1caa366e1d27c42Peter Qiu throw e.rethrowFromSystemServer(); 1047e78c25e970a4bfebbcb25e6cd1caa366e1d27c42Peter Qiu } 1048e78c25e970a4bfebbcb25e6cd1caa366e1d27c42Peter Qiu } 1049e78c25e970a4bfebbcb25e6cd1caa366e1d27c42Peter Qiu 1050e78c25e970a4bfebbcb25e6cd1caa366e1d27c42Peter Qiu /** 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a new network description to the set of configured networks. 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The {@code networkId} field of the supplied configuration object 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is ignored. 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p/> 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The new network will be marked DISABLED by default. To enable it, 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * called {@link #enableNetwork}. 1057227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param config the set of variables that describe the configuration, 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * contained in a {@link WifiConfiguration} object. 10606862d2f6c6b99177de9f92b22a9d6da1253358e4Glen Kuhne * If the {@link WifiConfiguration} has an Http Proxy set 10616862d2f6c6b99177de9f92b22a9d6da1253358e4Glen Kuhne * the calling app must be System, or be provisioned as the Profile or Device Owner. 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the ID of the newly created network description. This is used in 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * other operations to specified the network to be acted upon. 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns {@code -1} on failure. 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int addNetwork(WifiConfiguration config) { 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (config == null) { 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.networkId = -1; 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return addOrUpdateNetwork(config); 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Update the network description of an existing configured network. 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param config the set of variables that describe the configuration, 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * contained in a {@link WifiConfiguration} object. It may 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be sparse, so that only the items that are being changed 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are non-<code>null</code>. The {@code networkId} field 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * must be set to the ID of the existing network being updated. 10826862d2f6c6b99177de9f92b22a9d6da1253358e4Glen Kuhne * If the {@link WifiConfiguration} has an Http Proxy set 10836862d2f6c6b99177de9f92b22a9d6da1253358e4Glen Kuhne * the calling app must be System, or be provisioned as the Profile or Device Owner. 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns the {@code networkId} of the supplied 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@code WifiConfiguration} on success. 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <br/> 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns {@code -1} on failure, including when the {@code networkId} 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * field of the {@code WifiConfiguration} does not refer to an 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * existing network. 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int updateNetwork(WifiConfiguration config) { 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (config == null || config.networkId < 0) { 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return addOrUpdateNetwork(config); 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Internal method for doing the RPC that creates a new network description 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or updates an existing one. 1101227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param config The possibly sparse object containing the variables that 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are to set or updated in the network description. 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the ID of the network on success, {@code -1} on failure. 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int addOrUpdateNetwork(WifiConfiguration config) { 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.addOrUpdateNetwork(config); 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 1110c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 111590eb89ed06e26c64d8b3a622060b6186016b4a71Peter Qiu * Add or update a Passpoint configuration. The configuration provides a credential 111601894d8f6b661362cab36e6a997053fd078101a2Peter Qiu * for connecting to Passpoint networks that are operated by the Passpoint 111701894d8f6b661362cab36e6a997053fd078101a2Peter Qiu * service provider specified in the configuration. 111801894d8f6b661362cab36e6a997053fd078101a2Peter Qiu * 111901894d8f6b661362cab36e6a997053fd078101a2Peter Qiu * Each configuration is uniquely identified by its FQDN (Fully Qualified Domain 112090eb89ed06e26c64d8b3a622060b6186016b4a71Peter Qiu * Name). In the case when there is an existing configuration with the same 112190eb89ed06e26c64d8b3a622060b6186016b4a71Peter Qiu * FQDN, the new configuration will replace the existing configuration. 112201894d8f6b661362cab36e6a997053fd078101a2Peter Qiu * 112301894d8f6b661362cab36e6a997053fd078101a2Peter Qiu * @param config The Passpoint configuration to be added 1124e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu * @throws IllegalArgumentException if configuration is invalid 1125e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu * @throws UnsupportedOperationException if Passpoint is not enabled on the device. 112601894d8f6b661362cab36e6a997053fd078101a2Peter Qiu */ 11273efd531e2f610ed5e9a29fe945a5fffeb5d2b989Peter Qiu public void addOrUpdatePasspointConfiguration(PasspointConfiguration config) { 112801894d8f6b661362cab36e6a997053fd078101a2Peter Qiu try { 11293efd531e2f610ed5e9a29fe945a5fffeb5d2b989Peter Qiu if (!mService.addOrUpdatePasspointConfiguration(config)) { 11303efd531e2f610ed5e9a29fe945a5fffeb5d2b989Peter Qiu throw new IllegalArgumentException(); 11313efd531e2f610ed5e9a29fe945a5fffeb5d2b989Peter Qiu } 113201894d8f6b661362cab36e6a997053fd078101a2Peter Qiu } catch (RemoteException e) { 113301894d8f6b661362cab36e6a997053fd078101a2Peter Qiu throw e.rethrowFromSystemServer(); 113401894d8f6b661362cab36e6a997053fd078101a2Peter Qiu } 113501894d8f6b661362cab36e6a997053fd078101a2Peter Qiu } 113601894d8f6b661362cab36e6a997053fd078101a2Peter Qiu 113701894d8f6b661362cab36e6a997053fd078101a2Peter Qiu /** 113890eb89ed06e26c64d8b3a622060b6186016b4a71Peter Qiu * Remove the Passpoint configuration identified by its FQDN (Fully Qualified Domain Name). 113901894d8f6b661362cab36e6a997053fd078101a2Peter Qiu * 11406bbc8955c17ed44f63ddbf78d0e4d24b60ac05cdPeter Qiu * @param fqdn The FQDN of the Passpoint configuration to be removed 1141e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu * @throws IllegalArgumentException if no configuration is associated with the given FQDN. 1142e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu * @throws UnsupportedOperationException if Passpoint is not enabled on the device. 114301894d8f6b661362cab36e6a997053fd078101a2Peter Qiu */ 11443efd531e2f610ed5e9a29fe945a5fffeb5d2b989Peter Qiu public void removePasspointConfiguration(String fqdn) { 114501894d8f6b661362cab36e6a997053fd078101a2Peter Qiu try { 11463efd531e2f610ed5e9a29fe945a5fffeb5d2b989Peter Qiu if (!mService.removePasspointConfiguration(fqdn)) { 11473efd531e2f610ed5e9a29fe945a5fffeb5d2b989Peter Qiu throw new IllegalArgumentException(); 11483efd531e2f610ed5e9a29fe945a5fffeb5d2b989Peter Qiu } 114901894d8f6b661362cab36e6a997053fd078101a2Peter Qiu } catch (RemoteException e) { 115001894d8f6b661362cab36e6a997053fd078101a2Peter Qiu throw e.rethrowFromSystemServer(); 115101894d8f6b661362cab36e6a997053fd078101a2Peter Qiu } 115201894d8f6b661362cab36e6a997053fd078101a2Peter Qiu } 115301894d8f6b661362cab36e6a997053fd078101a2Peter Qiu 115401894d8f6b661362cab36e6a997053fd078101a2Peter Qiu /** 115501894d8f6b661362cab36e6a997053fd078101a2Peter Qiu * Return the list of installed Passpoint configurations. 115601894d8f6b661362cab36e6a997053fd078101a2Peter Qiu * 115790eb89ed06e26c64d8b3a622060b6186016b4a71Peter Qiu * An empty list will be returned when no configurations are installed. 115890eb89ed06e26c64d8b3a622060b6186016b4a71Peter Qiu * 115990eb89ed06e26c64d8b3a622060b6186016b4a71Peter Qiu * @return A list of {@link PasspointConfiguration} 1160e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu * @throws UnsupportedOperationException if Passpoint is not enabled on the device. 116101894d8f6b661362cab36e6a997053fd078101a2Peter Qiu */ 116201894d8f6b661362cab36e6a997053fd078101a2Peter Qiu public List<PasspointConfiguration> getPasspointConfigurations() { 116301894d8f6b661362cab36e6a997053fd078101a2Peter Qiu try { 116401894d8f6b661362cab36e6a997053fd078101a2Peter Qiu return mService.getPasspointConfigurations(); 116501894d8f6b661362cab36e6a997053fd078101a2Peter Qiu } catch (RemoteException e) { 116601894d8f6b661362cab36e6a997053fd078101a2Peter Qiu throw e.rethrowFromSystemServer(); 116701894d8f6b661362cab36e6a997053fd078101a2Peter Qiu } 116801894d8f6b661362cab36e6a997053fd078101a2Peter Qiu } 116901894d8f6b661362cab36e6a997053fd078101a2Peter Qiu 117001894d8f6b661362cab36e6a997053fd078101a2Peter Qiu /** 117116034c69033cbb5d973bb10a6bc265de0d03060dPeter Qiu * Query for a Hotspot 2.0 release 2 OSU icon file. An {@link #ACTION_PASSPOINT_ICON} intent 1172ed1fc64efda22f3defb3a174b8823756aecefffePeter Qiu * will be broadcasted once the request is completed. The presence of the intent extra 1173ed1fc64efda22f3defb3a174b8823756aecefffePeter Qiu * {@link #EXTRA_ICON} will indicate the result of the request. 1174ed1fc64efda22f3defb3a174b8823756aecefffePeter Qiu * A missing intent extra {@link #EXTRA_ICON} will indicate a failure. 11754f5c0ccfda77864544c96ff6a9689410aff4f05dPeter Qiu * 1176a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande * @param bssid The BSSID of the AP 117716034c69033cbb5d973bb10a6bc265de0d03060dPeter Qiu * @param fileName Name of the icon file (remote file) to query from the AP 1178ff323d3ce91ae159be9c23221dda33cbb3efb796Peter Qiu * 1179e5850517c493b24982cff8c32c7fb32a8203f5b6Peter Qiu * @throws UnsupportedOperationException if Passpoint is not enabled on the device. 1180ff323d3ce91ae159be9c23221dda33cbb3efb796Peter Qiu * @hide 1181a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande */ 1182a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande public void queryPasspointIcon(long bssid, String fileName) { 1183a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande try { 1184a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande mService.queryPasspointIcon(bssid, fileName); 1185a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande } catch (RemoteException e) { 1186c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 1187a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande } 1188a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande } 1189a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande 1190a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande /** 1191a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande * Match the currently associated network against the SP matching the given FQDN 1192a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande * @param fqdn FQDN of the SP 1193a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande * @return ordinal [HomeProvider, RoamingProvider, Incomplete, None, Declined] 1194a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande * @hide 1195a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande */ 1196a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande public int matchProviderWithCurrentNetwork(String fqdn) { 1197a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande try { 1198a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande return mService.matchProviderWithCurrentNetwork(fqdn); 1199a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande } catch (RemoteException e) { 1200c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 1201a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande } 1202a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande } 1203a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande 1204a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande /** 1205a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande * Deauthenticate and set the re-authentication hold off time for the current network 1206a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande * @param holdoff hold off time in milliseconds 1207a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande * @param ess set if the hold off pertains to an ESS rather than a BSS 1208a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande * @hide 1209a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande */ 1210a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande public void deauthenticateNetwork(long holdoff, boolean ess) { 1211a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande try { 1212a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande mService.deauthenticateNetwork(holdoff, ess); 1213a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande } catch (RemoteException e) { 1214c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 1215a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande } 1216a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande } 1217a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande 1218a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande /** 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Remove the specified network from the list of configured networks. 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This may result in the asynchronous delivery of state change 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * events. 1222fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius * 1223fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius * Applications are not allowed to remove networks created by other 1224fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius * applications. 1225fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius * 1226fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius * @param netId the ID of the network as returned by {@link #addNetwork} or {@link 1227fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius * #getConfiguredNetworks}. 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded 12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean removeNetwork(int netId) { 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.removeNetwork(netId); 12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 1234c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Allow a previously configured network to be associated with. If 1240fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius * <code>attemptConnect</code> is true, an attempt to connect to the selected 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * network is initiated. This may result in the asynchronous delivery 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of state change events. 12431022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * <p> 12441022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * <b>Note:</b> If an application's target SDK version is 1245976f044b2b3eff2ce968e3ea59022414180c268dLorenzo Colitti * {@link android.os.Build.VERSION_CODES#LOLLIPOP} or newer, network 12461022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * communication may not use Wi-Fi even if Wi-Fi is connected; traffic may 12471022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * instead be sent through another network, such as cellular data, 12481022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * Bluetooth tethering, or Ethernet. For example, traffic will never use a 12491022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * Wi-Fi network that does not provide Internet access (e.g. a wireless 12501022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * printer), if another network that does offer Internet access (e.g. 12511022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * cellular data) is available. Applications that need to ensure that their 12521022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * network traffic uses Wi-Fi should use APIs such as 12531022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * {@link Network#bindSocket(java.net.Socket)}, 12541022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * {@link Network#openConnection(java.net.URL)}, or 12551022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * {@link ConnectivityManager#bindProcessToNetwork} to do so. 12561022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti * 1257fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius * Applications are not allowed to enable networks created by other 1258fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius * applications. 1259fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius * 1260fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius * @param netId the ID of the network as returned by {@link #addNetwork} or {@link 1261fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius * #getConfiguredNetworks}. 1262fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius * @param attemptConnect The way to select a particular network to connect to is specify 1263fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius * {@code true} for this parameter. 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1266fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius public boolean enableNetwork(int netId, boolean attemptConnect) { 1267fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius final boolean pin = attemptConnect && mTargetSdkVersion < Build.VERSION_CODES.LOLLIPOP; 12681022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti if (pin) { 1269531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti NetworkRequest request = new NetworkRequest.Builder() 1270531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti .clearCapabilities() 1271531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) 1272531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti .build(); 1273531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti NetworkPinner.pin(mContext, request); 12741022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti } 12751022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti 12761022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti boolean success; 12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1278fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius success = mService.enableNetwork(netId, attemptConnect); 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 1280c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 12811022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti } 12821022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti 12831022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti if (pin && !success) { 1284531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti NetworkPinner.unpin(); 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12861022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti 12871022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti return success; 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Disable a configured network. The specified network will not be 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a candidate for associating. This may result in the asynchronous 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * delivery of state change events. 1294fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius * 1295fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius * Applications are not allowed to disable networks created by other 1296fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius * applications. 1297fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius * 1298fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius * @param netId the ID of the network as returned by {@link #addNetwork} or {@link 1299fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius * #getConfiguredNetworks}. 13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded 13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean disableNetwork(int netId) { 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.disableNetwork(netId); 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 1306c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Disassociate from the currently active access point. This may result 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the asynchronous delivery of state change events. 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean disconnect() { 13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1317e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff mService.disconnect(); 1318e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff return true; 13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 1320c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reconnect to the currently active access point, if we are currently 13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * disconnected. This may result in the asynchronous delivery of state 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * change events. 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean reconnect() { 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1332e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff mService.reconnect(); 1333e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff return true; 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 1335c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reconnect to the currently active access point, even if we are already 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * connected. This may result in the asynchronous delivery of state 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * change events. 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean reassociate() { 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1347e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff mService.reassociate(); 1348e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff return true; 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 1350c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Check that the supplicant daemon is responding to requests. 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if we were able to communicate with the supplicant and 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it returned the expected response to the PING message. 1358fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius * @deprecated Will return the output of {@link #isWifiEnabled()} instead. 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1360fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius @Deprecated 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean pingSupplicant() { 1362fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius return isWifiEnabled(); 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 136573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 136673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_INFRA = 0x0001; // Basic infrastructure mode 136773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 136873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_INFRA_5G = 0x0002; // Support for 5 GHz Band 136973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 137073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_PASSPOINT = 0x0004; // Support for GAS/ANQP 137173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 137273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_P2P = 0x0008; // Wifi-Direct 137373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 137473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_MOBILE_HOTSPOT = 0x0010; // Soft AP 137573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 137673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_SCANNER = 0x0020; // WifiScanner APIs 137773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 1378438643b1518be4e52399ef87d91451868f089461Randy Pan public static final int WIFI_FEATURE_AWARE = 0x0040; // Wi-Fi AWare networking 137973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 138073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_D2D_RTT = 0x0080; // Device-to-device RTT 138173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 138273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_D2AP_RTT = 0x0100; // Device-to-AP RTT 138373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 138473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_BATCH_SCAN = 0x0200; // Batched Scan (deprecated) 138573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 138673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_PNO = 0x0400; // Preferred network offload 138773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 138873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_ADDITIONAL_STA = 0x0800; // Support for two STAs 138973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 139073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_TDLS = 0x1000; // Tunnel directed link setup 139173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 139273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_TDLS_OFFCHANNEL = 0x2000; // Support for TDLS off channel 139373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** @hide */ 139473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static final int WIFI_FEATURE_EPR = 0x4000; // Enhanced power reporting 1395ddfd35dbf9aab0ff196e1d7046ebe6bcd972c7a5Pierre Vandwalle /** @hide */ 1396438643b1518be4e52399ef87d91451868f089461Randy Pan public static final int WIFI_FEATURE_AP_STA = 0x8000; // AP STA Concurrency 1397ddfd35dbf9aab0ff196e1d7046ebe6bcd972c7a5Pierre Vandwalle /** @hide */ 1398438643b1518be4e52399ef87d91451868f089461Randy Pan public static final int WIFI_FEATURE_LINK_LAYER_STATS = 0x10000; // Link layer stats collection 1399ddfd35dbf9aab0ff196e1d7046ebe6bcd972c7a5Pierre Vandwalle /** @hide */ 1400438643b1518be4e52399ef87d91451868f089461Randy Pan public static final int WIFI_FEATURE_LOGGER = 0x20000; // WiFi Logger 1401ddfd35dbf9aab0ff196e1d7046ebe6bcd972c7a5Pierre Vandwalle /** @hide */ 1402438643b1518be4e52399ef87d91451868f089461Randy Pan public static final int WIFI_FEATURE_HAL_EPNO = 0x40000; // Enhanced PNO 1403438643b1518be4e52399ef87d91451868f089461Randy Pan /** @hide */ 1404438643b1518be4e52399ef87d91451868f089461Randy Pan public static final int WIFI_FEATURE_RSSI_MONITOR = 0x80000; // RSSI Monitor 1405438643b1518be4e52399ef87d91451868f089461Randy Pan /** @hide */ 1406438643b1518be4e52399ef87d91451868f089461Randy Pan public static final int WIFI_FEATURE_MKEEP_ALIVE = 0x100000; // mkeep_alive 1407438643b1518be4e52399ef87d91451868f089461Randy Pan /** @hide */ 1408438643b1518be4e52399ef87d91451868f089461Randy Pan public static final int WIFI_FEATURE_CONFIG_NDO = 0x200000; // ND offload 1409438643b1518be4e52399ef87d91451868f089461Randy Pan /** @hide */ 1410438643b1518be4e52399ef87d91451868f089461Randy Pan public static final int WIFI_FEATURE_TRANSMIT_POWER = 0x400000; // Capture transmit power 1411438643b1518be4e52399ef87d91451868f089461Randy Pan /** @hide */ 1412438643b1518be4e52399ef87d91451868f089461Randy Pan public static final int WIFI_FEATURE_CONTROL_ROAMING = 0x800000; // Control firmware roaming 1413438643b1518be4e52399ef87d91451868f089461Randy Pan /** @hide */ 1414438643b1518be4e52399ef87d91451868f089461Randy Pan public static final int WIFI_FEATURE_IE_WHITELIST = 0x1000000; // Probe IE white listing 1415438643b1518be4e52399ef87d91451868f089461Randy Pan /** @hide */ 1416438643b1518be4e52399ef87d91451868f089461Randy Pan public static final int WIFI_FEATURE_SCAN_RAND = 0x2000000; // Random MAC & Probe seq 1417aa85acc8e0395344c5d00abb3d5d64e24031a296Roshan Pius /** @hide */ 1418aa85acc8e0395344c5d00abb3d5d64e24031a296Roshan Pius public static final int WIFI_FEATURE_TX_POWER_LIMIT = 0x4000000; // Set Tx power limit 1419438643b1518be4e52399ef87d91451868f089461Randy Pan 142073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 142173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande private int getSupportedFeatures() { 142273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande try { 142373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return mService.getSupportedFeatures(); 142473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } catch (RemoteException e) { 1425c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 142673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 142773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 142873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 142973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande private boolean isFeatureSupported(int feature) { 143073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return (getSupportedFeatures() & feature) == feature; 143173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 143273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 143373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports 5 GHz band 143473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 143573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean is5GHzBandSupported() { 143673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_INFRA_5G); 143773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 143873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 143973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 14406bbc8955c17ed44f63ddbf78d0e4d24b60ac05cdPeter Qiu * @return true if this adapter supports Passpoint 144173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 144273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 144373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isPasspointSupported() { 144473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_PASSPOINT); 144573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 144673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 144773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 144873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports WifiP2pManager (Wi-Fi Direct) 144973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 145073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isP2pSupported() { 145173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_P2P); 145273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 145373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 145473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 145573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports portable Wi-Fi hotspot 145673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 145773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 145873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande @SystemApi 145973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isPortableHotspotSupported() { 146073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_MOBILE_HOTSPOT); 146173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 146273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 146373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 146473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports WifiScanner APIs 146573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 146673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 146773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande @SystemApi 146873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isWifiScannerSupported() { 146973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_SCANNER); 147073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 147173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 147273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 147373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports Neighbour Awareness Network APIs 147428035d98f0c57867709c2304b6f1a13b4d634babEtan Cohen * @hide 147573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 14760849ded00879dc05175c079011aa038c5ba0770aEtan Cohen public boolean isWifiAwareSupported() { 14770849ded00879dc05175c079011aa038c5ba0770aEtan Cohen return isFeatureSupported(WIFI_FEATURE_AWARE); 147873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 147973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 148073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 148173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports Device-to-device RTT 148273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 148373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 148473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande @SystemApi 148573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isDeviceToDeviceRttSupported() { 148673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_D2D_RTT); 148773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 148873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 148973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 149073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports Device-to-AP RTT 149173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 149273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande @SystemApi 149373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isDeviceToApRttSupported() { 149473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_D2AP_RTT); 149573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 149673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 149773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 149873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports offloaded connectivity scan 149973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 150073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isPreferredNetworkOffloadSupported() { 150173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_PNO); 150273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 150373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 150473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 150573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports multiple simultaneous connections 150673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 150773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 150873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isAdditionalStaSupported() { 150973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_ADDITIONAL_STA); 151073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 151173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 151273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 151373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports Tunnel Directed Link Setup 151473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 151573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isTdlsSupported() { 151673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_TDLS); 151773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 151873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 151973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 152073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports Off Channel Tunnel Directed Link Setup 152173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 152273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 152373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isOffChannelTdlsSupported() { 152473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande return isFeatureSupported(WIFI_FEATURE_TDLS_OFFCHANNEL); 152573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 152673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 152773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 152873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return true if this adapter supports advanced power/performance counters 152973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 153073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public boolean isEnhancedPowerReportingSupported() { 1531ddfd35dbf9aab0ff196e1d7046ebe6bcd972c7a5Pierre Vandwalle return isFeatureSupported(WIFI_FEATURE_LINK_LAYER_STATS); 153273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 153373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 153473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 153573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * Return the record of {@link WifiActivityEnergyInfo} object that 153673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * has the activity and energy info. This can be used to ascertain what 153773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * the controller has been up to, since the last sample. 153873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @param updateType Type of info, cached vs refreshed. 153973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * 154073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @return a record with {@link WifiActivityEnergyInfo} or null if 154173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * report is unavailable or unsupported 154273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 154373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 154473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public WifiActivityEnergyInfo getControllerActivityEnergyInfo(int updateType) { 154573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande if (mService == null) return null; 154673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande try { 154773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande synchronized(this) { 15489a568e6f2f69cc923bbfc1ffb07c2f194acdb981Mitchell Wills return mService.reportActivityInfo(); 154973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 155073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } catch (RemoteException e) { 1551c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 155273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 155373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 155473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 1555738803fee62a98f244250996380820c4923e7f7bYuhao Zheng /** 15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Request a scan for access points. Returns immediately. The availability 15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the results is made known later by means of an asynchronous event sent 15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on completion of the scan. 15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded, i.e., the scan was initiated 15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1561a5ec95cdb1a7d2024249277dff1f99d0046c9b56Mike Lockwood public boolean startScan() { 1562cdbffa986dfa0a26ebcde6409f0131754889c88fWei Wang return startScan(null); 15636942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie } 15646942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie 15656942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie /** @hide */ 1566c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie @SystemApi 1567d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) 15686942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie public boolean startScan(WorkSource workSource) { 15696942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie try { 1570cdbffa986dfa0a26ebcde6409f0131754889c88fWei Wang String packageName = mContext.getOpPackageName(); 1571cdbffa986dfa0a26ebcde6409f0131754889c88fWei Wang mService.startScan(null, workSource, packageName); 1572738803fee62a98f244250996380820c4923e7f7bYuhao Zheng return true; 1573738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } catch (RemoteException e) { 1574c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 1575738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } 1576738803fee62a98f244250996380820c4923e7f7bYuhao Zheng } 1577738803fee62a98f244250996380820c4923e7f7bYuhao Zheng 1578738803fee62a98f244250996380820c4923e7f7bYuhao Zheng /** 1579da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle * startLocationRestrictedScan() 1580da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle * Trigger a scan which will not make use of DFS channels and is thus not suitable for 1581da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle * establishing wifi connection. 158288d93cd68a32e7110f9328ff522226126c7e493eMitchell Wills * @deprecated This API is nolonger supported. 158388d93cd68a32e7110f9328ff522226126c7e493eMitchell Wills * Use {@link android.net.wifi.WifiScanner} API 1584da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle * @hide 15858478911f5e9b066e2f68cdbeea9164d860be53a2Jeff Sharkey * @removed 1586da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle */ 158788d93cd68a32e7110f9328ff522226126c7e493eMitchell Wills @Deprecated 1588da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle @SystemApi 1589d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey @SuppressLint("Doclava125") 1590da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle public boolean startLocationRestrictedScan(WorkSource workSource) { 159188d93cd68a32e7110f9328ff522226126c7e493eMitchell Wills return false; 15920451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } 15930451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt 15940451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt /** 15950451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * Check if the Batched Scan feature is supported. 15960451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * 15970451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @return false if not supported. 159888d93cd68a32e7110f9328ff522226126c7e493eMitchell Wills * @deprecated This API is nolonger supported. 159988d93cd68a32e7110f9328ff522226126c7e493eMitchell Wills * Use {@link android.net.wifi.WifiScanner} API 16000451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @hide 16018478911f5e9b066e2f68cdbeea9164d860be53a2Jeff Sharkey * @removed 16020451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt */ 160388d93cd68a32e7110f9328ff522226126c7e493eMitchell Wills @Deprecated 1604c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie @SystemApi 1605d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey @SuppressLint("Doclava125") 16060451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt public boolean isBatchedScanSupported() { 160788d93cd68a32e7110f9328ff522226126c7e493eMitchell Wills return false; 16080451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt } 16090451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt 16100451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt /** 16110451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * Retrieve the latest batched scan result. This should be called immediately after 16120451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * {@link BATCHED_SCAN_RESULTS_AVAILABLE_ACTION} is received. 161388d93cd68a32e7110f9328ff522226126c7e493eMitchell Wills * @deprecated This API is nolonger supported. 161488d93cd68a32e7110f9328ff522226126c7e493eMitchell Wills * Use {@link android.net.wifi.WifiScanner} API 16150451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt * @hide 16168478911f5e9b066e2f68cdbeea9164d860be53a2Jeff Sharkey * @removed 16170451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt */ 161888d93cd68a32e7110f9328ff522226126c7e493eMitchell Wills @Deprecated 1619c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie @SystemApi 1620d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey @SuppressLint("Doclava125") 16210451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt public List<BatchedScanResult> getBatchedScanResults() { 162288d93cd68a32e7110f9328ff522226126c7e493eMitchell Wills return null; 16238e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt } 16248e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt 16258e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt /** 1626e50a607a35669090f9b3174a1e0d7b7869b6fc63Amin Shaikh * Creates a configuration token describing the current network of MIME type 1627e50a607a35669090f9b3174a1e0d7b7869b6fc63Amin Shaikh * application/vnd.wfa.wsc. Can be used to configure WiFi networks via NFC. 1628b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales * 1629e50a607a35669090f9b3174a1e0d7b7869b6fc63Amin Shaikh * @return hex-string encoded configuration token or null if there is no current network 1630b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales * @hide 1631b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales */ 1632e50a607a35669090f9b3174a1e0d7b7869b6fc63Amin Shaikh public String getCurrentNetworkWpsNfcConfigurationToken() { 1633b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales try { 1634e50a607a35669090f9b3174a1e0d7b7869b6fc63Amin Shaikh return mService.getCurrentNetworkWpsNfcConfigurationToken(); 1635b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales } catch (RemoteException e) { 1636c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 1637b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales } 1638b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales } 1639b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales 1640b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales /** 16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return dynamic information about the current Wi-Fi connection, if any is active. 1642e42dd31b3f656f33be99fd37f26e07557d163b54Michael Plass * <p> 1643e42dd31b3f656f33be99fd37f26e07557d163b54Michael Plass * In the connected state, access to the SSID and BSSID requires 1644e42dd31b3f656f33be99fd37f26e07557d163b54Michael Plass * the same permissions as {@link #getScanResults}. If such access is not allowed, 1645e42dd31b3f656f33be99fd37f26e07557d163b54Michael Plass * {@link WifiInfo#getSSID} will return {@code "<unknown ssid>"} and 1646e42dd31b3f656f33be99fd37f26e07557d163b54Michael Plass * {@link WifiInfo#getBSSID} will return {@code "02:00:00:00:00:00"}. 1647e42dd31b3f656f33be99fd37f26e07557d163b54Michael Plass * 16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the Wi-Fi information, contained in {@link WifiInfo}. 16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public WifiInfo getConnectionInfo() { 16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1652c55e27a5cd6d3bef1e9914ae74eaf66328949dc4Tony Mak return mService.getConnectionInfo(mContext.getOpPackageName()); 16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 1654c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the results of the latest access point scan. 1660cb13aebfec313a3433ed0f53cc2e3b6dbaf888d0Fyodor Kupolov * @return the list of access points found in the most recent scan. An app must hold 1661cb13aebfec313a3433ed0f53cc2e3b6dbaf888d0Fyodor Kupolov * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION ACCESS_COARSE_LOCATION} or 1662959991b957fb58672aef17c46a7662941f138e19Fyodor Kupolov * {@link android.Manifest.permission#ACCESS_FINE_LOCATION ACCESS_FINE_LOCATION} permission 1663ed9297991a922b88a00c04d034c172c18d550ac1Paul Stewart * in order to get valid results. If there is a remote exception (e.g., either a communication 1664ed9297991a922b88a00c04d034c172c18d550ac1Paul Stewart * problem with the system service or an exception within the framework) an empty list will be 1665ed9297991a922b88a00c04d034c172c18d550ac1Paul Stewart * returned. 16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public List<ScanResult> getScanResults() { 16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 166995d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn return mService.getScanResults(mContext.getOpPackageName()); 16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 1671c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16761ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * Check if scanning is always available. 16771ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * 16781ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * If this return {@code true}, apps can issue {@link #startScan} and fetch scan results 16791ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * even when Wi-Fi is turned off. 16801ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * 16811ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff * To change this setting, see {@link #ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE}. 16821ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff */ 16837ea33eac4b57aabf9326d60f52e3ed85217ac846Irfan Sheriff public boolean isScanAlwaysAvailable() { 16841ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff try { 16857ea33eac4b57aabf9326d60f52e3ed85217ac846Irfan Sheriff return mService.isScanAlwaysAvailable(); 16861ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff } catch (RemoteException e) { 1687c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 16881ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff } 16891ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff } 16901ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff 16911ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff /** 1692fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius * Tell the device to persist the current list of configured networks. 16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Note: It is possible for this method to change the network IDs of 16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * existing networks. You should assume the network IDs can be different 16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * after calling this method. 1697227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded 1699fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius * @deprecated There is no need to call this method - 1700fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius * {@link #addNetwork(WifiConfiguration)}, {@link #updateNetwork(WifiConfiguration)} 1701fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius * and {@link #removeNetwork(int)} already persist the configurations automatically. 17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1703fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius @Deprecated 17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean saveConfiguration() { 17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.saveConfiguration(); 17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 1708c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1713ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff * Set the country code. 1714ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff * @param countryCode country code in ISO 3166 format. 1715ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff * @param persist {@code true} if this needs to be remembered 17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1717ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff * @hide 17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1719ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff public void setCountryCode(String country, boolean persist) { 17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1721ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff mService.setCountryCode(country, persist); 1722c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey } catch (RemoteException e) { 1723c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 1724c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey } 17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1728b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe * get the country code. 1729b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe * @return the country code in ISO 3166 format. 1730b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe * 1731b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe * @hide 1732b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe */ 1733b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe public String getCountryCode() { 1734b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe try { 1735b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe String country = mService.getCountryCode(); 1736c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey return country; 1737b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe } catch (RemoteException e) { 1738c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 1739b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe } 1740b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe } 1741b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe 1742b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe /** 174336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * Check if the chipset supports dual frequency band (2.4 GHz and 5 GHz) 174436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @return {@code true} if supported, {@code false} otherwise. 174536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff * @hide 174636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff */ 174736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff public boolean isDualBandSupported() { 174836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff try { 174936f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff return mService.isDualBandSupported(); 175036f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } catch (RemoteException e) { 1751c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 175236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } 175336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff } 175436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff 175536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff /** 17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the DHCP-assigned addresses from the last successful DHCP request, 17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if any. 17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the DHCP information 17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public DhcpInfo getDhcpInfo() { 17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.getDhcpInfo(); 17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 1764c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Enable or disable Wi-Fi. 17701cd6db44f236fe8951a70ea757bbad393d7b434aRebecca Silberstein * 17711cd6db44f236fe8951a70ea757bbad393d7b434aRebecca Silberstein * Note: This method will return false if wifi cannot be enabled (e.g., an incompatible mode 17721cd6db44f236fe8951a70ea757bbad393d7b434aRebecca Silberstein * where the user has enabled tethering or Airplane Mode). 17731cd6db44f236fe8951a70ea757bbad393d7b434aRebecca Silberstein * 17741cd6db44f236fe8951a70ea757bbad393d7b434aRebecca Silberstein * Applications need to have the {@link android.Manifest.permission#CHANGE_WIFI_STATE} 17751cd6db44f236fe8951a70ea757bbad393d7b434aRebecca Silberstein * permission to toggle wifi. Callers without the permissions will trigger a 17761cd6db44f236fe8951a70ea757bbad393d7b434aRebecca Silberstein * {@link java.lang.SecurityException}. 17771cd6db44f236fe8951a70ea757bbad393d7b434aRebecca Silberstein * 17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param enabled {@code true} to enable, {@code false} to disable. 17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeds (or if the existing state 17801cd6db44f236fe8951a70ea757bbad393d7b434aRebecca Silberstein * is the same as the requested state). False if wifi cannot be toggled on/off when the 17811cd6db44f236fe8951a70ea757bbad393d7b434aRebecca Silberstein * request is made. 17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean setWifiEnabled(boolean enabled) { 17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 17856c3032f16bd97d8137dc90ec8dce47842a4a9c20Svetoslav Ganov return mService.setWifiEnabled(mContext.getOpPackageName(), enabled); 17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 1787c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets the Wi-Fi enabled state. 17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return One of {@link #WIFI_STATE_DISABLED}, 17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #WIFI_STATE_DISABLING}, {@link #WIFI_STATE_ENABLED}, 17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #WIFI_STATE_ENABLING}, {@link #WIFI_STATE_UNKNOWN} 17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isWifiEnabled() 17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getWifiState() { 17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mService.getWifiEnabledState(); 18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 1802c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1805227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1807227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * Return whether Wi-Fi is enabled or disabled. 18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if Wi-Fi is enabled 18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getWifiState() 18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isWifiEnabled() { 18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getWifiState() == WIFI_STATE_ENABLED; 18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1814227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1816f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * Return TX packet counter, for CTS test of WiFi watchdog. 1817f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * @param listener is the interface to receive result 1818f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * 1819f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * @hide for CTS test only 1820f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng */ 1821f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public void getTxPacketCount(TxPacketCountListener listener) { 182275f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart getChannel().sendMessage(RSSI_PKTCNT_FETCH, 0, putListener(listener)); 1823f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng } 1824f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng 1825f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** 18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Calculates the level of the signal. This should be used any time a signal 18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is being shown. 1828227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rssi The power of the signal measured in RSSI. 18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param numLevels The number of levels to consider in the calculated 18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * level. 18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A level of the signal, given in the range of 0 to numLevels-1 18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (both inclusive). 18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static int calculateSignalLevel(int rssi, int numLevels) { 18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (rssi <= MIN_RSSI) { 18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (rssi >= MAX_RSSI) { 18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return numLevels - 1; 18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 18414c0d81b8add0372cc7194b17cc6d2bfc58baacd1Daniel Sandler float inputRange = (MAX_RSSI - MIN_RSSI); 18424c0d81b8add0372cc7194b17cc6d2bfc58baacd1Daniel Sandler float outputRange = (numLevels - 1); 18434c0d81b8add0372cc7194b17cc6d2bfc58baacd1Daniel Sandler return (int)((float)(rssi - MIN_RSSI) * outputRange / inputRange); 18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1846227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Compares two signal strengths. 1849227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rssiA The power of the first signal measured in RSSI. 18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rssiB The power of the second signal measured in RSSI. 18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns <0 if the first signal is weaker than the second signal, 18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 0 if the two signals have the same strength, and >0 if the first 18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * signal is stronger than the second signal. 18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static int compareSignalLevel(int rssiA, int rssiB) { 18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return rssiA - rssiB; 18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1861e6edaa9ea190a6e1bedb21332d1e0aa93d68aeffRebecca Silberstein * This call is deprecated and removed. It is no longer used to 18628cc4eb79d23948a2954308be95b6324897fd8961Rebecca Silberstein * start WiFi Tethering. Please use {@link ConnectivityManager#startTethering(int, boolean, 18638cc4eb79d23948a2954308be95b6324897fd8961Rebecca Silberstein * ConnectivityManager#OnStartTetheringCallback)} if 18648cc4eb79d23948a2954308be95b6324897fd8961Rebecca Silberstein * the caller has proper permissions. Callers can also use the LocalOnlyHotspot feature for a 18658cc4eb79d23948a2954308be95b6324897fd8961Rebecca Silberstein * hotspot capable of communicating with co-located devices {@link 18668cc4eb79d23948a2954308be95b6324897fd8961Rebecca Silberstein * WifiManager#startLocalOnlyHotspot(LocalOnlyHotspotCallback)}. 18678cc4eb79d23948a2954308be95b6324897fd8961Rebecca Silberstein * 18685321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @param wifiConfig SSID, security and channel details as 18695321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * part of WifiConfiguration 18708cc4eb79d23948a2954308be95b6324897fd8961Rebecca Silberstein * @return {@code false} 18715321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 1872b625377b1a9b324254fcde9928eade4473712486Jeremy Klein * @hide 1873e6edaa9ea190a6e1bedb21332d1e0aa93d68aeffRebecca Silberstein * @deprecated This API is nolonger supported. 1874e6edaa9ea190a6e1bedb21332d1e0aa93d68aeffRebecca Silberstein * @removed 18755321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 1876b625377b1a9b324254fcde9928eade4473712486Jeremy Klein @SystemApi 1877e6edaa9ea190a6e1bedb21332d1e0aa93d68aeffRebecca Silberstein @Deprecated 1878d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) 18795321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff public boolean setWifiApEnabled(WifiConfiguration wifiConfig, boolean enabled) { 18808cc4eb79d23948a2954308be95b6324897fd8961Rebecca Silberstein String packageName = mContext.getOpPackageName(); 18818cc4eb79d23948a2954308be95b6324897fd8961Rebecca Silberstein 18828cc4eb79d23948a2954308be95b6324897fd8961Rebecca Silberstein Log.w(TAG, packageName + " attempted call to setWifiApEnabled: enabled = " + enabled); 18838cc4eb79d23948a2954308be95b6324897fd8961Rebecca Silberstein return false; 18845321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } 18855321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff 18865321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 1887720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein * Call allowing ConnectivityService to update WifiService with interface mode changes. 1888720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein * 1889720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein * The possible modes include: {@link IFACE_IP_MODE_TETHERED}, 1890720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein * {@link IFACE_IP_MODE_LOCAL_ONLY}, 1891720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein * {@link IFACE_IP_MODE_CONFIGURATION_ERROR} 1892720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein * 1893720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein * @param ifaceName String name of the updated interface 1894720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein * @param mode int representing the new mode 1895720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein * 1896720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein * @hide 1897720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein */ 1898720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein public void updateInterfaceIpState(String ifaceName, int mode) { 1899720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein try { 1900720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein mService.updateInterfaceIpState(ifaceName, mode); 1901720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein } catch (RemoteException e) { 1902720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein throw e.rethrowFromSystemServer(); 1903720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein } 1904720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein } 1905720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein 1906720cac453670f851c9ee1550efe45892e0c304e0Rebecca Silberstein /** 190742ae52899fbbbb7ffc958be1092a383f1283d19eRebecca Silberstein * Start SoftAp mode with the specified configuration. 190842ae52899fbbbb7ffc958be1092a383f1283d19eRebecca Silberstein * Note that starting in access point mode disables station 190942ae52899fbbbb7ffc958be1092a383f1283d19eRebecca Silberstein * mode operation 191042ae52899fbbbb7ffc958be1092a383f1283d19eRebecca Silberstein * @param wifiConfig SSID, security and channel details as 191142ae52899fbbbb7ffc958be1092a383f1283d19eRebecca Silberstein * part of WifiConfiguration 191242ae52899fbbbb7ffc958be1092a383f1283d19eRebecca Silberstein * @return {@code true} if the operation succeeds, {@code false} otherwise 191342ae52899fbbbb7ffc958be1092a383f1283d19eRebecca Silberstein * 191442ae52899fbbbb7ffc958be1092a383f1283d19eRebecca Silberstein * @hide 191542ae52899fbbbb7ffc958be1092a383f1283d19eRebecca Silberstein */ 191642ae52899fbbbb7ffc958be1092a383f1283d19eRebecca Silberstein public boolean startSoftAp(@Nullable WifiConfiguration wifiConfig) { 191742ae52899fbbbb7ffc958be1092a383f1283d19eRebecca Silberstein try { 191842ae52899fbbbb7ffc958be1092a383f1283d19eRebecca Silberstein return mService.startSoftAp(wifiConfig); 191942ae52899fbbbb7ffc958be1092a383f1283d19eRebecca Silberstein } catch (RemoteException e) { 192042ae52899fbbbb7ffc958be1092a383f1283d19eRebecca Silberstein throw e.rethrowFromSystemServer(); 192142ae52899fbbbb7ffc958be1092a383f1283d19eRebecca Silberstein } 192242ae52899fbbbb7ffc958be1092a383f1283d19eRebecca Silberstein } 192342ae52899fbbbb7ffc958be1092a383f1283d19eRebecca Silberstein 192442ae52899fbbbb7ffc958be1092a383f1283d19eRebecca Silberstein /** 192542ae52899fbbbb7ffc958be1092a383f1283d19eRebecca Silberstein * Stop SoftAp mode. 192642ae52899fbbbb7ffc958be1092a383f1283d19eRebecca Silberstein * Note that stopping softap mode will restore the previous wifi mode. 192742ae52899fbbbb7ffc958be1092a383f1283d19eRebecca Silberstein * @return {@code true} if the operation succeeds, {@code false} otherwise 192842ae52899fbbbb7ffc958be1092a383f1283d19eRebecca Silberstein * 192942ae52899fbbbb7ffc958be1092a383f1283d19eRebecca Silberstein * @hide 193042ae52899fbbbb7ffc958be1092a383f1283d19eRebecca Silberstein */ 193142ae52899fbbbb7ffc958be1092a383f1283d19eRebecca Silberstein public boolean stopSoftAp() { 193242ae52899fbbbb7ffc958be1092a383f1283d19eRebecca Silberstein try { 193342ae52899fbbbb7ffc958be1092a383f1283d19eRebecca Silberstein return mService.stopSoftAp(); 193442ae52899fbbbb7ffc958be1092a383f1283d19eRebecca Silberstein } catch (RemoteException e) { 193542ae52899fbbbb7ffc958be1092a383f1283d19eRebecca Silberstein throw e.rethrowFromSystemServer(); 193642ae52899fbbbb7ffc958be1092a383f1283d19eRebecca Silberstein } 193742ae52899fbbbb7ffc958be1092a383f1283d19eRebecca Silberstein } 193842ae52899fbbbb7ffc958be1092a383f1283d19eRebecca Silberstein 193942ae52899fbbbb7ffc958be1092a383f1283d19eRebecca Silberstein /** 19405adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * Request a local only hotspot that an application can use to communicate between co-located 19415adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * devices connected to the created WiFi hotspot. The network created by this method will not 19425adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * have Internet access. Each application can make a single request for the hotspot, but 19435adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * multiple applications could be requesting the hotspot at the same time. When multiple 19445adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * applications have successfully registered concurrently, they will be sharing the underlying 19455adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * hotspot. {@link LocalOnlyHotspotCallback#onStarted(LocalOnlyHotspotReservation)} is called 19465adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * when the hotspot is ready for use by the application. 19475adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * <p> 19485adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * Each application can make a single active call to this method. The {@link 19495adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * LocalOnlyHotspotCallback#onStarted(LocalOnlyHotspotReservation)} callback supplies the 19505adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * requestor with a {@link LocalOnlyHotspotReservation} that contains a 19515adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * {@link WifiConfiguration} with the SSID, security type and credentials needed to connect 19525adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * to the hotspot. Communicating this information is up to the application. 19535adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * <p> 19545adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * If the LocalOnlyHotspot cannot be created, the {@link LocalOnlyHotspotCallback#onFailed(int)} 19555adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * method will be called. Example failures include errors bringing up the network or if 19565adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * there is an incompatible operating mode. For example, if the user is currently using Wifi 19575adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * Tethering to provide an upstream to another device, LocalOnlyHotspot will not start due to 19585adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * an incompatible mode. The possible error codes include: 19595adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * {@link LocalOnlyHotspotCallback#ERROR_NO_CHANNEL}, 19606d7b130e23b8ca411b05eff39653a34929107e4dRebecca Silberstein * {@link LocalOnlyHotspotCallback#ERROR_GENERIC}, 19616d7b130e23b8ca411b05eff39653a34929107e4dRebecca Silberstein * {@link LocalOnlyHotspotCallback#ERROR_INCOMPATIBLE_MODE} and 19626d7b130e23b8ca411b05eff39653a34929107e4dRebecca Silberstein * {@link LocalOnlyHotspotCallback#ERROR_TETHERING_DISALLOWED}. 19635adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * <p> 19645adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * Internally, requests will be tracked to prevent the hotspot from being torn down while apps 19655adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * are still using it. The {@link LocalOnlyHotspotReservation} object passed in the {@link 19665adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * LocalOnlyHotspotCallback#onStarted(LocalOnlyHotspotReservation)} call should be closed when 19675adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * the LocalOnlyHotspot is no longer needed using {@link LocalOnlyHotspotReservation#close()}. 19685adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * Since the hotspot may be shared among multiple applications, removing the final registered 19695adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * application request will trigger the hotspot teardown. This means that applications should 19705adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * not listen to broadcasts containing wifi state to determine if the hotspot was stopped after 19715adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * they are done using it. Additionally, once {@link LocalOnlyHotspotReservation#close()} is 19725adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * called, applications will not receive callbacks of any kind. 19735adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * <p> 19745adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * Applications should be aware that the user may also stop the LocalOnlyHotspot through the 19755adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * Settings UI; it is not guaranteed to stay up as long as there is a requesting application. 19765adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * The requestors will be notified of this case via 19775adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * {@link LocalOnlyHotspotCallback#onStopped()}. Other cases may arise where the hotspot is 19785adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * torn down (Emergency mode, etc). Application developers should be aware that it can stop 19795adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * unexpectedly, but they will receive a notification if they have properly registered. 19805adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * <p> 19815adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * Applications should also be aware that this network will be shared with other applications. 19825adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * Applications are responsible for protecting their data on this network (e.g., TLS). 19835adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * <p> 19845adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * Applications need to have the following permissions to start LocalOnlyHotspot: {@link 19855adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * android.Manifest.permission#CHANGE_WIFI_STATE} and {@link 19865adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * android.Manifest.permission#ACCESS_COARSE_LOCATION ACCESS_COARSE_LOCATION}. Callers without 19875adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * the permissions will trigger a {@link java.lang.SecurityException}. 19885adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * <p> 19895adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * @param callback LocalOnlyHotspotCallback for the application to receive updates about 19905adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * operating status. 19915adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * @param handler Handler to be used for callbacks. If the caller passes a null Handler, the 19925adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * main thread will be used. 19935adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein */ 19945adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein public void startLocalOnlyHotspot(LocalOnlyHotspotCallback callback, 19955adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein @Nullable Handler handler) { 1996ce74fc29b0247443199671d89d6bda58bb399a13Rebecca Silberstein synchronized (mLock) { 1997ce74fc29b0247443199671d89d6bda58bb399a13Rebecca Silberstein Looper looper = (handler == null) ? mContext.getMainLooper() : handler.getLooper(); 1998ce74fc29b0247443199671d89d6bda58bb399a13Rebecca Silberstein LocalOnlyHotspotCallbackProxy proxy = 1999ce74fc29b0247443199671d89d6bda58bb399a13Rebecca Silberstein new LocalOnlyHotspotCallbackProxy(this, looper, callback); 2000ce74fc29b0247443199671d89d6bda58bb399a13Rebecca Silberstein try { 2001967dfb4451d8dea42bba250fb17caa7b840764a4Rebecca Silberstein String packageName = mContext.getOpPackageName(); 2002967dfb4451d8dea42bba250fb17caa7b840764a4Rebecca Silberstein int returnCode = mService.startLocalOnlyHotspot( 2003967dfb4451d8dea42bba250fb17caa7b840764a4Rebecca Silberstein proxy.getMessenger(), new Binder(), packageName); 20046d7b130e23b8ca411b05eff39653a34929107e4dRebecca Silberstein if (returnCode != LocalOnlyHotspotCallback.REQUEST_REGISTERED) { 2005ce74fc29b0247443199671d89d6bda58bb399a13Rebecca Silberstein // Send message to the proxy to make sure we call back on the correct thread 20066d7b130e23b8ca411b05eff39653a34929107e4dRebecca Silberstein proxy.notifyFailed(returnCode); 2007ce74fc29b0247443199671d89d6bda58bb399a13Rebecca Silberstein return; 2008ce74fc29b0247443199671d89d6bda58bb399a13Rebecca Silberstein } 2009ce74fc29b0247443199671d89d6bda58bb399a13Rebecca Silberstein mLOHSCallbackProxy = proxy; 2010ce74fc29b0247443199671d89d6bda58bb399a13Rebecca Silberstein } catch (RemoteException e) { 2011ce74fc29b0247443199671d89d6bda58bb399a13Rebecca Silberstein throw e.rethrowFromSystemServer(); 2012ce74fc29b0247443199671d89d6bda58bb399a13Rebecca Silberstein } 2013ce74fc29b0247443199671d89d6bda58bb399a13Rebecca Silberstein } 20145adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein } 20155adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein 20165adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein /** 20175adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * Cancels a pending local only hotspot request. This can be used by the calling application to 20185adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * cancel the existing request if the provided callback has not been triggered. Calling this 20195adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * method will be equivalent to closing the returned LocalOnlyHotspotReservation, but it is not 20205adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * explicitly required. 20215adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * <p> 20225adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * When cancelling this request, application developers should be aware that there may still be 20235adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * outstanding local only hotspot requests and the hotspot may still start, or continue running. 20245adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * Additionally, if a callback was registered, it will no longer be triggered after calling 20255adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * cancel. 20265adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * 20275adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * @hide 20285adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein */ 20295adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein public void cancelLocalOnlyHotspotRequest() { 2030ce74fc29b0247443199671d89d6bda58bb399a13Rebecca Silberstein synchronized (mLock) { 2031ce74fc29b0247443199671d89d6bda58bb399a13Rebecca Silberstein stopLocalOnlyHotspot(); 2032ce74fc29b0247443199671d89d6bda58bb399a13Rebecca Silberstein } 20335adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein } 20345adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein 20355adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein /** 20365adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * Method used to inform WifiService that the LocalOnlyHotspot is no longer needed. This 20375adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * method is used by WifiManager to release LocalOnlyHotspotReservations held by calling 20385adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * applications and removes the internal tracking for the hotspot request. When all requesting 20395adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * applications are finished using the hotspot, it will be stopped and WiFi will return to the 20405adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * previous operational mode. 20415adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * 20425adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * This method should not be called by applications. Instead, they should call the close() 20435adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * method on their LocalOnlyHotspotReservation. 20445adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein */ 20455adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein private void stopLocalOnlyHotspot() { 2046ce74fc29b0247443199671d89d6bda58bb399a13Rebecca Silberstein synchronized (mLock) { 2047ce74fc29b0247443199671d89d6bda58bb399a13Rebecca Silberstein if (mLOHSCallbackProxy == null) { 2048ce74fc29b0247443199671d89d6bda58bb399a13Rebecca Silberstein // nothing to do, the callback was already cleaned up. 2049ce74fc29b0247443199671d89d6bda58bb399a13Rebecca Silberstein return; 2050ce74fc29b0247443199671d89d6bda58bb399a13Rebecca Silberstein } 2051ce74fc29b0247443199671d89d6bda58bb399a13Rebecca Silberstein mLOHSCallbackProxy = null; 2052ce74fc29b0247443199671d89d6bda58bb399a13Rebecca Silberstein try { 2053ce74fc29b0247443199671d89d6bda58bb399a13Rebecca Silberstein mService.stopLocalOnlyHotspot(); 2054ce74fc29b0247443199671d89d6bda58bb399a13Rebecca Silberstein } catch (RemoteException e) { 2055ce74fc29b0247443199671d89d6bda58bb399a13Rebecca Silberstein throw e.rethrowFromSystemServer(); 2056ce74fc29b0247443199671d89d6bda58bb399a13Rebecca Silberstein } 2057ce74fc29b0247443199671d89d6bda58bb399a13Rebecca Silberstein } 20585adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein } 20595adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein 20605adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein /** 20615adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * Allow callers (Settings UI) to watch LocalOnlyHotspot state changes. Callers will 20625adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * receive a {@link LocalOnlyHotspotSubscription} object as a parameter of the 20635adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * {@link LocalOnlyHotspotObserver#onRegistered(LocalOnlyHotspotSubscription)}. The registered 20645adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * callers will receive the {@link LocalOnlyHotspotObserver#onStarted(WifiConfiguration)} and 20655adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * {@link LocalOnlyHotspotObserver#onStopped()} callbacks. 20665adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * <p> 20675adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * Applications should have the 20685adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION ACCESS_COARSE_LOCATION} 20695adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * permission. Callers without the permission will trigger a 20705adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * {@link java.lang.SecurityException}. 20715adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * <p> 20725adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * @param observer LocalOnlyHotspotObserver callback. 20735adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * @param handler Handler to use for callbacks 20745adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * 20755adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * @hide 20765adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein */ 20775adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein public void watchLocalOnlyHotspot(LocalOnlyHotspotObserver observer, 20785adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein @Nullable Handler handler) { 20794871da6b0715bf09b14fb593cfe112733d0c53efRebecca Silberstein synchronized (mLock) { 20804871da6b0715bf09b14fb593cfe112733d0c53efRebecca Silberstein Looper looper = (handler == null) ? mContext.getMainLooper() : handler.getLooper(); 20814871da6b0715bf09b14fb593cfe112733d0c53efRebecca Silberstein mLOHSObserverProxy = new LocalOnlyHotspotObserverProxy(this, looper, observer); 20824871da6b0715bf09b14fb593cfe112733d0c53efRebecca Silberstein try { 20834871da6b0715bf09b14fb593cfe112733d0c53efRebecca Silberstein mService.startWatchLocalOnlyHotspot( 20844871da6b0715bf09b14fb593cfe112733d0c53efRebecca Silberstein mLOHSObserverProxy.getMessenger(), new Binder()); 20854871da6b0715bf09b14fb593cfe112733d0c53efRebecca Silberstein mLOHSObserverProxy.registered(); 20864871da6b0715bf09b14fb593cfe112733d0c53efRebecca Silberstein } catch (RemoteException e) { 20874871da6b0715bf09b14fb593cfe112733d0c53efRebecca Silberstein mLOHSObserverProxy = null; 20884871da6b0715bf09b14fb593cfe112733d0c53efRebecca Silberstein throw e.rethrowFromSystemServer(); 20894871da6b0715bf09b14fb593cfe112733d0c53efRebecca Silberstein } 20904871da6b0715bf09b14fb593cfe112733d0c53efRebecca Silberstein } 20915adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein } 20925adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein 20935adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein /** 20945adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * Allow callers to stop watching LocalOnlyHotspot state changes. After calling this method, 20955adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * applications will no longer receive callbacks. 20965adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * 20975adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * @hide 20985adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein */ 20995adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein public void unregisterLocalOnlyHotspotObserver() { 21004871da6b0715bf09b14fb593cfe112733d0c53efRebecca Silberstein synchronized (mLock) { 21014871da6b0715bf09b14fb593cfe112733d0c53efRebecca Silberstein if (mLOHSObserverProxy == null) { 21024871da6b0715bf09b14fb593cfe112733d0c53efRebecca Silberstein // nothing to do, the callback was already cleaned up 21034871da6b0715bf09b14fb593cfe112733d0c53efRebecca Silberstein return; 21044871da6b0715bf09b14fb593cfe112733d0c53efRebecca Silberstein } 21054871da6b0715bf09b14fb593cfe112733d0c53efRebecca Silberstein mLOHSObserverProxy = null; 21064871da6b0715bf09b14fb593cfe112733d0c53efRebecca Silberstein try { 21074871da6b0715bf09b14fb593cfe112733d0c53efRebecca Silberstein mService.stopWatchLocalOnlyHotspot(); 21084871da6b0715bf09b14fb593cfe112733d0c53efRebecca Silberstein } catch (RemoteException e) { 21094871da6b0715bf09b14fb593cfe112733d0c53efRebecca Silberstein throw e.rethrowFromSystemServer(); 21104871da6b0715bf09b14fb593cfe112733d0c53efRebecca Silberstein } 21114871da6b0715bf09b14fb593cfe112733d0c53efRebecca Silberstein } 21125adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein } 21135adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein 21145adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein /** 21155321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Gets the Wi-Fi enabled state. 21165321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @return One of {@link #WIFI_AP_STATE_DISABLED}, 21175321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * {@link #WIFI_AP_STATE_DISABLING}, {@link #WIFI_AP_STATE_ENABLED}, 21185321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * {@link #WIFI_AP_STATE_ENABLING}, {@link #WIFI_AP_STATE_FAILED} 21195321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #isWifiApEnabled() 21205321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2121b625377b1a9b324254fcde9928eade4473712486Jeremy Klein * @hide 21225321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 2123b625377b1a9b324254fcde9928eade4473712486Jeremy Klein @SystemApi 2124bfc4fcde9f756337fc8d0867ff04549b08688fffJeff Sharkey @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) 21255321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff public int getWifiApState() { 21265321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff try { 21275321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff return mService.getWifiApEnabledState(); 21285321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } catch (RemoteException e) { 2129c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 21305321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } 21315321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } 21325321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff 21335321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 21345321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * Return whether Wi-Fi AP is enabled or disabled. 21355321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @return {@code true} if Wi-Fi AP is enabled 21365321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * @see #getWifiApState() 21375321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff * 2138b625377b1a9b324254fcde9928eade4473712486Jeremy Klein * @hide 21395321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff */ 2140b625377b1a9b324254fcde9928eade4473712486Jeremy Klein @SystemApi 2141bfc4fcde9f756337fc8d0867ff04549b08688fffJeff Sharkey @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) 21425321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff public boolean isWifiApEnabled() { 21435321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff return getWifiApState() == WIFI_AP_STATE_ENABLED; 21445321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff } 21455321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff 21465321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff /** 21479ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff * Gets the Wi-Fi AP Configuration. 21489ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff * @return AP details in WifiConfiguration 21499ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff * 2150b625377b1a9b324254fcde9928eade4473712486Jeremy Klein * @hide 21519ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff */ 2152b625377b1a9b324254fcde9928eade4473712486Jeremy Klein @SystemApi 2153bfc4fcde9f756337fc8d0867ff04549b08688fffJeff Sharkey @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) 21549ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff public WifiConfiguration getWifiApConfiguration() { 21559ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff try { 21569ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff return mService.getWifiApConfiguration(); 21579ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff } catch (RemoteException e) { 2158c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 21599ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff } 21609ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff } 21619ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff 21629ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff /** 216317b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff * Sets the Wi-Fi AP Configuration. 216417b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff * @return {@code true} if the operation succeeded, {@code false} otherwise 216517b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff * 2166b625377b1a9b324254fcde9928eade4473712486Jeremy Klein * @hide 216717b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff */ 2168b625377b1a9b324254fcde9928eade4473712486Jeremy Klein @SystemApi 2169bfc4fcde9f756337fc8d0867ff04549b08688fffJeff Sharkey @RequiresPermission(android.Manifest.permission.CHANGE_WIFI_STATE) 217017b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff public boolean setWifiApConfiguration(WifiConfiguration wifiConfig) { 217117b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff try { 217217b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff mService.setWifiApConfiguration(wifiConfig); 217317b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff return true; 217417b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff } catch (RemoteException e) { 2175c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 217617b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff } 217717b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff } 217817b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff 21790d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff /** 2180b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * Enable/Disable TDLS on a specific local route. 218164f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde * 2182b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * <p> 2183b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * TDLS enables two wireless endpoints to talk to each other directly 2184b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * without going through the access point that is managing the local 2185b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * network. It saves bandwidth and improves quality of the link. 2186b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * </p> 2187b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * <p> 2188b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * This API enables/disables the option of using TDLS. If enabled, the 2189b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * underlying hardware is free to use TDLS or a hop through the access 2190b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * point. If disabled, existing TDLS session is torn down and 2191b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * hardware is restricted to use access point for transferring wireless 2192b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * packets. Default value for all routes is 'disabled', meaning restricted 2193b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * to use access point for transferring packets. 2194b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * </p> 219564f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde * 219664f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde * @param remoteIPAddress IP address of the endpoint to setup TDLS with 219764f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde * @param enable true = setup and false = tear down TDLS 219864f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde */ 2199b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde public void setTdlsEnabled(InetAddress remoteIPAddress, boolean enable) { 220064f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde try { 220164f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde mService.enableTdls(remoteIPAddress.getHostAddress(), enable); 220264f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde } catch (RemoteException e) { 2203c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 220464f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde } 220564f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde } 220664f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde 220764f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde /** 2208b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * Similar to {@link #setTdlsEnabled(InetAddress, boolean) }, except 2209b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde * this version allows you to specify remote endpoint with a MAC address. 221064f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde * @param remoteMacAddress MAC address of the remote endpoint such as 00:00:0c:9f:f2:ab 221164f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde * @param enable true = setup and false = tear down TDLS 221264f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde */ 2213b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde public void setTdlsEnabledWithMacAddress(String remoteMacAddress, boolean enable) { 221464f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde try { 221564f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde mService.enableTdlsWithMacAddress(remoteMacAddress, enable); 221664f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde } catch (RemoteException e) { 2217c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 221864f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde } 221964f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde } 222064f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde 2221e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff /* TODO: deprecate synchronous API and open up the following API */ 2222ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 2223d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff private static final int BASE = Protocol.BASE_WIFI_MANAGER; 2224d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 2225ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff /* Commands to WifiService */ 2226ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff /** @hide */ 2227d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int CONNECT_NETWORK = BASE + 1; 2228d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 2229d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int CONNECT_NETWORK_FAILED = BASE + 2; 2230d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 2231d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int CONNECT_NETWORK_SUCCEEDED = BASE + 3; 2232d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 2233d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 2234d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int FORGET_NETWORK = BASE + 4; 2235d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 2236d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int FORGET_NETWORK_FAILED = BASE + 5; 2237ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff /** @hide */ 2238d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int FORGET_NETWORK_SUCCEEDED = BASE + 6; 2239d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 2240ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff /** @hide */ 2241d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int SAVE_NETWORK = BASE + 7; 2242ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff /** @hide */ 2243d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int SAVE_NETWORK_FAILED = BASE + 8; 22448dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy /** @hide */ 2245d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int SAVE_NETWORK_SUCCEEDED = BASE + 9; 2246ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 2247ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff /** @hide */ 2248d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int START_WPS = BASE + 10; 2249d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 2250d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int START_WPS_SUCCEEDED = BASE + 11; 2251d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 2252d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int WPS_FAILED = BASE + 12; 225386a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff /** @hide */ 2254d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public static final int WPS_COMPLETED = BASE + 13; 2255d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 2256d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 225786a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int CANCEL_WPS = BASE + 14; 225886a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff /** @hide */ 225986a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int CANCEL_WPS_FAILED = BASE + 15; 226086a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff /** @hide */ 226186a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int CANCEL_WPS_SUCCEDED = BASE + 16; 226286a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff 226386a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff /** @hide */ 226486a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int DISABLE_NETWORK = BASE + 17; 2265d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 226686a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int DISABLE_NETWORK_FAILED = BASE + 18; 2267d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** @hide */ 226886a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int DISABLE_NETWORK_SUCCEEDED = BASE + 19; 2269ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 2270f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** @hide */ 2271f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public static final int RSSI_PKTCNT_FETCH = BASE + 20; 2272f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** @hide */ 2273f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public static final int RSSI_PKTCNT_FETCH_SUCCEEDED = BASE + 21; 2274f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** @hide */ 2275f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public static final int RSSI_PKTCNT_FETCH_FAILED = BASE + 22; 2276f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng 2277d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 2278d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Passed with {@link ActionListener#onFailure}. 2279d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Indicates that the operation failed due to an internal error. 228073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 2281d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 228286a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int ERROR = 0; 2283d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 2284d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 2285d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Passed with {@link ActionListener#onFailure}. 2286d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Indicates that the operation is already in progress 228773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 2288d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 228986a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int IN_PROGRESS = 1; 2290d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 2291d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 2292d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Passed with {@link ActionListener#onFailure}. 2293d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Indicates that the operation failed because the framework is busy and 2294d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * unable to service the request 229573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 2296d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 229786a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int BUSY = 2; 2298d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 2299d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /* WPS specific errors */ 2300674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande /** WPS overlap detected */ 230186a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int WPS_OVERLAP_ERROR = 3; 2302674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande /** WEP on WPS is prohibited */ 230386a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int WPS_WEP_PROHIBITED = 4; 2304674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande /** TKIP only prohibited */ 230586a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int WPS_TKIP_ONLY_PROHIBITED = 5; 2306674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande /** Authentication failure on WPS */ 230786a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int WPS_AUTH_FAILURE = 6; 2308674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande /** WPS timed out */ 230986a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff public static final int WPS_TIMED_OUT = 7; 2310d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 231110652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde /** 231210652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde * Passed with {@link ActionListener#onFailure}. 231310652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde * Indicates that the operation failed due to invalid inputs 231473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 231510652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde */ 231610652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde public static final int INVALID_ARGS = 8; 231710652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde 2318ae81483a15bb3811cfc221970ea290599b43d4deSky Faber /** 2319ae81483a15bb3811cfc221970ea290599b43d4deSky Faber * Passed with {@link ActionListener#onFailure}. 2320ae81483a15bb3811cfc221970ea290599b43d4deSky Faber * Indicates that the operation failed due to user permissions. 2321ae81483a15bb3811cfc221970ea290599b43d4deSky Faber * @hide 2322ae81483a15bb3811cfc221970ea290599b43d4deSky Faber */ 2323ae81483a15bb3811cfc221970ea290599b43d4deSky Faber public static final int NOT_AUTHORIZED = 9; 2324ae81483a15bb3811cfc221970ea290599b43d4deSky Faber 232573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande /** 232673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * Interface for callback invocation on an application action 232773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * @hide 232873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande */ 232958ddbd76bb307f283c3fb06506da4a43a87f7c6aStephen Chen @SystemApi 2330d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public interface ActionListener { 2331d871e180f113ce9197bb558ca699ab3ada767cafNingyuan Wang /** 2332d871e180f113ce9197bb558ca699ab3ada767cafNingyuan Wang * The operation succeeded. 2333d871e180f113ce9197bb558ca699ab3ada767cafNingyuan Wang * This is called when the scan request has been validated and ready 2334d871e180f113ce9197bb558ca699ab3ada767cafNingyuan Wang * to sent to driver. 2335d871e180f113ce9197bb558ca699ab3ada767cafNingyuan Wang */ 2336d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public void onSuccess(); 2337d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 2338d871e180f113ce9197bb558ca699ab3ada767cafNingyuan Wang * The operation failed. 2339d871e180f113ce9197bb558ca699ab3ada767cafNingyuan Wang * This is called when the scan request failed. 2340d871e180f113ce9197bb558ca699ab3ada767cafNingyuan Wang * @param reason The reason for failure could be one of the following: 2341d871e180f113ce9197bb558ca699ab3ada767cafNingyuan Wang * {@link #REASON_INVALID_REQUEST}} is specified when scan request parameters are invalid. 2342d871e180f113ce9197bb558ca699ab3ada767cafNingyuan Wang * {@link #REASON_NOT_AUTHORIZED} is specified when requesting app doesn't have the required 2343d871e180f113ce9197bb558ca699ab3ada767cafNingyuan Wang * permission to request a scan. 2344d871e180f113ce9197bb558ca699ab3ada767cafNingyuan Wang * {@link #REASON_UNSPECIFIED} is specified when driver reports a scan failure. 2345d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 2346d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff public void onFailure(int reason); 2347d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 2348d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 2349674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande /** Interface for callback invocation on a start WPS action */ 235073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public static abstract class WpsCallback { 2351d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** WPS start succeeded */ 235273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public abstract void onStarted(String pin); 2353d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 2354e42dd31b3f656f33be99fd37f26e07557d163b54Michael Plass /** WPS operation completed successfully */ 235573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public abstract void onSucceeded(); 2356d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 2357d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 2358d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * WPS operation failed 2359d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param reason The reason for failure could be one of 236073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * {@link #WPS_TKIP_ONLY_PROHIBITED}, {@link #WPS_OVERLAP_ERROR}, 236173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * {@link #WPS_WEP_PROHIBITED}, {@link #WPS_TIMED_OUT} or {@link #WPS_AUTH_FAILURE} 236273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande * and some generic errors. 2363d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 236473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public abstract void onFailed(int reason); 2365d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 2366d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 2367f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** Interface for callback invocation on a TX packet count poll action {@hide} */ 2368f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public interface TxPacketCountListener { 2369f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** 2370f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * The operation succeeded 2371f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * @param count TX packet counter 2372f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng */ 2373f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public void onSuccess(int count); 2374f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng /** 2375f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * The operation failed 2376f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * @param reason The reason for failure could be one of 2377f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng * {@link #ERROR}, {@link #IN_PROGRESS} or {@link #BUSY} 2378f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng */ 2379f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng public void onFailure(int reason); 2380f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng } 2381f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng 23825adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein /** 23835adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * LocalOnlyHotspotReservation that contains the {@link WifiConfiguration} for the active 23845adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * LocalOnlyHotspot request. 23855adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * <p> 23865adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * Applications requesting LocalOnlyHotspot for sharing will receive an instance of the 23875adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * LocalOnlyHotspotReservation in the 23885adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * {@link LocalOnlyHotspotCallback#onStarted(LocalOnlyHotspotReservation)} call. This 23895adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * reservation contains the relevant {@link WifiConfiguration}. 23905adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * When an application is done with the LocalOnlyHotspot, they should call {@link 23915adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * LocalOnlyHotspotReservation#close()}. Once this happens, the application will not receive 23925adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * any further callbacks. If the LocalOnlyHotspot is stopped due to a 23935adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * user triggered mode change, applications will be notified via the {@link 23945adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * LocalOnlyHotspotCallback#onStopped()} callback. 23955adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein */ 23965adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein public class LocalOnlyHotspotReservation implements AutoCloseable { 23975adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein 23985adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein private final CloseGuard mCloseGuard = CloseGuard.get(); 23995adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein private final WifiConfiguration mConfig; 24005adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein 24015adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein /** @hide */ 24025adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein @VisibleForTesting 24035adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein public LocalOnlyHotspotReservation(WifiConfiguration config) { 24045adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein mConfig = config; 24055adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein mCloseGuard.open("close"); 24065adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein } 24075adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein 24086d7b130e23b8ca411b05eff39653a34929107e4dRebecca Silberstein public WifiConfiguration getWifiConfiguration() { 24095adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein return mConfig; 24105adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein } 24115adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein 24125adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein @Override 24135adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein public void close() { 24145adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein try { 24155adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein stopLocalOnlyHotspot(); 24165adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein mCloseGuard.close(); 24175adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein } catch (Exception e) { 24185adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein Log.e(TAG, "Failed to stop Local Only Hotspot."); 24195adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein } 24205adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein } 24215adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein 24225adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein @Override 24235adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein protected void finalize() throws Throwable { 24245adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein try { 24255adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein if (mCloseGuard != null) { 24265adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein mCloseGuard.warnIfOpen(); 24275adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein } 24285adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein close(); 24295adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein } finally { 24305adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein super.finalize(); 24315adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein } 24325adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein } 24335adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein } 24345adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein 24355adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein /** 24365adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * Callback class for applications to receive updates about the LocalOnlyHotspot status. 24375adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein */ 24385adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein public static class LocalOnlyHotspotCallback { 24396d7b130e23b8ca411b05eff39653a34929107e4dRebecca Silberstein /** @hide */ 24406d7b130e23b8ca411b05eff39653a34929107e4dRebecca Silberstein public static final int REQUEST_REGISTERED = 0; 24416d7b130e23b8ca411b05eff39653a34929107e4dRebecca Silberstein 24425adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein public static final int ERROR_NO_CHANNEL = 1; 24435adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein public static final int ERROR_GENERIC = 2; 24445adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein public static final int ERROR_INCOMPATIBLE_MODE = 3; 24456d7b130e23b8ca411b05eff39653a34929107e4dRebecca Silberstein public static final int ERROR_TETHERING_DISALLOWED = 4; 24465adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein 24475adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein /** LocalOnlyHotspot start succeeded. */ 24485adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein public void onStarted(LocalOnlyHotspotReservation reservation) {}; 24495adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein 24505adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein /** 24515adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * LocalOnlyHotspot stopped. 24525adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * <p> 24535adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * The LocalOnlyHotspot can be disabled at any time by the user. When this happens, 24545adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * applications will be notified that it was stopped. This will not be invoked when an 24555adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * application calls {@link LocalOnlyHotspotReservation#close()}. 24565adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein */ 24575adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein public void onStopped() {}; 24585adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein 24595adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein /** 24605adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * LocalOnlyHotspot failed to start. 24615adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * <p> 24625adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * Applications can attempt to call 24635adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * {@link WifiManager#startLocalOnlyHotspot(LocalOnlyHotspotCallback, Handler)} again at 24645adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * a later time. 24655adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * <p> 24666d7b130e23b8ca411b05eff39653a34929107e4dRebecca Silberstein * @param reason The reason for failure could be one of: {@link 24676d7b130e23b8ca411b05eff39653a34929107e4dRebecca Silberstein * #ERROR_TETHERING_DISALLOWED}, {@link #ERROR_INCOMPATIBLE_MODE}, 24685adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * {@link #ERROR_NO_CHANNEL}, or {@link #ERROR_GENERIC}. 24695adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein */ 24705adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein public void onFailed(int reason) { }; 24715adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein } 24725adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein 24735adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein /** 2474b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein * Callback proxy for LocalOnlyHotspotCallback objects. 2475b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein */ 2476b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein private static class LocalOnlyHotspotCallbackProxy { 2477b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein private final Handler mHandler; 2478b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein private final WeakReference<WifiManager> mWifiManager; 2479b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein private final Looper mLooper; 2480b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein private final Messenger mMessenger; 2481b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein 2482b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein /** 2483b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein * Constructs a {@link LocalOnlyHotspotCallback} using the specified looper. All callbacks 2484b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein * will be delivered on the thread of the specified looper. 2485b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein * 2486b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein * @param manager WifiManager 2487b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein * @param looper Looper for delivering callbacks 2488b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein * @param callback LocalOnlyHotspotCallback to notify the calling application. 2489b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein */ 2490b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein LocalOnlyHotspotCallbackProxy(WifiManager manager, Looper looper, 2491b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein final LocalOnlyHotspotCallback callback) { 2492b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein mWifiManager = new WeakReference<>(manager); 2493b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein mLooper = looper; 2494b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein 2495b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein mHandler = new Handler(looper) { 2496b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein @Override 2497b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein public void handleMessage(Message msg) { 2498b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein Log.d(TAG, "LocalOnlyHotspotCallbackProxy: handle message what: " 2499b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein + msg.what + " msg: " + msg); 2500b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein 2501b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein WifiManager manager = mWifiManager.get(); 2502b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein if (manager == null) { 2503b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein Log.w(TAG, "LocalOnlyHotspotCallbackProxy: handle message post GC"); 2504b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein return; 2505b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein } 2506b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein 2507b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein switch (msg.what) { 2508b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein case HOTSPOT_STARTED: 2509b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein WifiConfiguration config = (WifiConfiguration) msg.obj; 2510b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein if (config == null) { 2511b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein Log.e(TAG, "LocalOnlyHotspotCallbackProxy: config cannot be null."); 2512b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein callback.onFailed(LocalOnlyHotspotCallback.ERROR_GENERIC); 2513b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein return; 2514b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein } 2515b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein callback.onStarted(manager.new LocalOnlyHotspotReservation(config)); 2516b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein break; 2517b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein case HOTSPOT_STOPPED: 2518b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein Log.w(TAG, "LocalOnlyHotspotCallbackProxy: hotspot stopped"); 2519b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein callback.onStopped(); 2520b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein break; 2521b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein case HOTSPOT_FAILED: 2522b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein int reasonCode = msg.arg1; 2523b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein Log.w(TAG, "LocalOnlyHotspotCallbackProxy: failed to start. reason: " 2524b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein + reasonCode); 2525b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein callback.onFailed(reasonCode); 2526b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein Log.w(TAG, "done with the callback..."); 2527b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein break; 2528b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein default: 2529b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein Log.e(TAG, "LocalOnlyHotspotCallbackProxy unhandled message. type: " 2530b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein + msg.what); 2531b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein } 2532b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein } 2533b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein }; 2534b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein mMessenger = new Messenger(mHandler); 2535b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein } 2536b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein 2537b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein public Messenger getMessenger() { 2538b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein return mMessenger; 2539b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein } 2540b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein 2541b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein /** 2542b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein * Helper method allowing the the incoming application call to move the onFailed callback 2543b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein * over to the desired callback thread. 2544b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein * 2545b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein * @param reason int representing the error type 2546b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein */ 2547b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein public void notifyFailed(int reason) throws RemoteException { 2548b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein Message msg = Message.obtain(); 2549b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein msg.what = HOTSPOT_FAILED; 2550b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein msg.arg1 = reason; 2551b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein mMessenger.send(msg); 2552b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein } 2553b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein } 2554b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein 2555b1c4cb795c3fa62cac7fbee66d0dda5cee19b49dRebecca Silberstein /** 25565adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * LocalOnlyHotspotSubscription that is an AutoCloseable object for tracking applications 25575adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * watching for LocalOnlyHotspot changes. 25585adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * 25595adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * @hide 25605adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein */ 25615adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein public class LocalOnlyHotspotSubscription implements AutoCloseable { 25625adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein private final CloseGuard mCloseGuard = CloseGuard.get(); 25635adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein 2564b34ebbedcf3b20e0b5b2e06327fa51d6439e2f21Rebecca Silberstein /** @hide */ 25655adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein @VisibleForTesting 25665adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein public LocalOnlyHotspotSubscription() { 25675adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein mCloseGuard.open("close"); 25685adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein } 25695adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein 25705adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein @Override 25715adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein public void close() { 25725adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein try { 25735adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein unregisterLocalOnlyHotspotObserver(); 25745adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein mCloseGuard.close(); 25755adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein } catch (Exception e) { 25765adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein Log.e(TAG, "Failed to unregister LocalOnlyHotspotObserver."); 25775adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein } 25785adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein } 25795adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein 25805adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein @Override 25815adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein protected void finalize() throws Throwable { 25825adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein try { 25835adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein if (mCloseGuard != null) { 25845adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein mCloseGuard.warnIfOpen(); 25855adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein } 25865adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein close(); 25875adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein } finally { 25885adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein super.finalize(); 25895adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein } 25905adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein } 25915adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein } 25925adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein 25935adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein /** 25945adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * Class to notify calling applications that watch for changes in LocalOnlyHotspot of updates. 25955adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * 25965adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * @hide 25975adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein */ 25985adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein public static class LocalOnlyHotspotObserver { 25995adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein /** 26005adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * Confirm registration for LocalOnlyHotspotChanges by returning a 26015adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * LocalOnlyHotspotSubscription. 26025adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein */ 26035adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein public void onRegistered(LocalOnlyHotspotSubscription subscription) {}; 26045adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein 26055adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein /** 26065adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * LocalOnlyHotspot started with the supplied config. 26075adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein */ 26085adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein public void onStarted(WifiConfiguration config) {}; 26095adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein 26105adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein /** 26115adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein * LocalOnlyHotspot stopped. 26125adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein */ 26135adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein public void onStopped() {}; 26145adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein } 26155adbc3fb7d1b1fdf3919f25d70ff54ae78527e9eRebecca Silberstein 261654a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein /** 261754a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein * Callback proxy for LocalOnlyHotspotObserver objects. 261854a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein */ 261954a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein private static class LocalOnlyHotspotObserverProxy { 262054a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein private final Handler mHandler; 262154a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein private final WeakReference<WifiManager> mWifiManager; 262254a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein private final Looper mLooper; 262354a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein private final Messenger mMessenger; 262454a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein 262554a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein /** 262654a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein * Constructs a {@link LocalOnlyHotspotObserverProxy} using the specified looper. 262754a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein * All callbacks will be delivered on the thread of the specified looper. 262854a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein * 262954a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein * @param manager WifiManager 263054a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein * @param looper Looper for delivering callbacks 263154a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein * @param observer LocalOnlyHotspotObserver to notify the calling application. 263254a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein */ 263354a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein LocalOnlyHotspotObserverProxy(WifiManager manager, Looper looper, 263454a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein final LocalOnlyHotspotObserver observer) { 263554a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein mWifiManager = new WeakReference<>(manager); 263654a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein mLooper = looper; 263754a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein 263854a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein mHandler = new Handler(looper) { 263954a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein @Override 264054a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein public void handleMessage(Message msg) { 264154a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein Log.d(TAG, "LocalOnlyHotspotObserverProxy: handle message what: " 264254a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein + msg.what + " msg: " + msg); 264354a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein 264454a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein WifiManager manager = mWifiManager.get(); 264554a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein if (manager == null) { 264654a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein Log.w(TAG, "LocalOnlyHotspotObserverProxy: handle message post GC"); 264754a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein return; 264854a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein } 264954a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein 265054a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein switch (msg.what) { 265154a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein case HOTSPOT_OBSERVER_REGISTERED: 265254a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein observer.onRegistered(manager.new LocalOnlyHotspotSubscription()); 265354a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein break; 265454a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein case HOTSPOT_STARTED: 265554a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein WifiConfiguration config = (WifiConfiguration) msg.obj; 265654a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein if (config == null) { 265754a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein Log.e(TAG, "LocalOnlyHotspotObserverProxy: config cannot be null."); 265854a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein return; 265954a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein } 266054a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein observer.onStarted(config); 266154a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein break; 266254a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein case HOTSPOT_STOPPED: 266354a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein observer.onStopped(); 266454a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein break; 266554a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein default: 266654a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein Log.e(TAG, "LocalOnlyHotspotObserverProxy unhandled message. type: " 266754a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein + msg.what); 266854a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein } 266954a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein } 267054a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein }; 267154a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein mMessenger = new Messenger(mHandler); 267254a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein } 267354a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein 267454a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein public Messenger getMessenger() { 267554a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein return mMessenger; 267654a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein } 267754a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein 267854a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein public void registered() throws RemoteException { 267954a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein Message msg = Message.obtain(); 268054a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein msg.what = HOTSPOT_OBSERVER_REGISTERED; 268154a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein mMessenger.send(msg); 268254a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein } 268354a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein } 268454a540c04ace6b3f9c02adb3517f44970538eb15Rebecca Silberstein 2685a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart // Ensure that multiple ServiceHandler threads do not interleave message dispatch. 2686a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart private static final Object sServiceHandlerDispatchLock = new Object(); 2687a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart 2688a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart private class ServiceHandler extends Handler { 268988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff ServiceHandler(Looper looper) { 269088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff super(looper); 2691d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 2692d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 269388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff @Override 269488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void handleMessage(Message message) { 2695a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart synchronized (sServiceHandlerDispatchLock) { 2696a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart dispatchMessageToListeners(message); 2697a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart } 2698a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart } 2699a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart 2700a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart private void dispatchMessageToListeners(Message message) { 270188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff Object listener = removeListener(message.arg2); 270288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff switch (message.what) { 270388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED: 270488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (message.arg1 == AsyncChannel.STATUS_SUCCESSFUL) { 2705a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart mAsyncChannel.sendMessage(AsyncChannel.CMD_CHANNEL_FULL_CONNECTION); 270688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } else { 270788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff Log.e(TAG, "Failed to set up channel connection"); 270888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff // This will cause all further async API calls on the WifiManager 270988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff // to fail and throw an exception 2710a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart mAsyncChannel = null; 271188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 2712a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart mConnected.countDown(); 271388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 271488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED: 271588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff // Ignore 271688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 271788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case AsyncChannel.CMD_CHANNEL_DISCONNECTED: 271888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff Log.e(TAG, "Channel connection lost"); 271988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff // This will cause all further async API calls on the WifiManager 272088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff // to fail and throw an exception 2721a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart mAsyncChannel = null; 2722fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff getLooper().quit(); 272388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 272488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff /* ActionListeners grouped together */ 272588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.CONNECT_NETWORK_FAILED: 272688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.FORGET_NETWORK_FAILED: 272788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.SAVE_NETWORK_FAILED: 272888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.DISABLE_NETWORK_FAILED: 272988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener != null) { 273088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff ((ActionListener) listener).onFailure(message.arg1); 273188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 273288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 273388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff /* ActionListeners grouped together */ 273488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.CONNECT_NETWORK_SUCCEEDED: 273588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.FORGET_NETWORK_SUCCEEDED: 273688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.SAVE_NETWORK_SUCCEEDED: 273788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.DISABLE_NETWORK_SUCCEEDED: 273888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener != null) { 273988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff ((ActionListener) listener).onSuccess(); 274088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 274188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 274288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.START_WPS_SUCCEEDED: 274388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener != null) { 274488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff WpsResult result = (WpsResult) message.obj; 274573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande ((WpsCallback) listener).onStarted(result.pin); 274688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff //Listener needs to stay until completion or failure 2747a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart synchronized (mListenerMapLock) { 2748a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart mListenerMap.put(message.arg2, listener); 2749d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 275088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 275188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 275288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.WPS_COMPLETED: 275388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener != null) { 275473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande ((WpsCallback) listener).onSucceeded(); 275588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 275688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 275788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff case WifiManager.WPS_FAILED: 275888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener != null) { 275973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande ((WpsCallback) listener).onFailed(message.arg1); 276073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 276173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande break; 276273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande case WifiManager.CANCEL_WPS_SUCCEDED: 276373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande if (listener != null) { 276473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande ((WpsCallback) listener).onSucceeded(); 276573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande } 276673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande break; 276773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande case WifiManager.CANCEL_WPS_FAILED: 276873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande if (listener != null) { 276973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande ((WpsCallback) listener).onFailed(message.arg1); 277088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 2771f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng break; 2772f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng case WifiManager.RSSI_PKTCNT_FETCH_SUCCEEDED: 2773f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng if (listener != null) { 2774f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng RssiPacketCountInfo info = (RssiPacketCountInfo) message.obj; 2775f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng if (info != null) 2776f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng ((TxPacketCountListener) listener).onSuccess(info.txgood + info.txbad); 2777f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng else 2778f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng ((TxPacketCountListener) listener).onFailure(ERROR); 2779f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng } 2780f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng break; 2781f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng case WifiManager.RSSI_PKTCNT_FETCH_FAILED: 2782f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng if (listener != null) { 2783f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng ((TxPacketCountListener) listener).onFailure(message.arg1); 2784f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng } 278588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 278688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff default: 278788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff //ignore 278888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff break; 2789d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 2790d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 279188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 2792d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 2793a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart private int putListener(Object listener) { 279488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (listener == null) return INVALID_KEY; 279588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff int key; 2796a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart synchronized (mListenerMapLock) { 279788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff do { 2798a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart key = mListenerKey++; 279988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } while (key == INVALID_KEY); 2800a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart mListenerMap.put(key, listener); 2801d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 280288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff return key; 280388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 2804d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 2805a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart private Object removeListener(int key) { 280688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff if (key == INVALID_KEY) return null; 2807a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart synchronized (mListenerMapLock) { 2808a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart Object listener = mListenerMap.get(key); 2809a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart mListenerMap.remove(key); 281088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff return listener; 2811d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 2812d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 2813ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff 281475f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart private synchronized AsyncChannel getChannel() { 281575f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart if (mAsyncChannel == null) { 281675f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart Messenger messenger = getWifiServiceMessenger(); 281775f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart if (messenger == null) { 281875f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart throw new IllegalStateException( 281975f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart "getWifiServiceMessenger() returned null! This is invalid."); 282075f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart } 2821a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart 282275f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart mAsyncChannel = new AsyncChannel(); 282375f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart mConnected = new CountDownLatch(1); 282475f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart 2825bf8cbb05e085c4504685883f3dd564f200405beaPaul Stewart Handler handler = new ServiceHandler(mLooper); 282675f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart mAsyncChannel.connect(mContext, handler, messenger); 282775f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart try { 282875f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart mConnected.await(); 282975f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart } catch (InterruptedException e) { 283075f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart Log.e(TAG, "interrupted wait at init"); 283175f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart } 2832cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff } 283375f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart return mAsyncChannel; 283488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff } 283588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff 2836e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff /** 2837e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * Connect to a network with the given configuration. The network also 2838fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius * gets added to the list of configured networks for the foreground user. 2839e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 2840e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * For a new network, this function is used instead of a 2841e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * sequence of addNetwork(), enableNetwork(), saveConfiguration() and 2842e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * reconnect() 2843e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 2844e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @param config the set of variables that describe the configuration, 2845e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * contained in a {@link WifiConfiguration} object. 2846d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 284788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 284888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 284988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * 2850e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @hide 2851e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff */ 285258ddbd76bb307f283c3fb06506da4a43a87f7c6aStephen Chen @SystemApi 285388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void connect(WifiConfiguration config, ActionListener listener) { 2854d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (config == null) throw new IllegalArgumentException("config cannot be null"); 2855ab26407124cf861eacfe7bf0f2a1ef25f4b3a7bdIrfan Sheriff // Use INVALID_NETWORK_ID for arg1 when passing a config object 2856ab26407124cf861eacfe7bf0f2a1ef25f4b3a7bdIrfan Sheriff // arg1 is used to pass network id when the network already exists 285775f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart getChannel().sendMessage(CONNECT_NETWORK, WifiConfiguration.INVALID_NETWORK_ID, 285888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff putListener(listener), config); 2859e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff } 2860e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff 2861e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff /** 2862e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * Connect to a network with the given networkId. 2863e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 2864e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * This function is used instead of a enableNetwork(), saveConfiguration() and 2865e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * reconnect() 2866e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 2867fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius * @param networkId the ID of the network as returned by {@link #addNetwork} or {@link 2868fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius * getConfiguredNetworks}. 2869d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 287088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 287188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 2872e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @hide 2873e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff */ 287488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void connect(int networkId, ActionListener listener) { 2875d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (networkId < 0) throw new IllegalArgumentException("Network id cannot be negative"); 287675f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart getChannel().sendMessage(CONNECT_NETWORK, networkId, putListener(listener)); 2877e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff } 2878e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff 2879e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff /** 2880fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius * Save the given network to the list of configured networks for the 2881fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius * foreground user. If the network already exists, the configuration 2882fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius * is updated. Any new network is enabled by default. 2883e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 2884e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * For a new network, this function is used instead of a 2885e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * sequence of addNetwork(), enableNetwork() and saveConfiguration(). 2886e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 2887e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * For an existing network, it accomplishes the task of updateNetwork() 2888e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * and saveConfiguration() 2889e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 2890e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @param config the set of variables that describe the configuration, 2891e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * contained in a {@link WifiConfiguration} object. 2892d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 289388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 289488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 2895e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @hide 2896e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff */ 289788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void save(WifiConfiguration config, ActionListener listener) { 2898d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (config == null) throw new IllegalArgumentException("config cannot be null"); 289975f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart getChannel().sendMessage(SAVE_NETWORK, 0, putListener(listener), config); 2900e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff } 2901e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff 2902e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff /** 2903fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius * Delete the network from the list of configured networks for the 2904fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius * foreground user. 2905e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 2906e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * This function is used instead of a sequence of removeNetwork() 2907e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * and saveConfiguration(). 2908e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * 2909e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @param config the set of variables that describe the configuration, 2910e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * contained in a {@link WifiConfiguration} object. 2911d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 291288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 291388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 2914e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff * @hide 2915e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff */ 291688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void forget(int netId, ActionListener listener) { 2917d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (netId < 0) throw new IllegalArgumentException("Network id cannot be negative"); 291875f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart getChannel().sendMessage(FORGET_NETWORK, netId, putListener(listener)); 2919d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff } 2920d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff 2921d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff /** 2922d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * Disable network 2923d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * 2924d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param netId is the network Id 2925d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 292688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 292788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 2928d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @hide 2929d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff */ 293088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff public void disable(int netId, ActionListener listener) { 2931d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (netId < 0) throw new IllegalArgumentException("Network id cannot be negative"); 293275f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart getChannel().sendMessage(DISABLE_NETWORK, netId, putListener(listener)); 2933e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff } 2934e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff 293517b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff /** 293693e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle * Disable ephemeral Network 293793e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle * 293893e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle * @param SSID, in the format of WifiConfiguration's SSID. 293993e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle * @hide 294093e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle */ 294193e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle public void disableEphemeralNetwork(String SSID) { 294293e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle if (SSID == null) throw new IllegalArgumentException("SSID cannot be null"); 294393e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle try { 294493e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle mService.disableEphemeralNetwork(SSID); 294593e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle } catch (RemoteException e) { 2946c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 294793e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle } 294893e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle } 294993e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle 295093e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle /** 295102fb46a297c4f645f2a30b574151401dd0978521Irfan Sheriff * Start Wi-fi Protected Setup 29525ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff * 2953c3eb1556446c932b5674adc40af8ff9bfc3a1880Vinit Deshpande * @param config WPS configuration (does not support {@link WpsInfo#LABEL}) 2954d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff * @param listener for callbacks on success or failure. Can be null. 295588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 295688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 29575ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff */ 295873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public void startWps(WpsInfo config, WpsCallback listener) { 2959d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff if (config == null) throw new IllegalArgumentException("config cannot be null"); 296075f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart getChannel().sendMessage(START_WPS, 0, putListener(listener), config); 2961f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff } 2962f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff 2963f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff /** 296486a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff * Cancel any ongoing Wi-fi Protected Setup 296586a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff * 296686a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff * @param listener for callbacks on success or failure. Can be null. 296788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * @throws IllegalStateException if the WifiManager instance needs to be 296888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff * initialized again 296986a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff */ 297073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande public void cancelWps(WpsCallback listener) { 297175f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart getChannel().sendMessage(CANCEL_WPS, 0, putListener(listener)); 297286a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff } 297386a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff 297486a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff /** 2975227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * Get a reference to WifiService handler. This is used by a client to establish 2976227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * an AsyncChannel communication with WifiService 2977227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * 2978227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * @return Messenger pointing to the WifiService handler 2979227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * @hide 2980227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff */ 298107573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff public Messenger getWifiServiceMessenger() { 2982227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff try { 298307573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff return mService.getWifiServiceMessenger(); 2984227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff } catch (RemoteException e) { 2985c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 2986227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff } 2987227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff } 2988227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 298907573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff 299007573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff /** 29919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Allows an application to keep the Wi-Fi radio awake. 29929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Normally the Wi-Fi radio may turn off when the user has not used the device in a while. 2993227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * Acquiring a WifiLock will keep the radio on until the lock is released. Multiple 29949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * applications may hold WifiLocks, and the radio will only be allowed to turn off when no 29959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WifiLocks are held in any application. 2996d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * <p> 29979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Before using a WifiLock, consider carefully if your application requires Wi-Fi access, or 29989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * could function over a mobile network, if available. A program that needs to download large 29999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * files should hold a WifiLock to ensure that the download will complete, but a program whose 30009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * network usage is occasional or low-bandwidth should not hold a WifiLock to avoid adversely 30019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * affecting battery life. 3002d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * <p> 30039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Note that WifiLocks cannot override the user-level "Wi-Fi Enabled" setting, nor Airplane 30049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Mode. They simply keep the radio from turning off when Wi-Fi is already on but the device 30059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is idle. 3006d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * <p> 3007d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root * Any application using a WifiLock must request the {@code android.permission.WAKE_LOCK} 300871fbb81b14958b80fe55738607740c6630e4e9daNeil Fuller * permission in an {@code <uses-permission>} element of the application's manifest. 30099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 30109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public class WifiLock { 30119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mTag; 30129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final IBinder mBinder; 30139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mRefCount; 30149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLockType; 30159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mRefCounted; 30169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mHeld; 30177e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn private WorkSource mWorkSource; 30189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private WifiLock(int lockType, String tag) { 30209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTag = tag; 30219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLockType = lockType; 30229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBinder = new Binder(); 30239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRefCount = 0; 30249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRefCounted = true; 30259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeld = false; 30269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 30299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Locks the Wi-Fi radio on until {@link #release} is called. 30309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 30319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this WifiLock is reference-counted, each call to {@code acquire} will increment the 3032227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff * reference count, and the radio will remain locked as long as the reference count is 30339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * above zero. 30349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 30359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this WifiLock is not reference-counted, the first call to {@code acquire} will lock 30369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the radio, but subsequent calls will be ignored. Only one call to {@link #release} 30379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be required, regardless of the number of times that {@code acquire} is called. 30389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 30399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void acquire() { 30409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mBinder) { 30412c02da2bc62c4dfef684ea381be02a4e568b73d0Irfan Sheriff if (mRefCounted ? (++mRefCount == 1) : (!mHeld)) { 30429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 30437e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mService.acquireWifiLock(mBinder, mLockType, mTag, mWorkSource); 3044617750604c69e6068f68266d0e30324273aa990eMike Lockwood synchronized (WifiManager.this) { 3045617750604c69e6068f68266d0e30324273aa990eMike Lockwood if (mActiveLockCount >= MAX_ACTIVE_LOCKS) { 3046617750604c69e6068f68266d0e30324273aa990eMike Lockwood mService.releaseWifiLock(mBinder); 3047617750604c69e6068f68266d0e30324273aa990eMike Lockwood throw new UnsupportedOperationException( 3048617750604c69e6068f68266d0e30324273aa990eMike Lockwood "Exceeded maximum number of wifi locks"); 3049617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 3050617750604c69e6068f68266d0e30324273aa990eMike Lockwood mActiveLockCount++; 3051617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 3052c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey } catch (RemoteException e) { 3053c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 30549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeld = true; 30569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 30619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unlocks the Wi-Fi radio, allowing it to turn off when the device is idle. 30629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 30639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this WifiLock is reference-counted, each call to {@code release} will decrement the 30649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * reference count, and the radio will be unlocked only when the reference count reaches 30659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * zero. If the reference count goes below zero (that is, if {@code release} is called 30669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a greater number of times than {@link #acquire}), an exception is thrown. 30679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 30689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If this WifiLock is not reference-counted, the first call to {@code release} (after 30699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the radio was locked using {@link #acquire}) will unlock the radio, and subsequent 30709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * calls will be ignored. 30719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 30729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void release() { 30739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mBinder) { 30749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRefCounted ? (--mRefCount == 0) : (mHeld)) { 30759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 30769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.releaseWifiLock(mBinder); 3077617750604c69e6068f68266d0e30324273aa990eMike Lockwood synchronized (WifiManager.this) { 3078617750604c69e6068f68266d0e30324273aa990eMike Lockwood mActiveLockCount--; 3079617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 3080c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey } catch (RemoteException e) { 3081c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 30829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeld = false; 30849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRefCount < 0) { 30869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("WifiLock under-locked " + mTag); 30879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 30929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Controls whether this is a reference-counted or non-reference-counted WifiLock. 30939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 30949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reference-counted WifiLocks keep track of the number of calls to {@link #acquire} and 30959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #release}, and only allow the radio to sleep when every call to {@link #acquire} 30969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * has been balanced with a call to {@link #release}. Non-reference-counted WifiLocks 30979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * lock the radio whenever {@link #acquire} is called and it is unlocked, and unlock the 30989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * radio whenever {@link #release} is called and it is locked. 30999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 31009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param refCounted true if this WifiLock should keep a reference count 31019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 31029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setReferenceCounted(boolean refCounted) { 31039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRefCounted = refCounted; 31049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 31079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Checks whether this WifiLock is currently held. 31089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 31099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if this WifiLock is held, false otherwise 31109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 31119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isHeld() { 31129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mBinder) { 31139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mHeld; 31149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31177e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void setWorkSource(WorkSource ws) { 31187e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mBinder) { 31197e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (ws != null && ws.size() == 0) { 31207e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn ws = null; 31217e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 31227e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn boolean changed = true; 31237e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (ws == null) { 31247e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mWorkSource = null; 31257e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } else { 3126a31510e47a0f0c2525702c2f10a85064322a28f2David Christie ws.clearNames(); 3127a31510e47a0f0c2525702c2f10a85064322a28f2David Christie if (mWorkSource == null) { 3128a31510e47a0f0c2525702c2f10a85064322a28f2David Christie changed = mWorkSource != null; 3129a31510e47a0f0c2525702c2f10a85064322a28f2David Christie mWorkSource = new WorkSource(ws); 3130a31510e47a0f0c2525702c2f10a85064322a28f2David Christie } else { 3131a31510e47a0f0c2525702c2f10a85064322a28f2David Christie changed = mWorkSource.diff(ws); 3132a31510e47a0f0c2525702c2f10a85064322a28f2David Christie if (changed) { 3133a31510e47a0f0c2525702c2f10a85064322a28f2David Christie mWorkSource.set(ws); 3134a31510e47a0f0c2525702c2f10a85064322a28f2David Christie } 31357e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 31367e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 31377e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (changed && mHeld) { 31387e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn try { 31397e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mService.updateWifiLockWorkSource(mBinder, mWorkSource); 31407e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } catch (RemoteException e) { 3141c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 31427e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 31437e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 31447e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 31457e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 31467e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 31479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 31489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String s1, s2, s3; 31499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mBinder) { 31509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s1 = Integer.toHexString(System.identityHashCode(this)); 31519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s2 = mHeld ? "held; " : ""; 31529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRefCounted) { 31539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s3 = "refcounted: refcount = " + mRefCount; 31549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 31559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s3 = "not refcounted"; 31569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "WifiLock{ " + s1 + "; " + s2 + s3 + " }"; 31589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 31629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void finalize() throws Throwable { 31639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.finalize(); 31649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mBinder) { 31659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mHeld) { 31669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 31679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mService.releaseWifiLock(mBinder); 3168617750604c69e6068f68266d0e30324273aa990eMike Lockwood synchronized (WifiManager.this) { 3169617750604c69e6068f68266d0e30324273aa990eMike Lockwood mActiveLockCount--; 3170617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 3171c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey } catch (RemoteException e) { 3172c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 31739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 31809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates a new WifiLock. 31819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 31825876a4273e67271f0eca607af9520f7e5abbe4f3Irfan Sheriff * @param lockType the type of lock to create. See {@link #WIFI_MODE_FULL}, 3183652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * {@link #WIFI_MODE_FULL_HIGH_PERF} and {@link #WIFI_MODE_SCAN_ONLY} for 3184652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * descriptions of the types of Wi-Fi locks. 3185652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * @param tag a tag for the WifiLock to identify it in debugging messages. This string is 3186652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff * never shown to the user under normal conditions, but should be descriptive 31879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * enough to identify your application and the specific WifiLock within it, if it 31889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * holds multiple WifiLocks. 31899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 31909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a new, unacquired WifiLock with the given tag. 31919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 31929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see WifiLock 31939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 31949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public WifiLock createWifiLock(int lockType, String tag) { 31959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new WifiLock(lockType, tag); 31969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3197652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff 31989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 31999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates a new WifiLock. 32009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 32019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param tag a tag for the WifiLock to identify it in debugging messages. This string is 32029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * never shown to the user under normal conditions, but should be descriptive 32039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * enough to identify your application and the specific WifiLock within it, if it 32049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * holds multiple WifiLocks. 32059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 32069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a new, unacquired WifiLock with the given tag. 32079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 32089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see WifiLock 32099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 32109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public WifiLock createWifiLock(String tag) { 32119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new WifiLock(WIFI_MODE_FULL, tag); 32129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32135347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 3214fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 32155347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt /** 3216fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Create a new MulticastLock 32175347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt * 3218fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * @param tag a tag for the MulticastLock to identify it in debugging 321941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * messages. This string is never shown to the user under 322041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * normal conditions, but should be descriptive enough to 322141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * identify your application and the specific MulticastLock 322241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * within it, if it holds multiple MulticastLocks. 32235347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt * 3224fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * @return a new, unacquired MulticastLock with the given tag. 3225fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 3226fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * @see MulticastLock 32275347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt */ 3228fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public MulticastLock createMulticastLock(String tag) { 3229fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt return new MulticastLock(tag); 32305347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 32315347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 32325347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt /** 3233fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Allows an application to receive Wifi Multicast packets. 3234fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Normally the Wifi stack filters out packets not explicitly 3235fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * addressed to this device. Acquring a MulticastLock will 3236fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * cause the stack to receive packets addressed to multicast 3237e42dd31b3f656f33be99fd37f26e07557d163b54Michael Plass * addresses. Processing these extra packets can cause a noticeable 323841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * battery drain and should be disabled when not needed. 32395347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt */ 3240fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public class MulticastLock { 3241fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt private String mTag; 3242fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt private final IBinder mBinder; 324341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt private int mRefCount; 324441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt private boolean mRefCounted; 3245fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt private boolean mHeld; 3246fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 3247fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt private MulticastLock(String tag) { 3248fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt mTag = tag; 3249fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt mBinder = new Binder(); 325041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt mRefCount = 0; 325141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt mRefCounted = true; 3252fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt mHeld = false; 3253fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 3254fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 3255fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt /** 3256fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Locks Wifi Multicast on until {@link #release} is called. 3257fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 325841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * If this MulticastLock is reference-counted each call to 325941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * {@code acquire} will increment the reference count, and the 326041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * wifi interface will receive multicast packets as long as the 326141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * reference count is above zero. 326241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * 326341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * If this MulticastLock is not reference-counted, the first call to 326441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * {@code acquire} will turn on the multicast packets, but subsequent 326541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * calls will be ignored. Only one call to {@link #release} will 326641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * be required, regardless of the number of times that {@code acquire} 326741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * is called. 3268fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 3269fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Note that other applications may also lock Wifi Multicast on. 3270fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Only they can relinquish their lock. 3271fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 3272fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Also note that applications cannot leave Multicast locked on. 3273fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * When an app exits or crashes, any Multicast locks will be released. 3274fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt */ 3275fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public void acquire() { 3276fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt synchronized (mBinder) { 32772c02da2bc62c4dfef684ea381be02a4e568b73d0Irfan Sheriff if (mRefCounted ? (++mRefCount == 1) : (!mHeld)) { 3278fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt try { 3279fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt mService.acquireMulticastLock(mBinder, mTag); 3280617750604c69e6068f68266d0e30324273aa990eMike Lockwood synchronized (WifiManager.this) { 3281617750604c69e6068f68266d0e30324273aa990eMike Lockwood if (mActiveLockCount >= MAX_ACTIVE_LOCKS) { 3282617750604c69e6068f68266d0e30324273aa990eMike Lockwood mService.releaseMulticastLock(); 3283617750604c69e6068f68266d0e30324273aa990eMike Lockwood throw new UnsupportedOperationException( 3284617750604c69e6068f68266d0e30324273aa990eMike Lockwood "Exceeded maximum number of wifi locks"); 3285617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 3286617750604c69e6068f68266d0e30324273aa990eMike Lockwood mActiveLockCount++; 3287617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 3288c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey } catch (RemoteException e) { 3289c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 3290fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 329141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt mHeld = true; 3292fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 3293fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 3294fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 3295fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 3296fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt /** 3297fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Unlocks Wifi Multicast, restoring the filter of packets 3298fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * not addressed specifically to this device and saving power. 3299fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 330041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * If this MulticastLock is reference-counted, each call to 330141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * {@code release} will decrement the reference count, and the 330241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * multicast packets will only stop being received when the reference 330341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * count reaches zero. If the reference count goes below zero (that 330441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * is, if {@code release} is called a greater number of times than 330541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * {@link #acquire}), an exception is thrown. 330641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * 330741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * If this MulticastLock is not reference-counted, the first call to 330841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * {@code release} (after the radio was multicast locked using 33094a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn * {@link #acquire}) will unlock the multicast, and subsequent calls 331041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * will be ignored. 331141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * 3312fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Note that if any other Wifi Multicast Locks are still outstanding 3313fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * this {@code release} call will not have an immediate effect. Only 3314fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * when all applications have released all their Multicast Locks will 3315fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * the Multicast filter be turned back on. 3316fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 3317fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Also note that when an app exits or crashes all of its Multicast 3318fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Locks will be automatically released. 3319fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt */ 3320fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public void release() { 3321fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt synchronized (mBinder) { 332241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt if (mRefCounted ? (--mRefCount == 0) : (mHeld)) { 3323fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt try { 3324fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt mService.releaseMulticastLock(); 3325617750604c69e6068f68266d0e30324273aa990eMike Lockwood synchronized (WifiManager.this) { 3326617750604c69e6068f68266d0e30324273aa990eMike Lockwood mActiveLockCount--; 3327617750604c69e6068f68266d0e30324273aa990eMike Lockwood } 3328c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey } catch (RemoteException e) { 3329c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 3330fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 333141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt mHeld = false; 333241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt } 333341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt if (mRefCount < 0) { 333441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt throw new RuntimeException("MulticastLock under-locked " 333541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt + mTag); 3336fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 3337fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 3338fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 3339fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 3340fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt /** 334141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * Controls whether this is a reference-counted or non-reference- 334241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * counted MulticastLock. 334341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * 334441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * Reference-counted MulticastLocks keep track of the number of calls 334541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * to {@link #acquire} and {@link #release}, and only stop the 334641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * reception of multicast packets when every call to {@link #acquire} 334741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * has been balanced with a call to {@link #release}. Non-reference- 334841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * counted MulticastLocks allow the reception of multicast packets 334941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * whenever {@link #acquire} is called and stop accepting multicast 335041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * packets whenever {@link #release} is called. 335141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * 335241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * @param refCounted true if this MulticastLock should keep a reference 335341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt * count 335441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt */ 335541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt public void setReferenceCounted(boolean refCounted) { 335641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt mRefCounted = refCounted; 335741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt } 335841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt 335941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt /** 3360fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Checks whether this MulticastLock is currently held. 3361fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * 3362fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * @return true if this MulticastLock is held, false otherwise 3363fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt */ 3364fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public boolean isHeld() { 3365fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt synchronized (mBinder) { 3366fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt return mHeld; 3367fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 3368fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 3369fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 3370fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public String toString() { 337141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt String s1, s2, s3; 3372fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt synchronized (mBinder) { 3373fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt s1 = Integer.toHexString(System.identityHashCode(this)); 3374fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt s2 = mHeld ? "held; " : ""; 337541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt if (mRefCounted) { 337641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt s3 = "refcounted: refcount = " + mRefCount; 337741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt } else { 337841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt s3 = "not refcounted"; 337941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt } 338041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt return "MulticastLock{ " + s1 + "; " + s2 + s3 + " }"; 3381fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 3382fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt } 3383fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt 3384fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt @Override 3385fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt protected void finalize() throws Throwable { 3386fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt super.finalize(); 338741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt setReferenceCounted(false); 3388fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt release(); 33895347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 33905347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 33915347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 33925347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt /** 3393fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * Check multicast filter status. 33945347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt * 3395fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt * @return true if multicast packets are allowed. 33965347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt * 33975347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt * @hide pending API council approval 33985347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt */ 3399fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt public boolean isMulticastEnabled() { 34005347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt try { 3401fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt return mService.isMulticastEnabled(); 34025347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } catch (RemoteException e) { 3403c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 34045347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 34055347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 3406e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt 3407e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt /** 3408e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt * Initialize the multicast filtering to 'on' 3409e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt * @hide no intent to publish 3410e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt */ 3411e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt public boolean initializeMulticastFiltering() { 3412e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt try { 3413e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt mService.initializeMulticastFiltering(); 3414e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt return true; 3415e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt } catch (RemoteException e) { 3416c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 3417e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt } 3418e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt } 3419da6da0907b28d4704aabbdb1bbeb4300954670d1Irfan Sheriff 3420fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff protected void finalize() throws Throwable { 3421fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff try { 3422a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart if (mAsyncChannel != null) { 3423a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart mAsyncChannel.disconnect(); 3424939caef712f306a1c80ea27e9f41ef6e3ea9e0f1Irfan Sheriff } 3425fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff } finally { 3426fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff super.finalize(); 3427fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff } 3428fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff } 34295fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle 34305fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle /** 34315fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle * Set wifi verbose log. Called from developer settings. 34325fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle * @hide 34335fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle */ 34345fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle public void enableVerboseLogging (int verbose) { 34355fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle try { 34365fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle mService.enableVerboseLogging(verbose); 3437f5af4a972598611c46d4bf169919e23b7375a5a9vandwalle } catch (Exception e) { 3438f5af4a972598611c46d4bf169919e23b7375a5a9vandwalle //ignore any failure here 3439f5af4a972598611c46d4bf169919e23b7375a5a9vandwalle Log.e(TAG, "enableVerboseLogging " + e.toString()); 34405fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } 34415fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } 34425fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle 34435fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle /** 34445fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle * Get the WiFi verbose logging level.This is used by settings 34455fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle * to decide what to show within the picker. 34465fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle * @hide 34475fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle */ 34485fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle public int getVerboseLoggingLevel() { 34495fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle try { 34505fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle return mService.getVerboseLoggingLevel(); 34515fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } catch (RemoteException e) { 3452c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 34535fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } 34545fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle } 3455d524c78d9358e2fa1e67124468cffa5284870c62vandwalle 3456d524c78d9358e2fa1e67124468cffa5284870c62vandwalle /** 3457d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * Set wifi Aggressive Handover. Called from developer settings. 3458d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * @hide 3459d524c78d9358e2fa1e67124468cffa5284870c62vandwalle */ 3460d524c78d9358e2fa1e67124468cffa5284870c62vandwalle public void enableAggressiveHandover(int enabled) { 3461d524c78d9358e2fa1e67124468cffa5284870c62vandwalle try { 3462d524c78d9358e2fa1e67124468cffa5284870c62vandwalle mService.enableAggressiveHandover(enabled); 3463d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } catch (RemoteException e) { 3464c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 3465d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 3466d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 3467d524c78d9358e2fa1e67124468cffa5284870c62vandwalle 3468d524c78d9358e2fa1e67124468cffa5284870c62vandwalle /** 3469d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * Get the WiFi Handover aggressiveness.This is used by settings 3470d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * to decide what to show within the picker. 3471d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * @hide 3472d524c78d9358e2fa1e67124468cffa5284870c62vandwalle */ 3473d524c78d9358e2fa1e67124468cffa5284870c62vandwalle public int getAggressiveHandover() { 3474d524c78d9358e2fa1e67124468cffa5284870c62vandwalle try { 3475d524c78d9358e2fa1e67124468cffa5284870c62vandwalle return mService.getAggressiveHandover(); 3476d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } catch (RemoteException e) { 3477c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 3478d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 3479d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 3480d524c78d9358e2fa1e67124468cffa5284870c62vandwalle 3481d524c78d9358e2fa1e67124468cffa5284870c62vandwalle /** 3482d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * Set setting for allowing Scans when traffic is ongoing. 3483d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * @hide 3484d524c78d9358e2fa1e67124468cffa5284870c62vandwalle */ 3485d524c78d9358e2fa1e67124468cffa5284870c62vandwalle public void setAllowScansWithTraffic(int enabled) { 3486d524c78d9358e2fa1e67124468cffa5284870c62vandwalle try { 3487d524c78d9358e2fa1e67124468cffa5284870c62vandwalle mService.setAllowScansWithTraffic(enabled); 3488d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } catch (RemoteException e) { 3489c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 3490d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 3491d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 3492d524c78d9358e2fa1e67124468cffa5284870c62vandwalle 3493d524c78d9358e2fa1e67124468cffa5284870c62vandwalle /** 3494d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * Get setting for allowing Scans when traffic is ongoing. 3495d524c78d9358e2fa1e67124468cffa5284870c62vandwalle * @hide 3496d524c78d9358e2fa1e67124468cffa5284870c62vandwalle */ 3497d524c78d9358e2fa1e67124468cffa5284870c62vandwalle public int getAllowScansWithTraffic() { 3498d524c78d9358e2fa1e67124468cffa5284870c62vandwalle try { 3499d524c78d9358e2fa1e67124468cffa5284870c62vandwalle return mService.getAllowScansWithTraffic(); 3500d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } catch (RemoteException e) { 3501c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 3502d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 3503d524c78d9358e2fa1e67124468cffa5284870c62vandwalle } 350473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande 35055914caff06f9790238bea0536acfbf533cee9046Pierre Vandwalle /** 3506984dc850b4caeb4470e52bce773935be5305cf8eStuart Scott * Resets all wifi manager settings back to factory defaults. 3507984dc850b4caeb4470e52bce773935be5305cf8eStuart Scott * 3508984dc850b4caeb4470e52bce773935be5305cf8eStuart Scott * @hide 3509984dc850b4caeb4470e52bce773935be5305cf8eStuart Scott */ 3510984dc850b4caeb4470e52bce773935be5305cf8eStuart Scott public void factoryReset() { 3511f1fb39763d87dabe254b6ed64ac8f20145035bc0Stuart Scott try { 3512f1fb39763d87dabe254b6ed64ac8f20145035bc0Stuart Scott mService.factoryReset(); 3513f1fb39763d87dabe254b6ed64ac8f20145035bc0Stuart Scott } catch (RemoteException e) { 3514c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 3515984dc850b4caeb4470e52bce773935be5305cf8eStuart Scott } 3516984dc850b4caeb4470e52bce773935be5305cf8eStuart Scott } 35177094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe 35187094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe /** 35197094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe * Get Network object of current wifi network 35207094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe * @return Get Network object of current wifi network 35217094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe * @hide 35227094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe */ 35237094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe public Network getCurrentNetwork() { 35247094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe try { 35257094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe return mService.getCurrentNetwork(); 35267094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe } catch (RemoteException e) { 3527c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 35287094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe } 35297094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe } 3530358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle 3531358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle /** 3532e8de06d2feb6680df15c1473fb72efb214ced744xinhe * Framework layer autojoin enable/disable when device is associated 3533e8de06d2feb6680df15c1473fb72efb214ced744xinhe * this will enable/disable autojoin scan and switch network when connected 3534e8de06d2feb6680df15c1473fb72efb214ced744xinhe * @return true -- if set successful false -- if set failed 3535358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle * @hide 3536358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle */ 353744a4668b4599a1284f4c2011b1ab4bf90b9b4ab6Samuel Tan public boolean setEnableAutoJoinWhenAssociated(boolean enabled) { 3538358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle try { 353944a4668b4599a1284f4c2011b1ab4bf90b9b4ab6Samuel Tan return mService.setEnableAutoJoinWhenAssociated(enabled); 3540358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle } catch (RemoteException e) { 3541c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 3542358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle } 3543358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle } 3544358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle 3545358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle /** 3546e8de06d2feb6680df15c1473fb72efb214ced744xinhe * Get setting for Framework layer autojoin enable status 3547358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle * @hide 3548358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle */ 3549e8de06d2feb6680df15c1473fb72efb214ced744xinhe public boolean getEnableAutoJoinWhenAssociated() { 3550358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle try { 3551e8de06d2feb6680df15c1473fb72efb214ced744xinhe return mService.getEnableAutoJoinWhenAssociated(); 3552358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle } catch (RemoteException e) { 3553c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 3554358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle } 3555358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle } 355674638cdb31a10fa6d013744d201bb12465dff3eaRandy Pan 355774638cdb31a10fa6d013744d201bb12465dff3eaRandy Pan /** 355874638cdb31a10fa6d013744d201bb12465dff3eaRandy Pan * Enable/disable WifiConnectivityManager 355974638cdb31a10fa6d013744d201bb12465dff3eaRandy Pan * @hide 356074638cdb31a10fa6d013744d201bb12465dff3eaRandy Pan */ 356174638cdb31a10fa6d013744d201bb12465dff3eaRandy Pan public void enableWifiConnectivityManager(boolean enabled) { 356274638cdb31a10fa6d013744d201bb12465dff3eaRandy Pan try { 356374638cdb31a10fa6d013744d201bb12465dff3eaRandy Pan mService.enableWifiConnectivityManager(enabled); 356474638cdb31a10fa6d013744d201bb12465dff3eaRandy Pan } catch (RemoteException e) { 356574638cdb31a10fa6d013744d201bb12465dff3eaRandy Pan throw e.rethrowFromSystemServer(); 356674638cdb31a10fa6d013744d201bb12465dff3eaRandy Pan } 356774638cdb31a10fa6d013744d201bb12465dff3eaRandy Pan } 3568ffe0abf103ead1ca63ff9ae4807e0b973b1d39dcRoshan Pius 3569ffe0abf103ead1ca63ff9ae4807e0b973b1d39dcRoshan Pius /** 3570ffe0abf103ead1ca63ff9ae4807e0b973b1d39dcRoshan Pius * Retrieve the data to be backed to save the current state. 3571ffe0abf103ead1ca63ff9ae4807e0b973b1d39dcRoshan Pius * @hide 3572ffe0abf103ead1ca63ff9ae4807e0b973b1d39dcRoshan Pius */ 3573ffe0abf103ead1ca63ff9ae4807e0b973b1d39dcRoshan Pius public byte[] retrieveBackupData() { 3574ffe0abf103ead1ca63ff9ae4807e0b973b1d39dcRoshan Pius try { 3575ffe0abf103ead1ca63ff9ae4807e0b973b1d39dcRoshan Pius return mService.retrieveBackupData(); 3576ffe0abf103ead1ca63ff9ae4807e0b973b1d39dcRoshan Pius } catch (RemoteException e) { 3577ffe0abf103ead1ca63ff9ae4807e0b973b1d39dcRoshan Pius throw e.rethrowFromSystemServer(); 3578ffe0abf103ead1ca63ff9ae4807e0b973b1d39dcRoshan Pius } 3579ffe0abf103ead1ca63ff9ae4807e0b973b1d39dcRoshan Pius } 3580ffe0abf103ead1ca63ff9ae4807e0b973b1d39dcRoshan Pius 3581ffe0abf103ead1ca63ff9ae4807e0b973b1d39dcRoshan Pius /** 3582ffe0abf103ead1ca63ff9ae4807e0b973b1d39dcRoshan Pius * Restore state from the backed up data. 3583ffe0abf103ead1ca63ff9ae4807e0b973b1d39dcRoshan Pius * @hide 3584ffe0abf103ead1ca63ff9ae4807e0b973b1d39dcRoshan Pius */ 3585ffe0abf103ead1ca63ff9ae4807e0b973b1d39dcRoshan Pius public void restoreBackupData(byte[] data) { 3586ffe0abf103ead1ca63ff9ae4807e0b973b1d39dcRoshan Pius try { 3587ffe0abf103ead1ca63ff9ae4807e0b973b1d39dcRoshan Pius mService.restoreBackupData(data); 3588ffe0abf103ead1ca63ff9ae4807e0b973b1d39dcRoshan Pius } catch (RemoteException e) { 3589ffe0abf103ead1ca63ff9ae4807e0b973b1d39dcRoshan Pius throw e.rethrowFromSystemServer(); 3590ffe0abf103ead1ca63ff9ae4807e0b973b1d39dcRoshan Pius } 3591ffe0abf103ead1ca63ff9ae4807e0b973b1d39dcRoshan Pius } 3592f9f88b8b20f4fe4e0c7b2c22c1f0d4d0a36f2217Roshan Pius 3593f9f88b8b20f4fe4e0c7b2c22c1f0d4d0a36f2217Roshan Pius /** 3594f9f88b8b20f4fe4e0c7b2c22c1f0d4d0a36f2217Roshan Pius * Restore state from the older version of back up data. 3595fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius * The old backup data was essentially a backup of wpa_supplicant.conf 3596fb441f50093bcc3476a33a2b63abf61d355f2eaaRoshan Pius * and ipconfig.txt file. 3597f9f88b8b20f4fe4e0c7b2c22c1f0d4d0a36f2217Roshan Pius * @hide 3598f9f88b8b20f4fe4e0c7b2c22c1f0d4d0a36f2217Roshan Pius */ 3599f9f88b8b20f4fe4e0c7b2c22c1f0d4d0a36f2217Roshan Pius public void restoreSupplicantBackupData(byte[] supplicantData, byte[] ipConfigData) { 3600f9f88b8b20f4fe4e0c7b2c22c1f0d4d0a36f2217Roshan Pius try { 3601f9f88b8b20f4fe4e0c7b2c22c1f0d4d0a36f2217Roshan Pius mService.restoreSupplicantBackupData(supplicantData, ipConfigData); 3602f9f88b8b20f4fe4e0c7b2c22c1f0d4d0a36f2217Roshan Pius } catch (RemoteException e) { 3603f9f88b8b20f4fe4e0c7b2c22c1f0d4d0a36f2217Roshan Pius throw e.rethrowFromSystemServer(); 3604f9f88b8b20f4fe4e0c7b2c22c1f0d4d0a36f2217Roshan Pius } 3605f9f88b8b20f4fe4e0c7b2c22c1f0d4d0a36f2217Roshan Pius } 3606651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff} 3607