diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionViewHolder.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionViewHolder.java index 9d50819eef..7354abee98 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionViewHolder.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionViewHolder.java @@ -6,9 +6,14 @@ import android.widget.ProgressBar; import android.widget.TextView; +import androidx.collection.LruCache; + import com.facebook.drawee.view.SimpleDraweeView; +import org.apache.commons.lang3.StringUtils; + import javax.inject.Inject; +import javax.inject.Named; import butterknife.BindView; import butterknife.ButterKnife; @@ -18,6 +23,7 @@ import fr.free.nrw.commons.ViewHolder; import fr.free.nrw.commons.contributions.model.DisplayableContribution; import fr.free.nrw.commons.di.ApplicationlessInjection; +import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; @@ -35,6 +41,10 @@ public class ContributionViewHolder implements ViewHolder thumbnailCache; + private DisplayableContribution contribution; private CompositeDisposable compositeDisposable = new CompositeDisposable(); @@ -89,15 +99,21 @@ public void bindModel(Context context, DisplayableContribution contribution) { /** * This method fetches the thumbnail url from file name + * If the thumbnail url is present in cache, then it is used otherwise API call is made to fetch the thumbnail * This can be removed once #2904 is in place and contribution contains all metadata beforehand * @param contribution */ private void fetchAndDisplayThumbnail(DisplayableContribution contribution) { + if (!StringUtils.isBlank(thumbnailCache.get(contribution.getFilename()))) { + imageView.setImageURI(thumbnailCache.get(contribution.getFilename())); + return; + } Timber.d("Fetching thumbnail for %s", contribution.getFilename()); Disposable disposable = mediaDataExtractor.getMediaFromFileName(contribution.getFilename()) .subscribeOn(Schedulers.io()) - .observeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) .subscribe(media -> { + thumbnailCache.put(contribution.getFilename(), media.getThumbUrl()); imageView.setImageURI(media.getThumbUrl()); }); compositeDisposable.add(disposable); diff --git a/app/src/main/java/fr/free/nrw/commons/di/CommonsApplicationModule.java b/app/src/main/java/fr/free/nrw/commons/di/CommonsApplicationModule.java index 144d7b75ab..903c35ab04 100644 --- a/app/src/main/java/fr/free/nrw/commons/di/CommonsApplicationModule.java +++ b/app/src/main/java/fr/free/nrw/commons/di/CommonsApplicationModule.java @@ -150,6 +150,7 @@ public DBOpenHelper provideDBOpenHelper(Context context) { @Provides @Singleton + @Named("thumbnail-cache") public LruCache provideLruCache() { return new LruCache<>(1024); }