Index: webrtc/sdk/android/api/org/webrtc/NetworkMonitorAutoDetect.java |
diff --git a/webrtc/sdk/android/api/org/webrtc/NetworkMonitorAutoDetect.java b/webrtc/sdk/android/api/org/webrtc/NetworkMonitorAutoDetect.java |
index 7805bc594f39db8756cdfb069f0a41884a653570..77b77be95c1d7a5ea3eee900acff56d09a028c2a 100644 |
--- a/webrtc/sdk/android/api/org/webrtc/NetworkMonitorAutoDetect.java |
+++ b/webrtc/sdk/android/api/org/webrtc/NetworkMonitorAutoDetect.java |
@@ -10,7 +10,6 @@ |
package org.webrtc; |
-import android.Manifest.permission; |
import android.annotation.SuppressLint; |
import android.content.BroadcastReceiver; |
import android.content.Context; |
@@ -26,9 +25,15 @@ import android.net.NetworkInfo; |
import android.net.NetworkRequest; |
import android.net.wifi.WifiInfo; |
import android.net.wifi.WifiManager; |
+import android.net.wifi.p2p.WifiP2pGroup; |
+import android.net.wifi.p2p.WifiP2pManager; |
import android.os.Build; |
import android.telephony.TelephonyManager; |
+import java.net.InetAddress; |
+import java.net.NetworkInterface; |
+import java.net.SocketException; |
import java.util.ArrayList; |
+import java.util.Collections; |
import java.util.List; |
/** |
@@ -402,6 +407,90 @@ public class NetworkMonitorAutoDetect extends BroadcastReceiver { |
} |
} |
+ /** Maintains the information about wifi direct (aka WifiP2p) networks. */ |
+ static class WifiDirectManagerDelegate extends BroadcastReceiver { |
+ // Network "handle" for the Wifi P2p network. We have to bind to the default network id |
+ // (NETWORK_UNSPECIFIED) for these addresses. |
+ private static final int WIFI_P2P_NETWORK_HANDLE = 0; |
+ private final Context context; |
+ private final Observer observer; |
+ // Network information about a WifiP2p (aka WiFi-Direct) network, or null if no such network is |
+ // connected. |
+ private NetworkInformation wifiP2pNetworkInfo = null; |
+ |
+ WifiDirectManagerDelegate(Observer observer, Context context) { |
+ this.context = context; |
+ this.observer = observer; |
+ IntentFilter intentFilter = new IntentFilter(); |
+ intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION); |
+ intentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION); |
+ context.registerReceiver(this, intentFilter); |
+ } |
+ |
+ // BroadcastReceiver |
+ @Override |
+ @SuppressLint("InlinedApi") |
+ public void onReceive(Context context, Intent intent) { |
+ if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(intent.getAction())) { |
+ WifiP2pGroup wifiP2pGroup = intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_GROUP); |
+ onWifiP2pGroupChange(wifiP2pGroup); |
+ } else if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(intent.getAction())) { |
+ int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, 0 /* default to unknown */); |
+ onWifiP2pStateChange(state); |
+ } |
+ } |
+ |
+ /** Releases the broadcast receiver. */ |
+ public void release() { |
+ context.unregisterReceiver(this); |
+ } |
+ |
+ public List<NetworkInformation> getActiveNetworkList() { |
+ if (wifiP2pNetworkInfo != null) { |
+ return Collections.singletonList(wifiP2pNetworkInfo); |
+ } |
+ |
+ return Collections.emptyList(); |
+ } |
+ |
+ /** Handle a change notification about the wifi p2p group. */ |
+ private void onWifiP2pGroupChange(WifiP2pGroup wifiP2pGroup) { |
+ if (wifiP2pGroup == null || wifiP2pGroup.getInterface() == null) { |
+ return; |
+ } |
+ |
+ NetworkInterface wifiP2pInterface; |
+ try { |
+ wifiP2pInterface = NetworkInterface.getByName(wifiP2pGroup.getInterface()); |
+ } catch (SocketException e) { |
+ Logging.e(TAG, "Unable to get WifiP2p network interface", e); |
+ return; |
+ } |
+ |
+ List<InetAddress> interfaceAddresses = Collections.list(wifiP2pInterface.getInetAddresses()); |
+ IPAddress[] ipAddresses = new IPAddress[interfaceAddresses.size()]; |
+ for (int i = 0; i < interfaceAddresses.size(); ++i) { |
+ ipAddresses[i] = new IPAddress(interfaceAddresses.get(i).getAddress()); |
+ } |
+ |
+ wifiP2pNetworkInfo = |
+ new NetworkInformation( |
+ wifiP2pGroup.getInterface(), |
+ ConnectionType.CONNECTION_WIFI, |
+ WIFI_P2P_NETWORK_HANDLE, |
+ ipAddresses); |
+ observer.onNetworkConnect(wifiP2pNetworkInfo); |
+ } |
+ |
+ /** Handle a state change notification about wifi p2p. */ |
+ private void onWifiP2pStateChange(int state) { |
+ if (state == WifiP2pManager.WIFI_P2P_STATE_DISABLED) { |
+ wifiP2pNetworkInfo = null; |
+ observer.onNetworkDisconnect(WIFI_P2P_NETWORK_HANDLE); |
+ } |
+ } |
+ } |
+ |
static final long INVALID_NET_ID = -1; |
private static final String TAG = "NetworkMonitorAutoDetect"; |
@@ -417,6 +506,7 @@ public class NetworkMonitorAutoDetect extends BroadcastReceiver { |
// connectivityManagerDelegate and wifiManagerDelegate are only non-final for testing. |
private ConnectivityManagerDelegate connectivityManagerDelegate; |
private WifiManagerDelegate wifiManagerDelegate; |
+ private WifiDirectManagerDelegate wifiDirectManagerDelegate; |
private boolean isRegistered; |
private ConnectionType connectionType; |
@@ -449,6 +539,10 @@ public class NetworkMonitorAutoDetect extends BroadcastReceiver { |
wifiSSID = getWifiSSID(networkState); |
intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); |
+ if (PeerConnectionFactory.fieldTrialsFindFullName("IncludeWifiDirect").equals("Enabled")) { |
+ wifiDirectManagerDelegate = new WifiDirectManagerDelegate(observer, context); |
+ } |
+ |
registerReceiver(); |
if (connectivityManagerDelegate.supportNetworkCallback()) { |
// On Android 6.0.0, the WRITE_SETTINGS permission is necessary for |
@@ -496,7 +590,12 @@ public class NetworkMonitorAutoDetect extends BroadcastReceiver { |
} |
List<NetworkInformation> getActiveNetworkList() { |
- return connectivityManagerDelegate.getActiveNetworkList(); |
+ ArrayList<NetworkInformation> result = |
+ new ArrayList<NetworkInformation>(connectivityManagerDelegate.getActiveNetworkList()); |
+ if (wifiDirectManagerDelegate != null) { |
+ result.addAll(wifiDirectManagerDelegate.getActiveNetworkList()); |
+ } |
+ return result; |
} |
public void destroy() { |
@@ -506,6 +605,9 @@ public class NetworkMonitorAutoDetect extends BroadcastReceiver { |
if (mobileNetworkCallback != null) { |
connectivityManagerDelegate.releaseCallback(mobileNetworkCallback); |
} |
+ if (wifiDirectManagerDelegate != null) { |
+ wifiDirectManagerDelegate.release(); |
+ } |
unregisterReceiver(); |
} |