diff --git a/packages/connectivity/CHANGELOG.md b/packages/connectivity/CHANGELOG.md index 4aa2f43cefec..12370ddaf7fd 100644 --- a/packages/connectivity/CHANGELOG.md +++ b/packages/connectivity/CHANGELOG.md @@ -1,7 +1,11 @@ +## 0.4.3+5 +* Get network info as (2G, 3G, 4G). + ## 0.4.3+4 * [Android] Updated logic to retrieve network info. + ## 0.4.3+3 * Support for TYPE_MOBILE_HIPRI on Android. diff --git a/packages/connectivity/android/src/main/java/io/flutter/plugins/connectivity/ConnectivityPlugin.java b/packages/connectivity/android/src/main/java/io/flutter/plugins/connectivity/ConnectivityPlugin.java index 830e7010621a..d0b771078d59 100644 --- a/packages/connectivity/android/src/main/java/io/flutter/plugins/connectivity/ConnectivityPlugin.java +++ b/packages/connectivity/android/src/main/java/io/flutter/plugins/connectivity/ConnectivityPlugin.java @@ -12,6 +12,8 @@ import android.net.NetworkInfo; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; +import android.telephony.TelephonyManager; + import io.flutter.plugin.common.EventChannel; import io.flutter.plugin.common.EventChannel.EventSink; import io.flutter.plugin.common.EventChannel.StreamHandler; @@ -21,145 +23,225 @@ import io.flutter.plugin.common.MethodChannel.Result; import io.flutter.plugin.common.PluginRegistry.Registrar; -/** ConnectivityPlugin */ +/** + * ConnectivityPlugin + */ public class ConnectivityPlugin implements MethodCallHandler, StreamHandler { - private final Registrar registrar; - private final ConnectivityManager manager; - private BroadcastReceiver receiver; - - /** Plugin registration. */ - public static void registerWith(Registrar registrar) { - final MethodChannel channel = - new MethodChannel(registrar.messenger(), "plugins.flutter.io/connectivity"); - final EventChannel eventChannel = - new EventChannel(registrar.messenger(), "plugins.flutter.io/connectivity_status"); - ConnectivityPlugin instance = new ConnectivityPlugin(registrar); - channel.setMethodCallHandler(instance); - eventChannel.setStreamHandler(instance); - } - - private ConnectivityPlugin(Registrar registrar) { - this.registrar = registrar; - this.manager = - (ConnectivityManager) - registrar + private final Registrar registrar; + private final ConnectivityManager manager; + private BroadcastReceiver receiver; + + /** + * Plugin registration. + */ + public static void registerWith(Registrar registrar) { + final MethodChannel channel = + new MethodChannel(registrar.messenger(), "plugins.flutter.io/connectivity"); + final EventChannel eventChannel = + new EventChannel(registrar.messenger(), "plugins.flutter.io/connectivity_status"); + ConnectivityPlugin instance = new ConnectivityPlugin(registrar); + channel.setMethodCallHandler(instance); + eventChannel.setStreamHandler(instance); + } + + private ConnectivityPlugin(Registrar registrar) { + this.registrar = registrar; + this.manager = + (ConnectivityManager) + registrar + .context() + .getApplicationContext() + .getSystemService(Context.CONNECTIVITY_SERVICE); + } + + @Override + public void onListen(Object arguments, EventSink events) { + receiver = createReceiver(events); + registrar .context() - .getApplicationContext() - .getSystemService(Context.CONNECTIVITY_SERVICE); - } - - @Override - public void onListen(Object arguments, EventSink events) { - receiver = createReceiver(events); - registrar - .context() - .registerReceiver(receiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); - } - - @Override - public void onCancel(Object arguments) { - registrar.context().unregisterReceiver(receiver); - receiver = null; - } - - private static String getNetworkType(int type) { - switch (type) { - case ConnectivityManager.TYPE_ETHERNET: - case ConnectivityManager.TYPE_WIFI: - case ConnectivityManager.TYPE_WIMAX: - return "wifi"; - case ConnectivityManager.TYPE_MOBILE: - case ConnectivityManager.TYPE_MOBILE_DUN: - case ConnectivityManager.TYPE_MOBILE_HIPRI: - return "mobile"; - default: - return "none"; + .registerReceiver(receiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); + } + + @Override + public void onCancel(Object arguments) { + registrar.context().unregisterReceiver(receiver); + receiver = null; + } + + private static String getNetworkType(int type) { + switch (type) { + case ConnectivityManager.TYPE_ETHERNET: + case ConnectivityManager.TYPE_WIFI: + case ConnectivityManager.TYPE_WIMAX: + return "wifi"; + case ConnectivityManager.TYPE_MOBILE: + case ConnectivityManager.TYPE_MOBILE_DUN: + case ConnectivityManager.TYPE_MOBILE_HIPRI: + return "mobile"; + default: + return "none"; + } + } + + private static String getNetworkSubType(int type, int subType) { + switch (type) { + case ConnectivityManager.TYPE_ETHERNET: + case ConnectivityManager.TYPE_WIFI: + case ConnectivityManager.TYPE_WIMAX: + return "wifi"; + case ConnectivityManager.TYPE_MOBILE: + case ConnectivityManager.TYPE_MOBILE_DUN: + case ConnectivityManager.TYPE_MOBILE_HIPRI: + switch (subType) { + case TelephonyManager.NETWORK_TYPE_1xRTT: + return "2G"; // ~ 50-100 kbps + case TelephonyManager.NETWORK_TYPE_CDMA: + return "2G"; // ~ 14-64 kbps + case TelephonyManager.NETWORK_TYPE_EDGE: + return "2G"; // ~ 50-100 kbps + case TelephonyManager.NETWORK_TYPE_EVDO_0: + return "3G"; // ~ 400-1000 kbps + case TelephonyManager.NETWORK_TYPE_EVDO_A: + return "3G"; // ~ 600-1400 kbps + case TelephonyManager.NETWORK_TYPE_GPRS: + return "2G"; // ~ 100 kbps + case TelephonyManager.NETWORK_TYPE_HSDPA: + return "3G"; // ~ 2-14 Mbps + case TelephonyManager.NETWORK_TYPE_HSPA: + return "3G"; // ~ 700-1700 kbps + case TelephonyManager.NETWORK_TYPE_HSUPA: + return "3G"; // ~ 1-23 Mbps + case TelephonyManager.NETWORK_TYPE_UMTS: + return "3G"; // ~ 400-7000 kbps + /* + * Above API level 7, make sure to set android:targetSdkVersion + * to appropriate level to use these + */ + case TelephonyManager.NETWORK_TYPE_EHRPD: // API level 11 + return "3G"; // ~ 1-2 Mbps + case TelephonyManager.NETWORK_TYPE_EVDO_B: // API level 9 + return "3G"; // ~ 5 Mbps + case TelephonyManager.NETWORK_TYPE_HSPAP: // API level 13 + return "3G"; // ~ 10-20 Mbps + case TelephonyManager.NETWORK_TYPE_IDEN: // API level 8 + return "2G"; // ~25 kbps + case TelephonyManager.NETWORK_TYPE_LTE: // API level 11 + return "4G"; // ~ 10+ Mbps + // Unknown + case TelephonyManager.NETWORK_TYPE_UNKNOWN: + default: + return "none"; + } + default: + return "none"; + } + } + + @Override + public void onMethodCall(MethodCall call, Result result) { + switch (call.method) { + case "check": + handleCheck(call, result); + break; + case "wifiName": + handleWifiName(call, result); + break; + case "wifiBSSID": + handleBSSID(call, result); + break; + case "wifiIPAddress": + handleWifiIPAddress(call, result); + break; + case "getMobileConnectionType": + handleMobileConnectionType(call, result); + break; + default: + result.notImplemented(); + break; + } + } + + private void handleMobileConnectionType(MethodCall call, final Result result) { + NetworkInfo info = manager.getActiveNetworkInfo(); + if (info != null && info.isConnected()) { + result.success(getNetworkSubType(info.getType(), info.getSubtype())); + } else { + result.success("none"); + } } - } - - @Override - public void onMethodCall(MethodCall call, Result result) { - switch (call.method) { - case "check": - handleCheck(call, result); - break; - case "wifiName": - handleWifiName(call, result); - break; - case "wifiBSSID": - handleBSSID(call, result); - break; - case "wifiIPAddress": - handleWifiIPAddress(call, result); - break; - default: - result.notImplemented(); - break; + + private void handleCheck(MethodCall call, final Result result) { + result.success(checkNetworkType()); } - } - - private void handleCheck(MethodCall call, final Result result) { - result.success(checkNetworkType()); - } - - private String checkNetworkType() { - NetworkInfo info = manager.getActiveNetworkInfo(); - if (info != null && info.isConnected()) { - return getNetworkType(info.getType()); - } else { - return "none"; + + private String checkNetworkType() { + NetworkInfo info = manager.getActiveNetworkInfo(); + if (info != null && info.isConnected()) { + return getNetworkType(info.getType()); + } else { + return "none"; + } + } + + private WifiInfo getWifiInfo() { + WifiManager wifiManager = + (WifiManager) + registrar.context().getApplicationContext().getSystemService(Context.WIFI_SERVICE); + return wifiManager == null ? null : wifiManager.getConnectionInfo(); + } + + private void handleWifiName(MethodCall call, final Result result) { + WifiInfo wifiInfo = getWifiInfo(); + String ssid = null; + if (wifiInfo != null) ssid = wifiInfo.getSSID(); + if (ssid != null) ssid = ssid.replaceAll("\"", ""); // Android returns "SSID" + result.success(ssid); + } + + private void handleBSSID(MethodCall call, MethodChannel.Result result) { + WifiInfo wifiInfo = getWifiInfo(); + String bssid = null; + if (wifiInfo != null) bssid = wifiInfo.getBSSID(); + result.success(bssid); + } + + private void handleWifiIPAddress(MethodCall call, final Result result) { + WifiManager wifiManager = + (WifiManager) + registrar.context().getApplicationContext().getSystemService(Context.WIFI_SERVICE); + + WifiInfo wifiInfo = null; + if (wifiManager != null) wifiInfo = wifiManager.getConnectionInfo(); + + String ip = null; + int i_ip = 0; + if (wifiInfo != null) i_ip = wifiInfo.getIpAddress(); + + if (i_ip != 0) + ip = + String.format( + "%d.%d.%d.%d", + (i_ip & 0xff), (i_ip >> 8 & 0xff), (i_ip >> 16 & 0xff), (i_ip >> 24 & 0xff)); + + result.success(ip); + } + + private BroadcastReceiver createReceiver(final EventSink events) { + return new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + boolean isLost = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false); + if (isLost) { + events.success("none"); + return; + } + + int type = intent.getIntExtra(ConnectivityManager.EXTRA_NETWORK_TYPE, -1); + TelephonyManager mTelephonyManager = + (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); + int subType = mTelephonyManager.getNetworkType(); + events.success(checkNetworkType()); + } + }; } - } - - private WifiInfo getWifiInfo() { - WifiManager wifiManager = - (WifiManager) - registrar.context().getApplicationContext().getSystemService(Context.WIFI_SERVICE); - return wifiManager == null ? null : wifiManager.getConnectionInfo(); - } - - private void handleWifiName(MethodCall call, final Result result) { - WifiInfo wifiInfo = getWifiInfo(); - String ssid = null; - if (wifiInfo != null) ssid = wifiInfo.getSSID(); - if (ssid != null) ssid = ssid.replaceAll("\"", ""); // Android returns "SSID" - result.success(ssid); - } - - private void handleBSSID(MethodCall call, MethodChannel.Result result) { - WifiInfo wifiInfo = getWifiInfo(); - String bssid = null; - if (wifiInfo != null) bssid = wifiInfo.getBSSID(); - result.success(bssid); - } - - private void handleWifiIPAddress(MethodCall call, final Result result) { - WifiManager wifiManager = - (WifiManager) - registrar.context().getApplicationContext().getSystemService(Context.WIFI_SERVICE); - - WifiInfo wifiInfo = null; - if (wifiManager != null) wifiInfo = wifiManager.getConnectionInfo(); - - String ip = null; - int i_ip = 0; - if (wifiInfo != null) i_ip = wifiInfo.getIpAddress(); - - if (i_ip != 0) - ip = - String.format( - "%d.%d.%d.%d", - (i_ip & 0xff), (i_ip >> 8 & 0xff), (i_ip >> 16 & 0xff), (i_ip >> 24 & 0xff)); - - result.success(ip); - } - - private BroadcastReceiver createReceiver(final EventSink events) { - return new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - events.success(checkNetworkType()); - } - }; - } } diff --git a/packages/connectivity/ios/Classes/ConnectivityPlugin.m b/packages/connectivity/ios/Classes/ConnectivityPlugin.m index e92fff220a2e..ff4dd7ff7a1b 100644 --- a/packages/connectivity/ios/Classes/ConnectivityPlugin.m +++ b/packages/connectivity/ios/Classes/ConnectivityPlugin.m @@ -18,8 +18,9 @@ @interface FLTConnectivityPlugin () @implementation FLTConnectivityPlugin { FlutterEventSink _eventSink; } +- -+ (void)registerWithRegistrar:(NSObject*)registrar { + + (void)registerWithRegistrar:(NSObject*)registrar { FLTConnectivityPlugin* instance = [[FLTConnectivityPlugin alloc] init]; FlutterMethodChannel* channel = @@ -85,6 +86,43 @@ - (NSString*)getWifiIP { return address; } +- (NSString*)getMobileConnectionType:(Reachability*)reachability { + NetworkStatus status = [reachability currentReachabilityStatus]; + switch (status) { + case NotReachable: + return @"none"; + case ReachableViaWiFi: + return @"wifi"; + case ReachableViaWWAN: + CTTelephonyNetworkInfo* netinfo = [[CTTelephonyNetworkInfo alloc] init]; + NSString* carrierType = netinfo.currentRadioAccessTechnology; + if ([carrierType isEqualToString:CTRadioAccessTechnologyGPRS]) { + return @"2G"; + } else if ([carrierType isEqualToString:CTRadioAccessTechnologyEdge]) { + return @"2G"; + } else if ([carrierType isEqualToString:CTRadioAccessTechnologyWCDMA]) { + return @"3G"; + } else if ([carrierType isEqualToString:CTRadioAccessTechnologyHSDPA]) { + return @"3G"; + } else if ([carrierType isEqualToString:CTRadioAccessTechnologyHSUPA]) { + return @"3G"; + } else if ([carrierType isEqualToString:CTRadioAccessTechnologyCDMA1x]) { + return @"2G"; + } else if ([carrierType isEqualToString:CTRadioAccessTechnologyCDMAEVDORev0]) { + return @"3G"; + } else if ([carrierType isEqualToString:CTRadioAccessTechnologyCDMAEVDORevA]) { + return @"3G"; + } else if ([carrierType isEqualToString:CTRadioAccessTechnologyCDMAEVDORevB]) { + return @"3G"; + } else if ([carrierType isEqualToString:CTRadioAccessTechnologyeHRPD]) { + return @"3G"; + } else if ([carrierType isEqualToString:CTRadioAccessTechnologyLTE]) { + return @"4G"; + } + return @"none"; + } +} + - (NSString*)statusFromReachability:(Reachability*)reachability { NetworkStatus status = [reachability currentReachabilityStatus]; switch (status) { @@ -111,6 +149,8 @@ - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { result([self getBSSID]); } else if ([call.method isEqualToString:@"wifiIPAddress"]) { result([self getWifiIP]); + } else if ([call.method isEqualToString:@"getMobileConnectionType"]) { + result([self getMobileConnectionType]); } else { result(FlutterMethodNotImplemented); } diff --git a/packages/connectivity/lib/connectivity.dart b/packages/connectivity/lib/connectivity.dart index a1fd21cb1668..649c95e9e24c 100644 --- a/packages/connectivity/lib/connectivity.dart +++ b/packages/connectivity/lib/connectivity.dart @@ -93,6 +93,10 @@ class Connectivity { Future getWifiIP() async { return await methodChannel.invokeMethod('wifiIPAddress'); } + + Future getMobileConnectionType() async { + return await methodChannel.invokeMethod('getMobileConnectionType'); + } } ConnectivityResult _parseConnectivityResult(String state) { diff --git a/packages/connectivity/pubspec.yaml b/packages/connectivity/pubspec.yaml index 788e1d0d12ff..926cfd1bf364 100644 --- a/packages/connectivity/pubspec.yaml +++ b/packages/connectivity/pubspec.yaml @@ -3,7 +3,9 @@ description: Flutter plugin for discovering the state of the network (WiFi & mobile/cellular) connectivity on Android and iOS. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/connectivity -version: 0.4.3+4 + +version: 0.4.3+5 + flutter: plugin: