package ar.rulosoft.mimanganu.utils; import android.annotation.TargetApi; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.net.ConnectivityManager; import android.net.Network; import android.net.NetworkInfo; import android.os.Build; import android.preference.PreferenceManager; import android.support.annotation.NonNull; import android.util.Log; import ar.rulosoft.mimanganu.Exceptions.NoConnectionException; import ar.rulosoft.mimanganu.Exceptions.NoWifiException; import ar.rulosoft.mimanganu.MainActivity; import ar.rulosoft.mimanganu.services.AlarmReceiver; /* Base from Yakiv Mospan from http://stackoverflow.com/questions/32242384/getallnetworkinfo-is-deprecated-how-to-use-getallnetworks-to-check-network */ public class NetworkUtilsAndReceiver extends BroadcastReceiver { public enum ConnectionStatus {UNCHECKED, NO_INET_CONNECTED, NO_WIFI_CONNECTED, CONNECTED} public static ConnectionStatus connectionStatus = ConnectionStatus.UNCHECKED; //-1 not checked or changed, 0 no connection wifi, 1 no connection general, 2 connect public static boolean ONLY_WIFI; public static boolean isConnectedNonDestructive(@NonNull Context context) { SharedPreferences pm = PreferenceManager.getDefaultSharedPreferences(context); if (!pm.getBoolean("disable_internet_detection", false)) { boolean result; switch (connectionStatus) { case UNCHECKED: if (ONLY_WIFI) { result = isWifiConnected(context); if (result) { connectionStatus = ConnectionStatus.CONNECTED; } else { connectionStatus = ConnectionStatus.NO_WIFI_CONNECTED; } return result; } else { result = _isConnected(context); if (result) { connectionStatus = ConnectionStatus.CONNECTED; } else { connectionStatus = ConnectionStatus.NO_INET_CONNECTED; } return result; } case NO_WIFI_CONNECTED: return false; case NO_INET_CONNECTED: return false; case CONNECTED: return true; default: return true; } } else { return true; } } public static boolean isConnected(@NonNull Context context) throws Exception { SharedPreferences pm = PreferenceManager.getDefaultSharedPreferences(context); if (!pm.getBoolean("disable_internet_detection", false)) { boolean result; switch (connectionStatus) { case UNCHECKED: if (ONLY_WIFI) { result = isWifiConnected(context); if (result) { connectionStatus = ConnectionStatus.CONNECTED; } else { connectionStatus = ConnectionStatus.NO_WIFI_CONNECTED; throw new NoWifiException(context); } return result; } else { result = _isConnected(context); if (result) { connectionStatus = ConnectionStatus.CONNECTED; } else { connectionStatus = ConnectionStatus.NO_INET_CONNECTED; throw new NoConnectionException(context); } return result; } case NO_WIFI_CONNECTED: throw new NoWifiException(context); case NO_INET_CONNECTED: throw new NoConnectionException(context); case CONNECTED: return true; default: return true; } } else { return true; } } public static ConnectionStatus getConnectionStatus(@NonNull Context context) { return getConnectionStatus(context, ONLY_WIFI); } public static ConnectionStatus getConnectionStatus(@NonNull Context context, boolean only_wifi) { boolean result; if (connectionStatus == ConnectionStatus.UNCHECKED) { if (only_wifi) { result = isWifiConnected(context); if (result) { connectionStatus = ConnectionStatus.CONNECTED; } else { connectionStatus = ConnectionStatus.NO_WIFI_CONNECTED; } } else { result = _isConnected(context); if (result) { connectionStatus = ConnectionStatus.CONNECTED; } else { connectionStatus = ConnectionStatus.NO_INET_CONNECTED; } } } return connectionStatus; } public static void reset() { connectionStatus = ConnectionStatus.UNCHECKED; } public static boolean _isConnected(@NonNull Context context) { ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); return (networkInfo != null && networkInfo.isConnected()); } public static boolean isWifiConnected(@NonNull Context context) { return isConnected(context, ConnectivityManager.TYPE_WIFI); } public static boolean isMobileConnected(@NonNull Context context) { return isConnected(context, ConnectivityManager.TYPE_MOBILE); } private static boolean isConnected(@NonNull Context context, int type) { ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { NetworkInfo networkInfo = connMgr.getNetworkInfo(type); return networkInfo != null && networkInfo.isConnected(); } else { return isConnected(connMgr, type); } } @TargetApi(Build.VERSION_CODES.LOLLIPOP) private static boolean isConnected(@NonNull ConnectivityManager connMgr, int type) { try { Network[] networks = connMgr.getAllNetworks(); NetworkInfo networkInfo; for (Network mNetwork : networks) { networkInfo = connMgr.getNetworkInfo(mNetwork); if (networkInfo != null && networkInfo.getType() == type && networkInfo.isConnected()) { return true; } } } catch (Exception e) { //ignore return false } return false; } @Override public void onReceive(Context context, Intent intent) { SharedPreferences pm = PreferenceManager.getDefaultSharedPreferences(context); connectionStatus = ConnectionStatus.UNCHECKED; if (!pm.getBoolean("disable_internet_detection", false)) { if (isWifiConnected(context) || isMobileConnected(context)) { Log.d("NUAR", "onRec Connected"); MainActivity.isConnected = true; } else { Log.d("NUAR", "onRec Disconnected"); MainActivity.isConnected = false; } } else { MainActivity.isConnected = true; } try { if (isConnected(context)) { //SharedPreferences pm = PreferenceManager.getDefaultSharedPreferences(context); long last_check = pm.getLong(AlarmReceiver.LAST_CHECK, 0); long current_time = System.currentTimeMillis(); long interval = Long.parseLong(pm.getString("update_interval", "0")); if (interval > 0) { if (interval < current_time - last_check) { new AlarmReceiver().onReceive(context, intent); } } } } catch (Exception e) { e.printStackTrace(); } } }