Fix a crash with fit preview images when aspect ratio is important

This commit is contained in:
Thomas 2025-07-27 18:17:37 +02:00
parent cd995da607
commit 8ff3566498

View file

@ -1631,11 +1631,12 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
holder.binding.card.setVisibility(View.GONE); holder.binding.card.setVisibility(View.GONE);
} }
if (measuredWidth <= 0 && statusToDeal.media_attachments != null && statusToDeal.media_attachments.size() > 0) { if (measuredWidth <= 0 && statusToDeal.media_attachments != null && statusToDeal.media_attachments.size() > 0) {
boolean finalFullAttachement = fullAttachement;
holder.binding.mediaContainer.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { holder.binding.mediaContainer.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override @Override
public void onGlobalLayout() { public void onGlobalLayout() {
holder.binding.mediaContainer.getViewTreeObserver().removeOnGlobalLayoutListener(this); holder.binding.mediaContainer.getViewTreeObserver().removeOnGlobalLayoutListener(this);
if (fullAttachement) { if (finalFullAttachement) {
measuredWidth = holder.binding.mediaContainer.getWidth(); measuredWidth = holder.binding.mediaContainer.getWidth();
} else { } else {
measuredWidth = holder.binding.media.mediaContainer.getWidth(); measuredWidth = holder.binding.media.mediaContainer.getWidth();
@ -1696,64 +1697,21 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
holder.binding.media.mediaContainer.setVisibility(View.VISIBLE); holder.binding.media.mediaContainer.setVisibility(View.VISIBLE);
int mediaPosition = 1; int mediaPosition = 1;
boolean autoplaygif = sharedpreferences.getBoolean(context.getString(R.string.SET_AUTO_PLAY_GIG_MEDIA), false); boolean autoplaygif = sharedpreferences.getBoolean(context.getString(R.string.SET_AUTO_PLAY_GIG_MEDIA), false);
if (!fullAttachement || statusToDeal.sensitive) {
int defaultHeight = (int) Helper.convertDpToPixel(300, context);
int orientation = context.getResources().getConfiguration().orientation;
if (orientation == Configuration.ORIENTATION_PORTRAIT && measuredWidth > 0) {
defaultHeight = (int) (measuredWidth * 3) / 4;
}
LinearLayoutCompat.LayoutParams lp = new LinearLayoutCompat.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, defaultHeight);
holder.binding.media.mediaContainer.setLayoutParams(lp);
if (statusToDeal.media_attachments.size() == 1) {
holder.binding.media.media1Container.setVisibility(View.VISIBLE);
holder.binding.media.media2Container.setVisibility(View.GONE);
holder.binding.media.media3Container.setVisibility(View.GONE);
holder.binding.media.media4Container.setVisibility(View.GONE);
holder.binding.media.moreMedia.setVisibility(View.GONE);
} else if (statusToDeal.media_attachments.size() == 2) {
holder.binding.media.media1Container.setVisibility(View.VISIBLE);
holder.binding.media.media2Container.setVisibility(View.VISIBLE);
holder.binding.media.media3Container.setVisibility(View.GONE);
holder.binding.media.media4Container.setVisibility(View.GONE);
holder.binding.media.moreMedia.setVisibility(View.GONE);
} else if (statusToDeal.media_attachments.size() == 3) {
holder.binding.media.media1Container.setVisibility(View.VISIBLE);
if (statusToDeal.media_attachments.get(0).meta != null && statusToDeal.media_attachments.get(0).meta.getSmall() != null && statusToDeal.media_attachments.get(0).meta.getSmall().width < statusToDeal.media_attachments.get(0).meta.getSmall().height) {
ConstraintSet constraintSet = new ConstraintSet();
constraintSet.clone(holder.binding.media.mediaContainer);
constraintSet.connect(holder.binding.media.media4Container.getId(), ConstraintSet.START, holder.binding.media.media1Container.getId(), ConstraintSet.END);
constraintSet.connect(holder.binding.media.media4Container.getId(), ConstraintSet.TOP, holder.binding.media.media2Container.getId(), ConstraintSet.BOTTOM);
constraintSet.applyTo(holder.binding.media.mediaContainer);
holder.binding.media.media2Container.setVisibility(View.VISIBLE);
holder.binding.media.media3Container.setVisibility(View.GONE);
} else {
ConstraintSet constraintSet = new ConstraintSet();
constraintSet.clone(holder.binding.media.mediaContainer);
constraintSet.connect(holder.binding.media.media4Container.getId(), ConstraintSet.START, holder.binding.media.media3Container.getId(), ConstraintSet.END);
constraintSet.connect(holder.binding.media.media4Container.getId(), ConstraintSet.TOP, holder.binding.media.media1Container.getId(), ConstraintSet.BOTTOM);
constraintSet.applyTo(holder.binding.media.mediaContainer);
holder.binding.media.media2Container.setVisibility(View.GONE);
holder.binding.media.media3Container.setVisibility(View.VISIBLE);
}
holder.binding.media.media4Container.setVisibility(View.VISIBLE);
holder.binding.media.moreMedia.setVisibility(View.GONE);
} else if (statusToDeal.media_attachments.size() == 4) {
holder.binding.media.media1Container.setVisibility(View.VISIBLE);
holder.binding.media.media2Container.setVisibility(View.VISIBLE);
holder.binding.media.media3Container.setVisibility(View.VISIBLE);
holder.binding.media.media4Container.setVisibility(View.VISIBLE);
holder.binding.media.moreMedia.setVisibility(View.GONE);
} else if (statusToDeal.media_attachments.size() > 4) {
holder.binding.media.media1Container.setVisibility(View.VISIBLE);
holder.binding.media.media2Container.setVisibility(View.VISIBLE);
holder.binding.media.media3Container.setVisibility(View.VISIBLE);
holder.binding.media.media4Container.setVisibility(View.VISIBLE);
holder.binding.media.moreMedia.setVisibility(View.VISIBLE);
holder.binding.media.moreMedia.setText(context.getString(R.string.more_media, "+" + (statusToDeal.media_attachments.size() - 4)));
}
}
for (Attachment attachment : statusToDeal.media_attachments) { for (Attachment attachment : statusToDeal.media_attachments) {
float ratio = 1.0f;
float mediaH = -1.0f;
float mediaW = -1.0f;
if (attachment.meta != null && attachment.meta.getSmall() != null) {
mediaH = attachment.meta.getSmall().height;
mediaW = attachment.meta.getSmall().width;
if (mediaW != 0) {
ratio = measuredWidth > 0 ? measuredWidth / mediaW : 1.0f;
}
}
if(ratio >= 5) {
fullAttachement = false;
}
LayoutMediaBinding layoutMediaBinding = LayoutMediaBinding.inflate(LayoutInflater.from(context)); LayoutMediaBinding layoutMediaBinding = LayoutMediaBinding.inflate(LayoutInflater.from(context));
if ((fullAttachement && (!statusToDeal.sensitive || expand_media))) { if ((fullAttachement && (!statusToDeal.sensitive || expand_media))) {
holder.binding.mediaContainer.addView(layoutMediaBinding.getRoot()); holder.binding.mediaContainer.addView(layoutMediaBinding.getRoot());
@ -1776,18 +1734,65 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
holder.binding.media.media4Container.addView(layoutMediaBinding.getRoot()); holder.binding.media.media4Container.addView(layoutMediaBinding.getRoot());
} }
} }
if (!fullAttachement || statusToDeal.sensitive) {
int defaultHeight = (int) Helper.convertDpToPixel(300, context);
int orientation = context.getResources().getConfiguration().orientation;
if (orientation == Configuration.ORIENTATION_PORTRAIT && measuredWidth > 0) {
defaultHeight = (int) (measuredWidth * 3) / 4;
}
LinearLayoutCompat.LayoutParams lp = new LinearLayoutCompat.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, defaultHeight);
holder.binding.media.mediaContainer.setLayoutParams(lp);
if (statusToDeal.media_attachments.size() == 1) {
holder.binding.media.media1Container.setVisibility(View.VISIBLE);
holder.binding.media.media2Container.setVisibility(View.GONE);
holder.binding.media.media3Container.setVisibility(View.GONE);
holder.binding.media.media4Container.setVisibility(View.GONE);
holder.binding.media.moreMedia.setVisibility(View.GONE);
} else if (statusToDeal.media_attachments.size() == 2) {
holder.binding.media.media1Container.setVisibility(View.VISIBLE);
holder.binding.media.media2Container.setVisibility(View.VISIBLE);
holder.binding.media.media3Container.setVisibility(View.GONE);
holder.binding.media.media4Container.setVisibility(View.GONE);
holder.binding.media.moreMedia.setVisibility(View.GONE);
} else if (statusToDeal.media_attachments.size() == 3) {
holder.binding.media.media1Container.setVisibility(View.VISIBLE);
if (statusToDeal.media_attachments.get(0).meta != null && statusToDeal.media_attachments.get(0).meta.getSmall() != null && statusToDeal.media_attachments.get(0).meta.getSmall().width < statusToDeal.media_attachments.get(0).meta.getSmall().height) {
ConstraintSet constraintSet = new ConstraintSet();
constraintSet.clone(holder.binding.media.mediaContainer);
constraintSet.connect(holder.binding.media.media4Container.getId(), ConstraintSet.START, holder.binding.media.media1Container.getId(), ConstraintSet.END);
constraintSet.connect(holder.binding.media.media4Container.getId(), ConstraintSet.TOP, holder.binding.media.media2Container.getId(), ConstraintSet.BOTTOM);
constraintSet.applyTo(holder.binding.media.mediaContainer);
holder.binding.media.media2Container.setVisibility(View.VISIBLE);
holder.binding.media.media3Container.setVisibility(View.GONE);
} else {
ConstraintSet constraintSet = new ConstraintSet();
constraintSet.clone(holder.binding.media.mediaContainer);
constraintSet.connect(holder.binding.media.media4Container.getId(), ConstraintSet.START, holder.binding.media.media3Container.getId(), ConstraintSet.END);
constraintSet.connect(holder.binding.media.media4Container.getId(), ConstraintSet.TOP, holder.binding.media.media1Container.getId(), ConstraintSet.BOTTOM);
constraintSet.applyTo(holder.binding.media.mediaContainer);
holder.binding.media.media2Container.setVisibility(View.GONE);
holder.binding.media.media3Container.setVisibility(View.VISIBLE);
}
holder.binding.media.media4Container.setVisibility(View.VISIBLE);
holder.binding.media.moreMedia.setVisibility(View.GONE);
} else if (statusToDeal.media_attachments.size() == 4) {
holder.binding.media.media1Container.setVisibility(View.VISIBLE);
holder.binding.media.media2Container.setVisibility(View.VISIBLE);
holder.binding.media.media3Container.setVisibility(View.VISIBLE);
holder.binding.media.media4Container.setVisibility(View.VISIBLE);
holder.binding.media.moreMedia.setVisibility(View.GONE);
} else if (statusToDeal.media_attachments.size() > 4) {
holder.binding.media.media1Container.setVisibility(View.VISIBLE);
holder.binding.media.media2Container.setVisibility(View.VISIBLE);
holder.binding.media.media3Container.setVisibility(View.VISIBLE);
holder.binding.media.media4Container.setVisibility(View.VISIBLE);
holder.binding.media.moreMedia.setVisibility(View.VISIBLE);
holder.binding.media.moreMedia.setText(context.getString(R.string.more_media, "+" + (statusToDeal.media_attachments.size() - 4)));
}
}
if (fullAttachement && (!statusToDeal.sensitive || expand_media)) { if (fullAttachement && (!statusToDeal.sensitive || expand_media)) {
float ratio = 1.0f;
float mediaH = -1.0f;
float mediaW = -1.0f;
if (attachment.meta != null && attachment.meta.getSmall() != null) {
mediaH = attachment.meta.getSmall().height;
mediaW = attachment.meta.getSmall().width;
if (mediaW != 0) {
ratio = measuredWidth > 0 ? measuredWidth / mediaW : 1.0f;
}
}
if (autoplaygif && attachment.type.equalsIgnoreCase("gifv") && mediaPosition == 1) { if (autoplaygif && attachment.type.equalsIgnoreCase("gifv") && mediaPosition == 1) {
layoutMediaBinding.media.setVisibility(View.GONE); layoutMediaBinding.media.setVisibility(View.GONE);
@ -2883,6 +2888,10 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
if (isArt) { if (isArt) {
fullAttachement = true; fullAttachement = true;
} }
float ratio = measuredWidth > 0 ? measuredWidth / mediaW : 1.0f;
if(ratio >= 5) {
fullAttachement = false;
}
boolean expand_media = sharedpreferences.getBoolean(context.getString(R.string.SET_EXPAND_MEDIA), false); boolean expand_media = sharedpreferences.getBoolean(context.getString(R.string.SET_EXPAND_MEDIA), false);
RequestBuilder<Drawable> requestBuilder; RequestBuilder<Drawable> requestBuilder;
GlideRequests glideRequests = GlideApp.with(context); GlideRequests glideRequests = GlideApp.with(context);
@ -2924,12 +2933,14 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
Status statusToDeal, Attachment attachment) { Status statusToDeal, Attachment attachment) {
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context);
final int timeout = sharedpreferences.getInt(context.getString(R.string.SET_NSFW_TIMEOUT), 5); final int timeout = sharedpreferences.getInt(context.getString(R.string.SET_NSFW_TIMEOUT), 5);
boolean fullAttachement = sharedpreferences.getBoolean(context.getString(R.string.SET_FULL_PREVIEW), false);
boolean long_press_media = sharedpreferences.getBoolean(context.getString(R.string.SET_LONG_PRESS_STORE_MEDIA), false); boolean long_press_media = sharedpreferences.getBoolean(context.getString(R.string.SET_LONG_PRESS_STORE_MEDIA), false);
boolean expand_media = sharedpreferences.getBoolean(context.getString(R.string.SET_EXPAND_MEDIA), false); boolean expand_media = sharedpreferences.getBoolean(context.getString(R.string.SET_EXPAND_MEDIA), false);
LinearLayout.LayoutParams lp; LinearLayout.LayoutParams lp;
boolean fullAttachement = sharedpreferences.getBoolean(context.getString(R.string.SET_FULL_PREVIEW), false);
if(ratio >= 5) {
fullAttachement = false;
}
if (fullAttachement && mediaH > 0 && (!statusToDeal.sensitive || expand_media)) { if (fullAttachement && mediaH > 0 && (!statusToDeal.sensitive || expand_media)) {
lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, (int) (mediaH * ratio)); lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, (int) (mediaH * ratio));
layoutMediaBinding.media.setScaleType(ImageView.ScaleType.FIT_CENTER); layoutMediaBinding.media.setScaleType(ImageView.ScaleType.FIT_CENTER);