13947c741df8f8b0658430c22536b244dd26b793cSam Juddpackage com.bumptech.glide.manager;
23947c741df8f8b0658430c22536b244dd26b793cSam Judd
33947c741df8f8b0658430c22536b244dd26b793cSam Juddimport java.util.Collections;
43947c741df8f8b0658430c22536b244dd26b793cSam Juddimport java.util.Set;
53947c741df8f8b0658430c22536b244dd26b793cSam Juddimport java.util.WeakHashMap;
63947c741df8f8b0658430c22536b244dd26b793cSam Judd
73947c741df8f8b0658430c22536b244dd26b793cSam Judd/**
83947c741df8f8b0658430c22536b244dd26b793cSam Judd * A {@link com.bumptech.glide.manager.Lifecycle} implementation for tracking and notifying listeners of
93947c741df8f8b0658430c22536b244dd26b793cSam Judd * {@link android.app.Fragment} and {@link android.app.Activity} lifecycle events.
103947c741df8f8b0658430c22536b244dd26b793cSam Judd */
113947c741df8f8b0658430c22536b244dd26b793cSam Juddclass ActivityFragmentLifecycle implements Lifecycle {
123947c741df8f8b0658430c22536b244dd26b793cSam Judd    private final Set<LifecycleListener> lifecycleListeners =
133947c741df8f8b0658430c22536b244dd26b793cSam Judd            Collections.synchronizedSet(Collections.newSetFromMap(new WeakHashMap<LifecycleListener, Boolean>()));
143947c741df8f8b0658430c22536b244dd26b793cSam Judd    private boolean isStarted;
153947c741df8f8b0658430c22536b244dd26b793cSam Judd    private boolean isDestroyed;
163947c741df8f8b0658430c22536b244dd26b793cSam Judd
173947c741df8f8b0658430c22536b244dd26b793cSam Judd    /**
183947c741df8f8b0658430c22536b244dd26b793cSam Judd     * Adds the given listener to the list of listeners to be notified on each lifecycle event.
193947c741df8f8b0658430c22536b244dd26b793cSam Judd     *
203947c741df8f8b0658430c22536b244dd26b793cSam Judd     * <p>
213947c741df8f8b0658430c22536b244dd26b793cSam Judd     *     The latest lifecycle event will be called on the given listener synchronously in this method. If the
223947c741df8f8b0658430c22536b244dd26b793cSam Judd     *     activity or fragment is stopped, {@link LifecycleListener#onStop()}} will be called, and same for onStart and
233947c741df8f8b0658430c22536b244dd26b793cSam Judd     *     onDestroy.
243947c741df8f8b0658430c22536b244dd26b793cSam Judd     * </p>
253947c741df8f8b0658430c22536b244dd26b793cSam Judd     *
263947c741df8f8b0658430c22536b244dd26b793cSam Judd     * <p>
273947c741df8f8b0658430c22536b244dd26b793cSam Judd     *     Note - {@link com.bumptech.glide.manager.LifecycleListener}s that are added more than once will have their
283947c741df8f8b0658430c22536b244dd26b793cSam Judd     *     lifecycle methods called more than once. It is the caller's responsibility to avoid adding listeners
293947c741df8f8b0658430c22536b244dd26b793cSam Judd     *     multiple times.
303947c741df8f8b0658430c22536b244dd26b793cSam Judd     * </p>
313947c741df8f8b0658430c22536b244dd26b793cSam Judd     */
323947c741df8f8b0658430c22536b244dd26b793cSam Judd    @Override
333947c741df8f8b0658430c22536b244dd26b793cSam Judd    public void addListener(LifecycleListener listener) {
343947c741df8f8b0658430c22536b244dd26b793cSam Judd        lifecycleListeners.add(listener);
353947c741df8f8b0658430c22536b244dd26b793cSam Judd
363947c741df8f8b0658430c22536b244dd26b793cSam Judd        if (isDestroyed) {
373947c741df8f8b0658430c22536b244dd26b793cSam Judd            listener.onDestroy();
383947c741df8f8b0658430c22536b244dd26b793cSam Judd        } else if (isStarted) {
393947c741df8f8b0658430c22536b244dd26b793cSam Judd            listener.onStart();
403947c741df8f8b0658430c22536b244dd26b793cSam Judd        } else {
413947c741df8f8b0658430c22536b244dd26b793cSam Judd            listener.onStop();
423947c741df8f8b0658430c22536b244dd26b793cSam Judd        }
433947c741df8f8b0658430c22536b244dd26b793cSam Judd    }
443947c741df8f8b0658430c22536b244dd26b793cSam Judd
453947c741df8f8b0658430c22536b244dd26b793cSam Judd    void onStart() {
463947c741df8f8b0658430c22536b244dd26b793cSam Judd        isStarted = true;
473947c741df8f8b0658430c22536b244dd26b793cSam Judd        for (LifecycleListener lifecycleListener : lifecycleListeners) {
483947c741df8f8b0658430c22536b244dd26b793cSam Judd            lifecycleListener.onStart();
493947c741df8f8b0658430c22536b244dd26b793cSam Judd        }
503947c741df8f8b0658430c22536b244dd26b793cSam Judd    }
513947c741df8f8b0658430c22536b244dd26b793cSam Judd
523947c741df8f8b0658430c22536b244dd26b793cSam Judd    void onStop() {
533947c741df8f8b0658430c22536b244dd26b793cSam Judd        isStarted = false;
543947c741df8f8b0658430c22536b244dd26b793cSam Judd        for (LifecycleListener lifecycleListener : lifecycleListeners) {
553947c741df8f8b0658430c22536b244dd26b793cSam Judd            lifecycleListener.onStop();
563947c741df8f8b0658430c22536b244dd26b793cSam Judd        }
573947c741df8f8b0658430c22536b244dd26b793cSam Judd    }
583947c741df8f8b0658430c22536b244dd26b793cSam Judd
593947c741df8f8b0658430c22536b244dd26b793cSam Judd    void onDestroy() {
603947c741df8f8b0658430c22536b244dd26b793cSam Judd        isDestroyed = true;
613947c741df8f8b0658430c22536b244dd26b793cSam Judd        for (LifecycleListener lifecycleListener : lifecycleListeners) {
623947c741df8f8b0658430c22536b244dd26b793cSam Judd            lifecycleListener.onDestroy();
633947c741df8f8b0658430c22536b244dd26b793cSam Judd        }
643947c741df8f8b0658430c22536b244dd26b793cSam Judd    }
653947c741df8f8b0658430c22536b244dd26b793cSam Judd}
66