Use blurhash for preview cards (#1960)
This commit is contained in:
parent
a1887d1891
commit
b885aa8f83
3 changed files with 30 additions and 8 deletions
|
@ -26,6 +26,7 @@ import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
import com.bumptech.glide.Glide;
|
import com.bumptech.glide.Glide;
|
||||||
|
import com.bumptech.glide.RequestBuilder;
|
||||||
import com.bumptech.glide.load.resource.bitmap.CenterCrop;
|
import com.bumptech.glide.load.resource.bitmap.CenterCrop;
|
||||||
import com.bumptech.glide.load.resource.bitmap.GranularRoundedCorners;
|
import com.bumptech.glide.load.resource.bitmap.GranularRoundedCorners;
|
||||||
import com.google.android.material.button.MaterialButton;
|
import com.google.android.material.button.MaterialButton;
|
||||||
|
@ -734,7 +735,7 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cardView != null) {
|
if (cardView != null) {
|
||||||
setupCard(status, statusDisplayOptions.cardViewMode());
|
setupCard(status, statusDisplayOptions.cardViewMode(), statusDisplayOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
setupButtons(listener, status.getSenderId(), status.getContent().toString(),
|
setupButtons(listener, status.getSenderId(), status.getContent().toString(),
|
||||||
|
@ -977,7 +978,7 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
|
||||||
return pollDescription.getContext().getString(R.string.poll_info_format, votesText, pollDurationInfo);
|
return pollDescription.getContext().getString(R.string.poll_info_format, votesText, pollDurationInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void setupCard(StatusViewData.Concrete status, CardViewMode cardViewMode) {
|
protected void setupCard(StatusViewData.Concrete status, CardViewMode cardViewMode, StatusDisplayOptions statusDisplayOptions) {
|
||||||
if (cardViewMode != CardViewMode.NONE &&
|
if (cardViewMode != CardViewMode.NONE &&
|
||||||
status.getAttachments().size() == 0 &&
|
status.getAttachments().size() == 0 &&
|
||||||
status.getCard() != null &&
|
status.getCard() != null &&
|
||||||
|
@ -999,7 +1000,10 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
|
||||||
|
|
||||||
cardUrl.setText(card.getUrl());
|
cardUrl.setText(card.getUrl());
|
||||||
|
|
||||||
if (!TextUtils.isEmpty(card.getImage())) {
|
// Statuses from other activitypub sources can be marked sensitive even if there's no media,
|
||||||
|
// so let's blur the preview in that case
|
||||||
|
// If media previews are disabled, show placeholder for cards as well
|
||||||
|
if (statusDisplayOptions.mediaPreviewEnabled() && !status.isSensitive() && !TextUtils.isEmpty(card.getImage())) {
|
||||||
|
|
||||||
int topLeftRadius = 0;
|
int topLeftRadius = 0;
|
||||||
int topRightRadius = 0;
|
int topRightRadius = 0;
|
||||||
|
@ -1030,14 +1034,31 @@ public abstract class StatusBaseViewHolder extends RecyclerView.ViewHolder {
|
||||||
bottomLeftRadius = radius;
|
bottomLeftRadius = radius;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RequestBuilder<Drawable> builder = Glide.with(cardImage).load(card.getImage());
|
||||||
Glide.with(cardImage)
|
if (statusDisplayOptions.useBlurhash() && !TextUtils.isEmpty(card.getBlurhash())) {
|
||||||
.load(card.getImage())
|
builder = builder.placeholder(decodeBlurHash(card.getBlurhash()));
|
||||||
.transform(
|
}
|
||||||
|
builder.transform(
|
||||||
new CenterCrop(),
|
new CenterCrop(),
|
||||||
new GranularRoundedCorners(topLeftRadius, topRightRadius, bottomRightRadius, bottomLeftRadius)
|
new GranularRoundedCorners(topLeftRadius, topRightRadius, bottomRightRadius, bottomLeftRadius)
|
||||||
)
|
)
|
||||||
.into(cardImage);
|
.into(cardImage);
|
||||||
|
} else if (statusDisplayOptions.useBlurhash() && !TextUtils.isEmpty(card.getBlurhash())) {
|
||||||
|
int radius = cardImage.getContext().getResources()
|
||||||
|
.getDimensionPixelSize(R.dimen.card_radius);
|
||||||
|
|
||||||
|
cardView.setOrientation(LinearLayout.HORIZONTAL);
|
||||||
|
cardImage.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT;
|
||||||
|
cardImage.getLayoutParams().width = cardImage.getContext().getResources()
|
||||||
|
.getDimensionPixelSize(R.dimen.card_image_horizontal_width);
|
||||||
|
cardInfo.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT;
|
||||||
|
cardInfo.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT;
|
||||||
|
Glide.with(cardImage).load(decodeBlurHash(card.getBlurhash()))
|
||||||
|
.transform(
|
||||||
|
new CenterCrop(),
|
||||||
|
new GranularRoundedCorners(radius, 0, 0, radius)
|
||||||
|
)
|
||||||
|
.into(cardImage);
|
||||||
} else {
|
} else {
|
||||||
cardView.setOrientation(LinearLayout.HORIZONTAL);
|
cardView.setOrientation(LinearLayout.HORIZONTAL);
|
||||||
cardImage.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT;
|
cardImage.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT;
|
||||||
|
|
|
@ -106,7 +106,7 @@ class StatusDetailedViewHolder extends StatusBaseViewHolder {
|
||||||
StatusDisplayOptions statusDisplayOptions,
|
StatusDisplayOptions statusDisplayOptions,
|
||||||
@Nullable Object payloads) {
|
@Nullable Object payloads) {
|
||||||
super.setupWithStatus(status, listener, statusDisplayOptions, payloads);
|
super.setupWithStatus(status, listener, statusDisplayOptions, payloads);
|
||||||
setupCard(status, CardViewMode.FULL_WIDTH); // Always show card for detailed status
|
setupCard(status, CardViewMode.FULL_WIDTH, statusDisplayOptions); // Always show card for detailed status
|
||||||
if (payloads == null) {
|
if (payloads == null) {
|
||||||
setReblogAndFavCount(status.getReblogsCount(), status.getFavouritesCount(), listener);
|
setReblogAndFavCount(status.getReblogsCount(), status.getFavouritesCount(), listener);
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,8 @@ data class Card(
|
||||||
val image: String,
|
val image: String,
|
||||||
val type: String,
|
val type: String,
|
||||||
val width: Int,
|
val width: Int,
|
||||||
val height: Int
|
val height: Int,
|
||||||
|
val blurhash: String?
|
||||||
) {
|
) {
|
||||||
|
|
||||||
override fun hashCode(): Int {
|
override fun hashCode(): Int {
|
||||||
|
|
Loading…
Reference in a new issue