| // http://opensource.org/licenses/MIT |
| package net.i2p.android.router.util; |
|
|
| import android.content.Context; |
| import android.net.ConnectivityManager; |
| import android.net.NetworkInfo; |
| import android.telephony.TelephonyManager; |
|
|
| /** |
| * Check device's network connectivity and speed. |
| * |
| * @author emil http://stackoverflow.com/users/220710/emil |
| * @author str4d |
| */ |
| public class Connectivity { |
| /** |
| * Get the network info. |
| * |
| * @param context the Context. |
| * @return the active NetworkInfo. |
| */ |
| public static NetworkInfo getNetworkInfo(Context context) { |
| ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); |
| return cm.getActiveNetworkInfo(); |
| } |
|
|
| /** |
| * Check if there is any connectivity at all. |
| * |
| * @param context the Context. |
| * @return true if we are connected to a network, false otherwise. |
| */ |
| public static boolean isConnected(Context context) { |
| NetworkInfo info = Connectivity.getNetworkInfo(context); |
| // Works on emulator and devices. |
| // Note the use of isAvailable() - without this, isConnected() can |
| // return true when Wifi is disabled. |
| // http://stackoverflow.com/a/2937915 |
| return (info != null && info.isAvailable() && info.isConnected()); |
| } |
|
|
| /** |
| * Check if there is any connectivity to a Wifi network. |
| * |
| * @param context the Context. |
| * @return true if we are connected to a Wifi network, false otherwise. |
| */ |
| public static boolean isConnectedWifi(Context context) { |
| NetworkInfo info = Connectivity.getNetworkInfo(context); |
| return (info != null && info.isAvailable() && info.isConnected() && |
| info.getType() == ConnectivityManager.TYPE_WIFI); |
| } |
|
|
| /** |
| * Check if there is any connectivity to a mobile network. |
| * |
| * @param context the Context. |
| * @return true if we are connected to a mobile network, false otherwise. |
| */ |
| public static boolean isConnectedMobile(Context context) { |
| NetworkInfo info = Connectivity.getNetworkInfo(context); |
| return (info != null && info.isAvailable() && info.isConnected() && |
| info.getType() == ConnectivityManager.TYPE_MOBILE); |
| } |
|
|
| /** |
| * Check if there is fast connectivity. |
| * |
| * @param context the Context. |
| * @return true if we have "fast" connectivity, false otherwise. |
| */ |
| public static boolean isConnectedFast(Context context) { |
| NetworkInfo info = Connectivity.getNetworkInfo(context); |
| return (info != null && info.isAvailable() && info.isConnected() && |
| Connectivity.isConnectionFast(info.getType(), info.getSubtype())); |
| } |
|
|
| /** |
| * Check if the connection is fast. |
| * |
| * @param type the network type. |
| * @param subType the network subtype. |
| * @return true if the provided type/subtype combination is classified as fast. |
| */ |
| public static boolean isConnectionFast(int type, int subType) { |
| if (type == ConnectivityManager.TYPE_WIFI) { |
| return true; |
| } else if (type == ConnectivityManager.TYPE_MOBILE) { |
| switch (subType) { |
| case TelephonyManager.NETWORK_TYPE_1xRTT: |
| return false; // ~ 50-100 kbps |
| case TelephonyManager.NETWORK_TYPE_CDMA: |
| return false; // ~ 14-64 kbps |
| case TelephonyManager.NETWORK_TYPE_EDGE: |
| return false; // ~ 50-100 kbps |
| case TelephonyManager.NETWORK_TYPE_EVDO_0: |
| return true; // ~ 400-1000 kbps |
| case TelephonyManager.NETWORK_TYPE_EVDO_A: |
| return true; // ~ 600-1400 kbps |
| case TelephonyManager.NETWORK_TYPE_GPRS: |
| return false; // ~ 100 kbps |
| case TelephonyManager.NETWORK_TYPE_HSDPA: |
| return true; // ~ 2-14 Mbps |
| case TelephonyManager.NETWORK_TYPE_HSPA: |
| return true; // ~ 700-1700 kbps |
| case TelephonyManager.NETWORK_TYPE_HSUPA: |
| return true; // ~ 1-23 Mbps |
| case TelephonyManager.NETWORK_TYPE_UMTS: |
| return true; // ~ 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 true; // ~ 1-2 Mbps |
| case TelephonyManager.NETWORK_TYPE_EVDO_B: // API level 9 |
| return true; // ~ 5 Mbps |
| case TelephonyManager.NETWORK_TYPE_HSPAP: // API level 13 |
| return true; // ~ 10-20 Mbps |
| case TelephonyManager.NETWORK_TYPE_IDEN: // API level 8 |
| return false; // ~25 kbps |
| case TelephonyManager.NETWORK_TYPE_LTE: // API level 11 |
| return true; // ~ 10+ Mbps |
| // Unknown |
| case TelephonyManager.NETWORK_TYPE_UNKNOWN: |
| default: |
| return false; |
| } |
| } else { |
| return false; |
| } |
| } |
| } |