Bug 1233785 - DownloadContentService: Skip DownloadAction if no network is available. r?rnewman
--- a/mobile/android/base/java/org/mozilla/gecko/dlc/DownloadAction.java
+++ b/mobile/android/base/java/org/mozilla/gecko/dlc/DownloadAction.java
@@ -2,16 +2,17 @@
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.gecko.dlc;
import android.content.Context;
import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
import android.support.v4.net.ConnectivityManagerCompat;
import android.util.Log;
import org.mozilla.gecko.AppConstants;
import org.mozilla.gecko.dlc.catalog.DownloadContent;
import org.mozilla.gecko.dlc.catalog.DownloadContentCatalog;
import org.mozilla.gecko.util.HardwareUtils;
import org.mozilla.gecko.util.IOUtils;
@@ -52,16 +53,22 @@ public class DownloadAction extends Base
public DownloadAction(Callback callback) {
this.callback = callback;
}
public void perform(Context context, DownloadContentCatalog catalog) {
Log.d(LOGTAG, "Downloading content..");
+ if (!isConnectedToNetwork(context)) {
+ Log.d(LOGTAG, "No connected network available. Postponing download.");
+ // TODO: Reschedule download (bug 1209498)
+ return;
+ }
+
if (isActiveNetworkMetered(context)) {
Log.d(LOGTAG, "Network is metered. Postponing download.");
// TODO: Reschedule download (bug 1209498)
return;
}
final HttpClient client = buildHttpClient();
@@ -223,16 +230,23 @@ public class DownloadAction extends Base
IOUtils.safeStreamClose(outputStream);
if (temporaryFile != null && temporaryFile.exists()) {
temporaryFile.delete();
}
}
}
+ protected boolean isConnectedToNetwork(Context context) {
+ ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
+ NetworkInfo networkInfo = manager.getActiveNetworkInfo();
+
+ return networkInfo != null && networkInfo.isConnectedOrConnecting();
+ }
+
protected boolean isActiveNetworkMetered(Context context) {
return ConnectivityManagerCompat.isActiveNetworkMetered(
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE));
}
protected HttpClient buildHttpClient() {
// TODO: Implement proxy support (Bug 1209496)
return HttpClientBuilder.create()
--- a/mobile/android/tests/background/junit4/src/org/mozilla/gecko/dlc/TestDownloadAction.java
+++ b/mobile/android/tests/background/junit4/src/org/mozilla/gecko/dlc/TestDownloadAction.java
@@ -7,16 +7,19 @@ package org.mozilla.gecko.dlc;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mozilla.gecko.background.testhelpers.TestRunner;
import org.mozilla.gecko.dlc.catalog.DownloadContent;
import org.mozilla.gecko.dlc.catalog.DownloadContentCatalog;
+
+import android.content.Context;
+
import org.robolectric.RuntimeEnvironment;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.Collections;
@@ -61,16 +64,34 @@ public class TestDownloadAction {
action.perform(RuntimeEnvironment.application, null);
verify(action, never()).buildHttpClient();
verify(action, never()).download(any(HttpClient.class), anyString(), any(File.class));
}
/**
+ * Scenario: No (connected) network is available.
+ *
+ * Verify that:
+ * * No download is performed
+ */
+ @Test
+ public void testNothingIsDoneIfNoNetworkIsAvailable() throws Exception {
+ DownloadAction action = spy(new DownloadAction(null));
+ doReturn(false).when(action).isConnectedToNetwork(RuntimeEnvironment.application);
+
+ action.perform(RuntimeEnvironment.application, null);
+
+ verify(action, never()).isActiveNetworkMetered(any(Context.class));
+ verify(action, never()).buildHttpClient();
+ verify(action, never()).download(any(HttpClient.class), anyString(), any(File.class));
+ }
+
+ /**
* Scenario: Content is scheduled for download but already exists locally (with correct checksum).
*
* Verify that:
* * No download is performed for existing file
* * Content is marked as downloaded in the catalog
*/
@Test
public void testExistingAndVerifiedFilesAreNotDownloadedAgain() throws Exception {