1package com.bumptech.glide;
2
3import android.content.Context;
4import android.os.Build;
5
6import com.bumptech.glide.load.DecodeFormat;
7import com.bumptech.glide.load.engine.Engine;
8import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
9import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPoolAdapter;
10import com.bumptech.glide.load.engine.bitmap_recycle.LruBitmapPool;
11import com.bumptech.glide.load.engine.cache.DiskCache;
12import com.bumptech.glide.load.engine.cache.DiskCacheAdapter;
13import com.bumptech.glide.load.engine.cache.DiskLruCacheWrapper;
14import com.bumptech.glide.load.engine.cache.LruResourceCache;
15import com.bumptech.glide.load.engine.cache.MemoryCache;
16import com.bumptech.glide.load.engine.cache.MemorySizeCalculator;
17import com.bumptech.glide.load.engine.executor.FifoPriorityThreadPoolExecutor;
18
19import java.io.File;
20import java.util.concurrent.ExecutorService;
21
22/**
23 * A builder class for setting default structural classes for Glide to use.
24 */
25public class GlideBuilder {
26    private final Context context;
27
28    private Engine engine;
29    private BitmapPool bitmapPool;
30    private MemoryCache memoryCache;
31    private DiskCache diskCache;
32    private ExecutorService sourceService;
33    private ExecutorService diskCacheService;
34    private DecodeFormat decodeFormat;
35
36    public GlideBuilder(Context context) {
37        this.context = context.getApplicationContext();
38    }
39
40    /**
41     * Sets the {@link com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool} implementation to use to store and
42     * retrieve reused {@link android.graphics.Bitmap}s.
43     *
44     * @param bitmapPool The pool to use.
45     * @return This builder.
46     */
47    public GlideBuilder setBitmapPool(BitmapPool bitmapPool) {
48        this.bitmapPool = bitmapPool;
49        return this;
50    }
51
52    /**
53     * Sets the {@link com.bumptech.glide.load.engine.cache.MemoryCache} implementation to store
54     * {@link com.bumptech.glide.load.engine.Resource}s that are not currently in use.
55     *
56     * @param memoryCache  The cache to use.
57     * @return This builder.
58     */
59    public GlideBuilder setMemoryCache(MemoryCache memoryCache) {
60        this.memoryCache = memoryCache;
61        return this;
62    }
63
64    /**
65     * Sets the {@link com.bumptech.glide.load.engine.cache.DiskCache} implementation to use to store
66     * {@link com.bumptech.glide.load.engine.Resource} data and thumbnails.
67     *
68     * @param diskCache The disk cache to use.
69     * @return This builder.
70     */
71    public GlideBuilder setDiskCache(DiskCache diskCache) {
72        this.diskCache = diskCache;
73        return this;
74    }
75
76    /**
77     * Sets the {@link java.util.concurrent.ExecutorService} implementation to use when retrieving
78     * {@link com.bumptech.glide.load.engine.Resource}s that are not already in the cache.
79     *
80     * <p>
81     *     Any implementation must order requests based on their {@link com.bumptech.glide.Priority} for thumbnail
82     *     requests to work properly.
83     * </p>
84     *
85     * @see #setDiskCacheService(java.util.concurrent.ExecutorService)
86     * @see com.bumptech.glide.load.engine.executor.FifoPriorityThreadPoolExecutor
87     *
88     * @param service The ExecutorService to use.
89     * @return This builder.
90     */
91    public GlideBuilder setResizeService(ExecutorService service) {
92        this.sourceService = service;
93        return this;
94    }
95
96    /**
97     * Sets the {@link java.util.concurrent.ExecutorService} implementation to use when retrieving
98     * {@link com.bumptech.glide.load.engine.Resource}s that are currently in cache.
99     *
100     * <p>
101     *     Any implementation must order requests based on their {@link com.bumptech.glide.Priority} for thumbnail
102     *     requests to work properly.
103     * </p>
104     *
105     * @see #setResizeService(java.util.concurrent.ExecutorService)
106     * @see com.bumptech.glide.load.engine.executor.FifoPriorityThreadPoolExecutor
107     *
108     * @param service The ExecutorService to use.
109     * @return This builder.
110     */
111    public GlideBuilder setDiskCacheService(ExecutorService service) {
112        this.diskCacheService = service;
113        return this;
114    }
115
116    /**
117     * Sets the {@link com.bumptech.glide.load.DecodeFormat} that will be the default format for all the default
118     * decoders that can change the {@link android.graphics.Bitmap.Config} of the {@link android.graphics.Bitmap}s they
119     * decode.
120     *
121     * <p>
122     *     Decode format is always a suggestion, not a requirement. See {@link com.bumptech.glide.load.DecodeFormat} for
123     *     more details.
124     * </p>
125     *
126     * <p>
127     *     If you instantiate and use a custom decoder, it will use
128     *     {@link com.bumptech.glide.load.DecodeFormat#DEFAULT} as its default.
129     * </p>
130     *
131     * @param decodeFormat The format to use.
132     * @return This builder.
133     */
134    public GlideBuilder setDecodeFormat(DecodeFormat decodeFormat) {
135        this.decodeFormat = decodeFormat;
136        return this;
137    }
138
139    // For testing.
140    GlideBuilder setEngine(Engine engine) {
141        this.engine = engine;
142        return this;
143    }
144
145    Glide createGlide() {
146        if (sourceService == null) {
147            final int cores = Math.max(1, Runtime.getRuntime().availableProcessors());
148            sourceService = new FifoPriorityThreadPoolExecutor(cores);
149        }
150        if (diskCacheService == null) {
151            diskCacheService = new FifoPriorityThreadPoolExecutor(1);
152        }
153
154        MemorySizeCalculator calculator = new MemorySizeCalculator(context);
155        if (bitmapPool == null) {
156            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
157                bitmapPool = new LruBitmapPool(calculator.getBitmapPoolSize());
158            } else {
159                bitmapPool = new BitmapPoolAdapter();
160            }
161        }
162
163        if (memoryCache == null) {
164            memoryCache = new LruResourceCache(calculator.getMemoryCacheSize());
165        }
166
167        if (diskCache == null) {
168            File cacheDir = Glide.getPhotoCacheDir(context);
169            if (cacheDir != null) {
170                diskCache = DiskLruCacheWrapper.get(cacheDir, Glide.DEFAULT_DISK_CACHE_SIZE);
171            }
172            if (diskCache == null) {
173                diskCache = new DiskCacheAdapter();
174            }
175        }
176
177        if (engine == null) {
178            engine = new Engine(memoryCache, diskCache, diskCacheService, sourceService);
179        }
180
181        if (decodeFormat == null) {
182            decodeFormat = DecodeFormat.DEFAULT;
183        }
184
185        return new Glide(engine, memoryCache, bitmapPool, context, decodeFormat);
186    }
187}