66import android .widget .ProgressBar ;
77import android .widget .TextView ;
88
9+ import androidx .collection .LruCache ;
10+
911import com .facebook .drawee .view .SimpleDraweeView ;
1012
13+ import org .apache .commons .lang3 .StringUtils ;
14+
1115import javax .inject .Inject ;
16+ import javax .inject .Named ;
1217
1318import butterknife .BindView ;
1419import butterknife .ButterKnife ;
1823import fr .free .nrw .commons .ViewHolder ;
1924import fr .free .nrw .commons .contributions .model .DisplayableContribution ;
2025import fr .free .nrw .commons .di .ApplicationlessInjection ;
26+ import io .reactivex .android .schedulers .AndroidSchedulers ;
2127import io .reactivex .disposables .CompositeDisposable ;
2228import io .reactivex .disposables .Disposable ;
2329import io .reactivex .schedulers .Schedulers ;
@@ -35,6 +41,10 @@ public class ContributionViewHolder implements ViewHolder<DisplayableContributio
3541 @ Inject
3642 MediaDataExtractor mediaDataExtractor ;
3743
44+ @ Inject
45+ @ Named ("thumbnail-cache" )
46+ LruCache <String , String > thumbnailCache ;
47+
3848 private DisplayableContribution contribution ;
3949 private CompositeDisposable compositeDisposable = new CompositeDisposable ();
4050
@@ -89,15 +99,21 @@ public void bindModel(Context context, DisplayableContribution contribution) {
8999
90100 /**
91101 * This method fetches the thumbnail url from file name
102+ * If the thumbnail url is present in cache, then it is used otherwise API call is made to fetch the thumbnail
92103 * This can be removed once #2904 is in place and contribution contains all metadata beforehand
93104 * @param contribution
94105 */
95106 private void fetchAndDisplayThumbnail (DisplayableContribution contribution ) {
107+ if (!StringUtils .isBlank (thumbnailCache .get (contribution .getFilename ()))) {
108+ imageView .setImageURI (thumbnailCache .get (contribution .getFilename ()));
109+ return ;
110+ }
96111 Timber .d ("Fetching thumbnail for %s" , contribution .getFilename ());
97112 Disposable disposable = mediaDataExtractor .getMediaFromFileName (contribution .getFilename ())
98113 .subscribeOn (Schedulers .io ())
99- .observeOn (Schedulers . io ())
114+ .observeOn (AndroidSchedulers . mainThread ())
100115 .subscribe (media -> {
116+ thumbnailCache .put (contribution .getFilename (), media .getThumbUrl ());
101117 imageView .setImageURI (media .getThumbUrl ());
102118 });
103119 compositeDisposable .add (disposable );
0 commit comments