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 1c69eceab..a7df59462 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 @@ -3,6 +3,7 @@ package fr.free.nrw.commons.contributions; import android.net.Uri; import android.text.TextUtils; import android.view.View; +import android.webkit.URLUtil; import android.widget.ImageButton; import android.widget.ProgressBar; import android.widget.RelativeLayout; @@ -23,6 +24,7 @@ import fr.free.nrw.commons.media.MediaClient; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; import io.reactivex.schedulers.Schedulers; +import java.io.File; public class ContributionViewHolder extends RecyclerView.ViewHolder { @@ -58,6 +60,7 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder { private boolean isWikipediaButtonDisplayed; private AlertDialog pausingPopUp; private View parent; + private ImageRequest imageRequest; ContributionViewHolder(final View parent, final Callback callback, final MediaClient mediaClient) { @@ -96,11 +99,18 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder { final String imageSource = chooseImageSource(contribution.getMedia().getThumbUrl(), contribution.getLocalUri()); if (!TextUtils.isEmpty(imageSource)) { - final ImageRequest imageRequest = - ImageRequestBuilder.newBuilderWithSource(Uri.parse(imageSource)) + if (URLUtil.isHttpsUrl(imageSource)) { + imageRequest = ImageRequestBuilder.newBuilderWithSource(Uri.parse(imageSource)) .setProgressiveRenderingEnabled(true) .build(); - imageView.setImageRequest(imageRequest); + } else if(imageSource != null) { + final File file = new File(imageSource); + imageRequest = ImageRequest.fromFile(file); + } + + if(imageRequest != null){ + imageView.setImageRequest(imageRequest); + } } seqNumView.setText(String.valueOf(position + 1)); @@ -280,4 +290,8 @@ public class ContributionViewHolder extends RecyclerView.ViewHolder { pauseResumeButton.setImageResource(R.drawable.play_icon); pauseResumeButton.setTag(parent.getContext().getString(R.string.resume)); } + + public ImageRequest getImageRequest() { + return imageRequest; + } } diff --git a/app/src/test/kotlin/fr/free/nrw/commons/contributions/ContributionViewHolderUnitTests.kt b/app/src/test/kotlin/fr/free/nrw/commons/contributions/ContributionViewHolderUnitTests.kt index 72ad9c8a5..deaa5c5c9 100644 --- a/app/src/test/kotlin/fr/free/nrw/commons/contributions/ContributionViewHolderUnitTests.kt +++ b/app/src/test/kotlin/fr/free/nrw/commons/contributions/ContributionViewHolderUnitTests.kt @@ -10,7 +10,9 @@ import android.widget.RelativeLayout import android.widget.TextView import com.facebook.drawee.backends.pipeline.Fresco import com.facebook.drawee.view.SimpleDraweeView +import com.facebook.imagepipeline.request.ImageRequest import com.facebook.soloader.SoLoader +import com.nhaarman.mockitokotlin2.verify import fr.free.nrw.commons.Media import fr.free.nrw.commons.R import fr.free.nrw.commons.TestCommonsApplication @@ -22,7 +24,8 @@ import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock -import org.mockito.Mockito.`when` +import org.mockito.Mockito +import org.mockito.Mockito.* import org.mockito.MockitoAnnotations import org.powermock.reflect.Whitebox import org.robolectric.Robolectric @@ -31,6 +34,7 @@ import org.robolectric.RuntimeEnvironment import org.robolectric.Shadows import org.robolectric.annotation.Config import org.robolectric.annotation.LooperMode +import java.io.File import java.lang.reflect.Method @RunWith(RobolectricTestRunner::class) @@ -324,4 +328,36 @@ class ContributionViewHolderUnitTests { contributionViewHolder.init(0, contribution) } + @Test + @Throws(Exception::class) + fun testInitCaseImageSource_HttpURL() { + Shadows.shadowOf(Looper.getMainLooper()).idle() + `when`(contribution.media).thenReturn(media) + `when`(contribution.media.thumbUrl).thenReturn("https://demo/sample.png") + `when`(contribution.localUri).thenReturn(null) + contributionViewHolder.init(0, contribution) + Assert.assertNotNull(contributionViewHolder.imageRequest) + } + + @Test + @Throws(Exception::class) + fun testInitCaseImageSource_NULL() { + Shadows.shadowOf(Looper.getMainLooper()).idle() + `when`(contribution.media).thenReturn(media) + `when`(contribution.media.thumbUrl).thenReturn(null) + `when`(contribution.localUri).thenReturn(null) + contributionViewHolder.init(0, contribution) + Assert.assertNull(contributionViewHolder.imageRequest) + } + + @Test + @Throws(Exception::class) + fun testInitCaseImageSource_LocalUri() { + Shadows.shadowOf(Looper.getMainLooper()).idle() + `when`(contribution.media).thenReturn(media) + `when`(contribution.media.thumbUrl).thenReturn(null) + `when`(contribution.localUri).thenReturn(Uri.parse("/data/android/demo.png")) + contributionViewHolder.init(0, contribution) + Assert.assertNotNull(contributionViewHolder.imageRequest) + } } \ No newline at end of file