17e7c54e34b096f6bee9cefe6ef043464a984e5ffSam Juddpackage com.bumptech.glide;
28a6067fbe2a670d2e893c79c9c0ec17817da6568Sam Judd
3e97358542be64b8f458d75d997ef585f6d9fce4cSam Juddimport android.app.Activity;
4e97358542be64b8f458d75d997ef585f6d9fce4cSam Juddimport android.app.Fragment;
5667fb8129df68fbab0c489b23b2ca9d392cd45a0Sam Juddimport android.content.Context;
6e97358542be64b8f458d75d997ef585f6d9fce4cSam Juddimport android.net.Uri;
7e97358542be64b8f458d75d997ef585f6d9fce4cSam Juddimport android.os.ParcelFileDescriptor;
8e97358542be64b8f458d75d997ef585f6d9fce4cSam Juddimport android.provider.MediaStore;
9e97358542be64b8f458d75d997ef585f6d9fce4cSam Juddimport android.support.v4.app.FragmentActivity;
10e97358542be64b8f458d75d997ef585f6d9fce4cSam Juddimport com.bumptech.glide.load.ResourceDecoder;
11e97358542be64b8f458d75d997ef585f6d9fce4cSam Juddimport com.bumptech.glide.load.ResourceEncoder;
12e97358542be64b8f458d75d997ef585f6d9fce4cSam Juddimport com.bumptech.glide.load.model.ModelLoader;
13e97358542be64b8f458d75d997ef585f6d9fce4cSam Juddimport com.bumptech.glide.load.model.ModelLoaderFactory;
14e97358542be64b8f458d75d997ef585f6d9fce4cSam Juddimport com.bumptech.glide.load.model.file_descriptor.FileDescriptorModelLoader;
15e97358542be64b8f458d75d997ef585f6d9fce4cSam Juddimport com.bumptech.glide.load.model.stream.MediaStoreStreamLoader;
16e97358542be64b8f458d75d997ef585f6d9fce4cSam Juddimport com.bumptech.glide.load.model.stream.StreamByteArrayLoader;
17e97358542be64b8f458d75d997ef585f6d9fce4cSam Juddimport com.bumptech.glide.load.model.stream.StreamFileLoader;
18e97358542be64b8f458d75d997ef585f6d9fce4cSam Juddimport com.bumptech.glide.load.model.stream.StreamModelLoader;
19e97358542be64b8f458d75d997ef585f6d9fce4cSam Juddimport com.bumptech.glide.load.model.stream.StreamResourceLoader;
20e97358542be64b8f458d75d997ef585f6d9fce4cSam Juddimport com.bumptech.glide.load.model.stream.StreamStringLoader;
21e97358542be64b8f458d75d997ef585f6d9fce4cSam Juddimport com.bumptech.glide.load.model.stream.StreamUriLoader;
227e7c54e34b096f6bee9cefe6ef043464a984e5ffSam Juddimport com.bumptech.glide.manager.ConnectivityMonitor;
237e7c54e34b096f6bee9cefe6ef043464a984e5ffSam Juddimport com.bumptech.glide.manager.ConnectivityMonitorFactory;
247e7c54e34b096f6bee9cefe6ef043464a984e5ffSam Juddimport com.bumptech.glide.manager.RequestTracker;
25e97358542be64b8f458d75d997ef585f6d9fce4cSam Juddimport com.bumptech.glide.volley.VolleyUrlLoader;
268a6067fbe2a670d2e893c79c9c0ec17817da6568Sam Judd
27e97358542be64b8f458d75d997ef585f6d9fce4cSam Juddimport java.io.File;
28e97358542be64b8f458d75d997ef585f6d9fce4cSam Juddimport java.io.InputStream;
29e97358542be64b8f458d75d997ef585f6d9fce4cSam Juddimport java.net.URL;
30e97358542be64b8f458d75d997ef585f6d9fce4cSam Juddimport java.util.UUID;
318a6067fbe2a670d2e893c79c9c0ec17817da6568Sam Judd
32e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd/**
33e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd * A class for managing and starting requests for Glide. Can use activity, fragment and connectivity lifecycle events to
34e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd * intelligently stop, start, and restart requests. Retrieve either by instantiating a new object, or to take advantage
35e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd * built in Activity and Fragment lifecycle handling, use the static Glide.load methods with your Fragment or Activity.
36e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd *
37e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd * @see Glide#with(Activity)
38e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd * @see Glide#with(FragmentActivity)
39e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd * @see Glide#with(Fragment)
40e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd * @see Glide#with(android.support.v4.app.Fragment)
41e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd * @see Glide#with(Context)
42e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd */
43e97358542be64b8f458d75d997ef585f6d9fce4cSam Juddpublic class RequestManager {
44667fb8129df68fbab0c489b23b2ca9d392cd45a0Sam Judd    private final ConnectivityMonitor connectivityMonitor;
45e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    private final Context context;
46667fb8129df68fbab0c489b23b2ca9d392cd45a0Sam Judd    private final RequestTracker requestTracker;
47e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    private final Glide glide;
48ad98053756e240354de03051733c0bf41bf8f25bSam Judd    private final OptionsApplier optionsApplier;
49ad98053756e240354de03051733c0bf41bf8f25bSam Judd    private DefaultOptions options;
508a6067fbe2a670d2e893c79c9c0ec17817da6568Sam Judd
517e7c54e34b096f6bee9cefe6ef043464a984e5ffSam Judd    public RequestManager(Context context) {
52667fb8129df68fbab0c489b23b2ca9d392cd45a0Sam Judd        this(context, new RequestTracker(), new ConnectivityMonitorFactory());
53667fb8129df68fbab0c489b23b2ca9d392cd45a0Sam Judd    }
54667fb8129df68fbab0c489b23b2ca9d392cd45a0Sam Judd
55667fb8129df68fbab0c489b23b2ca9d392cd45a0Sam Judd    RequestManager(Context context, RequestTracker requestTracker, ConnectivityMonitorFactory factory) {
56e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        this.context = context;
57667fb8129df68fbab0c489b23b2ca9d392cd45a0Sam Judd        this.requestTracker = requestTracker;
58e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        this.connectivityMonitor = factory.build(context, new RequestManagerConnectivityListener(requestTracker));
59667fb8129df68fbab0c489b23b2ca9d392cd45a0Sam Judd        connectivityMonitor.register();
60e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        this.glide = Glide.get(context);
61ad98053756e240354de03051733c0bf41bf8f25bSam Judd        this.optionsApplier = new OptionsApplier();
62ad98053756e240354de03051733c0bf41bf8f25bSam Judd    }
63ad98053756e240354de03051733c0bf41bf8f25bSam Judd
64ad98053756e240354de03051733c0bf41bf8f25bSam Judd    public interface DefaultOptions {
65ad98053756e240354de03051733c0bf41bf8f25bSam Judd        public <T> void apply(T model, GenericRequestBuilder<T, ?, ?, ?> requestBuilder);
66ad98053756e240354de03051733c0bf41bf8f25bSam Judd    }
67ad98053756e240354de03051733c0bf41bf8f25bSam Judd
68ad98053756e240354de03051733c0bf41bf8f25bSam Judd    public void setDefaultOptions(DefaultOptions options) {
69ad98053756e240354de03051733c0bf41bf8f25bSam Judd        this.options = options;
70ad98053756e240354de03051733c0bf41bf8f25bSam Judd    }
71ad98053756e240354de03051733c0bf41bf8f25bSam Judd
72ad98053756e240354de03051733c0bf41bf8f25bSam Judd    /**
73ad98053756e240354de03051733c0bf41bf8f25bSam Judd     * Cancels any in progress loads, but does not clear resources of completed loads.
74ad98053756e240354de03051733c0bf41bf8f25bSam Judd     */
75ad98053756e240354de03051733c0bf41bf8f25bSam Judd    public void pauseRequests() {
76ad98053756e240354de03051733c0bf41bf8f25bSam Judd        requestTracker.pauseRequests();
77ad98053756e240354de03051733c0bf41bf8f25bSam Judd    }
78ad98053756e240354de03051733c0bf41bf8f25bSam Judd
79ad98053756e240354de03051733c0bf41bf8f25bSam Judd    /**
80ad98053756e240354de03051733c0bf41bf8f25bSam Judd     * Restarts any loads that have not yet completed.
81ad98053756e240354de03051733c0bf41bf8f25bSam Judd     */
82ad98053756e240354de03051733c0bf41bf8f25bSam Judd    public void resumeRequests() {
83ad98053756e240354de03051733c0bf41bf8f25bSam Judd        requestTracker.resumeRequests();
84667fb8129df68fbab0c489b23b2ca9d392cd45a0Sam Judd    }
85667fb8129df68fbab0c489b23b2ca9d392cd45a0Sam Judd
86e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    /**
87e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * Lifecycle callback that registers for connectivity events (if the android.permission.ACCESS_NETWORK_STATE
88e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * permission is present) and restarts failed or paused requests.
89e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     */
907e7c54e34b096f6bee9cefe6ef043464a984e5ffSam Judd    public void onStart() {
91667fb8129df68fbab0c489b23b2ca9d392cd45a0Sam Judd        // onStart might not be called because this object may be created after the fragment/activity's onStart method.
92667fb8129df68fbab0c489b23b2ca9d392cd45a0Sam Judd        connectivityMonitor.register();
93667fb8129df68fbab0c489b23b2ca9d392cd45a0Sam Judd
94667fb8129df68fbab0c489b23b2ca9d392cd45a0Sam Judd        requestTracker.resumeRequests();
95667fb8129df68fbab0c489b23b2ca9d392cd45a0Sam Judd    }
96667fb8129df68fbab0c489b23b2ca9d392cd45a0Sam Judd
97e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    /**
98e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * Lifecycle callback that unregisters for connectivity events (if the android.permission.ACCESS_NETWORK_STATE
99e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * permission is present) and pauses in progress loads.
100e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     */
1017e7c54e34b096f6bee9cefe6ef043464a984e5ffSam Judd    public void onStop() {
102667fb8129df68fbab0c489b23b2ca9d392cd45a0Sam Judd        connectivityMonitor.unregister();
103667fb8129df68fbab0c489b23b2ca9d392cd45a0Sam Judd        requestTracker.pauseRequests();
104667fb8129df68fbab0c489b23b2ca9d392cd45a0Sam Judd    }
105667fb8129df68fbab0c489b23b2ca9d392cd45a0Sam Judd
106e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    /**
107e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * Lifecycle callback that cancels all in progress requests and clears and recycles resources for all completed
108e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * requests.
109e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     */
1107e7c54e34b096f6bee9cefe6ef043464a984e5ffSam Judd    public void onDestroy() {
111667fb8129df68fbab0c489b23b2ca9d392cd45a0Sam Judd        requestTracker.clearRequests();
112667fb8129df68fbab0c489b23b2ca9d392cd45a0Sam Judd    }
113667fb8129df68fbab0c489b23b2ca9d392cd45a0Sam Judd
114e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    /**
115e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * Use the given generic model loader to load the given generic data class.
116e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * <p>
117e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     *     Note that in most cases you will also need to specify an {@link ResourceDecoder} and an
118e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     *     {@link ResourceEncoder} for the load to complete successfully.
119e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * </p>
120e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @param modelLoader The {@link ModelLoader} class to use to load the model.
121e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @param dataClass The type of data the {@link ModelLoader} will load.
122e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @param <A> The type of the model to be loaded.
123e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @param <T> The type of the data to be loaded from the mode.
124e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @return A {@link GenericModelRequest} to set options for the load and ultimately the target to load the model
125e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * into.
126e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     */
127e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    public <A, T> GenericModelRequest<A, T> using(ModelLoader<A, T> modelLoader, Class<T> dataClass) {
128ad98053756e240354de03051733c0bf41bf8f25bSam Judd        return new GenericModelRequest<A, T>(modelLoader, dataClass);
129e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    }
130e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd
131e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    /**
132e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * Set the {@link ModelLoader} to use for for a new load where the model loader translates from a model to an
133e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * {@link InputStream} resource for loading images.
134e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     *
135e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @param modelLoader The model loader to use.
136e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @param <T> The type of the model.
137e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @return A new {@link ImageModelRequest}.
138e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     */
139e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    public <T> ImageModelRequest<T> using(final StreamModelLoader<T> modelLoader) {
140ad98053756e240354de03051733c0bf41bf8f25bSam Judd        return new ImageModelRequest<T>(modelLoader);
141e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    }
142e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd
143e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    /**
144e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * A convenience method to use a {@link StreamByteArrayLoader} to decode an image from a byte array.
145e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     *
146e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @param modelLoader The byte array loader.
147e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @return A new {@link ImageModelRequest}.
148e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     */
149e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    public ImageModelRequest<byte[]> using(StreamByteArrayLoader modelLoader) {
150ad98053756e240354de03051733c0bf41bf8f25bSam Judd        return new ImageModelRequest<byte[]>(modelLoader);
151e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    }
152e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd
153e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    /**
154e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * Set the {@link ModelLoader} to use for a new load where the model loader translates from a model to an
155e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * {@link ParcelFileDescriptor} resource for loading video thumbnails.
156e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     *
157e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @param modelLoader The model loader to use.
158e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @param <T> The type of the model.
159e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @return A new {@link VideoModelRequest}.
160e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     */
161e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    public <T> VideoModelRequest<T> using(final FileDescriptorModelLoader<T> modelLoader) {
162ad98053756e240354de03051733c0bf41bf8f25bSam Judd        return new VideoModelRequest<T>(modelLoader);
163e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    }
164e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd
165e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    /**
166e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * Use the {@link ModelLoaderFactory} currently registered for {@link String} to load the image represented by
167e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * the given {@link String}. Defaults to {@link StreamStringLoader.Factory} and {@link StreamStringLoader} to
168e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * load the given model.
169e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     *
170e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @see #using(StreamModelLoader)
171e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     *
172e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @param string The string representing the image. Must be either a path, or a uri handled by
173e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     *      {@link StreamUriLoader}
174e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @return A {@link DrawableTypeRequest} to set options for the load and ultimately the target to load the model
175e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * into.
176e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     */
177e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    public DrawableTypeRequest<String> load(String string) {
178e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        return loadGeneric(string);
179e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    }
180e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd
181e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    /**
182e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * Use the {@link ModelLoaderFactory} currently registered for {@link Uri} to load the image at the given uri.
183e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * Defaults to {@link StreamUriLoader.Factory} and {@link StreamUriLoader}.
184e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     *
185e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @see #using(StreamModelLoader)
186e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     *
187e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @param uri The uri representing the image. Must be a uri handled by {@link StreamUriLoader}
188e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @return A {@link DrawableTypeRequest} to set options for the load and ultimately the target to load the model
189e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * into.
190e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     */
191e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    public DrawableTypeRequest<Uri> load(Uri uri) {
192e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        return loadGeneric(uri);
193e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    }
194e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd
195e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    /**
196e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * Use {@link MediaStore.Images.Thumbnails} and {@link MediaStore.Video.Thumbnails} to retrieve pre-generated
197e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * thumbnails for the given uri. Falls back to the registered {@link ModelLoaderFactory} registered for {@link Uri}s
198e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * if the given uri is not a media store uri or if no pre-generated thumbnail exists for the given uri. In addition,
199e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * mixes the given mimeType, dateModified, and orientation into the cache key to detect and invalidate thumbnails
200e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * if content is changed locally.
201e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     *
202e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @param uri The uri representing the media.
203e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @param mimeType The mime type of the media store media. Ok to default to empty string "". See
204e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     *      {@link MediaStore.Images.ImageColumns#MIME_TYPE} or {@link MediaStore.Video.VideoColumns#MIME_TYPE}.
205e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @param dateModified The date modified time of the media store media. Ok to default to 0. See
206e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     *      {@link MediaStore.Images.ImageColumns#DATE_MODIFIED} or {@link MediaStore.Video.VideoColumns#DATE_MODIFIED}.
207e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @param orientation The orientation of the media store media. Ok to default to 0. See
208e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     *      {@link MediaStore.Images.ImageColumns#ORIENTATION}.
209e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @return A new {@link DrawableRequestBuilder} to set options for the load and ultimately the target to load the
210e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     *      uri into.
211e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     */
212e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    public DrawableTypeRequest<Uri> loadFromMediaStore(Uri uri, String mimeType, long dateModified, int orientation) {
213e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        ModelLoader<Uri, InputStream> genericStreamLoader = Glide.buildStreamModelLoader(uri, context);
214e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        ModelLoader<Uri, InputStream> mediaStoreLoader = new MediaStoreStreamLoader(context, genericStreamLoader,
215e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd                mimeType, dateModified, orientation);
216e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        ModelLoader<Uri, ParcelFileDescriptor> fileDescriptorModelLoader = Glide.buildFileDescriptorModelLoader(uri,
217e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd                context);
218ad98053756e240354de03051733c0bf41bf8f25bSam Judd        return optionsApplier.apply(uri, new DrawableTypeRequest<Uri>(uri, mediaStoreLoader, fileDescriptorModelLoader,
219ad98053756e240354de03051733c0bf41bf8f25bSam Judd                context, glide, requestTracker, optionsApplier));
220e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    }
221e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd
222e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    /**
223e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * Use the {@link ModelLoaderFactory} currently registered for {@link File} to load the image represented by the
224e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * given {@link File}. Defaults to {@link StreamFileLoader.Factory} and {@link StreamFileLoader} to load the
225e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * given model.
226e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     *
227e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @see #using(StreamModelLoader)
228e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     *
229e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @param file The File containing the image
230e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @return A {@link DrawableTypeRequest} to set options for the load and ultimately the target to load the model
231e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * into.
232e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     */
233e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    public DrawableTypeRequest<File> load(File file) {
234e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        return loadGeneric(file);
235e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    }
236e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd
237e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    /**
238e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * Use the {@link ModelLoaderFactory} currently registered for {@link Integer} to load the image represented by
239e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * the given {@link Integer} resource id. Defaults to {@link StreamResourceLoader.Factory} and
240e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * {@link StreamResourceLoader} to load the given model.
241e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     *
242e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @see #using(StreamModelLoader)
243e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     *
244e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @param resourceId the id of the resource containing the image
245e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @return A {@link DrawableTypeRequest} to set options for the load and ultimately the target to load the model
246e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * into.
247e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     */
248e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    public DrawableTypeRequest<Integer> load(Integer resourceId) {
249e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        return loadGeneric(resourceId);
250e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    }
251e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd
252e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    /**
253e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * Use the {@link ModelLoaderFactory} currently registered for the given model type to load the image
254e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * represented by the given model.
255e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     *
256e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @param model The model to load.
257e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @param <T> The type of the model to load.
258e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @return A {@link DrawableTypeRequest} to set options for the load and ultimately the target to load the image
259e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * into.
260e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     */
261e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    @SuppressWarnings("unused")
262e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    public <T> DrawableTypeRequest<T> loadFromImage(T model) {
263e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        return loadGeneric(model);
264e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    }
265e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd
266e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    /**
267e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * Use the {@link ModelLoaderFactory} currently registered for {@link URL} to load the image represented by the
268e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * given {@link URL}. Defaults to {@link VolleyUrlLoader.Factory} and {@link VolleyUrlLoader} to load the given
269e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * model.
270e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     *
271e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @see #using(StreamModelLoader)
272e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     *
273e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @param url The URL representing the image.
274e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @return A {@link DrawableTypeRequest} to set options for the load and ultimately the target to load the model
275e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * into.
276e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     */
277e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    public DrawableTypeRequest<URL> loadFromImage(URL url) {
278e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        return loadGeneric(url);
279e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    }
280e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd
281e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    /**
282e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * Use a new {@link StreamByteArrayLoader} to load an image from the given model.
283e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     *
284e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @see #loadFromImage(byte[])
285e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     *
286e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @param model The data to load.
287e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @param id A unique id that identifies the image represented by the model suitable for use as a cache key
288e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     *           (url, filepath etc). If there is no suitable id, use {@link #loadFromImage(byte[])} instaed.
289e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @return A {@link DrawableTypeRequest} to set options for the load and ultimately the target to load the image
290e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * into.
291e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     */
292e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    public DrawableTypeRequest<byte[]> loadFromImage(byte[] model, final String id) {
293e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        final StreamByteArrayLoader loader = new StreamByteArrayLoader(id);
294ad98053756e240354de03051733c0bf41bf8f25bSam Judd        return optionsApplier.apply(model,
295ad98053756e240354de03051733c0bf41bf8f25bSam Judd                new DrawableTypeRequest<byte[]>(model, loader, null, context, glide, requestTracker, optionsApplier));
296e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    }
297e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd
298e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    /**
299e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * Use a new {@link StreamByteArrayLoader} to load an image from the given model. Suitable when there is no
300e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * simple id that represents the given data.
301e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     *
302e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @param model the data to load.
303e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @return A {@link DrawableTypeRequest} to set options for the load and ultimately the target to load the image
304e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * into.
305e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     */
306e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    public DrawableTypeRequest<byte[]> loadFromImage(byte[] model) {
307ad98053756e240354de03051733c0bf41bf8f25bSam Judd        return loadFromImage(model, UUID.randomUUID()
308ad98053756e240354de03051733c0bf41bf8f25bSam Judd                .toString());
309e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    }
310e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd
311e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    /**
312e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * Use the {@link ModelLoaderFactory} currently registered for the given model type for
313e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * {@link ParcelFileDescriptor}s to load a thumbnail for the video represented by the given model.
314e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     *
315e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @param model The model to load.
316e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @param <T> The type of the model to load.
317e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @return A {@link DrawableTypeRequest} to set options for the load and ultimately the target to load the image
318e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * into.
319e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     */
320e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    @SuppressWarnings("unused")
321e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    public <T> DrawableTypeRequest<T> loadFromVideo(T model) {
322e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        return loadGeneric(model);
323e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    }
324e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd
325e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    /**
326e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * Use the {@link ModelLoaderFactory}s currently registered for the given model type for
327e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * {@link InputStream}s and {@link ParcelFileDescriptor}s to load a thumbnail from either the image or the video
328e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * represented by the given model.
329e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     *
330e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @param model The model the load.
331e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @param <T> The type of the model to load.
332e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @return A {@link DrawableTypeRequest} to set options for the load and ultimately the target to load the image
333e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * into.
334e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     */
335e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    public <T> DrawableTypeRequest<T> load(T model) {
336e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        return loadGeneric(model);
337e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    }
338e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd
339e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    private <T> DrawableTypeRequest<T> loadGeneric(T model) {
340e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        ModelLoader<T, InputStream> streamModelLoader = Glide.buildStreamModelLoader(model, context);
341e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        ModelLoader<T, ParcelFileDescriptor> fileDescriptorModelLoader =
342e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd                Glide.buildFileDescriptorModelLoader(model, context);
343ad98053756e240354de03051733c0bf41bf8f25bSam Judd        if (model != null && streamModelLoader == null && fileDescriptorModelLoader == null) {
344ad98053756e240354de03051733c0bf41bf8f25bSam Judd            throw new IllegalArgumentException("Unknown type " + model + ". You must provide a Model of a type for"
345ad98053756e240354de03051733c0bf41bf8f25bSam Judd                    + " which there is a registered ModelLoader, if you are using a custom model, you must first call"
346ad98053756e240354de03051733c0bf41bf8f25bSam Judd                    + " Glide#register with a ModelLoaderFactory for your custom model class");
347ad98053756e240354de03051733c0bf41bf8f25bSam Judd        }
348ad98053756e240354de03051733c0bf41bf8f25bSam Judd        return optionsApplier.apply(model, new DrawableTypeRequest<T>(model, streamModelLoader,
349ad98053756e240354de03051733c0bf41bf8f25bSam Judd                fileDescriptorModelLoader, context, glide, requestTracker, optionsApplier));
350e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    }
351e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd
352e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    /**
353e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * A helper class for building requests with custom {@link ModelLoader}s that translate models to
354e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * {@link ParcelFileDescriptor} resources for loading video thumbnails.
355e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     *
356e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @param <T> The type of the model.
357e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     */
358ad98053756e240354de03051733c0bf41bf8f25bSam Judd    public class VideoModelRequest<T> {
359e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        private final ModelLoader<T, ParcelFileDescriptor> loader;
360e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd
361ad98053756e240354de03051733c0bf41bf8f25bSam Judd        private VideoModelRequest(ModelLoader<T, ParcelFileDescriptor> loader) {
362e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd            this.loader = loader;
363e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        }
364e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd
365e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        public BitmapTypeRequest<T> loadFromVideo(T model) {
366ad98053756e240354de03051733c0bf41bf8f25bSam Judd            return optionsApplier.apply(model, new BitmapTypeRequest<T>(context, model, null, loader, glide,
367ad98053756e240354de03051733c0bf41bf8f25bSam Judd                    requestTracker, optionsApplier));
368e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        }
369e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    }
370e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd
371e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    /**
372e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * A helper class for building requests with custom {@link ModelLoader}s that translate models to
373e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * {@link InputStream} resources for loading images.
374e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     *
375e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @param <T> The type of the model.
376e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     */
377ad98053756e240354de03051733c0bf41bf8f25bSam Judd    public class ImageModelRequest<T> {
378e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        private final ModelLoader<T, InputStream> loader;
379e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd
380ad98053756e240354de03051733c0bf41bf8f25bSam Judd        private ImageModelRequest(ModelLoader<T, InputStream> loader) {
381e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd            this.loader = loader;
382e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        }
383e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd
384e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        public DrawableTypeRequest<T> load(T model) {
385ad98053756e240354de03051733c0bf41bf8f25bSam Judd            return optionsApplier.apply(model, new DrawableTypeRequest<T>(model, loader, null, context, glide,
386ad98053756e240354de03051733c0bf41bf8f25bSam Judd                    requestTracker, optionsApplier));
387e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        }
388e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    }
389e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd
390ad98053756e240354de03051733c0bf41bf8f25bSam Judd    class OptionsApplier {
391ad98053756e240354de03051733c0bf41bf8f25bSam Judd
392ad98053756e240354de03051733c0bf41bf8f25bSam Judd        public <A, X extends GenericRequestBuilder<A, ?, ?, ?>> X apply(A model, X builder) {
393ad98053756e240354de03051733c0bf41bf8f25bSam Judd            if (options != null) {
394ad98053756e240354de03051733c0bf41bf8f25bSam Judd                options.apply(model, builder);
395ad98053756e240354de03051733c0bf41bf8f25bSam Judd            }
396ad98053756e240354de03051733c0bf41bf8f25bSam Judd            return builder;
397ad98053756e240354de03051733c0bf41bf8f25bSam Judd        }
398ad98053756e240354de03051733c0bf41bf8f25bSam Judd
399ad98053756e240354de03051733c0bf41bf8f25bSam Judd    }
400ad98053756e240354de03051733c0bf41bf8f25bSam Judd
401e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    /**
402e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * A helper class for building requests with custom {@link ModelLoader}s that translate models to
403e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * {@link InputStream} resources for loading images.
404e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     *
405e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     * @param <T> The type of the model.
406e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd     */
407ad98053756e240354de03051733c0bf41bf8f25bSam Judd    public class GenericModelRequest<A, T> {
408e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        private final ModelLoader<A, T> modelLoader;
409e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        private final Class<T> dataClass;
410e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd
411ad98053756e240354de03051733c0bf41bf8f25bSam Judd        private GenericModelRequest(ModelLoader<A, T> modelLoader, Class<T> dataClass) {
412e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd            this.modelLoader = modelLoader;
413e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd            this.dataClass = dataClass;
414e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        }
415e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd
416ad98053756e240354de03051733c0bf41bf8f25bSam Judd        public GenericTypeRequest load(A model) {
417ad98053756e240354de03051733c0bf41bf8f25bSam Judd            return new GenericTypeRequest(model, modelLoader, dataClass);
418e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        }
419e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd
420ad98053756e240354de03051733c0bf41bf8f25bSam Judd        public class GenericTypeRequest {
421e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd            private final A model;
422e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd            private final ModelLoader<A, T> modelLoader;
423e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd            private final Class<T> dataClass;
424e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd
425ad98053756e240354de03051733c0bf41bf8f25bSam Judd            private GenericTypeRequest(A model, ModelLoader<A, T> modelLoader, Class<T> dataClass) {
426e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd                this.model = model;
427e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd                this.modelLoader = modelLoader;
428e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd                this.dataClass = dataClass;
429e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd            }
430e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd
431e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd            public <Z> GenericTranscodeRequest<A, T, Z> as(Class<Z> resourceClass) {
432ad98053756e240354de03051733c0bf41bf8f25bSam Judd                return optionsApplier.apply(model, new GenericTranscodeRequest<A, T, Z>(context, glide, model,
433ad98053756e240354de03051733c0bf41bf8f25bSam Judd                        modelLoader, dataClass, resourceClass, requestTracker, optionsApplier));
434e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd            }
435e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        }
436e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    }
437e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd
438e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd    private static class RequestManagerConnectivityListener implements ConnectivityMonitor.ConnectivityListener {
439e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        private RequestTracker requestTracker;
440e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd
441e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        public RequestManagerConnectivityListener(RequestTracker requestTracker) {
442e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd            this.requestTracker = requestTracker;
443e97358542be64b8f458d75d997ef585f6d9fce4cSam Judd        }
444667fb8129df68fbab0c489b23b2ca9d392cd45a0Sam Judd
445667fb8129df68fbab0c489b23b2ca9d392cd45a0Sam Judd        @Override
446667fb8129df68fbab0c489b23b2ca9d392cd45a0Sam Judd        public void onConnectivityChanged(boolean isConnected) {
447667fb8129df68fbab0c489b23b2ca9d392cd45a0Sam Judd            if (isConnected) {
448667fb8129df68fbab0c489b23b2ca9d392cd45a0Sam Judd                requestTracker.restartRequests();
449667fb8129df68fbab0c489b23b2ca9d392cd45a0Sam Judd            }
450667fb8129df68fbab0c489b23b2ca9d392cd45a0Sam Judd        }
451667fb8129df68fbab0c489b23b2ca9d392cd45a0Sam Judd    }
4528a6067fbe2a670d2e893c79c9c0ec17817da6568Sam Judd}
453