4
4
import android .content .res .AssetFileDescriptor ;
5
5
import android .content .res .Resources ;
6
6
import android .content .res .Resources .Theme ;
7
+ import android .graphics .drawable .Drawable ;
7
8
import android .os .Build ;
8
9
import android .os .Build .VERSION_CODES ;
9
10
import androidx .annotation .NonNull ;
12
13
import com .bumptech .glide .load .DataSource ;
13
14
import com .bumptech .glide .load .Options ;
14
15
import com .bumptech .glide .load .data .DataFetcher ;
16
+ import com .bumptech .glide .load .resource .drawable .DrawableDecoderCompat ;
15
17
import com .bumptech .glide .load .resource .drawable .ResourceDrawableDecoder ;
16
18
import com .bumptech .glide .signature .ObjectKey ;
17
- import java .io .Closeable ;
18
19
import java .io .IOException ;
19
20
import java .io .InputStream ;
20
21
26
27
* @param <DataT> The type of data this {@code ModelLoader} will produce (e.g. {@link InputStream},
27
28
* {@link AssetFileDescriptor} etc).
28
29
*/
29
- public final class DirectResourceLoader <DataT extends Closeable >
30
- implements ModelLoader <Integer , DataT > {
30
+ public final class DirectResourceLoader <DataT > implements ModelLoader <Integer , DataT > {
31
31
32
32
private final Context context ;
33
33
private final ResourceOpener <DataT > resourceOpener ;
@@ -41,6 +41,10 @@ public static ModelLoaderFactory<Integer, AssetFileDescriptor> assetFileDescript
41
41
return new AssetFileDescriptorFactory (context );
42
42
}
43
43
44
+ public static ModelLoaderFactory <Integer , Drawable > drawableFactory (Context context ) {
45
+ return new DrawableFactory (context );
46
+ }
47
+
44
48
DirectResourceLoader (Context context , ResourceOpener <DataT > resourceOpener ) {
45
49
this .context = context .getApplicationContext ();
46
50
this .resourceOpener = resourceOpener ;
@@ -71,6 +75,8 @@ public boolean handles(@NonNull Integer integer) {
71
75
private interface ResourceOpener <DataT > {
72
76
DataT open (Resources resources , int resourceId );
73
77
78
+ void close (DataT data ) throws IOException ;
79
+
74
80
Class <DataT > getDataClass ();
75
81
}
76
82
@@ -89,6 +95,11 @@ public AssetFileDescriptor open(Resources resources, int resourceId) {
89
95
return resources .openRawResourceFd (resourceId );
90
96
}
91
97
98
+ @ Override
99
+ public void close (AssetFileDescriptor data ) throws IOException {
100
+ data .close ();
101
+ }
102
+
92
103
@ Override
93
104
public Class <AssetFileDescriptor > getDataClass () {
94
105
return AssetFileDescriptor .class ;
@@ -125,6 +136,11 @@ public InputStream open(Resources resources, int resourceId) {
125
136
return resources .openRawResource (resourceId );
126
137
}
127
138
139
+ @ Override
140
+ public void close (InputStream data ) throws IOException {
141
+ data .close ();
142
+ }
143
+
128
144
@ Override
129
145
public Class <InputStream > getDataClass () {
130
146
return InputStream .class ;
@@ -134,8 +150,45 @@ public Class<InputStream> getDataClass() {
134
150
public void teardown () {}
135
151
}
136
152
137
- private static final class ResourceDataFetcher <DataT extends Closeable >
138
- implements DataFetcher <DataT > {
153
+ /**
154
+ * Handles vectors, shapes and other resources that cannot be opened with
155
+ * Resources.openRawResource. Overlaps in functionality with {@link ResourceDrawableDecoder} and
156
+ * {@link com.bumptech.glide.load.resource.bitmap.ResourceBitmapDecoder} but it's more efficient
157
+ * for simple resource loads within a single application.
158
+ */
159
+ private static final class DrawableFactory
160
+ implements ModelLoaderFactory <Integer , Drawable >, ResourceOpener <Drawable > {
161
+
162
+ private final Context context ;
163
+
164
+ DrawableFactory (Context context ) {
165
+ this .context = context ;
166
+ }
167
+
168
+ @ Override
169
+ public Drawable open (Resources resources , int resourceId ) {
170
+ return DrawableDecoderCompat .getDrawable (context , resourceId , resources .newTheme ());
171
+ }
172
+
173
+ @ Override
174
+ public void close (Drawable data ) throws IOException {}
175
+
176
+ @ Override
177
+ public Class <Drawable > getDataClass () {
178
+ return Drawable .class ;
179
+ }
180
+
181
+ @ NonNull
182
+ @ Override
183
+ public ModelLoader <Integer , Drawable > build (@ NonNull MultiModelLoaderFactory multiFactory ) {
184
+ return new DirectResourceLoader <>(context , this );
185
+ }
186
+
187
+ @ Override
188
+ public void teardown () {}
189
+ }
190
+
191
+ private static final class ResourceDataFetcher <DataT > implements DataFetcher <DataT > {
139
192
140
193
private final Resources resources ;
141
194
private final ResourceOpener <DataT > resourceOpener ;
@@ -164,7 +217,7 @@ public void cleanup() {
164
217
DataT local = data ;
165
218
if (local != null ) {
166
219
try {
167
- local .close ();
220
+ resourceOpener .close (local );
168
221
} catch (IOException e ) {
169
222
// Ignored.
170
223
}
0 commit comments