diff --git a/mastodon/src/main/assets/blocks.tsv b/mastodon/src/main/assets/blocks.tsv index ad6a59e93..8b93b9dcf 100644 --- a/mastodon/src/main/assets/blocks.tsv +++ b/mastodon/src/main/assets/blocks.tsv @@ -12,7 +12,7 @@ gab.protohype.net social.unzensiert.to freeatlantis.com -# reactionary bigotry and hatespeech against magrinalized groups +# reactionary bigotry and hatespeech against marginalized groups poa.st freespeechextremist.com rdrama.cc diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java index c2ad08423..78f4c8e95 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java @@ -49,7 +49,6 @@ import org.joinmastodon.android.ui.photoviewer.PhotoViewer; import org.joinmastodon.android.ui.photoviewer.PhotoViewerHost; import org.joinmastodon.android.ui.utils.MediaAttachmentViewController; import org.joinmastodon.android.ui.utils.UiUtils; -import org.joinmastodon.android.ui.views.MediaGridLayout; import org.joinmastodon.android.utils.TypedObjectPool; import java.util.ArrayList; @@ -90,10 +89,10 @@ public abstract class BaseStatusListFragment exten public BaseStatusListFragment(){ super(20); - if (withComposeButton()) setListLayoutId(R.layout.recycler_fragment_with_fab); + if (wantsComposeButton()) setListLayoutId(R.layout.recycler_fragment_with_fab); } - protected boolean withComposeButton() { + protected boolean wantsComposeButton() { return false; } @@ -109,8 +108,6 @@ public abstract class BaseStatusListFragment exten setRetainInstance(true); } - - @Override protected RecyclerView.Adapter getAdapter(){ return adapter=new DisplayItemsAdapter(); @@ -278,6 +275,36 @@ public abstract class BaseStatusListFragment exten }); } + public @Nullable View getFab() { + if (getParentFragment() instanceof HasFab l) return l.getFab(); + else return fab; + } + + public void animateFab(boolean show) { + View fab = getFab(); + if (fab == null) return; + if (show && fab.getVisibility() != View.VISIBLE) { + fab.setVisibility(View.VISIBLE); + TranslateAnimation animate = new TranslateAnimation( + 0, + 0, + fab.getHeight() * 2, + 0); + animate.setDuration(300); + fab.startAnimation(animate); + } else if (!show && fab.getVisibility() == View.VISIBLE) { + TranslateAnimation animate = new TranslateAnimation( + 0, + 0, + 0, + fab.getHeight() * 2); + animate.setDuration(300); + fab.startAnimation(animate); + fab.setVisibility(View.INVISIBLE); + scrollDiff = 0; + } + } + @Override public void onViewCreated(View view, Bundle savedInstanceState){ super.onViewCreated(view, savedInstanceState); @@ -289,47 +316,21 @@ public abstract class BaseStatusListFragment exten if(currentPhotoViewer!=null) currentPhotoViewer.offsetView(-dx, -dy); - if (fab!=null && GlobalUserPreferences.enableFabAutoHide) { -// This piece of code should make it so that the fab is always visible if the status list scroll view is at the item at the top - if(list.getChildAt(0).getTop() == 0){ - scrollDiff= THRESHOLD +1; - }else{ - if(dy > 0){ - scrollDiff=0; - } - } - + View fab = getFab(); + if (fab!=null && GlobalUserPreferences.autoHideFab) { if (dy > 0 && fab.getVisibility() == View.VISIBLE) { - TranslateAnimation animate = new TranslateAnimation( - 0, - 0, - 0, - fab.getHeight() * 2); - animate.setDuration(300); -// animate.setFillAfter(true); - fab.startAnimation(animate); - fab.setEnabled(false); - fab.setVisibility(View.INVISIBLE); - scrollDiff = 0; + animateFab(false); } else if (dy < 0 && fab.getVisibility() != View.VISIBLE) { - if (scrollDiff > THRESHOLD) { - TranslateAnimation animate = new TranslateAnimation( - 0, - 0, - fab.getHeight() * 2, - 0); - animate.setDuration(300); -// animate.setFillAfter(true); - fab.startAnimation(animate); - fab.setEnabled(true); - fab.setVisibility(View.VISIBLE); + if (list.getChildAt(0).getTop() == 0 || scrollDiff > THRESHOLD) { + animateFab(true); scrollDiff = 0; } else { scrollDiff += Math.abs(dy); } } } - }}); + } + }); list.addItemDecoration(new StatusListItemDecoration()); ((UsableRecyclerView)list).setSelectorBoundsProvider(new UsableRecyclerView.SelectorBoundsProvider(){ private Rect tmpRect=new Rect(); @@ -364,11 +365,12 @@ public abstract class BaseStatusListFragment exten ((UsableRecyclerView) list).setIncludeMarginsInItemHitbox(true); updateToolbar(); - if (withComposeButton()) { - fab = view.findViewById(R.id.fab); + if (wantsComposeButton() && !getArguments().getBoolean("__disable_fab", false)) { fab.setVisibility(View.VISIBLE); fab.setOnClickListener(this::onFabClick); fab.setOnLongClickListener(this::onFabLongClick); + } else if (fab != null) { + fab.setVisibility(View.GONE); } } @@ -696,13 +698,13 @@ public abstract class BaseStatusListFragment exten currentPhotoViewer.onPause(); } - protected void onFabClick(View v){ + public void onFabClick(View v){ Bundle args=new Bundle(); args.putString("account", accountID); Nav.go(getActivity(), ComposeFragment.class, args); } - protected boolean onFabLongClick(View v) { + public boolean onFabLongClick(View v) { return UiUtils.pickAccountForCompose(getActivity(), accountID); } diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/HasFab.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/HasFab.java new file mode 100644 index 000000000..9245eafcd --- /dev/null +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/HasFab.java @@ -0,0 +1,7 @@ +package org.joinmastodon.android.fragments; + +import android.view.View; + +public interface HasFab { + View getFab(); +} diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/HashtagTimelineFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/HashtagTimelineFragment.java index a7168daea..e2244001a 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/HashtagTimelineFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/HashtagTimelineFragment.java @@ -40,7 +40,7 @@ public class HashtagTimelineFragment extends PinnableStatusListFragment { private MenuItem followButton; @Override - protected boolean withComposeButton() { + protected boolean wantsComposeButton() { return true; } @@ -146,12 +146,12 @@ public class HashtagTimelineFragment extends PinnableStatusListFragment { } @Override - protected boolean onFabLongClick(View v) { + public boolean onFabLongClick(View v) { return UiUtils.pickAccountForCompose(getActivity(), accountID, '#'+hashtag+' '); } @Override - protected void onFabClick(View v){ + public void onFabClick(View v){ Bundle args=new Bundle(); args.putString("account", accountID); args.putString("prefilledText", '#'+hashtag+' '); diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTabFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTabFragment.java index 0032d2742..fd1a199ce 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTabFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTabFragment.java @@ -25,6 +25,7 @@ import android.view.ViewParent; import android.view.ViewTreeObserver; import android.widget.Button; import android.widget.FrameLayout; +import android.widget.ImageButton; import android.widget.ImageView; import android.widget.PopupMenu; import android.widget.TextView; @@ -72,7 +73,7 @@ import me.grishka.appkit.fragments.OnBackPressedListener; import me.grishka.appkit.utils.CubicBezierInterpolator; import me.grishka.appkit.utils.V; -public class HomeTabFragment extends MastodonToolbarFragment implements ScrollableToTop, OnBackPressedListener, DomainDisplay { +public class HomeTabFragment extends MastodonToolbarFragment implements ScrollableToTop, OnBackPressedListener, DomainDisplay, HasFab { private static final int ANNOUNCEMENTS_RESULT = 654; private String accountID; @@ -100,6 +101,7 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab private PopupMenu overflowPopup; private View overflowActionView = null; private boolean announcementsBadged, settingsBadged; + private ImageButton fab; @Override public void onCreate(Bundle savedInstanceState) { @@ -128,6 +130,10 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab @Override public View onCreateContentView(LayoutInflater inflater, ViewGroup container, Bundle bundle) { FrameLayout view = new FrameLayout(getContext()); + inflater.inflate(R.layout.compose_fab, view); + fab = view.findViewById(R.id.fab); + fab.setOnClickListener(this::onFabClick); + fab.setOnLongClickListener(this::onFabLongClick); pager = new ViewPager2(getContext()); toolbarFrame = (FrameLayout) LayoutInflater.from(getContext()).inflate(R.layout.home_toolbar, getToolbar(), false); @@ -135,6 +141,7 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab Bundle args = new Bundle(); args.putString("account", accountID); args.putBoolean("__is_tab", true); + args.putBoolean("__disable_fab", true); args.putBoolean("onlyPosts", true); for (int i = 0; i < timelineDefinitions.size(); i++) { @@ -298,6 +305,20 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab return DomainDisplay.super.getDomain(); } + private void onFabClick(View v){ + if (fragments[pager.getCurrentItem()] instanceof BaseStatusListFragment l) { + l.onFabClick(v); + } + } + + private boolean onFabLongClick(View v) { + if (fragments[pager.getCurrentItem()] instanceof BaseStatusListFragment l) { + return l.onFabLongClick(v); + } else { + return false; + } + } + private void addListsToOverflowMenu() { Context ctx = getContext(); listsMenu.clear(); @@ -448,6 +469,7 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab private void updateSwitcherIcon(int i) { timelineIcon.setImageResource(timelines[i].getIcon().iconRes); timelineTitle.setText(timelines[i].getTitle(getContext())); + if (fragments[i] instanceof BaseStatusListFragment l) l.animateFab(true); } @Override @@ -686,6 +708,10 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab return hashtagsItems.values(); } + public ImageButton getFab() { + return fab; + } + private class HomePagerAdapter extends RecyclerView.Adapter { @NonNull @Override diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTimelineFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTimelineFragment.java index 837bd384a..6de831e18 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTimelineFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTimelineFragment.java @@ -38,7 +38,7 @@ public class HomeTimelineFragment extends StatusListFragment { private String lastSavedMarkerID; @Override - protected boolean withComposeButton() { + protected boolean wantsComposeButton() { return true; } diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ListTimelineFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ListTimelineFragment.java index 79422cbb7..fd2155b54 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ListTimelineFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ListTimelineFragment.java @@ -44,7 +44,7 @@ public class ListTimelineFragment extends PinnableStatusListFragment { private ListTimeline.RepliesPolicy repliesPolicy; @Override - protected boolean withComposeButton() { + protected boolean wantsComposeButton() { return true; } @@ -152,7 +152,7 @@ public class ListTimelineFragment extends PinnableStatusListFragment { } @Override - protected void onFabClick(View v){ + public void onFabClick(View v){ Bundle args=new Bundle(); args.putString("account", accountID); Nav.go(getActivity(), ComposeFragment.class, args); diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsListFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsListFragment.java index f583ba1db..ba55dfa4b 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsListFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsListFragment.java @@ -19,7 +19,6 @@ import org.joinmastodon.android.model.CacheablePaginatedResponse; import org.joinmastodon.android.model.Emoji; import org.joinmastodon.android.model.Filter; import org.joinmastodon.android.model.Notification; -import org.joinmastodon.android.model.PaginatedResponse; import org.joinmastodon.android.model.Status; import org.joinmastodon.android.ui.displayitems.AccountCardStatusDisplayItem; import org.joinmastodon.android.ui.displayitems.HeaderStatusDisplayItem; @@ -50,8 +49,8 @@ public class NotificationsListFragment extends BaseStatusListFragment getString(R.string.sk_post_edited); case SIGN_UP -> getString(R.string.sk_signed_up); case REPORT -> getString(R.string.sk_reported); - case EMOJI_REACTION -> getString(R.string.sk_reacted, n.emoji); + case REACTION, PLEROMA_EMOJI_REACTION -> + n.emoji != null ? getString(R.string.sk_reacted_with, n.emoji) : getString(R.string.sk_reacted); }; HeaderStatusDisplayItem titleItem=extraText!=null ? new HeaderStatusDisplayItem(n.id, n.account, n.createdAt, this, accountID, n.status, n.emojiUrl!=null ? HtmlParser.parseCustomEmoji(extraText, Collections.singletonList(emoji)) : extraText, n, null) : null; if(n.status!=null){ @@ -214,7 +214,6 @@ public class NotificationsListFragment extends BaseStatusListFragment 0 && fab.getVisibility() == View.VISIBLE) { - TranslateAnimation animate = new TranslateAnimation( - 0, - 0, - 0, - fab.getHeight() * 2); - animate.setDuration(300); - fab.startAnimation(animate); - fab.setVisibility(View.INVISIBLE); - scrollDiff = 0; - } else if (dy < 0 && fab.getVisibility() != View.VISIBLE) { - if (scrollDiff > 400) { - fab.setVisibility(View.VISIBLE); - TranslateAnimation animate = new TranslateAnimation( - 0, - 0, - fab.getHeight() * 2, - 0); - animate.setDuration(300); - fab.startAnimation(animate); - scrollDiff = 0; - } else { - scrollDiff += Math.abs(dy); - } - } - } } private Fragment getFragmentForPage(int page){ diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ScheduledStatusListFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ScheduledStatusListFragment.java index a7462e900..58283c547 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ScheduledStatusListFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ScheduledStatusListFragment.java @@ -32,7 +32,7 @@ public class ScheduledStatusListFragment extends BaseStatusListFragment allLanguages; public static final MastodonLanguage ENGLISH = new MastodonLanguage("en", "English", "English"); diff --git a/mastodon/src/main/res/values-de-rDE/strings_sk.xml b/mastodon/src/main/res/values-de-rDE/strings_sk.xml index 0a873825b..8db7cf770 100644 --- a/mastodon/src/main/res/values-de-rDE/strings_sk.xml +++ b/mastodon/src/main/res/values-de-rDE/strings_sk.xml @@ -82,8 +82,8 @@ %s unterstützt Übersetzung! %s scheint keine Übersetzung zu unterstützen. Suche im Fediverse - Reblog rückgängig machen - Rebloggen mit Sichtbarkeit + Teilen rückgängig machen + Teilen mit Sichtbarkeit Drüberkommentieren Hashtags, denen du folgst Link zum Beitrag kopieren @@ -96,9 +96,9 @@ Favorit mit anderem Konto Favorisiert als %s Bereits favorisiert - Mit einem anderen Konto boosten - Geboostet als %s - Bereits geboostet + Mit einem anderen Konto teilen + Geteilt als %s + Bereits geteilt Antworten mit anderem Konto Einheitliches Icon für alle Benachrichtigungen Weiterleiten zu %s @@ -269,7 +269,9 @@ Zitiere %s Antwort an %s gesendet Thread öffnen - Kompakte Geteilt/Geantwortet-Zeile + Kompakte Geteilt-/Geantwortet-Zeile “Als Antwort auf”-Zeile über Profilbild Vor dem Teilen bestätigen + hat reagiert + hat mit %s reagiert \ No newline at end of file diff --git a/mastodon/src/main/res/values-fr-rFR/strings_sk.xml b/mastodon/src/main/res/values-fr-rFR/strings_sk.xml index 3fd9ae09c..b40cc90b8 100644 --- a/mastodon/src/main/res/values-fr-rFR/strings_sk.xml +++ b/mastodon/src/main/res/values-fr-rFR/strings_sk.xml @@ -82,8 +82,8 @@ %s ne semble pas prendre en charge la traduction. Voulez-vous vraiment supprimer toutes les notifications \? Rechercher sur le Fediverse - Reposter avec la visibilité - Annuler le repost + Booster avec la visibilité + Annuler le boost Poster à ce sujet Hashtags que vous suivez Ouvrir dans un autre compte @@ -94,13 +94,13 @@ Mettre en favoris avec un autre compte Déjà mis en signet Déjà mis en favori - Reposté en tant que %s - Déjà reposté + Boosté en tant que %s + Déjà boosté Ajouté aux signets en tant que %s Ajouté aux favoris en tant que %s Répondre avec un autre compte Mettre en signet avec un autre compte - Reposter avec un autre compte + Booster avec un autre compte Icône uniforme pour toutes les notifications Transférer à %s Messages non envoyés @@ -171,7 +171,7 @@ ALT édité Modifier la timeline - Modifie un article reposté + Modifier un article boosté Désactiver le rappel pour ajouter du texte alternatif Messages modifiés Code @@ -271,7 +271,7 @@ Me répond Réponse envoyée à %s Afficher le fil - Ligne de repost/réponse compacte + Ligne boost/réponse compacte Ligne \"En réponse à\" au-dessus de l\'avatar - Confirmer avant de reposter + Confirmer avant de booster \ No newline at end of file diff --git a/mastodon/src/main/res/values-gl-rES/strings_sk.xml b/mastodon/src/main/res/values-gl-rES/strings_sk.xml index 47e008637..b36237b35 100644 --- a/mastodon/src/main/res/values-gl-rES/strings_sk.xml +++ b/mastodon/src/main/res/values-gl-rES/strings_sk.xml @@ -79,8 +79,8 @@ Favorecer con outra conta Favorita con %s Xa foi favorecida - Promovida por %s - Xa foi promovida + Impulsado coma %s + Xa foi impulsado Responder con outra conta Icona uniforme para tódalas notificacións Activar a eliminación de notificacións @@ -88,9 +88,9 @@ Personalizar o texto do botón de publicar %s non semella ter soporte para tradución. Buscando no Fediverso - Promover con visibilidade + Impulsar con visibilidade Publicar acerca disto - Retirar a promoción + Desfacer o impulso Copiar ligazón á publicación Buscando en %s Abrir con outra conta @@ -113,7 +113,7 @@ Programar ou borrador Non programar Non facer borrador - Promover con outra conta + Impulsar con outra conta Reducir movemento nas animacións Anuncios Marcar como lido @@ -225,7 +225,7 @@ Mazo Indicador Fórmula matemática - Edita unha publicación promovida + Edita unha publicación impulsada Sen resultados Gardar borrador\? Sen texto descriptivo @@ -271,5 +271,6 @@ Resposta enviada a %s Liña \"en resposta a\" sobre o avatar Mostrar chío - Compactar liña de promoción/resposta + Compactar liña de impulso/resposta + Confirma antes de impulsar \ No newline at end of file diff --git a/mastodon/src/main/res/values/strings_sk.xml b/mastodon/src/main/res/values/strings_sk.xml index a2fa16430..a5acff628 100644 --- a/mastodon/src/main/res/values/strings_sk.xml +++ b/mastodon/src/main/res/values/strings_sk.xml @@ -252,7 +252,8 @@ Enable this if your home instance runs on Glitch. Not needed for Hometown or Akkoma. signed up reported - reacted with %s + reacted with %s + reacted Users signing up New reports Server version: %s diff --git a/mastodon/src/main/res/values/styles.xml b/mastodon/src/main/res/values/styles.xml index 1a4c49621..ca8365ba6 100644 --- a/mastodon/src/main/res/values/styles.xml +++ b/mastodon/src/main/res/values/styles.xml @@ -222,6 +222,7 @@ @style/Theme.Mastodon.Toolbar.Dark.TrueBlack @color/black @color/black + @color/black ?colorGray700 ?colorGray900 @color/black @@ -257,7 +258,7 @@