aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Judd <judds@google.com>2014-06-18 19:20:33 -0700
committerSam Judd <judds@google.com>2014-06-19 09:43:47 -0700
commit9412ff8e84d057afc4f44af62f618eefb744b7c1 (patch)
treed7e42236cec37dfdf50bf84c74a765a35b089d4c
parentacbeb5b5e7b63f70ccdfa212af0bed3ca62cee11 (diff)
downloadglide-9412ff8e84d057afc4f44af62f618eefb744b7c1.tar.gz
Add connectivity listening to request manager.
-rw-r--r--library/src/main/java/com/bumptech/glide/Glide.java5
-rw-r--r--library/src/main/java/com/bumptech/glide/manager/ConnectivityMonitor.java12
-rw-r--r--library/src/main/java/com/bumptech/glide/manager/ConnectivityMonitorFactory.java16
-rw-r--r--library/src/main/java/com/bumptech/glide/manager/DefaultConnectivityMonitor.java59
-rw-r--r--library/src/main/java/com/bumptech/glide/manager/LifecycleRequestManager.java29
-rw-r--r--library/src/main/java/com/bumptech/glide/manager/NullConnectivityMonitor.java14
-rw-r--r--library/src/main/java/com/bumptech/glide/manager/NullRequestManager.java2
-rw-r--r--library/src/main/java/com/bumptech/glide/manager/RequestManagerFragment.java2
-rw-r--r--library/src/main/java/com/bumptech/glide/manager/RequestManagerRetriever.java30
-rw-r--r--library/src/main/java/com/bumptech/glide/manager/SupportRequestManagerFragment.java2
-rw-r--r--library/src/test/java/com/bumptech/glide/manager/ConnectivityMonitorFactoryTest.java33
-rw-r--r--library/src/test/java/com/bumptech/glide/manager/DefaultConnectivityMonitorTest.java141
-rw-r--r--library/src/test/java/com/bumptech/glide/manager/LifecycleRequestManagerTest.java60
-rw-r--r--library/src/test/java/com/bumptech/glide/manager/RequestManagerRetrieverTest.java27
-rw-r--r--library/src/test/java/com/bumptech/glide/tests/TestFragmentActivity.java6
-rw-r--r--samples/flickr/AndroidManifest.xml1
16 files changed, 417 insertions, 22 deletions
diff --git a/library/src/main/java/com/bumptech/glide/Glide.java b/library/src/main/java/com/bumptech/glide/Glide.java
index 9ebabda7..e1c733de 100644
--- a/library/src/main/java/com/bumptech/glide/Glide.java
+++ b/library/src/main/java/com/bumptech/glide/Glide.java
@@ -47,7 +47,6 @@ import com.bumptech.glide.load.resource.transcode.GifBitmapWrapperDrawableTransc
import com.bumptech.glide.load.resource.transcode.GifDataDrawableTranscoder;
import com.bumptech.glide.load.resource.transcode.ResourceTranscoder;
import com.bumptech.glide.load.resource.transcode.TranscoderFactory;
-import com.bumptech.glide.manager.NullRequestManager;
import com.bumptech.glide.manager.RequestManager;
import com.bumptech.glide.manager.RequestManagerRetriever;
import com.bumptech.glide.provider.DataLoadProviderFactory;
@@ -86,7 +85,6 @@ public class Glide {
private final ImageViewTargetFactory imageViewTargetFactory = new ImageViewTargetFactory();
private final TranscoderFactory transcoderFactory = new TranscoderFactory();
private final DataLoadProviderFactory dataLoadProviderFactory;
- private final NullRequestManager requestManager = new NullRequestManager();
/**
* Try to get the external cache directory if available and default to the internal. Use a default name for the
@@ -446,7 +444,8 @@ public class Glide {
* @return A model request to pass in the object representing the image to be loaded.
*/
public static ModelRequest with(Context context) {
- return new ModelRequest(context, Glide.get(context), Glide.get(context).requestManager);
+ RequestManager requestManager = RequestManagerRetriever.get(context);
+ return new ModelRequest(context, Glide.get(context), requestManager);
}
public static ModelRequest with(Activity activity) {
diff --git a/library/src/main/java/com/bumptech/glide/manager/ConnectivityMonitor.java b/library/src/main/java/com/bumptech/glide/manager/ConnectivityMonitor.java
new file mode 100644
index 00000000..24096c70
--- /dev/null
+++ b/library/src/main/java/com/bumptech/glide/manager/ConnectivityMonitor.java
@@ -0,0 +1,12 @@
+package com.bumptech.glide.manager;
+
+interface ConnectivityMonitor {
+
+ public interface ConnectivityListener {
+ public void onConnectivityChanged(boolean isConnected);
+ }
+
+ public void register();
+
+ public void unregister();
+}
diff --git a/library/src/main/java/com/bumptech/glide/manager/ConnectivityMonitorFactory.java b/library/src/main/java/com/bumptech/glide/manager/ConnectivityMonitorFactory.java
new file mode 100644
index 00000000..9f7a79ea
--- /dev/null
+++ b/library/src/main/java/com/bumptech/glide/manager/ConnectivityMonitorFactory.java
@@ -0,0 +1,16 @@
+package com.bumptech.glide.manager;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+
+class ConnectivityMonitorFactory {
+ public ConnectivityMonitor build(Context context, ConnectivityMonitor.ConnectivityListener listener) {
+ int res = context.checkCallingOrSelfPermission("android.permission.ACCESS_NETWORK_STATE");
+ boolean hasPermission = res == PackageManager.PERMISSION_GRANTED;
+ if (hasPermission) {
+ return new DefaultConnectivityMonitor(context, listener);
+ } else {
+ return new NullConnectivityMonitor();
+ }
+ }
+}
diff --git a/library/src/main/java/com/bumptech/glide/manager/DefaultConnectivityMonitor.java b/library/src/main/java/com/bumptech/glide/manager/DefaultConnectivityMonitor.java
new file mode 100644
index 00000000..5ff498b6
--- /dev/null
+++ b/library/src/main/java/com/bumptech/glide/manager/DefaultConnectivityMonitor.java
@@ -0,0 +1,59 @@
+package com.bumptech.glide.manager;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+
+class DefaultConnectivityMonitor implements ConnectivityMonitor {
+ private final Context context;
+ private final ConnectivityListener listener;
+
+ private boolean isConnected;
+ private boolean isRegistered;
+
+ private final BroadcastReceiver connectivityReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ boolean wasConnected = isConnected;
+ isConnected = isConnected(context);
+ if (wasConnected != isConnected) {
+ listener.onConnectivityChanged(isConnected);
+ }
+ }
+ };
+
+ public DefaultConnectivityMonitor(Context context, ConnectivityListener listener) {
+ this.context = context.getApplicationContext();
+ this.listener = listener;
+ }
+
+ @Override
+ public void register() {
+ if (isRegistered) {
+ return;
+ }
+
+ isConnected = isConnected(context);
+ context.registerReceiver(connectivityReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
+ isRegistered = true;
+ }
+
+ @Override
+ public void unregister() {
+ if (!isRegistered) {
+ return;
+ }
+
+ context.unregisterReceiver(connectivityReceiver);
+ isRegistered = false;
+ }
+
+ private boolean isConnected(Context context) {
+ ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
+ NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
+ return networkInfo != null && networkInfo.isConnected();
+ }
+}
diff --git a/library/src/main/java/com/bumptech/glide/manager/LifecycleRequestManager.java b/library/src/main/java/com/bumptech/glide/manager/LifecycleRequestManager.java
index 4871d215..fd5efb7d 100644
--- a/library/src/main/java/com/bumptech/glide/manager/LifecycleRequestManager.java
+++ b/library/src/main/java/com/bumptech/glide/manager/LifecycleRequestManager.java
@@ -1,12 +1,13 @@
package com.bumptech.glide.manager;
+import android.content.Context;
import com.bumptech.glide.request.Request;
import java.util.Collections;
import java.util.Set;
import java.util.WeakHashMap;
-public class LifecycleRequestManager implements RequestManager {
+class LifecycleRequestManager implements RequestManager, ConnectivityMonitor.ConnectivityListener {
// Most requests will be for views and will therefore be held strongly (and safely) by the view via the tag.
// However, a user can always pass in a different type of target which may end up not being strongly referenced even
// though the user still would like the request to finish. Weak references are therefore only really functional in
@@ -14,6 +15,16 @@ public class LifecycleRequestManager implements RequestManager {
// can always make repeated requests into targets other than views, or use an activity manager in a fragment pager
// where holding strong references would steadily leak bitmaps and/or views.
private final Set<Request> requests = Collections.newSetFromMap(new WeakHashMap<Request, Boolean>());
+ private final ConnectivityMonitor connectivityMonitor;
+
+ LifecycleRequestManager(Context context) {
+ this(context, new ConnectivityMonitorFactory());
+ }
+
+ LifecycleRequestManager(Context context, ConnectivityMonitorFactory factory) {
+ this.connectivityMonitor = factory.build(context, this);
+ connectivityMonitor.register();
+ }
@Override
public void addRequest(Request request) {
@@ -26,6 +37,9 @@ public class LifecycleRequestManager implements RequestManager {
}
public void onStart() {
+ // onStart might not be called because this object may be created after the fragment/activity's onStart method.
+ connectivityMonitor.register();
+
for (Request request : requests) {
if (!request.isComplete() && !request.isRunning()) {
request.run();
@@ -35,6 +49,7 @@ public class LifecycleRequestManager implements RequestManager {
}
public void onStop() {
+ connectivityMonitor.unregister();
for (Request request : requests) {
if (!request.isComplete() && !request.isFailed()) {
request.clear();
@@ -47,4 +62,16 @@ public class LifecycleRequestManager implements RequestManager {
request.clear();
}
}
+
+ @Override
+ public void onConnectivityChanged(boolean isConnected) {
+ for (Request request : requests) {
+ if (request.isFailed()) {
+ request.run();
+ } else if (!request.isComplete()) {
+ request.clear();
+ request.run();
+ }
+ }
+ }
}
diff --git a/library/src/main/java/com/bumptech/glide/manager/NullConnectivityMonitor.java b/library/src/main/java/com/bumptech/glide/manager/NullConnectivityMonitor.java
new file mode 100644
index 00000000..ca732040
--- /dev/null
+++ b/library/src/main/java/com/bumptech/glide/manager/NullConnectivityMonitor.java
@@ -0,0 +1,14 @@
+package com.bumptech.glide.manager;
+
+class NullConnectivityMonitor implements ConnectivityMonitor {
+
+ @Override
+ public void register() {
+
+ }
+
+ @Override
+ public void unregister() {
+
+ }
+}
diff --git a/library/src/main/java/com/bumptech/glide/manager/NullRequestManager.java b/library/src/main/java/com/bumptech/glide/manager/NullRequestManager.java
index c803a5ad..20d8af44 100644
--- a/library/src/main/java/com/bumptech/glide/manager/NullRequestManager.java
+++ b/library/src/main/java/com/bumptech/glide/manager/NullRequestManager.java
@@ -2,7 +2,7 @@ package com.bumptech.glide.manager;
import com.bumptech.glide.request.Request;
-public class NullRequestManager implements RequestManager {
+class NullRequestManager implements RequestManager {
@Override
public void addRequest(Request request) {
}
diff --git a/library/src/main/java/com/bumptech/glide/manager/RequestManagerFragment.java b/library/src/main/java/com/bumptech/glide/manager/RequestManagerFragment.java
index 9c102390..a608e704 100644
--- a/library/src/main/java/com/bumptech/glide/manager/RequestManagerFragment.java
+++ b/library/src/main/java/com/bumptech/glide/manager/RequestManagerFragment.java
@@ -2,7 +2,7 @@ package com.bumptech.glide.manager;
import android.app.Fragment;
-public class RequestManagerFragment extends Fragment {
+class RequestManagerFragment extends Fragment {
private LifecycleRequestManager requestManager;
public void setRequestManager(LifecycleRequestManager requestManager) {
diff --git a/library/src/main/java/com/bumptech/glide/manager/RequestManagerRetriever.java b/library/src/main/java/com/bumptech/glide/manager/RequestManagerRetriever.java
index d7fca4c9..eeeec106 100644
--- a/library/src/main/java/com/bumptech/glide/manager/RequestManagerRetriever.java
+++ b/library/src/main/java/com/bumptech/glide/manager/RequestManagerRetriever.java
@@ -1,19 +1,33 @@
package com.bumptech.glide.manager;
import android.app.Activity;
+import android.content.Context;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
public class RequestManagerRetriever {
static final String TAG = "com.bumptech.glide.manager";
+ private static final RequestManager NULL_MANAGER = new NullRequestManager();
+
+ public static RequestManager get(Context context) {
+ if (context == null) {
+ throw new IllegalArgumentException("You cannot start a load on a null Context");
+ } else if (context instanceof FragmentActivity) {
+ return get((FragmentActivity) context);
+ } else if (context instanceof Activity) {
+ return get((Activity) context);
+ } else {
+ return NULL_MANAGER;
+ }
+ }
public static RequestManager get(FragmentActivity activity) {
if (activity.isDestroyed()) {
throw new IllegalArgumentException("You cannot start a load for a destroyed activity");
}
FragmentManager fm = activity.getSupportFragmentManager();
- return supportFragmentGet(fm);
+ return supportFragmentGet(activity, fm);
}
public static RequestManager get(Fragment fragment) {
@@ -24,7 +38,7 @@ public class RequestManagerRetriever {
throw new IllegalArgumentException("You cannot start a load on a detached fragment");
}
FragmentManager fm = fragment.getChildFragmentManager();
- return supportFragmentGet(fm);
+ return supportFragmentGet(fragment.getActivity(), fm);
}
public static RequestManager get(Activity activity) {
@@ -32,7 +46,7 @@ public class RequestManagerRetriever {
throw new IllegalArgumentException("You cannot start a load for a destroyed activity");
}
android.app.FragmentManager fm = activity.getFragmentManager();
- return fragmentGet(fm);
+ return fragmentGet(activity, fm);
}
public static RequestManager get(android.app.Fragment fragment) {
@@ -43,10 +57,10 @@ public class RequestManagerRetriever {
throw new IllegalArgumentException("You cannot start a load on a detached fragment");
}
android.app.FragmentManager fm = fragment.getChildFragmentManager();
- return fragmentGet(fm);
+ return fragmentGet(fragment.getActivity(), fm);
}
- static RequestManager fragmentGet(android.app.FragmentManager fm) {
+ static RequestManager fragmentGet(Context context, android.app.FragmentManager fm) {
RequestManagerFragment current = (RequestManagerFragment) fm.findFragmentByTag(TAG);
if (current == null) {
current = new RequestManagerFragment();
@@ -59,14 +73,14 @@ public class RequestManagerRetriever {
}
LifecycleRequestManager requestManager = current.getRequestManager();
if (requestManager == null) {
- requestManager = new LifecycleRequestManager();
+ requestManager = new LifecycleRequestManager(context);
current.setRequestManager(requestManager);
}
return requestManager;
}
- static RequestManager supportFragmentGet(FragmentManager fm) {
+ static RequestManager supportFragmentGet(Context context, FragmentManager fm) {
SupportRequestManagerFragment current = (SupportRequestManagerFragment) fm.findFragmentByTag(TAG);
if (current == null) {
current = new SupportRequestManagerFragment();
@@ -79,7 +93,7 @@ public class RequestManagerRetriever {
}
LifecycleRequestManager requestManager = current.getRequestManager();
if (requestManager == null) {
- requestManager = new LifecycleRequestManager();
+ requestManager = new LifecycleRequestManager(context);
current.setRequestManager(requestManager);
}
return requestManager;
diff --git a/library/src/main/java/com/bumptech/glide/manager/SupportRequestManagerFragment.java b/library/src/main/java/com/bumptech/glide/manager/SupportRequestManagerFragment.java
index 925b2aad..e1d6d013 100644
--- a/library/src/main/java/com/bumptech/glide/manager/SupportRequestManagerFragment.java
+++ b/library/src/main/java/com/bumptech/glide/manager/SupportRequestManagerFragment.java
@@ -2,7 +2,7 @@ package com.bumptech.glide.manager;
import android.support.v4.app.Fragment;
-public class SupportRequestManagerFragment extends Fragment {
+class SupportRequestManagerFragment extends Fragment {
private LifecycleRequestManager requestManager;
public void setRequestManager(LifecycleRequestManager requestManager) {
diff --git a/library/src/test/java/com/bumptech/glide/manager/ConnectivityMonitorFactoryTest.java b/library/src/test/java/com/bumptech/glide/manager/ConnectivityMonitorFactoryTest.java
new file mode 100644
index 00000000..611421e7
--- /dev/null
+++ b/library/src/test/java/com/bumptech/glide/manager/ConnectivityMonitorFactoryTest.java
@@ -0,0 +1,33 @@
+package com.bumptech.glide.manager;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
+
+import static junit.framework.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+
+@RunWith(RobolectricTestRunner.class)
+public class ConnectivityMonitorFactoryTest {
+ private ConnectivityMonitorFactory factory;
+
+ @Before
+ public void setUp() {
+ factory = new ConnectivityMonitorFactory();
+ }
+
+ @Test
+ public void testReturnsDefaultConnectivityMonitorWhenHasPermission() {
+ Robolectric.getShadowApplication().grantPermissions("android.permission.ACCESS_NETWORK_STATE");
+ assertTrue(factory.build(Robolectric.application, mock(ConnectivityMonitor.ConnectivityListener.class))
+ instanceof DefaultConnectivityMonitor);
+ }
+
+ @Test
+ public void testReturnsNullConnectivityMonitorWhenDoesNotHavePermission() {
+ assertTrue(factory.build(Robolectric.application, mock(ConnectivityMonitor.ConnectivityListener.class))
+ instanceof NullConnectivityMonitor);
+ }
+} \ No newline at end of file
diff --git a/library/src/test/java/com/bumptech/glide/manager/DefaultConnectivityMonitorTest.java b/library/src/test/java/com/bumptech/glide/manager/DefaultConnectivityMonitorTest.java
new file mode 100644
index 00000000..5a0afe91
--- /dev/null
+++ b/library/src/test/java/com/bumptech/glide/manager/DefaultConnectivityMonitorTest.java
@@ -0,0 +1,141 @@
+package com.bumptech.glide.manager;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.shadows.ShadowConnectivityManager;
+import org.robolectric.shadows.ShadowNetworkInfo;
+
+import static junit.framework.Assert.assertEquals;
+import static org.mockito.Matchers.anyBoolean;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+
+@RunWith(RobolectricTestRunner.class)
+public class DefaultConnectivityMonitorTest {
+ private ConnectivityMonitor.ConnectivityListener listener;
+ private DefaultConnectivityMonitor monitor;
+
+ @Before
+ public void setUp() {
+ listener = mock(ConnectivityMonitor.ConnectivityListener.class);
+ monitor = new DefaultConnectivityMonitor(Robolectric.application, listener);
+ }
+
+ @Test
+ public void testRegistersReceiverOnRegister() {
+ monitor.register();
+
+ assertEquals(1, getConnectivityReceiverCount());
+ }
+
+ @Test
+ public void testDoesNotRegisterTwiceOnRegister() {
+ monitor.register();
+ monitor.register();
+
+ assertEquals(1, getConnectivityReceiverCount());
+ }
+
+ @Test
+ public void testUnregistersReceiverOnUnregister() {
+ monitor.register();
+ monitor.unregister();
+
+ assertEquals(0, getConnectivityReceiverCount());
+ }
+
+ @Test
+ public void testHandlesUnregisteringTwiceInARow() {
+ monitor.unregister();
+ monitor.unregister();
+
+ assertEquals(0, getConnectivityReceiverCount());
+ }
+
+ @Test
+ public void testDoesNotNotifyListenerIfConnectedAndBecomesConnected() {
+ ConnectivityHarness harness = new ConnectivityHarness();
+ harness.connect();
+
+ monitor.register();
+ harness.broadcast();
+
+ verify(listener, never()).onConnectivityChanged(anyBoolean());
+ }
+
+ @Test
+ public void testNotifiesListenerIfConnectedAndBecomesDisconnected() {
+ ConnectivityHarness harness = new ConnectivityHarness();
+ harness.connect();
+
+ monitor.register();
+ harness.disconnect();
+ harness.broadcast();
+
+ verify(listener).onConnectivityChanged(eq(false));
+ }
+
+ @Test
+ public void testNotifiesListenerIfDisconnectedAndBecomesConnected() {
+ ConnectivityHarness harness = new ConnectivityHarness();
+ harness.disconnect();
+
+ monitor.register();
+ harness.connect();
+ harness.broadcast();
+
+ verify(listener).onConnectivityChanged(eq(true));
+ }
+
+ @Test
+ public void testDoesNotNotifyListenerWhenNotRegistered() {
+ ConnectivityHarness harness = new ConnectivityHarness();
+ harness.disconnect();
+
+ monitor.register();
+ monitor.unregister();
+ harness.connect();
+ harness.broadcast();
+
+ verify(listener, never()).onConnectivityChanged(anyBoolean());
+ }
+
+ private int getConnectivityReceiverCount() {
+ Intent connectivity = new Intent(ConnectivityManager.CONNECTIVITY_ACTION);
+ return Robolectric.getShadowApplication().getReceiversForIntent(connectivity).size();
+ }
+
+ private static class ConnectivityHarness {
+ private final ShadowConnectivityManager shadowConnectivityManager;
+
+ public ConnectivityHarness() {
+ ConnectivityManager connectivityManager =
+ (ConnectivityManager) Robolectric.application.getSystemService(Context.CONNECTIVITY_SERVICE);
+ shadowConnectivityManager = Robolectric.shadowOf(connectivityManager);
+ }
+
+ public void disconnect() {
+ shadowConnectivityManager.setActiveNetworkInfo(null);
+ }
+
+ public void connect() {
+ NetworkInfo networkInfo = ShadowNetworkInfo.newInstance(NetworkInfo.DetailedState.CONNECTED, 0, 0, true,
+ true);
+ shadowConnectivityManager.setActiveNetworkInfo(networkInfo);
+ }
+
+ public void broadcast() {
+ Intent connected = new Intent(ConnectivityManager.CONNECTIVITY_ACTION);
+ Robolectric.shadowOf(Robolectric.application).sendBroadcast(connected);
+ }
+ }
+} \ No newline at end of file
diff --git a/library/src/test/java/com/bumptech/glide/manager/LifecycleRequestManagerTest.java b/library/src/test/java/com/bumptech/glide/manager/LifecycleRequestManagerTest.java
index cd82077e..62febe60 100644
--- a/library/src/test/java/com/bumptech/glide/manager/LifecycleRequestManagerTest.java
+++ b/library/src/test/java/com/bumptech/glide/manager/LifecycleRequestManagerTest.java
@@ -1,24 +1,37 @@
package com.bumptech.glide.manager;
+import android.content.Context;
import com.bumptech.glide.request.Request;
import org.junit.Before;
import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
+import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+@RunWith(RobolectricTestRunner.class)
public class LifecycleRequestManagerTest {
private LifecycleRequestManager manager;
+ private ConnectivityMonitor connectivityMonitor;
@Before
public void setUp() {
- manager = new LifecycleRequestManager();
+ connectivityMonitor = mock(ConnectivityMonitor.class);
+ ConnectivityMonitorFactory factory = mock(ConnectivityMonitorFactory.class);
+ when(factory.build(any(Context.class), any(ConnectivityMonitor.ConnectivityListener.class)))
+ .thenReturn(connectivityMonitor);
+ manager = new LifecycleRequestManager(Robolectric.application, factory);
}
@Test
public void testCancelsRequestsOnStop() {
+ manager.onStart();
Request request = mock(Request.class);
manager.addRequest(request);
manager.onStop();
@@ -28,6 +41,7 @@ public class LifecycleRequestManagerTest {
@Test
public void testCanAddAndRemoveRequest() {
+ manager.onStart();
Request request = mock(Request.class);
manager.addRequest(request);
manager.removeRequest(request);
@@ -39,6 +53,7 @@ public class LifecycleRequestManagerTest {
@Test
public void testCanAddMultipleRequests() {
+ manager.onStart();
Request first = mock(Request.class);
Request second = mock(Request.class);
manager.addRequest(first);
@@ -52,6 +67,7 @@ public class LifecycleRequestManagerTest {
@Test
public void testDoesNotClearCompleteRequestsOnStop() {
+ manager.onStart();
Request request = mock(Request.class);
when(request.isComplete()).thenReturn(true);
manager.addRequest(request);
@@ -63,6 +79,7 @@ public class LifecycleRequestManagerTest {
@Test
public void testDoesNotClearFailedRequestsOnStop() {
+ manager.onStart();
Request request = mock(Request.class);
when(request.isFailed()).thenReturn(true);
manager.addRequest(request);
@@ -131,6 +148,47 @@ public class LifecycleRequestManagerTest {
verify(first).clear();
verify(second).clear();
verify(third).clear();
+ }
+
+ @Test
+ public void testRegistersConnectivityReceiverWhenConstructed() {
+ verify(connectivityMonitor).register();
+ }
+ @Test
+ public void testRegistersConnectivityReceiverOnStart() {
+ manager.onStart();
+
+ verify(connectivityMonitor, times(2)).register();
+ }
+
+ @Test
+ public void testUnregistersConnectivityReceiverOnStop() {
+ manager.onStop();
+
+ verify(connectivityMonitor).unregister();
+ }
+
+ @Test
+ public void testRestartsFailedRequestOnConnected() {
+ Request request = mock(Request.class);
+ when(request.isFailed()).thenReturn(true);
+ manager.addRequest(request);
+
+ manager.onConnectivityChanged(true);
+
+ verify(request).run();
+ }
+
+ @Test
+ public void testCancelsAndRestartsNotYetFinishedRequestsWhenBecomesConnected() {
+ Request request = mock(Request.class);
+ when(request.isComplete()).thenReturn(false);
+ manager.addRequest(request);
+
+ manager.onConnectivityChanged(true);
+
+ verify(request).clear();
+ verify(request).run();
}
}
diff --git a/library/src/test/java/com/bumptech/glide/manager/RequestManagerRetrieverTest.java b/library/src/test/java/com/bumptech/glide/manager/RequestManagerRetrieverTest.java
index b58cb1dd..9e9baec0 100644
--- a/library/src/test/java/com/bumptech/glide/manager/RequestManagerRetrieverTest.java
+++ b/library/src/test/java/com/bumptech/glide/manager/RequestManagerRetrieverTest.java
@@ -1,6 +1,7 @@
package com.bumptech.glide.manager;
import android.app.Activity;
+import android.content.Context;
import android.os.Looper;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
@@ -154,6 +155,32 @@ public class RequestManagerRetrieverTest {
harness.doGet();
}
+ @Test(expected = IllegalArgumentException.class)
+ public void testThrowsIfGivenNullContext() {
+ RequestManagerRetriever.get((Context) null);
+ }
+
+ @Test
+ public void testChecksIfContextIsFragmentActivity() {
+ SupportRetrieverHarness harness = new SupportRetrieverHarness();
+ RequestManager requestManager = harness.doGet();
+
+ assertEquals(requestManager, RequestManagerRetriever.get((Context) harness.getController().get()));
+ }
+
+ @Test
+ public void testChecksIfContextIsActivity() {
+ DefaultRetrieverHarness harness = new DefaultRetrieverHarness();
+ RequestManager requestManager = harness.doGet();
+
+ assertEquals(requestManager, RequestManagerRetriever.get((Context) harness.getController().get()));
+ }
+
+ @Test
+ public void testReturnsNonNullManagerIfGivenApplicationContext() {
+ assertNotNull(RequestManagerRetriever.get(Robolectric.application));
+ }
+
private interface RetrieverHarness {
public ActivityController getController();
diff --git a/library/src/test/java/com/bumptech/glide/tests/TestFragmentActivity.java b/library/src/test/java/com/bumptech/glide/tests/TestFragmentActivity.java
deleted file mode 100644
index be311717..00000000
--- a/library/src/test/java/com/bumptech/glide/tests/TestFragmentActivity.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package com.bumptech.glide.tests;
-
-import android.support.v4.app.FragmentActivity;
-
-public class TestFragmentActivity extends FragmentActivity {
-}
diff --git a/samples/flickr/AndroidManifest.xml b/samples/flickr/AndroidManifest.xml
index 49fce328..826efc55 100644
--- a/samples/flickr/AndroidManifest.xml
+++ b/samples/flickr/AndroidManifest.xml
@@ -5,6 +5,7 @@
android:versionName="1.0">
<uses-permission android:name="android.permission.INTERNET" />
+ <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-sdk android:minSdkVersion="9" android:targetSdkVersion="18" />