From 9412ff8e84d057afc4f44af62f618eefb744b7c1 Mon Sep 17 00:00:00 2001 From: Sam Judd Date: Wed, 18 Jun 2014 19:20:33 -0700 Subject: Add connectivity listening to request manager. --- .../src/main/java/com/bumptech/glide/Glide.java | 5 +- .../glide/manager/ConnectivityMonitor.java | 12 ++ .../glide/manager/ConnectivityMonitorFactory.java | 16 +++ .../glide/manager/DefaultConnectivityMonitor.java | 59 +++++++++ .../glide/manager/LifecycleRequestManager.java | 29 ++++- .../glide/manager/NullConnectivityMonitor.java | 14 ++ .../bumptech/glide/manager/NullRequestManager.java | 2 +- .../glide/manager/RequestManagerFragment.java | 2 +- .../glide/manager/RequestManagerRetriever.java | 30 +++-- .../manager/SupportRequestManagerFragment.java | 2 +- .../manager/ConnectivityMonitorFactoryTest.java | 33 +++++ .../manager/DefaultConnectivityMonitorTest.java | 141 +++++++++++++++++++++ .../glide/manager/LifecycleRequestManagerTest.java | 60 ++++++++- .../glide/manager/RequestManagerRetrieverTest.java | 27 ++++ .../bumptech/glide/tests/TestFragmentActivity.java | 6 - samples/flickr/AndroidManifest.xml | 1 + 16 files changed, 417 insertions(+), 22 deletions(-) create mode 100644 library/src/main/java/com/bumptech/glide/manager/ConnectivityMonitor.java create mode 100644 library/src/main/java/com/bumptech/glide/manager/ConnectivityMonitorFactory.java create mode 100644 library/src/main/java/com/bumptech/glide/manager/DefaultConnectivityMonitor.java create mode 100644 library/src/main/java/com/bumptech/glide/manager/NullConnectivityMonitor.java create mode 100644 library/src/test/java/com/bumptech/glide/manager/ConnectivityMonitorFactoryTest.java create mode 100644 library/src/test/java/com/bumptech/glide/manager/DefaultConnectivityMonitorTest.java delete mode 100644 library/src/test/java/com/bumptech/glide/tests/TestFragmentActivity.java 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 requests = Collections.newSetFromMap(new WeakHashMap()); + 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"> + -- cgit v1.2.3