diff options
author | Sam Judd <judds@google.com> | 2014-08-03 14:01:34 -0700 |
---|---|---|
committer | Sam Judd <judds@google.com> | 2014-08-03 14:46:26 -0700 |
commit | 82c18a181dc6f7867c76b1b8c469c6be88b85177 (patch) | |
tree | 12d2bba8a4f78755be5816a8828b1feec7c0f816 /library/src/main/java/com/bumptech/glide/manager | |
parent | ec059e312ca7560ef3856f79827994cb906ded7c (diff) | |
download | glide-82c18a181dc6f7867c76b1b8c469c6be88b85177.tar.gz |
Add lifecycle + listeners
Diffstat (limited to 'library/src/main/java/com/bumptech/glide/manager')
8 files changed, 153 insertions, 38 deletions
diff --git a/library/src/main/java/com/bumptech/glide/manager/ConnectivityMonitor.java b/library/src/main/java/com/bumptech/glide/manager/ConnectivityMonitor.java index a30c0cc0..3e219850 100644 --- a/library/src/main/java/com/bumptech/glide/manager/ConnectivityMonitor.java +++ b/library/src/main/java/com/bumptech/glide/manager/ConnectivityMonitor.java @@ -3,7 +3,7 @@ package com.bumptech.glide.manager; /** * An interface for monitoring network connectivity events. */ -public interface ConnectivityMonitor { +public interface ConnectivityMonitor extends LifecycleListener { /** * An interface for listening to network connectivity events picked up by the monitor. @@ -16,14 +16,4 @@ public interface ConnectivityMonitor { */ public void onConnectivityChanged(boolean isConnected); } - - /** - * Indicates the monitor should register itself to listen to connectivity events. - */ - public void register(); - - /** - * Indicates the monitor should unregister itself and stop listening to connectivity events. - */ - public void unregister(); } diff --git a/library/src/main/java/com/bumptech/glide/manager/DefaultConnectivityMonitor.java b/library/src/main/java/com/bumptech/glide/manager/DefaultConnectivityMonitor.java index 8d993f17..aa194c4c 100644 --- a/library/src/main/java/com/bumptech/glide/manager/DefaultConnectivityMonitor.java +++ b/library/src/main/java/com/bumptech/glide/manager/DefaultConnectivityMonitor.java @@ -30,8 +30,7 @@ class DefaultConnectivityMonitor implements ConnectivityMonitor { this.listener = listener; } - @Override - public void register() { + private void register() { if (isRegistered) { return; } @@ -41,8 +40,7 @@ class DefaultConnectivityMonitor implements ConnectivityMonitor { isRegistered = true; } - @Override - public void unregister() { + private void unregister() { if (!isRegistered) { return; } @@ -57,4 +55,19 @@ class DefaultConnectivityMonitor implements ConnectivityMonitor { NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); return networkInfo != null && networkInfo.isConnected(); } + + @Override + public void onStart() { + register(); + } + + @Override + public void onStop() { + unregister(); + } + + @Override + public void onDestroy() { + // Do nothing. + } } diff --git a/library/src/main/java/com/bumptech/glide/manager/Lifecycle.java b/library/src/main/java/com/bumptech/glide/manager/Lifecycle.java new file mode 100644 index 00000000..cc2bd8c4 --- /dev/null +++ b/library/src/main/java/com/bumptech/glide/manager/Lifecycle.java @@ -0,0 +1,64 @@ +package com.bumptech.glide.manager; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * A class for tracking and notifying listeners of {@link android.app.Fragment} and {@link android.app.Activity} + * lifecycle events. + */ +public class Lifecycle { + private final List<LifecycleListener> lifecycleListeners = + Collections.synchronizedList(new ArrayList<LifecycleListener>()); + private boolean isStarted; + private boolean isDestroyed; + + /** + * Adds the given listener to the list of listeners to be notified on each lifecycle event. + * + * <p> + * The latest lifecycle event will be called on the given listener synchronously in this method. If the + * activity or fragment is stopped, {@link LifecycleListener#onStop()}} will be called, and same for onStart and + * onDestroy. + * </p> + * + * <p> + * Note - {@link com.bumptech.glide.manager.LifecycleListener}s that are added more than once will have their + * lifecycle methods called more than once. It is the caller's responsibility to avoid adding listeners + * multiple times. + * </p> + */ + public void addListener(LifecycleListener listener) { + lifecycleListeners.add(listener); + + if (isDestroyed) { + listener.onDestroy(); + } else if (isStarted) { + listener.onStart(); + } else { + listener.onStop(); + } + } + + void onStart() { + isStarted = true; + for (LifecycleListener lifecycleListener : lifecycleListeners) { + lifecycleListener.onStart(); + } + } + + void onStop() { + isStarted = false; + for (LifecycleListener lifecycleListener : lifecycleListeners) { + lifecycleListener.onStop(); + } + } + + void onDestroy() { + isDestroyed = true; + for (LifecycleListener lifecycleListener : lifecycleListeners) { + lifecycleListener.onDestroy(); + } + } +} diff --git a/library/src/main/java/com/bumptech/glide/manager/LifecycleListener.java b/library/src/main/java/com/bumptech/glide/manager/LifecycleListener.java new file mode 100644 index 00000000..38614c2e --- /dev/null +++ b/library/src/main/java/com/bumptech/glide/manager/LifecycleListener.java @@ -0,0 +1,23 @@ +package com.bumptech.glide.manager; + +/** + * An interface for listener to {@link android.app.Fragment} and {@link android.app.Activity} lifecycle events. + */ +public interface LifecycleListener { + + /** + * Callback for when {@link android.app.Fragment#onStart()}} or {@link android.app.Activity#onStart()} is called. + */ + public void onStart(); + + /** + * Callback for when {@link android.app.Fragment#onStop()}} or {@link android.app.Activity#onStop()}} is called. + */ + public void onStop(); + + /** + * Callback for when {@link android.app.Fragment#onDestroy()}} or {@link android.app.Activity#onDestroy()} is + * called. + */ + public void onDestroy(); +} diff --git a/library/src/main/java/com/bumptech/glide/manager/NullConnectivityMonitor.java b/library/src/main/java/com/bumptech/glide/manager/NullConnectivityMonitor.java index 115ca52c..debb03fa 100644 --- a/library/src/main/java/com/bumptech/glide/manager/NullConnectivityMonitor.java +++ b/library/src/main/java/com/bumptech/glide/manager/NullConnectivityMonitor.java @@ -6,12 +6,17 @@ package com.bumptech.glide.manager; class NullConnectivityMonitor implements ConnectivityMonitor { @Override - public void register() { + public void onStart() { } @Override - public void unregister() { + public void onStop() { + + } + + @Override + public void onDestroy() { } } 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 931b62bc..82e5789f 100644 --- a/library/src/main/java/com/bumptech/glide/manager/RequestManagerFragment.java +++ b/library/src/main/java/com/bumptech/glide/manager/RequestManagerFragment.java @@ -1,5 +1,6 @@ package com.bumptech.glide.manager; +import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.app.Fragment; import com.bumptech.glide.RequestManager; @@ -15,8 +16,19 @@ import com.bumptech.glide.RequestManager; */ @TargetApi(11) public class RequestManagerFragment extends Fragment { + private final Lifecycle lifecycle; private RequestManager requestManager; + public RequestManagerFragment() { + this(new Lifecycle()); + } + + // For testing only. + @SuppressLint("ValidFragment") + RequestManagerFragment(Lifecycle lifecycle) { + this.lifecycle = lifecycle; + } + /** * Sets the current {@link com.bumptech.glide.RequestManager}. * @@ -26,6 +38,10 @@ public class RequestManagerFragment extends Fragment { this.requestManager = requestManager; } + public Lifecycle getLifecycle() { + return lifecycle; + } + /** * Returns the current {@link com.bumptech.glide.RequestManager} or null if none exists. */ @@ -36,24 +52,18 @@ public class RequestManagerFragment extends Fragment { @Override public void onStart() { super.onStart(); - if (requestManager != null) { - requestManager.onStart(); - } + lifecycle.onStart(); } @Override public void onStop() { super.onStop(); - if (requestManager != null) { - requestManager.onStop(); - } + lifecycle.onStop(); } @Override public void onDestroy() { super.onDestroy(); - if (requestManager != null) { - requestManager.onDestroy(); - } + lifecycle.onDestroy(); } } 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 95e21868..4e3ee702 100644 --- a/library/src/main/java/com/bumptech/glide/manager/RequestManagerRetriever.java +++ b/library/src/main/java/com/bumptech/glide/manager/RequestManagerRetriever.java @@ -32,7 +32,7 @@ public class RequestManagerRetriever { // Either a context or we're on a background thread. if (applicationManager == null) { - applicationManager = new RequestManager(context.getApplicationContext()); + applicationManager = new RequestManager(context.getApplicationContext(), new Lifecycle()); } return applicationManager; } @@ -112,7 +112,7 @@ public class RequestManagerRetriever { } RequestManager requestManager = current.getRequestManager(); if (requestManager == null) { - requestManager = new RequestManager(context); + requestManager = new RequestManager(context, current.getLifecycle()); current.setRequestManager(requestManager); } return requestManager; @@ -132,7 +132,7 @@ public class RequestManagerRetriever { } RequestManager requestManager = current.getRequestManager(); if (requestManager == null) { - requestManager = new RequestManager(context); + requestManager = new RequestManager(context, current.getLifecycle()); 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 2fc46577..1d49b05f 100644 --- a/library/src/main/java/com/bumptech/glide/manager/SupportRequestManagerFragment.java +++ b/library/src/main/java/com/bumptech/glide/manager/SupportRequestManagerFragment.java @@ -1,5 +1,6 @@ package com.bumptech.glide.manager; +import android.annotation.SuppressLint; import android.support.v4.app.Fragment; import com.bumptech.glide.RequestManager; @@ -14,6 +15,17 @@ import com.bumptech.glide.RequestManager; */ public class SupportRequestManagerFragment extends Fragment { private RequestManager requestManager; + private final Lifecycle lifecycle; + + public SupportRequestManagerFragment() { + this(new Lifecycle()); + } + + // For testing only. + @SuppressLint("ValidFragment") + public SupportRequestManagerFragment(Lifecycle lifecycle) { + this.lifecycle = lifecycle; + } /** * Sets the current {@link com.bumptech.glide.RequestManager}. @@ -24,6 +36,10 @@ public class SupportRequestManagerFragment extends Fragment { this.requestManager = requestManager; } + public Lifecycle getLifecycle() { + return lifecycle; + } + /** * Returns the current {@link com.bumptech.glide.RequestManager} or null if none is set. */ @@ -34,24 +50,18 @@ public class SupportRequestManagerFragment extends Fragment { @Override public void onStart() { super.onStart(); - if (requestManager != null) { - requestManager.onStart(); - } + lifecycle.onStart(); } @Override public void onStop() { super.onStop(); - if (requestManager != null) { - requestManager.onStop(); - } + lifecycle.onStop(); } @Override public void onDestroy() { super.onDestroy(); - if (requestManager != null) { - requestManager.onDestroy(); - } + lifecycle.onDestroy(); } } |