Merge remote-tracking branch 'megalodon_main/main'

# Conflicts:
#	mastodon/src/main/java/org/joinmastodon/android/api/session/AccountLocalPreferences.java
This commit is contained in:
LucasGGamerM
2023-09-01 14:11:19 -03:00
18 changed files with 211 additions and 33 deletions

View File

@@ -42,7 +42,7 @@ public class AccountLocalPreferences{
public boolean keepOnlyLatestNotification; public boolean keepOnlyLatestNotification;
public boolean emojiReactionsEnabled; public boolean emojiReactionsEnabled;
public boolean emojiReactionsInTimelines; public ShowEmojiReactions showEmojiReactions;
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());
emojiReactionsInTimelines=prefs.getBoolean("emojiReactionsInTimelines", true); showEmojiReactions=ShowEmojiReactions.valueOf(prefs.getString("showEmojiReactions", ShowEmojiReactions.HIDE_EMPTY.name()));
// MOSHIDON // MOSHIDON
recentEmojis=fromJson(prefs.getString("recentEmojis", "{}"), recentEmojisType, new HashMap<>()); recentEmojis=fromJson(prefs.getString("recentEmojis", "{}"), recentEmojisType, new HashMap<>());
@@ -109,10 +109,16 @@ public class AccountLocalPreferences{
.putString("timelineReplyVisibility", timelineReplyVisibility) .putString("timelineReplyVisibility", timelineReplyVisibility)
.putBoolean("keepOnlyLatestNotification", keepOnlyLatestNotification) .putBoolean("keepOnlyLatestNotification", keepOnlyLatestNotification)
.putBoolean("emojiReactionsEnabled", emojiReactionsEnabled) .putBoolean("emojiReactionsEnabled", emojiReactionsEnabled)
.putBoolean("emojiReactionsInTimelines", emojiReactionsInTimelines) .putString("showEmojiReactions", showEmojiReactions.name())
// MOSHIDON // MOSHIDON
.putString("recentEmojis", gson.toJson(recentEmojis)) .putString("recentEmojis", gson.toJson(recentEmojis))
.apply(); .apply();
} }
public enum ShowEmojiReactions{
HIDE_EMPTY,
ONLY_OPENED,
ALWAYS
}
} }

View File

