improve network status check: re-create clean feature branch #934

delete feature/improve_network_status_check and recreate from current
upstream/master as feature/improve_network_status_check__recreated
This commit is contained in:
chris1b 2019-04-27 13:48:48 +02:00 committed by Isaac Hutt
parent da6ed6d375
commit ad693a9e5b
2 changed files with 78 additions and 44 deletions

View File

@ -28,18 +28,20 @@ import org.kiwix.kiwixmobile.R;
import static org.kiwix.kiwixmobile.utils.Constants.TAG_KIWIX; import static org.kiwix.kiwixmobile.utils.Constants.TAG_KIWIX;
public class NetworkUtils { public class NetworkUtils {
/**
* check availability of any network
* @return true if a network is ready to be used
*/
public static boolean isNetworkAvailable(Context context) { public static boolean isNetworkAvailable(Context context) {
ConnectivityManager connectivity = (ConnectivityManager) context ConnectivityManager connectivity = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE); .getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity == null) { if (connectivity == null) {
return false; return false;
} else { } else {
NetworkInfo[] info = connectivity.getAllNetworkInfo(); NetworkInfo[] networkInfos = connectivity.getAllNetworkInfo();
if (info != null) { if (networkInfos != null) {
for (NetworkInfo anInfo : info) { for (NetworkInfo networkInfo : networkInfos) {
if (anInfo.getState() == NetworkInfo.State.CONNECTED if (isNetworkConnectionOK(networkInfo)) {
|| anInfo.getState() == NetworkInfo.State.CONNECTING) {
return true; return true;
} }
} }
@ -48,6 +50,17 @@ public class NetworkUtils {
return false; return false;
} }
static boolean isNetworkConnectionOK(NetworkInfo networkInfo) {
return networkInfo.getState() == NetworkInfo.State.CONNECTED;
}
/**
* check if network of type WIFI is connected
* @param context
* @return true if WIFI is connected
*/
//TODO method isWiFi should be renamed to isWifiConnected to express the state which is checked (postponed to refactoring deprecated android.net.* usage)
public static boolean isWiFi(Context context) { public static boolean isWiFi(Context context) {
ConnectivityManager connectivity = (ConnectivityManager) context ConnectivityManager connectivity = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE); .getSystemService(Context.CONNECTIVITY_SERVICE);
@ -56,14 +69,14 @@ public class NetworkUtils {
} }
if (Build.VERSION.SDK_INT >= 23) { if (Build.VERSION.SDK_INT >= 23) {
NetworkInfo network = connectivity.getActiveNetworkInfo(); NetworkInfo networkInfo = connectivity.getActiveNetworkInfo();
if (network == null) { if (networkInfo == null) {
return false; return false;
} }
return network.getType() == ConnectivityManager.TYPE_WIFI; return networkInfo.getType() == ConnectivityManager.TYPE_WIFI && networkInfo.isConnected();
} else { } else {
NetworkInfo wifi = connectivity.getNetworkInfo(ConnectivityManager.TYPE_WIFI); NetworkInfo wifi = connectivity.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
return wifi.isConnected(); return wifi != null && wifi.isConnected();
} }
} }

View File

@ -34,7 +34,10 @@ import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner; import org.mockito.junit.MockitoJUnitRunner;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@ -47,36 +50,37 @@ public class NetworkUtilsTest {
@Mock private NetworkInfo networkInfo1; @Mock private NetworkInfo networkInfo1;
@Mock private NetworkInfo networkInfo2; @Mock private NetworkInfo networkInfo2;
//Sets the Build SDK version @Test
private static void SetSDKVersion(Field field, Object newValue) throws Exception {
field.setAccessible(true);
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(null, newValue);
}
public void testNetworkAvailability() { public void testNetworkAvailability() {
NetworkInfo[] info = { networkInfo1, networkInfo2 }; NetworkInfo[] networkInfos = { networkInfo1, networkInfo2 };
when(context.getSystemService(Context.CONNECTIVITY_SERVICE)).thenReturn(connectivity); when(context.getSystemService(Context.CONNECTIVITY_SERVICE)).thenReturn(connectivity);
when(connectivity.getAllNetworkInfo()).thenReturn(info); when(connectivity.getAllNetworkInfo()).thenReturn(networkInfos);
//one network is connected //one network is connected
when(networkInfo1.getState()).thenReturn(NetworkInfo.State.CONNECTED); when(networkInfo1.getState()).thenReturn(NetworkInfo.State.CONNECTED);
when(networkInfo2.getState()).thenReturn(NetworkInfo.State.DISCONNECTING); when(networkInfo2.getState()).thenReturn(NetworkInfo.State.DISCONNECTING);
assertEquals("", true, NetworkUtils.isNetworkAvailable(context)); assertEquals(true, NetworkUtils.isNetworkAvailable(context));
//one network is connecting
when(networkInfo1.getState()).thenReturn(NetworkInfo.State.DISCONNECTING); when(networkInfo1.getState()).thenReturn(NetworkInfo.State.DISCONNECTING);
when(networkInfo2.getState()).thenReturn(NetworkInfo.State.CONNECTING); when(networkInfo2.getState()).thenReturn(NetworkInfo.State.CONNECTING);
assertEquals("", true, NetworkUtils.isNetworkAvailable(context)); assertEquals(false, NetworkUtils.isNetworkAvailable(context));
//no network is available //no network is available
when(networkInfo1.getState()).thenReturn(NetworkInfo.State.DISCONNECTED); when(networkInfo1.getState()).thenReturn(NetworkInfo.State.DISCONNECTED);
when(networkInfo2.getState()).thenReturn(NetworkInfo.State.DISCONNECTED); when(networkInfo2.getState()).thenReturn(NetworkInfo.State.DISCONNECTED);
assertEquals("", false, NetworkUtils.isNetworkAvailable(context)); assertEquals(false, NetworkUtils.isNetworkAvailable(context));
} }
@Test
public void test_isNetworkConnectionOK() {
when(networkInfo2.getState()).thenReturn(NetworkInfo.State.CONNECTING);
assertFalse(NetworkUtils.isNetworkConnectionOK(networkInfo2));
when(networkInfo2.getState()).thenReturn(NetworkInfo.State.CONNECTED);
assertTrue(NetworkUtils.isNetworkConnectionOK(networkInfo2));
}
@Test
public void testWifiAvailability() { public void testWifiAvailability() {
when(context.getSystemService(Context.CONNECTIVITY_SERVICE)).thenReturn(connectivity); when(context.getSystemService(Context.CONNECTIVITY_SERVICE)).thenReturn(connectivity);
when(connectivity.getActiveNetworkInfo()).thenReturn(networkInfo); when(connectivity.getActiveNetworkInfo()).thenReturn(networkInfo);
@ -91,15 +95,23 @@ public class NetworkUtilsTest {
//on Mobile Data //on Mobile Data
when(networkInfo.getType()).thenReturn(ConnectivityManager.TYPE_MOBILE); when(networkInfo.getType()).thenReturn(ConnectivityManager.TYPE_MOBILE);
assertEquals(false, NetworkUtils.isWiFi(context)); assertEquals(false, NetworkUtils.isWiFi(context));
//verify that the correct methods are used according to build SDK version //verify that the correct methods are used according to the build SDK version
verify(connectivity).getActiveNetworkInfo(); verify(connectivity).getActiveNetworkInfo();
verify(networkInfo).getType(); verify(networkInfo).getType();
verify(connectivity, never()).getNetworkInfo(ConnectivityManager.TYPE_WIFI); verify(connectivity, never()).getNetworkInfo(ConnectivityManager.TYPE_WIFI);
//on WIFI //on WIFI connected
when(networkInfo.getType()).thenReturn(ConnectivityManager.TYPE_WIFI); when(networkInfo.getType()).thenReturn(ConnectivityManager.TYPE_WIFI);
when(networkInfo.isConnected()).thenReturn(Boolean.TRUE);
assertEquals(true, NetworkUtils.isWiFi(context)); assertEquals(true, NetworkUtils.isWiFi(context));
verify(connectivity).getActiveNetworkInfo(); verify(connectivity, times(2)).getActiveNetworkInfo();
verify(connectivity, never()).getNetworkInfo(ConnectivityManager.TYPE_WIFI);
//on WIFI disconnected
when(networkInfo.getType()).thenReturn(ConnectivityManager.TYPE_WIFI);
when(networkInfo.isConnected()).thenReturn(Boolean.FALSE);
assertEquals(false, NetworkUtils.isWiFi(context));
verify(connectivity, times(3)).getActiveNetworkInfo();
verify(connectivity, never()).getNetworkInfo(ConnectivityManager.TYPE_WIFI); verify(connectivity, never()).getNetworkInfo(ConnectivityManager.TYPE_WIFI);
//SDK < 23 //SDK < 23
@ -113,13 +125,13 @@ public class NetworkUtilsTest {
when(connectivity.getNetworkInfo(ConnectivityManager.TYPE_WIFI)).thenReturn(networkInfo); when(connectivity.getNetworkInfo(ConnectivityManager.TYPE_WIFI)).thenReturn(networkInfo);
when(networkInfo.isConnected()).thenReturn(true); when(networkInfo.isConnected()).thenReturn(true);
assertEquals(true, NetworkUtils.isWiFi(context)); assertEquals(true, NetworkUtils.isWiFi(context));
verify(connectivity).getNetworkInfo(ConnectivityManager.TYPE_WIFI); verify(connectivity, times(1)).getNetworkInfo(ConnectivityManager.TYPE_WIFI);
//WIFI disconnected //WIFI disconnected
when(connectivity.getNetworkInfo(ConnectivityManager.TYPE_WIFI)).thenReturn(networkInfo); when(connectivity.getNetworkInfo(ConnectivityManager.TYPE_WIFI)).thenReturn(networkInfo);
when(networkInfo.isConnected()).thenReturn(false); when(networkInfo.isConnected()).thenReturn(false);
assertEquals(false, NetworkUtils.isWiFi(context)); assertEquals(false, NetworkUtils.isWiFi(context));
verify(connectivity).getNetworkInfo(ConnectivityManager.TYPE_WIFI); verify(connectivity, times(2)).getNetworkInfo(ConnectivityManager.TYPE_WIFI);
} }
@Test @Test
@ -183,4 +195,13 @@ public class NetworkUtilsTest {
assertEquals("URL Parsing", "Simple", NetworkUtils.parseURL(context, assertEquals("URL Parsing", "Simple", NetworkUtils.parseURL(context,
"http://mirror3.kiwix.org/zim/wikipedia/wikipedia_af_all_simple_2016-05.zim")); "http://mirror3.kiwix.org/zim/wikipedia/wikipedia_af_all_simple_2016-05.zim"));
} }
//Sets the Build SDK version
private static void SetSDKVersion(Field field, Object newValue) throws Exception {
field.setAccessible(true);
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(null, newValue);
}
} }