diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java index 7ec3873d4..140f28df5 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java @@ -494,7 +494,7 @@ public abstract class BaseStatusListFragment exten spoilerFooterIndex=spoilerItem.contentItems.indexOf(pollItems.get(pollItems.size()-1)); } pollItems.clear(); - StatusDisplayItem.buildPollItems(itemID, this, poll, pollItems); + StatusDisplayItem.buildPollItems(itemID, this, poll, status, pollItems); if(spoilerItem!=null){ spoilerItem.contentItems.subList(spoilerFirstOptionIndex, spoilerFooterIndex+1).clear(); spoilerItem.contentItems.addAll(spoilerFirstOptionIndex, pollItems); @@ -859,13 +859,7 @@ public abstract class BaseStatusListFragment exten return; status.translation=result; status.translationState=Status.TranslationState.SHOWN; - TextStatusDisplayItem.Holder text=findHolderOfType(itemID, TextStatusDisplayItem.Holder.class); - if(text!=null){ - text.updateTranslation(true); - imgLoader.bindViewHolder((ImageLoaderRecyclerAdapter) list.getAdapter(), text, text.getAbsoluteAdapterPosition()); - }else{ - notifyItemChanged(itemID, TextStatusDisplayItem.class); - } + updateTranslation(itemID); } @Override @@ -873,12 +867,7 @@ public abstract class BaseStatusListFragment exten if(getActivity()==null) return; status.translationState=Status.TranslationState.HIDDEN; - TextStatusDisplayItem.Holder text=findHolderOfType(itemID, TextStatusDisplayItem.Holder.class); - if(text!=null){ - text.updateTranslation(true); - }else{ - notifyItemChanged(itemID, TextStatusDisplayItem.class); - } + updateTranslation(itemID); new M3AlertDialogBuilder(getActivity()) .setTitle(R.string.error) .setMessage(R.string.translation_failed) @@ -890,6 +879,10 @@ public abstract class BaseStatusListFragment exten } } } + updateTranslation(itemID); + } + + private void updateTranslation(String itemID) { TextStatusDisplayItem.Holder text=findHolderOfType(itemID, TextStatusDisplayItem.Holder.class); if(text!=null){ text.updateTranslation(true); @@ -897,6 +890,22 @@ public abstract class BaseStatusListFragment exten }else{ notifyItemChanged(itemID, TextStatusDisplayItem.class); } + + SpoilerStatusDisplayItem.Holder spoiler=findHolderOfType(itemID, SpoilerStatusDisplayItem.Holder.class); + if(spoiler!=null){ + spoiler.rebind(); + } + + MediaGridStatusDisplayItem.Holder media=findHolderOfType(itemID, MediaGridStatusDisplayItem.Holder.class); + if (media!=null) { + media.rebind(); + } + + for(int i=0;i viewPool; private final List attachments; + private final Map> translatedAttachments = new HashMap<>(); private final ArrayList requests=new ArrayList<>(); public final Status status; public String sensitiveTitle; @@ -189,6 +197,25 @@ public class MediaGridStatusDisplayItem extends StatusDisplayItem{ c.btnsWrap.setAlpha(1f); } controllers.add(c); + + if (item.status.translation != null){ + if(item.status.translationState==Status.TranslationState.SHOWN){ + if(!item.translatedAttachments.containsKey(att.id)){ + Optional translatedAttachment=Arrays.stream(item.status.translation.mediaAttachments).filter(mediaAttachment->mediaAttachment.id.equals(att.id)).findFirst(); + translatedAttachment.ifPresent(mediaAttachment->{ + item.translatedAttachments.put(mediaAttachment.id, new Pair<>(att.description, mediaAttachment.description)); + att.description=mediaAttachment.description; + }); + }else{ + //SAFETY: must be non-null, as we check if the map contains the attachment before + att.description=Objects.requireNonNull(item.translatedAttachments.get(att.id)).second; + } + }else{ + if (item.translatedAttachments.containsKey(att.id)) { + att.description=Objects.requireNonNull(item.translatedAttachments.get(att.id)).first; + } + } + } c.bind(att, item.status); i++; } diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/PollOptionStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/PollOptionStatusDisplayItem.java index a1eae6f99..3a875b06c 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/PollOptionStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/PollOptionStatusDisplayItem.java @@ -11,6 +11,7 @@ import android.widget.TextView; import org.joinmastodon.android.R; import org.joinmastodon.android.fragments.BaseStatusListFragment; import org.joinmastodon.android.model.Poll; +import org.joinmastodon.android.model.Status; import org.joinmastodon.android.ui.OutlineProviders; import org.joinmastodon.android.ui.text.HtmlParser; import org.joinmastodon.android.ui.utils.CustomEmojiHelper; @@ -23,6 +24,7 @@ import me.grishka.appkit.imageloader.requests.ImageLoaderRequest; public class PollOptionStatusDisplayItem extends StatusDisplayItem{ private CharSequence text; + private CharSequence translatedText; public final Poll.Option option; private CustomEmojiHelper emojiHelper=new CustomEmojiHelper(); private boolean showResults; @@ -30,12 +32,15 @@ public class PollOptionStatusDisplayItem extends StatusDisplayItem{ private boolean isMostVoted; private final int optionIndex; public final Poll poll; + public final Status status; - public PollOptionStatusDisplayItem(String parentID, Poll poll, int optionIndex, BaseStatusListFragment parentFragment){ + + public PollOptionStatusDisplayItem(String parentID, Poll poll, int optionIndex, BaseStatusListFragment parentFragment, Status status){ super(parentID, parentFragment); this.optionIndex=optionIndex; option=poll.options.get(optionIndex); this.poll=poll; + this.status=status; text=HtmlParser.parseCustomEmoji(option.title, poll.emojis); emojiHelper.setText(text); showResults=poll.isExpired() || poll.voted; @@ -84,7 +89,14 @@ public class PollOptionStatusDisplayItem extends StatusDisplayItem{ @Override public void onBind(PollOptionStatusDisplayItem item){ - text.setText(item.text); + if (item.status.translation != null && item.status.translationState == Status.TranslationState.SHOWN) { + if(item.translatedText==null){ + item.translatedText=item.status.translation.poll.options[item.optionIndex].title; + } + text.setText(item.translatedText); + } else { + text.setText(item.text); + } percent.setVisibility(item.showResults ? View.VISIBLE : View.GONE); itemView.setClickable(!item.showResults); icon.setImageDrawable(itemView.getContext().getDrawable(item.poll.multiple ? diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/SpoilerStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/SpoilerStatusDisplayItem.java index 722bd5c49..e8feadaae 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/SpoilerStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/SpoilerStatusDisplayItem.java @@ -27,6 +27,7 @@ public class SpoilerStatusDisplayItem extends StatusDisplayItem{ public final Status status; public final ArrayList contentItems=new ArrayList<>(); private final CharSequence parsedTitle; + private CharSequence translatedTitle; private final CustomEmojiHelper emojiHelper; private final Type type; private final int attachmentCount; @@ -90,7 +91,14 @@ public class SpoilerStatusDisplayItem extends StatusDisplayItem{ @Override public void onBind(SpoilerStatusDisplayItem item){ - title.setText(item.parsedTitle); + if(item.status.translationState==Status.TranslationState.SHOWN){ + if(item.translatedTitle==null){ + item.translatedTitle=item.status.translation.spoilerText; + } + title.setText(item.translatedTitle); + }else{ + title.setText(item.parsedTitle); + } action.setText(item.status.spoilerRevealed ? R.string.spoiler_hide : R.string.sk_spoiler_show); itemView.setPadding( itemView.getPaddingLeft(), diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java index 9b5995f2d..6791ebdbc 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java @@ -285,7 +285,7 @@ public abstract class StatusDisplayItem{ } } if(statusForContent.poll!=null){ - buildPollItems(parentID, fragment, statusForContent.poll, contentItems); + buildPollItems(parentID, fragment, statusForContent.poll, status, contentItems); } if(statusForContent.card!=null && statusForContent.mediaAttachments.isEmpty()){ contentItems.add(new LinkCardStatusDisplayItem(parentID, fragment, statusForContent)); @@ -339,10 +339,10 @@ public abstract class StatusDisplayItem{ ); } - public static void buildPollItems(String parentID, BaseStatusListFragment fragment, Poll poll, List items){ + public static void buildPollItems(String parentID, BaseStatusListFragment fragment, Poll poll, Status status, List items){ int i=0; for(Poll.Option opt:poll.options){ - items.add(new PollOptionStatusDisplayItem(parentID, poll, i, fragment)); + items.add(new PollOptionStatusDisplayItem(parentID, poll, i, fragment, status)); i++; } items.add(new PollFooterStatusDisplayItem(parentID, fragment, poll));