@@ -247,8 +247,7 @@ public class NotificationsListFragment extends BaseStatusListFragment<Notificati
@Subscribe @Subscribe
public void onStatusCountersUpdated(StatusCountersUpdatedEvent ev){ public void onStatusCountersUpdated(StatusCountersUpdatedEvent ev){
for(Notification n:data){ for(Notification n:data){
if (n.status == null) continue; if(n.status!=null && n.status.getContentStatus().id.equals(ev.id)){
if(n.status.getContentStatus().id.equals(ev.id)){
n.status.getContentStatus().update(ev); n.status.getContentStatus().update(ev);
AccountSessionManager.get(accountID).getCacheController().updateNotification(n); AccountSessionManager.get(accountID).getCacheController().updateNotification(n);
for(int i=0;i<list.getChildCount();i++){ for(int i=0;i<list.getChildCount();i++){
@@ -262,8 +261,7 @@ public class NotificationsListFragment extends BaseStatusListFragment<Notificati
} }
} }
for(Notification n:preloadedData){ for(Notification n:preloadedData){
if (n.status == null) continue; if(n.status!=null && n.status.getContentStatus().id.equals(ev.id)){
if(n.status.getContentStatus().id.equals(ev.id)){
n.status.getContentStatus().update(ev); n.status.getContentStatus().update(ev);
AccountSessionManager.get(accountID).getCacheController().updateNotification(n); AccountSessionManager.get(accountID).getCacheController().updateNotification(n);
} }
@@ -273,7 +271,7 @@ public class NotificationsListFragment extends BaseStatusListFragment<Notificati
@Subscribe @Subscribe
public void onEmojiReactionsChanged(EmojiReactionsUpdatedEvent ev){ public void onEmojiReactionsChanged(EmojiReactionsUpdatedEvent ev){
for(Notification n : data){ for(Notification n : data){
if(n.status.getContentStatus().id.equals(ev.id)){ if(n.status!=null && n.status.getContentStatus().id.equals(ev.id)){
n.status.getContentStatus().update(ev); n.status.getContentStatus().update(ev);
AccountSessionManager.get(accountID).getCacheController().updateNotification(n); AccountSessionManager.get(accountID).getCacheController().updateNotification(n);
for(int i=0; i<list.getChildCount(); i++){ for(int i=0; i<list.getChildCount(); i++){
@@ -287,7 +285,7 @@ public class NotificationsListFragment extends BaseStatusListFragment<Notificati
} }
} }
for(Notification n : preloadedData){ for(Notification n : preloadedData){
if(n.status.getContentStatus().id.equals(ev.id)){ if(n.status!=null && n.status.getContentStatus().id.equals(ev.id)){
n.status.getContentStatus().update(ev); n.status.getContentStatus().update(ev);
AccountSessionManager.get(accountID).getCacheController().updateNotification(n); AccountSessionManager.get(accountID).getCacheController().updateNotification(n);
} }

View File

@@ -1,5 +1,7 @@
package org.joinmastodon.android.fragments; package org.joinmastodon.android.fragments;
import static org.joinmastodon.android.api.session.AccountLocalPreferences.ShowEmojiReactions.ONLY_OPENED;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.os.Bundle; import android.os.Bundle;
@@ -7,6 +9,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.AccountLocalPreferences;
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.EmojiReactionsUpdatedEvent;
import org.joinmastodon.android.MainActivity; import org.joinmastodon.android.MainActivity;
@@ -40,9 +43,10 @@ public abstract class StatusListFragment extends BaseStatusListFragment<Status>
protected List<StatusDisplayItem> buildDisplayItems(Status s){ protected List<StatusDisplayItem> buildDisplayItems(Status s){
boolean isMainThreadStatus = this instanceof ThreadFragment t && s.id.equals(t.mainStatus.id); boolean isMainThreadStatus = this instanceof ThreadFragment t && s.id.equals(t.mainStatus.id);
int flags = 0; int flags = 0;
AccountLocalPreferences lp=getLocalPrefs();
if (GlobalUserPreferences.spectatorMode) if (GlobalUserPreferences.spectatorMode)
flags |= StatusDisplayItem.FLAG_NO_FOOTER; flags |= StatusDisplayItem.FLAG_NO_FOOTER;
if (!getLocalPrefs().emojiReactionsInTimelines) if (!lp.emojiReactionsEnabled || lp.showEmojiReactions==ONLY_OPENED)
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);
} }

View File

@@ -2,10 +2,14 @@ package org.joinmastodon.android.fragments.settings;
import android.os.Bundle; import android.os.Bundle;
import androidx.annotation.StringRes;
import org.joinmastodon.android.E;
import org.joinmastodon.android.R; import org.joinmastodon.android.R;
import org.joinmastodon.android.api.session.AccountLocalPreferences; import org.joinmastodon.android.api.session.AccountLocalPreferences;
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.StatusDisplaySettingsChangedEvent;
import org.joinmastodon.android.fragments.HasAccountID; import org.joinmastodon.android.fragments.HasAccountID;
import org.joinmastodon.android.model.ContentType; import org.joinmastodon.android.model.ContentType;
import org.joinmastodon.android.model.viewmodel.CheckableListItem; import org.joinmastodon.android.model.viewmodel.CheckableListItem;
@@ -15,12 +19,13 @@ import org.joinmastodon.android.ui.utils.UiUtils;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.stream.IntStream;
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, emojiReactionsInTimelinesItem, localOnlyItem, glitchModeItem; private CheckableListItem<Void> contentTypesItem, emojiReactionsItem, localOnlyItem, glitchModeItem;
private ListItem<Void> defaultContentTypeItem; private ListItem<Void> defaultContentTypeItem, showEmojiReactionsItem;
private AccountLocalPreferences lp; private AccountLocalPreferences lp;
@Override @Override
@@ -37,14 +42,14 @@ public class SettingsInstanceFragment extends BaseSettingsFragment<Void> impleme
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, 0, true), 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),
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), showEmojiReactionsItem=new ListItem<>(R.string.sk_settings_show_emoji_reactions, getShowEmojiReactionsString(), R.drawable.ic_fluent_emoji_24_regular, this::onShowEmojiReactionsClick, 0, 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();
emojiReactionsInTimelinesItem.isEnabled=emojiReactionsItem.checked; showEmojiReactionsItem.isEnabled=emojiReactionsItem.checked;
localOnlyItem.checkedChangeListener=checked->onLocalOnlyClick(); localOnlyItem.checkedChangeListener=checked->onLocalOnlyClick();
glitchModeItem.isEnabled=localOnlyItem.checked; glitchModeItem.isEnabled=localOnlyItem.checked;
} }
@@ -57,10 +62,10 @@ 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.emojiReactionsInTimelines=emojiReactionsInTimelinesItem.checked;
lp.localOnlySupported=localOnlyItem.checked; lp.localOnlySupported=localOnlyItem.checked;
lp.glitchInstance=glitchModeItem.checked; lp.glitchInstance=glitchModeItem.checked;
lp.save(); lp.save();
E.post(new StatusDisplaySettingsChangedEvent(accountID));
} }
private void onServerClick(){ private void onServerClick(){
@@ -107,10 +112,34 @@ public class SettingsInstanceFragment extends BaseSettingsFragment<Void> impleme
.show(); .show();
} }
private void onShowEmojiReactionsClick(){
int selected=lp.showEmojiReactions.ordinal();
int[] newSelected={selected};
new M3AlertDialogBuilder(getActivity())
.setTitle(R.string.sk_settings_show_emoji_reactions)
.setSingleChoiceItems((String[]) IntStream.of(R.string.sk_settings_show_emoji_reactions_hide_empty, R.string.sk_settings_show_emoji_reactions_only_opened, R.string.sk_settings_show_emoji_reactions_always).mapToObj(this::getString).toArray(String[]::new),
selected, (dlg, item)->newSelected[0]=item)
.setPositiveButton(R.string.ok, (dlg, item)->{
lp.showEmojiReactions=AccountLocalPreferences.ShowEmojiReactions.values()[newSelected[0]];
showEmojiReactionsItem.subtitleRes=getShowEmojiReactionsString();
rebindItem(showEmojiReactionsItem);
})
.setNegativeButton(R.string.cancel, null)
.show();
}
private @StringRes int getShowEmojiReactionsString(){
return switch(lp.showEmojiReactions){
case HIDE_EMPTY -> R.string.sk_settings_show_emoji_reactions_hide_empty;
case ONLY_OPENED -> R.string.sk_settings_show_emoji_reactions_only_opened;
case ALWAYS -> R.string.sk_settings_show_emoji_reactions_always;
};
}
private void onEmojiReactionsClick(){ private void onEmojiReactionsClick(){
toggleCheckableItem(emojiReactionsItem); toggleCheckableItem(emojiReactionsItem);
emojiReactionsInTimelinesItem.checked=emojiReactionsInTimelinesItem.isEnabled=emojiReactionsItem.checked; showEmojiReactionsItem.isEnabled=emojiReactionsItem.checked;
rebindItem(emojiReactionsInTimelinesItem); rebindItem(showEmojiReactionsItem);
} }
private void onLocalOnlyClick(){ private void onLocalOnlyClick(){

View File

@@ -41,6 +41,12 @@ public class Emoji extends BaseModel{
this.staticUrl = staticUrl; this.staticUrl = staticUrl;
} }
public String getUrl(boolean playGifs){
String idealUrl=playGifs ? url : staticUrl;
if(idealUrl==null) return url==null ? staticUrl : url;
return idealUrl;
}
@Override @Override
public String toString(){ public String toString(){
return "Emoji{"+ return "Emoji{"+

View File

@@ -1,5 +1,6 @@
package org.joinmastodon.android.model; package org.joinmastodon.android.model;
import org.joinmastodon.android.GlobalUserPreferences;
import org.parceler.Parcel; import org.parceler.Parcel;
import java.util.ArrayList; import java.util.ArrayList;
@@ -22,6 +23,12 @@ public class EmojiReaction {
public transient ImageLoaderRequest request; public transient ImageLoaderRequest request;
public String getUrl(boolean playGifs){
String idealUrl=playGifs ? url : staticUrl;
if(idealUrl==null) return url==null ? staticUrl : url;
return idealUrl;
}
public static EmojiReaction of(Emoji info, Account me){ public static EmojiReaction of(Emoji info, Account me){
EmojiReaction reaction=new EmojiReaction(); EmojiReaction reaction=new EmojiReaction();
reaction.me=true; reaction.me=true;

File diff suppressed because one or more lines are too long

View File

@@ -21,6 +21,7 @@ import androidx.recyclerview.widget.LinearSmoothScroller;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import org.joinmastodon.android.E; import org.joinmastodon.android.E;
import org.joinmastodon.android.GlobalUserPreferences;
import org.joinmastodon.android.R; import org.joinmastodon.android.R;
import org.joinmastodon.android.api.MastodonAPIRequest; import org.joinmastodon.android.api.MastodonAPIRequest;
import org.joinmastodon.android.api.requests.announcements.AddAnnouncementReaction; import org.joinmastodon.android.api.requests.announcements.AddAnnouncementReaction;
@@ -59,7 +60,7 @@ 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 hideEmpty, forAnnouncement; private final boolean hideEmpty, forAnnouncement, playGifs;
private final String accountID; private final String accountID;
private static final float ALPHA_DISABLED=0.55f; private static final float ALPHA_DISABLED=0.55f;
@@ -71,11 +72,12 @@ public class EmojiReactionsStatusDisplayItem extends StatusDisplayItem {
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));
playGifs=GlobalUserPreferences.playGifs;
} }
@Override @Override
public int getImageCount(){ public int getImageCount(){
return (int) status.reactions.stream().filter(r->r.url != null).count(); return (int) status.reactions.stream().filter(r->r.getUrl(playGifs)!=null).count();
} }
@Override @Override
@@ -169,8 +171,9 @@ public class EmojiReactionsStatusDisplayItem extends StatusDisplayItem {
public void onBind(EmojiReactionsStatusDisplayItem item) { public void onBind(EmojiReactionsStatusDisplayItem item) {
if(emojiKeyboard != null) root.removeView(emojiKeyboard.getView()); if(emojiKeyboard != null) root.removeView(emojiKeyboard.getView());
AccountSession session=item.parentFragment.getSession(); AccountSession session=item.parentFragment.getSession();
item.status.reactions.forEach(r-> item.status.reactions.forEach(r->r.request=r.getUrl(item.playGifs)!=null
r.request=r.url != null ? new UrlImageLoaderRequest(r.url, V.sp(24), V.sp(24)) : null); ? new UrlImageLoaderRequest(r.getUrl(item.playGifs), V.sp(24), V.sp(24))
: null);
emojiKeyboard=new CustomEmojiPopupKeyboard( emojiKeyboard=new CustomEmojiPopupKeyboard(
(Activity) item.parentFragment.getContext(), (Activity) item.parentFragment.getContext(),
AccountSessionManager.getInstance().getCustomEmojis(session.domain), AccountSessionManager.getInstance().getCustomEmojis(session.domain),
@@ -283,7 +286,7 @@ public class EmojiReactionsStatusDisplayItem extends StatusDisplayItem {
@Override @Override
public void clearImage(int index){ public void clearImage(int index){
if(item.status.reactions.get(index).url==null) return; if(item.status.reactions.get(index).getUrl(item.playGifs)==null) return;
setImage(index, item.placeholder); setImage(index, item.placeholder);
} }
@@ -316,7 +319,7 @@ public class EmojiReactionsStatusDisplayItem extends StatusDisplayItem {
@Override @Override
public int getImageCountForItem(int position){ public int getImageCountForItem(int position){
return item.status.reactions.get(position).url == null ? 0 : 1; return item.status.reactions.get(position).getUrl(item.playGifs)==null ? 0 : 1;
} }
@Override @Override
@@ -356,7 +359,7 @@ public class EmojiReactionsStatusDisplayItem extends StatusDisplayItem {
btn.setText(UiUtils.abbreviateNumber(reaction.count)); btn.setText(UiUtils.abbreviateNumber(reaction.count));
btn.setContentDescription(reaction.name); btn.setContentDescription(reaction.name);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) btn.setTooltipText(reaction.name); if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) btn.setTooltipText(reaction.name);
if(reaction.url==null){ if(reaction.getUrl(parent.playGifs)==null){
Paint p=new Paint(); Paint p=new Paint();
p.setTextSize(V.sp(18)); p.setTextSize(V.sp(18));
TextDrawable drawable=new TextDrawable(p, reaction.name); TextDrawable drawable=new TextDrawable(p, reaction.name);
@@ -402,7 +405,7 @@ public class EmojiReactionsStatusDisplayItem extends StatusDisplayItem {
args.putString("statusID", parent.status.id); args.putString("statusID", parent.status.id);
int atSymbolIndex = emojiReaction.name.indexOf("@"); int atSymbolIndex = emojiReaction.name.indexOf("@");
args.putString("emoji", atSymbolIndex != -1 ? emojiReaction.name.substring(0, atSymbolIndex) : emojiReaction.name); args.putString("emoji", atSymbolIndex != -1 ? emojiReaction.name.substring(0, atSymbolIndex) : emojiReaction.name);
args.putString("url", emojiReaction.url); args.putString("url", emojiReaction.getUrl(parent.playGifs));
args.putInt("count", emojiReaction.count); args.putInt("count", emojiReaction.count);
Nav.go(parent.parentFragment.getActivity(), StatusEmojiReactionsListFragment.class, args); Nav.go(parent.parentFragment.getActivity(), StatusEmojiReactionsListFragment.class, args);
return true; return true;

View File

@@ -1,5 +1,8 @@
package org.joinmastodon.android.ui.displayitems; package org.joinmastodon.android.ui.displayitems;
import static org.joinmastodon.android.api.session.AccountLocalPreferences.ShowEmojiReactions.ALWAYS;
import static org.joinmastodon.android.api.session.AccountLocalPreferences.ShowEmojiReactions.ONLY_OPENED;
import android.app.Activity; import android.app.Activity;
import android.app.Fragment; import android.app.Fragment;
import android.content.Context; import android.content.Context;
@@ -12,6 +15,7 @@ import android.view.ViewGroup;
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.AccountLocalPreferences;
import org.joinmastodon.android.api.session.AccountSessionManager; import org.joinmastodon.android.api.session.AccountSessionManager;
import org.joinmastodon.android.fragments.BaseStatusListFragment; import org.joinmastodon.android.fragments.BaseStatusListFragment;
import org.joinmastodon.android.fragments.HashtagTimelineFragment; import org.joinmastodon.android.fragments.HashtagTimelineFragment;
@@ -280,10 +284,12 @@ 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 && fragment.getLocalPrefs().emojiReactionsEnabled && AccountLocalPreferences lp=fragment.getLocalPrefs();
(fragment.getLocalPrefs().emojiReactionsInTimelines || fragment instanceof ThreadFragment)){ if((flags & FLAG_NO_EMOJI_REACTIONS)==0 && lp.emojiReactionsEnabled &&
(lp.showEmojiReactions!=ONLY_OPENED || 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)); boolean showAddButton=lp.showEmojiReactions==ALWAYS || isMainStatus;
items.add(new EmojiReactionsStatusDisplayItem(parentID, fragment, statusForContent, accountID, !showAddButton, false));
} }
FooterStatusDisplayItem footer=null; FooterStatusDisplayItem footer=null;
if((flags & FLAG_NO_FOOTER)==0){ if((flags & FLAG_NO_FOOTER)==0){

View File

@@ -373,4 +373,9 @@
<string name="sk_settings_emoji_reactions_in_lists_explanation">Las reacciones con los emoticonos deben mostrarse en las líneas de tiempo. Si esta opción está desactivada, las reacciones con los emoticonos solo se mostrarán al ver un hilo.</string> <string name="sk_settings_emoji_reactions_in_lists_explanation">Las reacciones con los emoticonos deben mostrarse en las líneas de tiempo. Si esta opción está desactivada, las reacciones con los emoticonos solo se mostrarán al ver un hilo.</string>
<string name="sk_button_react">Reacciona con un emoticono</string> <string name="sk_button_react">Reacciona con un emoticono</string>
<string name="sk_again_for_system_keyboard">Pulsa de nuevo para el Teclado del sistema</string> <string name="sk_again_for_system_keyboard">Pulsa de nuevo para el Teclado del sistema</string>
<plurals name="sk_posts_count_label">
<item quantity="one">tema</item>
<item quantity="many">temas</item>
<item quantity="other">temas</item>
</plurals>
</resources> </resources>

View File

@@ -374,4 +374,9 @@
<string name="sk_again_for_system_keyboard">Appuyez à nouveau pour le clavier système</string> <string name="sk_again_for_system_keyboard">Appuyez à nouveau pour le clavier système</string>
<string name="sk_enter_emoji_hint">Tapez pour réagir avec un emoji</string> <string name="sk_enter_emoji_hint">Tapez pour réagir avec un emoji</string>
<string name="sk_enter_emoji_toast">Vous devez saisir un emoji</string> <string name="sk_enter_emoji_toast">Vous devez saisir un emoji</string>
<plurals name="sk_posts_count_label">
<item quantity="one">message</item>
<item quantity="many">messages</item>
<item quantity="other">messages</item>
</plurals>
</resources> </resources>

View File

@@ -1,3 +1,18 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
</resources> <string name="sk_app_name">मेगालोडॉन</string>
<string name="sk_pinned_posts">पिन किया गया</string>
<string name="sk_delete_and_redraft">हटाएं और पुनः ड्राफ्ट करें</string>
<string name="sk_confirm_delete_and_redraft_title">हटाएं और पोस्ट को पुनः ड्राफ्ट करें</string>
<string name="sk_pin_post">प्रोफाइल पर पिन करें</string>
<string name="sk_confirm_pin_post_title">पोस्ट को प्रोफाइल पर पिन करें</string>
<string name="sk_pinning">पोस्ट पिन की जा रही है…</string>
<string name="sk_unpin_post">प्रोफाइल से अनपिन करें</string>
<string name="sk_confirm_unpin_post_title">पोस्ट को प्रोफाइल से अनपिन करें</string>
<string name="sk_unpinning">पोस्ट अनपिन की जा रही है…</string>
<string name="sk_image_description">चित्र विवरण</string>
<string name="sk_visibility_unlisted">असूचित</string>
<string name="sk_confirm_delete_and_redraft">क्या आप निश्चित हैं कि आप इस पोस्ट को हटाकर पुनः ड्राफ़्ट करना चाहते हैं\?</string>
<string name="sk_confirm_unpin_post">क्या आप निश्चित हैं कि आपको यह पोस्ट अनपिन करनी है\?</string>
<string name="sk_confirm_pin_post">क्या आप इस पोस्ट को अपनी प्रोफाइल पर पिन करना चाहते हैं\?</string>
</resources>

View File

@@ -372,4 +372,7 @@
<string name="sk_settings_emoji_reactions_in_lists_explanation">"Menentukan apakah reaksi emoji ditampilkan di lini masa. Jika opsi ini mati, reaksi emoji hanya akan ditampilkan ketika melihat sebuah utas."</string> <string name="sk_settings_emoji_reactions_in_lists_explanation">"Menentukan apakah reaksi emoji ditampilkan di lini masa. Jika opsi ini mati, reaksi emoji hanya akan ditampilkan ketika melihat sebuah utas."</string>
<string name="sk_button_react">Bereaksi dengan emoji</string> <string name="sk_button_react">Bereaksi dengan emoji</string>
<string name="sk_again_for_system_keyboard">Ketuk lagi untuk Papan Ketik Sistem</string> <string name="sk_again_for_system_keyboard">Ketuk lagi untuk Papan Ketik Sistem</string>
<plurals name="sk_posts_count_label">
<item quantity="other">kiriman</item>
</plurals>
</resources> </resources>

View File

@@ -310,4 +310,8 @@
<string name="sk_instance_info_unavailable">Instance informatie tijdelijk niet beschikbaar</string> <string name="sk_instance_info_unavailable">Instance informatie tijdelijk niet beschikbaar</string>
<string name="sk_settings_show_labels_in_navigation_bar">Toon tab labels op navigatiebalk</string> <string name="sk_settings_show_labels_in_navigation_bar">Toon tab labels op navigatiebalk</string>
<string name="sk_tab_profile">Profiel</string> <string name="sk_tab_profile">Profiel</string>
<plurals name="sk_posts_count_label">
<item quantity="one">bericht</item>
<item quantity="other">berichten</item>
</plurals>
</resources> </resources>

View File

@@ -369,4 +369,5 @@
<string name="sk_notification_mention">Você foi mencionado por %s</string> <string name="sk_notification_mention">Você foi mencionado por %s</string>
<string name="sk_settings_auto_reveal_equal_spoilers">Revelar automaticamente Avisos de Conteúdo nas respostas</string> <string name="sk_settings_auto_reveal_equal_spoilers">Revelar automaticamente Avisos de Conteúdo nas respostas</string>
<string name="sk_icon_recycle_bin">Lixeira de reciclagem</string> <string name="sk_icon_recycle_bin">Lixeira de reciclagem</string>
<string name="sk_tab_search">Pesquisar</string>
</resources> </resources>

View File

@@ -1,3 +1,78 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
</resources> <string name="sk_delete_and_redraft">ลบแล้วร่างใหม่</string>
<string name="sk_confirm_delete_and_redraft_title">ลบแล้วร่างโพสต์ใหม่</string>
<string name="sk_pin_post">ปักหมุดไปยังโปรไฟล์</string>
<string name="sk_confirm_pin_post_title">ปักหมุดโพสต์ไปยังโปรไฟล์</string>
<string name="sk_pinning">กำลังปักหมุดโพสต์…</string>
<string name="sk_unpin_post">เลิกปักหมุดจากโปรไฟล์</string>
<string name="sk_confirm_unpin_post_title">เลิกปักหมุดโพสต์จากโปรไฟล์</string>
<string name="sk_confirm_unpin_post">คุณแน่ใจหรือไม่ว่าต้องการเลิกปักหมุดโพสต์นี้\?</string>
<string name="sk_unpinning">กำลังเลิกปักหมุดโพสต์…</string>
<string name="sk_image_description">คำอธิบายภาพ</string>
<string name="sk_pinned_posts">ปักหมุด</string>
<string name="sk_confirm_delete_and_redraft">คุณแน่ใจหรือไม่ว่าต้องการลบและร่างโพสต์นี้ใหม่\?</string>
<string name="sk_confirm_pin_post">คุณต้องการปักหมุดโพสต์นี้ไปยังโปรไฟล์ของคุณหรือไม่\?</string>
<string name="sk_poll_allow_multiple">อนุญาตหลายตัวเลือก</string>
<string name="sk_clear_recent_languages">ล้างภาษาที่ใช้ล่าสุด</string>
<string name="sk_welcome_title">ยินดีต้อนรับ!</string>
<string name="sk_app_name">Megalodon</string>
<string name="sk_visibility_unlisted">ไม่อยู่ในรายการ</string>
<string name="sk_settings_show_replies">แสดงการตอบกลับ</string>
<string name="sk_translate_show_original">แสดงต้นฉบับ</string>
<string name="sk_translated_using">แปลด้วย %s</string>
<string name="sk_post_language">ภาษา: %s</string>
<string name="sk_available_languages">ภาษาที่ใช้งานได้</string>
<string name="sk_language_name">%1$s (%2$s)</string>
<string name="sk_confirm_clear_recent_languages">คุณแน่ใจหรือไม่ว่าต้องการล้างภาษาที่ใช้ล่าสุด\?</string>
<string name="sk_example_domain">example.social</string>
<string name="sk_translate_post">แปล</string>
<string name="sk_settings_translate_only_opened">แปลเฉพาะโพสต์ที่เปิดอยู่</string>
<string name="sk_settings_rules">กฎ</string>
<string name="sk_settings_profile">ตั้งค่าโปรไฟล์</string>
<string name="sk_settings_about">เกี่ยวกับแอป</string>
<string name="sk_settings_donate">บริจาค</string>
<string name="sk_color_palette_material3">ระบบ</string>
<string name="sk_color_palette_pink">ชมพู</string>
<string name="sk_color_palette_purple">ม่วง</string>
<string name="sk_color_palette_green">เขียว</string>
<string name="sk_color_palette_blue">ฟ้า</string>
<string name="sk_color_palette_brown">น้ำตาล</string>
<string name="sk_settings_color_palette">ชุดสี</string>
<string name="sk_delete_notification">ลบการแจ้งเตือน</string>
<string name="sk_delete_notification_confirm_action">ลบการแจ้งเตือน</string>
<string name="sk_delete_notification_confirm">คุณแน่ใจหรือไม่ว่าต้องการลบการแจ้งเตือนนี้\?</string>
<string name="sk_clear_all_notifications_confirm_action">ลบทั้งหมด</string>
<string name="sk_clear_all_notifications_confirm">คุณแน่ใจหรือไม่ว่าต้องการล้างการแจ้งเตือนทั้งหมด\?</string>
<string name="sk_lists_with_user">รายการที่มี %s</string>
<string name="sk_settings_reply_visibility_all">การตอบกลับทั้งหมด</string>
<string name="sk_settings_reply_visibility_following">การตอบกลับถึงผู้ที่ฉันติดตาม</string>
<string name="sk_settings_reply_visibility_self">การตอบกลับถึงฉัน</string>
<string name="sk_quoting_user">กำลังอ้างอิง %s</string>
<string name="sk_settings_reply_visibility">การมองเห็นการตอบกลับ</string>
<string name="sk_settings_show_boosts">แสดงการดัน</string>
<string name="sk_settings_continues_playback">ซ้อนทับเสียง</string>
<string name="sk_settings_continues_playback_summary">อนุญาตให้สื่อที่กำลังเล่นอยู่แล้วเล่นต่อไปได้ โดยซ้อนทับการเล่นใหม่</string>
<string name="sk_settings_load_new_posts">โหลดโพสต์ใหม่อัตโนมัติ</string>
<string name="sk_settings_app_version">Megalodon รุ่น %1$s (%2$d)</string>
<string name="sk_mark_media_as_sensitive">ทำเครื่องหมายสื่อว่าละเอียดอ่อน</string>
<string name="sk_user_post_notifications_off">ปิดการแจ้งเตือนโพสต์สำหรับ %s แล้ว</string>
<string name="sk_federated_timeline">ที่ติดต่อกับภายนอก</string>
<string name="sk_color_palette_red">แดง</string>
<string name="sk_settings_publish_button_text">ข้อความปุ่มเผยแพร่</string>
<string name="sk_check_for_update">ตรวจสอบอัปเดต</string>
<string name="sk_no_update_available">ไม่มีการอัปเดต</string>
<string name="sk_list_timelines">รายการ</string>
<string name="sk_follow_requests">คำขอติดตาม</string>
<string name="sk_accept_follow_request">ยอมรับคำขอติดตาม</string>
<string name="sk_reject_follow_request">ปฏิเสธคำขอติดตาม</string>
<string name="sk_color_palette_yellow">เหลือง</string>
<string name="sk_settings_show_interaction_counts">แสดงจำนวนการโต้ตอบ</string>
<string name="sk_notification_type_status">โพสต์</string>
<string name="sk_user_post_notifications_on">เปิดการแจ้งเตือนโพสต์สำหรับ %s แล้ว</string>
<string name="sk_notification_type_posts">การแจ้งเตือนโพสต์</string>
<string name="sk_update_available">Megalodon รุ่น %s พร้อมให้ดาวน์โหลดแล้ว</string>
<string name="sk_settings_tabs_disable_swipe">ปิดใช้การปัดระหว่างแท็บ</string>
<string name="sk_update_ready">Megalodon รุ่น %s ดาวน์โหลดเสร็จและพร้อมให้ติดตั้งแล้ว</string>
<string name="sk_clear_all_notifications">ล้างการแจ้งเตือนทั้งหมด</string>
</resources>

View File

@@ -374,4 +374,10 @@
<string name="sk_enter_emoji_toast">Вам потрібно ввести емоджі</string> <string name="sk_enter_emoji_toast">Вам потрібно ввести емоджі</string>
<string name="sk_enter_emoji_hint">Введіть, щоб відреагувати з емоджі</string> <string name="sk_enter_emoji_hint">Введіть, щоб відреагувати з емоджі</string>
<string name="sk_settings_emoji_reactions_in_lists_explanation">Чи відображати реакції емоджі у стрічках. Якщо цю опцію вимкнено, реакції емоджі показуватимуться лише під час перегляду гілки.</string> <string name="sk_settings_emoji_reactions_in_lists_explanation">Чи відображати реакції емоджі у стрічках. Якщо цю опцію вимкнено, реакції емоджі показуватимуться лише під час перегляду гілки.</string>
<plurals name="sk_posts_count_label">
<item quantity="one">допис</item>
<item quantity="few">дописи</item>
<item quantity="many">дописів</item>
<item quantity="other">дописів</item>
</plurals>
</resources> </resources>

View File

@@ -352,8 +352,10 @@
<string name="sk_settings_show_labels_in_navigation_bar">Show tab labels in the navigation bar</string> <string name="sk_settings_show_labels_in_navigation_bar">Show tab labels in the navigation bar</string>
<string name="sk_settings_emoji_reactions">Enable emoji reactions</string> <string name="sk_settings_emoji_reactions">Enable emoji reactions</string>
<string name="sk_settings_emoji_reactions_explanation">Displays emoji reactions to posts and lets you interact with them. Some modified versions of Mastodon support this, but Mastodon doesn\'t.</string> <string name="sk_settings_emoji_reactions_explanation">Displays emoji reactions to posts and lets you interact with them. Some modified versions of Mastodon support this, but Mastodon doesn\'t.</string>
<string name="sk_settings_emoji_reactions_in_lists">Show emoji reactions in timelines</string> <string name="sk_settings_show_emoji_reactions">Show emoji reactions in timelines</string>
<string name="sk_settings_emoji_reactions_in_lists_explanation">Whether emoji reactions should be displayed on timelines. If this option is off, emoji reactions will only be displayed when viewing a thread.</string> <string name="sk_settings_show_emoji_reactions_hide_empty">Hide empty emoji reactions</string>
<string name="sk_settings_show_emoji_reactions_only_opened">Only when post is opened</string>
<string name="sk_settings_show_emoji_reactions_always">Always show add button</string>
<plurals name="sk_users_reacted_with"> <plurals name="sk_users_reacted_with">
<item quantity="one">One user reacted with %2$s</item> <item quantity="one">One user reacted with %2$s</item>
<item quantity="other">%1$,d users reacted with %2$s</item> <item quantity="other">%1$,d users reacted with %2$s</item>