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