This helps recognize more network types
and even if the "unknown" network type is not helpful for identifying the network type, it helps bind sockets to the network.

BUG=
R=glaznev@webrtc.org

Review URL: https://codereview.webrtc.org/2112963002 .

Cr-Original-Commit-Position: refs/heads/master@{#13351}
Cr-Mirrored-From: https://chromium.googlesource.com/external/webrtc
Cr-Mirrored-Commit: e59122889fc6e480238613558c67de13747ae487
diff --git a/api/java/android/org/webrtc/NetworkMonitor.java b/api/java/android/org/webrtc/NetworkMonitor.java
index 3fcb1c5..cbe68d0 100644
--- a/api/java/android/org/webrtc/NetworkMonitor.java
+++ b/api/java/android/org/webrtc/NetworkMonitor.java
@@ -231,8 +231,7 @@
    */
   public static boolean isOnline() {
     ConnectionType connectionType = getInstance().getCurrentConnectionType();
-    return connectionType != ConnectionType.CONNECTION_UNKNOWN
-        && connectionType != ConnectionType.CONNECTION_NONE;
+    return connectionType != ConnectionType.CONNECTION_NONE;
   }
 
   private native void nativeNotifyConnectionTypeChanged(long nativePtr);
diff --git a/api/java/android/org/webrtc/NetworkMonitorAutoDetect.java b/api/java/android/org/webrtc/NetworkMonitorAutoDetect.java
index c4e3a90..4335e5c 100644
--- a/api/java/android/org/webrtc/NetworkMonitorAutoDetect.java
+++ b/api/java/android/org/webrtc/NetworkMonitorAutoDetect.java
@@ -55,6 +55,7 @@
     CONNECTION_4G,
     CONNECTION_3G,
     CONNECTION_2G,
+    CONNECTION_UNKNOWN_CELLULAR,
     CONNECTION_BLUETOOTH,
     CONNECTION_NONE
   }
@@ -292,17 +293,24 @@
         return null;
       }
 
-      ConnectionType connectionType = getConnectionType(getNetworkState(network));
-      if (connectionType == ConnectionType.CONNECTION_UNKNOWN
-          || connectionType == ConnectionType.CONNECTION_NONE) {
+      NetworkState networkState = getNetworkState(network);
+      ConnectionType connectionType = getConnectionType(networkState);
+      if (connectionType == ConnectionType.CONNECTION_NONE) {
         // This may not be an error. The OS may signal a network event with connection type
-        // NONE when the network disconnects. But in some devices, the OS may incorrectly
-        // report an UNKNOWN connection type. In either case, it won't benefit to send down
-        // a network event with this connection type.
-        Logging.d(TAG, "Network " + network.toString() + " has connection type " + connectionType);
+        // NONE when the network disconnects.
+        Logging.d(TAG, "Network " + network.toString() + " is disconnected");
         return null;
       }
 
+      // Some android device may return a CONNECTION_UNKNOWN_CELLULAR or CONNECTION_UNKNOWN type,
+      // which appears to be usable. Just log them here.
+      if (connectionType == ConnectionType.CONNECTION_UNKNOWN
+          || connectionType == ConnectionType.CONNECTION_UNKNOWN_CELLULAR) {
+        Logging.d(TAG, "Network " + network.toString() + " connection type is " + connectionType
+                  + " because it has type " + networkState.getNetworkType()
+                  + " and subtype " + networkState.getNetworkSubType());
+      }
+
       NetworkInformation networkInformation = new NetworkInformation(
           linkProperties.getInterfaceName(),
           connectionType,
@@ -569,7 +577,7 @@
           case TelephonyManager.NETWORK_TYPE_LTE:
             return ConnectionType.CONNECTION_4G;
           default:
-            return ConnectionType.CONNECTION_UNKNOWN;
+            return ConnectionType.CONNECTION_UNKNOWN_CELLULAR;
         }
       default:
         return ConnectionType.CONNECTION_UNKNOWN;
diff --git a/api/java/jni/androidnetworkmonitor_jni.cc b/api/java/jni/androidnetworkmonitor_jni.cc
index a815e27..c109298 100644
--- a/api/java/jni/androidnetworkmonitor_jni.cc
+++ b/api/java/jni/androidnetworkmonitor_jni.cc
@@ -44,6 +44,9 @@
   if (enum_name == "CONNECTION_2G") {
     return NetworkType::NETWORK_2G;
   }
+  if (enum_name == "CONNECTION_UNKNOWN_CELLULAR") {
+    return NetworkType::NETWORK_UNKNOWN_CELLULAR;
+  }
   if (enum_name == "CONNECTION_BLUETOOTH") {
     return NetworkType::NETWORK_BLUETOOTH;
   }
@@ -57,7 +60,6 @@
 static rtc::AdapterType AdapterTypeFromNetworkType(NetworkType network_type) {
   switch (network_type) {
     case NETWORK_UNKNOWN:
-      RTC_DCHECK(false) << "Unknown network type";
       return rtc::ADAPTER_TYPE_UNKNOWN;
     case NETWORK_ETHERNET:
       return rtc::ADAPTER_TYPE_ETHERNET;
@@ -66,6 +68,7 @@
     case NETWORK_4G:
     case NETWORK_3G:
     case NETWORK_2G:
+    case NETWORK_UNKNOWN_CELLULAR:
       return rtc::ADAPTER_TYPE_CELLULAR;
     case NETWORK_BLUETOOTH:
       // There is no corresponding mapping for bluetooth networks.
diff --git a/api/java/jni/androidnetworkmonitor_jni.h b/api/java/jni/androidnetworkmonitor_jni.h
index 2537ce8..ff12abc 100644
--- a/api/java/jni/androidnetworkmonitor_jni.h
+++ b/api/java/jni/androidnetworkmonitor_jni.h
@@ -31,6 +31,7 @@
   NETWORK_4G,
   NETWORK_3G,
   NETWORK_2G,
+  NETWORK_UNKNOWN_CELLULAR,
   NETWORK_BLUETOOTH,
   NETWORK_NONE
 };