diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/impl/MastodonCard.java b/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/impl/MastodonCard.java index c2bf6e53..dcc4c6f3 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/impl/MastodonCard.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/api/mastodon/impl/MastodonCard.java @@ -22,6 +22,7 @@ public class MastodonCard implements Card { private String description; private String url; private String imageLink; + private String blurHash; /** * @param json Mastodon card json @@ -31,6 +32,7 @@ public class MastodonCard implements Card { url = json.getString("url"); title = json.optString("title", ""); description = json.optString("description", ""); + blurHash = json.optString("blurhash"); if (Patterns.WEB_URL.matcher(imageLink).matches()) { this.imageLink = imageLink; } else { @@ -63,6 +65,12 @@ public class MastodonCard implements Card { } + @Override + public String getBlurHash() { + return blurHash; + } + + @Override public boolean equals(@Nullable Object obj) { if (!(obj instanceof Card)) diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/v2/impl/TwitterCard.java b/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/v2/impl/TwitterCard.java index 28e24fa8..52011090 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/v2/impl/TwitterCard.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/api/twitter/v2/impl/TwitterCard.java @@ -68,6 +68,12 @@ public class TwitterCard implements Card { } + @Override + public String getBlurHash() { + return ""; + } + + @Override public boolean equals(@Nullable Object obj) { if (!(obj instanceof Card)) diff --git a/app/src/main/java/org/nuclearfog/twidda/model/Card.java b/app/src/main/java/org/nuclearfog/twidda/model/Card.java index 15a0a2a2..5daff891 100644 --- a/app/src/main/java/org/nuclearfog/twidda/model/Card.java +++ b/app/src/main/java/org/nuclearfog/twidda/model/Card.java @@ -28,4 +28,9 @@ public interface Card extends Serializable { * @return preview image link (may be empty) */ String getImageUrl(); + + /** + * @return blur hash string of the preview image + */ + String getBlurHash(); } \ No newline at end of file diff --git a/app/src/main/java/org/nuclearfog/twidda/ui/adapter/holder/CardHolder.java b/app/src/main/java/org/nuclearfog/twidda/ui/adapter/holder/CardHolder.java index 5a12f40e..caafbb4e 100644 --- a/app/src/main/java/org/nuclearfog/twidda/ui/adapter/holder/CardHolder.java +++ b/app/src/main/java/org/nuclearfog/twidda/ui/adapter/holder/CardHolder.java @@ -1,7 +1,9 @@ package org.nuclearfog.twidda.ui.adapter.holder; import android.content.res.Resources; +import android.graphics.Bitmap; import android.graphics.Typeface; +import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.text.SpannableStringBuilder; @@ -19,6 +21,8 @@ import androidx.recyclerview.widget.RecyclerView.ViewHolder; import com.squareup.picasso.MemoryPolicy; import com.squareup.picasso.NetworkPolicy; import com.squareup.picasso.Picasso; +import com.squareup.picasso.RequestCreator; +import com.wolt.blurhashkt.BlurHashDecoder; import org.nuclearfog.twidda.R; import org.nuclearfog.twidda.backend.image.PicassoBuilder; @@ -101,7 +105,14 @@ public class CardHolder extends ViewHolder implements OnClickListener { Drawable placeholder = new ColorDrawable(EMPTY_COLOR); // set url preview image if (settings.imagesEnabled() && !card.getImageUrl().isEmpty()) { - picasso.load(card.getImageUrl()).networkPolicy(NetworkPolicy.NO_STORE).memoryPolicy(MemoryPolicy.NO_STORE).placeholder(placeholder).into(preview); + RequestCreator picassoBuilder = picasso.load(card.getImageUrl()); + if (!card.getBlurHash().isEmpty()) { + Bitmap blur = BlurHashDecoder.INSTANCE.decode(card.getBlurHash(), 16, 16, 1f, true); + picassoBuilder.placeholder(new BitmapDrawable(preview.getResources(), blur)); + } else { + picassoBuilder.placeholder(placeholder); + } + picassoBuilder.networkPolicy(NetworkPolicy.NO_STORE).memoryPolicy(MemoryPolicy.NO_STORE).into(preview); } else { preview.setImageDrawable(placeholder); }