WifiManager.java revision b7d13d53bf95c86ed3e65277dc072e3379c94f8e
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.net.wifi;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.annotation.SdkConstant;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.annotation.SdkConstant.SdkConstantType;
21cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tongimport android.annotation.SystemApi;
22ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriffimport android.content.Context;
231022dde719ca430f062f9e628574d70ae1320677Lorenzo Colittiimport android.net.ConnectivityManager;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.DhcpInfo;
251022dde719ca430f062f9e628574d70ae1320677Lorenzo Colittiimport android.net.Network;
261022dde719ca430f062f9e628574d70ae1320677Lorenzo Colittiimport android.net.NetworkCapabilities;
271022dde719ca430f062f9e628574d70ae1320677Lorenzo Colittiimport android.net.NetworkRequest;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder;
291022dde719ca430f062f9e628574d70ae1320677Lorenzo Colittiimport android.os.Build;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
31a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpandeimport android.os.IBinder;
32d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriffimport android.os.Looper;
33d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriffimport android.os.Message;
34a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpandeimport android.os.Messenger;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException;
367e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackbornimport android.os.WorkSource;
3788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriffimport android.util.Log;
38d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriffimport android.util.SparseArray;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriffimport com.android.internal.util.AsyncChannel;
41d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriffimport com.android.internal.util.Protocol;
42531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colittiimport com.android.server.net.NetworkPinner;
43ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff
44a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpandeimport java.net.InetAddress;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List;
46a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpandeimport java.util.concurrent.CountDownLatch;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class provides the primary API for managing all aspects of Wi-Fi
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * connectivity. Get an instance of this class by calling
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.content.Context#getSystemService(String) Context.getSystemService(Context.WIFI_SERVICE)}.
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * It deals with several categories of items:
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The list of configured networks. The list can be viewed and updated,
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and attributes of individual entries can be modified.</li>
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>The currently active Wi-Fi network, if any. Connectivity can be
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * established or torn down, and dynamic information about the state of
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the network can be queried.</li>
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Results of access point scans, containing enough information to
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * make decisions about what access point to connect to.</li>
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>It defines the names of various Intent actions that are broadcast
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * upon any sort of change in Wi-Fi state.
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is the API to use when performing Wi-Fi specific operations. To
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * perform operations that pertain to network connectivity at an abstract
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * level, use {@link android.net.ConnectivityManager}.
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class WifiManager {
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff    private static final String TAG = "WifiManager";
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Supplicant error codes:
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The error code if there was a problem authenticating.
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ERROR_AUTHENTICATING = 1;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7989710842585404ea33f941afeb2c321e706005e9Robert Greenwalt     * Broadcast intent action indicating whether Wi-Fi scanning is allowed currently
8089710842585404ea33f941afeb2c321e706005e9Robert Greenwalt     * @hide
8189710842585404ea33f941afeb2c321e706005e9Robert Greenwalt     */
8289710842585404ea33f941afeb2c321e706005e9Robert Greenwalt    public static final String WIFI_SCAN_AVAILABLE = "wifi_scan_available";
8389710842585404ea33f941afeb2c321e706005e9Robert Greenwalt
8489710842585404ea33f941afeb2c321e706005e9Robert Greenwalt    /**
8589710842585404ea33f941afeb2c321e706005e9Robert Greenwalt     * Extra int indicating scan availability, WIFI_STATE_ENABLED and WIFI_STATE_DISABLED
8689710842585404ea33f941afeb2c321e706005e9Robert Greenwalt     * @hide
8789710842585404ea33f941afeb2c321e706005e9Robert Greenwalt     */
88cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong    public static final String EXTRA_SCAN_AVAILABLE = "scan_enabled";
89cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong
90cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong    /**
91cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong     * Broadcast intent action indicating that the credential of a Wi-Fi network
92cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong     * has been changed. One extra provides the ssid of the network. Another
93cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong     * extra provides the event type, whether the credential is saved or forgot.
94cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong     * @hide
95cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong     */
96cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong    @SystemApi
97cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong    public static final String WIFI_CREDENTIAL_CHANGED_ACTION =
98cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong            "android.net.wifi.WIFI_CREDENTIAL_CHANGED";
99cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong    /** @hide */
100cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong    @SystemApi
101cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong    public static final String EXTRA_WIFI_CREDENTIAL_EVENT_TYPE = "et";
102cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong    /** @hide */
103cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong    @SystemApi
104cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong    public static final String EXTRA_WIFI_CREDENTIAL_SSID = "ssid";
105cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong    /** @hide */
106cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong    @SystemApi
107cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong    public static final int WIFI_CREDENTIAL_SAVED = 0;
108cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong    /** @hide */
109cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong    @SystemApi
110cdd5858e481fb0087c40c5997a9fa1446b326165Wenchao Tong    public static final int WIFI_CREDENTIAL_FORGOT = 1;
11189710842585404ea33f941afeb2c321e706005e9Robert Greenwalt
11289710842585404ea33f941afeb2c321e706005e9Robert Greenwalt    /**
113a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * Broadcast intent action indicating that the a Passpoint release 2 icon has been received.
114a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * @hide
115a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     */
116a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    public static final String PASSPOINT_ICON_RECEIVED_ACTION =
117a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande            "android.net.wifi.PASSPOINT_ICON_RECEIVED";
118a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    /** @hide */
119a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    public static final String EXTRA_PASSPOINT_ICON_BSSID = "bssid";
120a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    /** @hide */
121a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    public static final String EXTRA_PASSPOINT_ICON_FILE = "file";
122a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    /** @hide */
123a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    public static final String EXTRA_PASSPOINT_ICON_DATA = "icon";
124a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande
125a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    /**
126a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * Broadcast intent action indicating that the a Passpoint release
127a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * 2 WNM frame has been received.
128a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * @hide
129a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     */
130a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    public static final String PASSPOINT_WNM_FRAME_RECEIVED_ACTION =
131a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande            "android.net.wifi.PASSPOINT_WNM_FRAME_RECEIVED";
132a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    /**
133a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * Originating BSS
134a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * @hide */
135a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    public static final String EXTRA_PASSPOINT_WNM_BSSID = "bssid";
136a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    /**
137a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * SOAP-XML or OMA-DM
138a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * @hide */
139a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    public static final String EXTRA_PASSPOINT_WNM_METHOD = "method";
140a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    /**
141a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * Type of Passpoint match
142a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * @hide */
143a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    public static final String EXTRA_PASSPOINT_WNM_PPOINT_MATCH = "match";
144a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    /**
145a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * String
146a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * @hide */
147a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    public static final String EXTRA_PASSPOINT_WNM_URL = "url";
148a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    /**
149a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * Boolean true=ess, false=bss
150a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * @hide */
151a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    public static final String EXTRA_PASSPOINT_WNM_ESS = "ess";
152a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    /**
153a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * Delay in seconds
154a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * @hide */
155a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    public static final String EXTRA_PASSPOINT_WNM_DELAY = "delay";
156a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande
157a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    /**
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Broadcast intent action indicating that Wi-Fi has been enabled, disabled,
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * enabling, disabling, or unknown. One extra provides this state as an int.
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Another extra provides the previous state, if available.
161227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff     *
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #EXTRA_WIFI_STATE
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #EXTRA_PREVIOUS_WIFI_STATE
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String WIFI_STATE_CHANGED_ACTION =
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "android.net.wifi.WIFI_STATE_CHANGED";
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The lookup key for an int that indicates whether Wi-Fi is enabled,
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * disabled, enabling, disabling, or unknown.  Retrieve it with
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.content.Intent#getIntExtra(String,int)}.
172227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff     *
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #WIFI_STATE_DISABLED
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #WIFI_STATE_DISABLING
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #WIFI_STATE_ENABLED
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #WIFI_STATE_ENABLING
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #WIFI_STATE_UNKNOWN
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String EXTRA_WIFI_STATE = "wifi_state";
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The previous Wi-Fi state.
182227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff     *
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #EXTRA_WIFI_STATE
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String EXTRA_PREVIOUS_WIFI_STATE = "previous_wifi_state";
186227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Wi-Fi is currently being disabled. The state will change to {@link #WIFI_STATE_DISABLED} if
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it finishes successfully.
190227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff     *
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #WIFI_STATE_CHANGED_ACTION
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getWifiState()
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int WIFI_STATE_DISABLING = 0;
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Wi-Fi is disabled.
197227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff     *
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #WIFI_STATE_CHANGED_ACTION
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getWifiState()
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int WIFI_STATE_DISABLED = 1;
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Wi-Fi is currently being enabled. The state will change to {@link #WIFI_STATE_ENABLED} if
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it finishes successfully.
205227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff     *
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #WIFI_STATE_CHANGED_ACTION
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getWifiState()
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int WIFI_STATE_ENABLING = 2;
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Wi-Fi is enabled.
212227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff     *
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #WIFI_STATE_CHANGED_ACTION
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getWifiState()
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int WIFI_STATE_ENABLED = 3;
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Wi-Fi is in an unknown state. This state will occur when an error happens while enabling
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or disabling.
220227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff     *
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #WIFI_STATE_CHANGED_ACTION
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getWifiState()
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int WIFI_STATE_UNKNOWN = 4;
2255321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff
2265321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff    /**
2275321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * Broadcast intent action indicating that Wi-Fi AP has been enabled, disabled,
2285321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * enabling, disabling, or failed.
2295321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     *
2305321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * @hide
2315321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     */
232b8c7badbb5b0cf2d101ddfabdcf7c95135965eeaJeremy Klein    @SystemApi
2335321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff    public static final String WIFI_AP_STATE_CHANGED_ACTION =
2345321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff        "android.net.wifi.WIFI_AP_STATE_CHANGED";
2355321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff
2365321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff    /**
2375321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * The lookup key for an int that indicates whether Wi-Fi AP is enabled,
2385321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * disabled, enabling, disabling, or failed.  Retrieve it with
2395321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * {@link android.content.Intent#getIntExtra(String,int)}.
2405321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     *
2415321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * @see #WIFI_AP_STATE_DISABLED
2425321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * @see #WIFI_AP_STATE_DISABLING
2435321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * @see #WIFI_AP_STATE_ENABLED
2445321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * @see #WIFI_AP_STATE_ENABLING
2455321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * @see #WIFI_AP_STATE_FAILED
2465321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     *
2475321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * @hide
2485321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     */
249b8c7badbb5b0cf2d101ddfabdcf7c95135965eeaJeremy Klein    @SystemApi
2505321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff    public static final String EXTRA_WIFI_AP_STATE = "wifi_state";
251e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe
252e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe    /**
253e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe     * The look up key for an int that indicates why softAP started failed
254e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe     * currently support general and no_channel
255e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe     * @see #SAP_START_FAILURE_GENERAL
256e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe     * @see #SAP_START_FAILURE_NO_CHANNEL
257e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe     *
258e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe     * @hide
259e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe     */
260e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe    public static final String EXTRA_WIFI_AP_FAILURE_REASON = "wifi_ap_error_code";
2615321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff    /**
2625321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * The previous Wi-Fi state.
2635321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     *
2645321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * @see #EXTRA_WIFI_AP_STATE
2655321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     *
2665321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * @hide
2675321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     */
268b8c7badbb5b0cf2d101ddfabdcf7c95135965eeaJeremy Klein    @SystemApi
2695321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff    public static final String EXTRA_PREVIOUS_WIFI_AP_STATE = "previous_wifi_state";
2705321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff    /**
2715321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * Wi-Fi AP is currently being disabled. The state will change to
2725321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * {@link #WIFI_AP_STATE_DISABLED} if it finishes successfully.
2735321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     *
2745321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * @see #WIFI_AP_STATE_CHANGED_ACTION
2755321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * @see #getWifiApState()
2765321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     *
2775321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * @hide
2785321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     */
279b8c7badbb5b0cf2d101ddfabdcf7c95135965eeaJeremy Klein    @SystemApi
280a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff    public static final int WIFI_AP_STATE_DISABLING = 10;
2815321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff    /**
2825321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * Wi-Fi AP is disabled.
2835321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     *
2845321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * @see #WIFI_AP_STATE_CHANGED_ACTION
2855321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * @see #getWifiState()
2865321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     *
2875321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * @hide
2885321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     */
289b8c7badbb5b0cf2d101ddfabdcf7c95135965eeaJeremy Klein    @SystemApi
290a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff    public static final int WIFI_AP_STATE_DISABLED = 11;
2915321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff    /**
2925321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * Wi-Fi AP is currently being enabled. The state will change to
2935321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * {@link #WIFI_AP_STATE_ENABLED} if it finishes successfully.
2945321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     *
2955321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * @see #WIFI_AP_STATE_CHANGED_ACTION
2965321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * @see #getWifiApState()
2975321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     *
2985321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * @hide
2995321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     */
300b8c7badbb5b0cf2d101ddfabdcf7c95135965eeaJeremy Klein    @SystemApi
301a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff    public static final int WIFI_AP_STATE_ENABLING = 12;
3025321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff    /**
3035321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * Wi-Fi AP is enabled.
3045321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     *
3055321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * @see #WIFI_AP_STATE_CHANGED_ACTION
3065321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * @see #getWifiApState()
3075321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     *
3085321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * @hide
3095321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     */
310b8c7badbb5b0cf2d101ddfabdcf7c95135965eeaJeremy Klein    @SystemApi
311a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff    public static final int WIFI_AP_STATE_ENABLED = 13;
3125321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff    /**
3135321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * Wi-Fi AP is in a failed state. This state will occur when an error occurs during
3145321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * enabling or disabling
3155321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     *
3165321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * @see #WIFI_AP_STATE_CHANGED_ACTION
3175321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * @see #getWifiApState()
3185321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     *
3195321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * @hide
3205321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     */
321b8c7badbb5b0cf2d101ddfabdcf7c95135965eeaJeremy Klein    @SystemApi
322a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff    public static final int WIFI_AP_STATE_FAILED = 14;
3235321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
325e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe     *  If WIFI AP start failed, this reason code means there is no legal channel exists on
326e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe     *  user selected band by regulatory
327e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe     *
328e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe     *  @hide
329e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe     */
330e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe    public static final int SAP_START_FAILURE_GENERAL= 0;
331e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe
332e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe    /**
333e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe     *  All other reason for AP start failed besides SAP_START_FAILURE_GENERAL
334e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe     *
335e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe     *  @hide
336e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe     */
337e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe    public static final int SAP_START_FAILURE_NO_CHANNEL = 1;
338e0ec6ba9cb6494df147479316c24defb167ab2b1xinhe    /**
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Broadcast intent action indicating that a connection to the supplicant has
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * been established (and it is now possible
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to perform Wi-Fi operations) or the connection to the supplicant has been
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * lost. One extra provides the connection state as a boolean, where {@code true}
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * means CONNECTED.
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #EXTRA_SUPPLICANT_CONNECTED
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String SUPPLICANT_CONNECTION_CHANGE_ACTION =
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "android.net.wifi.supplicant.CONNECTION_CHANGE";
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The lookup key for a boolean that indicates whether a connection to
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the supplicant daemon has been gained or lost. {@code true} means
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a connection now exists.
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve it with {@link android.content.Intent#getBooleanExtra(String,boolean)}.
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String EXTRA_SUPPLICANT_CONNECTED = "connected";
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Broadcast intent action indicating that the state of Wi-Fi connectivity
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * has changed. One extra provides the new state
3593550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy     * in the form of a {@link android.net.NetworkInfo} object. If the new
3603550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy     * state is CONNECTED, additional extras may provide the BSSID and WifiInfo of
3613550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy     * the access point.
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * as a {@code String}.
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #EXTRA_NETWORK_INFO
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #EXTRA_BSSID
3653550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy     * @see #EXTRA_WIFI_INFO
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String NETWORK_STATE_CHANGED_ACTION = "android.net.wifi.STATE_CHANGE";
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The lookup key for a {@link android.net.NetworkInfo} object associated with the
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Wi-Fi network. Retrieve with
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.content.Intent#getParcelableExtra(String)}.
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String EXTRA_NETWORK_INFO = "networkInfo";
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The lookup key for a String giving the BSSID of the access point to which
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * we are connected. Only present when the new state is CONNECTED.
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve with
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.content.Intent#getStringExtra(String)}.
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String EXTRA_BSSID = "bssid";
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3833550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy     * The lookup key for a {@link android.net.wifi.WifiInfo} object giving the
3843550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy     * information about the access point to which we are connected. Only present
3853550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy     * when the new state is CONNECTED.  Retrieve with
3863550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy     * {@link android.content.Intent#getParcelableExtra(String)}.
3873550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy     */
3883550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy    public static final String EXTRA_WIFI_INFO = "wifiInfo";
3893550ac919c492f3fbaebbf868f4df0d1ea7ee784Isaac Levy    /**
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Broadcast intent action indicating that the state of establishing a connection to
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * an access point has changed.One extra provides the new
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link SupplicantState}. Note that the supplicant state is Wi-Fi specific, and
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is not generally the most useful thing to look at if you are just interested in
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the overall state of connectivity.
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #EXTRA_NEW_STATE
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #EXTRA_SUPPLICANT_ERROR
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String SUPPLICANT_STATE_CHANGED_ACTION =
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "android.net.wifi.supplicant.STATE_CHANGE";
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The lookup key for a {@link SupplicantState} describing the new state
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve with
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.content.Intent#getParcelableExtra(String)}.
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String EXTRA_NEW_STATE = "newState";
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The lookup key for a {@link SupplicantState} describing the supplicant
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * error code if any
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve with
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.content.Intent#getIntExtra(String, int)}.
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #ERROR_AUTHENTICATING
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String EXTRA_SUPPLICANT_ERROR = "supplicantError";
416fcb659b66756ac02bd1491ae1365b27e8509a890Irfan Sheriff
417fcb659b66756ac02bd1491ae1365b27e8509a890Irfan Sheriff    /**
418be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff     * Broadcast intent action indicating that the configured networks changed.
4191b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood     * This can be as a result of adding/updating/deleting a network. If
4201b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood     * {@link #EXTRA_MULTIPLE_NETWORKS_CHANGED} is set to true the new configuration
4211b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood     * can be retreived with the {@link #EXTRA_WIFI_CONFIGURATION} extra. If multiple
4221b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood     * Wi-Fi configurations changed, {@link #EXTRA_WIFI_CONFIGURATION} will not be present.
423e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     * @hide
424e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     */
425e75c0b8e3becd9f875679a5240f3b1e26d089a3fChelsea Derrick    @SystemApi
426be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff    public static final String CONFIGURED_NETWORKS_CHANGED_ACTION =
427be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff        "android.net.wifi.CONFIGURED_NETWORKS_CHANGE";
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4291b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood     * The lookup key for a (@link android.net.wifi.WifiConfiguration} object representing
4301b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood     * the changed Wi-Fi configuration when the {@link #CONFIGURED_NETWORKS_CHANGED_ACTION}
4311b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood     * broadcast is sent.
4321b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood     * @hide
4331b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood     */
434e75c0b8e3becd9f875679a5240f3b1e26d089a3fChelsea Derrick    @SystemApi
4351b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood    public static final String EXTRA_WIFI_CONFIGURATION = "wifiConfiguration";
4361b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood    /**
4371b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood     * Multiple network configurations have changed.
4381b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood     * @see #CONFIGURED_NETWORKS_CHANGED_ACTION
4391b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood     *
4401b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood     * @hide
4411b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood     */
442e75c0b8e3becd9f875679a5240f3b1e26d089a3fChelsea Derrick    @SystemApi
4431b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood    public static final String EXTRA_MULTIPLE_NETWORKS_CHANGED = "multipleChanges";
4441b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood    /**
4451b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood     * The lookup key for an integer indicating the reason a Wi-Fi network configuration
4461b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood     * has changed. Only present if {@link #EXTRA_MULTIPLE_NETWORKS_CHANGED} is {@code false}
4471b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood     * @see #CONFIGURED_NETWORKS_CHANGED_ACTION
4481b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood     * @hide
4491b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood     */
450e75c0b8e3becd9f875679a5240f3b1e26d089a3fChelsea Derrick    @SystemApi
4511b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood    public static final String EXTRA_CHANGE_REASON = "changeReason";
4521b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood    /**
4531b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood     * The configuration is new and was added.
4541b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood     * @hide
4551b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood     */
456e75c0b8e3becd9f875679a5240f3b1e26d089a3fChelsea Derrick    @SystemApi
4571b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood    public static final int CHANGE_REASON_ADDED = 0;
4581b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood    /**
4591b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood     * The configuration was removed and is no longer present in the system's list of
4601b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood     * configured networks.
4611b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood     * @hide
4621b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood     */
463e75c0b8e3becd9f875679a5240f3b1e26d089a3fChelsea Derrick    @SystemApi
4641b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood    public static final int CHANGE_REASON_REMOVED = 1;
4651b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood    /**
4661b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood     * The configuration has changed as a result of explicit action or because the system
4671b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood     * took an automated action such as disabling a malfunctioning configuration.
4681b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood     * @hide
4691b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood     */
470e75c0b8e3becd9f875679a5240f3b1e26d089a3fChelsea Derrick    @SystemApi
4711b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood    public static final int CHANGE_REASON_CONFIG_CHANGE = 2;
4721b6989cdc212aec7579489a362f99b791abe7352Mike Lockwood    /**
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * An access point scan has completed, and results are available from the supplicant.
474a0d929e505432a8c84f3899696c910db16bd73bfVinit Deshpande     * Call {@link #getScanResults()} to obtain the results. {@link #EXTRA_RESULTS_UPDATED}
475a0d929e505432a8c84f3899696c910db16bd73bfVinit Deshpande     * indicates if the scan was completed successfully.
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String SCAN_RESULTS_AVAILABLE_ACTION = "android.net.wifi.SCAN_RESULTS";
47929ad7c7000393751a0ab0e1a17912db7866d4ff8Vinit Deshpande
48029ad7c7000393751a0ab0e1a17912db7866d4ff8Vinit Deshpande    /**
481a0d929e505432a8c84f3899696c910db16bd73bfVinit Deshpande     * Lookup key for a {@code boolean} representing the result of previous {@link #startScan}
482a0d929e505432a8c84f3899696c910db16bd73bfVinit Deshpande     * operation, reported with {@link #SCAN_RESULTS_AVAILABLE_ACTION}.
483a0d929e505432a8c84f3899696c910db16bd73bfVinit Deshpande     * @return true scan was successful, results are updated
48429ad7c7000393751a0ab0e1a17912db7866d4ff8Vinit Deshpande     * @return false scan was not successful, results haven't been updated since previous scan
48529ad7c7000393751a0ab0e1a17912db7866d4ff8Vinit Deshpande     */
48629ad7c7000393751a0ab0e1a17912db7866d4ff8Vinit Deshpande    public static final String EXTRA_RESULTS_UPDATED = "resultsUpdated";
48729ad7c7000393751a0ab0e1a17912db7866d4ff8Vinit Deshpande
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4890451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt     * A batch of access point scans has been completed and the results areavailable.
4900451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt     * Call {@link #getBatchedScanResults()} to obtain the results.
49188d93cd68a32e7110f9328ff522226126c7e493eMitchell Wills     * @deprecated This API is nolonger supported.
49288d93cd68a32e7110f9328ff522226126c7e493eMitchell Wills     * Use {@link android.net.wifi.WifiScanner} API
49388d93cd68a32e7110f9328ff522226126c7e493eMitchell Wills     * @hide
4940451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt     */
49588d93cd68a32e7110f9328ff522226126c7e493eMitchell Wills    @Deprecated
4960451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
4970451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt    public static final String BATCHED_SCAN_RESULTS_AVAILABLE_ACTION =
4980451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt            "android.net.wifi.BATCHED_RESULTS";
4990451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt    /**
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The RSSI (signal strength) has changed.
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #EXTRA_NEW_RSSI
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String RSSI_CHANGED_ACTION = "android.net.wifi.RSSI_CHANGED";
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The lookup key for an {@code int} giving the new RSSI in dBm.
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String EXTRA_NEW_RSSI = "newRssi";
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
511be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff     * Broadcast intent action indicating that the link configuration
5120d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff     * changed on wifi.
5130d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff     * @hide
5140d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff     */
515be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff    public static final String LINK_CONFIGURATION_CHANGED_ACTION =
516be9ee6a498afc08df1ca6d796b703b703b25c9a9Irfan Sheriff        "android.net.wifi.LINK_CONFIGURATION_CHANGED";
517f61101f6266be243c481d163b95e65d67b8d1669Wink Saville
5180d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff    /**
51937e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt     * The lookup key for a {@link android.net.LinkProperties} object associated with the
5200d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff     * Wi-Fi network. Retrieve with
5210d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff     * {@link android.content.Intent#getParcelableExtra(String)}.
5220d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff     * @hide
5230d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff     */
52437e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt    public static final String EXTRA_LINK_PROPERTIES = "linkProperties";
5250d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff
5260d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff    /**
527f9cb86aebe9647e0fe0137fc198ba16c017445c6Robert Greenwalt     * The lookup key for a {@link android.net.NetworkCapabilities} object associated with the
528f61101f6266be243c481d163b95e65d67b8d1669Wink Saville     * Wi-Fi network. Retrieve with
529f61101f6266be243c481d163b95e65d67b8d1669Wink Saville     * {@link android.content.Intent#getParcelableExtra(String)}.
530f61101f6266be243c481d163b95e65d67b8d1669Wink Saville     * @hide
531f61101f6266be243c481d163b95e65d67b8d1669Wink Saville     */
532f9cb86aebe9647e0fe0137fc198ba16c017445c6Robert Greenwalt    public static final String EXTRA_NETWORK_CAPABILITIES = "networkCapabilities";
533f61101f6266be243c481d163b95e65d67b8d1669Wink Saville
534f61101f6266be243c481d163b95e65d67b8d1669Wink Saville    /**
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The network IDs of the configured networks could have changed.
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String NETWORK_IDS_CHANGED_ACTION = "android.net.wifi.NETWORK_IDS_CHANGED";
53937e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5411ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff     * Activity Action: Show a system activity that allows the user to enable
5421ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff     * scans to be available even with Wi-Fi turned off.
5431ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff     *
5441ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff     * <p>Notification of the result of this activity is posted using the
5451ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff     * {@link android.app.Activity#onActivityResult} callback. The
5461ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff     * <code>resultCode</code>
5471ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff     * will be {@link android.app.Activity#RESULT_OK} if scan always mode has
5481ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff     * been turned on or {@link android.app.Activity#RESULT_CANCELED} if the user
5491ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff     * has rejected the request or an error has occurred.
5501ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff     */
5511ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
5521ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff    public static final String ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE =
5531ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff            "android.net.wifi.action.REQUEST_SCAN_ALWAYS_AVAILABLE";
5541ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff
5551ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff    /**
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Activity Action: Pick a Wi-Fi network to connect to.
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Input: Nothing.
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Output: Nothing.
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String ACTION_PICK_WIFI_NETWORK = "android.net.wifi.PICK_WIFI_NETWORK";
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
564b7d13d53bf95c86ed3e65277dc072e3379c94f8eRebecca Silberstein     * Internally used Wi-Fi lock mode representing the case were no locks are held.
565b7d13d53bf95c86ed3e65277dc072e3379c94f8eRebecca Silberstein     * @hide
566b7d13d53bf95c86ed3e65277dc072e3379c94f8eRebecca Silberstein     */
567b7d13d53bf95c86ed3e65277dc072e3379c94f8eRebecca Silberstein    public static final int WIFI_MODE_NO_LOCKS_HELD = 0;
568b7d13d53bf95c86ed3e65277dc072e3379c94f8eRebecca Silberstein
569b7d13d53bf95c86ed3e65277dc072e3379c94f8eRebecca Silberstein    /**
57099001278289036a3c645e599ed832943ff1b6e15Eric Shienbrood     * In this Wi-Fi lock mode, Wi-Fi will be kept active,
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and will behave normally, i.e., it will attempt to automatically
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * establish a connection to a remembered access point that is
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * within range, and will do periodic scans if there are remembered
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * access points but none are in range.
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int WIFI_MODE_FULL = 1;
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
57899001278289036a3c645e599ed832943ff1b6e15Eric Shienbrood     * In this Wi-Fi lock mode, Wi-Fi will be kept active,
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * but the only operation that will be supported is initiation of
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * scans, and the subsequent reporting of scan results. No attempts
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will be made to automatically connect to remembered access points,
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * nor will periodic scans be automatically performed looking for
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * remembered access points. Scans must be explicitly requested by
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * an application in this mode.
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int WIFI_MODE_SCAN_ONLY = 2;
587652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff    /**
588652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff     * In this Wi-Fi lock mode, Wi-Fi will be kept active as in mode
589652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff     * {@link #WIFI_MODE_FULL} but it operates at high performance
590652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff     * with minimum packet loss and low packet latency even when
591652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff     * the device screen is off. This mode will consume more power
592652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff     * and hence should be used only when there is a need for such
593652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff     * an active connection.
594652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff     * <p>
595652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff     * An example use case is when a voice connection needs to be
596652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff     * kept active even after the device screen goes off. Holding the
597652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff     * regular {@link #WIFI_MODE_FULL} lock will keep the wifi
598652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff     * connection active, but the connection can be lossy.
599652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff     * Holding a {@link #WIFI_MODE_FULL_HIGH_PERF} lock for the
600652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff     * duration of the voice call will improve the call quality.
601652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff     * <p>
602652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff     * When there is no support from the hardware, this lock mode
603652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff     * will have the same behavior as {@link #WIFI_MODE_FULL}
604652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff     */
605652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff    public static final int WIFI_MODE_FULL_HIGH_PERF = 3;
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Anything worse than or equal to this will show 0 bars. */
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int MIN_RSSI = -100;
609652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** Anything better than or equal to this will show the max bars. */
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int MAX_RSSI = -55;
61236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff
61336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff    /**
614ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff     * Number of RSSI levels used in the framework to initiate
615ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff     * {@link #RSSI_CHANGED_ACTION} broadcast
616ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff     * @hide
617ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff     */
618ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff    public static final int RSSI_LEVELS = 5;
619ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff
620ea933cb3fddbf5971dd4c62090edabbed295c3a7Irfan Sheriff    /**
62136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff     * Auto settings in the driver. The driver could choose to operate on both
62236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff     * 2.4 GHz and 5 GHz or make a dynamic decision on selecting the band.
62336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff     * @hide
62436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff     */
62536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff    public static final int WIFI_FREQUENCY_BAND_AUTO = 0;
62636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff
62736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff    /**
62836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff     * Operation on 5 GHz alone
62936f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff     * @hide
63036f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff     */
63136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff    public static final int WIFI_FREQUENCY_BAND_5GHZ = 1;
63236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff
63336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff    /**
63436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff     * Operation on 2.4 GHz alone
63536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff     * @hide
63636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff     */
63736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff    public static final int WIFI_FREQUENCY_BAND_2GHZ = 2;
63836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff
639227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff    /** List of asyncronous notifications
640227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff     * @hide
641227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff     */
642227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff    public static final int DATA_ACTIVITY_NOTIFICATION = 1;
643227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff
644227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff    //Lowest bit indicates data reception and the second lowest
645227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff    //bit indicates data transmitted
646227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff    /** @hide */
647227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff    public static final int DATA_ACTIVITY_NONE         = 0x00;
648227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff    /** @hide */
649227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff    public static final int DATA_ACTIVITY_IN           = 0x01;
650227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff    /** @hide */
651227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff    public static final int DATA_ACTIVITY_OUT          = 0x02;
652227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff    /** @hide */
653227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff    public static final int DATA_ACTIVITY_INOUT        = 0x03;
654227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff
655ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde    /** @hide */
656ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde    public static final boolean DEFAULT_POOR_NETWORK_AVOIDANCE_ENABLED = false;
657ffadfb9ffdced62db215319d3edc7717802088fbVinit Deshapnde
658617750604c69e6068f68266d0e30324273aa990eMike Lockwood    /* Maximum number of active locks we allow.
659617750604c69e6068f68266d0e30324273aa990eMike Lockwood     * This limit was added to prevent apps from creating a ridiculous number
660617750604c69e6068f68266d0e30324273aa990eMike Lockwood     * of locks and crashing the system by overflowing the global ref table.
661617750604c69e6068f68266d0e30324273aa990eMike Lockwood     */
662617750604c69e6068f68266d0e30324273aa990eMike Lockwood    private static final int MAX_ACTIVE_LOCKS = 50;
663617750604c69e6068f68266d0e30324273aa990eMike Lockwood
664617750604c69e6068f68266d0e30324273aa990eMike Lockwood    /* Number of currently active WifiLocks and MulticastLocks */
665617750604c69e6068f68266d0e30324273aa990eMike Lockwood    private int mActiveLockCount;
666617750604c69e6068f68266d0e30324273aa990eMike Lockwood
66788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff    private Context mContext;
66888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff    IWifiManager mService;
6691022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti    private final int mTargetSdkVersion;
67088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff
67188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff    private static final int INVALID_KEY = 0;
672a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart    private int mListenerKey = 1;
673a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart    private final SparseArray mListenerMap = new SparseArray();
674a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart    private final Object mListenerMapLock = new Object();
67588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff
676a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart    private AsyncChannel mAsyncChannel;
677a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart    private CountDownLatch mConnected;
678bf8cbb05e085c4504685883f3dd564f200405beaPaul Stewart    private Looper mLooper;
679cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new WifiManager instance.
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Applications will almost always want to use
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.content.Context#getSystemService Context.getSystemService()} to retrieve
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the standard {@link android.content.Context#WIFI_SERVICE Context.WIFI_SERVICE}.
68588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff     * @param context the application context
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param service the Binder interface
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide - hide this because it takes in a parameter of type IWifiManager, which
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is a system private class.
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
690bf8cbb05e085c4504685883f3dd564f200405beaPaul Stewart    public WifiManager(Context context, IWifiManager service, Looper looper) {
69188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff        mContext = context;
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mService = service;
693bf8cbb05e085c4504685883f3dd564f200405beaPaul Stewart        mLooper = looper;
6941022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti        mTargetSdkVersion = context.getApplicationInfo().targetSdkVersion;
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return a list of all the networks configured in the supplicant.
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Not all fields of WifiConfiguration are returned. Only the following
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * fields are filled in:
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <ul>
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li>networkId</li>
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li>SSID</li>
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li>BSSID</li>
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li>priority</li>
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li>allowedProtocols</li>
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li>allowedKeyManagement</li>
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li>allowedAuthAlgorithms</li>
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li>allowedPairwiseCiphers</li>
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <li>allowedGroupCiphers</li>
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </ul>
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return a list of network configurations in the form of a list
71359358536d2f14b27cdc7386daeabc2b6dca8e177Irfan Sheriff     * of {@link WifiConfiguration} objects. Upon failure to fetch or
7140d3d1f825f399c62f2ba236b53bef17581e03a16Sungsoo Lim     * when Wi-Fi is turned off, it can be null.
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public List<WifiConfiguration> getConfiguredNetworks() {
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mService.getConfiguredNetworks();
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
720c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
724758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong    /** @hide */
725758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong    @SystemApi
726758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong    public List<WifiConfiguration> getPrivilegedConfiguredNetworks() {
727758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong        try {
728758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong            return mService.getPrivilegedConfiguredNetworks();
729758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong        } catch (RemoteException e) {
730c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
731758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong        }
732758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong    }
733758bdf4a915c313f1c3bef0b95b494c91f363f03Wenchao Tong
7344eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle    /** @hide */
7354eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle    @SystemApi
7364eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle    public WifiConnectionStatistics getConnectionStatistics() {
7374eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle        try {
7384eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle            return mService.getConnectionStatistics();
7394eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle        } catch (RemoteException e) {
740c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
7414eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle        }
7424eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle    }
7434eeecb25509f91ac7a6e2cde76dac782fbec5360vandwalle
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
745b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande     * Returns a WifiConfiguration matching this ScanResult
746b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande     * @param scanResult scanResult that represents the BSSID
747b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande     * @return {@link WifiConfiguration} that matches this BSSID or null
748b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande     * @hide
749b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande     */
750b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande    public WifiConfiguration getMatchingWifiConfig(ScanResult scanResult) {
751b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande        try {
752b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande            return mService.getMatchingWifiConfig(scanResult);
753b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande        } catch (RemoteException e) {
754c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
755b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande        }
756b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande    }
757b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande
758b4d90fca0ec461c24cd38e4b7d1990447ad047a1Vinit Deshpande    /**
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Add a new network description to the set of configured networks.
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The {@code networkId} field of the supplied configuration object
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is ignored.
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p/>
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The new network will be marked DISABLED by default. To enable it,
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * called {@link #enableNetwork}.
765227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff     *
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param config the set of variables that describe the configuration,
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            contained in a {@link WifiConfiguration} object.
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the ID of the newly created network description. This is used in
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         other operations to specified the network to be acted upon.
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         Returns {@code -1} on failure.
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int addNetwork(WifiConfiguration config) {
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (config == null) {
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return -1;
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        config.networkId = -1;
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return addOrUpdateNetwork(config);
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Update the network description of an existing configured network.
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param config the set of variables that describe the configuration,
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            contained in a {@link WifiConfiguration} object. It may
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            be sparse, so that only the items that are being changed
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            are non-<code>null</code>. The {@code networkId} field
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            must be set to the ID of the existing network being updated.
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the {@code networkId} of the supplied
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         {@code WifiConfiguration} on success.
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         <br/>
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         Returns {@code -1} on failure, including when the {@code networkId}
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         field of the {@code WifiConfiguration} does not refer to an
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         existing network.
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int updateNetwork(WifiConfiguration config) {
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (config == null || config.networkId < 0) {
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return -1;
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return addOrUpdateNetwork(config);
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Internal method for doing the RPC that creates a new network description
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or updates an existing one.
805227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff     *
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param config The possibly sparse object containing the variables that
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         are to set or updated in the network description.
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the ID of the network on success, {@code -1} on failure.
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int addOrUpdateNetwork(WifiConfiguration config) {
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mService.addOrUpdateNetwork(config);
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
814c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
819a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * Add a Hotspot 2.0 release 2 Management Object
820a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * @param mo The MO in XML form
821a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * @return -1 for failure
822a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * @hide
823a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     */
824a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    public int addPasspointManagementObject(String mo) {
825a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande        try {
826a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande            return mService.addPasspointManagementObject(mo);
827a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande        } catch (RemoteException e) {
828c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
829a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande        }
830a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    }
831a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande
832a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    /**
833a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * Modify a Hotspot 2.0 release 2 Management Object
834a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * @param fqdn The FQDN of the service provider
835a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * @param mos A List of MO definitions to be updated
836a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * @return the number of nodes updated, or -1 for failure
837a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * @hide
838a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     */
839a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    public int modifyPasspointManagementObject(String fqdn,
840a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande                                               List<PasspointManagementObjectDefinition> mos) {
841a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande        try {
842a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande            return mService.modifyPasspointManagementObject(fqdn, mos);
843a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande        } catch (RemoteException e) {
844c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
845a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande        }
846a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    }
847a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande
848a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    /**
849a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * Query for a Hotspot 2.0 release 2 OSU icon
850a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * @param bssid The BSSID of the AP
851a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * @param fileName Icon file name
852a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * @hide
853a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     */
854a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    public void queryPasspointIcon(long bssid, String fileName) {
855a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande        try {
856a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande            mService.queryPasspointIcon(bssid, fileName);
857a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande        } catch (RemoteException e) {
858c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
859a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande        }
860a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    }
861a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande
862a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    /**
863a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * Match the currently associated network against the SP matching the given FQDN
864a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * @param fqdn FQDN of the SP
865a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * @return ordinal [HomeProvider, RoamingProvider, Incomplete, None, Declined]
866a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * @hide
867a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     */
868a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    public int matchProviderWithCurrentNetwork(String fqdn) {
869a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande        try {
870a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande            return mService.matchProviderWithCurrentNetwork(fqdn);
871a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande        } catch (RemoteException e) {
872c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
873a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande        }
874a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    }
875a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande
876a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    /**
877a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * Deauthenticate and set the re-authentication hold off time for the current network
878a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * @param holdoff hold off time in milliseconds
879a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * @param ess set if the hold off pertains to an ESS rather than a BSS
880a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     * @hide
881a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande     */
882a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    public void deauthenticateNetwork(long holdoff, boolean ess) {
883a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande        try {
884a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande            mService.deauthenticateNetwork(holdoff, ess);
885a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande        } catch (RemoteException e) {
886c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
887a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande        }
888a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    }
889a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande
890a772f0cf34f0db67997cb31fa44315c0933563daVinit Deshpande    /**
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Remove the specified network from the list of configured networks.
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This may result in the asynchronous delivery of state change
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * events.
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param netId the integer that identifies the network configuration
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to the supplicant
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return {@code true} if the operation succeeded
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean removeNetwork(int netId) {
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mService.removeNetwork(netId);
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
902c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Allow a previously configured network to be associated with. If
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <code>disableOthers</code> is true, then all other configured
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * networks are disabled, and an attempt to connect to the selected
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * network is initiated. This may result in the asynchronous delivery
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of state change events.
9121022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti     * <p>
9131022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti     * <b>Note:</b> If an application's target SDK version is
914976f044b2b3eff2ce968e3ea59022414180c268dLorenzo Colitti     * {@link android.os.Build.VERSION_CODES#LOLLIPOP} or newer, network
9151022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti     * communication may not use Wi-Fi even if Wi-Fi is connected; traffic may
9161022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti     * instead be sent through another network, such as cellular data,
9171022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti     * Bluetooth tethering, or Ethernet. For example, traffic will never use a
9181022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti     * Wi-Fi network that does not provide Internet access (e.g. a wireless
9191022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti     * printer), if another network that does offer Internet access (e.g.
9201022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti     * cellular data) is available. Applications that need to ensure that their
9211022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti     * network traffic uses Wi-Fi should use APIs such as
9221022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti     * {@link Network#bindSocket(java.net.Socket)},
9231022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti     * {@link Network#openConnection(java.net.URL)}, or
9241022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti     * {@link ConnectivityManager#bindProcessToNetwork} to do so.
9251022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti     *
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param netId the ID of the network in the list of configured networks
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param disableOthers if true, disable all other networks. The way to
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * select a particular network to connect to is specify {@code true}
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for this parameter.
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return {@code true} if the operation succeeded
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean enableNetwork(int netId, boolean disableOthers) {
933976f044b2b3eff2ce968e3ea59022414180c268dLorenzo Colitti        final boolean pin = disableOthers && mTargetSdkVersion < Build.VERSION_CODES.LOLLIPOP;
9341022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti        if (pin) {
935531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti            NetworkRequest request = new NetworkRequest.Builder()
936531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti                    .clearCapabilities()
937531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti                    .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
938531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti                    .build();
939531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti            NetworkPinner.pin(mContext, request);
9401022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti        }
9411022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti
9421022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti        boolean success;
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
9441022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti            success = mService.enableNetwork(netId, disableOthers);
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
946c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
9471022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti        }
9481022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti
9491022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti        if (pin && !success) {
950531a34430072b9296aaeb47d9e7d04326a93fee4Lorenzo Colitti            NetworkPinner.unpin();
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9521022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti
9531022dde719ca430f062f9e628574d70ae1320677Lorenzo Colitti        return success;
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Disable a configured network. The specified network will not be
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a candidate for associating. This may result in the asynchronous
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * delivery of state change events.
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param netId the ID of the network as returned by {@link #addNetwork}.
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return {@code true} if the operation succeeded
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean disableNetwork(int netId) {
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mService.disableNetwork(netId);
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
967c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Disassociate from the currently active access point. This may result
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in the asynchronous delivery of state change events.
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return {@code true} if the operation succeeded
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean disconnect() {
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
978e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff            mService.disconnect();
979e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff            return true;
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
981c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Reconnect to the currently active access point, if we are currently
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * disconnected. This may result in the asynchronous delivery of state
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * change events.
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return {@code true} if the operation succeeded
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean reconnect() {
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
993e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff            mService.reconnect();
994e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff            return true;
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
996c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Reconnect to the currently active access point, even if we are already
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * connected. This may result in the asynchronous delivery of state
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * change events.
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return {@code true} if the operation succeeded
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean reassociate() {
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1008e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff            mService.reassociate();
1009e498475b187277309c81b38240c7e71ec049e369Irfan Sheriff            return true;
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
1011c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Check that the supplicant daemon is responding to requests.
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return {@code true} if we were able to communicate with the supplicant and
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it returned the expected response to the PING message.
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean pingSupplicant() {
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mService == null)
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mService.pingSupplicant();
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
1026c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
103073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    /* Keep this list in sync with wifi_hal.h */
103173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    /** @hide */
103273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    public static final int WIFI_FEATURE_INFRA            = 0x0001;  // Basic infrastructure mode
103373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    /** @hide */
103473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    public static final int WIFI_FEATURE_INFRA_5G         = 0x0002;  // Support for 5 GHz Band
103573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    /** @hide */
103673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    public static final int WIFI_FEATURE_PASSPOINT        = 0x0004;  // Support for GAS/ANQP
103773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    /** @hide */
103873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    public static final int WIFI_FEATURE_P2P              = 0x0008;  // Wifi-Direct
103973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    /** @hide */
104073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    public static final int WIFI_FEATURE_MOBILE_HOTSPOT   = 0x0010;  // Soft AP
104173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    /** @hide */
104273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    public static final int WIFI_FEATURE_SCANNER          = 0x0020;  // WifiScanner APIs
104373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    /** @hide */
104473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    public static final int WIFI_FEATURE_NAN              = 0x0040;  // Neighbor Awareness Networking
104573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    /** @hide */
104673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    public static final int WIFI_FEATURE_D2D_RTT          = 0x0080;  // Device-to-device RTT
104773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    /** @hide */
104873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    public static final int WIFI_FEATURE_D2AP_RTT         = 0x0100;  // Device-to-AP RTT
104973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    /** @hide */
105073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    public static final int WIFI_FEATURE_BATCH_SCAN       = 0x0200;  // Batched Scan (deprecated)
105173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    /** @hide */
105273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    public static final int WIFI_FEATURE_PNO              = 0x0400;  // Preferred network offload
105373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    /** @hide */
105473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    public static final int WIFI_FEATURE_ADDITIONAL_STA   = 0x0800;  // Support for two STAs
105573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    /** @hide */
105673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    public static final int WIFI_FEATURE_TDLS             = 0x1000;  // Tunnel directed link setup
105773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    /** @hide */
105873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    public static final int WIFI_FEATURE_TDLS_OFFCHANNEL  = 0x2000;  // Support for TDLS off channel
105973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    /** @hide */
106073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    public static final int WIFI_FEATURE_EPR              = 0x4000;  // Enhanced power reporting
1061ddfd35dbf9aab0ff196e1d7046ebe6bcd972c7a5Pierre Vandwalle    /** @hide */
1062ddfd35dbf9aab0ff196e1d7046ebe6bcd972c7a5Pierre Vandwalle    public static final int WIFI_FEATURE_AP_STA            = 0x8000;  // Support for AP STA Concurrency
1063ddfd35dbf9aab0ff196e1d7046ebe6bcd972c7a5Pierre Vandwalle    /** @hide */
1064ddfd35dbf9aab0ff196e1d7046ebe6bcd972c7a5Pierre Vandwalle    public static final int WIFI_FEATURE_LINK_LAYER_STATS  = 0x10000; // Link layer stats collection
1065ddfd35dbf9aab0ff196e1d7046ebe6bcd972c7a5Pierre Vandwalle    /** @hide */
1066ddfd35dbf9aab0ff196e1d7046ebe6bcd972c7a5Pierre Vandwalle    public static final int WIFI_FEATURE_LOGGER            = 0x20000; // WiFi Logger
1067ddfd35dbf9aab0ff196e1d7046ebe6bcd972c7a5Pierre Vandwalle    /** @hide */
1068ddfd35dbf9aab0ff196e1d7046ebe6bcd972c7a5Pierre Vandwalle    public static final int WIFI_FEATURE_HAL_EPNO          = 0x40000; // WiFi PNO enhanced
106973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande
107073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    private int getSupportedFeatures() {
107173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande        try {
107273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande            return mService.getSupportedFeatures();
107373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande        } catch (RemoteException e) {
1074c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
107573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande        }
107673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    }
107773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande
107873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    private boolean isFeatureSupported(int feature) {
107973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande        return (getSupportedFeatures() & feature) == feature;
108073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    }
108173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    /**
108273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     * @return true if this adapter supports 5 GHz band
108373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     */
108473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    public boolean is5GHzBandSupported() {
108573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande        return isFeatureSupported(WIFI_FEATURE_INFRA_5G);
108673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    }
108773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande
108873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    /**
108973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     * @return true if this adapter supports passpoint
109073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     * @hide
109173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     */
109273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    public boolean isPasspointSupported() {
109373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande        return isFeatureSupported(WIFI_FEATURE_PASSPOINT);
109473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    }
109573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande
109673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    /**
109773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     * @return true if this adapter supports WifiP2pManager (Wi-Fi Direct)
109873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     */
109973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    public boolean isP2pSupported() {
110073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande        return isFeatureSupported(WIFI_FEATURE_P2P);
110173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    }
110273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande
110373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    /**
110473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     * @return true if this adapter supports portable Wi-Fi hotspot
110573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     * @hide
110673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     */
110773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    @SystemApi
110873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    public boolean isPortableHotspotSupported() {
110973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande        return isFeatureSupported(WIFI_FEATURE_MOBILE_HOTSPOT);
111073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    }
111173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande
111273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    /**
111373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     * @return true if this adapter supports WifiScanner APIs
111473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     * @hide
111573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     */
111673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    @SystemApi
111773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    public boolean isWifiScannerSupported() {
111873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande        return isFeatureSupported(WIFI_FEATURE_SCANNER);
111973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    }
112073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande
112173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    /**
112273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     * @return true if this adapter supports Neighbour Awareness Network APIs
112320d329b08df7d1a94e6caee781f09e812a79c913Etan Cohen     * @hide PROPOSED_NAN_API
112473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     */
112573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    public boolean isNanSupported() {
112673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande        return isFeatureSupported(WIFI_FEATURE_NAN);
112773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    }
112873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande
112973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    /**
113073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     * @return true if this adapter supports Device-to-device RTT
113173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     * @hide
113273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     */
113373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    @SystemApi
113473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    public boolean isDeviceToDeviceRttSupported() {
113573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande        return isFeatureSupported(WIFI_FEATURE_D2D_RTT);
113673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    }
113773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande
113873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    /**
113973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     * @return true if this adapter supports Device-to-AP RTT
114073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     */
114173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    @SystemApi
114273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    public boolean isDeviceToApRttSupported() {
114373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande        return isFeatureSupported(WIFI_FEATURE_D2AP_RTT);
114473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    }
114573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande
114673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    /**
114773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     * @return true if this adapter supports offloaded connectivity scan
114873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     */
114973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    public boolean isPreferredNetworkOffloadSupported() {
115073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande        return isFeatureSupported(WIFI_FEATURE_PNO);
115173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    }
115273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande
115373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    /**
115473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     * @return true if this adapter supports multiple simultaneous connections
115573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     * @hide
115673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     */
115773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    public boolean isAdditionalStaSupported() {
115873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande        return isFeatureSupported(WIFI_FEATURE_ADDITIONAL_STA);
115973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    }
116073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande
116173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    /**
116273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     * @return true if this adapter supports Tunnel Directed Link Setup
116373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     */
116473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    public boolean isTdlsSupported() {
116573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande        return isFeatureSupported(WIFI_FEATURE_TDLS);
116673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    }
116773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande
116873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    /**
116973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     * @return true if this adapter supports Off Channel Tunnel Directed Link Setup
117073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     * @hide
117173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     */
117273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    public boolean isOffChannelTdlsSupported() {
117373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande        return isFeatureSupported(WIFI_FEATURE_TDLS_OFFCHANNEL);
117473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    }
117573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande
117673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    /**
117773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     * @return true if this adapter supports advanced power/performance counters
117873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     */
117973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    public boolean isEnhancedPowerReportingSupported() {
1180ddfd35dbf9aab0ff196e1d7046ebe6bcd972c7a5Pierre Vandwalle        return isFeatureSupported(WIFI_FEATURE_LINK_LAYER_STATS);
118173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    }
118273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande
118373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    /**
118473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     * Return the record of {@link WifiActivityEnergyInfo} object that
118573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     * has the activity and energy info. This can be used to ascertain what
118673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     * the controller has been up to, since the last sample.
118773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     * @param updateType Type of info, cached vs refreshed.
118873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     *
118973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     * @return a record with {@link WifiActivityEnergyInfo} or null if
119073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     * report is unavailable or unsupported
119173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     * @hide
119273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     */
119373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    public WifiActivityEnergyInfo getControllerActivityEnergyInfo(int updateType) {
119473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande        if (mService == null) return null;
119573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande        try {
119673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande            synchronized(this) {
11979a568e6f2f69cc923bbfc1ffb07c2f194acdb981Mitchell Wills                return mService.reportActivityInfo();
119873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande            }
119973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande        } catch (RemoteException e) {
1200c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
120173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande        }
120273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    }
120373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande
1204738803fee62a98f244250996380820c4923e7f7bYuhao Zheng    /**
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Request a scan for access points. Returns immediately. The availability
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of the results is made known later by means of an asynchronous event sent
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * on completion of the scan.
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return {@code true} if the operation succeeded, i.e., the scan was initiated
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1210a5ec95cdb1a7d2024249277dff1f99d0046c9b56Mike Lockwood    public boolean startScan() {
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1212738803fee62a98f244250996380820c4923e7f7bYuhao Zheng            mService.startScan(null, null);
12136942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie            return true;
12146942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie        } catch (RemoteException e) {
1215c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
12166942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie        }
12176942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie    }
12186942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie
12196942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie    /** @hide */
1220c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie    @SystemApi
12216942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie    public boolean startScan(WorkSource workSource) {
12226942a1200cf8872e67e8e0a8ebc9e2e65531595bDavid Christie        try {
1223738803fee62a98f244250996380820c4923e7f7bYuhao Zheng            mService.startScan(null, workSource);
1224738803fee62a98f244250996380820c4923e7f7bYuhao Zheng            return true;
1225738803fee62a98f244250996380820c4923e7f7bYuhao Zheng        } catch (RemoteException e) {
1226c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
1227738803fee62a98f244250996380820c4923e7f7bYuhao Zheng        }
1228738803fee62a98f244250996380820c4923e7f7bYuhao Zheng    }
1229738803fee62a98f244250996380820c4923e7f7bYuhao Zheng
1230738803fee62a98f244250996380820c4923e7f7bYuhao Zheng    /**
1231da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle     * startLocationRestrictedScan()
1232da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle     * Trigger a scan which will not make use of DFS channels and is thus not suitable for
1233da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle     * establishing wifi connection.
123488d93cd68a32e7110f9328ff522226126c7e493eMitchell Wills     * @deprecated This API is nolonger supported.
123588d93cd68a32e7110f9328ff522226126c7e493eMitchell Wills     * Use {@link android.net.wifi.WifiScanner} API
1236da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle     * @hide
1237da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle     */
123888d93cd68a32e7110f9328ff522226126c7e493eMitchell Wills    @Deprecated
1239da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle    @SystemApi
1240da123a6726e7c64b3f19f74ed0eb02bb4398a989vandwalle    public boolean startLocationRestrictedScan(WorkSource workSource) {
124188d93cd68a32e7110f9328ff522226126c7e493eMitchell Wills        return false;
12420451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt    }
12430451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt
12440451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt    /**
12450451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt     * Check if the Batched Scan feature is supported.
12460451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt     *
12470451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt     * @return false if not supported.
124888d93cd68a32e7110f9328ff522226126c7e493eMitchell Wills     * @deprecated This API is nolonger supported.
124988d93cd68a32e7110f9328ff522226126c7e493eMitchell Wills     * Use {@link android.net.wifi.WifiScanner} API
12500451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt     * @hide
12510451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt     */
125288d93cd68a32e7110f9328ff522226126c7e493eMitchell Wills    @Deprecated
1253c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie    @SystemApi
12540451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt    public boolean isBatchedScanSupported() {
125588d93cd68a32e7110f9328ff522226126c7e493eMitchell Wills        return false;
12560451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt    }
12570451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt
12580451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt    /**
12590451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt     * Retrieve the latest batched scan result.  This should be called immediately after
12600451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt     * {@link BATCHED_SCAN_RESULTS_AVAILABLE_ACTION} is received.
126188d93cd68a32e7110f9328ff522226126c7e493eMitchell Wills     * @deprecated This API is nolonger supported.
126288d93cd68a32e7110f9328ff522226126c7e493eMitchell Wills     * Use {@link android.net.wifi.WifiScanner} API
12630451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt     * @hide
12640451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt     */
126588d93cd68a32e7110f9328ff522226126c7e493eMitchell Wills    @Deprecated
1266c20b795cf05b48fe5e024c19dab9c7e4b18cd10fDavid Christie    @SystemApi
12670451d59ba2d768e7653752028910f00a6c96e64eRobert Greenwalt    public List<BatchedScanResult> getBatchedScanResults() {
126888d93cd68a32e7110f9328ff522226126c7e493eMitchell Wills        return null;
12698e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt    }
12708e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt
12718e628dadc321bf49e93e482540df87431d014b01Robert Greenwalt    /**
1272b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales     * Creates a configuration token describing the network referenced by {@code netId}
1273b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales     * of MIME type application/vnd.wfa.wsc. Can be used to configure WiFi networks via NFC.
1274b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales     *
1275b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales     * @return hex-string encoded configuration token
1276b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales     * @hide
1277b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales     */
1278b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales    public String getWpsNfcConfigurationToken(int netId) {
1279b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales        try {
1280b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales            return mService.getWpsNfcConfigurationToken(netId);
1281b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales        } catch (RemoteException e) {
1282c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
1283b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales        }
1284b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales    }
1285b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales
1286b2e6bfd0f0fc675b253ce081d97ca192422a7495Andres Morales    /**
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return dynamic information about the current Wi-Fi connection, if any is active.
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the Wi-Fi information, contained in {@link WifiInfo}.
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public WifiInfo getConnectionInfo() {
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mService.getConnectionInfo();
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
1294c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the results of the latest access point scan.
1300cb13aebfec313a3433ed0f53cc2e3b6dbaf888d0Fyodor Kupolov     * @return the list of access points found in the most recent scan. An app must hold
1301cb13aebfec313a3433ed0f53cc2e3b6dbaf888d0Fyodor Kupolov     * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION ACCESS_COARSE_LOCATION} or
1302959991b957fb58672aef17c46a7662941f138e19Fyodor Kupolov     * {@link android.Manifest.permission#ACCESS_FINE_LOCATION ACCESS_FINE_LOCATION} permission
1303ed9297991a922b88a00c04d034c172c18d550ac1Paul Stewart     * in order to get valid results.  If there is a remote exception (e.g., either a communication
1304ed9297991a922b88a00c04d034c172c18d550ac1Paul Stewart     * problem with the system service or an exception within the framework) an empty list will be
1305ed9297991a922b88a00c04d034c172c18d550ac1Paul Stewart     * returned.
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public List<ScanResult> getScanResults() {
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
130995d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn            return mService.getScanResults(mContext.getOpPackageName());
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
1311c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13161ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff     * Check if scanning is always available.
13171ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff     *
13181ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff     * If this return {@code true}, apps can issue {@link #startScan} and fetch scan results
13191ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff     * even when Wi-Fi is turned off.
13201ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff     *
13211ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff     * To change this setting, see {@link #ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE}.
13221ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff     */
13237ea33eac4b57aabf9326d60f52e3ed85217ac846Irfan Sheriff    public boolean isScanAlwaysAvailable() {
13241ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff        try {
13257ea33eac4b57aabf9326d60f52e3ed85217ac846Irfan Sheriff            return mService.isScanAlwaysAvailable();
13261ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff        } catch (RemoteException e) {
1327c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
13281ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff        }
13291ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff    }
13301ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff
13311ef840cdc785d0e8a07e317cc1d7af42a0d0185dIrfan Sheriff    /**
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Tell the supplicant to persist the current list of configured networks.
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Note: It is possible for this method to change the network IDs of
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * existing networks. You should assume the network IDs can be different
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * after calling this method.
1337227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff     *
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return {@code true} if the operation succeeded
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean saveConfiguration() {
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mService.saveConfiguration();
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
1344c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1349ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff     * Set the country code.
1350ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff     * @param countryCode country code in ISO 3166 format.
1351ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff     * @param persist {@code true} if this needs to be remembered
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1353ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff     * @hide
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1355ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff    public void setCountryCode(String country, boolean persist) {
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1357ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff            mService.setCountryCode(country, persist);
1358c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey        } catch (RemoteException e) {
1359c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
1360c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey        }
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1364b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe    * get the country code.
1365b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe    * @return the country code in ISO 3166 format.
1366b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe    *
1367b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe    * @hide
1368b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe    */
1369b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe    public String getCountryCode() {
1370b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe       try {
1371b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe           String country = mService.getCountryCode();
1372c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey           return country;
1373b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe       } catch (RemoteException e) {
1374c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey           throw e.rethrowFromSystemServer();
1375b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe       }
1376b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe    }
1377b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe
1378b938c0e2036d28df24ec626fc8ed7e277248b9a6xinhe    /**
137936f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff     * Set the operational frequency band.
138036f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff     * @param band  One of
138136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff     *     {@link #WIFI_FREQUENCY_BAND_AUTO},
138236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff     *     {@link #WIFI_FREQUENCY_BAND_5GHZ},
138336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff     *     {@link #WIFI_FREQUENCY_BAND_2GHZ},
138436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff     * @param persist {@code true} if this needs to be remembered
138536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff     * @hide
138636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff     */
138736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff    public void setFrequencyBand(int band, boolean persist) {
138836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff        try {
138936f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff            mService.setFrequencyBand(band, persist);
1390c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey        } catch (RemoteException e) {
1391c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
1392c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey        }
139336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff    }
139436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff
139536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff    /**
139636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff     * Get the operational frequency band.
139736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff     * @return One of
139836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff     *     {@link #WIFI_FREQUENCY_BAND_AUTO},
139936f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff     *     {@link #WIFI_FREQUENCY_BAND_5GHZ},
140036f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff     *     {@link #WIFI_FREQUENCY_BAND_2GHZ} or
140136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff     *     {@code -1} on failure.
140236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff     * @hide
140336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff     */
140436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff    public int getFrequencyBand() {
140536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff        try {
140636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff            return mService.getFrequencyBand();
140736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff        } catch (RemoteException e) {
1408c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
140936f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff        }
141036f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff    }
141136f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff
141236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff    /**
141336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff     * Check if the chipset supports dual frequency band (2.4 GHz and 5 GHz)
141436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff     * @return {@code true} if supported, {@code false} otherwise.
141536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff     * @hide
141636f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff     */
141736f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff    public boolean isDualBandSupported() {
141836f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff        try {
141936f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff            return mService.isDualBandSupported();
142036f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff        } catch (RemoteException e) {
1421c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
142236f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff        }
142336f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff    }
142436f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff
142536f7413dabfab50699135019ba55151e9227f59dIrfan Sheriff    /**
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the DHCP-assigned addresses from the last successful DHCP request,
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if any.
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the DHCP information
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public DhcpInfo getDhcpInfo() {
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mService.getDhcpInfo();
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
1434c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Enable or disable Wi-Fi.
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param enabled {@code true} to enable, {@code false} to disable.
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return {@code true} if the operation succeeds (or if the existing state
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         is the same as the requested state).
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean setWifiEnabled(boolean enabled) {
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mService.setWifiEnabled(enabled);
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
1448c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the Wi-Fi enabled state.
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return One of {@link #WIFI_STATE_DISABLED},
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         {@link #WIFI_STATE_DISABLING}, {@link #WIFI_STATE_ENABLED},
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         {@link #WIFI_STATE_ENABLING}, {@link #WIFI_STATE_UNKNOWN}
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isWifiEnabled()
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getWifiState() {
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mService.getWifiEnabledState();
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
1463c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1466227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1468227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff     * Return whether Wi-Fi is enabled or disabled.
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return {@code true} if Wi-Fi is enabled
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getWifiState()
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isWifiEnabled() {
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getWifiState() == WIFI_STATE_ENABLED;
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1475227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff
14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1477f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng     * Return TX packet counter, for CTS test of WiFi watchdog.
1478f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng     * @param listener is the interface to receive result
1479f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng     *
1480f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng     * @hide for CTS test only
1481f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng     */
1482f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng    public void getTxPacketCount(TxPacketCountListener listener) {
148375f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart        getChannel().sendMessage(RSSI_PKTCNT_FETCH, 0, putListener(listener));
1484f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng    }
1485f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng
1486f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng    /**
14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Calculates the level of the signal. This should be used any time a signal
14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is being shown.
1489227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff     *
14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param rssi The power of the signal measured in RSSI.
14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param numLevels The number of levels to consider in the calculated
14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            level.
14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return A level of the signal, given in the range of 0 to numLevels-1
14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         (both inclusive).
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static int calculateSignalLevel(int rssi, int numLevels) {
14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (rssi <= MIN_RSSI) {
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return 0;
14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (rssi >= MAX_RSSI) {
15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return numLevels - 1;
15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
15024c0d81b8add0372cc7194b17cc6d2bfc58baacd1Daniel Sandler            float inputRange = (MAX_RSSI - MIN_RSSI);
15034c0d81b8add0372cc7194b17cc6d2bfc58baacd1Daniel Sandler            float outputRange = (numLevels - 1);
15044c0d81b8add0372cc7194b17cc6d2bfc58baacd1Daniel Sandler            return (int)((float)(rssi - MIN_RSSI) * outputRange / inputRange);
15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1507227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff
15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Compares two signal strengths.
1510227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff     *
15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param rssiA The power of the first signal measured in RSSI.
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param rssiB The power of the second signal measured in RSSI.
15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns <0 if the first signal is weaker than the second signal,
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         0 if the two signals have the same strength, and >0 if the first
15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         signal is stronger than the second signal.
15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static int compareSignalLevel(int rssiA, int rssiB) {
15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return rssiA - rssiB;
15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15225321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * Start AccessPoint mode with the specified
15235321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * configuration. If the radio is already running in
15245321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * AP mode, update the new configuration
15255321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * Note that starting in access point mode disables station
15265321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * mode operation
15275321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * @param wifiConfig SSID, security and channel details as
15285321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     *        part of WifiConfiguration
15295321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * @return {@code true} if the operation succeeds, {@code false} otherwise
15305321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     *
1531b625377b1a9b324254fcde9928eade4473712486Jeremy Klein     * @hide
15325321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     */
1533b625377b1a9b324254fcde9928eade4473712486Jeremy Klein    @SystemApi
15345321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff    public boolean setWifiApEnabled(WifiConfiguration wifiConfig, boolean enabled) {
15355321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff        try {
1536ffcea7ae7316ab748a49f5e8f6c6798356f35719Irfan Sheriff            mService.setWifiApEnabled(wifiConfig, enabled);
1537ffcea7ae7316ab748a49f5e8f6c6798356f35719Irfan Sheriff            return true;
15385321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff        } catch (RemoteException e) {
1539c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
15405321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff        }
15415321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff    }
15425321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff
15435321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff    /**
15445321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * Gets the Wi-Fi enabled state.
15455321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * @return One of {@link #WIFI_AP_STATE_DISABLED},
15465321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     *         {@link #WIFI_AP_STATE_DISABLING}, {@link #WIFI_AP_STATE_ENABLED},
15475321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     *         {@link #WIFI_AP_STATE_ENABLING}, {@link #WIFI_AP_STATE_FAILED}
15485321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * @see #isWifiApEnabled()
15495321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     *
1550b625377b1a9b324254fcde9928eade4473712486Jeremy Klein     * @hide
15515321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     */
1552b625377b1a9b324254fcde9928eade4473712486Jeremy Klein    @SystemApi
15535321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff    public int getWifiApState() {
15545321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff        try {
15555321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff            return mService.getWifiApEnabledState();
15565321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff        } catch (RemoteException e) {
1557c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
15585321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff        }
15595321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff    }
15605321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff
15615321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff    /**
15625321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * Return whether Wi-Fi AP is enabled or disabled.
15635321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * @return {@code true} if Wi-Fi AP is enabled
15645321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     * @see #getWifiApState()
15655321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     *
1566b625377b1a9b324254fcde9928eade4473712486Jeremy Klein     * @hide
15675321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff     */
1568b625377b1a9b324254fcde9928eade4473712486Jeremy Klein    @SystemApi
15695321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff    public boolean isWifiApEnabled() {
15705321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff        return getWifiApState() == WIFI_AP_STATE_ENABLED;
15715321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff    }
15725321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff
15735321aef4a22daef6ed01ed48d936cdd82f2e38b7Irfan Sheriff    /**
15749ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff     * Gets the Wi-Fi AP Configuration.
15759ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff     * @return AP details in WifiConfiguration
15769ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff     *
1577b625377b1a9b324254fcde9928eade4473712486Jeremy Klein     * @hide
15789ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff     */
1579b625377b1a9b324254fcde9928eade4473712486Jeremy Klein    @SystemApi
15809ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff    public WifiConfiguration getWifiApConfiguration() {
15819ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff        try {
15829ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff            return mService.getWifiApConfiguration();
15839ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff        } catch (RemoteException e) {
1584c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
15859ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff        }
15869ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff    }
15879ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff
15889ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff    /**
1589e9b056f8860296a08f93f4b7d2a0971c746c227bJan Nordqvist     * Builds a WifiConfiguration from Hotspot 2.0 MIME file.
1590e9b056f8860296a08f93f4b7d2a0971c746c227bJan Nordqvist     * @return AP details in WifiConfiguration
1591e9b056f8860296a08f93f4b7d2a0971c746c227bJan Nordqvist     *
1592e9b056f8860296a08f93f4b7d2a0971c746c227bJan Nordqvist     * @hide Dont open yet
1593e9b056f8860296a08f93f4b7d2a0971c746c227bJan Nordqvist     */
1594e9b056f8860296a08f93f4b7d2a0971c746c227bJan Nordqvist    public WifiConfiguration buildWifiConfig(String uriString, String mimeType, byte[] data) {
1595e9b056f8860296a08f93f4b7d2a0971c746c227bJan Nordqvist        try {
1596e9b056f8860296a08f93f4b7d2a0971c746c227bJan Nordqvist            return mService.buildWifiConfig(uriString, mimeType, data);
1597e9b056f8860296a08f93f4b7d2a0971c746c227bJan Nordqvist        } catch (RemoteException e) {
1598c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
15999ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff        }
16009ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff    }
16019ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff
16029ab518ad793385f8405edf19363fe825fb64f5f8Irfan Sheriff    /**
160317b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff     * Sets the Wi-Fi AP Configuration.
160417b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff     * @return {@code true} if the operation succeeded, {@code false} otherwise
160517b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff     *
1606b625377b1a9b324254fcde9928eade4473712486Jeremy Klein     * @hide
160717b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff     */
1608b625377b1a9b324254fcde9928eade4473712486Jeremy Klein    @SystemApi
160917b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff    public boolean setWifiApConfiguration(WifiConfiguration wifiConfig) {
161017b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff        try {
161117b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff            mService.setWifiApConfiguration(wifiConfig);
161217b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff            return true;
161317b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff        } catch (RemoteException e) {
1614c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
161517b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff        }
161617b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff    }
161717b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff
16180d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff    /**
16190d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff     * Add a bssid to the supplicant blacklist
16200d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff     *
16210d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff     * This API is used by WifiWatchdogService
16220d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff     *
16230d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff     * @return {@code true} if the operation succeeds else {@code false}
16240d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff     * @hide
16250d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff     */
16260d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff    public boolean addToBlacklist(String bssid) {
16270d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff        try {
16280d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff            mService.addToBlacklist(bssid);
16290d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff            return true;
16300d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff        } catch (RemoteException e) {
1631c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
16320d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff        }
16330d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff    }
16340d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff
16350d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff    /**
16360d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff     * Clear the supplicant blacklist
16370d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff     *
16380d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff     * This API is used by WifiWatchdogService
16390d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff     *
16400d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff     * @return {@code true} if the operation succeeds else {@code false}
16410d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff     * @hide
16420d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff     */
16430d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff    public boolean clearBlacklist() {
16440d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff        try {
16450d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff            mService.clearBlacklist();
16460d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff            return true;
16470d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff        } catch (RemoteException e) {
1648c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
16490d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff        }
16500d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff    }
16510d25534fed91f636def5776ddc4605005bd7471cIrfan Sheriff
165264f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde
165364f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde    /**
1654b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde     * Enable/Disable TDLS on a specific local route.
165564f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde     *
1656b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde     * <p>
1657b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde     * TDLS enables two wireless endpoints to talk to each other directly
1658b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde     * without going through the access point that is managing the local
1659b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde     * network. It saves bandwidth and improves quality of the link.
1660b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde     * </p>
1661b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde     * <p>
1662b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde     * This API enables/disables the option of using TDLS. If enabled, the
1663b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde     * underlying hardware is free to use TDLS or a hop through the access
1664b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde     * point. If disabled, existing TDLS session is torn down and
1665b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde     * hardware is restricted to use access point for transferring wireless
1666b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde     * packets. Default value for all routes is 'disabled', meaning restricted
1667b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde     * to use access point for transferring packets.
1668b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde     * </p>
166964f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde     *
167064f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde     * @param remoteIPAddress IP address of the endpoint to setup TDLS with
167164f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde     * @param enable true = setup and false = tear down TDLS
167264f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde     */
1673b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde    public void setTdlsEnabled(InetAddress remoteIPAddress, boolean enable) {
167464f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde        try {
167564f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde            mService.enableTdls(remoteIPAddress.getHostAddress(), enable);
167664f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde        } catch (RemoteException e) {
1677c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
167864f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde        }
167964f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde    }
168064f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde
168164f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde    /**
1682b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde     * Similar to {@link #setTdlsEnabled(InetAddress, boolean) }, except
1683b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde     * this version allows you to specify remote endpoint with a MAC address.
168464f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde     * @param remoteMacAddress MAC address of the remote endpoint such as 00:00:0c:9f:f2:ab
168564f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde     * @param enable true = setup and false = tear down TDLS
168664f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde     */
1687b676a4a70db36bdd6ce5060d16f453f797378098Vinit Deshapnde    public void setTdlsEnabledWithMacAddress(String remoteMacAddress, boolean enable) {
168864f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde        try {
168964f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde            mService.enableTdlsWithMacAddress(remoteMacAddress, enable);
169064f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde        } catch (RemoteException e) {
1691c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
169264f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde        }
169364f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde    }
169464f0d5ba158e9135bcd48d64a1c0db282a4628baVinit Deshapnde
1695e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff    /* TODO: deprecate synchronous API and open up the following API */
1696ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff
1697d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff    private static final int BASE = Protocol.BASE_WIFI_MANAGER;
1698d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff
1699ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff    /* Commands to WifiService */
1700ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff    /** @hide */
1701d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff    public static final int CONNECT_NETWORK                 = BASE + 1;
1702d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff    /** @hide */
1703d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff    public static final int CONNECT_NETWORK_FAILED          = BASE + 2;
1704d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff    /** @hide */
1705d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff    public static final int CONNECT_NETWORK_SUCCEEDED       = BASE + 3;
1706d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff
1707d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff    /** @hide */
1708d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff    public static final int FORGET_NETWORK                  = BASE + 4;
1709d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff    /** @hide */
1710d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff    public static final int FORGET_NETWORK_FAILED           = BASE + 5;
1711ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff    /** @hide */
1712d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff    public static final int FORGET_NETWORK_SUCCEEDED        = BASE + 6;
1713d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff
1714ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff    /** @hide */
1715d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff    public static final int SAVE_NETWORK                    = BASE + 7;
1716ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff    /** @hide */
1717d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff    public static final int SAVE_NETWORK_FAILED             = BASE + 8;
17188dc6a1b2823f374a176fb21b8a174664a5f825faIsaac Levy    /** @hide */
1719d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff    public static final int SAVE_NETWORK_SUCCEEDED          = BASE + 9;
1720ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff
1721ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff    /** @hide */
1722d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff    public static final int START_WPS                       = BASE + 10;
1723d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff    /** @hide */
1724d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff    public static final int START_WPS_SUCCEEDED             = BASE + 11;
1725d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff    /** @hide */
1726d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff    public static final int WPS_FAILED                      = BASE + 12;
172786a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff    /** @hide */
1728d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff    public static final int WPS_COMPLETED                   = BASE + 13;
1729d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff
1730d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff    /** @hide */
173186a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff    public static final int CANCEL_WPS                      = BASE + 14;
173286a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff    /** @hide */
173386a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff    public static final int CANCEL_WPS_FAILED               = BASE + 15;
173486a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff    /** @hide */
173586a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff    public static final int CANCEL_WPS_SUCCEDED             = BASE + 16;
173686a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff
173786a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff    /** @hide */
173886a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff    public static final int DISABLE_NETWORK                 = BASE + 17;
1739d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff    /** @hide */
174086a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff    public static final int DISABLE_NETWORK_FAILED          = BASE + 18;
1741d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff    /** @hide */
174286a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff    public static final int DISABLE_NETWORK_SUCCEEDED       = BASE + 19;
1743ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff
1744f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng    /** @hide */
1745f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng    public static final int RSSI_PKTCNT_FETCH               = BASE + 20;
1746f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng    /** @hide */
1747f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng    public static final int RSSI_PKTCNT_FETCH_SUCCEEDED     = BASE + 21;
1748f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng    /** @hide */
1749f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng    public static final int RSSI_PKTCNT_FETCH_FAILED        = BASE + 22;
1750f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng
1751d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff    /**
1752d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff     * Passed with {@link ActionListener#onFailure}.
1753d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff     * Indicates that the operation failed due to an internal error.
175473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     * @hide
1755d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff     */
175686a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff    public static final int ERROR                       = 0;
1757d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff
1758d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff    /**
1759d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff     * Passed with {@link ActionListener#onFailure}.
1760d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff     * Indicates that the operation is already in progress
176173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     * @hide
1762d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff     */
176386a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff    public static final int IN_PROGRESS                 = 1;
1764d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff
1765d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff    /**
1766d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff     * Passed with {@link ActionListener#onFailure}.
1767d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff     * Indicates that the operation failed because the framework is busy and
1768d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff     * unable to service the request
176973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     * @hide
1770d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff     */
177186a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff    public static final int BUSY                        = 2;
1772d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff
1773d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff    /* WPS specific errors */
1774674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande    /** WPS overlap detected */
177586a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff    public static final int WPS_OVERLAP_ERROR           = 3;
1776674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande    /** WEP on WPS is prohibited */
177786a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff    public static final int WPS_WEP_PROHIBITED          = 4;
1778674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande    /** TKIP only prohibited */
177986a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff    public static final int WPS_TKIP_ONLY_PROHIBITED    = 5;
1780674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande    /** Authentication failure on WPS */
178186a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff    public static final int WPS_AUTH_FAILURE            = 6;
1782674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande    /** WPS timed out */
178386a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff    public static final int WPS_TIMED_OUT               = 7;
1784d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff
178510652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde    /**
178610652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde     * Passed with {@link ActionListener#onFailure}.
178710652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde     * Indicates that the operation failed due to invalid inputs
178873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     * @hide
178910652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde     */
179010652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde    public static final int INVALID_ARGS                = 8;
179110652a95b16909acf26f31cdafc0c6aa09212f26Vinit Deshapnde
1792ae81483a15bb3811cfc221970ea290599b43d4deSky Faber    /**
1793ae81483a15bb3811cfc221970ea290599b43d4deSky Faber     * Passed with {@link ActionListener#onFailure}.
1794ae81483a15bb3811cfc221970ea290599b43d4deSky Faber     * Indicates that the operation failed due to user permissions.
1795ae81483a15bb3811cfc221970ea290599b43d4deSky Faber     * @hide
1796ae81483a15bb3811cfc221970ea290599b43d4deSky Faber     */
1797ae81483a15bb3811cfc221970ea290599b43d4deSky Faber    public static final int NOT_AUTHORIZED              = 9;
1798ae81483a15bb3811cfc221970ea290599b43d4deSky Faber
179973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    /**
180073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     * Interface for callback invocation on an application action
180173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     * @hide
180273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande     */
1803d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff    public interface ActionListener {
1804d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff        /** The operation succeeded */
1805d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff        public void onSuccess();
1806d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff        /**
1807d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff         * The operation failed
1808d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff         * @param reason The reason for failure could be one of
1809d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff         * {@link #ERROR}, {@link #IN_PROGRESS} or {@link #BUSY}
1810d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff         */
1811d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff        public void onFailure(int reason);
1812d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff    }
1813d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff
1814674ca8a1f47c07033645a1016e68a2e82597e2faVinit Deshpande    /** Interface for callback invocation on a start WPS action */
181573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    public static abstract class WpsCallback {
1816d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff        /** WPS start succeeded */
181773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande        public abstract void onStarted(String pin);
1818d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff
1819d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff        /** WPS operation completed succesfully */
182073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande        public abstract void onSucceeded();
1821d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff
1822d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff        /**
1823d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff         * WPS operation failed
1824d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff         * @param reason The reason for failure could be one of
182573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande         * {@link #WPS_TKIP_ONLY_PROHIBITED}, {@link #WPS_OVERLAP_ERROR},
182673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande         * {@link #WPS_WEP_PROHIBITED}, {@link #WPS_TIMED_OUT} or {@link #WPS_AUTH_FAILURE}
182773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande         * and some generic errors.
1828d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff         */
182973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande        public abstract void onFailed(int reason);
1830d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff    }
1831d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff
1832f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng    /** Interface for callback invocation on a TX packet count poll action {@hide} */
1833f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng    public interface TxPacketCountListener {
1834f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng        /**
1835f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng         * The operation succeeded
1836f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng         * @param count TX packet counter
1837f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng         */
1838f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng        public void onSuccess(int count);
1839f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng        /**
1840f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng         * The operation failed
1841f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng         * @param reason The reason for failure could be one of
1842f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng         * {@link #ERROR}, {@link #IN_PROGRESS} or {@link #BUSY}
1843f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng         */
1844f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng        public void onFailure(int reason);
1845f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng    }
1846f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng
1847a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart    // Ensure that multiple ServiceHandler threads do not interleave message dispatch.
1848a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart    private static final Object sServiceHandlerDispatchLock = new Object();
1849a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart
1850a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart    private class ServiceHandler extends Handler {
185188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff        ServiceHandler(Looper looper) {
185288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff            super(looper);
1853d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff        }
1854d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff
185588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff        @Override
185688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff        public void handleMessage(Message message) {
1857a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart            synchronized (sServiceHandlerDispatchLock) {
1858a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart                dispatchMessageToListeners(message);
1859a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart            }
1860a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart        }
1861a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart
1862a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart        private void dispatchMessageToListeners(Message message) {
186388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff            Object listener = removeListener(message.arg2);
186488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff            switch (message.what) {
186588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED:
186688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                    if (message.arg1 == AsyncChannel.STATUS_SUCCESSFUL) {
1867a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart                        mAsyncChannel.sendMessage(AsyncChannel.CMD_CHANNEL_FULL_CONNECTION);
186888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                    } else {
186988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                        Log.e(TAG, "Failed to set up channel connection");
187088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                        // This will cause all further async API calls on the WifiManager
187188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                        // to fail and throw an exception
1872a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart                        mAsyncChannel = null;
187388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                    }
1874a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart                    mConnected.countDown();
187588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                    break;
187688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                case AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED:
187788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                    // Ignore
187888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                    break;
187988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                case AsyncChannel.CMD_CHANNEL_DISCONNECTED:
188088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                    Log.e(TAG, "Channel connection lost");
188188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                    // This will cause all further async API calls on the WifiManager
188288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                    // to fail and throw an exception
1883a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart                    mAsyncChannel = null;
1884fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff                    getLooper().quit();
188588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                    break;
188688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                    /* ActionListeners grouped together */
188788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                case WifiManager.CONNECT_NETWORK_FAILED:
188888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                case WifiManager.FORGET_NETWORK_FAILED:
188988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                case WifiManager.SAVE_NETWORK_FAILED:
189088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                case WifiManager.DISABLE_NETWORK_FAILED:
189188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                    if (listener != null) {
189288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                        ((ActionListener) listener).onFailure(message.arg1);
189388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                    }
189488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                    break;
189588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                    /* ActionListeners grouped together */
189688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                case WifiManager.CONNECT_NETWORK_SUCCEEDED:
189788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                case WifiManager.FORGET_NETWORK_SUCCEEDED:
189888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                case WifiManager.SAVE_NETWORK_SUCCEEDED:
189988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                case WifiManager.DISABLE_NETWORK_SUCCEEDED:
190088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                    if (listener != null) {
190188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                        ((ActionListener) listener).onSuccess();
190288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                    }
190388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                    break;
190488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                case WifiManager.START_WPS_SUCCEEDED:
190588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                    if (listener != null) {
190688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                        WpsResult result = (WpsResult) message.obj;
190773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande                        ((WpsCallback) listener).onStarted(result.pin);
190888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                        //Listener needs to stay until completion or failure
1909a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart                        synchronized (mListenerMapLock) {
1910a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart                            mListenerMap.put(message.arg2, listener);
1911d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff                        }
191288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                    }
191388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                    break;
191488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                case WifiManager.WPS_COMPLETED:
191588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                    if (listener != null) {
191673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande                        ((WpsCallback) listener).onSucceeded();
191788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                    }
191888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                    break;
191988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                case WifiManager.WPS_FAILED:
192088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                    if (listener != null) {
192173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande                        ((WpsCallback) listener).onFailed(message.arg1);
192273f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande                    }
192373f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande                    break;
192473f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande                case WifiManager.CANCEL_WPS_SUCCEDED:
192573f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande                    if (listener != null) {
192673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande                        ((WpsCallback) listener).onSucceeded();
192773f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande                    }
192873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande                    break;
192973f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande                case WifiManager.CANCEL_WPS_FAILED:
193073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande                    if (listener != null) {
193173f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande                        ((WpsCallback) listener).onFailed(message.arg1);
193288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                    }
1933f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng                    break;
1934f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng                case WifiManager.RSSI_PKTCNT_FETCH_SUCCEEDED:
1935f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng                    if (listener != null) {
1936f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng                        RssiPacketCountInfo info = (RssiPacketCountInfo) message.obj;
1937f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng                        if (info != null)
1938f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng                            ((TxPacketCountListener) listener).onSuccess(info.txgood + info.txbad);
1939f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng                        else
1940f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng                            ((TxPacketCountListener) listener).onFailure(ERROR);
1941f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng                    }
1942f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng                    break;
1943f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng                case WifiManager.RSSI_PKTCNT_FETCH_FAILED:
1944f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng                    if (listener != null) {
1945f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng                        ((TxPacketCountListener) listener).onFailure(message.arg1);
1946f6307820c88e694e102824225b9d8caa6de75a30Yuhao Zheng                    }
194788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                    break;
194888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                default:
194988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                    //ignore
195088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                    break;
1951d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff            }
1952d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff        }
195388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff    }
1954d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff
1955a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart    private int putListener(Object listener) {
195688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff        if (listener == null) return INVALID_KEY;
195788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff        int key;
1958a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart        synchronized (mListenerMapLock) {
195988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff            do {
1960a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart                key = mListenerKey++;
196188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff            } while (key == INVALID_KEY);
1962a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart            mListenerMap.put(key, listener);
1963d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff        }
196488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff        return key;
196588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff    }
1966d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff
1967a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart    private Object removeListener(int key) {
196888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff        if (key == INVALID_KEY) return null;
1969a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart        synchronized (mListenerMapLock) {
1970a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart            Object listener = mListenerMap.get(key);
1971a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart            mListenerMap.remove(key);
197288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff            return listener;
1973d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff        }
1974d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff    }
1975ebe606fccd9293674273d5f73246e0e8e6e6ddcfIrfan Sheriff
197675f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart    private synchronized AsyncChannel getChannel() {
197775f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart        if (mAsyncChannel == null) {
197875f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart            Messenger messenger = getWifiServiceMessenger();
197975f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart            if (messenger == null) {
198075f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart                throw new IllegalStateException(
198175f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart                        "getWifiServiceMessenger() returned null!  This is invalid.");
198275f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart            }
1983a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart
198475f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart            mAsyncChannel = new AsyncChannel();
198575f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart            mConnected = new CountDownLatch(1);
198675f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart
1987bf8cbb05e085c4504685883f3dd564f200405beaPaul Stewart            Handler handler = new ServiceHandler(mLooper);
198875f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart            mAsyncChannel.connect(mContext, handler, messenger);
198975f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart            try {
199075f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart                mConnected.await();
199175f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart            } catch (InterruptedException e) {
199275f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart                Log.e(TAG, "interrupted wait at init");
199375f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart            }
1994cd3d75f35db669f9671d251a36b51cef8a7ca009Irfan Sheriff        }
199575f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart        return mAsyncChannel;
199688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff    }
199788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff
1998e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff    /**
1999e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     * Connect to a network with the given configuration. The network also
2000e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     * gets added to the supplicant configuration.
2001e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     *
2002e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     * For a new network, this function is used instead of a
2003e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     * sequence of addNetwork(), enableNetwork(), saveConfiguration() and
2004e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     * reconnect()
2005e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     *
2006e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     * @param config the set of variables that describe the configuration,
2007e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     *            contained in a {@link WifiConfiguration} object.
2008d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff     * @param listener for callbacks on success or failure. Can be null.
200988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff     * @throws IllegalStateException if the WifiManager instance needs to be
201088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff     * initialized again
201188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff     *
2012e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     * @hide
2013e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     */
201488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff    public void connect(WifiConfiguration config, ActionListener listener) {
2015d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff        if (config == null) throw new IllegalArgumentException("config cannot be null");
2016ab26407124cf861eacfe7bf0f2a1ef25f4b3a7bdIrfan Sheriff        // Use INVALID_NETWORK_ID for arg1 when passing a config object
2017ab26407124cf861eacfe7bf0f2a1ef25f4b3a7bdIrfan Sheriff        // arg1 is used to pass network id when the network already exists
201875f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart        getChannel().sendMessage(CONNECT_NETWORK, WifiConfiguration.INVALID_NETWORK_ID,
201988759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff                putListener(listener), config);
2020e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff    }
2021e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff
2022e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff    /**
2023e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     * Connect to a network with the given networkId.
2024e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     *
2025e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     * This function is used instead of a enableNetwork(), saveConfiguration() and
2026e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     * reconnect()
2027e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     *
2028e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     * @param networkId the network id identifiying the network in the
2029e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     *                supplicant configuration list
2030d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff     * @param listener for callbacks on success or failure. Can be null.
203188759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff     * @throws IllegalStateException if the WifiManager instance needs to be
203288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff     * initialized again
2033e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     * @hide
2034e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     */
203588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff    public void connect(int networkId, ActionListener listener) {
2036d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff        if (networkId < 0) throw new IllegalArgumentException("Network id cannot be negative");
203775f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart        getChannel().sendMessage(CONNECT_NETWORK, networkId, putListener(listener));
2038e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff    }
2039e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff
2040e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff    /**
2041e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     * Save the given network in the supplicant config. If the network already
2042e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     * exists, the configuration is updated. A new network is enabled
2043e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     * by default.
2044e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     *
2045e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     * For a new network, this function is used instead of a
2046e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     * sequence of addNetwork(), enableNetwork() and saveConfiguration().
2047e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     *
2048e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     * For an existing network, it accomplishes the task of updateNetwork()
2049e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     * and saveConfiguration()
2050e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     *
2051e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     * @param config the set of variables that describe the configuration,
2052e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     *            contained in a {@link WifiConfiguration} object.
2053d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff     * @param listener for callbacks on success or failure. Can be null.
205488759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff     * @throws IllegalStateException if the WifiManager instance needs to be
205588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff     * initialized again
2056e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     * @hide
2057e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     */
205888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff    public void save(WifiConfiguration config, ActionListener listener) {
2059d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff        if (config == null) throw new IllegalArgumentException("config cannot be null");
206075f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart        getChannel().sendMessage(SAVE_NETWORK, 0, putListener(listener), config);
2061e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff    }
2062e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff
2063e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff    /**
2064e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     * Delete the network in the supplicant config.
2065e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     *
2066e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     * This function is used instead of a sequence of removeNetwork()
2067e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     * and saveConfiguration().
2068e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     *
2069e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     * @param config the set of variables that describe the configuration,
2070e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     *            contained in a {@link WifiConfiguration} object.
2071d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff     * @param listener for callbacks on success or failure. Can be null.
207288759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff     * @throws IllegalStateException if the WifiManager instance needs to be
207388759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff     * initialized again
2074e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     * @hide
2075e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff     */
207688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff    public void forget(int netId, ActionListener listener) {
2077d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff        if (netId < 0) throw new IllegalArgumentException("Network id cannot be negative");
207875f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart        getChannel().sendMessage(FORGET_NETWORK, netId, putListener(listener));
2079d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff    }
2080d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff
2081d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff    /**
2082d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff     * Disable network
2083d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff     *
2084d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff     * @param netId is the network Id
2085d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff     * @param listener for callbacks on success or failure. Can be null.
208688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff     * @throws IllegalStateException if the WifiManager instance needs to be
208788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff     * initialized again
2088d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff     * @hide
2089d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff     */
209088759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff    public void disable(int netId, ActionListener listener) {
2091d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff        if (netId < 0) throw new IllegalArgumentException("Network id cannot be negative");
209275f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart        getChannel().sendMessage(DISABLE_NETWORK, netId, putListener(listener));
2093e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff    }
2094e04653cbd0e8303eba92088344312b827e6b0babIrfan Sheriff
209517b232b5b59ab91ab543b87e849583678a000f9bIrfan Sheriff    /**
209693e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle     * Disable ephemeral Network
209793e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle     *
209893e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle     * @param SSID, in the format of WifiConfiguration's SSID.
209993e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle     * @hide
210093e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle     */
210193e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle    public void disableEphemeralNetwork(String SSID) {
210293e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle        if (SSID == null) throw new IllegalArgumentException("SSID cannot be null");
210393e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle        try {
210493e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle            mService.disableEphemeralNetwork(SSID);
210593e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle        } catch (RemoteException e) {
2106c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
210793e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle        }
210893e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle    }
210993e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle
211093e4192c06a28f37bc1c16b280fbd22c735b5c92vandwalle    /**
211102fb46a297c4f645f2a30b574151401dd0978521Irfan Sheriff     * Start Wi-fi Protected Setup
21125ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff     *
2113c3eb1556446c932b5674adc40af8ff9bfc3a1880Vinit Deshpande     * @param config WPS configuration (does not support {@link WpsInfo#LABEL})
2114d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff     * @param listener for callbacks on success or failure. Can be null.
211588759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff     * @throws IllegalStateException if the WifiManager instance needs to be
211688759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff     * initialized again
21175ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff     */
211873f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    public void startWps(WpsInfo config, WpsCallback listener) {
2119d3975a917799b85cacaf382b65c5832813066b51Irfan Sheriff        if (config == null) throw new IllegalArgumentException("config cannot be null");
212075f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart        getChannel().sendMessage(START_WPS, 0, putListener(listener), config);
2121f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff    }
2122f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff
2123f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff    /**
212486a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff     * Cancel any ongoing Wi-fi Protected Setup
212586a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff     *
212686a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff     * @param listener for callbacks on success or failure. Can be null.
212788759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff     * @throws IllegalStateException if the WifiManager instance needs to be
212888759bbd31e05a4163e1f8e72804ca83000afd53Irfan Sheriff     * initialized again
212986a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff     */
213073f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande    public void cancelWps(WpsCallback listener) {
213175f129e17b05e6d51080cf1ab9eb5cdddecdc734Paul Stewart        getChannel().sendMessage(CANCEL_WPS, 0, putListener(listener));
213286a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff    }
213386a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff
213486a5f5b9afa97a4ed6f5a2466fb9359ea131e2fbIrfan Sheriff    /**
2135227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff     * Get a reference to WifiService handler. This is used by a client to establish
2136227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff     * an AsyncChannel communication with WifiService
2137227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff     *
2138227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff     * @return Messenger pointing to the WifiService handler
2139227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff     * @hide
2140227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff     */
214107573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff    public Messenger getWifiServiceMessenger() {
2142227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff        try {
214307573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff            return mService.getWifiServiceMessenger();
2144227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff        } catch (RemoteException e) {
2145c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
2146227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff        }
2147227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff    }
2148227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff
214907573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff
215007573b32494acbabd21979d8b9584c1ed3f7a6adIrfan Sheriff    /**
21514aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff     * Returns the file in which IP and proxy configuration data is stored
21524aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff     * @hide
21534aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff     */
21544aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff    public String getConfigFile() {
21554aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff        try {
21564aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff            return mService.getConfigFile();
21574aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff        } catch (RemoteException e) {
2158c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
21594aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff        }
21604aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff    }
21614aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff
21624aeca7c5908387bc7efb0785830aea1053264062Irfan Sheriff    /**
21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Allows an application to keep the Wi-Fi radio awake.
21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Normally the Wi-Fi radio may turn off when the user has not used the device in a while.
2165227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff     * Acquiring a WifiLock will keep the radio on until the lock is released.  Multiple
21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * applications may hold WifiLocks, and the radio will only be allowed to turn off when no
21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * WifiLocks are held in any application.
2168d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root     * <p>
21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Before using a WifiLock, consider carefully if your application requires Wi-Fi access, or
21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * could function over a mobile network, if available.  A program that needs to download large
21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * files should hold a WifiLock to ensure that the download will complete, but a program whose
21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * network usage is occasional or low-bandwidth should not hold a WifiLock to avoid adversely
21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * affecting battery life.
2174d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root     * <p>
21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Note that WifiLocks cannot override the user-level "Wi-Fi Enabled" setting, nor Airplane
21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Mode.  They simply keep the radio from turning off when Wi-Fi is already on but the device
21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is idle.
2178d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root     * <p>
2179d710fb500c121b3f9563ccfbe488f7c9d3ec4985Kenny Root     * Any application using a WifiLock must request the {@code android.permission.WAKE_LOCK}
218071fbb81b14958b80fe55738607740c6630e4e9daNeil Fuller     * permission in an {@code <uses-permission>} element of the application's manifest.
21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public class WifiLock {
21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private String mTag;
21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final IBinder mBinder;
21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private int mRefCount;
21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mLockType;
21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private boolean mRefCounted;
21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private boolean mHeld;
21897e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        private WorkSource mWorkSource;
21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private WifiLock(int lockType, String tag) {
21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTag = tag;
21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLockType = lockType;
21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBinder = new Binder();
21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRefCount = 0;
21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRefCounted = true;
21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mHeld = false;
21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Locks the Wi-Fi radio on until {@link #release} is called.
22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * If this WifiLock is reference-counted, each call to {@code acquire} will increment the
2204227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff         * reference count, and the radio will remain locked as long as the reference count is
22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * above zero.
22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * If this WifiLock is not reference-counted, the first call to {@code acquire} will lock
22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * the radio, but subsequent calls will be ignored.  Only one call to {@link #release}
22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * will be required, regardless of the number of times that {@code acquire} is called.
22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void acquire() {
22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mBinder) {
22132c02da2bc62c4dfef684ea381be02a4e568b73d0Irfan Sheriff                if (mRefCounted ? (++mRefCount == 1) : (!mHeld)) {
22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
22157e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                        mService.acquireWifiLock(mBinder, mLockType, mTag, mWorkSource);
2216617750604c69e6068f68266d0e30324273aa990eMike Lockwood                        synchronized (WifiManager.this) {
2217617750604c69e6068f68266d0e30324273aa990eMike Lockwood                            if (mActiveLockCount >= MAX_ACTIVE_LOCKS) {
2218617750604c69e6068f68266d0e30324273aa990eMike Lockwood                                mService.releaseWifiLock(mBinder);
2219617750604c69e6068f68266d0e30324273aa990eMike Lockwood                                throw new UnsupportedOperationException(
2220617750604c69e6068f68266d0e30324273aa990eMike Lockwood                                            "Exceeded maximum number of wifi locks");
2221617750604c69e6068f68266d0e30324273aa990eMike Lockwood                            }
2222617750604c69e6068f68266d0e30324273aa990eMike Lockwood                            mActiveLockCount++;
2223617750604c69e6068f68266d0e30324273aa990eMike Lockwood                        }
2224c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey                    } catch (RemoteException e) {
2225c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey                        throw e.rethrowFromSystemServer();
22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mHeld = true;
22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Unlocks the Wi-Fi radio, allowing it to turn off when the device is idle.
22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * If this WifiLock is reference-counted, each call to {@code release} will decrement the
22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * reference count, and the radio will be unlocked only when the reference count reaches
22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * zero.  If the reference count goes below zero (that is, if {@code release} is called
22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * a greater number of times than {@link #acquire}), an exception is thrown.
22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * If this WifiLock is not reference-counted, the first call to {@code release} (after
22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * the radio was locked using {@link #acquire}) will unlock the radio, and subsequent
22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * calls will be ignored.
22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
22449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void release() {
22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mBinder) {
22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mRefCounted ? (--mRefCount == 0) : (mHeld)) {
22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mService.releaseWifiLock(mBinder);
2249617750604c69e6068f68266d0e30324273aa990eMike Lockwood                        synchronized (WifiManager.this) {
2250617750604c69e6068f68266d0e30324273aa990eMike Lockwood                            mActiveLockCount--;
2251617750604c69e6068f68266d0e30324273aa990eMike Lockwood                        }
2252c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey                    } catch (RemoteException e) {
2253c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey                        throw e.rethrowFromSystemServer();
22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
22559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mHeld = false;
22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mRefCount < 0) {
22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new RuntimeException("WifiLock under-locked " + mTag);
22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
22649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Controls whether this is a reference-counted or non-reference-counted WifiLock.
22659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Reference-counted WifiLocks keep track of the number of calls to {@link #acquire} and
22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@link #release}, and only allow the radio to sleep when every call to {@link #acquire}
22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * has been balanced with a call to {@link #release}.  Non-reference-counted WifiLocks
22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * lock the radio whenever {@link #acquire} is called and it is unlocked, and unlock the
22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * radio whenever {@link #release} is called and it is locked.
22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param refCounted true if this WifiLock should keep a reference count
22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setReferenceCounted(boolean refCounted) {
22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRefCounted = refCounted;
22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
22799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Checks whether this WifiLock is currently held.
22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
22819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return true if this WifiLock is held, false otherwise
22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public boolean isHeld() {
22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mBinder) {
22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mHeld;
22869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22897e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        public void setWorkSource(WorkSource ws) {
22907e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            synchronized (mBinder) {
22917e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                if (ws != null && ws.size() == 0) {
22927e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                    ws = null;
22937e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                }
22947e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                boolean changed = true;
22957e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                if (ws == null) {
22967e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                    mWorkSource = null;
22977e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                } else {
2298a31510e47a0f0c2525702c2f10a85064322a28f2David Christie                    ws.clearNames();
2299a31510e47a0f0c2525702c2f10a85064322a28f2David Christie                    if (mWorkSource == null) {
2300a31510e47a0f0c2525702c2f10a85064322a28f2David Christie                        changed = mWorkSource != null;
2301a31510e47a0f0c2525702c2f10a85064322a28f2David Christie                        mWorkSource = new WorkSource(ws);
2302a31510e47a0f0c2525702c2f10a85064322a28f2David Christie                    } else {
2303a31510e47a0f0c2525702c2f10a85064322a28f2David Christie                        changed = mWorkSource.diff(ws);
2304a31510e47a0f0c2525702c2f10a85064322a28f2David Christie                        if (changed) {
2305a31510e47a0f0c2525702c2f10a85064322a28f2David Christie                            mWorkSource.set(ws);
2306a31510e47a0f0c2525702c2f10a85064322a28f2David Christie                        }
23077e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                    }
23087e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                }
23097e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                if (changed && mHeld) {
23107e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                    try {
23117e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                        mService.updateWifiLockWorkSource(mBinder, mWorkSource);
23127e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                    } catch (RemoteException e) {
2313c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey                        throw e.rethrowFromSystemServer();
23147e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                    }
23157e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn                }
23167e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            }
23177e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
23187e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String toString() {
23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String s1, s2, s3;
23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mBinder) {
23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                s1 = Integer.toHexString(System.identityHashCode(this));
23239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                s2 = mHeld ? "held; " : "";
23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mRefCounted) {
23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s3 = "refcounted: refcount = " + mRefCount;
23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
23279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s3 = "not refcounted";
23289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "WifiLock{ " + s1 + "; " + s2 + s3 + " }";
23309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
23349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        protected void finalize() throws Throwable {
23359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super.finalize();
23369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (mBinder) {
23379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mHeld) {
23389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
23399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mService.releaseWifiLock(mBinder);
2340617750604c69e6068f68266d0e30324273aa990eMike Lockwood                        synchronized (WifiManager.this) {
2341617750604c69e6068f68266d0e30324273aa990eMike Lockwood                            mActiveLockCount--;
2342617750604c69e6068f68266d0e30324273aa990eMike Lockwood                        }
2343c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey                    } catch (RemoteException e) {
2344c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey                        throw e.rethrowFromSystemServer();
23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
23469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Creates a new WifiLock.
23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23545876a4273e67271f0eca607af9520f7e5abbe4f3Irfan Sheriff     * @param lockType the type of lock to create. See {@link #WIFI_MODE_FULL},
2355652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff     * {@link #WIFI_MODE_FULL_HIGH_PERF} and {@link #WIFI_MODE_SCAN_ONLY} for
2356652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff     * descriptions of the types of Wi-Fi locks.
2357652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff     * @param tag a tag for the WifiLock to identify it in debugging messages.  This string is
2358652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff     *            never shown to the user under normal conditions, but should be descriptive
23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            enough to identify your application and the specific WifiLock within it, if it
23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            holds multiple WifiLocks.
23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return a new, unacquired WifiLock with the given tag.
23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see WifiLock
23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public WifiLock createWifiLock(int lockType, String tag) {
23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new WifiLock(lockType, tag);
23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2369652bc96444b0a82d34e6c3766b7862effac11adbIrfan Sheriff
23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Creates a new WifiLock.
23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param tag a tag for the WifiLock to identify it in debugging messages.  This string is
23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            never shown to the user under normal conditions, but should be descriptive
23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            enough to identify your application and the specific WifiLock within it, if it
23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            holds multiple WifiLocks.
23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return a new, unacquired WifiLock with the given tag.
23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see WifiLock
23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public WifiLock createWifiLock(String tag) {
23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new WifiLock(WIFI_MODE_FULL, tag);
23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23855347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
2386fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt
23875347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    /**
2388fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt     * Create a new MulticastLock
23895347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt     *
2390fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt     * @param tag a tag for the MulticastLock to identify it in debugging
239141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt     *            messages.  This string is never shown to the user under
239241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt     *            normal conditions, but should be descriptive enough to
239341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt     *            identify your application and the specific MulticastLock
239441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt     *            within it, if it holds multiple MulticastLocks.
23955347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt     *
2396fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt     * @return a new, unacquired MulticastLock with the given tag.
2397fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt     *
2398fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt     * @see MulticastLock
23995347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt     */
2400fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt    public MulticastLock createMulticastLock(String tag) {
2401fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt        return new MulticastLock(tag);
24025347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
24035347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
24045347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    /**
2405fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt     * Allows an application to receive Wifi Multicast packets.
2406fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt     * Normally the Wifi stack filters out packets not explicitly
2407fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt     * addressed to this device.  Acquring a MulticastLock will
2408fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt     * cause the stack to receive packets addressed to multicast
2409fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt     * addresses.  Processing these extra packets can cause a noticable
241041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt     * battery drain and should be disabled when not needed.
24115347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt     */
2412fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt    public class MulticastLock {
2413fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt        private String mTag;
2414fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt        private final IBinder mBinder;
241541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt        private int mRefCount;
241641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt        private boolean mRefCounted;
2417fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt        private boolean mHeld;
2418fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt
2419fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt        private MulticastLock(String tag) {
2420fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt            mTag = tag;
2421fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt            mBinder = new Binder();
242241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt            mRefCount = 0;
242341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt            mRefCounted = true;
2424fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt            mHeld = false;
2425fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt        }
2426fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt
2427fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt        /**
2428fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt         * Locks Wifi Multicast on until {@link #release} is called.
2429fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt         *
243041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt         * If this MulticastLock is reference-counted each call to
243141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt         * {@code acquire} will increment the reference count, and the
243241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt         * wifi interface will receive multicast packets as long as the
243341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt         * reference count is above zero.
243441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt         *
243541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt         * If this MulticastLock is not reference-counted, the first call to
243641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt         * {@code acquire} will turn on the multicast packets, but subsequent
243741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt         * calls will be ignored.  Only one call to {@link #release} will
243841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt         * be required, regardless of the number of times that {@code acquire}
243941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt         * is called.
2440fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt         *
2441fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt         * Note that other applications may also lock Wifi Multicast on.
2442fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt         * Only they can relinquish their lock.
2443fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt         *
2444fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt         * Also note that applications cannot leave Multicast locked on.
2445fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt         * When an app exits or crashes, any Multicast locks will be released.
2446fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt         */
2447fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt        public void acquire() {
2448fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt            synchronized (mBinder) {
24492c02da2bc62c4dfef684ea381be02a4e568b73d0Irfan Sheriff                if (mRefCounted ? (++mRefCount == 1) : (!mHeld)) {
2450fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt                    try {
2451fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt                        mService.acquireMulticastLock(mBinder, mTag);
2452617750604c69e6068f68266d0e30324273aa990eMike Lockwood                        synchronized (WifiManager.this) {
2453617750604c69e6068f68266d0e30324273aa990eMike Lockwood                            if (mActiveLockCount >= MAX_ACTIVE_LOCKS) {
2454617750604c69e6068f68266d0e30324273aa990eMike Lockwood                                mService.releaseMulticastLock();
2455617750604c69e6068f68266d0e30324273aa990eMike Lockwood                                throw new UnsupportedOperationException(
2456617750604c69e6068f68266d0e30324273aa990eMike Lockwood                                        "Exceeded maximum number of wifi locks");
2457617750604c69e6068f68266d0e30324273aa990eMike Lockwood                            }
2458617750604c69e6068f68266d0e30324273aa990eMike Lockwood                            mActiveLockCount++;
2459617750604c69e6068f68266d0e30324273aa990eMike Lockwood                        }
2460c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey                    } catch (RemoteException e) {
2461c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey                        throw e.rethrowFromSystemServer();
2462fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt                    }
246341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt                    mHeld = true;
2464fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt                }
2465fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt            }
2466fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt        }
2467fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt
2468fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt        /**
2469fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt         * Unlocks Wifi Multicast, restoring the filter of packets
2470fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt         * not addressed specifically to this device and saving power.
2471fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt         *
247241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt         * If this MulticastLock is reference-counted, each call to
247341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt         * {@code release} will decrement the reference count, and the
247441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt         * multicast packets will only stop being received when the reference
247541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt         * count reaches zero.  If the reference count goes below zero (that
247641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt         * is, if {@code release} is called a greater number of times than
247741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt         * {@link #acquire}), an exception is thrown.
247841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt         *
247941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt         * If this MulticastLock is not reference-counted, the first call to
248041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt         * {@code release} (after the radio was multicast locked using
24814a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn         * {@link #acquire}) will unlock the multicast, and subsequent calls
248241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt         * will be ignored.
248341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt         *
2484fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt         * Note that if any other Wifi Multicast Locks are still outstanding
2485fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt         * this {@code release} call will not have an immediate effect.  Only
2486fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt         * when all applications have released all their Multicast Locks will
2487fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt         * the Multicast filter be turned back on.
2488fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt         *
2489fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt         * Also note that when an app exits or crashes all of its Multicast
2490fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt         * Locks will be automatically released.
2491fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt         */
2492fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt        public void release() {
2493fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt            synchronized (mBinder) {
249441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt                if (mRefCounted ? (--mRefCount == 0) : (mHeld)) {
2495fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt                    try {
2496fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt                        mService.releaseMulticastLock();
2497617750604c69e6068f68266d0e30324273aa990eMike Lockwood                        synchronized (WifiManager.this) {
2498617750604c69e6068f68266d0e30324273aa990eMike Lockwood                            mActiveLockCount--;
2499617750604c69e6068f68266d0e30324273aa990eMike Lockwood                        }
2500c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey                    } catch (RemoteException e) {
2501c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey                        throw e.rethrowFromSystemServer();
2502fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt                    }
250341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt                    mHeld = false;
250441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt                }
250541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt                if (mRefCount < 0) {
250641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt                    throw new RuntimeException("MulticastLock under-locked "
250741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt                            + mTag);
2508fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt                }
2509fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt            }
2510fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt        }
2511fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt
2512fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt        /**
251341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt         * Controls whether this is a reference-counted or non-reference-
251441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt         * counted MulticastLock.
251541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt         *
251641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt         * Reference-counted MulticastLocks keep track of the number of calls
251741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt         * to {@link #acquire} and {@link #release}, and only stop the
251841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt         * reception of multicast packets when every call to {@link #acquire}
251941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt         * has been balanced with a call to {@link #release}.  Non-reference-
252041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt         * counted MulticastLocks allow the reception of multicast packets
252141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt         * whenever {@link #acquire} is called and stop accepting multicast
252241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt         * packets whenever {@link #release} is called.
252341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt         *
252441c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt         * @param refCounted true if this MulticastLock should keep a reference
252541c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt         * count
252641c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt         */
252741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt        public void setReferenceCounted(boolean refCounted) {
252841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt            mRefCounted = refCounted;
252941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt        }
253041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt
253141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt        /**
2532fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt         * Checks whether this MulticastLock is currently held.
2533fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt         *
2534fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt         * @return true if this MulticastLock is held, false otherwise
2535fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt         */
2536fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt        public boolean isHeld() {
2537fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt            synchronized (mBinder) {
2538fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt                return mHeld;
2539fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt            }
2540fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt        }
2541fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt
2542fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt        public String toString() {
254341c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt            String s1, s2, s3;
2544fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt            synchronized (mBinder) {
2545fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt                s1 = Integer.toHexString(System.identityHashCode(this));
2546fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt                s2 = mHeld ? "held; " : "";
254741c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt                if (mRefCounted) {
254841c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt                    s3 = "refcounted: refcount = " + mRefCount;
254941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt                } else {
255041c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt                    s3 = "not refcounted";
255141c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt                }
255241c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt                return "MulticastLock{ " + s1 + "; " + s2 + s3 + " }";
2553fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt            }
2554fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt        }
2555fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt
2556fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt        @Override
2557fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt        protected void finalize() throws Throwable {
2558fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt            super.finalize();
255941c104339951e0e5e78240e1f48455c21b3ba5fdRobert Greenwalt            setReferenceCounted(false);
2560fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt            release();
25615347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
25625347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
25635347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
25645347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    /**
2565fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt     * Check multicast filter status.
25665347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt     *
2567fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt     * @return true if multicast packets are allowed.
25685347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt     *
25695347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt     * @hide pending API council approval
25705347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt     */
2571fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt    public boolean isMulticastEnabled() {
25725347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        try {
2573fc1b15cfbfc5f69235ec1f367abd7a909381cd05Robert Greenwalt            return mService.isMulticastEnabled();
25745347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        } catch (RemoteException e) {
2575c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
25765347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
25775347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
2578e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt
2579e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt    /**
2580e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt     * Initialize the multicast filtering to 'on'
2581e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt     * @hide no intent to publish
2582e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt     */
2583e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt    public boolean initializeMulticastFiltering() {
2584e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt        try {
2585e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt            mService.initializeMulticastFiltering();
2586e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt            return true;
2587e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt        } catch (RemoteException e) {
2588c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
2589e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt        }
2590e2d155a51e68694e17fa6e27d05c928215a5dbcfRobert Greenwalt    }
2591da6da0907b28d4704aabbdb1bbeb4300954670d1Irfan Sheriff
2592fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff    protected void finalize() throws Throwable {
2593fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff        try {
2594a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart            if (mAsyncChannel != null) {
2595a016ebbee7c9cf37bc19044e787b02bfb59f2f98Paul Stewart                mAsyncChannel.disconnect();
2596939caef712f306a1c80ea27e9f41ef6e3ea9e0f1Irfan Sheriff            }
2597fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff        } finally {
2598fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff            super.finalize();
2599fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff        }
2600fa3b6258bedf6a66b676020f0ff531d4c9c579ebIrfan Sheriff    }
26015fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle
26025fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle    /**
26035fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle     * Set wifi verbose log. Called from developer settings.
26045fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle     * @hide
26055fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle     */
26065fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle    public void enableVerboseLogging (int verbose) {
26075fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle        try {
26085fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle            mService.enableVerboseLogging(verbose);
2609f5af4a972598611c46d4bf169919e23b7375a5a9vandwalle        } catch (Exception e) {
2610f5af4a972598611c46d4bf169919e23b7375a5a9vandwalle            //ignore any failure here
2611f5af4a972598611c46d4bf169919e23b7375a5a9vandwalle            Log.e(TAG, "enableVerboseLogging " + e.toString());
26125fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle        }
26135fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle    }
26145fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle
26155fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle    /**
26165fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle     * Get the WiFi verbose logging level.This is used by settings
26175fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle     * to decide what to show within the picker.
26185fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle     * @hide
26195fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle     */
26205fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle    public int getVerboseLoggingLevel() {
26215fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle        try {
26225fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle            return mService.getVerboseLoggingLevel();
26235fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle        } catch (RemoteException e) {
2624c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
26255fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle        }
26265fb7bf5fdb93831684b00eb637ec15b5cf0d1e2dvandwalle    }
2627d524c78d9358e2fa1e67124468cffa5284870c62vandwalle
2628d524c78d9358e2fa1e67124468cffa5284870c62vandwalle    /**
2629d524c78d9358e2fa1e67124468cffa5284870c62vandwalle     * Set wifi Aggressive Handover. Called from developer settings.
2630d524c78d9358e2fa1e67124468cffa5284870c62vandwalle     * @hide
2631d524c78d9358e2fa1e67124468cffa5284870c62vandwalle     */
2632d524c78d9358e2fa1e67124468cffa5284870c62vandwalle    public void enableAggressiveHandover(int enabled) {
2633d524c78d9358e2fa1e67124468cffa5284870c62vandwalle        try {
2634d524c78d9358e2fa1e67124468cffa5284870c62vandwalle            mService.enableAggressiveHandover(enabled);
2635d524c78d9358e2fa1e67124468cffa5284870c62vandwalle        } catch (RemoteException e) {
2636c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
2637d524c78d9358e2fa1e67124468cffa5284870c62vandwalle        }
2638d524c78d9358e2fa1e67124468cffa5284870c62vandwalle    }
2639d524c78d9358e2fa1e67124468cffa5284870c62vandwalle
2640d524c78d9358e2fa1e67124468cffa5284870c62vandwalle    /**
2641d524c78d9358e2fa1e67124468cffa5284870c62vandwalle     * Get the WiFi Handover aggressiveness.This is used by settings
2642d524c78d9358e2fa1e67124468cffa5284870c62vandwalle     * to decide what to show within the picker.
2643d524c78d9358e2fa1e67124468cffa5284870c62vandwalle     * @hide
2644d524c78d9358e2fa1e67124468cffa5284870c62vandwalle     */
2645d524c78d9358e2fa1e67124468cffa5284870c62vandwalle    public int getAggressiveHandover() {
2646d524c78d9358e2fa1e67124468cffa5284870c62vandwalle        try {
2647d524c78d9358e2fa1e67124468cffa5284870c62vandwalle            return mService.getAggressiveHandover();
2648d524c78d9358e2fa1e67124468cffa5284870c62vandwalle        } catch (RemoteException e) {
2649c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
2650d524c78d9358e2fa1e67124468cffa5284870c62vandwalle        }
2651d524c78d9358e2fa1e67124468cffa5284870c62vandwalle    }
2652d524c78d9358e2fa1e67124468cffa5284870c62vandwalle
2653d524c78d9358e2fa1e67124468cffa5284870c62vandwalle    /**
2654d524c78d9358e2fa1e67124468cffa5284870c62vandwalle     * Set setting for allowing Scans when traffic is ongoing.
2655d524c78d9358e2fa1e67124468cffa5284870c62vandwalle     * @hide
2656d524c78d9358e2fa1e67124468cffa5284870c62vandwalle     */
2657d524c78d9358e2fa1e67124468cffa5284870c62vandwalle    public void setAllowScansWithTraffic(int enabled) {
2658d524c78d9358e2fa1e67124468cffa5284870c62vandwalle        try {
2659d524c78d9358e2fa1e67124468cffa5284870c62vandwalle            mService.setAllowScansWithTraffic(enabled);
2660d524c78d9358e2fa1e67124468cffa5284870c62vandwalle        } catch (RemoteException e) {
2661c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
2662d524c78d9358e2fa1e67124468cffa5284870c62vandwalle        }
2663d524c78d9358e2fa1e67124468cffa5284870c62vandwalle    }
2664d524c78d9358e2fa1e67124468cffa5284870c62vandwalle
2665d524c78d9358e2fa1e67124468cffa5284870c62vandwalle    /**
2666d524c78d9358e2fa1e67124468cffa5284870c62vandwalle     * Get setting for allowing Scans when traffic is ongoing.
2667d524c78d9358e2fa1e67124468cffa5284870c62vandwalle     * @hide
2668d524c78d9358e2fa1e67124468cffa5284870c62vandwalle     */
2669d524c78d9358e2fa1e67124468cffa5284870c62vandwalle    public int getAllowScansWithTraffic() {
2670d524c78d9358e2fa1e67124468cffa5284870c62vandwalle        try {
2671d524c78d9358e2fa1e67124468cffa5284870c62vandwalle            return mService.getAllowScansWithTraffic();
2672d524c78d9358e2fa1e67124468cffa5284870c62vandwalle        } catch (RemoteException e) {
2673c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
2674d524c78d9358e2fa1e67124468cffa5284870c62vandwalle        }
2675d524c78d9358e2fa1e67124468cffa5284870c62vandwalle    }
267673f5d16ad5c61320deac161fe23e00a8a4aed772Vinit Deshpande
26775914caff06f9790238bea0536acfbf533cee9046Pierre Vandwalle    /**
2678984dc850b4caeb4470e52bce773935be5305cf8eStuart Scott     * Resets all wifi manager settings back to factory defaults.
2679984dc850b4caeb4470e52bce773935be5305cf8eStuart Scott     *
2680984dc850b4caeb4470e52bce773935be5305cf8eStuart Scott     * @hide
2681984dc850b4caeb4470e52bce773935be5305cf8eStuart Scott     */
2682984dc850b4caeb4470e52bce773935be5305cf8eStuart Scott    public void factoryReset() {
2683f1fb39763d87dabe254b6ed64ac8f20145035bc0Stuart Scott        try {
2684f1fb39763d87dabe254b6ed64ac8f20145035bc0Stuart Scott            mService.factoryReset();
2685f1fb39763d87dabe254b6ed64ac8f20145035bc0Stuart Scott        } catch (RemoteException e) {
2686c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
2687984dc850b4caeb4470e52bce773935be5305cf8eStuart Scott        }
2688984dc850b4caeb4470e52bce773935be5305cf8eStuart Scott    }
26897094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe
26907094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe    /**
26917094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe     * Get Network object of current wifi network
26927094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe     * @return Get Network object of current wifi network
26937094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe     * @hide
26947094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe     */
26957094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe    public Network getCurrentNetwork() {
26967094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe        try {
26977094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe            return mService.getCurrentNetwork();
26987094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe        } catch (RemoteException e) {
2699c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
27007094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe        }
27017094d22022c8e0c6ad71920b101434dded8a276eSanket Padawe    }
2702358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle
2703358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle    /**
2704e8de06d2feb6680df15c1473fb72efb214ced744xinhe     * Framework layer autojoin enable/disable when device is associated
2705e8de06d2feb6680df15c1473fb72efb214ced744xinhe     * this will enable/disable autojoin scan and switch network when connected
2706e8de06d2feb6680df15c1473fb72efb214ced744xinhe     * @return true -- if set successful false -- if set failed
2707358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle     * @hide
2708358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle     */
270944a4668b4599a1284f4c2011b1ab4bf90b9b4ab6Samuel Tan    public boolean setEnableAutoJoinWhenAssociated(boolean enabled) {
2710358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle        try {
271144a4668b4599a1284f4c2011b1ab4bf90b9b4ab6Samuel Tan            return mService.setEnableAutoJoinWhenAssociated(enabled);
2712358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle        } catch (RemoteException e) {
2713c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
2714358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle        }
2715358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle    }
2716358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle
2717358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle    /**
2718e8de06d2feb6680df15c1473fb72efb214ced744xinhe     * Get setting for Framework layer autojoin enable status
2719358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle     * @hide
2720358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle     */
2721e8de06d2feb6680df15c1473fb72efb214ced744xinhe    public boolean getEnableAutoJoinWhenAssociated() {
2722358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle        try {
2723e8de06d2feb6680df15c1473fb72efb214ced744xinhe            return mService.getEnableAutoJoinWhenAssociated();
2724358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle        } catch (RemoteException e) {
2725c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey            throw e.rethrowFromSystemServer();
2726358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle        }
2727358673e275ed065fadb04c1722ac458e6c617a89Pierre Vandwalle    }
272874638cdb31a10fa6d013744d201bb12465dff3eaRandy Pan
272974638cdb31a10fa6d013744d201bb12465dff3eaRandy Pan    /**
273074638cdb31a10fa6d013744d201bb12465dff3eaRandy Pan     * Enable/disable WifiConnectivityManager
273174638cdb31a10fa6d013744d201bb12465dff3eaRandy Pan     * @hide
273274638cdb31a10fa6d013744d201bb12465dff3eaRandy Pan     */
273374638cdb31a10fa6d013744d201bb12465dff3eaRandy Pan    public void enableWifiConnectivityManager(boolean enabled) {
273474638cdb31a10fa6d013744d201bb12465dff3eaRandy Pan        try {
273574638cdb31a10fa6d013744d201bb12465dff3eaRandy Pan            mService.enableWifiConnectivityManager(enabled);
273674638cdb31a10fa6d013744d201bb12465dff3eaRandy Pan        } catch (RemoteException e) {
273774638cdb31a10fa6d013744d201bb12465dff3eaRandy Pan            throw e.rethrowFromSystemServer();
273874638cdb31a10fa6d013744d201bb12465dff3eaRandy Pan        }
273974638cdb31a10fa6d013744d201bb12465dff3eaRandy Pan    }
2740651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff}
2741