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