1163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius/*
2163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius * Copyright (C) 2008 The Android Open Source Project
3163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius *
4163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius * Licensed under the Apache License, Version 2.0 (the "License");
5163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius * you may not use this file except in compliance with the License.
6163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius * You may obtain a copy of the License at
7163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius *
8163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius *      http://www.apache.org/licenses/LICENSE-2.0
9163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius *
10163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius * Unless required by applicable law or agreed to in writing, software
11163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius * distributed under the License is distributed on an "AS IS" BASIS,
12163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius * See the License for the specific language governing permissions and
14163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius * limitations under the License.
15163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius */
16163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
17163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Piuspackage com.android.server.wifi.p2p;
18163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
19163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Piusimport android.net.wifi.p2p.WifiP2pConfig;
20163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Piusimport android.net.wifi.p2p.WifiP2pDevice;
21163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Piusimport android.net.wifi.p2p.WifiP2pGroup;
22163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Piusimport android.net.wifi.p2p.WifiP2pProvDiscEvent;
23163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Piusimport android.net.wifi.p2p.nsd.WifiP2pServiceResponse;
24163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Piusimport android.os.Handler;
25163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Piusimport android.os.Message;
26163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Piusimport android.util.ArraySet;
27163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Piusimport android.util.Log;
28163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Piusimport android.util.SparseArray;
29163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
30163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Piusimport com.android.internal.annotations.VisibleForTesting;
31163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Piusimport com.android.internal.util.Protocol;
32163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Piusimport com.android.server.wifi.WifiInjector;
33163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Piusimport com.android.server.wifi.p2p.WifiP2pServiceImpl.P2pStatus;
34163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
35163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Piusimport java.util.HashMap;
36163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Piusimport java.util.List;
37163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Piusimport java.util.Map;
38163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Piusimport java.util.Set;
39163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
40163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius/**
41163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius * Listens for events from the wpa_supplicant, and passes them on
42163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius * to the {@link WifiP2pServiceImpl} for handling.
43163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius *
44163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius * @hide
45163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius */
46163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Piuspublic class WifiP2pMonitor {
47163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    private static final String TAG = "WifiP2pMonitor";
48163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
49163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    /* Supplicant events reported to a state machine */
50163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    private static final int BASE = Protocol.BASE_WIFI_MONITOR;
51163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
52163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    /* Connection to supplicant established */
53163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public static final int SUP_CONNECTION_EVENT                 = BASE + 1;
54163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    /* Connection to supplicant lost */
55163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public static final int SUP_DISCONNECTION_EVENT              = BASE + 2;
56163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
57163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    /* P2P events */
58163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public static final int P2P_DEVICE_FOUND_EVENT               = BASE + 21;
59163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public static final int P2P_DEVICE_LOST_EVENT                = BASE + 22;
60163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public static final int P2P_GO_NEGOTIATION_REQUEST_EVENT     = BASE + 23;
61163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public static final int P2P_GO_NEGOTIATION_SUCCESS_EVENT     = BASE + 25;
62163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public static final int P2P_GO_NEGOTIATION_FAILURE_EVENT     = BASE + 26;
63163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public static final int P2P_GROUP_FORMATION_SUCCESS_EVENT    = BASE + 27;
64163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public static final int P2P_GROUP_FORMATION_FAILURE_EVENT    = BASE + 28;
65163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public static final int P2P_GROUP_STARTED_EVENT              = BASE + 29;
66163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public static final int P2P_GROUP_REMOVED_EVENT              = BASE + 30;
67163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public static final int P2P_INVITATION_RECEIVED_EVENT        = BASE + 31;
68163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public static final int P2P_INVITATION_RESULT_EVENT          = BASE + 32;
69163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public static final int P2P_PROV_DISC_PBC_REQ_EVENT          = BASE + 33;
70163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public static final int P2P_PROV_DISC_PBC_RSP_EVENT          = BASE + 34;
71163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public static final int P2P_PROV_DISC_ENTER_PIN_EVENT        = BASE + 35;
72163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public static final int P2P_PROV_DISC_SHOW_PIN_EVENT         = BASE + 36;
73163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public static final int P2P_FIND_STOPPED_EVENT               = BASE + 37;
74163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public static final int P2P_SERV_DISC_RESP_EVENT             = BASE + 38;
75163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public static final int P2P_PROV_DISC_FAILURE_EVENT          = BASE + 39;
76163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
77163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    /* hostap events */
78163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public static final int AP_STA_DISCONNECTED_EVENT            = BASE + 41;
79163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public static final int AP_STA_CONNECTED_EVENT               = BASE + 42;
80163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
81163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
82163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    private final WifiInjector mWifiInjector;
83163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    private boolean mVerboseLoggingEnabled = false;
84163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    private boolean mConnected = false;
85163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
86163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public WifiP2pMonitor(WifiInjector wifiInjector) {
87163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        mWifiInjector = wifiInjector;
88163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    }
89163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
90163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    void enableVerboseLogging(int verbose) {
91163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        if (verbose > 0) {
92163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            mVerboseLoggingEnabled = true;
93163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        } else {
94163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            mVerboseLoggingEnabled = false;
95163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        }
96163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    }
97163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
98163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    // TODO(b/27569474) remove support for multiple handlers for the same event
99163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    private final Map<String, SparseArray<Set<Handler>>> mHandlerMap = new HashMap<>();
100163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
101163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    /**
102163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * Registers a callback handler for the provided event.
103163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     */
104163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public synchronized void registerHandler(String iface, int what, Handler handler) {
105163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        SparseArray<Set<Handler>> ifaceHandlers = mHandlerMap.get(iface);
106163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        if (ifaceHandlers == null) {
107163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            ifaceHandlers = new SparseArray<>();
108163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            mHandlerMap.put(iface, ifaceHandlers);
109163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        }
110163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        Set<Handler> ifaceWhatHandlers = ifaceHandlers.get(what);
111163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        if (ifaceWhatHandlers == null) {
112163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            ifaceWhatHandlers = new ArraySet<>();
113163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            ifaceHandlers.put(what, ifaceWhatHandlers);
114163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        }
115163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        ifaceWhatHandlers.add(handler);
116163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    }
117163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
118163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    private final Map<String, Boolean> mMonitoringMap = new HashMap<>();
119163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    private boolean isMonitoring(String iface) {
120163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        Boolean val = mMonitoringMap.get(iface);
121163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        if (val == null) {
122163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            return false;
123163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        } else {
124163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            return val.booleanValue();
125163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        }
126163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    }
127163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
128163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    /**
129163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * Enable/Disable monitoring for the provided iface.
130163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     *
131163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param iface Name of the iface.
132163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param enabled true to enable, false to disable.
133163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     */
134163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    @VisibleForTesting
135163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public void setMonitoring(String iface, boolean enabled) {
136163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        mMonitoringMap.put(iface, enabled);
137163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    }
138163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
139163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    private void setMonitoringNone() {
140163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        for (String iface : mMonitoringMap.keySet()) {
141163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            setMonitoring(iface, false);
142163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        }
143163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    }
144163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
145163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    /**
146163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * Wait for wpa_supplicant's control interface to be ready.
147163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     *
148163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * TODO: Add unit tests for these once we remove the legacy code.
149163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     */
150163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    private boolean ensureConnectedLocked() {
151163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        if (mConnected) {
152163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            return true;
153163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        }
154163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        if (mVerboseLoggingEnabled) Log.d(TAG, "connecting to supplicant");
155163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        int connectTries = 0;
156163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        while (true) {
157163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            mConnected = mWifiInjector.getWifiP2pNative().connectToSupplicant();
158163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            if (mConnected) {
159163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius                return true;
160163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            }
161b97757e4930ae6e9a5319e071d383c464fcb5546Roshan Pius            if (connectTries++ < 50) {
162163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius                try {
163b97757e4930ae6e9a5319e071d383c464fcb5546Roshan Pius                    Thread.sleep(100);
164163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius                } catch (InterruptedException ignore) {
165163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius                }
166163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            } else {
167163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius                return false;
168163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            }
169163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        }
170163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    }
171163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
172163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    /**
173163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * Start Monitoring for wpa_supplicant events.
174163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     *
175163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param iface Name of iface.
176163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * TODO: Add unit tests for these once we remove the legacy code.
177163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     */
178163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public synchronized void startMonitoring(String iface) {
179163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        if (ensureConnectedLocked()) {
180163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            setMonitoring(iface, true);
181163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            broadcastSupplicantConnectionEvent(iface);
182163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        } else {
183163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            boolean originalMonitoring = isMonitoring(iface);
184163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            setMonitoring(iface, true);
185163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            broadcastSupplicantDisconnectionEvent(iface);
186163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            setMonitoring(iface, originalMonitoring);
187163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            Log.e(TAG, "startMonitoring(" + iface + ") failed!");
188163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        }
189163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    }
190163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
191163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    /**
192163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * Stop Monitoring for wpa_supplicant events.
193163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     *
194163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param iface Name of iface.
195163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * TODO: Add unit tests for these once we remove the legacy code.
196163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     */
197163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public synchronized void stopMonitoring(String iface) {
198163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        if (mVerboseLoggingEnabled) Log.d(TAG, "stopMonitoring(" + iface + ")");
199163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        setMonitoring(iface, true);
200163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        broadcastSupplicantDisconnectionEvent(iface);
201163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        setMonitoring(iface, false);
202163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    }
203163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
204163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    /**
205163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * Stop Monitoring for wpa_supplicant events.
206163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     *
207163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * TODO: Add unit tests for these once we remove the legacy code.
208163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     */
209163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public synchronized void stopAllMonitoring() {
210163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        mConnected = false;
211163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        setMonitoringNone();
212163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    }
213163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
214163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    /**
215163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * Similar functions to Handler#sendMessage that send the message to the registered handler
216163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * for the given interface and message what.
217163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * All of these should be called with the WifiMonitor class lock
218163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     */
219163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    private void sendMessage(String iface, int what) {
220163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        sendMessage(iface, Message.obtain(null, what));
221163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    }
222163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
223163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    private void sendMessage(String iface, int what, Object obj) {
224163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        sendMessage(iface, Message.obtain(null, what, obj));
225163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    }
226163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
227163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    private void sendMessage(String iface, int what, int arg1) {
228163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        sendMessage(iface, Message.obtain(null, what, arg1, 0));
229163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    }
230163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
231163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    private void sendMessage(String iface, int what, int arg1, int arg2) {
232163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        sendMessage(iface, Message.obtain(null, what, arg1, arg2));
233163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    }
234163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
235163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    private void sendMessage(String iface, int what, int arg1, int arg2, Object obj) {
236163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        sendMessage(iface, Message.obtain(null, what, arg1, arg2, obj));
237163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    }
238163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
239163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    private void sendMessage(String iface, Message message) {
240163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        SparseArray<Set<Handler>> ifaceHandlers = mHandlerMap.get(iface);
241163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        if (iface != null && ifaceHandlers != null) {
242163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            if (isMonitoring(iface)) {
243163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius                Set<Handler> ifaceWhatHandlers = ifaceHandlers.get(message.what);
244163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius                if (ifaceWhatHandlers != null) {
245163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius                    for (Handler handler : ifaceWhatHandlers) {
246098640f533f3fc04cb49cb860f9dc45ad8a19e69Randy Pan                        if (handler != null) {
247163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius                            sendMessage(handler, Message.obtain(message));
248163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius                        }
249163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius                    }
250163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius                }
251163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            } else {
252163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius                if (mVerboseLoggingEnabled) {
253163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius                    Log.d(TAG, "Dropping event because (" + iface + ") is stopped");
254163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius                }
255163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            }
256163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        } else {
257163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            if (mVerboseLoggingEnabled) {
258163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius                Log.d(TAG, "Sending to all monitors because there's no matching iface");
259163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            }
260163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            for (Map.Entry<String, SparseArray<Set<Handler>>> entry : mHandlerMap.entrySet()) {
261163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius                if (isMonitoring(entry.getKey())) {
262163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius                    Set<Handler> ifaceWhatHandlers = entry.getValue().get(message.what);
263163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius                    for (Handler handler : ifaceWhatHandlers) {
264098640f533f3fc04cb49cb860f9dc45ad8a19e69Randy Pan                        if (handler != null) {
265163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius                            sendMessage(handler, Message.obtain(message));
266163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius                        }
267163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius                    }
268163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius                }
269163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            }
270163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        }
271098640f533f3fc04cb49cb860f9dc45ad8a19e69Randy Pan
272098640f533f3fc04cb49cb860f9dc45ad8a19e69Randy Pan        message.recycle();
273163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    }
274163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
275163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    private void sendMessage(Handler handler, Message message) {
276098640f533f3fc04cb49cb860f9dc45ad8a19e69Randy Pan        message.setTarget(handler);
277098640f533f3fc04cb49cb860f9dc45ad8a19e69Randy Pan        message.sendToTarget();
278163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    }
279163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
280163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    /**
281163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * Broadcast the connection to wpa_supplicant event to all the handlers registered for
282163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * this event.
283163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     *
284163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param iface Name of iface on which this occurred.
285163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     */
286163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public void broadcastSupplicantConnectionEvent(String iface) {
287163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        sendMessage(iface, SUP_CONNECTION_EVENT);
288163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    }
289163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
290163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    /**
291163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * Broadcast the loss of connection to wpa_supplicant event to all the handlers registered for
292163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * this event.
293163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     *
294163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param iface Name of iface on which this occurred.
295163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     */
296163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public void broadcastSupplicantDisconnectionEvent(String iface) {
297163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        sendMessage(iface, SUP_DISCONNECTION_EVENT);
298163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    }
299163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
300163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    /**
301163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * Broadcast new p2p device discovered event to all handlers registered for this event.
302163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     *
303163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param iface Name of iface on which this occurred.
304163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param device Device that has been discovered during recent scan.
305163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     */
306163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public void broadcastP2pDeviceFound(String iface, WifiP2pDevice device) {
307163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        if (device != null) {
308163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            sendMessage(iface, P2P_DEVICE_FOUND_EVENT, device);
309163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        }
310163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    }
311163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
312163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    /**
313163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * Broadcast p2p device lost event to all handlers registered for this event.
314163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     *
315163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param iface Name of iface on which this occurred.
316163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param device Device that has been lost in recent scan.
317163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     */
318163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public void broadcastP2pDeviceLost(String iface, WifiP2pDevice device) {
319163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        if (device != null) {
320163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            sendMessage(iface, P2P_DEVICE_LOST_EVENT, device);
321163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        }
322163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    }
323163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
324163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    /**
325163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * Broadcast scan termination event to all handlers registered for this event.
326163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     *
327163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param iface Name of iface on which this occurred.
328163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     */
329163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public void broadcastP2pFindStopped(String iface) {
330163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        sendMessage(iface, P2P_FIND_STOPPED_EVENT);
331163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    }
332163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
333163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    /**
334163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * Broadcast group owner negotiation request event to all handlers registered for this event.
335163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     *
336163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param iface Name of iface on which this occurred.
337163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param config P2p configuration.
338163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     */
339163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public void broadcastP2pGoNegotiationRequest(String iface, WifiP2pConfig config) {
340163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        if (config != null) {
341163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            sendMessage(iface, P2P_GO_NEGOTIATION_REQUEST_EVENT, config);
342163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        }
343163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    }
344163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
345163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    /**
346163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * Broadcast group owner negotiation success event to all handlers registered for this event.
347163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     *
348163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param iface Name of iface on which this occurred.
349163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     */
350163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public void broadcastP2pGoNegotiationSuccess(String iface) {
351163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        sendMessage(iface, P2P_GO_NEGOTIATION_SUCCESS_EVENT);
352163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    }
353163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
354163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    /**
355163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * Broadcast group owner negotiation failure event to all handlers registered for this event.
356163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     *
357163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param iface Name of iface on which this occurred.
358163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param reason Failure reason.
359163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     */
360163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public void broadcastP2pGoNegotiationFailure(String iface, P2pStatus reason) {
361163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        sendMessage(iface, P2P_GO_NEGOTIATION_FAILURE_EVENT, reason);
362163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    }
363163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
364163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    /**
365163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * Broadcast group formation success event to all handlers registered for this event.
366163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     *
367163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param iface Name of iface on which this occurred.
368163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     */
369163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public void broadcastP2pGroupFormationSuccess(String iface) {
370163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        sendMessage(iface, P2P_GROUP_FORMATION_SUCCESS_EVENT);
371163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    }
372163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
373163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    /**
374163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * Broadcast group formation failure event to all handlers registered for this event.
375163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     *
376163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param iface Name of iface on which this occurred.
377163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param reason Failure reason.
378163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     */
379163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public void broadcastP2pGroupFormationFailure(String iface, String reason) {
380163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        P2pStatus err = P2pStatus.UNKNOWN;
381163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        if (reason.equals("FREQ_CONFLICT")) {
382163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            err = P2pStatus.NO_COMMON_CHANNEL;
383163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        }
384163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        sendMessage(iface, P2P_GROUP_FORMATION_FAILURE_EVENT, err);
385163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    }
386163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
387163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    /**
388163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * Broadcast group started event to all handlers registered for this event.
389163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     *
390163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param iface Name of iface on which this occurred.
391163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param group Started group.
392163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     */
393163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public void broadcastP2pGroupStarted(String iface, WifiP2pGroup group) {
394163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        if (group != null) {
395163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            sendMessage(iface, P2P_GROUP_STARTED_EVENT, group);
396163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        }
397163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    }
398163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
399163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    /**
400163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * Broadcast group removed event to all handlers registered for this event.
401163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     *
402163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param iface Name of iface on which this occurred.
403163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param group Removed group.
404163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     */
405163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public void broadcastP2pGroupRemoved(String iface, WifiP2pGroup group) {
406163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        if (group != null) {
407163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            sendMessage(iface, P2P_GROUP_REMOVED_EVENT, group);
408163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        }
409163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    }
410163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
411163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    /**
412163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * Broadcast invitation received event to all handlers registered for this event.
413163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     *
414163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param iface Name of iface on which this occurred.
415163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param group Group to which invitation has been received.
416163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     */
417163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public void broadcastP2pInvitationReceived(String iface, WifiP2pGroup group) {
418163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        if (group != null) {
419163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            sendMessage(iface, P2P_INVITATION_RECEIVED_EVENT, group);
420163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        }
421163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    }
422163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
423163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    /**
424163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * Broadcast invitation result event to all handlers registered for this event.
425163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     *
426163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param iface Name of iface on which this occurred.
427163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param result Result of invitation.
428163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     */
429163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public void broadcastP2pInvitationResult(String iface, P2pStatus result) {
430163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        sendMessage(iface, P2P_INVITATION_RESULT_EVENT, result);
431163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    }
432163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
433163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    /**
434163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * Broadcast PB discovery request event to all handlers registered for this event.
435163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     *
436163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param iface Name of iface on which this occurred.
437163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param event Provision discovery request event.
438163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     */
439163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public void broadcastP2pProvisionDiscoveryPbcRequest(String iface, WifiP2pProvDiscEvent event) {
440163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        if (event != null) {
441163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            sendMessage(iface, P2P_PROV_DISC_PBC_REQ_EVENT, event);
442163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        }
443163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    }
444163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
445163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    /**
446163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * Broadcast PB discovery response event to all handlers registered for this event.
447163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     *
448163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param iface Name of iface on which this occurred.
449163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param event Provision discovery response event.
450163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     */
451163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public void broadcastP2pProvisionDiscoveryPbcResponse(
452163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            String iface, WifiP2pProvDiscEvent event) {
453163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        if (event != null) {
454163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            sendMessage(iface, P2P_PROV_DISC_PBC_RSP_EVENT, event);
455163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        }
456163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    }
457163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
458163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    /**
459163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * Broadcast PIN discovery request event to all handlers registered for this event.
460163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     *
461163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param iface Name of iface on which this occurred.
462163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param event Provision discovery request event.
463163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     */
464163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public void broadcastP2pProvisionDiscoveryEnterPin(String iface, WifiP2pProvDiscEvent event) {
465163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        if (event != null) {
466163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            sendMessage(iface, P2P_PROV_DISC_ENTER_PIN_EVENT, event);
467163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        }
468163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    }
469163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
470163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    /**
471163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * Broadcast PIN discovery response event to all handlers registered for this event.
472163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     *
473163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param iface Name of iface on which this occurred.
474163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param event Provision discovery response event.
475163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     */
476163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public void broadcastP2pProvisionDiscoveryShowPin(String iface, WifiP2pProvDiscEvent event) {
477163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        if (event != null) {
478163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            sendMessage(iface, P2P_PROV_DISC_SHOW_PIN_EVENT, event);
479163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        }
480163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    }
481163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
482163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    /**
483163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * Broadcast P2P discovery failure event to all handlers registered for this event.
484163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     *
485163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param iface Name of iface on which this occurred.
486163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     */
487163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public void broadcastP2pProvisionDiscoveryFailure(String iface) {
488163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        sendMessage(iface, P2P_PROV_DISC_FAILURE_EVENT);
489163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    }
490163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius
491163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    /**
492163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * Broadcast service discovery response event to all handlers registered for this event.
493163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     *
494163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param iface Name of iface on which this occurred.
495163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     * @param services List of discovered services.
496163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius     */
497163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    public void broadcastP2pServiceDiscoveryResponse(
498163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius            String iface, List<WifiP2pServiceResponse> services) {
499163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        sendMessage(iface, P2P_SERV_DISC_RESP_EVENT, services);
500163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    }
5011555c030405df64cb4c52cff44598e678045b82bRoshan Pius
5021555c030405df64cb4c52cff44598e678045b82bRoshan Pius    /**
5031555c030405df64cb4c52cff44598e678045b82bRoshan Pius     * Broadcast AP STA connection event.
5041555c030405df64cb4c52cff44598e678045b82bRoshan Pius     *
5051555c030405df64cb4c52cff44598e678045b82bRoshan Pius     * @param iface Name of iface on which this occurred.
5061555c030405df64cb4c52cff44598e678045b82bRoshan Pius     */
5071555c030405df64cb4c52cff44598e678045b82bRoshan Pius    public void broadcastP2pApStaConnected(String iface, WifiP2pDevice device) {
5081555c030405df64cb4c52cff44598e678045b82bRoshan Pius        sendMessage(iface, AP_STA_CONNECTED_EVENT, device);
5091555c030405df64cb4c52cff44598e678045b82bRoshan Pius    }
5101555c030405df64cb4c52cff44598e678045b82bRoshan Pius
5111555c030405df64cb4c52cff44598e678045b82bRoshan Pius    /**
5121555c030405df64cb4c52cff44598e678045b82bRoshan Pius     * Broadcast AP STA disconnection event.
5131555c030405df64cb4c52cff44598e678045b82bRoshan Pius     *
5141555c030405df64cb4c52cff44598e678045b82bRoshan Pius     * @param iface Name of iface on which this occurred.
5151555c030405df64cb4c52cff44598e678045b82bRoshan Pius     */
5161555c030405df64cb4c52cff44598e678045b82bRoshan Pius    public void broadcastP2pApStaDisconnected(String iface, WifiP2pDevice device) {
5171555c030405df64cb4c52cff44598e678045b82bRoshan Pius        sendMessage(iface, AP_STA_DISCONNECTED_EVENT, device);
5181555c030405df64cb4c52cff44598e678045b82bRoshan Pius    }
519163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius}
520