Skip to content

Instantly share code, notes, and snippets.

@truongngoclinh
Last active September 8, 2016 08:57
Show Gist options
  • Save truongngoclinh/e940bd8afdb82dfd41ed8e953053a03a to your computer and use it in GitHub Desktop.
Save truongngoclinh/e940bd8afdb82dfd41ed8e953053a03a to your computer and use it in GitHub Desktop.
Fully check network condition in android
public class NetworkUtil {
private static Context sCtx;
public static void init(Context context) {
sCtx = context.getApplicationContext();
}
public static Result check() {
return new Result(getNetworkInfo(sCtx));
}
private static NetworkInfo getNetworkInfo(Context context) {
if (isDozing(context)) {
Log.d(TAG, "checkNetwork: isDozing");
return null;
}
ConnectivityManager cm = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE));
if (cm == null) {
BBAppLogger.e("checkNetwork: ConnectivityManager is null !!!");
return null;
}
NetworkInfo ni = cm.getActiveNetworkInfo();
if (ni == null) {
BBAppLogger.e("checkNetwork: networkInfo is null");
return null;
}
Log.d(TAG, "checkNetwork: state=%d type=%s connected=%s", ni.getState(), ni.getTypeName(), ni.isConnected());
return ni;
}
/**
* Returns true if the device is in Doze/Idle mode. Should be called before checking the network connection because
* the ConnectionManager may falsely report the device is connected in Doze mode.
*/
@TargetApi(Build.VERSION_CODES.M)
public static boolean isDozing(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
return powerManager.isDeviceIdleMode();
} else {
return false;
}
}
public final static class Result {
private final NetworkInfo info;
public Result(NetworkInfo info) {
this.info = info;
}
public boolean isConnected() {
return info != null && info.isConnected();
}
public boolean isWifi() {
return isConnected() && info.getType() == ConnectivityManager.TYPE_WIFI;
}
public boolean isMobile() {
return isConnected() && info.getType() == ConnectivityManager.TYPE_MOBILE;
}
public boolean isFast() {
return isConnected() && isConnectionFast(info.getType(), info.getSubtype());
}
private 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;
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment