Merge remote-tracking branch 'megalodon_main/main'
# Conflicts: # mastodon/src/main/java/org/joinmastodon/android/api/session/AccountLocalPreferences.java # mastodon/src/main/java/org/joinmastodon/android/fragments/StatusListFragment.java
This commit is contained in:
@@ -11,13 +11,11 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class CreateStatus extends MastodonAPIRequest<Status>{
|
public class CreateStatus extends MastodonAPIRequest<Status>{
|
||||||
public static final Instant DRAFTS_AFTER_INSTANT = Instant.ofEpochMilli(253370764799999L) /* end of 9998 */;
|
public static long EPOCH_OF_THE_YEAR_FIVE_THOUSAND=95617584000000L;
|
||||||
private static final float draftFactor = 31536000000f /* one year */ / 253370764799999f /* end of 9998 */;
|
public static final Instant DRAFTS_AFTER_INSTANT=Instant.ofEpochMilli(EPOCH_OF_THE_YEAR_FIVE_THOUSAND - 1) /* end of 4999 */;
|
||||||
|
|
||||||
public static Instant getDraftInstant() {
|
public static Instant getDraftInstant() {
|
||||||
// returns an instant between 9999-01-01 00:00:00 and 9999-12-31 23:59:59
|
return DRAFTS_AFTER_INSTANT.plusMillis(System.currentTimeMillis());
|
||||||
// yes, this is a weird implementation for something that hardly matters
|
|
||||||
return DRAFTS_AFTER_INSTANT.plusMillis(1 + (long) (System.currentTimeMillis() * draftFactor));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public CreateStatus(CreateStatus.Request req, String uuid){
|
public CreateStatus(CreateStatus.Request req, String uuid){
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ public class AccountLocalPreferences{
|
|||||||
public boolean keepOnlyLatestNotification;
|
public boolean keepOnlyLatestNotification;
|
||||||
|
|
||||||
public boolean emojiReactionsEnabled;
|
public boolean emojiReactionsEnabled;
|
||||||
public boolean showEmojiReactionsInLists;
|
public boolean emojiReactionsInTimelines;
|
||||||
|
|
||||||
private final static Type recentLanguagesType = new TypeToken<ArrayList<String>>() {}.getType();
|
private final static Type recentLanguagesType = new TypeToken<ArrayList<String>>() {}.getType();
|
||||||
private final static Type timelinesType = new TypeToken<ArrayList<TimelineDefinition>>() {}.getType();
|
private final static Type timelinesType = new TypeToken<ArrayList<TimelineDefinition>>() {}.getType();
|
||||||
@@ -73,7 +73,7 @@ public class AccountLocalPreferences{
|
|||||||
timelineReplyVisibility=prefs.getString("timelineReplyVisibility", null);
|
timelineReplyVisibility=prefs.getString("timelineReplyVisibility", null);
|
||||||
keepOnlyLatestNotification=prefs.getBoolean("keepOnlyLatestNotification", false);
|
keepOnlyLatestNotification=prefs.getBoolean("keepOnlyLatestNotification", false);
|
||||||
emojiReactionsEnabled=prefs.getBoolean("emojiReactionsEnabled", session.getInstance().isPresent() && session.getInstance().get().isAkkoma());
|
emojiReactionsEnabled=prefs.getBoolean("emojiReactionsEnabled", session.getInstance().isPresent() && session.getInstance().get().isAkkoma());
|
||||||
showEmojiReactionsInLists=prefs.getBoolean("showEmojiReactionsInLists", false);
|
emojiReactionsInTimelines=prefs.getBoolean("emojiReactionsInTimelines", true);
|
||||||
|
|
||||||
// MOSHIDON
|
// MOSHIDON
|
||||||
recentEmojis=fromJson(prefs.getString("recentEmojis", "{}"), recentEmojisType, new HashMap<>());
|
recentEmojis=fromJson(prefs.getString("recentEmojis", "{}"), recentEmojisType, new HashMap<>());
|
||||||
@@ -109,7 +109,7 @@ public class AccountLocalPreferences{
|
|||||||
.putString("timelineReplyVisibility", timelineReplyVisibility)
|
.putString("timelineReplyVisibility", timelineReplyVisibility)
|
||||||
.putBoolean("keepOnlyLatestNotification", keepOnlyLatestNotification)
|
.putBoolean("keepOnlyLatestNotification", keepOnlyLatestNotification)
|
||||||
.putBoolean("emojiReactionsEnabled", emojiReactionsEnabled)
|
.putBoolean("emojiReactionsEnabled", emojiReactionsEnabled)
|
||||||
.putBoolean("showEmojiReactionsInLists", showEmojiReactionsInLists)
|
.putBoolean("emojiReactionsInTimelines", emojiReactionsInTimelines)
|
||||||
|
|
||||||
// MOSHIDON
|
// MOSHIDON
|
||||||
.putString("recentEmojis", gson.toJson(recentEmojis))
|
.putString("recentEmojis", gson.toJson(recentEmojis))
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
package org.joinmastodon.android.events;
|
||||||
|
|
||||||
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
import org.joinmastodon.android.model.EmojiReaction;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class EmojiReactionsUpdatedEvent{
|
||||||
|
public final String id;
|
||||||
|
public final List<EmojiReaction> reactions;
|
||||||
|
public final boolean updateTextPadding;
|
||||||
|
public RecyclerView.ViewHolder viewHolder;
|
||||||
|
|
||||||
|
public EmojiReactionsUpdatedEvent(String id, List<EmojiReaction> reactions, boolean updateTextPadding, RecyclerView.ViewHolder viewHolder){
|
||||||
|
this.id=id;
|
||||||
|
this.reactions=reactions;
|
||||||
|
this.updateTextPadding=updateTextPadding;
|
||||||
|
this.viewHolder=viewHolder;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,27 +1,14 @@
|
|||||||
package org.joinmastodon.android.events;
|
package org.joinmastodon.android.events;
|
||||||
|
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
|
||||||
|
|
||||||
import org.joinmastodon.android.api.CacheController;
|
|
||||||
import org.joinmastodon.android.model.EmojiReaction;
|
|
||||||
import org.joinmastodon.android.model.Status;
|
import org.joinmastodon.android.model.Status;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class StatusCountersUpdatedEvent{
|
public class StatusCountersUpdatedEvent{
|
||||||
public String id;
|
public String id;
|
||||||
public long favorites, reblogs, replies;
|
public long favorites, reblogs, replies;
|
||||||
public boolean favorited, reblogged, bookmarked, pinned;
|
public boolean favorited, reblogged, bookmarked, pinned;
|
||||||
public List<EmojiReaction> reactions;
|
|
||||||
public Status status;
|
public Status status;
|
||||||
public RecyclerView.ViewHolder viewHolder;
|
|
||||||
|
|
||||||
public StatusCountersUpdatedEvent(Status s){
|
public StatusCountersUpdatedEvent(Status s){
|
||||||
this(s, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public StatusCountersUpdatedEvent(Status s, RecyclerView.ViewHolder vh){
|
|
||||||
id=s.id;
|
id=s.id;
|
||||||
status=s;
|
status=s;
|
||||||
favorites=s.favouritesCount;
|
favorites=s.favouritesCount;
|
||||||
@@ -31,7 +18,5 @@ public class StatusCountersUpdatedEvent{
|
|||||||
reblogged=s.reblogged;
|
reblogged=s.reblogged;
|
||||||
bookmarked=s.bookmarked;
|
bookmarked=s.bookmarked;
|
||||||
pinned=s.pinned;
|
pinned=s.pinned;
|
||||||
reactions=new ArrayList<>(s.reactions);
|
|
||||||
viewHolder=vh;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import org.joinmastodon.android.E;
|
|||||||
import org.joinmastodon.android.GlobalUserPreferences;
|
import org.joinmastodon.android.GlobalUserPreferences;
|
||||||
import org.joinmastodon.android.R;
|
import org.joinmastodon.android.R;
|
||||||
import org.joinmastodon.android.api.session.AccountSessionManager;
|
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||||
|
import org.joinmastodon.android.events.EmojiReactionsUpdatedEvent;
|
||||||
import org.joinmastodon.android.events.PollUpdatedEvent;
|
import org.joinmastodon.android.events.PollUpdatedEvent;
|
||||||
import org.joinmastodon.android.events.RemoveAccountPostsEvent;
|
import org.joinmastodon.android.events.RemoveAccountPostsEvent;
|
||||||
import org.joinmastodon.android.events.StatusCountersUpdatedEvent;
|
import org.joinmastodon.android.events.StatusCountersUpdatedEvent;
|
||||||
@@ -27,6 +28,7 @@ import org.joinmastodon.android.ui.displayitems.ExtendedFooterStatusDisplayItem;
|
|||||||
import org.joinmastodon.android.ui.displayitems.FooterStatusDisplayItem;
|
import org.joinmastodon.android.ui.displayitems.FooterStatusDisplayItem;
|
||||||
import org.joinmastodon.android.ui.displayitems.NotificationHeaderStatusDisplayItem;
|
import org.joinmastodon.android.ui.displayitems.NotificationHeaderStatusDisplayItem;
|
||||||
import org.joinmastodon.android.ui.displayitems.StatusDisplayItem;
|
import org.joinmastodon.android.ui.displayitems.StatusDisplayItem;
|
||||||
|
import org.joinmastodon.android.ui.displayitems.TextStatusDisplayItem;
|
||||||
import org.joinmastodon.android.ui.utils.DiscoverInfoBannerHelper;
|
import org.joinmastodon.android.ui.utils.DiscoverInfoBannerHelper;
|
||||||
import org.joinmastodon.android.ui.utils.InsetStatusItemDecoration;
|
import org.joinmastodon.android.ui.utils.InsetStatusItemDecoration;
|
||||||
import org.joinmastodon.android.ui.utils.UiUtils;
|
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||||
@@ -43,7 +45,6 @@ import androidx.annotation.NonNull;
|
|||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import me.grishka.appkit.api.SimpleCallback;
|
import me.grishka.appkit.api.SimpleCallback;
|
||||||
import me.grishka.appkit.utils.MergeRecyclerAdapter;
|
import me.grishka.appkit.utils.MergeRecyclerAdapter;
|
||||||
import me.grishka.appkit.views.FragmentRootLinearLayout;
|
|
||||||
|
|
||||||
public class NotificationsListFragment extends BaseStatusListFragment<Notification> {
|
public class NotificationsListFragment extends BaseStatusListFragment<Notification> {
|
||||||
private boolean onlyMentions;
|
private boolean onlyMentions;
|
||||||
@@ -102,8 +103,6 @@ public class NotificationsListFragment extends BaseStatusListFragment<Notificati
|
|||||||
int flags=titleItem==null ? 0 : (StatusDisplayItem.FLAG_NO_FOOTER | StatusDisplayItem.FLAG_INSET | StatusDisplayItem.FLAG_NO_EMOJI_REACTIONS); // | StatusDisplayItem.FLAG_NO_HEADER);
|
int flags=titleItem==null ? 0 : (StatusDisplayItem.FLAG_NO_FOOTER | StatusDisplayItem.FLAG_INSET | StatusDisplayItem.FLAG_NO_EMOJI_REACTIONS); // | StatusDisplayItem.FLAG_NO_HEADER);
|
||||||
if (GlobalUserPreferences.spectatorMode)
|
if (GlobalUserPreferences.spectatorMode)
|
||||||
flags |= StatusDisplayItem.FLAG_NO_FOOTER;
|
flags |= StatusDisplayItem.FLAG_NO_FOOTER;
|
||||||
if (!getLocalPrefs().showEmojiReactionsInLists)
|
|
||||||
flags |= StatusDisplayItem.FLAG_NO_EMOJI_REACTIONS;
|
|
||||||
ArrayList<StatusDisplayItem> items=StatusDisplayItem.buildItems(this, n.status, accountID, n, knownAccounts, null, flags);
|
ArrayList<StatusDisplayItem> items=StatusDisplayItem.buildItems(this, n.status, accountID, n, knownAccounts, null, flags);
|
||||||
if(titleItem!=null)
|
if(titleItem!=null)
|
||||||
items.add(0, titleItem);
|
items.add(0, titleItem);
|
||||||
@@ -258,8 +257,6 @@ public class NotificationsListFragment extends BaseStatusListFragment<Notificati
|
|||||||
footer.rebind();
|
footer.rebind();
|
||||||
}else if(holder instanceof ExtendedFooterStatusDisplayItem.Holder footer && footer.getItem().status==n.status.getContentStatus()){
|
}else if(holder instanceof ExtendedFooterStatusDisplayItem.Holder footer && footer.getItem().status==n.status.getContentStatus()){
|
||||||
footer.rebind();
|
footer.rebind();
|
||||||
}else if(holder instanceof EmojiReactionsStatusDisplayItem.Holder reactions && ev.viewHolder!=holder){
|
|
||||||
reactions.rebind();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -273,6 +270,30 @@ public class NotificationsListFragment extends BaseStatusListFragment<Notificati
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
public void onEmojiReactionsChanged(EmojiReactionsUpdatedEvent ev){
|
||||||
|
for(Notification n : data){
|
||||||
|
if(n.status.getContentStatus().id.equals(ev.id)){
|
||||||
|
n.status.getContentStatus().update(ev);
|
||||||
|
AccountSessionManager.get(accountID).getCacheController().updateNotification(n);
|
||||||
|
for(int i=0; i<list.getChildCount(); i++){
|
||||||
|
RecyclerView.ViewHolder holder=list.getChildViewHolder(list.getChildAt(i));
|
||||||
|
if(holder instanceof EmojiReactionsStatusDisplayItem.Holder reactions && reactions.getItem().status==n.status.getContentStatus() && ev.viewHolder!=holder){
|
||||||
|
reactions.rebind();
|
||||||
|
}else if(holder instanceof TextStatusDisplayItem.Holder text && text.getItem().parentID.equals(n.getID())){
|
||||||
|
text.rebind();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(Notification n : preloadedData){
|
||||||
|
if(n.status.getContentStatus().id.equals(ev.id)){
|
||||||
|
n.status.getContentStatus().update(ev);
|
||||||
|
AccountSessionManager.get(accountID).getCacheController().updateNotification(n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Subscribe
|
@Subscribe
|
||||||
public void onRemoveAccountPostsEvent(RemoveAccountPostsEvent ev){
|
public void onRemoveAccountPostsEvent(RemoveAccountPostsEvent ev){
|
||||||
if(!ev.accountID.equals(accountID) || ev.isUnfollow)
|
if(!ev.accountID.equals(accountID) || ev.isUnfollow)
|
||||||
|
|||||||
@@ -81,7 +81,10 @@ public class ScheduledStatusListFragment extends BaseStatusListFragment<Schedule
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected List<StatusDisplayItem> buildDisplayItems(ScheduledStatus s) {
|
protected List<StatusDisplayItem> buildDisplayItems(ScheduledStatus s) {
|
||||||
return StatusDisplayItem.buildItems(this, s.toStatus(), accountID, s, knownAccounts, false, false, false, true, null);
|
return StatusDisplayItem.buildItems(this, s.toStatus(), accountID, s, knownAccounts, null,
|
||||||
|
StatusDisplayItem.FLAG_NO_EMOJI_REACTIONS |
|
||||||
|
StatusDisplayItem.FLAG_NO_FOOTER |
|
||||||
|
StatusDisplayItem.FLAG_NO_TRANSLATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import com.squareup.otto.Subscribe;
|
|||||||
import org.joinmastodon.android.E;
|
import org.joinmastodon.android.E;
|
||||||
import org.joinmastodon.android.GlobalUserPreferences;
|
import org.joinmastodon.android.GlobalUserPreferences;
|
||||||
import org.joinmastodon.android.api.session.AccountSessionManager;
|
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||||
|
import org.joinmastodon.android.events.EmojiReactionsUpdatedEvent;
|
||||||
import org.joinmastodon.android.MainActivity;
|
import org.joinmastodon.android.MainActivity;
|
||||||
import org.joinmastodon.android.events.PollUpdatedEvent;
|
import org.joinmastodon.android.events.PollUpdatedEvent;
|
||||||
import org.joinmastodon.android.events.RemoveAccountPostsEvent;
|
import org.joinmastodon.android.events.RemoveAccountPostsEvent;
|
||||||
@@ -21,6 +22,7 @@ import org.joinmastodon.android.ui.displayitems.EmojiReactionsStatusDisplayItem;
|
|||||||
import org.joinmastodon.android.ui.displayitems.ExtendedFooterStatusDisplayItem;
|
import org.joinmastodon.android.ui.displayitems.ExtendedFooterStatusDisplayItem;
|
||||||
import org.joinmastodon.android.ui.displayitems.FooterStatusDisplayItem;
|
import org.joinmastodon.android.ui.displayitems.FooterStatusDisplayItem;
|
||||||
import org.joinmastodon.android.ui.displayitems.StatusDisplayItem;
|
import org.joinmastodon.android.ui.displayitems.StatusDisplayItem;
|
||||||
|
import org.joinmastodon.android.ui.displayitems.TextStatusDisplayItem;
|
||||||
import org.joinmastodon.android.ui.utils.UiUtils;
|
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||||
import org.parceler.Parcels;
|
import org.parceler.Parcels;
|
||||||
|
|
||||||
@@ -40,7 +42,7 @@ public abstract class StatusListFragment extends BaseStatusListFragment<Status>
|
|||||||
int flags = 0;
|
int flags = 0;
|
||||||
if (GlobalUserPreferences.spectatorMode)
|
if (GlobalUserPreferences.spectatorMode)
|
||||||
flags |= StatusDisplayItem.FLAG_NO_FOOTER;
|
flags |= StatusDisplayItem.FLAG_NO_FOOTER;
|
||||||
if (!getLocalPrefs().showEmojiReactionsInLists)
|
if (!getLocalPrefs().emojiReactionsInTimelines)
|
||||||
flags |= StatusDisplayItem.FLAG_NO_EMOJI_REACTIONS;
|
flags |= StatusDisplayItem.FLAG_NO_EMOJI_REACTIONS;
|
||||||
return StatusDisplayItem.buildItems(this, s, accountID, s, knownAccounts, getFilterContext(), isMainThreadStatus ? 0 : flags);
|
return StatusDisplayItem.buildItems(this, s, accountID, s, knownAccounts, getFilterContext(), isMainThreadStatus ? 0 : flags);
|
||||||
}
|
}
|
||||||
@@ -237,8 +239,30 @@ public abstract class StatusListFragment extends BaseStatusListFragment<Status>
|
|||||||
footer.rebind();
|
footer.rebind();
|
||||||
}else if(holder instanceof ExtendedFooterStatusDisplayItem.Holder footer && footer.getItem().status==s.getContentStatus()){
|
}else if(holder instanceof ExtendedFooterStatusDisplayItem.Holder footer && footer.getItem().status==s.getContentStatus()){
|
||||||
footer.rebind();
|
footer.rebind();
|
||||||
}else if(holder instanceof EmojiReactionsStatusDisplayItem.Holder reactions && reactions.getItem().status==s.getContentStatus() && ev.viewHolder!=holder){
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(Status s:preloadedData){
|
||||||
|
if(s.getContentStatus().id.equals(ev.id)){
|
||||||
|
s.getContentStatus().update(ev);
|
||||||
|
AccountSessionManager.get(accountID).getCacheController().updateStatus(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
public void onEmojiReactionsChanged(EmojiReactionsUpdatedEvent ev){
|
||||||
|
for(Status s:data){
|
||||||
|
if(s.getContentStatus().id.equals(ev.id)){
|
||||||
|
s.getContentStatus().update(ev);
|
||||||
|
AccountSessionManager.get(accountID).getCacheController().updateStatus(s);
|
||||||
|
for(int i=0;i<list.getChildCount();i++){
|
||||||
|
RecyclerView.ViewHolder holder=list.getChildViewHolder(list.getChildAt(i));
|
||||||
|
if(holder instanceof EmojiReactionsStatusDisplayItem.Holder reactions && reactions.getItem().status==s.getContentStatus() && ev.viewHolder!=holder){
|
||||||
reactions.rebind();
|
reactions.rebind();
|
||||||
|
}else if(holder instanceof TextStatusDisplayItem.Holder text && text.getItem().parentID.equals(s.getID())){
|
||||||
|
text.rebind();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ public class SearchFragment extends BaseStatusListFragment<SearchResult>{
|
|||||||
return switch(s.type){
|
return switch(s.type){
|
||||||
case ACCOUNT -> Collections.singletonList(new AccountStatusDisplayItem(s.id, this, s.account));
|
case ACCOUNT -> Collections.singletonList(new AccountStatusDisplayItem(s.id, this, s.account));
|
||||||
case HASHTAG -> Collections.singletonList(new HashtagStatusDisplayItem(s.id, this, s.hashtag));
|
case HASHTAG -> Collections.singletonList(new HashtagStatusDisplayItem(s.id, this, s.hashtag));
|
||||||
case STATUS -> StatusDisplayItem.buildItems(this, s.status, accountID, s, knownAccounts, FilterContext.PUBLIC, !getLocalPrefs().showEmojiReactionsInLists ? StatusDisplayItem.FLAG_NO_EMOJI_REACTIONS : 0);
|
case STATUS -> StatusDisplayItem.buildItems(this, s.status, accountID, s, knownAccounts, FilterContext.PUBLIC, 0);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import java.util.List;
|
|||||||
import me.grishka.appkit.Nav;
|
import me.grishka.appkit.Nav;
|
||||||
|
|
||||||
public class SettingsInstanceFragment extends BaseSettingsFragment<Void> implements HasAccountID{
|
public class SettingsInstanceFragment extends BaseSettingsFragment<Void> implements HasAccountID{
|
||||||
private CheckableListItem<Void> contentTypesItem, emojiReactionsItem, emojiReactionsInListsItem, localOnlyItem, glitchModeItem;
|
private CheckableListItem<Void> contentTypesItem, emojiReactionsItem, emojiReactionsInTimelinesItem, localOnlyItem, glitchModeItem;
|
||||||
private ListItem<Void> defaultContentTypeItem;
|
private ListItem<Void> defaultContentTypeItem;
|
||||||
private AccountLocalPreferences lp;
|
private AccountLocalPreferences lp;
|
||||||
|
|
||||||
@@ -35,16 +35,16 @@ public class SettingsInstanceFragment extends BaseSettingsFragment<Void> impleme
|
|||||||
new ListItem<>(R.string.sk_settings_posting, 0, R.drawable.ic_fluent_open_24_regular, ()->UiUtils.launchWebBrowser(getActivity(), "https://"+s.domain+"/settings/preferences/other")),
|
new ListItem<>(R.string.sk_settings_posting, 0, R.drawable.ic_fluent_open_24_regular, ()->UiUtils.launchWebBrowser(getActivity(), "https://"+s.domain+"/settings/preferences/other")),
|
||||||
new ListItem<>(R.string.sk_settings_auth, 0, R.drawable.ic_fluent_open_24_regular, ()->UiUtils.launchWebBrowser(getActivity(), "https://"+s.domain+"/auth/edit"), 0, true),
|
new ListItem<>(R.string.sk_settings_auth, 0, R.drawable.ic_fluent_open_24_regular, ()->UiUtils.launchWebBrowser(getActivity(), "https://"+s.domain+"/auth/edit"), 0, true),
|
||||||
contentTypesItem=new CheckableListItem<>(R.string.sk_settings_content_types, R.string.sk_settings_content_types_explanation, CheckableListItem.Style.SWITCH, lp.contentTypesEnabled, R.drawable.ic_fluent_text_edit_style_24_regular, this::onContentTypeClick),
|
contentTypesItem=new CheckableListItem<>(R.string.sk_settings_content_types, R.string.sk_settings_content_types_explanation, CheckableListItem.Style.SWITCH, lp.contentTypesEnabled, R.drawable.ic_fluent_text_edit_style_24_regular, this::onContentTypeClick),
|
||||||
defaultContentTypeItem=new ListItem<>(R.string.sk_settings_default_content_type, lp.defaultContentType.getName(), R.drawable.ic_fluent_text_bold_24_regular, this::onDefaultContentTypeClick),
|
defaultContentTypeItem=new ListItem<>(R.string.sk_settings_default_content_type, lp.defaultContentType.getName(), R.drawable.ic_fluent_text_bold_24_regular, this::onDefaultContentTypeClick, 0, true),
|
||||||
emojiReactionsItem=new CheckableListItem<>(R.string.sk_settings_emoji_reactions, R.string.sk_settings_emoji_reactions_explanation, CheckableListItem.Style.SWITCH, lp.emojiReactionsEnabled, R.drawable.ic_fluent_emoji_laugh_24_regular, this::onEmojiReactionsClick),
|
emojiReactionsItem=new CheckableListItem<>(R.string.sk_settings_emoji_reactions, R.string.sk_settings_emoji_reactions_explanation, CheckableListItem.Style.SWITCH, lp.emojiReactionsEnabled, R.drawable.ic_fluent_emoji_laugh_24_regular, this::onEmojiReactionsClick),
|
||||||
emojiReactionsInListsItem=new CheckableListItem<>(R.string.sk_settings_emoji_reactions_in_lists, R.string.sk_settings_emoji_reactions_in_lists_explanation, CheckableListItem.Style.SWITCH, lp.showEmojiReactionsInLists, R.drawable.ic_fluent_emoji_24_regular, ()->toggleCheckableItem(emojiReactionsInListsItem)),
|
emojiReactionsInTimelinesItem=new CheckableListItem<>(R.string.sk_settings_emoji_reactions_in_lists, R.string.sk_settings_emoji_reactions_in_lists_explanation, CheckableListItem.Style.SWITCH, lp.emojiReactionsInTimelines, R.drawable.ic_fluent_emoji_24_regular, ()->toggleCheckableItem(emojiReactionsInTimelinesItem), true),
|
||||||
localOnlyItem=new CheckableListItem<>(R.string.sk_settings_support_local_only, R.string.sk_settings_local_only_explanation, CheckableListItem.Style.SWITCH, lp.localOnlySupported, R.drawable.ic_fluent_eye_24_regular, this::onLocalOnlyClick),
|
localOnlyItem=new CheckableListItem<>(R.string.sk_settings_support_local_only, R.string.sk_settings_local_only_explanation, CheckableListItem.Style.SWITCH, lp.localOnlySupported, R.drawable.ic_fluent_eye_24_regular, this::onLocalOnlyClick),
|
||||||
glitchModeItem=new CheckableListItem<>(R.string.sk_settings_glitch_instance, R.string.sk_settings_glitch_mode_explanation, CheckableListItem.Style.SWITCH, lp.glitchInstance, R.drawable.ic_fluent_eye_24_filled, ()->toggleCheckableItem(glitchModeItem))
|
glitchModeItem=new CheckableListItem<>(R.string.sk_settings_glitch_instance, R.string.sk_settings_glitch_mode_explanation, CheckableListItem.Style.SWITCH, lp.glitchInstance, R.drawable.ic_fluent_eye_24_filled, ()->toggleCheckableItem(glitchModeItem))
|
||||||
));
|
));
|
||||||
contentTypesItem.checkedChangeListener=checked->onContentTypeClick();
|
contentTypesItem.checkedChangeListener=checked->onContentTypeClick();
|
||||||
defaultContentTypeItem.isEnabled=contentTypesItem.checked;
|
defaultContentTypeItem.isEnabled=contentTypesItem.checked;
|
||||||
emojiReactionsItem.checkedChangeListener=checked->onEmojiReactionsClick();
|
emojiReactionsItem.checkedChangeListener=checked->onEmojiReactionsClick();
|
||||||
emojiReactionsInListsItem.isEnabled=emojiReactionsItem.checked;
|
emojiReactionsInTimelinesItem.isEnabled=emojiReactionsItem.checked;
|
||||||
localOnlyItem.checkedChangeListener=checked->onLocalOnlyClick();
|
localOnlyItem.checkedChangeListener=checked->onLocalOnlyClick();
|
||||||
glitchModeItem.isEnabled=localOnlyItem.checked;
|
glitchModeItem.isEnabled=localOnlyItem.checked;
|
||||||
}
|
}
|
||||||
@@ -57,7 +57,7 @@ public class SettingsInstanceFragment extends BaseSettingsFragment<Void> impleme
|
|||||||
super.onHidden();
|
super.onHidden();
|
||||||
lp.contentTypesEnabled=contentTypesItem.checked;
|
lp.contentTypesEnabled=contentTypesItem.checked;
|
||||||
lp.emojiReactionsEnabled=emojiReactionsItem.checked;
|
lp.emojiReactionsEnabled=emojiReactionsItem.checked;
|
||||||
lp.showEmojiReactionsInLists=emojiReactionsInListsItem.checked;
|
lp.emojiReactionsInTimelines=emojiReactionsInTimelinesItem.checked;
|
||||||
lp.localOnlySupported=localOnlyItem.checked;
|
lp.localOnlySupported=localOnlyItem.checked;
|
||||||
lp.glitchInstance=glitchModeItem.checked;
|
lp.glitchInstance=glitchModeItem.checked;
|
||||||
lp.save();
|
lp.save();
|
||||||
@@ -109,9 +109,8 @@ public class SettingsInstanceFragment extends BaseSettingsFragment<Void> impleme
|
|||||||
|
|
||||||
private void onEmojiReactionsClick(){
|
private void onEmojiReactionsClick(){
|
||||||
toggleCheckableItem(emojiReactionsItem);
|
toggleCheckableItem(emojiReactionsItem);
|
||||||
emojiReactionsInListsItem.checked=false;
|
emojiReactionsInTimelinesItem.checked=emojiReactionsInTimelinesItem.isEnabled=emojiReactionsItem.checked;
|
||||||
emojiReactionsInListsItem.isEnabled=emojiReactionsItem.checked;
|
rebindItem(emojiReactionsInTimelinesItem);
|
||||||
rebindItem(emojiReactionsInListsItem);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onLocalOnlyClick(){
|
private void onLocalOnlyClick(){
|
||||||
|
|||||||
@@ -15,10 +15,10 @@ import com.google.gson.JsonElement;
|
|||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
import com.google.gson.JsonParseException;
|
import com.google.gson.JsonParseException;
|
||||||
|
|
||||||
import org.joinmastodon.android.GlobalUserPreferences;
|
|
||||||
import org.joinmastodon.android.api.ObjectValidationException;
|
import org.joinmastodon.android.api.ObjectValidationException;
|
||||||
import org.joinmastodon.android.api.RequiredField;
|
import org.joinmastodon.android.api.RequiredField;
|
||||||
import org.joinmastodon.android.api.session.AccountSessionManager;
|
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||||
|
import org.joinmastodon.android.events.EmojiReactionsUpdatedEvent;
|
||||||
import org.joinmastodon.android.events.StatusCountersUpdatedEvent;
|
import org.joinmastodon.android.events.StatusCountersUpdatedEvent;
|
||||||
import org.joinmastodon.android.ui.text.HtmlParser;
|
import org.joinmastodon.android.ui.text.HtmlParser;
|
||||||
import org.parceler.Parcel;
|
import org.parceler.Parcel;
|
||||||
@@ -181,6 +181,9 @@ public class Status extends BaseModel implements DisplayItemsParent, Searchable{
|
|||||||
reblogged=ev.reblogged;
|
reblogged=ev.reblogged;
|
||||||
bookmarked=ev.bookmarked;
|
bookmarked=ev.bookmarked;
|
||||||
pinned=ev.pinned;
|
pinned=ev.pinned;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void update(EmojiReactionsUpdatedEvent ev){
|
||||||
reactions=ev.reactions;
|
reactions=ev.reactions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -31,11 +31,10 @@ import org.joinmastodon.android.api.requests.statuses.PleromaAddStatusReaction;
|
|||||||
import org.joinmastodon.android.api.requests.statuses.PleromaDeleteStatusReaction;
|
import org.joinmastodon.android.api.requests.statuses.PleromaDeleteStatusReaction;
|
||||||
import org.joinmastodon.android.api.session.AccountSession;
|
import org.joinmastodon.android.api.session.AccountSession;
|
||||||
import org.joinmastodon.android.api.session.AccountSessionManager;
|
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||||
import org.joinmastodon.android.events.StatusCountersUpdatedEvent;
|
import org.joinmastodon.android.events.EmojiReactionsUpdatedEvent;
|
||||||
import org.joinmastodon.android.fragments.BaseStatusListFragment;
|
import org.joinmastodon.android.fragments.BaseStatusListFragment;
|
||||||
import org.joinmastodon.android.fragments.account_list.StatusEmojiReactionsListFragment;
|
import org.joinmastodon.android.fragments.account_list.StatusEmojiReactionsListFragment;
|
||||||
import org.joinmastodon.android.model.Account;
|
import org.joinmastodon.android.model.Account;
|
||||||
import org.joinmastodon.android.model.Announcement;
|
|
||||||
import org.joinmastodon.android.model.Emoji;
|
import org.joinmastodon.android.model.Emoji;
|
||||||
import org.joinmastodon.android.model.EmojiReaction;
|
import org.joinmastodon.android.model.EmojiReaction;
|
||||||
import org.joinmastodon.android.model.Status;
|
import org.joinmastodon.android.model.Status;
|
||||||
@@ -44,8 +43,6 @@ import org.joinmastodon.android.ui.utils.TextDrawable;
|
|||||||
import org.joinmastodon.android.ui.utils.UiUtils;
|
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||||
import org.joinmastodon.android.ui.views.ProgressBarButton;
|
import org.joinmastodon.android.ui.views.ProgressBarButton;
|
||||||
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
import me.grishka.appkit.Nav;
|
import me.grishka.appkit.Nav;
|
||||||
import me.grishka.appkit.api.Callback;
|
import me.grishka.appkit.api.Callback;
|
||||||
import me.grishka.appkit.api.ErrorResponse;
|
import me.grishka.appkit.api.ErrorResponse;
|
||||||
@@ -62,20 +59,18 @@ import me.grishka.appkit.views.UsableRecyclerView;
|
|||||||
public class EmojiReactionsStatusDisplayItem extends StatusDisplayItem {
|
public class EmojiReactionsStatusDisplayItem extends StatusDisplayItem {
|
||||||
public final Status status;
|
public final Status status;
|
||||||
private final Drawable placeholder;
|
private final Drawable placeholder;
|
||||||
private final boolean hideAdd, forAnnouncement;
|
private final boolean hideEmpty, forAnnouncement;
|
||||||
private final String accountID;
|
private final String accountID;
|
||||||
private boolean hidden;
|
|
||||||
private static final float ALPHA_DISABLED=0.55f;
|
private static final float ALPHA_DISABLED=0.55f;
|
||||||
|
|
||||||
public EmojiReactionsStatusDisplayItem(String parentID, BaseStatusListFragment<?> parentFragment, Status status, String accountID, boolean hideAdd, boolean forAnnouncement) {
|
public EmojiReactionsStatusDisplayItem(String parentID, BaseStatusListFragment<?> parentFragment, Status status, String accountID, boolean hideEmpty, boolean forAnnouncement) {
|
||||||
super(parentID, parentFragment);
|
super(parentID, parentFragment);
|
||||||
this.status=status;
|
this.status=status;
|
||||||
this.hideAdd=hideAdd;
|
this.hideEmpty=hideEmpty;
|
||||||
this.forAnnouncement=forAnnouncement;
|
this.forAnnouncement=forAnnouncement;
|
||||||
this.accountID=accountID;
|
this.accountID=accountID;
|
||||||
placeholder=parentFragment.getContext().getDrawable(R.drawable.image_placeholder).mutate();
|
placeholder=parentFragment.getContext().getDrawable(R.drawable.image_placeholder).mutate();
|
||||||
placeholder.setBounds(0, 0, V.sp(24), V.sp(24));
|
placeholder.setBounds(0, 0, V.sp(24), V.sp(24));
|
||||||
updateHidden();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -94,11 +89,7 @@ public class EmojiReactionsStatusDisplayItem extends StatusDisplayItem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean isHidden(){
|
public boolean isHidden(){
|
||||||
return hidden;
|
return status.reactions.isEmpty() && hideEmpty;
|
||||||
}
|
|
||||||
|
|
||||||
private void updateHidden(){
|
|
||||||
hidden=status.reactions.isEmpty() && hideAdd;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// borrowed from ProfileFragment
|
// borrowed from ProfileFragment
|
||||||
@@ -187,12 +178,12 @@ public class EmojiReactionsStatusDisplayItem extends StatusDisplayItem {
|
|||||||
emojiKeyboard.setListener(this);
|
emojiKeyboard.setListener(this);
|
||||||
space.setVisibility(View.GONE);
|
space.setVisibility(View.GONE);
|
||||||
root.addView(emojiKeyboard.getView());
|
root.addView(emojiKeyboard.getView());
|
||||||
item.updateHidden();
|
boolean hidden=item.isHidden();
|
||||||
root.setVisibility(item.hidden ? View.GONE : View.VISIBLE);
|
root.setVisibility(hidden ? View.GONE : View.VISIBLE);
|
||||||
line.setVisibility(item.hidden ? View.GONE : View.VISIBLE);
|
line.setVisibility(hidden ? View.GONE : View.VISIBLE);
|
||||||
line.setPadding(
|
line.setPadding(
|
||||||
list.getPaddingLeft(),
|
list.getPaddingLeft(),
|
||||||
item.hidden ? 0 : V.dp(8),
|
hidden ? 0 : V.dp(8),
|
||||||
list.getPaddingRight(),
|
list.getPaddingRight(),
|
||||||
item.forAnnouncement ? V.dp(8) : 0
|
item.forAnnouncement ? V.dp(8) : 0
|
||||||
);
|
);
|
||||||
@@ -219,6 +210,7 @@ public class EmojiReactionsStatusDisplayItem extends StatusDisplayItem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void addEmojiReaction(String emoji, Emoji info) {
|
private void addEmojiReaction(String emoji, Emoji info) {
|
||||||
|
int countBefore=item.status.reactions.size();
|
||||||
for(int i=0; i<item.status.reactions.size(); i++){
|
for(int i=0; i<item.status.reactions.size(); i++){
|
||||||
EmojiReaction r=item.status.reactions.get(i);
|
EmojiReaction r=item.status.reactions.get(i);
|
||||||
if(r.name.equals(emoji) && r.me){
|
if(r.name.equals(emoji) && r.me){
|
||||||
@@ -261,7 +253,7 @@ public class EmojiReactionsStatusDisplayItem extends StatusDisplayItem {
|
|||||||
finalExisting.add(me);
|
finalExisting.add(me);
|
||||||
adapter.notifyItemChanged(item.status.reactions.indexOf(finalExisting));
|
adapter.notifyItemChanged(item.status.reactions.indexOf(finalExisting));
|
||||||
}
|
}
|
||||||
E.post(new StatusCountersUpdatedEvent(item.status, adapter.parentHolder));
|
E.post(new EmojiReactionsUpdatedEvent(item.status.id, item.status.reactions, countBefore==0, adapter.parentHolder));
|
||||||
}, resetBtn).exec(item.accountID);
|
}, resetBtn).exec(item.accountID);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -392,7 +384,11 @@ public class EmojiReactionsStatusDisplayItem extends StatusDisplayItem {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
E.post(new StatusCountersUpdatedEvent(parent.status, adapter.parentHolder));
|
if(parent.isHidden()){
|
||||||
|
adapter.parentHolder.root.setVisibility(View.GONE);
|
||||||
|
adapter.parentHolder.line.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
E.post(new EmojiReactionsUpdatedEvent(parent.status.id, parent.status.reactions, parent.status.reactions.isEmpty(), adapter.parentHolder));
|
||||||
adapter.parentHolder.imgLoader.updateImages();
|
adapter.parentHolder.imgLoader.updateImages();
|
||||||
}, null).exec(parent.parentFragment.getAccountID());
|
}, null).exec(parent.parentFragment.getAccountID());
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -120,19 +120,6 @@ public abstract class StatusDisplayItem{
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ArrayList<StatusDisplayItem> buildItems(BaseStatusListFragment<?> fragment, Status status, String accountID, DisplayItemsParent parentObject, Map<String, Account> knownAccounts, boolean inset, boolean showReactions, boolean addFooter, boolean disableTranslate, FilterContext filterContext) {
|
|
||||||
int flags=0;
|
|
||||||
if(inset)
|
|
||||||
flags|=FLAG_INSET;
|
|
||||||
if(!addFooter)
|
|
||||||
flags|=FLAG_NO_FOOTER;
|
|
||||||
if (disableTranslate)
|
|
||||||
flags|=FLAG_NO_TRANSLATE;
|
|
||||||
if (!showReactions)
|
|
||||||
flags|=FLAG_NO_EMOJI_REACTIONS;
|
|
||||||
return buildItems(fragment, status, accountID, parentObject, knownAccounts, filterContext, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ReblogOrReplyLineStatusDisplayItem buildReplyLine(BaseStatusListFragment<?> fragment, Status status, String accountID, DisplayItemsParent parent, Account account, boolean threadReply) {
|
public static ReblogOrReplyLineStatusDisplayItem buildReplyLine(BaseStatusListFragment<?> fragment, Status status, String accountID, DisplayItemsParent parent, Account account, boolean threadReply) {
|
||||||
String parentID = parent.getID();
|
String parentID = parent.getID();
|
||||||
String text = threadReply ? fragment.getString(R.string.sk_show_thread)
|
String text = threadReply ? fragment.getString(R.string.sk_show_thread)
|
||||||
@@ -293,8 +280,8 @@ public abstract class StatusDisplayItem{
|
|||||||
if(contentItems!=items && statusForContent.spoilerRevealed){
|
if(contentItems!=items && statusForContent.spoilerRevealed){
|
||||||
items.addAll(contentItems);
|
items.addAll(contentItems);
|
||||||
}
|
}
|
||||||
if((flags & FLAG_NO_EMOJI_REACTIONS)==0
|
if((flags & FLAG_NO_EMOJI_REACTIONS)==0 && fragment.getLocalPrefs().emojiReactionsEnabled &&
|
||||||
&& AccountSessionManager.get(accountID).getLocalPreferences().emojiReactionsEnabled){
|
(fragment.getLocalPrefs().emojiReactionsInTimelines || fragment instanceof ThreadFragment)){
|
||||||
boolean isMainStatus=fragment instanceof ThreadFragment t && t.getMainStatus().id.equals(statusForContent.id);
|
boolean isMainStatus=fragment instanceof ThreadFragment t && t.getMainStatus().id.equals(statusForContent.id);
|
||||||
items.add(new EmojiReactionsStatusDisplayItem(parentID, fragment, statusForContent, accountID, !isMainStatus, false));
|
items.add(new EmojiReactionsStatusDisplayItem(parentID, fragment, statusForContent, accountID, !isMainStatus, false));
|
||||||
}
|
}
|
||||||
@@ -401,15 +388,7 @@ public abstract class StatusDisplayItem{
|
|||||||
}
|
}
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
// int nextNextPos=getAbsoluteAdapterPosition() + 2;
|
|
||||||
// if(next.map(n->n instanceof EmojiReactionsStatusDisplayItem e && e.isHidden()).orElse(false)){
|
|
||||||
// List<StatusDisplayItem> displayItems=item.parentFragment.getDisplayItems();
|
|
||||||
// return displayItems.size() > nextNextPos
|
|
||||||
// ? Optional.of(displayItems.get(nextNextPos))
|
|
||||||
// : Optional.empty();
|
|
||||||
// }else{
|
|
||||||
// return next;
|
|
||||||
// }
|
|
||||||
public Optional<StatusDisplayItem> getNextDisplayItem(){
|
public Optional<StatusDisplayItem> getNextDisplayItem(){
|
||||||
return getDisplayItemOffset(1);
|
return getDisplayItemOffset(1);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user