1package com.bumptech.glide.manager;
2
3import com.bumptech.glide.request.Request;
4
5import java.util.Collections;
6import java.util.Set;
7import java.util.WeakHashMap;
8
9/**
10 * A class for tracking, canceling, and restarting in progress, completed, and failed requests.
11 */
12public class RequestTracker {
13    // Most requests will be for views and will therefore be held strongly (and safely) by the view via the tag.
14    // However, a user can always pass in a different type of target which may end up not being strongly referenced even
15    // though the user still would like the request to finish. Weak references are therefore only really functional in
16    // this context for view targets. Despite the side affects, WeakReferences are still essentially required. A user
17    // can always make repeated requests into targets other than views, or use an activity manager in a fragment pager
18    // where holding strong references would steadily leak bitmaps and/or views.
19    private final Set<Request> requests = Collections.newSetFromMap(new WeakHashMap<Request, Boolean>());
20    private boolean isPaused;
21
22    /**
23     * Starts tracking the given request.
24     */
25    public void runRequest(Request request) {
26        requests.add(request);
27        if (!isPaused) {
28            request.begin();
29        }
30    }
31
32    // Exposed for testing.
33    void addRequest(Request request) {
34        requests.add(request);
35    }
36
37    /**
38     * Stops tracking the given request.
39     */
40    public void removeRequest(Request request) {
41        requests.remove(request);
42    }
43
44    /**
45     * Returns {@code true} if requests are currently paused, and {@code false} otherwise.
46     */
47    public boolean isPaused() {
48        return isPaused;
49    }
50
51    /**
52     * Stops any in progress requests.
53     */
54    public void pauseRequests() {
55        isPaused = true;
56        for (Request request : requests) {
57            if (request.isRunning()) {
58                request.pause();
59            }
60        }
61    }
62
63    /**
64     * Starts any not yet completed or failed requests.
65     */
66    public void resumeRequests() {
67        isPaused = false;
68        for (Request request : requests) {
69            if (!request.isComplete() && !request.isCancelled() && !request.isRunning()) {
70                request.begin();
71            }
72        }
73    }
74
75    /**
76     * Cancels all requests and clears their resources.
77     */
78    public void clearRequests() {
79        for (Request request : requests) {
80            request.clear();
81        }
82    }
83
84    /**
85     * Restarts failed requests and cancels and restarts in progress requests.
86     */
87    public void restartRequests() {
88        for (Request request : requests) {
89            if (!request.isComplete() && !request.isCancelled()) {
90                // Ensure the request will be restarted in onResume.
91                request.pause();
92                if (!isPaused) {
93                    request.begin();
94                }
95            }
96        }
97    }
98}
99