Index: talk/app/webrtc/java/android/org/webrtc/NetworkMonitorAutoDetect.java |
diff --git a/talk/app/webrtc/java/android/org/webrtc/NetworkMonitorAutoDetect.java b/talk/app/webrtc/java/android/org/webrtc/NetworkMonitorAutoDetect.java |
index 950dcdfa445a25ce6ecae9c7055045692703546d..1cdd0b091105872bb7f468a505b77c3fe07bbf89 100644 |
--- a/talk/app/webrtc/java/android/org/webrtc/NetworkMonitorAutoDetect.java |
+++ b/talk/app/webrtc/java/android/org/webrtc/NetworkMonitorAutoDetect.java |
@@ -37,9 +37,13 @@ import android.content.Intent; |
import android.content.IntentFilter; |
import android.content.pm.PackageManager; |
import android.net.ConnectivityManager; |
+import android.net.ConnectivityManager.NetworkCallback; |
+import android.net.LinkAddress; |
+import android.net.LinkProperties; |
import android.net.Network; |
import android.net.NetworkCapabilities; |
import android.net.NetworkInfo; |
+import android.net.NetworkRequest; |
import android.net.wifi.WifiInfo; |
import android.net.wifi.WifiManager; |
import android.os.Build; |
@@ -66,6 +70,28 @@ public class NetworkMonitorAutoDetect extends BroadcastReceiver { |
CONNECTION_NONE |
} |
+ public static class IPAddress { |
+ public byte[] address; |
+ public IPAddress (byte[] address) { |
+ this.address = address; |
+ } |
+ } |
+ |
+ /** Java version of NetworkMonitor.NetworkInformation */ |
+ public static class NetworkInformation{ |
+ public String name; |
+ public ConnectionType type; |
+ public int handle; |
+ public IPAddress[] ipAddresses; |
+ public NetworkInformation(String name, ConnectionType type, int handle, |
+ IPAddress[] addresses) { |
+ this.name = name; |
+ this.type = type; |
+ this.handle = handle; |
+ this.ipAddresses = addresses; |
+ } |
+ }; |
+ |
static class NetworkState { |
private final boolean connected; |
// Defined from ConnectivityManager.TYPE_XXX for non-mobile; for mobile, it is |
@@ -101,6 +127,7 @@ public class NetworkMonitorAutoDetect extends BroadcastReceiver { |
* gracefully below. |
*/ |
private final ConnectivityManager connectivityManager; |
+ private NetworkCallback networkCallback; |
ConnectivityManagerDelegate(Context context) { |
connectivityManager = |
@@ -211,30 +238,77 @@ public class NetworkMonitorAutoDetect extends BroadcastReceiver { |
connectivityManager.getNetworkCapabilities(network); |
return capabilities != null && capabilities.hasCapability(NET_CAPABILITY_INTERNET); |
} |
+ |
+ @SuppressLint("NewApi") |
+ public void requestMobileNetwork(final Observer observer) { |
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP || |
+ connectivityManager == null) { |
+ return; |
+ } |
+ networkCallback = new NetworkCallback() { |
+ @Override |
+ public void onAvailable(Network network) { |
+ super.onAvailable(network); |
+ LinkProperties linkProperties = connectivityManager.getLinkProperties(network); |
+ NetworkInformation networkInformation = new NetworkInformation( |
+ linkProperties.getInterfaceName(), |
+ getConnectionType(getNetworkState(network)), |
+ networkToNetId(network), |
+ getIPAddresses(linkProperties)); |
+ Log.i(TAG, "Cellular network " + networkInformation.name + " is connected "); |
+ observer.onNetworkConnect(networkInformation); |
+ } |
+ |
+ @Override |
+ public void onCapabilitiesChanged(Network network, NetworkCapabilities capabilities) { |
+ super.onCapabilitiesChanged(network, capabilities); |
+ } |
+ @Override |
+ public void onLinkPropertiesChanged(Network network, LinkProperties properties) { |
+ super.onLinkPropertiesChanged(network, properties); |
+ } |
pthatcher1
2016/01/14 20:07:24
Is it necessary to override these last two? Doesn
honghaiz3
2016/01/15 01:00:38
Done.
|
+ }; |
+ Log.i(TAG, "Requesting cellular network"); |
+ NetworkRequest.Builder builder = new NetworkRequest.Builder(); |
+ builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); |
+ builder.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR); |
+ connectivityManager.requestNetwork(builder.build(), networkCallback); |
+ } |
+ |
+ @SuppressLint("NewApi") |
+ IPAddress[] getIPAddresses(LinkProperties linkProperties) { |
+ LinkAddress[] linkAddresses = |
+ new LinkAddress[linkProperties.getLinkAddresses().size()]; |
+ linkProperties.getLinkAddresses().toArray(linkAddresses); |
+ IPAddress[] ipAddresses = new IPAddress[linkAddresses.length]; |
+ for (int i = 0; i < linkAddresses.length; ++i) { |
+ ipAddresses[i] = new IPAddress(linkAddresses[i].getAddress().getAddress()); |
+ } |
+ return ipAddresses; |
+ } |
+ |
+ @SuppressLint("NewApi") |
+ public void releaseCallback() { |
+ if (networkCallback != null) { |
+ connectivityManager.unregisterNetworkCallback(networkCallback); |
+ networkCallback = null; |
+ } |
+ } |
+ |
} |
+ |
/** Queries the WifiManager for SSID of the current Wifi connection. */ |
static class WifiManagerDelegate { |
private final Context context; |
- private final WifiManager wifiManager; |
- private final boolean hasWifiPermission; |
- |
WifiManagerDelegate(Context context) { |
this.context = context; |
- |
- hasWifiPermission = context.getPackageManager().checkPermission( |
- permission.ACCESS_WIFI_STATE, context.getPackageName()) |
- == PackageManager.PERMISSION_GRANTED; |
- wifiManager = hasWifiPermission |
- ? (WifiManager) context.getSystemService(Context.WIFI_SERVICE) : null; |
pthatcher1
2016/01/14 20:07:23
Did this work before Lollipop? Will Kitkat and pr
honghaiz3
2016/01/15 01:00:37
Those are not really used before. There used to be
|
} |
// For testing. |
WifiManagerDelegate() { |
// All the methods below should be overridden. |
context = null; |
- wifiManager = null; |
- hasWifiPermission = false; |
} |
String getWifiSSID() { |
@@ -252,9 +326,6 @@ public class NetworkMonitorAutoDetect extends BroadcastReceiver { |
return ""; |
} |
- boolean getHasWifiPermission() { |
- return hasWifiPermission; |
- } |
} |
static final int INVALID_NET_ID = -1; |
@@ -280,6 +351,7 @@ public class NetworkMonitorAutoDetect extends BroadcastReceiver { |
* Called when default network changes. |
*/ |
public void onConnectionTypeChanged(ConnectionType newConnectionType); |
+ public void onNetworkConnect(NetworkInformation networkInfo); |
} |
/** |
@@ -292,8 +364,8 @@ public class NetworkMonitorAutoDetect extends BroadcastReceiver { |
wifiManagerDelegate = new WifiManagerDelegate(context); |
final NetworkState networkState = connectivityManagerDelegate.getNetworkState(); |
- connectionType = getCurrentConnectionType(networkState); |
- wifiSSID = getCurrentWifiSSID(networkState); |
+ connectionType = getConnectionType(networkState); |
+ wifiSSID = getWifiSSID(networkState); |
intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); |
registerReceiver(); |
} |
@@ -331,6 +403,7 @@ public class NetworkMonitorAutoDetect extends BroadcastReceiver { |
if (!isRegistered) { |
isRegistered = true; |
context.registerReceiver(this, intentFilter); |
+ connectivityManagerDelegate.requestMobileNetwork(observer); |
} |
} |
@@ -341,6 +414,7 @@ public class NetworkMonitorAutoDetect extends BroadcastReceiver { |
if (isRegistered) { |
isRegistered = false; |
context.unregisterReceiver(this); |
+ connectivityManagerDelegate.releaseCallback(); |
} |
} |
@@ -361,7 +435,7 @@ public class NetworkMonitorAutoDetect extends BroadcastReceiver { |
return connectivityManagerDelegate.getDefaultNetId(); |
} |
- public ConnectionType getCurrentConnectionType(NetworkState networkState) { |
+ public static ConnectionType getConnectionType(NetworkState networkState) { |
if (!networkState.isConnected()) { |
return ConnectionType.CONNECTION_NONE; |
} |
@@ -404,8 +478,8 @@ public class NetworkMonitorAutoDetect extends BroadcastReceiver { |
} |
} |
- private String getCurrentWifiSSID(NetworkState networkState) { |
- if (getCurrentConnectionType(networkState) != ConnectionType.CONNECTION_WIFI) return ""; |
+ private String getWifiSSID(NetworkState networkState) { |
+ if (getConnectionType(networkState) != ConnectionType.CONNECTION_WIFI) return ""; |
return wifiManagerDelegate.getWifiSSID(); |
} |
@@ -419,8 +493,8 @@ public class NetworkMonitorAutoDetect extends BroadcastReceiver { |
} |
private void connectionTypeChanged(NetworkState networkState) { |
- ConnectionType newConnectionType = getCurrentConnectionType(networkState); |
- String newWifiSSID = getCurrentWifiSSID(networkState); |
+ ConnectionType newConnectionType = getConnectionType(networkState); |
+ String newWifiSSID = getWifiSSID(networkState); |
if (newConnectionType == connectionType && newWifiSSID.equals(wifiSSID)) return; |
connectionType = newConnectionType; |