feature: Display post that's being quoted on Akkoma (#927)
* Displaying Akkoma quote status * Dummy display items for quote posts * Only remove quote-inline with RE: * fix null reference (reply-to instead of quote status) * fix text bottom padding in quote * Postprocess status quote * fix rounded bottom for quoted media closes sk22#929 --------- Co-authored-by: sk <sk22@mailbox.org>
This commit is contained in:
@@ -47,6 +47,7 @@ import org.joinmastodon.android.ui.displayitems.TextStatusDisplayItem;
|
|||||||
import org.joinmastodon.android.ui.displayitems.WarningFilteredStatusDisplayItem;
|
import org.joinmastodon.android.ui.displayitems.WarningFilteredStatusDisplayItem;
|
||||||
import org.joinmastodon.android.ui.photoviewer.PhotoViewer;
|
import org.joinmastodon.android.ui.photoviewer.PhotoViewer;
|
||||||
import org.joinmastodon.android.ui.photoviewer.PhotoViewerHost;
|
import org.joinmastodon.android.ui.photoviewer.PhotoViewerHost;
|
||||||
|
import org.joinmastodon.android.ui.utils.InsetStatusItemDecoration;
|
||||||
import org.joinmastodon.android.ui.utils.MediaAttachmentViewController;
|
import org.joinmastodon.android.ui.utils.MediaAttachmentViewController;
|
||||||
import org.joinmastodon.android.ui.utils.UiUtils;
|
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||||
import org.joinmastodon.android.utils.ProvidesAssistContent;
|
import org.joinmastodon.android.utils.ProvidesAssistContent;
|
||||||
@@ -358,6 +359,7 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
list.addItemDecoration(new StatusListItemDecoration());
|
list.addItemDecoration(new StatusListItemDecoration());
|
||||||
|
list.addItemDecoration(new InsetStatusItemDecoration(this));
|
||||||
((UsableRecyclerView)list).setSelectorBoundsProvider(new UsableRecyclerView.SelectorBoundsProvider(){
|
((UsableRecyclerView)list).setSelectorBoundsProvider(new UsableRecyclerView.SelectorBoundsProvider(){
|
||||||
private Rect tmpRect=new Rect();
|
private Rect tmpRect=new Rect();
|
||||||
@Override
|
@Override
|
||||||
@@ -565,7 +567,8 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
|
|||||||
|
|
||||||
public void onRevealSpoilerClick(SpoilerStatusDisplayItem.Holder holder){
|
public void onRevealSpoilerClick(SpoilerStatusDisplayItem.Holder holder){
|
||||||
Status status=holder.getItem().status;
|
Status status=holder.getItem().status;
|
||||||
toggleSpoiler(status, holder.getItemID());
|
boolean isForQuote=holder.getItem().isForQuote;
|
||||||
|
toggleSpoiler(status, isForQuote, holder.getItemID());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onVisibilityIconClick(HeaderStatusDisplayItem.Holder holder) {
|
public void onVisibilityIconClick(HeaderStatusDisplayItem.Holder holder) {
|
||||||
@@ -587,15 +590,16 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
|
|||||||
else notifyItemChangedBefore(holder.getItem(), HeaderStatusDisplayItem.class);
|
else notifyItemChangedBefore(holder.getItem(), HeaderStatusDisplayItem.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void toggleSpoiler(Status status, String itemID){
|
protected void toggleSpoiler(Status status, boolean isForQuote, String itemID){
|
||||||
status.spoilerRevealed=!status.spoilerRevealed;
|
status.spoilerRevealed=!status.spoilerRevealed;
|
||||||
if (!status.spoilerRevealed && !AccountSessionManager.get(accountID).getLocalPreferences().revealCWs)
|
if (!status.spoilerRevealed && !AccountSessionManager.get(accountID).getLocalPreferences().revealCWs)
|
||||||
status.sensitiveRevealed = false;
|
status.sensitiveRevealed = false;
|
||||||
|
|
||||||
SpoilerStatusDisplayItem.Holder spoiler=findHolderOfType(itemID, SpoilerStatusDisplayItem.Holder.class);
|
List<SpoilerStatusDisplayItem.Holder> spoilers=findAllHoldersOfType(itemID, SpoilerStatusDisplayItem.Holder.class);
|
||||||
|
SpoilerStatusDisplayItem.Holder spoiler=spoilers.size() > 1 && isForQuote ? spoilers.get(1) : spoilers.get(0);
|
||||||
if(spoiler!=null) spoiler.rebind();
|
if(spoiler!=null) spoiler.rebind();
|
||||||
else notifyItemChanged(itemID, SpoilerStatusDisplayItem.class);
|
else notifyItemChanged(itemID, SpoilerStatusDisplayItem.class);
|
||||||
SpoilerStatusDisplayItem spoilerItem=Objects.requireNonNull(findItemOfType(itemID, SpoilerStatusDisplayItem.class));
|
SpoilerStatusDisplayItem spoilerItem=Objects.requireNonNull(spoiler.getItem());
|
||||||
|
|
||||||
int index=displayItems.indexOf(spoilerItem);
|
int index=displayItems.indexOf(spoilerItem);
|
||||||
if(status.spoilerRevealed){
|
if(status.spoilerRevealed){
|
||||||
|
|||||||
@@ -736,7 +736,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
|||||||
String prefix = (GlobalUserPreferences.prefixReplies == ALWAYS
|
String prefix = (GlobalUserPreferences.prefixReplies == ALWAYS
|
||||||
|| (GlobalUserPreferences.prefixReplies == TO_OTHERS && !ownID.equals(status.account.id)))
|
|| (GlobalUserPreferences.prefixReplies == TO_OTHERS && !ownID.equals(status.account.id)))
|
||||||
&& !status.spoilerText.startsWith("re: ") ? "re: " : "";
|
&& !status.spoilerText.startsWith("re: ") ? "re: " : "";
|
||||||
spoilerEdit.setText(prefix + replyTo.spoilerText);
|
spoilerEdit.setText(prefix + status.spoilerText);
|
||||||
spoilerBtn.setSelected(true);
|
spoilerBtn.setSelected(true);
|
||||||
}
|
}
|
||||||
if (status.language != null && !status.language.isEmpty()) setPostLanguage(status.language);
|
if (status.language != null && !status.language.isEmpty()) setPostLanguage(status.language);
|
||||||
|
|||||||
@@ -174,7 +174,6 @@ public class NotificationsListFragment extends BaseStatusListFragment<Notificati
|
|||||||
@Override
|
@Override
|
||||||
public void onViewCreated(View view, Bundle savedInstanceState){
|
public void onViewCreated(View view, Bundle savedInstanceState){
|
||||||
super.onViewCreated(view, savedInstanceState);
|
super.onViewCreated(view, savedInstanceState);
|
||||||
list.addItemDecoration(new InsetStatusItemDecoration(this));
|
|
||||||
list.addItemDecoration(new RecyclerView.ItemDecoration(){
|
list.addItemDecoration(new RecyclerView.ItemDecoration(){
|
||||||
private Paint paint=new Paint();
|
private Paint paint=new Paint();
|
||||||
private Rect tmpRect=new Rect();
|
private Rect tmpRect=new Rect();
|
||||||
|
|||||||
@@ -158,12 +158,6 @@ public class StatusEditHistoryFragment extends StatusListFragment{
|
|||||||
return items;
|
return items;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onViewCreated(View view, Bundle savedInstanceState){
|
|
||||||
super.onViewCreated(view, savedInstanceState);
|
|
||||||
list.addItemDecoration(new InsetStatusItemDecoration(this));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isItemEnabled(String id){
|
public boolean isItemEnabled(String id){
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -60,6 +60,7 @@ public class ThreadFragment extends StatusListFragment implements ProvidesAssist
|
|||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
mainStatus=Parcels.unwrap(getArguments().getParcelable("status"));
|
mainStatus=Parcels.unwrap(getArguments().getParcelable("status"));
|
||||||
Account inReplyToAccount=Parcels.unwrap(getArguments().getParcelable("inReplyToAccount"));
|
Account inReplyToAccount=Parcels.unwrap(getArguments().getParcelable("inReplyToAccount"));
|
||||||
|
refreshing=contextInitiallyRendered=getArguments().getBoolean("refresh", false);
|
||||||
if(inReplyToAccount!=null)
|
if(inReplyToAccount!=null)
|
||||||
knownAccounts.put(inReplyToAccount.id, inReplyToAccount);
|
knownAccounts.put(inReplyToAccount.id, inReplyToAccount);
|
||||||
data.add(mainStatus);
|
data.add(mainStatus);
|
||||||
|
|||||||
@@ -124,6 +124,8 @@ public class Status extends BaseModel implements DisplayItemsParent, Searchable{
|
|||||||
if(filtered!=null)
|
if(filtered!=null)
|
||||||
for(FilterResult fr:filtered)
|
for(FilterResult fr:filtered)
|
||||||
fr.postprocess();
|
fr.postprocess();
|
||||||
|
if(quote!=null)
|
||||||
|
quote.postprocess();
|
||||||
|
|
||||||
spoilerRevealed=!hasSpoiler();
|
spoilerRevealed=!hasSpoiler();
|
||||||
if(!spoilerRevealed) sensitive=true;
|
if(!spoilerRevealed) sensitive=true;
|
||||||
|
|||||||
@@ -32,7 +32,6 @@ import me.grishka.appkit.imageloader.requests.UrlImageLoaderRequest;
|
|||||||
import me.grishka.appkit.utils.V;
|
import me.grishka.appkit.utils.V;
|
||||||
|
|
||||||
public class AudioStatusDisplayItem extends StatusDisplayItem{
|
public class AudioStatusDisplayItem extends StatusDisplayItem{
|
||||||
public final Status status;
|
|
||||||
public final Attachment attachment;
|
public final Attachment attachment;
|
||||||
private final ImageLoaderRequest imageRequest;
|
private final ImageLoaderRequest imageRequest;
|
||||||
|
|
||||||
|
|||||||
@@ -58,7 +58,6 @@ import me.grishka.appkit.utils.V;
|
|||||||
import me.grishka.appkit.views.UsableRecyclerView;
|
import me.grishka.appkit.views.UsableRecyclerView;
|
||||||
|
|
||||||
public class EmojiReactionsStatusDisplayItem extends StatusDisplayItem {
|
public class EmojiReactionsStatusDisplayItem extends StatusDisplayItem {
|
||||||
public final Status status;
|
|
||||||
private final Drawable placeholder;
|
private final Drawable placeholder;
|
||||||
private final boolean hideEmpty, forAnnouncement, playGifs;
|
private final boolean hideEmpty, forAnnouncement, playGifs;
|
||||||
private final String accountID;
|
private final String accountID;
|
||||||
|
|||||||
@@ -36,7 +36,6 @@ import androidx.annotation.PluralsRes;
|
|||||||
import me.grishka.appkit.Nav;
|
import me.grishka.appkit.Nav;
|
||||||
|
|
||||||
public class ExtendedFooterStatusDisplayItem extends StatusDisplayItem{
|
public class ExtendedFooterStatusDisplayItem extends StatusDisplayItem{
|
||||||
public final Status status;
|
|
||||||
public final String accountID;
|
public final String accountID;
|
||||||
|
|
||||||
private static final DateTimeFormatter TIME_FORMATTER=DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG, FormatStyle.SHORT);
|
private static final DateTimeFormatter TIME_FORMATTER=DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG, FormatStyle.SHORT);
|
||||||
|
|||||||
@@ -38,7 +38,6 @@ import me.grishka.appkit.utils.CubicBezierInterpolator;
|
|||||||
import me.grishka.appkit.utils.V;
|
import me.grishka.appkit.utils.V;
|
||||||
|
|
||||||
public class FooterStatusDisplayItem extends StatusDisplayItem{
|
public class FooterStatusDisplayItem extends StatusDisplayItem{
|
||||||
public final Status status;
|
|
||||||
private final String accountID;
|
private final String accountID;
|
||||||
public boolean hideCounts;
|
public boolean hideCounts;
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ import me.grishka.appkit.utils.V;
|
|||||||
|
|
||||||
public class GapStatusDisplayItem extends StatusDisplayItem{
|
public class GapStatusDisplayItem extends StatusDisplayItem{
|
||||||
public boolean loading;
|
public boolean loading;
|
||||||
private final Status status;
|
|
||||||
|
|
||||||
public GapStatusDisplayItem(String parentID, BaseStatusListFragment<?> parentFragment, Status status){
|
public GapStatusDisplayItem(String parentID, BaseStatusListFragment<?> parentFragment, Status status){
|
||||||
super(parentID, parentFragment);
|
super(parentID, parentFragment);
|
||||||
|
|||||||
@@ -76,7 +76,6 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
|
|||||||
private String accountID;
|
private String accountID;
|
||||||
private CustomEmojiHelper emojiHelper=new CustomEmojiHelper();
|
private CustomEmojiHelper emojiHelper=new CustomEmojiHelper();
|
||||||
private SpannableStringBuilder parsedName;
|
private SpannableStringBuilder parsedName;
|
||||||
public final Status status;
|
|
||||||
public boolean hasVisibilityToggle;
|
public boolean hasVisibilityToggle;
|
||||||
boolean needBottomPadding;
|
boolean needBottomPadding;
|
||||||
private CharSequence extraText;
|
private CharSequence extraText;
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ import me.grishka.appkit.imageloader.requests.UrlImageLoaderRequest;
|
|||||||
import me.grishka.appkit.utils.V;
|
import me.grishka.appkit.utils.V;
|
||||||
|
|
||||||
public class LinkCardStatusDisplayItem extends StatusDisplayItem{
|
public class LinkCardStatusDisplayItem extends StatusDisplayItem{
|
||||||
private final Status status;
|
|
||||||
private final UrlImageLoaderRequest imgRequest;
|
private final UrlImageLoaderRequest imgRequest;
|
||||||
|
|
||||||
public LinkCardStatusDisplayItem(String parentID, BaseStatusListFragment parentFragment, Status status){
|
public LinkCardStatusDisplayItem(String parentID, BaseStatusListFragment parentFragment, Status status){
|
||||||
|
|||||||
@@ -61,7 +61,6 @@ public class MediaGridStatusDisplayItem extends StatusDisplayItem{
|
|||||||
private final List<Attachment> attachments;
|
private final List<Attachment> attachments;
|
||||||
private final Map<String, Pair<String, String>> translatedAttachments = new HashMap<>();
|
private final Map<String, Pair<String, String>> translatedAttachments = new HashMap<>();
|
||||||
private final ArrayList<ImageLoaderRequest> requests=new ArrayList<>();
|
private final ArrayList<ImageLoaderRequest> requests=new ArrayList<>();
|
||||||
public final Status status;
|
|
||||||
public String sensitiveTitle;
|
public String sensitiveTitle;
|
||||||
|
|
||||||
public MediaGridStatusDisplayItem(String parentID, BaseStatusListFragment<?> parentFragment, PhotoLayoutHelper.TiledLayoutResult tiledLayout, List<Attachment> attachments, Status status){
|
public MediaGridStatusDisplayItem(String parentID, BaseStatusListFragment<?> parentFragment, PhotoLayoutHelper.TiledLayoutResult tiledLayout, List<Attachment> attachments, Status status){
|
||||||
|
|||||||
@@ -43,7 +43,6 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{
|
|||||||
public boolean needBottomPadding;
|
public boolean needBottomPadding;
|
||||||
ReblogOrReplyLineStatusDisplayItem extra;
|
ReblogOrReplyLineStatusDisplayItem extra;
|
||||||
CharSequence fullText;
|
CharSequence fullText;
|
||||||
Status status;
|
|
||||||
|
|
||||||
public ReblogOrReplyLineStatusDisplayItem(String parentID, BaseStatusListFragment parentFragment, CharSequence text, List<Emoji> emojis, @DrawableRes int icon, StatusPrivacy visibility, @Nullable View.OnClickListener handleClick, Status status) {
|
public ReblogOrReplyLineStatusDisplayItem(String parentID, BaseStatusListFragment parentFragment, CharSequence text, List<Emoji> emojis, @DrawableRes int icon, StatusPrivacy visibility, @Nullable View.OnClickListener handleClick, Status status) {
|
||||||
this(parentID, parentFragment, text, emojis, icon, visibility, handleClick, text, status);
|
this(parentID, parentFragment, text, emojis, icon, visibility, handleClick, text, status);
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ import me.grishka.appkit.imageloader.ImageLoaderViewHolder;
|
|||||||
import me.grishka.appkit.imageloader.requests.ImageLoaderRequest;
|
import me.grishka.appkit.imageloader.requests.ImageLoaderRequest;
|
||||||
|
|
||||||
public class SpoilerStatusDisplayItem extends StatusDisplayItem{
|
public class SpoilerStatusDisplayItem extends StatusDisplayItem{
|
||||||
public final Status status;
|
|
||||||
public final ArrayList<StatusDisplayItem> contentItems=new ArrayList<>();
|
public final ArrayList<StatusDisplayItem> contentItems=new ArrayList<>();
|
||||||
private final CharSequence parsedTitle;
|
private final CharSequence parsedTitle;
|
||||||
private CharSequence translatedTitle;
|
private CharSequence translatedTitle;
|
||||||
|
|||||||
@@ -58,13 +58,15 @@ import me.grishka.appkit.views.UsableRecyclerView;
|
|||||||
public abstract class StatusDisplayItem{
|
public abstract class StatusDisplayItem{
|
||||||
public final String parentID;
|
public final String parentID;
|
||||||
public final BaseStatusListFragment<?> parentFragment;
|
public final BaseStatusListFragment<?> parentFragment;
|
||||||
|
public Status status;
|
||||||
public boolean inset;
|
public boolean inset;
|
||||||
public int index;
|
public int index;
|
||||||
public boolean
|
public boolean
|
||||||
hasDescendantNeighbor=false,
|
hasDescendantNeighbor=false,
|
||||||
hasAncestoringNeighbor=false,
|
hasAncestoringNeighbor=false,
|
||||||
isMainStatus=true,
|
isMainStatus=true,
|
||||||
isDirectDescendant=false;
|
isDirectDescendant=false,
|
||||||
|
isForQuote=false;
|
||||||
|
|
||||||
public static final int FLAG_INSET=1;
|
public static final int FLAG_INSET=1;
|
||||||
public static final int FLAG_NO_FOOTER=1 << 1;
|
public static final int FLAG_NO_FOOTER=1 << 1;
|
||||||
@@ -73,6 +75,7 @@ public abstract class StatusDisplayItem{
|
|||||||
public static final int FLAG_NO_HEADER=1 << 4;
|
public static final int FLAG_NO_HEADER=1 << 4;
|
||||||
public static final int FLAG_NO_TRANSLATE=1 << 5;
|
public static final int FLAG_NO_TRANSLATE=1 << 5;
|
||||||
public static final int FLAG_NO_EMOJI_REACTIONS=1 << 6;
|
public static final int FLAG_NO_EMOJI_REACTIONS=1 << 6;
|
||||||
|
public static final int FLAG_IS_FOR_QUOTE=1 << 7;
|
||||||
|
|
||||||
public void setAncestryInfo(
|
public void setAncestryInfo(
|
||||||
boolean hasDescendantNeighbor,
|
boolean hasDescendantNeighbor,
|
||||||
@@ -232,20 +235,21 @@ public abstract class StatusDisplayItem{
|
|||||||
if(statusForContent.hasSpoiler()){
|
if(statusForContent.hasSpoiler()){
|
||||||
if (AccountSessionManager.get(accountID).getLocalPreferences().revealCWs) statusForContent.spoilerRevealed = true;
|
if (AccountSessionManager.get(accountID).getLocalPreferences().revealCWs) statusForContent.spoilerRevealed = true;
|
||||||
SpoilerStatusDisplayItem spoilerItem=new SpoilerStatusDisplayItem(parentID, fragment, null, statusForContent, Type.SPOILER);
|
SpoilerStatusDisplayItem spoilerItem=new SpoilerStatusDisplayItem(parentID, fragment, null, statusForContent, Type.SPOILER);
|
||||||
|
if((flags & FLAG_IS_FOR_QUOTE)!=0){
|
||||||
|
for(StatusDisplayItem item:spoilerItem.contentItems){
|
||||||
|
item.isForQuote=true;
|
||||||
|
}
|
||||||
|
}
|
||||||
items.add(spoilerItem);
|
items.add(spoilerItem);
|
||||||
contentItems=spoilerItem.contentItems;
|
contentItems=spoilerItem.contentItems;
|
||||||
}else{
|
}else{
|
||||||
contentItems=items;
|
contentItems=items;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (statusForContent.quote != null) {
|
if(statusForContent.quote!=null) {
|
||||||
boolean hasQuoteInlineTag = statusForContent.content.contains("<span class=\"quote-inline\">");
|
int quoteInlineIndex=statusForContent.content.lastIndexOf("<span class=\"quote-inline\"><br/><br/>RE:");
|
||||||
if (!hasQuoteInlineTag) {
|
if (quoteInlineIndex!=-1)
|
||||||
String quoteUrl = statusForContent.quote.url;
|
statusForContent.content=statusForContent.content.substring(0, quoteInlineIndex);
|
||||||
String quoteInline = String.format("<span class=\"quote-inline\">%sRE: <a href=\"%s\">%s</a></span>",
|
|
||||||
statusForContent.content.endsWith("</p>") ? "" : "<br/><br/>", quoteUrl, quoteUrl);
|
|
||||||
statusForContent.content += quoteInline;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean hasSpoiler=!TextUtils.isEmpty(statusForContent.spoilerText);
|
boolean hasSpoiler=!TextUtils.isEmpty(statusForContent.spoilerText);
|
||||||
@@ -287,15 +291,21 @@ public abstract class StatusDisplayItem{
|
|||||||
if(statusForContent.poll!=null){
|
if(statusForContent.poll!=null){
|
||||||
buildPollItems(parentID, fragment, statusForContent.poll, status, contentItems);
|
buildPollItems(parentID, fragment, statusForContent.poll, status, contentItems);
|
||||||
}
|
}
|
||||||
if(statusForContent.card!=null && statusForContent.mediaAttachments.isEmpty()){
|
if(statusForContent.card!=null && statusForContent.mediaAttachments.isEmpty() && statusForContent.quote==null){
|
||||||
contentItems.add(new LinkCardStatusDisplayItem(parentID, fragment, statusForContent));
|
contentItems.add(new LinkCardStatusDisplayItem(parentID, fragment, statusForContent));
|
||||||
}
|
}
|
||||||
|
if(statusForContent.quote!=null && !(parentObject instanceof Notification)){
|
||||||
|
if(!statusForContent.mediaAttachments.isEmpty() && statusForContent.poll==null) // add spacing if immediately preceded by attachment
|
||||||
|
contentItems.add(new DummyStatusDisplayItem(parentID, fragment));
|
||||||
|
contentItems.addAll(buildItems(fragment, statusForContent.quote, accountID, parentObject, knownAccounts, filterContext, FLAG_NO_FOOTER | FLAG_INSET | FLAG_NO_EMOJI_REACTIONS | FLAG_IS_FOR_QUOTE));
|
||||||
|
}
|
||||||
if(contentItems!=items && statusForContent.spoilerRevealed){
|
if(contentItems!=items && statusForContent.spoilerRevealed){
|
||||||
items.addAll(contentItems);
|
items.addAll(contentItems);
|
||||||
}
|
}
|
||||||
AccountLocalPreferences lp=fragment.getLocalPrefs();
|
AccountLocalPreferences lp=fragment.getLocalPrefs();
|
||||||
if((flags & FLAG_NO_EMOJI_REACTIONS)==0 && lp.emojiReactionsEnabled &&
|
if((flags & FLAG_NO_EMOJI_REACTIONS)==0 && lp.emojiReactionsEnabled &&
|
||||||
(lp.showEmojiReactions!=ONLY_OPENED || fragment instanceof ThreadFragment)){
|
(lp.showEmojiReactions!=ONLY_OPENED || fragment instanceof ThreadFragment) &&
|
||||||
|
statusForContent.reactions!=null){
|
||||||
boolean isMainStatus=fragment instanceof ThreadFragment t && t.getMainStatus().id.equals(statusForContent.id);
|
boolean isMainStatus=fragment instanceof ThreadFragment t && t.getMainStatus().id.equals(statusForContent.id);
|
||||||
boolean showAddButton=lp.showEmojiReactions==ALWAYS || isMainStatus;
|
boolean showAddButton=lp.showEmojiReactions==ALWAYS || isMainStatus;
|
||||||
items.add(new EmojiReactionsStatusDisplayItem(parentID, fragment, statusForContent, accountID, !showAddButton, false));
|
items.add(new EmojiReactionsStatusDisplayItem(parentID, fragment, statusForContent, accountID, !showAddButton, false));
|
||||||
@@ -307,8 +317,9 @@ public abstract class StatusDisplayItem{
|
|||||||
items.add(footer);
|
items.add(footer);
|
||||||
}
|
}
|
||||||
boolean inset=(flags & FLAG_INSET)!=0;
|
boolean inset=(flags & FLAG_INSET)!=0;
|
||||||
|
boolean isForQuote=(flags & FLAG_IS_FOR_QUOTE)!=0;
|
||||||
// add inset dummy so last content item doesn't clip out of inset bounds
|
// add inset dummy so last content item doesn't clip out of inset bounds
|
||||||
if((inset || footer==null) && (flags & FLAG_CHECKABLE)==0){
|
if((inset || footer==null) && (flags & FLAG_CHECKABLE)==0 && !isForQuote){
|
||||||
items.add(new DummyStatusDisplayItem(parentID, fragment));
|
items.add(new DummyStatusDisplayItem(parentID, fragment));
|
||||||
// in case we ever need the dummy to display a margin for the media grid again:
|
// in case we ever need the dummy to display a margin for the media grid again:
|
||||||
// (i forgot why we apparently don't need this anymore)
|
// (i forgot why we apparently don't need this anymore)
|
||||||
@@ -320,12 +331,22 @@ public abstract class StatusDisplayItem{
|
|||||||
items.add(gap=new GapStatusDisplayItem(parentID, fragment, status));
|
items.add(gap=new GapStatusDisplayItem(parentID, fragment, status));
|
||||||
int i=1;
|
int i=1;
|
||||||
for(StatusDisplayItem item:items){
|
for(StatusDisplayItem item:items){
|
||||||
item.inset=inset;
|
if(inset)
|
||||||
|
item.inset=true;
|
||||||
|
if(isForQuote){
|
||||||
|
item.status=statusForContent;
|
||||||
|
item.isForQuote=true;
|
||||||
|
}
|
||||||
item.index=i++;
|
item.index=i++;
|
||||||
}
|
}
|
||||||
if(items!=contentItems && !statusForContent.spoilerRevealed){
|
if(items!=contentItems && !statusForContent.spoilerRevealed){
|
||||||
for(StatusDisplayItem item:contentItems){
|
for(StatusDisplayItem item:contentItems){
|
||||||
item.inset=inset;
|
if(inset)
|
||||||
|
item.inset=true;
|
||||||
|
if(isForQuote){
|
||||||
|
item.status=statusForContent;
|
||||||
|
item.isForQuote=true;
|
||||||
|
}
|
||||||
item.index=i++;
|
item.index=i++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -375,12 +396,15 @@ public abstract class StatusDisplayItem{
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static abstract class Holder<T extends StatusDisplayItem> extends BindableViewHolder<T> implements UsableRecyclerView.DisableableClickable{
|
public static abstract class Holder<T extends StatusDisplayItem> extends BindableViewHolder<T> implements UsableRecyclerView.DisableableClickable{
|
||||||
|
private Context context;
|
||||||
|
|
||||||
public Holder(View itemView){
|
public Holder(View itemView){
|
||||||
super(itemView);
|
super(itemView);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Holder(Context context, int layout, ViewGroup parent){
|
public Holder(Context context, int layout, ViewGroup parent){
|
||||||
super(context, layout, parent);
|
super(context, layout, parent);
|
||||||
|
this.context=context;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getItemID(){
|
public String getItemID(){
|
||||||
@@ -389,6 +413,16 @@ public abstract class StatusDisplayItem{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onClick(){
|
public void onClick(){
|
||||||
|
if(item.isForQuote){
|
||||||
|
item.status.filterRevealed=true;
|
||||||
|
Bundle args=new Bundle();
|
||||||
|
args.putString("account", item.parentFragment.getAccountID());
|
||||||
|
args.putParcelable("status", Parcels.wrap(item.status.clone()));
|
||||||
|
args.putBoolean("refresh", true);
|
||||||
|
Nav.go((Activity) context, ThreadFragment.class, args);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
item.parentFragment.onItemClick(item.parentID);
|
item.parentFragment.onItemClick(item.parentID);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -420,13 +454,13 @@ public abstract class StatusDisplayItem{
|
|||||||
|
|
||||||
public boolean isLastDisplayItemForStatus(){
|
public boolean isLastDisplayItemForStatus(){
|
||||||
return getNextVisibleDisplayItem()
|
return getNextVisibleDisplayItem()
|
||||||
.map(n->!n.parentID.equals(item.parentID))
|
.map(next->!next.parentID.equals(item.parentID) || item.inset && !next.inset)
|
||||||
.orElse(true);
|
.orElse(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isEnabled(){
|
public boolean isEnabled(){
|
||||||
return item.parentFragment.isItemEnabled(item.parentID);
|
return item.parentFragment.isItemEnabled(item.parentID) || item.isForQuote;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,7 +39,6 @@ public class TextStatusDisplayItem extends StatusDisplayItem{
|
|||||||
public boolean textSelectable;
|
public boolean textSelectable;
|
||||||
public boolean reduceTopPadding;
|
public boolean reduceTopPadding;
|
||||||
public boolean disableTranslate;
|
public boolean disableTranslate;
|
||||||
public final Status status;
|
|
||||||
|
|
||||||
public TextStatusDisplayItem(String parentID, CharSequence text, BaseStatusListFragment parentFragment, Status status, boolean disableTranslate){
|
public TextStatusDisplayItem(String parentID, CharSequence text, BaseStatusListFragment parentFragment, Status status, boolean disableTranslate){
|
||||||
super(parentID, parentFragment);
|
super(parentID, parentFragment);
|
||||||
@@ -113,7 +112,7 @@ public class TextStatusDisplayItem extends StatusDisplayItem{
|
|||||||
text.setText(item.text);
|
text.setText(item.text);
|
||||||
}
|
}
|
||||||
text.setTextIsSelectable(false);
|
text.setTextIsSelectable(false);
|
||||||
if(item.textSelectable) itemView.post(() -> text.setTextIsSelectable(true));
|
if(item.textSelectable && !item.isForQuote) itemView.post(() -> text.setTextIsSelectable(true));
|
||||||
text.setInvalidateOnEveryFrame(false);
|
text.setInvalidateOnEveryFrame(false);
|
||||||
itemView.setClickable(false);
|
itemView.setClickable(false);
|
||||||
itemView.setPadding(itemView.getPaddingLeft(), item.reduceTopPadding ? V.dp(6) : V.dp(12), itemView.getPaddingRight(), itemView.getPaddingBottom());
|
itemView.setPadding(itemView.getPaddingLeft(), item.reduceTopPadding ? V.dp(6) : V.dp(12), itemView.getPaddingRight(), itemView.getPaddingBottom());
|
||||||
@@ -124,8 +123,8 @@ public class TextStatusDisplayItem extends StatusDisplayItem{
|
|||||||
|
|
||||||
StatusDisplayItem next=getNextVisibleDisplayItem().orElse(null);
|
StatusDisplayItem next=getNextVisibleDisplayItem().orElse(null);
|
||||||
if(next!=null && !next.parentID.equals(item.parentID)) next=null;
|
if(next!=null && !next.parentID.equals(item.parentID)) next=null;
|
||||||
int bottomPadding=next instanceof FooterStatusDisplayItem ? V.dp(6)
|
int bottomPadding=item.inset ? V.dp(12)
|
||||||
: item.inset ? V.dp(12)
|
: next instanceof FooterStatusDisplayItem ? V.dp(6)
|
||||||
: (next instanceof EmojiReactionsStatusDisplayItem || next==null) ? 0
|
: (next instanceof EmojiReactionsStatusDisplayItem || next==null) ? 0
|
||||||
: V.dp(12);
|
: V.dp(12);
|
||||||
itemView.setPadding(itemView.getPaddingLeft(), itemView.getPaddingTop(), itemView.getPaddingRight(), bottomPadding);
|
itemView.setPadding(itemView.getPaddingLeft(), itemView.getPaddingTop(), itemView.getPaddingRight(), bottomPadding);
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ import java.util.List;
|
|||||||
|
|
||||||
public class WarningFilteredStatusDisplayItem extends StatusDisplayItem{
|
public class WarningFilteredStatusDisplayItem extends StatusDisplayItem{
|
||||||
public boolean loading;
|
public boolean loading;
|
||||||
public final Status status;
|
|
||||||
public List<StatusDisplayItem> filteredItems;
|
public List<StatusDisplayItem> filteredItems;
|
||||||
public LegacyFilter applyingFilter;
|
public LegacyFilter applyingFilter;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user