Skip to content

Commit 34adac2

Browse files
authored
Support for Glide 4.0 (#802)
1 parent 22b0b30 commit 34adac2

File tree

8 files changed

+169
-32
lines changed

8 files changed

+169
-32
lines changed

app/build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ dependencies {
4747
compile('com.facebook.android:facebook-android-sdk:4.25.0')
4848
compile("com.twitter.sdk.android:twitter-core:3.0.0@aar") { transitive = true }
4949

50+
compile 'com.github.bumptech.glide:glide:4.1.1'
51+
annotationProcessor 'com.github.bumptech.glide:compiler:4.1.1'
52+
5053
// The following dependencies are not required to use the Firebase UI library.
5154
// They are used to make some aspects of the demo app implementation simpler for
5255
// demonstrative purposes, and you may find them useful in your own apps; YMMV.

app/src/main/java/com/firebase/uidemo/auth/SignedInActivity.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,11 @@
3131
import android.widget.ImageView;
3232
import android.widget.TextView;
3333

34-
import com.bumptech.glide.Glide;
3534
import com.firebase.ui.auth.AuthUI;
3635
import com.firebase.ui.auth.AuthUI.IdpConfig;
3736
import com.firebase.ui.auth.IdpResponse;
3837
import com.firebase.uidemo.R;
38+
import com.firebase.uidemo.storage.GlideApp;
3939
import com.google.android.gms.tasks.OnCompleteListener;
4040
import com.google.android.gms.tasks.Task;
4141
import com.google.firebase.auth.EmailAuthProvider;
@@ -165,7 +165,7 @@ public void onComplete(@NonNull Task<Void> task) {
165165
private void populateProfile() {
166166
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
167167
if (user.getPhotoUrl() != null) {
168-
Glide.with(this)
168+
GlideApp.with(this)
169169
.load(user.getPhotoUrl())
170170
.fitCenter()
171171
.into(mUserProfilePicture);

app/src/main/java/com/firebase/uidemo/storage/ImageActivity.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@
1313
import android.widget.ImageView;
1414
import android.widget.Toast;
1515

16-
import com.bumptech.glide.Glide;
17-
import com.firebase.ui.storage.images.FirebaseImageLoader;
16+
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions;
1817
import com.firebase.uidemo.R;
1918
import com.firebase.uidemo.util.SignInResultNotifier;
2019
import com.google.android.gms.tasks.OnFailureListener;
@@ -131,11 +130,11 @@ public void onFailure(@NonNull Exception e) {
131130
@OnClick(R.id.button_download_direct)
132131
protected void downloadDirect() {
133132
// Download directly from StorageReference using Glide
134-
Glide.with(this)
135-
.using(new FirebaseImageLoader())
133+
// (See MyAppGlideModule for Loader registration)
134+
GlideApp.with(this)
136135
.load(mImageRef)
137136
.centerCrop()
138-
.crossFade()
137+
.transition(DrawableTransitionOptions.withCrossFade())
139138
.into(mImageView);
140139
}
141140

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.firebase.uidemo.storage;
2+
3+
import android.content.Context;
4+
5+
import com.bumptech.glide.Glide;
6+
import com.bumptech.glide.Registry;
7+
import com.bumptech.glide.annotation.GlideModule;
8+
import com.bumptech.glide.module.AppGlideModule;
9+
import com.firebase.ui.storage.images.FirebaseImageLoader;
10+
import com.google.firebase.storage.StorageReference;
11+
12+
import java.io.InputStream;
13+
14+
/**
15+
* Glide module to register {@link com.firebase.ui.storage.images.FirebaseImageLoader}.
16+
* See: http://bumptech.github.io/glide/doc/generatedapi.html
17+
*/
18+
@GlideModule
19+
public class MyAppGlideModule extends AppGlideModule {
20+
21+
@Override
22+
public void registerComponents(Context context, Glide glide, Registry registry) {
23+
// Register FirebaseImageLoader to handle StorageReference
24+
registry.append(StorageReference.class, InputStream.class,
25+
new FirebaseImageLoader.Factory());
26+
}
27+
28+
}

library/quality/findbugs-filter.xml

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,16 @@
44
<Class name="com.firebase.ui.database.TestUtils"/>
55
<Bug pattern="RV_RETURN_VALUE_IGNORED"/>
66
</Match>
7-
</FindBugsFilter>
7+
8+
<!-- Generated class from Glide annotation processing -->
9+
<Match>
10+
<Class name="com.firebase.uidemo.storage.GlideOptions" />
11+
<Bug pattern="CN_IMPLEMENTS_CLONE_BUT_NOT_CLONEABLE" />
12+
</Match>
13+
14+
<!-- Generated class from Glide annotation processing -->
15+
<Match>
16+
<Class name="com.firebase.uidemo.storage.GlideRequest" />
17+
<Bug pattern="CN_IMPLEMENTS_CLONE_BUT_NOT_CLONEABLE" />
18+
</Match>
19+
</FindBugsFilter>

storage/README.md

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,22 @@ from a [`StorageReference`][storage-reference] and display it using the popular
1212
[Glide][glide] library. This technique allows you to get all of Glide's performance
1313
benefits while leveraging Cloud Storage's authenticated storage capabilities.
1414

15-
To load an image from a `StorageReference`, simply use the `FirebaseImageLoader` class:
15+
To load an image from a `StorageReference`, first register in your `AppGlideModule`:
16+
17+
```java
18+
@GlideModule
19+
public class MyAppGlideModule extends AppGlideModule {
20+
21+
@Override
22+
public void registerComponents(Context context, Registry registry) {
23+
// Register FirebaseImageLoader to handle StorageReference
24+
registry.append(StorageReference.class, InputStream.class,
25+
new FirebaseImageLoader.Factory());
26+
}
27+
}
28+
```
29+
30+
Then you can load a `StorageReference` into an `ImageView`:
1631

1732
```java
1833
// Reference to an image file in Cloud Storage
@@ -21,9 +36,9 @@ StorageReference storageReference = ...;
2136
// ImageView in your Activity
2237
ImageView imageView = ...;
2338

24-
// Load the image using Glide
25-
Glide.with(this /* context */)
26-
.using(new FirebaseImageLoader())
39+
// Download directly from StorageReference using Glide
40+
// (See MyAppGlideModule for Loader registration)
41+
GlidApp.with(this /* context */)
2742
.load(storageReference)
2843
.into(imageView);
2944
```

storage/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ dependencies {
2424
compile "com.android.support:appcompat-v7:$supportLibraryVersion"
2525
compile "com.android.support:palette-v7:$supportLibraryVersion"
2626

27-
compile 'com.github.bumptech.glide:glide:3.7.0'
27+
provided 'com.github.bumptech.glide:glide:4.1.1'
2828

2929
compile "com.google.firebase:firebase-storage:$firebaseVersion"
3030
}
Lines changed: 99 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,131 @@
11
package com.firebase.ui.storage.images;
22

3+
import android.support.annotation.NonNull;
4+
import android.support.annotation.Nullable;
35
import android.util.Log;
46

57
import com.bumptech.glide.Priority;
8+
import com.bumptech.glide.load.DataSource;
9+
import com.bumptech.glide.load.Key;
10+
import com.bumptech.glide.load.Options;
611
import com.bumptech.glide.load.data.DataFetcher;
7-
import com.bumptech.glide.load.model.stream.StreamModelLoader;
8-
import com.google.android.gms.tasks.Tasks;
12+
import com.bumptech.glide.load.model.ModelLoader;
13+
import com.bumptech.glide.load.model.ModelLoaderFactory;
14+
import com.bumptech.glide.load.model.MultiModelLoaderFactory;
15+
import com.google.android.gms.tasks.OnFailureListener;
16+
import com.google.android.gms.tasks.OnSuccessListener;
917
import com.google.firebase.storage.StorageReference;
1018
import com.google.firebase.storage.StreamDownloadTask;
1119

1220
import java.io.IOException;
1321
import java.io.InputStream;
22+
import java.nio.charset.Charset;
23+
import java.security.MessageDigest;
1424

1525
/**
1626
* ModelLoader implementation to download images from FirebaseStorage with Glide.
27+
*
28+
* <p>
29+
* First, register this class in your AppGlideModule:
30+
* <pre>
31+
* {@literal @}Override
32+
* public void registerComponents(Context context, Registry registry) {
33+
* // Register FirebaseImageLoader to handle StorageReference
34+
* registry.append(StorageReference.class, InputStream.class,
35+
* new FirebaseImageLoader.Factory());
36+
* }
37+
* </pre>
38+
*
1739
* <p>
18-
* Sample Usage:
40+
* Then load a StorageReference into an ImageView.
1941
* <pre>
2042
* StorageReference ref = FirebaseStorage.getInstance().getReference().child("myimage");
2143
* ImageView iv = (ImageView) findViewById(R.id.my_image_view);
2244
*
23-
* Glide.with(this)
24-
* .using(new FirebaseImageLoader())
45+
* GlideApp.with(this)
2546
* .load(ref)
2647
* .into(iv);
2748
* </pre>
2849
*/
29-
public class FirebaseImageLoader implements StreamModelLoader<StorageReference> {
50+
public class FirebaseImageLoader implements ModelLoader<StorageReference, InputStream> {
3051

3152
private static final String TAG = "FirebaseImageLoader";
3253

54+
55+
/**
56+
* Factory to create {@link FirebaseImageLoader}.
57+
*/
58+
public static class Factory implements ModelLoaderFactory<StorageReference, InputStream> {
59+
60+
@Override
61+
public ModelLoader<StorageReference, InputStream> build(MultiModelLoaderFactory factory) {
62+
return new FirebaseImageLoader();
63+
}
64+
65+
@Override
66+
public void teardown() {
67+
// No-op
68+
}
69+
}
70+
71+
@Nullable
3372
@Override
34-
public DataFetcher<InputStream> getResourceFetcher(StorageReference model, int width, int height) {
35-
return new FirebaseStorageFetcher(model);
73+
public LoadData<InputStream> buildLoadData(StorageReference reference,
74+
int height,
75+
int width,
76+
Options options) {
77+
return new LoadData<>(
78+
new FirebaseStorageKey(reference),
79+
new FirebaseStorageFetcher(reference));
3680
}
3781

38-
private class FirebaseStorageFetcher implements DataFetcher<InputStream> {
82+
@Override
83+
public boolean handles(StorageReference reference) {
84+
return true;
85+
}
86+
87+
private static class FirebaseStorageKey implements Key {
88+
89+
private StorageReference mRef;
90+
91+
public FirebaseStorageKey(StorageReference ref) {
92+
mRef = ref;
93+
}
94+
95+
@Override
96+
public void updateDiskCacheKey(MessageDigest digest) {
97+
digest.update(mRef.getPath().getBytes(Charset.defaultCharset()));
98+
}
99+
}
100+
101+
private static class FirebaseStorageFetcher implements DataFetcher<InputStream> {
39102

40103
private StorageReference mRef;
41104
private StreamDownloadTask mStreamTask;
42105
private InputStream mInputStream;
43106

44-
FirebaseStorageFetcher(StorageReference ref) {
107+
public FirebaseStorageFetcher(StorageReference ref) {
45108
mRef = ref;
46109
}
47110

48111
@Override
49-
public InputStream loadData(Priority priority) throws Exception {
112+
public void loadData(Priority priority,
113+
final DataCallback<? super InputStream> callback) {
50114
mStreamTask = mRef.getStream();
51-
mInputStream = Tasks.await(mStreamTask).getStream();
52-
53-
return mInputStream;
115+
mStreamTask
116+
.addOnSuccessListener(new OnSuccessListener<StreamDownloadTask.TaskSnapshot>() {
117+
@Override
118+
public void onSuccess(StreamDownloadTask.TaskSnapshot snapshot) {
119+
mInputStream = snapshot.getStream();
120+
callback.onDataReady(mInputStream);
121+
}
122+
})
123+
.addOnFailureListener(new OnFailureListener() {
124+
@Override
125+
public void onFailure(@NonNull Exception e) {
126+
callback.onLoadFailed(e);
127+
}
128+
});
54129
}
55130

56131
@Override
@@ -66,17 +141,22 @@ public void cleanup() {
66141
}
67142
}
68143

69-
@Override
70-
public String getId() {
71-
return mRef.getPath();
72-
}
73-
74144
@Override
75145
public void cancel() {
76146
// Cancel task if possible
77147
if (mStreamTask != null && mStreamTask.isInProgress()) {
78148
mStreamTask.cancel();
79149
}
80150
}
151+
152+
@Override
153+
public Class<InputStream> getDataClass() {
154+
return InputStream.class;
155+
}
156+
157+
@Override
158+
public DataSource getDataSource() {
159+
return DataSource.REMOTE;
160+
}
81161
}
82162
}

0 commit comments

Comments
 (0)