From f1b0f828ace56640e898965bf8214b9f1a28b926 Mon Sep 17 00:00:00 2001 From: sk Date: Mon, 16 Jan 2023 16:23:38 -0300 Subject: [PATCH 001/218] Fixing up name of the setting, and making it disabled by default --- .../org/joinmastodon/android/GlobalUserPreferences.java | 6 +++--- .../android/fragments/BaseStatusListFragment.java | 3 +-- .../joinmastodon/android/fragments/SettingsFragment.java | 4 ++-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java b/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java index b7c707d94..31eced774 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java +++ b/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java @@ -33,7 +33,7 @@ public class GlobalUserPreferences{ public static boolean relocatePublishButton; public static boolean reduceMotion; public static boolean keepOnlyLatestNotification; - public static boolean disableFab; + public static boolean disableFabAutoHide; public static String publishButtonText; public static ThemePreference theme; public static ColorPreference color; @@ -73,7 +73,7 @@ public class GlobalUserPreferences{ enableDeleteNotifications=prefs.getBoolean("enableDeleteNotifications", true); reduceMotion=prefs.getBoolean("reduceMotion", false); keepOnlyLatestNotification=prefs.getBoolean("keepOnlyLatestNotification", false); - disableFab=prefs.getBoolean("disableFab", false); + disableFabAutoHide=prefs.getBoolean("disableFabAutoHide", false); theme=ThemePreference.values()[prefs.getInt("theme", 0)]; recentLanguages=fromJson(prefs.getString("recentLanguages", "{}"), recentLanguagesType, new HashMap<>()); recentEmojis=fromJson(prefs.getString("recentEmojis", "{}"), recentEmojisType, new HashMap<>()); @@ -110,7 +110,7 @@ public class GlobalUserPreferences{ .putBoolean("enableDeleteNotifications", enableDeleteNotifications) .putBoolean("reduceMotion", reduceMotion) .putBoolean("keepOnlyLatestNotification", keepOnlyLatestNotification) - .putBoolean("disableFab", disableFab) + .putBoolean("disableFabAutoHide", disableFabAutoHide) .putString("publishButtonText", publishButtonText) .putInt("theme", theme.ordinal()) .putString("color", color.name()) 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 76148ae84..49a81d60d 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java @@ -13,7 +13,6 @@ import android.text.Layout; import android.text.StaticLayout; import android.text.TextPaint; import android.text.TextUtils; -import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.view.WindowInsets; @@ -286,7 +285,7 @@ public abstract class BaseStatusListFragment exten if(currentPhotoViewer!=null) currentPhotoViewer.offsetView(-dx, -dy); - if (fab!=null && !GlobalUserPreferences.disableFab) { + if (fab!=null && GlobalUserPreferences.disableFabAutoHide) { if (dy > 0 /*&& !isFirstLaunch*/) { if (isScrollingUp /*&& !isFirstLaunch*/) { fab.setVisibility(View.INVISIBLE); diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java index fb33ccdcd..81fe364e3 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java @@ -210,8 +210,8 @@ public class SettingsFragment extends MastodonToolbarFragment{ GlobalUserPreferences.save(); needAppRestart=true; })); - items.add(new SwitchItem(R.string.mo_hide_compose_button_while_scrolling_setting, R.drawable.ic_fluent_edit_24_regular, GlobalUserPreferences.disableFab, i->{ - GlobalUserPreferences.disableFab=i.checked; + items.add(new SwitchItem(R.string.mo_hide_compose_button_while_scrolling_setting, R.drawable.ic_fluent_edit_24_regular, GlobalUserPreferences.disableFabAutoHide, i->{ + GlobalUserPreferences.disableFabAutoHide =i.checked; GlobalUserPreferences.save(); needAppRestart=true; })); From 47f57bab17a68526cc7e99e3918164000fd9b138 Mon Sep 17 00:00:00 2001 From: LucasGGamerM Date: Thu, 26 Jan 2023 14:50:52 -0300 Subject: [PATCH 002/218] Testing the hooks for weblate --- .../joinmastodon/android/fragments/BaseStatusListFragment.java | 1 - 1 file changed, 1 deletion(-) 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 49a81d60d..31742e0bb 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java @@ -284,7 +284,6 @@ public abstract class BaseStatusListFragment exten public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy){ if(currentPhotoViewer!=null) currentPhotoViewer.offsetView(-dx, -dy); - if (fab!=null && GlobalUserPreferences.disableFabAutoHide) { if (dy > 0 /*&& !isFirstLaunch*/) { if (isScrollingUp /*&& !isFirstLaunch*/) { From 2749ffb6f2b4c9c7163d2943dcb669ab6ab56a9b Mon Sep 17 00:00:00 2001 From: LucasGGamerM Date: Thu, 26 Jan 2023 16:23:54 -0300 Subject: [PATCH 003/218] Reverting the other irrelevant thing. --- .../joinmastodon/android/fragments/BaseStatusListFragment.java | 1 + 1 file changed, 1 insertion(+) 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 31742e0bb..3bb892285 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java @@ -279,6 +279,7 @@ public abstract class BaseStatusListFragment exten public void onViewCreated(View view, Bundle savedInstanceState){ super.onViewCreated(view, savedInstanceState); fab=view.findViewById(R.id.fab); + list.addOnScrollListener(new RecyclerView.OnScrollListener(){ @Override public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy){ From b0e4f707aac2af1da8db3ac3d5c9ab8fb3c57a99 Mon Sep 17 00:00:00 2001 From: Kevin Date: Tue, 24 Jan 2023 22:07:17 +0000 Subject: [PATCH 004/218] Translated using Weblate (German) Currently translated at 100.0% (13 of 13 strings) Translation: Moshidon/metadata Translate-URL: https://translate.codeberg.org/projects/moshidon/metadata/de/ --- metadata/de-DE/changelogs/78.txt | 1 + metadata/de-DE/changelogs/79.txt | 1 + metadata/de-DE/changelogs/80.txt | 1 + metadata/de-DE/changelogs/81.txt | 2 ++ metadata/de-DE/changelogs/82.txt | 9 +++++++++ metadata/de-DE/changelogs/83.txt | 4 ++++ metadata/de-DE/changelogs/84.txt | 3 +++ metadata/de-DE/changelogs/85.txt | 7 +++++++ metadata/de-DE/changelogs/86.txt | 4 ++++ metadata/de-DE/changelogs/87.txt | 5 +++++ metadata/de-DE/full_description.txt | 15 +++++++++++++++ metadata/de-DE/short_description.txt | 1 + metadata/de-DE/title.txt | 1 + 13 files changed, 54 insertions(+) create mode 100644 metadata/de-DE/changelogs/78.txt create mode 100644 metadata/de-DE/changelogs/79.txt create mode 100644 metadata/de-DE/changelogs/80.txt create mode 100644 metadata/de-DE/changelogs/81.txt create mode 100644 metadata/de-DE/changelogs/82.txt create mode 100644 metadata/de-DE/changelogs/83.txt create mode 100644 metadata/de-DE/changelogs/84.txt create mode 100644 metadata/de-DE/changelogs/85.txt create mode 100644 metadata/de-DE/changelogs/86.txt create mode 100644 metadata/de-DE/changelogs/87.txt create mode 100644 metadata/de-DE/full_description.txt create mode 100644 metadata/de-DE/short_description.txt create mode 100644 metadata/de-DE/title.txt diff --git a/metadata/de-DE/changelogs/78.txt b/metadata/de-DE/changelogs/78.txt new file mode 100644 index 000000000..d92c8a3f6 --- /dev/null +++ b/metadata/de-DE/changelogs/78.txt @@ -0,0 +1 @@ +das Entfernen der Post-Trennungen von der Timeline! Konfigurierbar. diff --git a/metadata/de-DE/changelogs/79.txt b/metadata/de-DE/changelogs/79.txt new file mode 100644 index 000000000..f53a1d45d --- /dev/null +++ b/metadata/de-DE/changelogs/79.txt @@ -0,0 +1 @@ +Eine Spenden-Schaltfläche wurde hinzugefügt! diff --git a/metadata/de-DE/changelogs/80.txt b/metadata/de-DE/changelogs/80.txt new file mode 100644 index 000000000..7623e6263 --- /dev/null +++ b/metadata/de-DE/changelogs/80.txt @@ -0,0 +1 @@ +Ein Schalter um die Veröffentlichen-Schaltfläche an eine erreichbarere Position zu bringen! Das ist die Standardeinstellung! diff --git a/metadata/de-DE/changelogs/81.txt b/metadata/de-DE/changelogs/81.txt new file mode 100644 index 000000000..83e3366f9 --- /dev/null +++ b/metadata/de-DE/changelogs/81.txt @@ -0,0 +1,2 @@ +Fehlerbehebung bei der Veröffentlichen-Schaltfläche im Fall von niedrigen Displayauflösungen oder Sprachen mit langen Wörtern. Die Schaltfläche ist jetzt ein Symbol, wenn sie an einer erreichbareren Position platziert ist! +Kleinere Verbesserungen bei der App-Aktualisierungsnachricht diff --git a/metadata/de-DE/changelogs/82.txt b/metadata/de-DE/changelogs/82.txt new file mode 100644 index 000000000..8cad03756 --- /dev/null +++ b/metadata/de-DE/changelogs/82.txt @@ -0,0 +1,9 @@ +Mit Version 82 werden viele Features von Megalodon hinzugefügt: +- Entwurfsfunktion und geplantes Posten +- Überarbeitung der Einstellungsseite +- die Möglichkeit die Veröffentlichen-Schaltfläche umzubenennen +- die Möglichkeit Animationen zu reduzieren +- ein Symbol für Bot-Profile! Danke @FineFindus +- Aktualisierung der Deutschübersetzung! Danke @dontobi +- kleinere Verbesserungen der Oberfläche +- größere Verbesserungen, wie das Gedrückhalten von Schaltflächen um mit anderen Profilen zu interagieren diff --git a/metadata/de-DE/changelogs/83.txt b/metadata/de-DE/changelogs/83.txt new file mode 100644 index 000000000..0e162870d --- /dev/null +++ b/metadata/de-DE/changelogs/83.txt @@ -0,0 +1,4 @@ +Version 83 bringt kleinere Verbesserungen, wie: +- App-Abstürze beim Interagieren mit Erwähnungen +- Überarbeitung des Bot-Symbols +- eine Erinnerung, dass eine Bildbeschreibung hinzugefügt werden sollte, um Menschen mit visuellen Schwierigkeiten zu unterstützen. Danke @FineFindus! diff --git a/metadata/de-DE/changelogs/84.txt b/metadata/de-DE/changelogs/84.txt new file mode 100644 index 000000000..481331f9b --- /dev/null +++ b/metadata/de-DE/changelogs/84.txt @@ -0,0 +1,3 @@ +Version 84 behebt ein paar Fehler, wie z. B.: +- Fehler beim Login-Callback +- Aktualisierte Deutschübersetzung. Danke @DonTobi! diff --git a/metadata/de-DE/changelogs/85.txt b/metadata/de-DE/changelogs/85.txt new file mode 100644 index 000000000..13caf23d2 --- /dev/null +++ b/metadata/de-DE/changelogs/85.txt @@ -0,0 +1,7 @@ +Neuerungen in Version 85: +- Langes Gedrückthalten der Suchtaste bringt die Tastatur hervor +- Drücken der Suchtaste bringt auch im Suchen-Tab die Tastatur hervor +- Ein Bot-Symbol wird nun für Posts von Bot-Accounts angezeigt, Danke @FineFindus! +- Verbesserte Sichtbarkeit des Bot-Symbols auf Bot-Profilen, Danke @FineFindus! +- Aktualisierte Deutschübersetzung, Danke @Dontobi! +- Kleinere Fehler wurden behoben diff --git a/metadata/de-DE/changelogs/86.txt b/metadata/de-DE/changelogs/86.txt new file mode 100644 index 000000000..498e6381c --- /dev/null +++ b/metadata/de-DE/changelogs/86.txt @@ -0,0 +1,4 @@ +Neues in Version 86: +- Benachrichtigungen stapeln, d. h. mehrere Benachrichtigungen gleichzeitig anzeigen +- Ankündigungen +- viele kleinere Fehler wurden behoben. diff --git a/metadata/de-DE/changelogs/87.txt b/metadata/de-DE/changelogs/87.txt new file mode 100644 index 000000000..7a96b9612 --- /dev/null +++ b/metadata/de-DE/changelogs/87.txt @@ -0,0 +1,5 @@ +Neues in Version 87: +- das neues Home Layout von Megalodon; die Funktionen zwischen den Layouts zu wechseln ist in Arbeit +- bessere Handhabe von Benachrichtigungen +- ein verändertes Bot-Symbol +- viele kleinere Verbesserungen diff --git a/metadata/de-DE/full_description.txt b/metadata/de-DE/full_description.txt new file mode 100644 index 000000000..c7b539790 --- /dev/null +++ b/metadata/de-DE/full_description.txt @@ -0,0 +1,15 @@ +Moshidon ist eine veränderte Version der offiziellen Mastodon Android-App , die wichtige Funktionen ergänzt, die in der offiziellen App feheln, wie z. B. eine Föderierte Timeline, Ungelistetes Veröffentlichen und die Möglichkeit Bildbeschreibungen zu sehen. + +Wichtigste Features + +- große Farbauswahl: Material You und viele weitere Farbschemen! +- Übersetzungsfunktion: Eine Schaltfläche, um Übersetzungen durchzuführen! +- Tröt-Sprachauswahl: Eine Schaltfläche, um die Sprache des Posts auszuwählen! +- Ungelistetes Veröffentlichen: Poste öffentlich, ohne dass deine Posts in Trends, Hashtags oder auf öffentlichen Timelines erscheinen. +- Föderierte Timeline: Sieh alle öffentlichen Posts von allen Fediverse-Servern, mit denen deine Instanz verbunden ist. +- Bildbeschreibungen: Sieh auf einen Blick, ob ein Bild oder ein Video einen Alternativtext hat. +- Posts anpinnen: Pinne deine wichtigsten Posts auf deiner Profilseite an und finde Pins von anderen Nutzern im "Angepinnt"-Tab. +- Hashtags folgen: Sieh Posts mit bestimmten Hashtags direkt auf deiner Startseite, indem ihnen einfach folgst. +- Follower-Anfragen beantworten: Bestätige oder lehne Follower-Anfragen direkt in Benachrichtigungen oder auf der separaten Follower-Anfrageliste ab. +- Löschen und Neuverfassen: Die beliebte Funktion, die Bearbeiten von Posts ohne eigentliche Bearbeitungsfunktion möglich gemacht hat. +- Extras: Viele Anpassungen der Nutzeroberfläche, wie z. B. Interaktionssymbole in Benachrichtigungen und die Entfernung von vielen Unstimmigkeiten beim ursprünglichen Design! diff --git a/metadata/de-DE/short_description.txt b/metadata/de-DE/short_description.txt new file mode 100644 index 000000000..e30f4b882 --- /dev/null +++ b/metadata/de-DE/short_description.txt @@ -0,0 +1 @@ +Mastodon für Android aber mit Material You und viel mehr Features diff --git a/metadata/de-DE/title.txt b/metadata/de-DE/title.txt new file mode 100644 index 000000000..398c58562 --- /dev/null +++ b/metadata/de-DE/title.txt @@ -0,0 +1 @@ +Moshidon From e367b7711fb4844f96fd9431ff00b79c186124fd Mon Sep 17 00:00:00 2001 From: Kevin Date: Tue, 24 Jan 2023 21:33:01 +0000 Subject: [PATCH 005/218] Translated using Weblate (German) Currently translated at 100.0% (22 of 22 strings) Translation: Moshidon/values Translate-URL: https://translate.codeberg.org/projects/moshidon/values/de/ --- mastodon/src/main/res/values-de-rDE/strings_mo.xml | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/mastodon/src/main/res/values-de-rDE/strings_mo.xml b/mastodon/src/main/res/values-de-rDE/strings_mo.xml index b468b6b32..ee891f111 100644 --- a/mastodon/src/main/res/values-de-rDE/strings_mo.xml +++ b/mastodon/src/main/res/values-de-rDE/strings_mo.xml @@ -1,17 +1,14 @@ Moshidon - Nord \@moshidon Beitrags Trennung deaktivieren - Veröffentlichen Schaltfläche verschieben + Veröffentlichen-Schaltfläche verschieben Veröffentlichen Schaltfläche beim scrollen ausblenden Moshidon sagt Hi! gib den Domain-Namen deiner Heimat-Instanz unten ein. - Moshidon v%1$s (%2$d) - Notiz zu diesem Profil hinzufügen Änderungen der Notiz bestätigen Speichern der Notiz fehlgeschlagen @@ -22,11 +19,9 @@ Die enthaltenen Bilder haben keine Beschreibung. Bitte füge eine Beschreibung hinzu, damit auch sehbehinderte Personen teilnehmen können. Kürzlich verwendet Kürzlich verwendete Emojis löschen - Deaktiviere die Funktion "Veröffentlichen Schaltfläche verschieben", um eine Anpassung zu ermöglichen. - + Deaktiviere die Funktion Veröffentlichen-Schaltfläche verschieben, um eine Anpassung zu ermöglichen Neue Umfrageoption hinzufügen Verfassen Fehler beim Veröffentlichen - \ No newline at end of file From 699925ac9bbf083d75f410596fe24e559790149a Mon Sep 17 00:00:00 2001 From: Andrewblasco Date: Wed, 25 Jan 2023 16:48:00 +0000 Subject: [PATCH 006/218] Translated using Weblate (Spanish) Currently translated at 100.0% (22 of 22 strings) Translation: Moshidon/values Translate-URL: https://translate.codeberg.org/projects/moshidon/values/es/ --- .../src/main/res/values-es-rES/strings_mo.xml | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/mastodon/src/main/res/values-es-rES/strings_mo.xml b/mastodon/src/main/res/values-es-rES/strings_mo.xml index d781ec5f1..f159928f7 100644 --- a/mastodon/src/main/res/values-es-rES/strings_mo.xml +++ b/mastodon/src/main/res/values-es-rES/strings_mo.xml @@ -1,4 +1,22 @@ - - + Nord + Desactivar divisores de publicaciones + Recolocar botón de publicación + Esconder botón de escritura al deslizar + Para empezar introduce el nombre del dominio de tu instancia debajo, por favor. + Añade una nota sobre este perfil + Confirmar cambios en la nota + Fallo al guardar la nota + Moshidon %s se puede descargar. + Moshidon %s se ha descargado y se puede instalar. + Sin descripción de imagen + Usados recientemente + Borrar emojis usados recientemente + Desactiva \"Recolocar botón de publicación\" para poder personalizar + Añadir nueva opción en la encuesta + Componer + Error al publicar + Contribuir en Moshidon + Las imágenes incluidas no tienen descripción. Por favor, piénsate añadir una para permitir a las personas con discapacidad participar. + \ No newline at end of file From de864edb337d2be79d53138fa81d6c873e7123a1 Mon Sep 17 00:00:00 2001 From: tygyh Date: Thu, 26 Jan 2023 10:23:58 +0000 Subject: [PATCH 007/218] Translated using Weblate (Swedish) Currently translated at 31.8% (7 of 22 strings) Translation: Moshidon/values Translate-URL: https://translate.codeberg.org/projects/moshidon/values/sv/ --- mastodon/src/main/res/values-sv-rSE/strings_mo.xml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mastodon/src/main/res/values-sv-rSE/strings_mo.xml b/mastodon/src/main/res/values-sv-rSE/strings_mo.xml index d781ec5f1..3c2476875 100644 --- a/mastodon/src/main/res/values-sv-rSE/strings_mo.xml +++ b/mastodon/src/main/res/values-sv-rSE/strings_mo.xml @@ -1,4 +1,7 @@ - - + Inaktivera inläggsavdelare + Flytta publiceringsknappen + Nord + Dölj skrivknappen medan du skrollar + \ No newline at end of file From c77cb1460229f1c90a8dafc2ea2965b52e9b7001 Mon Sep 17 00:00:00 2001 From: Andrewblasco Date: Wed, 25 Jan 2023 17:24:57 +0000 Subject: [PATCH 008/218] Translated using Weblate (Spanish) Currently translated at 100.0% (13 of 13 strings) Translation: Moshidon/metadata Translate-URL: https://translate.codeberg.org/projects/moshidon/metadata/es/ --- metadata/es-ES/changelogs/78.txt | 1 + metadata/es-ES/changelogs/79.txt | 1 + metadata/es-ES/changelogs/80.txt | 1 + metadata/es-ES/changelogs/81.txt | 2 ++ metadata/es-ES/changelogs/82.txt | 9 +++++++++ metadata/es-ES/changelogs/83.txt | 4 ++++ metadata/es-ES/changelogs/84.txt | 3 +++ metadata/es-ES/changelogs/85.txt | 7 +++++++ metadata/es-ES/changelogs/86.txt | 4 ++++ metadata/es-ES/changelogs/87.txt | 5 +++++ metadata/es-ES/full_description.txt | 15 +++++++++++++++ metadata/es-ES/short_description.txt | 1 + metadata/es-ES/title.txt | 1 + 13 files changed, 54 insertions(+) create mode 100644 metadata/es-ES/changelogs/78.txt create mode 100644 metadata/es-ES/changelogs/79.txt create mode 100644 metadata/es-ES/changelogs/80.txt create mode 100644 metadata/es-ES/changelogs/81.txt create mode 100644 metadata/es-ES/changelogs/82.txt create mode 100644 metadata/es-ES/changelogs/83.txt create mode 100644 metadata/es-ES/changelogs/84.txt create mode 100644 metadata/es-ES/changelogs/85.txt create mode 100644 metadata/es-ES/changelogs/86.txt create mode 100644 metadata/es-ES/changelogs/87.txt create mode 100644 metadata/es-ES/full_description.txt create mode 100644 metadata/es-ES/short_description.txt create mode 100644 metadata/es-ES/title.txt diff --git a/metadata/es-ES/changelogs/78.txt b/metadata/es-ES/changelogs/78.txt new file mode 100644 index 000000000..0c67aad1f --- /dev/null +++ b/metadata/es-ES/changelogs/78.txt @@ -0,0 +1 @@ +¡Desactivar los divisores de los toots en la cronología principal! Es una opción. diff --git a/metadata/es-ES/changelogs/79.txt b/metadata/es-ES/changelogs/79.txt new file mode 100644 index 000000000..6a5151a35 --- /dev/null +++ b/metadata/es-ES/changelogs/79.txt @@ -0,0 +1 @@ +¡Añadido un botón para donar! diff --git a/metadata/es-ES/changelogs/80.txt b/metadata/es-ES/changelogs/80.txt new file mode 100644 index 000000000..7fb02e847 --- /dev/null +++ b/metadata/es-ES/changelogs/80.txt @@ -0,0 +1 @@ +¡Se añade una opción para mover el botón de publicación a una posición más cómoda! Ahora es la opción por defecto. diff --git a/metadata/es-ES/changelogs/81.txt b/metadata/es-ES/changelogs/81.txt new file mode 100644 index 000000000..dc9f2a27b --- /dev/null +++ b/metadata/es-ES/changelogs/81.txt @@ -0,0 +1,2 @@ +Se arregla un problema con el botón de publicación, que aparecía cortado en pantallas con resoluciones bajas o con textos largos. Ahora es un icono cuando se coloca en la parte de abajo. +Pequeños arreglos a la visualización de cambios de versión. diff --git a/metadata/es-ES/changelogs/82.txt b/metadata/es-ES/changelogs/82.txt new file mode 100644 index 000000000..b7f50f57f --- /dev/null +++ b/metadata/es-ES/changelogs/82.txt @@ -0,0 +1,9 @@ +La versión 82 añade muchas características del código fuente, como por ejemplo: +- Borradores y publicaciones programadas +- Cambios en la página de ajustes +- Opción para cambiar el texto del botón de publicación +- Opción para reducir animaciones +- ¡Un icono para las cuentas de bots! Gracias a @FineFindus +- ¡Traducción al alemán actualizada! Gracias a @dantobi +- Varias mejoras menores de la interfaz +- Mejoras de usabilidad, como la opción de mantener pulsado para interactuar con otra cuenta diff --git a/metadata/es-ES/changelogs/83.txt b/metadata/es-ES/changelogs/83.txt new file mode 100644 index 000000000..c0de3fa82 --- /dev/null +++ b/metadata/es-ES/changelogs/83.txt @@ -0,0 +1,4 @@ +La versión 83 trae algunas mejoras menores, por ejemplo: +- Arregla los cierres al pulsar en menciones +- Remodela el icono de los bots +- Incorpora un recordatorio para añadir descripción de imagen para favorecer la inclusión de las personas con discapacidad. ¡Gracias @FineFindus! diff --git a/metadata/es-ES/changelogs/84.txt b/metadata/es-ES/changelogs/84.txt new file mode 100644 index 000000000..580b21c8d --- /dev/null +++ b/metadata/es-ES/changelogs/84.txt @@ -0,0 +1,3 @@ +La versión 84 arregla algunos errores, por ejemplo: +- Errores en el inicio de sesión +- Traducción al alemán actualizada. ¡Gracias @DanTobi! diff --git a/metadata/es-ES/changelogs/85.txt b/metadata/es-ES/changelogs/85.txt new file mode 100644 index 000000000..2ef727476 --- /dev/null +++ b/metadata/es-ES/changelogs/85.txt @@ -0,0 +1,7 @@ +Cosas nuevas en esta versión 85: +Añadida pulsación prolongada en el icono de búsqueda para abrir el teclado +Pulsar el botón de búsqueda cuando estás en esa pestaña también abre el teclado +Se incluye un icono de bots en los toots de cuentas de bots. ¡Gracias @FineFindus! +Se mejora la visibilidad del icono de bot en el perfil de los usuarios. ¡Gracias @FineFindus! +Traducción al alemán actualizada, ¡gracias a @Dontobi! +Solución de problemas menores de interfaz diff --git a/metadata/es-ES/changelogs/86.txt b/metadata/es-ES/changelogs/86.txt new file mode 100644 index 000000000..bc3efa94d --- /dev/null +++ b/metadata/es-ES/changelogs/86.txt @@ -0,0 +1,4 @@ +Novedades de la versión 86: +- Opción de apilar notificaciones, es decir, tener varias notificaciones; +- Se incluyen los Anuncios de la instancia; +- Varias correcciones de interfaz. diff --git a/metadata/es-ES/changelogs/87.txt b/metadata/es-ES/changelogs/87.txt new file mode 100644 index 000000000..b5575e8a9 --- /dev/null +++ b/metadata/es-ES/changelogs/87.txt @@ -0,0 +1,5 @@ +Novedades de la versión 87: +- Nueva navegación de inicio heredada de Megalodon, todavía estamos trabajando ello. +- Mejor gestión de las notificaciones +- Nuevo icono para los bots +- Un puñado de mejoras menores diff --git a/metadata/es-ES/full_description.txt b/metadata/es-ES/full_description.txt new file mode 100644 index 000000000..438b41e2c --- /dev/null +++ b/metadata/es-ES/full_description.txt @@ -0,0 +1,15 @@ +Moshidon es una versión modificada de la app oficial de Mastodon para Android, para añadir importantes características de las que carece la app oficial, como la cronología federada, publicaciones no listadas y el visor de descripciones de imagen. + +Principales características + +-Muchos colores: ¡Permite aplicar Material You y muchas opciones de temas de color! +-Botón de traducción: ¡Incluye un botón de traducción! +-Selector de idioma: ¡Incluye un selector de idioma al escribir un toot! +-Publicaciones no listadas: Publica sin que tus comentarios aparezcan en tendencias, hashtags o cronologías públicas. +-Cronología federada: Ve todas las publicaciones de la gente en el Fediverso conectada a tu instancia. +-Visor de descripciones de imagen: Comprueba rápidamente si una imagen o vídeo cuenta con una descripción. +-Publicaciones fijadas: Fija tus publicaciones más importantes en tu perfil y ve lo que los demás han fijado en la pestaña "Fijadas". +-Seguir hashtags: Sigue hashtags para ver las nuevas publicaciones de hashtags específicos directamente en tu cronología. +-Peticiones de seguimiento: Acepta o rechaza peticiones de seguimiento desde las notificaciones o la lista dedicada. +-Borrar y reescribir: La característica más buscada, que te permite editar. +-Extras: Incluye varios extras en la interfaz, como iconos específicos en las notificaciones o corrección de molestias de la interfaz original. diff --git a/metadata/es-ES/short_description.txt b/metadata/es-ES/short_description.txt new file mode 100644 index 000000000..f3da844e3 --- /dev/null +++ b/metadata/es-ES/short_description.txt @@ -0,0 +1 @@ +Mastodon para Android con soporte Material You y más características diff --git a/metadata/es-ES/title.txt b/metadata/es-ES/title.txt new file mode 100644 index 000000000..398c58562 --- /dev/null +++ b/metadata/es-ES/title.txt @@ -0,0 +1 @@ +Moshidon From cf1f8e8d1a4c5f7256239d34db270917ac636e84 Mon Sep 17 00:00:00 2001 From: LamaEpik Date: Tue, 24 Jan 2023 22:55:24 +0000 Subject: [PATCH 009/218] Translated using Weblate (French) Currently translated at 15.3% (2 of 13 strings) Translation: Moshidon/metadata Translate-URL: https://translate.codeberg.org/projects/moshidon/metadata/fr/ --- metadata/fr-FR/short_description.txt | 1 + metadata/fr-FR/title.txt | 1 + 2 files changed, 2 insertions(+) create mode 100644 metadata/fr-FR/short_description.txt create mode 100644 metadata/fr-FR/title.txt diff --git a/metadata/fr-FR/short_description.txt b/metadata/fr-FR/short_description.txt new file mode 100644 index 000000000..4653ae033 --- /dev/null +++ b/metadata/fr-FR/short_description.txt @@ -0,0 +1 @@ +Mastodon pour Android mais en Material You et avec plus de fonctionnalités diff --git a/metadata/fr-FR/title.txt b/metadata/fr-FR/title.txt new file mode 100644 index 000000000..398c58562 --- /dev/null +++ b/metadata/fr-FR/title.txt @@ -0,0 +1 @@ +Moshidon From 57251d58cbadb1358ebde91bab07674ad8321b7a Mon Sep 17 00:00:00 2001 From: HudobniVolk Date: Wed, 25 Jan 2023 16:05:14 +0000 Subject: [PATCH 010/218] Translated using Weblate (Slovenian) Currently translated at 46.1% (6 of 13 strings) Translation: Moshidon/metadata Translate-URL: https://translate.codeberg.org/projects/moshidon/metadata/sl/ --- metadata/sl/changelogs/78.txt | 1 + metadata/sl/changelogs/79.txt | 1 + metadata/sl/changelogs/80.txt | 1 + metadata/sl/changelogs/87.txt | 5 +++++ metadata/sl/short_description.txt | 1 + metadata/sl/title.txt | 1 + 6 files changed, 10 insertions(+) create mode 100644 metadata/sl/changelogs/78.txt create mode 100644 metadata/sl/changelogs/79.txt create mode 100644 metadata/sl/changelogs/80.txt create mode 100644 metadata/sl/changelogs/87.txt create mode 100644 metadata/sl/short_description.txt create mode 100644 metadata/sl/title.txt diff --git a/metadata/sl/changelogs/78.txt b/metadata/sl/changelogs/78.txt new file mode 100644 index 000000000..5691a9e96 --- /dev/null +++ b/metadata/sl/changelogs/78.txt @@ -0,0 +1 @@ +Odstranitev ločevanja objav iz časovnice! Je tudi nastavljivo. diff --git a/metadata/sl/changelogs/79.txt b/metadata/sl/changelogs/79.txt new file mode 100644 index 000000000..cc948fe01 --- /dev/null +++ b/metadata/sl/changelogs/79.txt @@ -0,0 +1 @@ +Dodan gumb za doniranje! diff --git a/metadata/sl/changelogs/80.txt b/metadata/sl/changelogs/80.txt new file mode 100644 index 000000000..6ffe41bf8 --- /dev/null +++ b/metadata/sl/changelogs/80.txt @@ -0,0 +1 @@ +Dodan izbirni preklop gumba za objavo na bolj dosegljiv položaj! Zdaj je to privzeta funkcija! diff --git a/metadata/sl/changelogs/87.txt b/metadata/sl/changelogs/87.txt new file mode 100644 index 000000000..b2bc89390 --- /dev/null +++ b/metadata/sl/changelogs/87.txt @@ -0,0 +1,5 @@ +Kaj je novega v različici 87: +- nova Megalodon postavitev domače strani; preklapljanje funkcij med postavitvami je v teku +- boljše ravnanje z obvestili +- spremenjena ikona bota +- veliko manjših izboljšav diff --git a/metadata/sl/short_description.txt b/metadata/sl/short_description.txt new file mode 100644 index 000000000..623fcb6b4 --- /dev/null +++ b/metadata/sl/short_description.txt @@ -0,0 +1 @@ +Mastodon za Android,ki podpira teme Material You in ima več funkcij diff --git a/metadata/sl/title.txt b/metadata/sl/title.txt new file mode 100644 index 000000000..398c58562 --- /dev/null +++ b/metadata/sl/title.txt @@ -0,0 +1 @@ +Moshidon From 6cf8793efea7776c5dfe5e506a9958fd32db0b17 Mon Sep 17 00:00:00 2001 From: tygyh Date: Thu, 26 Jan 2023 10:22:02 +0000 Subject: [PATCH 011/218] Translated using Weblate (Swedish) Currently translated at 38.4% (5 of 13 strings) Translation: Moshidon/metadata Translate-URL: https://translate.codeberg.org/projects/moshidon/metadata/sv/ --- metadata/sv-SE/changelogs/78.txt | 1 + metadata/sv-SE/changelogs/79.txt | 1 + metadata/sv-SE/full_description.txt | 15 +++++++++++++++ metadata/sv-SE/short_description.txt | 1 + metadata/sv-SE/title.txt | 1 + 5 files changed, 19 insertions(+) create mode 100644 metadata/sv-SE/changelogs/78.txt create mode 100644 metadata/sv-SE/changelogs/79.txt create mode 100644 metadata/sv-SE/full_description.txt create mode 100644 metadata/sv-SE/short_description.txt create mode 100644 metadata/sv-SE/title.txt diff --git a/metadata/sv-SE/changelogs/78.txt b/metadata/sv-SE/changelogs/78.txt new file mode 100644 index 000000000..cf3e6b3ff --- /dev/null +++ b/metadata/sv-SE/changelogs/78.txt @@ -0,0 +1 @@ +Tar bort tutavdelaren på huvudtidslinjen! Det är också konfigurerbart. diff --git a/metadata/sv-SE/changelogs/79.txt b/metadata/sv-SE/changelogs/79.txt new file mode 100644 index 000000000..0d8aee8e0 --- /dev/null +++ b/metadata/sv-SE/changelogs/79.txt @@ -0,0 +1 @@ +Lägger till en donationsknapp! diff --git a/metadata/sv-SE/full_description.txt b/metadata/sv-SE/full_description.txt new file mode 100644 index 000000000..9dfbb5845 --- /dev/null +++ b/metadata/sv-SE/full_description.txt @@ -0,0 +1,15 @@ +Moshidon är en modifierad version av den officiella Mastodon Android-appen som lägger till viktiga funktioner som saknas i den officiella appen, till exempel den federerade appen tidslinje, olistat inlägg och en bildbeskrivningsvisare. + +Nyckelfunktioner + +- Många färger: Ger material som du temat och många färgglada alternativ för teman! +- Översätt-knapp: Ger en översätt-knapp! +- Tutspråkväljare: Tar in en tandspråkväljare! +- Olistat inlägg: Lägg upp offentligt utan att ditt inlägg visas i trender, hashtaggar eller offentliga tidslinjer. +- Federerad tidslinje: Se alla offentliga inlägg från personer i alla andra Fediverse-kvarter som din heminstans är ansluten till. +- Visare för bildbeskrivningar: Kontrollera snabbt om en bild eller video har en alternativ text bifogad. +- Fästa inlägg: Fäst dina viktigaste inlägg i din profil och se vad andra har fäst med fliken "Fäst". +- Följ hashtags: Se nya inlägg från specifika hashtaggar direkt på din hemtidslinje genom att följa dem. +- Besvara följförfrågningar: Acceptera eller avvisa följförfrågningar från dina meddelanden eller den dedikerade listan med följförfrågningar. +- Ta bort och skapa om: Den mycket älskade funktionen som gjorde redigering möjlig utan en egentlig redigeringsfunktion. +- Extras: Ger många extra gränssnittsfunktioner, som interaktionsikoner på meddelandena och att ta bort många irritationsmoment med det ursprungliga gränssnittet! diff --git a/metadata/sv-SE/short_description.txt b/metadata/sv-SE/short_description.txt new file mode 100644 index 000000000..4b13342f3 --- /dev/null +++ b/metadata/sv-SE/short_description.txt @@ -0,0 +1 @@ +Mastodon för Android men det är Material You och har fler funktioner diff --git a/metadata/sv-SE/title.txt b/metadata/sv-SE/title.txt new file mode 100644 index 000000000..398c58562 --- /dev/null +++ b/metadata/sv-SE/title.txt @@ -0,0 +1 @@ +Moshidon From ececa7aa2f1b2ad2d788b0acbbf740451aa7bdd0 Mon Sep 17 00:00:00 2001 From: FineFindus <63370021+finefindus@users.noreply.github.com> Date: Wed, 25 Jan 2023 18:09:10 -0300 Subject: [PATCH 012/218] refactor(compose-fab): show fab after small scroll distance --- .../fragments/AccountTimelineFragment.java | 2 +- .../fragments/BaseStatusListFragment.java | 36 +++++++++---------- .../android/fragments/ProfileFragment.java | 23 ++++++++++++ .../ui/views/NestedRecyclerScrollView.java | 17 +++++++++ 4 files changed, 59 insertions(+), 19 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/AccountTimelineFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/AccountTimelineFragment.java index 786bf6ca4..b330ff4cc 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/AccountTimelineFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/AccountTimelineFragment.java @@ -71,7 +71,7 @@ public class AccountTimelineFragment extends StatusListFragment{ @Override public void onViewCreated(View view, Bundle savedInstanceState){ super.onViewCreated(view, savedInstanceState); - fab = ((ProfileFragment) getParentFragment()).getFab(); +// fab = ((ProfileFragment) getParentFragment()).getFab(); } @Override 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 3bb892285..acd61a03b 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java @@ -74,8 +74,7 @@ public abstract class BaseStatusListFragment exten protected String accountID; protected PhotoViewer currentPhotoViewer; protected ImageButton fab; - protected boolean isScrollingUp = false; -// protected boolean isFirstLaunch = true; + protected int scrollDiff = 0; protected HashMap knownAccounts=new HashMap<>(); protected HashMap relationships=new HashMap<>(); protected Rect tmpRect=new Rect(); @@ -285,22 +284,21 @@ public abstract class BaseStatusListFragment exten public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy){ if(currentPhotoViewer!=null) currentPhotoViewer.offsetView(-dx, -dy); + if (fab!=null && GlobalUserPreferences.disableFabAutoHide) { - if (dy > 0 /*&& !isFirstLaunch*/) { - if (isScrollingUp /*&& !isFirstLaunch*/) { - fab.setVisibility(View.INVISIBLE); - TranslateAnimation animate = new TranslateAnimation( - 0, - 0, - 0, - fab.getHeight() * 2); - animate.setDuration(300); - animate.setFillAfter(true); - fab.startAnimation(animate); - isScrollingUp = false; - } - } else { - if (!isScrollingUp) { + 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.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, @@ -310,7 +308,9 @@ public abstract class BaseStatusListFragment exten animate.setDuration(300); animate.setFillAfter(true); fab.startAnimation(animate); - isScrollingUp = true; + scrollDiff = 0; + } else { + scrollDiff += Math.abs(dy); } } } diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java index ef9721d51..834407b39 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java @@ -463,6 +463,29 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList }); scrollView.setOnScrollChangeListener(this::onScrollChanged); + scrollView.setNestedScrollListener((target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed) -> { + if (dyConsumed > 0) { + fab.setVisibility(View.INVISIBLE); + TranslateAnimation animate = new TranslateAnimation( + 0, + 0, + 0, + fab.getHeight() * 2); + animate.setDuration(300); + animate.setFillAfter(true); + fab.startAnimation(animate); + } else { + fab.setVisibility(View.VISIBLE); + TranslateAnimation animate = new TranslateAnimation( + 0, + 0, + fab.getHeight() * 2, + 0); + animate.setDuration(300); + animate.setFillAfter(true); + fab.startAnimation(animate); + } + }); titleTransY=getToolbar().getLayoutParams().height; if(toolbarTitleView!=null){ toolbarTitleView.setTranslationY(titleTransY); diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/views/NestedRecyclerScrollView.java b/mastodon/src/main/java/org/joinmastodon/android/ui/views/NestedRecyclerScrollView.java index 8bad60d6e..9f7259539 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/views/NestedRecyclerScrollView.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/views/NestedRecyclerScrollView.java @@ -10,7 +10,12 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; public class NestedRecyclerScrollView extends CustomScrollView{ + + public interface NestedScrollListener{ + public void onNestedScroll(View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed); + } private Supplier scrollableChildSupplier; + private NestedScrollListener nestedScrollListener; public NestedRecyclerScrollView(Context context){ super(context); @@ -24,6 +29,18 @@ public class NestedRecyclerScrollView extends CustomScrollView{ super(context, attrs, defStyleAttr); } + @Override + public void onNestedScroll(View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) { + super.onNestedScroll(target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed); + if (nestedScrollListener != null) { + nestedScrollListener.onNestedScroll(target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed); + } + } + + public void setNestedScrollListener(NestedScrollListener listener) { + this.nestedScrollListener = listener; + } + @Override public void onNestedPreScroll(View target, int dx, int dy, int[] consumed) { final RecyclerView rv = (RecyclerView) target; From 51d4fd63db3e93830196d38defc59df9d166f823 Mon Sep 17 00:00:00 2001 From: FineFindus <63370021+FineFindus@users.noreply.github.com> Date: Thu, 26 Jan 2023 16:12:54 +0100 Subject: [PATCH 013/218] refactor(compose-fab): code cleanup --- .../fragments/AccountTimelineFragment.java | 2 +- .../android/fragments/ProfileFragment.java | 23 ------------------- .../ui/views/NestedRecyclerScrollView.java | 17 -------------- 3 files changed, 1 insertion(+), 41 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/AccountTimelineFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/AccountTimelineFragment.java index b330ff4cc..786bf6ca4 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/AccountTimelineFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/AccountTimelineFragment.java @@ -71,7 +71,7 @@ public class AccountTimelineFragment extends StatusListFragment{ @Override public void onViewCreated(View view, Bundle savedInstanceState){ super.onViewCreated(view, savedInstanceState); -// fab = ((ProfileFragment) getParentFragment()).getFab(); + fab = ((ProfileFragment) getParentFragment()).getFab(); } @Override diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java index 834407b39..ef9721d51 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java @@ -463,29 +463,6 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList }); scrollView.setOnScrollChangeListener(this::onScrollChanged); - scrollView.setNestedScrollListener((target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed) -> { - if (dyConsumed > 0) { - fab.setVisibility(View.INVISIBLE); - TranslateAnimation animate = new TranslateAnimation( - 0, - 0, - 0, - fab.getHeight() * 2); - animate.setDuration(300); - animate.setFillAfter(true); - fab.startAnimation(animate); - } else { - fab.setVisibility(View.VISIBLE); - TranslateAnimation animate = new TranslateAnimation( - 0, - 0, - fab.getHeight() * 2, - 0); - animate.setDuration(300); - animate.setFillAfter(true); - fab.startAnimation(animate); - } - }); titleTransY=getToolbar().getLayoutParams().height; if(toolbarTitleView!=null){ toolbarTitleView.setTranslationY(titleTransY); diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/views/NestedRecyclerScrollView.java b/mastodon/src/main/java/org/joinmastodon/android/ui/views/NestedRecyclerScrollView.java index 9f7259539..8bad60d6e 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/views/NestedRecyclerScrollView.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/views/NestedRecyclerScrollView.java @@ -10,12 +10,7 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; public class NestedRecyclerScrollView extends CustomScrollView{ - - public interface NestedScrollListener{ - public void onNestedScroll(View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed); - } private Supplier scrollableChildSupplier; - private NestedScrollListener nestedScrollListener; public NestedRecyclerScrollView(Context context){ super(context); @@ -29,18 +24,6 @@ public class NestedRecyclerScrollView extends CustomScrollView{ super(context, attrs, defStyleAttr); } - @Override - public void onNestedScroll(View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) { - super.onNestedScroll(target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed); - if (nestedScrollListener != null) { - nestedScrollListener.onNestedScroll(target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed); - } - } - - public void setNestedScrollListener(NestedScrollListener listener) { - this.nestedScrollListener = listener; - } - @Override public void onNestedPreScroll(View target, int dx, int dy, int[] consumed) { final RecyclerView rv = (RecyclerView) target; From 45832355a301d3516ebf738d4b679394077a1431 Mon Sep 17 00:00:00 2001 From: LucasGGamerM Date: Thu, 26 Jan 2023 20:15:50 -0300 Subject: [PATCH 014/218] Refactoring the enableHideFab option, and increasing the threshold for the fab popping up from 400 to 800 --- .../org/joinmastodon/android/GlobalUserPreferences.java | 6 +++--- .../android/fragments/BaseStatusListFragment.java | 4 ++-- .../joinmastodon/android/fragments/SettingsFragment.java | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java b/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java index 31eced774..288421072 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java +++ b/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java @@ -33,7 +33,7 @@ public class GlobalUserPreferences{ public static boolean relocatePublishButton; public static boolean reduceMotion; public static boolean keepOnlyLatestNotification; - public static boolean disableFabAutoHide; + public static boolean enableFabAutoHide; public static String publishButtonText; public static ThemePreference theme; public static ColorPreference color; @@ -73,7 +73,7 @@ public class GlobalUserPreferences{ enableDeleteNotifications=prefs.getBoolean("enableDeleteNotifications", true); reduceMotion=prefs.getBoolean("reduceMotion", false); keepOnlyLatestNotification=prefs.getBoolean("keepOnlyLatestNotification", false); - disableFabAutoHide=prefs.getBoolean("disableFabAutoHide", false); + enableFabAutoHide =prefs.getBoolean("enableFabAutoHide", true); theme=ThemePreference.values()[prefs.getInt("theme", 0)]; recentLanguages=fromJson(prefs.getString("recentLanguages", "{}"), recentLanguagesType, new HashMap<>()); recentEmojis=fromJson(prefs.getString("recentEmojis", "{}"), recentEmojisType, new HashMap<>()); @@ -110,7 +110,7 @@ public class GlobalUserPreferences{ .putBoolean("enableDeleteNotifications", enableDeleteNotifications) .putBoolean("reduceMotion", reduceMotion) .putBoolean("keepOnlyLatestNotification", keepOnlyLatestNotification) - .putBoolean("disableFabAutoHide", disableFabAutoHide) + .putBoolean("enableFabAutoHide", enableFabAutoHide) .putString("publishButtonText", publishButtonText) .putInt("theme", theme.ordinal()) .putString("color", color.name()) 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 acd61a03b..fab20a5f3 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java @@ -285,7 +285,7 @@ public abstract class BaseStatusListFragment exten if(currentPhotoViewer!=null) currentPhotoViewer.offsetView(-dx, -dy); - if (fab!=null && GlobalUserPreferences.disableFabAutoHide) { + if (fab!=null && GlobalUserPreferences.enableFabAutoHide) { if (dy > 0 && fab.getVisibility() == View.VISIBLE) { TranslateAnimation animate = new TranslateAnimation( 0, @@ -298,7 +298,7 @@ public abstract class BaseStatusListFragment exten fab.setVisibility(View.INVISIBLE); scrollDiff = 0; } else if (dy < 0 && fab.getVisibility() != View.VISIBLE) { - if (scrollDiff > 400) { + if (scrollDiff > 800) { fab.setVisibility(View.VISIBLE); TranslateAnimation animate = new TranslateAnimation( 0, diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java index 81fe364e3..808c8ec7a 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java @@ -210,8 +210,8 @@ public class SettingsFragment extends MastodonToolbarFragment{ GlobalUserPreferences.save(); needAppRestart=true; })); - items.add(new SwitchItem(R.string.mo_hide_compose_button_while_scrolling_setting, R.drawable.ic_fluent_edit_24_regular, GlobalUserPreferences.disableFabAutoHide, i->{ - GlobalUserPreferences.disableFabAutoHide =i.checked; + items.add(new SwitchItem(R.string.mo_hide_compose_button_while_scrolling_setting, R.drawable.ic_fluent_edit_24_regular, GlobalUserPreferences.enableFabAutoHide, i->{ + GlobalUserPreferences.enableFabAutoHide =i.checked; GlobalUserPreferences.save(); needAppRestart=true; })); From efff075bbcf1ab22a6e0a36bc3c066fad54c72c6 Mon Sep 17 00:00:00 2001 From: LucasGGamerM Date: Fri, 27 Jan 2023 14:19:31 -0300 Subject: [PATCH 015/218] Fixing weird fab behavior on quickly jittering the main screen --- .../joinmastodon/android/fragments/BaseStatusListFragment.java | 3 +++ 1 file changed, 3 insertions(+) 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 fab20a5f3..b28bfe6d3 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java @@ -286,6 +286,9 @@ public abstract class BaseStatusListFragment exten currentPhotoViewer.offsetView(-dx, -dy); if (fab!=null && GlobalUserPreferences.enableFabAutoHide) { + if(dy > 0){ + scrollDiff = 0; + } if (dy > 0 && fab.getVisibility() == View.VISIBLE) { TranslateAnimation animate = new TranslateAnimation( 0, From 247dea3af0d8ce4c16a00c1101a2959cda4af470 Mon Sep 17 00:00:00 2001 From: LucasGGamerM Date: Fri, 27 Jan 2023 14:24:19 -0300 Subject: [PATCH 016/218] Chaging string in title --- mastodon/src/main/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mastodon/src/main/AndroidManifest.xml b/mastodon/src/main/AndroidManifest.xml index 357eb112d..ac32ebde5 100644 --- a/mastodon/src/main/AndroidManifest.xml +++ b/mastodon/src/main/AndroidManifest.xml @@ -15,7 +15,7 @@ Date: Sun, 22 Jan 2023 02:04:12 +0300 Subject: [PATCH 017/218] Fix #69 (nice) --- .../java/org/joinmastodon/android/model/Attachment.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/model/Attachment.java b/mastodon/src/main/java/org/joinmastodon/android/model/Attachment.java index 212ca9417..999e70733 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/model/Attachment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/model/Attachment.java @@ -47,26 +47,26 @@ public class Attachment extends BaseModel{ public int getWidth(){ if(meta==null) - return 0; + return 1920; if(meta.width>0) return meta.width; if(meta.original!=null && meta.original.width>0) return meta.original.width; if(meta.small!=null && meta.small.width>0) return meta.small.width; - return 0; + return 1920; } public int getHeight(){ if(meta==null) - return 0; + return 1080; if(meta.height>0) return meta.height; if(meta.original!=null && meta.original.height>0) return meta.original.height; if(meta.small!=null && meta.small.height>0) return meta.small.height; - return 0; + return 1080; } public double getDuration(){ From 5538d5af6c6a44dd5eaf6685efa858cb272d1368 Mon Sep 17 00:00:00 2001 From: Jippang Date: Wed, 18 Jan 2023 09:40:10 -0300 Subject: [PATCH 018/218] Translated using Weblate (Korean) Currently translated at 100.0% (149 of 149 strings) Translation: Megalodon/values Translate-URL: https://translate.codeberg.org/projects/megalodon/values/ko/ --- .../src/main/res/values-ko-rKR/strings_sk.xml | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/mastodon/src/main/res/values-ko-rKR/strings_sk.xml b/mastodon/src/main/res/values-ko-rKR/strings_sk.xml index 08fd10776..a62d3d5d8 100644 --- a/mastodon/src/main/res/values-ko-rKR/strings_sk.xml +++ b/mastodon/src/main/res/values-ko-rKR/strings_sk.xml @@ -27,7 +27,7 @@ 사용 가능한 업데이트 없음 리스트 팔로우 요청 - 팔로우 요청 허가 + 팔로우 요청 수락 팔로우 요청 거부 %s 님이 포함된 리스트 수정 열람주의 게시물을 항상 펼치기 @@ -65,7 +65,7 @@ 게시물 설정 필터 설정 보안 설정 - 서버 규칙 + 인스턴스 규칙 이 앱에 관하여 기부 알림 삭제 @@ -73,15 +73,15 @@ 알림 삭제 활성화 게시 버튼 텍스트 게시 버튼 사용자화 - 타임라인에서 번역 버튼 숨김 + 열린 게시글만 번역 알림 삭제 - %s 서버는 번역을 지원합니다! - %s 서버는 번역을 지원하지 않는 것 같습니다. + %s 인스턴스는 번역을 지원합니다! + %s 인스턴스는 번역을 지원하지 않는 것 같습니다. 정말로 모든 알림을 삭제하시겠습니까\? 모두 삭제 스와이프로 탭간 전환 비활성화 모든 알림 삭제 - 연합우주에서 찾아보는 중 + 연합우주에서 찾아오는 중 다른 계정으로 보관 다른 계정으로 리블로그 이미 리블로그했습니다 @@ -99,7 +99,7 @@ 게시물 링크 복사 다른 계정으로 열기 리소스를 찾을 수 없습니다 - %s에서 찾아보는 중 + %s 인스턴스에서 찾아오는 중 언급하여 게시 게시하지 않은 게시물 초안 작성 @@ -128,7 +128,7 @@ 로컬 연합 답글을 표시할 대상 - 정말로 이 리스트를 삭제하시겠습니까\? + 정말로 \"%s\" 리스트를 삭제하시겠습니까\? 공지사항 읽음으로 표시 인스턴스에 대하여 @@ -142,4 +142,10 @@ 리스트 편집 리스트 하나의 알림만 표시 + 검색할 내용을 입력하세요 + 제거 + 성공적으로 팔로워를 제거했습니다 + 변경 사항 + 팔로워에서 제거 + %s 님을 차단하고 바로 차단 해제하여 팔로워에서 제거하시겠습니까\? \ No newline at end of file From c96e5cde7ba96f97a4f8167a9cddb5d2cd9bc6e9 Mon Sep 17 00:00:00 2001 From: ghose Date: Wed, 18 Jan 2023 05:32:36 -0300 Subject: [PATCH 019/218] Translated using Weblate (Galician) Currently translated at 100.0% (149 of 149 strings) Translation: Megalodon/values Translate-URL: https://translate.codeberg.org/projects/megalodon/values/gl/ --- .../src/main/res/values-gl-rES/strings_sk.xml | 113 ++++++++++++++++++ 1 file changed, 113 insertions(+) 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 cbc63f47a..64b932c50 100644 --- a/mastodon/src/main/res/values-gl-rES/strings_sk.xml +++ b/mastodon/src/main/res/values-gl-rES/strings_sk.xml @@ -35,4 +35,117 @@ Aceptar solicitude Rexeitar solicitude Mostrar sempre o contido con avisos + Publicacións + Permitir selección múltiple + Traducir + Mostrar orixinal + Traducido empregando %s + Idioma: %s + Desactivar desprazamento do texto na barra de título + Benvida! + Contribúe a Megalodon + %s (%s) + exemplo.social + Idiomas disponibeis + Configurar perfil + Preferencias de publicación + Configurar filtros + Axustes de seguridade + Regras + Acerca da app + Doar + Sistema + Rosa + Púrpura + Verde + Azul + Marrón + Vermello + Amarelo + Paleta de cores + Quitar tódolos idiomas usados recentemente + Desactivar desprazamente entre lapelas + Mostrar cronoloxía federada + Tes a certeza de limpar a lista de idioma usados recentemente\? + Notificación de publicacións + A quenlla saúdate! Para comezar, escribe aquí o enderezo de internet da túa instancia. + Inicio + Local + Federada + Só traducir publicacións abertas + Marcar con outra conta + Marcado con %s + Xa está nos marcadores + Favorecer con outra conta + Favorita con %s + Xa foi favorecida + Promovida por %s + Xa foi promovida + Responder con outra conta + Icona uniforme para tódalas notificacións + Activar a eliminación de notificacións + Texto do botón Publicar + Personalizar o texto do botón de publicar + %s non semella ter soporte para tradución. + Buscando no Fediverso + Promover con visibilidade + Publicar acerca disto + Retirar a promoción + Copiar ligazón á publicación + Buscando en %s + Abrir con outra conta + Non se puido atopar o recurso + Publicacións non enviadas + Borrador + Programar + Eliminar borrador + Eliminar publicación programada + Tes a certeza de querer eliminar esta publicación programada\? + Borrador ou programar + A publicación vaise gardar como borrador. + Programada o + Borrador gardado + A hora de programación é demasiado próxima + Gardar borrador\? + Gardar cambios\? + Marcar como borrador + Programar publicación + Programar ou borrador + Non programar + Non facer borrador + Promover con outra conta + Reducir movemento nas animacións + Anuncios + Marcar como lido + Acerca da instancia + Mostrar só unha notificación + Crear + Crear lista + Nome da lista + membros da lista + usuarias seguidas + ningunha + Eliminar lista + Editar lista + Listas + Escribe algo para iniciar a busca + Eliminar como seguidora + Eliminar a %s como seguidora bloqueándoa e inmediatamente desbloqueándoa\? + Eliminar + Agora esa conta xa non te segue + Lista de cambios + %s con soporte para tradución! + Cancelos que segues + Reenviar a %s + Tes a certeza de querer eliminar este borrador\? + Publicación programada + A publicación debe realizarse alomenos dentro de dez minutos. + Mostrar respostas a + Tes a certeza de querer eliminar a lista “%s”\? + Borrar notificación + Borrar notificacion + Tes a certeza de querer borrar esta notificación\? + Borrar todas as notificacións + Borrar todo + Seguro que queres borrar todas as notificacións\? \ No newline at end of file From cf22096e350592a58e142cf0274905881e6571e7 Mon Sep 17 00:00:00 2001 From: McKris Date: Wed, 18 Jan 2023 08:40:30 +0000 Subject: [PATCH 020/218] Translated using Weblate (Polish) Currently translated at 96.6% (144 of 149 strings) Translation: Megalodon/values Translate-URL: https://translate.codeberg.org/projects/megalodon/values/pl/ --- mastodon/src/main/res/values-pl-rPL/strings_sk.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/mastodon/src/main/res/values-pl-rPL/strings_sk.xml b/mastodon/src/main/res/values-pl-rPL/strings_sk.xml index 6b2f01d44..6b0900437 100644 --- a/mastodon/src/main/res/values-pl-rPL/strings_sk.xml +++ b/mastodon/src/main/res/values-pl-rPL/strings_sk.xml @@ -142,4 +142,5 @@ Czy jesteś pewien że chcesz usunąć tą listę\? Edytuj listę Twoje listy + Wpisz coś, aby rozpocząć wyszukiwanie \ No newline at end of file From 901f1763ab631b2949fd05a157eb8eeba6bc8901 Mon Sep 17 00:00:00 2001 From: Espasant3 Date: Wed, 18 Jan 2023 18:34:21 +0000 Subject: [PATCH 021/218] Translated using Weblate (Galician) Currently translated at 61.5% (8 of 13 strings) Translation: Megalodon/metadata Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/gl/ --- metadata/gl-ES/changelogs/50.txt | 4 ++++ metadata/gl-ES/changelogs/51.txt | 6 ++++++ metadata/gl-ES/changelogs/55.txt | 4 ++++ metadata/gl-ES/changelogs/56.txt | 6 ++++++ metadata/gl-ES/changelogs/59.txt | 6 ++++++ metadata/gl-ES/changelogs/61.txt | 5 +++++ metadata/gl-ES/full_description.txt | 16 ++++++++++++++++ 7 files changed, 47 insertions(+) create mode 100644 metadata/gl-ES/changelogs/50.txt create mode 100644 metadata/gl-ES/changelogs/51.txt create mode 100644 metadata/gl-ES/changelogs/55.txt create mode 100644 metadata/gl-ES/changelogs/56.txt create mode 100644 metadata/gl-ES/changelogs/59.txt create mode 100644 metadata/gl-ES/changelogs/61.txt create mode 100644 metadata/gl-ES/full_description.txt diff --git a/metadata/gl-ES/changelogs/50.txt b/metadata/gl-ES/changelogs/50.txt new file mode 100644 index 000000000..71a547c83 --- /dev/null +++ b/metadata/gl-ES/changelogs/50.txt @@ -0,0 +1,4 @@ +- Preparar os ficheiros para publicar en F-Droid +- Arranxos no actualizador automático +- Engadir iconas monocromáticas nas iconas do lanzador +- Replazar a icona non listada na barra extendida ao pé diff --git a/metadata/gl-ES/changelogs/51.txt b/metadata/gl-ES/changelogs/51.txt new file mode 100644 index 000000000..33cd637a8 --- /dev/null +++ b/metadata/gl-ES/changelogs/51.txt @@ -0,0 +1,6 @@ +- Posibilitar a apertura da publicación orixinal ao responder (premendo na liña "En resposta a...") +- Fusionar os cambios da app orixinal e arranxos +- Eliminar código non utilizado "App Center" +- Engadir versión sen cronoloxía Federada para a Play Store +- Engadir redirección URI personalizada para facilitar o acceso +- Cambiar a ligazón de colaboradoras diff --git a/metadata/gl-ES/changelogs/55.txt b/metadata/gl-ES/changelogs/55.txt new file mode 100644 index 000000000..e469cc6c0 --- /dev/null +++ b/metadata/gl-ES/changelogs/55.txt @@ -0,0 +1,4 @@ +- Arranxar a mostra de etiquetas HTML e permitir o formato Markdown +- Iniciar a tradución do proxecto en Weblate +- Permitir engadir cronoloxía Federada +- As versións 52-54 foron pequenos axustes para publicar en Google Play diff --git a/metadata/gl-ES/changelogs/56.txt b/metadata/gl-ES/changelogs/56.txt new file mode 100644 index 000000000..a05b2b499 --- /dev/null +++ b/metadata/gl-ES/changelogs/56.txt @@ -0,0 +1,6 @@ +- Cores personalizadas grazas a @LucasGGamerM +- Novo texto do logo "megalodon" enviado por @LucasGGamerM +- Melloras na busca de emojis ao escribir +- Cambios nas votacións (mostra o voto propio, mostra sempre o botón de votar, non corta as respostas longas) +- Engade o axuste para notificacións push para as notificacións da publicación +- Arranxos varios diff --git a/metadata/gl-ES/changelogs/59.txt b/metadata/gl-ES/changelogs/59.txt new file mode 100644 index 000000000..64acbb888 --- /dev/null +++ b/metadata/gl-ES/changelogs/59.txt @@ -0,0 +1,6 @@ +- Engade selector de idioma +- Engade función de tradución +- Mellora a semántica para votar nas enquisas (botóns radio no lugar de caixas) +- Engade opción para votar varias opcións nas enquisas +- Nova pantalla de acceso +- Arranxos diff --git a/metadata/gl-ES/changelogs/61.txt b/metadata/gl-ES/changelogs/61.txt new file mode 100644 index 000000000..f167ccefb --- /dev/null +++ b/metadata/gl-ES/changelogs/61.txt @@ -0,0 +1,5 @@ +-Novas cores de temas: Material You e Vermello +-Novos tonos gris escuros para todos os temas +‐Icona de impulso de recheo máis distintivo +-Animación para botóns de interacción +-Correccións de erros (Bloqueo nalgunhas publicacións, "Listas con", linguaxe de publicación por defecto) diff --git a/metadata/gl-ES/full_description.txt b/metadata/gl-ES/full_description.txt new file mode 100644 index 000000000..6bb53bdce --- /dev/null +++ b/metadata/gl-ES/full_description.txt @@ -0,0 +1,16 @@ +Megalodon é unha versión modificada da app Mastodon Android oficial que inclúe varias características que non están na aplicación oficial, como a cronoloxía federada, publicacións non listadas e ver a descrición das imaxes. + +Características principais + +- Publicación non listada: Publicar de xeito público pero sen que apareza nas tendencias, cancelos ou cronoloxías públicas. +- Cronoloxía federada: Ver as publicacións públicas das persoas que forman a túa veciñanza no Fediverso ao estar federadas coa túa instancia. +- Borradores e programación: Permite preparar unha publicación e programala para enviala automáticamente na hora indicada. +- Ver descrición de imaxes: Comprobar rápidamente se unha imaxe ou vídeo inclúe un texto descritivo. +- Fixar publicacións: Fixa no teu perfil as publicacións máis importantes e le as das outras persoas na lapela "Fixada". +- Seguir cancelos: Ver novas publicacións dun cancelo específico directamente na cronoloxía de Inicio ao seguilo. +- Responder aos seguimentos: Aceptar ou rexeitar as solicitudes de seguimento desde as notificacións ou a lista dedicada Solicitudes de Seguimento. +- Eliminar e rescribir; A función tan desexada que permite a edición sen realmente usar a función editar. +- Elexir idioma: Cambiar de xeito doado o idioma da publicación que estás a escribir para que os filtros e a tradución funcionen correctamente. +- Tradución: Traducir fácilmente as publicacións dentro de Megalodon! Só funciona se a ferramenta tamén está dispoñible no teu Mastodon Web. +- Indicador de visibilidade: Ao abrir ou responder a unha publicación verás unha icona que indica a visibilidade da publicación. +- Decorados: Se non che gusta a cor Rosa por defecto (a quenlla mírate de esguello), os decorados de cores de Moshidon permítenche cambialo. From b63c0010a97e1bc492f79db9485df7551c500cd6 Mon Sep 17 00:00:00 2001 From: sk22 Date: Fri, 20 Jan 2023 22:17:47 -0300 Subject: [PATCH 022/218] Pinnable timelines (#338) * implement draggable list * implement pinning timelines * fix TimelineDefinition equals not working * implement removing timelines * implement pinned lists/hashtags * per-account pinned timelines * implement pin button * fix issues with pinning * improve pin button * improve pinning timelines * implement custom icons * fix home switcher menu * make hashtags pinnable * edit timelines in options menu --- .../android/GlobalUserPreferences.java | 10 +- .../android/api/requests/lists/GetList.java | 10 + .../fragments/EditTimelinesFragment.java | 351 ++++++++++++++++++ .../fragments/HashtagTimelineFragment.java | 46 ++- .../android/fragments/HomeTabFragment.java | 175 +++++---- .../fragments/ListTimelineFragment.java | 51 ++- .../fragments/ListTimelinesFragment.java | 9 + .../fragments/PinnableStatusListFragment.java | 82 ++++ .../android/fragments/SettingsFragment.java | 11 +- .../android/model/TimelineDefinition.java | 204 ++++++++++ .../android/ui/utils/UiUtils.java | 29 +- .../res/drawable/ic_fluent_add_24_regular.xml | 3 + .../res/drawable/ic_fluent_pin_24_filled.xml | 3 + .../ic_fluent_timeline_24_regular.xml | 2 +- .../src/main/res/layout/edit_timeline.xml | 22 ++ mastodon/src/main/res/layout/item_text.xml | 13 +- .../src/main/res/menu/hashtag_timeline.xml | 5 + mastodon/src/main/res/menu/home.xml | 6 +- mastodon/src/main/res/menu/home_switcher.xml | 13 - mastodon/src/main/res/menu/list.xml | 11 +- mastodon/src/main/res/values/ids.xml | 3 +- mastodon/src/main/res/values/strings_sk.xml | 68 +--- 22 files changed, 926 insertions(+), 201 deletions(-) create mode 100644 mastodon/src/main/java/org/joinmastodon/android/api/requests/lists/GetList.java create mode 100644 mastodon/src/main/java/org/joinmastodon/android/fragments/EditTimelinesFragment.java create mode 100644 mastodon/src/main/java/org/joinmastodon/android/fragments/PinnableStatusListFragment.java create mode 100644 mastodon/src/main/java/org/joinmastodon/android/model/TimelineDefinition.java create mode 100644 mastodon/src/main/res/drawable/ic_fluent_add_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_pin_24_filled.xml create mode 100644 mastodon/src/main/res/layout/edit_timeline.xml delete mode 100644 mastodon/src/main/res/menu/home_switcher.xml diff --git a/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java b/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java index 288421072..aea5994dd 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java +++ b/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java @@ -9,6 +9,8 @@ import android.os.Build; import com.google.gson.JsonSyntaxException; import com.google.gson.reflect.TypeToken; +import org.joinmastodon.android.model.TimelineDefinition; + import java.lang.reflect.Type; import java.util.HashMap; import java.util.List; @@ -21,7 +23,6 @@ public class GlobalUserPreferences{ public static boolean showReplies; public static boolean showBoosts; public static boolean loadNewPosts; - public static boolean showFederatedTimeline; public static boolean showInteractionCounts; public static boolean alwaysExpandContentWarnings; public static boolean disableMarquee; @@ -39,7 +40,9 @@ public class GlobalUserPreferences{ public static ColorPreference color; private final static Type recentLanguagesType = new TypeToken>>() {}.getType(); + private final static Type pinnedTimelinesType = new TypeToken>>() {}.getType(); public static Map> recentLanguages; + public static Map> pinnedTimelines; private final static Type recentEmojisType = new TypeToken>() {}.getType(); public static Map recentEmojis; @@ -49,6 +52,7 @@ public class GlobalUserPreferences{ } private static T fromJson(String json, Type type, T orElse) { + if (json == null) return orElse; try { return gson.fromJson(json, type); } catch (JsonSyntaxException ignored) { return orElse; } } @@ -62,7 +66,6 @@ public class GlobalUserPreferences{ showBoosts=prefs.getBoolean("showBoosts", true); loadNewPosts=prefs.getBoolean("loadNewPosts", true); uniformNotificationIcon=prefs.getBoolean("uniformNotificationIcon", true); - showFederatedTimeline=prefs.getBoolean("showFederatedTimeline", !BuildConfig.BUILD_TYPE.equals("playRelease")); showInteractionCounts=prefs.getBoolean("showInteractionCounts", false); alwaysExpandContentWarnings=prefs.getBoolean("alwaysExpandContentWarnings", false); disableMarquee=prefs.getBoolean("disableMarquee", false); @@ -78,6 +81,7 @@ public class GlobalUserPreferences{ recentLanguages=fromJson(prefs.getString("recentLanguages", "{}"), recentLanguagesType, new HashMap<>()); recentEmojis=fromJson(prefs.getString("recentEmojis", "{}"), recentEmojisType, new HashMap<>()); publishButtonText=prefs.getString("publishButtonText", ""); + pinnedTimelines=fromJson(prefs.getString("pinnedTimelines", null), pinnedTimelinesType, new HashMap<>()); try { if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.S){ @@ -98,7 +102,6 @@ public class GlobalUserPreferences{ .putBoolean("showReplies", showReplies) .putBoolean("showBoosts", showBoosts) .putBoolean("loadNewPosts", loadNewPosts) - .putBoolean("showFederatedTimeline", showFederatedTimeline) .putBoolean("trueBlackTheme", trueBlackTheme) .putBoolean("showInteractionCounts", showInteractionCounts) .putBoolean("alwaysExpandContentWarnings", alwaysExpandContentWarnings) @@ -115,6 +118,7 @@ public class GlobalUserPreferences{ .putInt("theme", theme.ordinal()) .putString("color", color.name()) .putString("recentLanguages", gson.toJson(recentLanguages)) + .putString("pinnedTimelines", gson.toJson(pinnedTimelines)) .putString("recentEmojis", gson.toJson(recentEmojis)) .apply(); } diff --git a/mastodon/src/main/java/org/joinmastodon/android/api/requests/lists/GetList.java b/mastodon/src/main/java/org/joinmastodon/android/api/requests/lists/GetList.java new file mode 100644 index 000000000..19bda79ca --- /dev/null +++ b/mastodon/src/main/java/org/joinmastodon/android/api/requests/lists/GetList.java @@ -0,0 +1,10 @@ +package org.joinmastodon.android.api.requests.lists; + +import org.joinmastodon.android.api.MastodonAPIRequest; +import org.joinmastodon.android.model.ListTimeline; + +public class GetList extends MastodonAPIRequest { + public GetList(String id) { + super(HttpMethod.GET, "/lists/" + id, ListTimeline.class); + } +} diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/EditTimelinesFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/EditTimelinesFragment.java new file mode 100644 index 000000000..292fe1e74 --- /dev/null +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/EditTimelinesFragment.java @@ -0,0 +1,351 @@ +package org.joinmastodon.android.fragments; + +import static android.view.Menu.NONE; + +import static org.joinmastodon.android.ui.utils.UiUtils.makeBackItem; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.os.Bundle; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.MotionEvent; +import android.view.SubMenu; +import android.view.View; +import android.view.ViewGroup; +import android.widget.EditText; +import android.widget.ImageButton; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.PopupMenu; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.ItemTouchHelper; +import androidx.recyclerview.widget.RecyclerView; + +import org.joinmastodon.android.GlobalUserPreferences; +import org.joinmastodon.android.R; +import org.joinmastodon.android.api.requests.lists.GetLists; +import org.joinmastodon.android.api.requests.tags.GetFollowedHashtags; +import org.joinmastodon.android.model.Hashtag; +import org.joinmastodon.android.model.HeaderPaginationList; +import org.joinmastodon.android.model.ListTimeline; +import org.joinmastodon.android.model.TimelineDefinition; +import org.joinmastodon.android.ui.DividerItemDecoration; +import org.joinmastodon.android.ui.M3AlertDialogBuilder; +import org.joinmastodon.android.ui.utils.UiUtils; +import org.joinmastodon.android.ui.views.TextInputFrameLayout; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import me.grishka.appkit.api.Callback; +import me.grishka.appkit.api.ErrorResponse; +import me.grishka.appkit.fragments.BaseRecyclerFragment; +import me.grishka.appkit.utils.BindableViewHolder; +import me.grishka.appkit.views.UsableRecyclerView; + +public class EditTimelinesFragment extends BaseRecyclerFragment implements ScrollableToTop { + private String accountID; + private TimelinesAdapter adapter; + private final ItemTouchHelper itemTouchHelper; + private Menu optionsMenu; + private boolean updated; + private final Map timelineByMenuItem = new HashMap<>(); + private final List listTimelines = new ArrayList<>(); + private final List hashtags = new ArrayList<>(); + + public EditTimelinesFragment() { + super(10); + ItemTouchHelper.SimpleCallback itemTouchCallback = new ItemTouchHelperCallback() ; + itemTouchHelper = new ItemTouchHelper(itemTouchCallback); + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setHasOptionsMenu(true); + setTitle(R.string.sk_timelines); + accountID = getArguments().getString("account"); + + new GetLists().setCallback(new Callback<>() { + @Override + public void onSuccess(List result) { + listTimelines.addAll(result); + updateOptionsMenu(); + } + + @Override + public void onError(ErrorResponse error) { + error.showToast(getContext()); + } + }).exec(accountID); + + new GetFollowedHashtags().setCallback(new Callback<>() { + @Override + public void onSuccess(HeaderPaginationList result) { + hashtags.addAll(result); + updateOptionsMenu(); + } + + @Override + public void onError(ErrorResponse error) { + error.showToast(getContext()); + } + }).exec(accountID); + } + + @Override + protected void onShown(){ + super.onShown(); + if(!getArguments().getBoolean("noAutoLoad") && !loaded && !dataLoading) loadData(); + } + + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + itemTouchHelper.attachToRecyclerView(list); + refreshLayout.setEnabled(false); + list.addItemDecoration(new DividerItemDecoration(getActivity(), R.attr.colorPollVoted, 0.5f, 56, 16)); + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + this.optionsMenu = menu; + updateOptionsMenu(); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == R.id.menu_back) { + updateOptionsMenu(); + optionsMenu.performIdentifierAction(R.id.menu_add_timeline, 0); + return true; + } + TimelineDefinition tl = timelineByMenuItem.get(item); + if (tl != null) { + data.add(tl.copy()); + adapter.notifyItemInserted(data.size()); + saveTimelines(); + updateOptionsMenu(); + }; + return true; + } + + private void addTimelineToOptions(TimelineDefinition tl, Menu menu) { + if (data.contains(tl)) return; + MenuItem item = menu.add(0, View.generateViewId(), Menu.NONE, tl.getTitle(getContext())); + item.setIcon(tl.getIcon().iconRes); + timelineByMenuItem.put(item, tl); + } + + private void updateOptionsMenu() { + optionsMenu.clear(); + timelineByMenuItem.clear(); + + SubMenu menu = optionsMenu.addSubMenu(0, R.id.menu_add_timeline, NONE, R.string.sk_timelines_add); + menu.getItem().setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); + menu.getItem().setIcon(R.drawable.ic_fluent_add_24_regular); + + SubMenu timelinesMenu = menu.addSubMenu(R.string.sk_timeline); + timelinesMenu.getItem().setIcon(R.drawable.ic_fluent_timeline_24_regular); + SubMenu listsMenu = menu.addSubMenu(R.string.sk_list); + listsMenu.getItem().setIcon(R.drawable.ic_fluent_people_list_24_regular); + SubMenu hashtagsMenu = menu.addSubMenu(R.string.sk_hashtag); + hashtagsMenu.getItem().setIcon(R.drawable.ic_fluent_number_symbol_24_regular); + + makeBackItem(timelinesMenu); + makeBackItem(listsMenu); + makeBackItem(hashtagsMenu); + + TimelineDefinition.ALL_TIMELINES.forEach(tl -> addTimelineToOptions(tl, timelinesMenu)); + listTimelines.stream().map(TimelineDefinition::ofList).forEach(tl -> addTimelineToOptions(tl, listsMenu)); + hashtags.stream().map(TimelineDefinition::ofHashtag).forEach(tl -> addTimelineToOptions(tl, hashtagsMenu)); + + timelinesMenu.getItem().setVisible(timelinesMenu.size() > 0); + listsMenu.getItem().setVisible(listsMenu.size() > 0); + hashtagsMenu.getItem().setVisible(hashtagsMenu.size() > 0); + + UiUtils.enableOptionsMenuIcons(getContext(), optionsMenu, R.id.menu_add_timeline); + } + + private void saveTimelines() { + updated = true; + GlobalUserPreferences.pinnedTimelines.put(accountID, data.size() > 0 ? data : List.of(TimelineDefinition.HOME_TIMELINE)); + GlobalUserPreferences.save(); + } + + private void removeTimeline(int position) { + data.remove(position); + adapter.notifyItemRemoved(position); + saveTimelines(); + updateOptionsMenu(); + } + + @Override + protected void doLoadData(int offset, int count){ + onDataLoaded(GlobalUserPreferences.pinnedTimelines.getOrDefault(accountID, TimelineDefinition.DEFAULT_TIMELINES), false); + updateOptionsMenu(); + } + + @Override + protected RecyclerView.Adapter getAdapter() { + return adapter = new TimelinesAdapter(); + } + + @Override + public void scrollToTop() { + smoothScrollRecyclerViewToTop(list); + } + + @Override + public void onDestroy() { + super.onDestroy(); + if (updated) UiUtils.restartApp(); + } + + private class TimelinesAdapter extends RecyclerView.Adapter{ + @NonNull + @Override + public TimelineViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){ + return new TimelineViewHolder(); + } + + @Override + public void onBindViewHolder(@NonNull TimelineViewHolder holder, int position) { + holder.bind(data.get(position)); + } + + @Override + public int getItemCount() { + return data.size(); + } + } + + private class TimelineViewHolder extends BindableViewHolder implements UsableRecyclerView.Clickable{ + private final TextView title; + private final ImageView dragger; + + public TimelineViewHolder(){ + super(getActivity(), R.layout.item_text, list); + title=findViewById(R.id.title); + dragger=findViewById(R.id.dragger_thingy); + } + + @SuppressLint("ClickableViewAccessibility") + @Override + public void onBind(TimelineDefinition item) { + title.setText(item.getTitle(getContext())); + title.setCompoundDrawablesRelativeWithIntrinsicBounds(itemView.getContext().getDrawable(item.getIcon().iconRes), null, null, null); + dragger.setVisibility(View.VISIBLE); + dragger.setOnTouchListener((View v, MotionEvent event) -> { + if (event.getAction() == MotionEvent.ACTION_DOWN) { + itemTouchHelper.startDrag(this); + return true; + } + return false; + }); + } + + @SuppressLint("ClickableViewAccessibility") + @Override + public void onClick() { + Context ctx = getContext(); + LinearLayout view = (LinearLayout) getActivity().getLayoutInflater() + .inflate(R.layout.edit_timeline, (ViewGroup) itemView, false); + + TextInputFrameLayout inputLayout = view.findViewById(R.id.input); + EditText editText = inputLayout.getEditText(); + editText.setText(item.getCustomTitle()); + editText.setHint(item.getDefaultTitle(ctx)); + + ImageButton btn = view.findViewById(R.id.button); + PopupMenu popup = new PopupMenu(ctx, btn); + TimelineDefinition.Icon currentIcon = item.getIcon(); + btn.setImageResource(currentIcon.iconRes); + btn.setContentDescription(ctx.getString(currentIcon.nameRes)); + btn.setOnTouchListener(popup.getDragToOpenListener()); + btn.setOnClickListener(l -> popup.show()); + + Menu menu = popup.getMenu(); + TimelineDefinition.Icon defaultIcon = item.getDefaultIcon(); + menu.add(0, currentIcon.ordinal(), NONE, currentIcon.nameRes).setIcon(currentIcon.iconRes); + if (!currentIcon.equals(defaultIcon)) { + menu.add(0, defaultIcon.ordinal(), NONE, defaultIcon.nameRes).setIcon(defaultIcon.iconRes); + } + for (TimelineDefinition.Icon icon : TimelineDefinition.Icon.values()) { + if (icon.hidden || icon.equals(item.getIcon())) continue; + menu.add(0, icon.ordinal(), NONE, icon.nameRes).setIcon(icon.iconRes); + } + UiUtils.enablePopupMenuIcons(ctx, popup); + + popup.setOnMenuItemClickListener(menuItem -> { + TimelineDefinition.Icon icon = TimelineDefinition.Icon.values()[menuItem.getItemId()]; + btn.setImageResource(icon.iconRes); + btn.setContentDescription(ctx.getString(icon.nameRes)); + item.setIcon(icon); + return true; + }); + + new M3AlertDialogBuilder(ctx) + .setTitle(R.string.sk_edit_timeline) + .setView(view) + .setPositiveButton(R.string.save, (d, which) -> { + item.setTitle(editText.getText().toString().trim()); + rebind(); + saveTimelines(); + }) + .setNeutralButton(R.string.sk_remove, (d, which) -> + removeTimeline(getAbsoluteAdapterPosition())) + .setNegativeButton(R.string.cancel, (d, which) -> {}) + .show(); + + editText.requestFocus(); + } + } + + private class ItemTouchHelperCallback extends ItemTouchHelper.SimpleCallback { + public ItemTouchHelperCallback() { + super(ItemTouchHelper.UP | ItemTouchHelper.DOWN, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT); + } + + @Override + public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) { + int fromPosition = viewHolder.getAbsoluteAdapterPosition(); + int toPosition = target.getAbsoluteAdapterPosition(); + if (Math.max(fromPosition, toPosition) >= data.size() || Math.min(fromPosition, toPosition) < 0) { + return false; + } else { + Collections.swap(data, fromPosition, toPosition); + adapter.notifyItemMoved(fromPosition, toPosition); + saveTimelines(); + return true; + } + } + + @Override + public void onSelectedChanged(@Nullable RecyclerView.ViewHolder viewHolder, int actionState) { + if (actionState == ItemTouchHelper.ACTION_STATE_DRAG && viewHolder != null) { + viewHolder.itemView.animate().alpha(0.65f); + } + } + + @Override + public void clearView(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) { + super.clearView(recyclerView, viewHolder); + viewHolder.itemView.animate().alpha(1f); + } + + @Override + public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { + int position = viewHolder.getAbsoluteAdapterPosition(); + removeTimeline(position); + } + } +} 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 74c3185ed..08aed61fa 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/HashtagTimelineFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/HashtagTimelineFragment.java @@ -2,6 +2,7 @@ package org.joinmastodon.android.fragments; import android.app.Activity; import android.os.Bundle; +import android.view.HapticFeedbackConstants; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; @@ -16,6 +17,7 @@ import org.joinmastodon.android.api.requests.tags.SetHashtagFollowed; import org.joinmastodon.android.api.requests.timelines.GetHashtagTimeline; import org.joinmastodon.android.model.Hashtag; import org.joinmastodon.android.model.Status; +import org.joinmastodon.android.model.TimelineDefinition; import org.joinmastodon.android.ui.utils.UiUtils; import java.util.List; @@ -26,7 +28,7 @@ import me.grishka.appkit.api.ErrorResponse; import me.grishka.appkit.api.SimpleCallback; import me.grishka.appkit.utils.V; -public class HashtagTimelineFragment extends StatusListFragment{ +public class HashtagTimelineFragment extends PinnableStatusListFragment { private String hashtag; private boolean following; private ImageButton fab; @@ -41,7 +43,6 @@ public class HashtagTimelineFragment extends StatusListFragment{ super.onAttach(activity); updateTitle(getArguments().getString("hashtag")); following=getArguments().getBoolean("following", false); - setHasOptionsMenu(true); } @@ -59,11 +60,31 @@ public class HashtagTimelineFragment extends StatusListFragment{ @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.hashtag_timeline, menu); + super.onCreateOptionsMenu(menu, inflater); followButton = menu.findItem(R.id.follow_hashtag); updateFollowingState(following); - followButton.setOnMenuItemClickListener(i -> { + new GetHashtag(hashtag).setCallback(new Callback<>() { + @Override + public void onSuccess(Hashtag hashtag) { + updateTitle(hashtag.name); + updateFollowingState(hashtag.following); + } + + @Override + public void onError(ErrorResponse error) { + error.showToast(getActivity()); + } + }).exec(accountID); + } + + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (super.onOptionsItemSelected(item)) return true; + if (item.getItemId() == R.id.follow_hashtag) { updateFollowingState(!following); + getToolbar().performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK); new SetHashtagFollowed(hashtag, following).setCallback(new Callback<>() { @Override public void onSuccess(Hashtag i) { @@ -78,20 +99,13 @@ public class HashtagTimelineFragment extends StatusListFragment{ } }).exec(accountID); return true; - }); + } + return false; + } - new GetHashtag(hashtag).setCallback(new Callback<>() { - @Override - public void onSuccess(Hashtag hashtag) { - updateTitle(hashtag.name); - updateFollowingState(hashtag.following); - } - - @Override - public void onError(ErrorResponse error) { - error.showToast(getActivity()); - } - }).exec(accountID); + @Override + protected TimelineDefinition makeTimelineDefinition() { + return TimelineDefinition.ofHashtag(hashtag); } @Override 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 1dadf8162..68c460322 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTabFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTabFragment.java @@ -1,7 +1,5 @@ package org.joinmastodon.android.fragments; -import static org.joinmastodon.android.GlobalUserPreferences.showFederatedTimeline; - import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; @@ -42,12 +40,11 @@ import org.joinmastodon.android.api.requests.announcements.GetAnnouncements; import org.joinmastodon.android.api.requests.lists.GetLists; import org.joinmastodon.android.api.requests.tags.GetFollowedHashtags; import org.joinmastodon.android.events.SelfUpdateStateChangedEvent; -import org.joinmastodon.android.fragments.discover.FederatedTimelineFragment; -import org.joinmastodon.android.fragments.discover.LocalTimelineFragment; import org.joinmastodon.android.model.Announcement; import org.joinmastodon.android.model.Hashtag; import org.joinmastodon.android.model.HeaderPaginationList; import org.joinmastodon.android.model.ListTimeline; +import org.joinmastodon.android.model.TimelineDefinition; import org.joinmastodon.android.ui.SimpleViewHolder; import org.joinmastodon.android.ui.utils.UiUtils; import org.joinmastodon.android.updater.GithubSelfUpdater; @@ -67,6 +64,7 @@ import me.grishka.appkit.utils.V; public class HomeTabFragment extends MastodonToolbarFragment implements ScrollableToTop, OnBackPressedListener { private static final int ANNOUNCEMENTS_RESULT = 654; + private static final int PINNED_UPDATED_RESULT = 523; private String accountID; private MenuItem announcements; @@ -75,8 +73,6 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab private boolean newPostsBtnShown; private AnimatorSet currentNewPostsAnim; private ViewPager2 pager; - private final List fragments = new ArrayList<>(); - private final List tabViews = new ArrayList<>(); private View switcher; private FrameLayout toolbarFrame; private ImageView timelineIcon; @@ -85,11 +81,24 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab private PopupMenu switcherPopup; private final Map listItems = new HashMap<>(); private final Map hashtagsItems = new HashMap<>(); + private List timelineDefinitions; + private int count; + private Fragment[] fragments; + private FrameLayout[] tabViews; + private TimelineDefinition[] timelines; + private Map timelinesByMenuItem = new HashMap<>(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); accountID = getArguments().getString("account"); + timelineDefinitions = GlobalUserPreferences.pinnedTimelines.getOrDefault(accountID, TimelineDefinition.DEFAULT_TIMELINES); + assert timelineDefinitions != null; + if (timelineDefinitions.size() == 0) timelineDefinitions = List.of(TimelineDefinition.HOME_TIMELINE); + count = timelineDefinitions.size(); + fragments = new Fragment[count]; + tabViews = new FrameLayout[count]; + timelines = new TimelineDefinition[count]; } @Override @@ -104,30 +113,28 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab pager = new ViewPager2(getContext()); toolbarFrame = (FrameLayout) LayoutInflater.from(getContext()).inflate(R.layout.home_toolbar, getToolbar(), false); - if (fragments.size() == 0) { + if (fragments[0] == null) { Bundle args = new Bundle(); args.putString("account", accountID); args.putBoolean("__is_tab", true); - - fragments.add(new HomeTimelineFragment()); - fragments.add(new LocalTimelineFragment()); - if (showFederatedTimeline) fragments.add(new FederatedTimelineFragment()); - args=new Bundle(args); args.putBoolean("onlyPosts", true); - NotificationsListFragment postsFragment=new NotificationsListFragment(); - postsFragment.setArguments(args); - fragments.add(postsFragment); + + for (int i = 0; i < timelineDefinitions.size(); i++) { + TimelineDefinition tl = timelineDefinitions.get(i); + fragments[i] = tl.getFragment(); + timelines[i] = tl; + } FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); - for (int i = 0; i < fragments.size(); i++) { - fragments.get(i).setArguments(args); + for (int i = 0; i < count; i++) { + fragments[i].setArguments(timelines[i].populateArguments(new Bundle(args))); FrameLayout tabView = new FrameLayout(getActivity()); tabView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); tabView.setVisibility(View.GONE); tabView.setId(i + 1); - transaction.add(i + 1, fragments.get(i)); + transaction.add(i + 1, fragments[i]); view.addView(tabView); - tabViews.add(tabView); + tabViews[i] = tabView; } transaction.commit(); } @@ -147,7 +154,6 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab collapsedChevron = toolbarFrame.findViewById(R.id.collapsed_chevron); switcher = toolbarFrame.findViewById(R.id.switcher_btn); switcherPopup = new PopupMenu(getContext(), switcher); - switcherPopup.inflate(R.menu.home_switcher); switcherPopup.setOnMenuItemClickListener(this::onSwitcherItemSelected); UiUtils.enablePopupMenuIcons(getContext(), switcherPopup); switcher.setOnClickListener(v->{ @@ -167,9 +173,8 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab @Override public void onPageSelected(int position){ updateSwitcherIcon(position); - if (position==0) return; - hideNewPostsButton(); - if (fragments.get(position) instanceof BaseRecyclerFragment page){ + if (!timelines[position].equals(TimelineDefinition.HOME_TIMELINE)) hideNewPostsButton(); + if (fragments[position] instanceof BaseRecyclerFragment page){ if(!page.loaded && !page.isDataLoading()) page.loadData(); } } @@ -177,7 +182,7 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab if (!GlobalUserPreferences.reduceMotion) { pager.setPageTransformer((v, pos) -> { - if (tabViews.get(pager.getCurrentItem()) != v) return; + if (tabViews[pager.getCurrentItem()] != v) return; float scaleFactor = Math.max(0.85f, 1 - Math.abs(pos) * 0.06f); switcher.setScaleY(scaleFactor); switcher.setScaleX(scaleFactor); @@ -292,6 +297,7 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab public void onSuccess(List result) { boolean hasUnread = result.stream().anyMatch(a -> !a.read); announcements.setIcon(hasUnread ? R.drawable.ic_announcements_24_badged : R.drawable.ic_fluent_megaphone_24_regular); + updateBadgedOptionsItem(announcements, hasUnread); } @Override @@ -299,6 +305,17 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab error.showToast(getActivity()); } }).exec(accountID); + + UiUtils.enableOptionsMenuIcons(getContext(), menu); + } + + private void updateBadgedOptionsItem(MenuItem item, boolean asAction) { + item.setShowAsAction(asAction ? MenuItem.SHOW_AS_ACTION_ALWAYS : MenuItem.SHOW_AS_ACTION_NEVER); + if (asAction) { + UiUtils.resetPopupItemTint(item); + } else { + UiUtils.insetPopupMenuIcon(getContext(), item); + } } private void addItemsToMap(List addItems, Map items) { @@ -309,13 +326,24 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab private void updateSwitcherMenu() { Context context = getContext(); - switcherPopup.getMenu().findItem(R.id.federated).setVisible(showFederatedTimeline); + Menu switcherMenu = switcherPopup.getMenu(); + switcherMenu.clear(); + timelinesByMenuItem.clear(); + + for (TimelineDefinition tl : timelines) { + int menuItemId = View.generateViewId(); + timelinesByMenuItem.put(menuItemId, tl); + MenuItem item = switcherMenu.add(0, menuItemId, 0, tl.getTitle(getContext())); + item.setIcon(tl.getIcon().iconRes); + UiUtils.insetPopupMenuIcon(getContext(), item); + } if (!listItems.isEmpty()) { - MenuItem listsItem = switcherPopup.getMenu().findItem(R.id.lists); - listsItem.setVisible(true); - SubMenu listsMenu = listsItem.getSubMenu(); + SubMenu listsMenu = switcherMenu.addSubMenu(R.string.sk_list_timelines); + UiUtils.insetPopupMenuIcon(context, listsMenu.getItem().setVisible(true) + .setIcon(R.drawable.ic_fluent_people_list_24_regular)); listsMenu.clear(); + UiUtils.insetPopupMenuIcon(context, UiUtils.makeBackItem(listsMenu)); listItems.forEach((id, list) -> { MenuItem item = listsMenu.add(Menu.NONE, id, Menu.NONE, list.title); item.setIcon(R.drawable.ic_fluent_people_list_24_regular); @@ -324,10 +352,11 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab } if (!hashtagsItems.isEmpty()) { - MenuItem hashtagsItem = switcherPopup.getMenu().findItem(R.id.followed_hashtags); - hashtagsItem.setVisible(true); - SubMenu hashtagsMenu = hashtagsItem.getSubMenu(); + SubMenu hashtagsMenu = switcherMenu.addSubMenu(R.string.sk_hashtags_you_follow); + UiUtils.insetPopupMenuIcon(context, hashtagsMenu.getItem().setVisible(true) + .setIcon(R.drawable.ic_fluent_number_symbol_24_regular)); hashtagsMenu.clear(); + UiUtils.insetPopupMenuIcon(context, UiUtils.makeBackItem(hashtagsMenu)); hashtagsItems.forEach((id, hashtag) -> { MenuItem item = hashtagsMenu.add(Menu.NONE, id, Menu.NONE, hashtag.name); item.setIcon(R.drawable.ic_fluent_number_symbol_24_regular); @@ -340,30 +369,35 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab int id = item.getItemId(); ListTimeline list; Hashtag hashtag; - if (id == R.id.home) { - navigateTo(0); + + Bundle args = new Bundle(); + args.putString("account", accountID); + + if (id == R.id.menu_back) { + switcher.post(() -> switcherPopup.show()); return true; - } else if (id == R.id.local) { - navigateTo(1); - return true; - } else if (id == R.id.federated) { - navigateTo(2); - return true; - } else if (id == R.id.post_notifications) { - navigateTo(showFederatedTimeline ? 3 : 2); } else if ((list = listItems.get(id)) != null) { - Bundle args = new Bundle(); - args.putString("account", accountID); args.putString("listID", list.id); args.putString("listTitle", list.title); args.putInt("repliesPolicy", list.repliesPolicy.ordinal()); - Nav.go(getActivity(), ListTimelineFragment.class, args); + Nav.goForResult(getActivity(), ListTimelineFragment.class, args, PINNED_UPDATED_RESULT, this); } else if ((hashtag = hashtagsItems.get(id)) != null) { - UiUtils.openHashtagTimeline(getActivity(), accountID, hashtag.name, hashtag.following); + args.putString("hashtag", hashtag.name); + args.putBoolean("following", hashtag.following); + Nav.goForResult(getActivity(), HashtagTimelineFragment.class, args, PINNED_UPDATED_RESULT, this); + } else { + TimelineDefinition tl = timelinesByMenuItem.get(id); + if (tl != null) { + for (int i = 0; i < timelines.length; i++) { + if (timelines[i] == tl) { + navigateTo(i); + return true; + } + } + } } return false; } - private void navigateTo(int i) { navigateTo(i, !GlobalUserPreferences.reduceMotion); } @@ -374,38 +408,28 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab } private void updateSwitcherIcon(int i) { - // todo: refactor when implementing pinned tabs - if (i == (showFederatedTimeline ? 3 : 2)) { - timelineIcon.setImageResource(R.drawable.ic_fluent_alert_24_regular); - timelineTitle.setText(R.string.sk_notify_posts); - } else { - timelineIcon.setImageResource(switch (i) { - default -> R.drawable.ic_fluent_home_24_regular; - case 1 -> R.drawable.ic_fluent_people_community_24_regular; - case 2 -> R.drawable.ic_fluent_earth_24_regular; - }); - timelineTitle.setText(switch (i) { - default -> R.string.sk_timeline_home; - case 1 -> R.string.sk_timeline_local; - case 2 -> R.string.sk_timeline_federated; - }); - } + timelineIcon.setImageResource(timelines[i].getIcon().iconRes); + timelineTitle.setText(timelines[i].getTitle(getContext())); } @Override public boolean onOptionsItemSelected(MenuItem item){ Bundle args=new Bundle(); args.putString("account", accountID); - if (item.getItemId() == R.id.settings) Nav.go(getActivity(), SettingsFragment.class, args); - if (item.getItemId() == R.id.announcements) { + int id = item.getItemId(); + if (id == R.id.settings) { + Nav.go(getActivity(), SettingsFragment.class, args); + } else if (id == R.id.announcements) { Nav.goForResult(getActivity(), AnnouncementsFragment.class, args, ANNOUNCEMENTS_RESULT, this); + } else if (id == R.id.edit_timelines) { + Nav.go(getActivity(), EditTimelinesFragment.class, args); } return true; } @Override public void scrollToTop(){ - ((ScrollableToTop) fragments.get(pager.getCurrentItem())).scrollToTop(); + ((ScrollableToTop) fragments[pager.getCurrentItem()]).scrollToTop(); } public void hideNewPostsButton(){ @@ -441,7 +465,7 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab } public void showNewPostsButton(){ - if(newPostsBtnShown || pager == null || pager.getCurrentItem() != 0) + if(newPostsBtnShown || pager == null || !timelines[pager.getCurrentItem()].equals(TimelineDefinition.HOME_TIMELINE)) return; newPostsBtnShown=true; if(currentNewPostsAnim!=null){ @@ -484,15 +508,22 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab } @Override - public void onFragmentResult(int reqCode, boolean noMoreUnread, Bundle result){ - if (reqCode == ANNOUNCEMENTS_RESULT && noMoreUnread) { + public void onFragmentResult(int reqCode, boolean success, Bundle result){ + if (reqCode == ANNOUNCEMENTS_RESULT && success) { announcements.setIcon(R.drawable.ic_fluent_megaphone_24_regular); + announcements.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); + UiUtils.insetPopupMenuIcon(getContext(), announcements); + } else if (reqCode == PINNED_UPDATED_RESULT && result != null && result.getBoolean("pinnedUpdated", false)) { + UiUtils.restartApp(); } } private void updateUpdateState(GithubSelfUpdater.UpdateState state){ - if(state!=GithubSelfUpdater.UpdateState.NO_UPDATE && state!=GithubSelfUpdater.UpdateState.CHECKING) - getToolbar().getMenu().findItem(R.id.settings).setIcon(R.drawable.ic_settings_24_badged); + if(state!=GithubSelfUpdater.UpdateState.NO_UPDATE && state!=GithubSelfUpdater.UpdateState.CHECKING) { + MenuItem settings = getToolbar().getMenu().findItem(R.id.settings); + settings.setIcon(R.drawable.ic_settings_24_badged); + updateBadgedOptionsItem(settings, true); + } } @Subscribe @@ -534,7 +565,7 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab @NonNull @Override public SimpleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - FrameLayout tabView = tabViews.get(viewType % getItemCount()); + FrameLayout tabView = tabViews[viewType % getItemCount()]; ((ViewGroup)tabView.getParent()).removeView(tabView); tabView.setVisibility(View.VISIBLE); return new SimpleViewHolder(tabView); @@ -545,7 +576,7 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab @Override public int getItemCount(){ - return fragments.size(); + return count; } @Override 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 236636370..156123e02 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ListTimelineFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ListTimelineFragment.java @@ -2,23 +2,28 @@ package org.joinmastodon.android.fragments; import android.app.Activity; import android.os.Bundle; +import android.view.HapticFeedbackConstants; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ImageButton; +import android.widget.Toast; +import org.joinmastodon.android.GlobalUserPreferences; import org.joinmastodon.android.R; -import org.joinmastodon.android.api.requests.lists.CreateList; +import org.joinmastodon.android.api.requests.lists.GetList; import org.joinmastodon.android.api.requests.lists.UpdateList; import org.joinmastodon.android.api.requests.timelines.GetListTimeline; import org.joinmastodon.android.model.ListTimeline; import org.joinmastodon.android.model.Status; +import org.joinmastodon.android.model.TimelineDefinition; import org.joinmastodon.android.ui.M3AlertDialogBuilder; import org.joinmastodon.android.ui.utils.UiUtils; import org.joinmastodon.android.ui.views.ListTimelineEditor; +import java.util.ArrayList; import java.util.List; import me.grishka.appkit.Nav; @@ -28,11 +33,12 @@ import me.grishka.appkit.api.SimpleCallback; import me.grishka.appkit.utils.V; -public class ListTimelineFragment extends StatusListFragment { +public class ListTimelineFragment extends PinnableStatusListFragment { private String listID; private String listTitle; private ListTimeline.RepliesPolicy repliesPolicy; private ImageButton fab; + private Bundle resultArgs = new Bundle(); public ListTimelineFragment() { setListLayoutId(R.layout.recycler_fragment_with_fab); @@ -45,21 +51,36 @@ public class ListTimelineFragment extends StatusListFragment { listID = args.getString("listID"); listTitle = args.getString("listTitle"); repliesPolicy = ListTimeline.RepliesPolicy.values()[args.getInt("repliesPolicy", 0)]; + resultArgs.putString("listID", listID); setTitle(listTitle); setHasOptionsMenu(true); + + new GetList(listID).setCallback(new Callback<>() { + @Override + public void onSuccess(ListTimeline listTimeline) { + // TODO: save updated info + if (!listTimeline.title.equals(listTitle)) setTitle(listTimeline.title); + if (!listTimeline.repliesPolicy.equals(repliesPolicy)) repliesPolicy = listTimeline.repliesPolicy; + } + + @Override + public void onError(ErrorResponse error) { + error.showToast(getContext()); + } + }); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.list, menu); + super.onCreateOptionsMenu(menu, inflater); + UiUtils.enableOptionsMenuIcons(getContext(), menu, R.id.pin); } @Override public boolean onOptionsItemSelected(MenuItem item) { - Bundle args = new Bundle(); - args.putString("listID", listID); + if (super.onOptionsItemSelected(item)) return true; if (item.getItemId() == R.id.edit) { ListTimelineEditor editor = new ListTimelineEditor(getContext()); editor.applyList(listTitle, repliesPolicy); @@ -74,9 +95,9 @@ public class ListTimelineFragment extends StatusListFragment { setTitle(list.title); listTitle = list.title; repliesPolicy = list.repliesPolicy; - args.putString("listTitle", listTitle); - args.putInt("repliesPolicy", repliesPolicy.ordinal()); - setResult(true, args); + resultArgs.putString("listTitle", listTitle); + resultArgs.putInt("repliesPolicy", repliesPolicy.ordinal()); + setResult(true, resultArgs); } @Override @@ -89,14 +110,24 @@ public class ListTimelineFragment extends StatusListFragment { .show(); } else if (item.getItemId() == R.id.delete) { UiUtils.confirmDeleteList(getActivity(), accountID, listID, listTitle, () -> { - args.putBoolean("deleted", true); - setResult(true, args); + resultArgs.putBoolean("deleted", true); + setResult(true, resultArgs); Nav.finish(this); }); } return true; } + @Override + public Bundle getResultArgs() { + return resultArgs; + } + + @Override + protected TimelineDefinition makeTimelineDefinition() { + return TimelineDefinition.ofList(listID, listTitle); + } + @Override protected void doLoadData(int offset, int count) { currentRequest=new GetListTimeline(listID, offset==0 ? null : getMaxID(), null, count, null) diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ListTimelinesFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ListTimelinesFragment.java index 2a22ae0d1..4eb83b807 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ListTimelinesFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ListTimelinesFragment.java @@ -21,6 +21,7 @@ import org.joinmastodon.android.api.requests.lists.RemoveAccountsFromList; import org.joinmastodon.android.model.ListTimeline; import org.joinmastodon.android.ui.DividerItemDecoration; import org.joinmastodon.android.ui.M3AlertDialogBuilder; +import org.joinmastodon.android.ui.utils.UiUtils; import org.joinmastodon.android.ui.views.ListTimelineEditor; import java.util.ArrayList; @@ -46,6 +47,7 @@ public class ListTimelinesFragment extends BaseRecyclerFragment im private HashMap userInList = new HashMap<>(); private int inProgress = 0; private ListsAdapter adapter; + private boolean pinnedUpdated; public ListTimelinesFragment() { super(10); @@ -74,6 +76,12 @@ public class ListTimelinesFragment extends BaseRecyclerFragment im loadData(); } + @Override + public void onDestroy() { + super.onDestroy(); + if (pinnedUpdated) UiUtils.restartApp(); + } + @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); @@ -159,6 +167,7 @@ public class ListTimelinesFragment extends BaseRecyclerFragment im @Override public void onFragmentResult(int reqCode, boolean listChanged, Bundle result){ if (reqCode == LIST_CHANGED_RESULT && listChanged) { + if (result.getBoolean("pinnedUpdated")) pinnedUpdated = true; String listID = result.getString("listID"); for (int i = 0; i < data.size(); i++) { ListTimeline item = data.get(i); diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/PinnableStatusListFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/PinnableStatusListFragment.java new file mode 100644 index 000000000..903736ce5 --- /dev/null +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/PinnableStatusListFragment.java @@ -0,0 +1,82 @@ +package org.joinmastodon.android.fragments; + +import android.os.Bundle; +import android.view.HapticFeedbackConstants; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.widget.Toast; + +import org.joinmastodon.android.GlobalUserPreferences; +import org.joinmastodon.android.R; +import org.joinmastodon.android.model.TimelineDefinition; + +import java.util.ArrayList; +import java.util.List; + +public abstract class PinnableStatusListFragment extends StatusListFragment { + protected boolean pinnedUpdated; + protected List pinnedTimelines; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + pinnedTimelines = new ArrayList<>(GlobalUserPreferences.pinnedTimelines.getOrDefault(accountID, TimelineDefinition.DEFAULT_TIMELINES)); + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + super.onCreateOptionsMenu(menu, inflater); + updatePinButton(menu.findItem(R.id.pin)); + } + + protected boolean isPinned() { + return pinnedTimelines.contains(makeTimelineDefinition()); + } + + protected void updatePinButton(MenuItem pin) { + boolean pinned = isPinned(); + pin.setIcon(pinned ? + R.drawable.ic_fluent_pin_24_filled : + R.drawable.ic_fluent_pin_24_regular); + pin.setTitle(pinned ? R.string.sk_unpin_timeline : R.string.sk_pin_timeline); + } + + protected abstract TimelineDefinition makeTimelineDefinition(); + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == R.id.pin) { + togglePin(item); + return true; + } + return super.onOptionsItemSelected(item); + } + + protected void togglePin(MenuItem pin) { + pinnedUpdated = true; + getToolbar().performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK); + TimelineDefinition def = makeTimelineDefinition(); + boolean pinned = isPinned(); + if (pinned) pinnedTimelines.remove(def); + else pinnedTimelines.add(def); + Toast.makeText(getContext(), pinned ? R.string.sk_unpinned_timeline : R.string.sk_pinned_timeline, Toast.LENGTH_SHORT).show(); + GlobalUserPreferences.pinnedTimelines.put(accountID, pinnedTimelines); + GlobalUserPreferences.save(); + updatePinButton(pin); + } + + protected Bundle getResultArgs() { + return new Bundle(); + } + + @Override + public void onDestroy() { + super.onDestroy(); + Bundle resultArgs = getResultArgs(); + if (pinnedUpdated) { + resultArgs.putBoolean("pinnedUpdated", true); + setResult(true, resultArgs); + } + } +} diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java index 808c8ec7a..3ac6aeb45 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java @@ -178,11 +178,6 @@ public class SettingsFragment extends MastodonToolbarFragment{ items.add(new HeaderItem(R.string.settings_behavior)); - items.add(new SwitchItem(R.string.sk_settings_show_federated_timeline, R.drawable.ic_fluent_earth_24_regular, GlobalUserPreferences.showFederatedTimeline, i->{ - GlobalUserPreferences.showFederatedTimeline=i.checked; - GlobalUserPreferences.save(); - needAppRestart=true; - })); items.add(new SwitchItem(R.string.settings_gif, R.drawable.ic_fluent_gif_24_regular, GlobalUserPreferences.playGifs, i->{ GlobalUserPreferences.playGifs=i.checked; GlobalUserPreferences.save(); @@ -354,11 +349,7 @@ public class SettingsFragment extends MastodonToolbarFragment{ if(needUpdateNotificationSettings && PushSubscriptionManager.arePushNotificationsAvailable()){ AccountSessionManager.getInstance().getAccount(accountID).getPushSubscriptionManager().updatePushSettings(pushSubscription); } - if(needAppRestart){ - Intent intent = Intent.makeRestartActivityTask(MastodonApp.context.getPackageManager().getLaunchIntentForPackage(MastodonApp.context.getPackageName()).getComponent()); - MastodonApp.context.startActivity(intent); - Runtime.getRuntime().exit(0); - } + if(needAppRestart) UiUtils.restartApp(); } @Override diff --git a/mastodon/src/main/java/org/joinmastodon/android/model/TimelineDefinition.java b/mastodon/src/main/java/org/joinmastodon/android/model/TimelineDefinition.java new file mode 100644 index 000000000..1f3cc936d --- /dev/null +++ b/mastodon/src/main/java/org/joinmastodon/android/model/TimelineDefinition.java @@ -0,0 +1,204 @@ +package org.joinmastodon.android.model; + +import android.app.Fragment; +import android.content.Context; +import android.os.Bundle; + +import androidx.annotation.DrawableRes; +import androidx.annotation.Nullable; +import androidx.annotation.StringRes; + +import org.joinmastodon.android.BuildConfig; +import org.joinmastodon.android.R; +import org.joinmastodon.android.fragments.HashtagTimelineFragment; +import org.joinmastodon.android.fragments.HomeTimelineFragment; +import org.joinmastodon.android.fragments.ListTimelineFragment; +import org.joinmastodon.android.fragments.NotificationsListFragment; +import org.joinmastodon.android.fragments.discover.FederatedTimelineFragment; +import org.joinmastodon.android.fragments.discover.LocalTimelineFragment; + +import java.util.List; +import java.util.Objects; + +public class TimelineDefinition { + private TimelineType type; + private String title; + private @Nullable Icon icon; + + private @Nullable String listId; + private @Nullable String listTitle; + + private @Nullable String hashtagName; + + public static TimelineDefinition ofList(String listId, String listTitle) { + TimelineDefinition def = new TimelineDefinition(TimelineType.LIST, listTitle); + def.listId = listId; + def.listTitle = listTitle; + return def; + } + + public static TimelineDefinition ofList(ListTimeline list) { + return ofList(list.id, list.title); + } + + public static TimelineDefinition ofHashtag(String hashtag) { + TimelineDefinition def = new TimelineDefinition(TimelineType.HASHTAG, hashtag); + def.hashtagName = hashtag; + return def; + } + + public static TimelineDefinition ofHashtag(Hashtag hashtag) { + return ofHashtag(hashtag.name); + } + + @SuppressWarnings("unused") + public TimelineDefinition() {} + + public TimelineDefinition(TimelineType type) { + this.type = type; + } + + public TimelineDefinition(TimelineType type, String title) { + this.type = type; + this.title = title; + } + + public String getTitle(Context ctx) { + return title != null ? title : getDefaultTitle(ctx); + } + + public String getCustomTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title == null || title.isBlank() ? null : title; + } + + public String getDefaultTitle(Context ctx) { + return switch (type) { + case HOME -> ctx.getString(R.string.sk_timeline_home); + case LOCAL -> ctx.getString(R.string.sk_timeline_local); + case FEDERATED -> ctx.getString(R.string.sk_timeline_federated); + case POST_NOTIFICATIONS -> ctx.getString(R.string.sk_timeline_posts); + case LIST -> listTitle; + case HASHTAG -> hashtagName; + }; + } + + public Icon getDefaultIcon() { + return switch (type) { + case HOME -> Icon.HOME; + case LOCAL -> Icon.LOCAL; + case FEDERATED -> Icon.FEDERATED; + case POST_NOTIFICATIONS -> Icon.POST_NOTIFICATIONS; + case LIST -> Icon.LIST; + case HASHTAG -> Icon.HASHTAG; + }; + } + + public Fragment getFragment() { + return switch (type) { + case HOME -> new HomeTimelineFragment(); + case LOCAL -> new LocalTimelineFragment(); + case FEDERATED -> new FederatedTimelineFragment(); + case LIST -> new ListTimelineFragment(); + case HASHTAG -> new HashtagTimelineFragment(); + case POST_NOTIFICATIONS -> new NotificationsListFragment(); + }; + } + + @Nullable + public Icon getIcon() { + return icon == null ? getDefaultIcon() : icon; + } + + public void setIcon(@Nullable Icon icon) { + this.icon = icon; + } + + public TimelineType getType() { + return type; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + TimelineDefinition that = (TimelineDefinition) o; + if (type != that.type) return false; + if (type == TimelineType.LIST) return Objects.equals(listId, that.listId); + if (type == TimelineType.HASHTAG) return Objects.equals(hashtagName.toLowerCase(), that.hashtagName.toLowerCase()); + return true; + } + + @Override + public int hashCode() { + int result = type.ordinal(); + result = 31 * result + (listId != null ? listId.hashCode() : 0); + result = 31 * result + (hashtagName.toLowerCase() != null ? hashtagName.toLowerCase().hashCode() : 0); + return result; + } + + public TimelineDefinition copy() { + TimelineDefinition def = new TimelineDefinition(type, title); + def.listId = listId; + def.listTitle = listTitle; + def.hashtagName = hashtagName; + def.icon = icon == null ? null : Icon.values()[icon.ordinal()]; + return def; + } + + public Bundle populateArguments(Bundle args) { + if (type == TimelineType.LIST) { + args.putString("listTitle", title); + args.putString("listID", listId); + } else if (type == TimelineType.HASHTAG) { + args.putString("hashtag", hashtagName); + } + return args; + } + + public enum TimelineType { HOME, LOCAL, FEDERATED, POST_NOTIFICATIONS, LIST, HASHTAG } + + public enum Icon { + HEART(R.drawable.ic_fluent_heart_24_regular, R.string.sk_icon_heart), + STAR(R.drawable.ic_fluent_star_24_regular, R.string.sk_icon_star), + + HOME(R.drawable.ic_fluent_home_24_regular, R.string.sk_timeline_home, true), + LOCAL(R.drawable.ic_fluent_people_community_24_regular, R.string.sk_timeline_local, true), + FEDERATED(R.drawable.ic_fluent_earth_24_regular, R.string.sk_timeline_federated, true), + POST_NOTIFICATIONS(R.drawable.ic_fluent_alert_24_regular, R.string.sk_timeline_posts, true), + LIST(R.drawable.ic_fluent_people_list_24_regular, R.string.sk_list, true), + HASHTAG(R.drawable.ic_fluent_number_symbol_24_regular, R.string.sk_hashtag, true); + + public final int iconRes, nameRes; + public final boolean hidden; + + Icon(@DrawableRes int iconRes, @StringRes int nameRes) { + this(iconRes, nameRes, false); + } + + Icon(@DrawableRes int iconRes, @StringRes int nameRes, boolean hidden) { + this.iconRes = iconRes; + this.nameRes = nameRes; + this.hidden = hidden; + } + } + + public static final TimelineDefinition HOME_TIMELINE = new TimelineDefinition(TimelineType.HOME); + public static final TimelineDefinition LOCAL_TIMELINE = new TimelineDefinition(TimelineType.LOCAL); + public static final TimelineDefinition FEDERATED_TIMELINE = new TimelineDefinition(TimelineType.FEDERATED); + public static final TimelineDefinition POSTS_TIMELINE = new TimelineDefinition(TimelineType.POST_NOTIFICATIONS); + + public static final List DEFAULT_TIMELINES = BuildConfig.BUILD_TYPE.equals("playRelease") + ? List.of(HOME_TIMELINE.copy(), LOCAL_TIMELINE.copy()) + : List.of(HOME_TIMELINE.copy(), LOCAL_TIMELINE.copy(), FEDERATED_TIMELINE.copy()); + public static final List ALL_TIMELINES = List.of( + HOME_TIMELINE.copy(), + LOCAL_TIMELINE.copy(), + FEDERATED_TIMELINE.copy(), + POSTS_TIMELINE.copy() + ); +} diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java b/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java index 1b0c34bed..14b91e9e4 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java @@ -1,5 +1,6 @@ package org.joinmastodon.android.ui.utils; +import static android.view.Menu.NONE; import static org.joinmastodon.android.GlobalUserPreferences.theme; import static org.joinmastodon.android.GlobalUserPreferences.trueBlackTheme; @@ -35,6 +36,7 @@ import android.util.Log; import android.view.HapticFeedbackConstants; import android.view.Menu; import android.view.MenuItem; +import android.view.SubMenu; import android.view.View; import android.webkit.MimeTypeMap; import android.widget.Button; @@ -772,11 +774,20 @@ public class UiUtils{ item.setTitle(ssb); } + public static void resetPopupItemTint(MenuItem item) { + if(Build.VERSION.SDK_INT>=26) { + item.setIconTintList(null); + } else { + Drawable icon=item.getIcon().mutate(); + icon.setTintList(null); + item.setIcon(icon); + } + } + public static void enableOptionsMenuIcons(Context context, Menu menu, @IdRes int... asAction) { if(menu.getClass().getSimpleName().equals("MenuBuilder")){ try { - Method m = menu.getClass().getDeclaredMethod( - "setOptionalIconsVisible", Boolean.TYPE); + Method m = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE); m.setAccessible(true); m.invoke(menu, true); enableMenuIcons(context, menu, asAction); @@ -789,6 +800,8 @@ public class UiUtils{ ColorStateList iconTint=ColorStateList.valueOf(UiUtils.getThemeColor(context, android.R.attr.textColorSecondary)); for(int i=0;i id == item.getItemId())) continue; insetPopupMenuIcon(item, iconTint); } @@ -887,6 +900,18 @@ public class UiUtils{ builder.show(); } + public static void restartApp() { + Intent intent = Intent.makeRestartActivityTask(MastodonApp.context.getPackageManager().getLaunchIntentForPackage(MastodonApp.context.getPackageName()).getComponent()); + MastodonApp.context.startActivity(intent); + Runtime.getRuntime().exit(0); + } + + public static MenuItem makeBackItem(Menu m) { + MenuItem back = m.add(0, R.id.menu_back, NONE, R.string.back); + back.setIcon(R.drawable.ic_arrow_back); + return back; + } + @FunctionalInterface public interface InteractionPerformer { void interact(StatusInteractionController ic, Status status, Consumer resultConsumer); diff --git a/mastodon/src/main/res/drawable/ic_fluent_add_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_add_24_regular.xml new file mode 100644 index 000000000..04e974133 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_add_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_pin_24_filled.xml b/mastodon/src/main/res/drawable/ic_fluent_pin_24_filled.xml new file mode 100644 index 000000000..493dc05be --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_pin_24_filled.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_timeline_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_timeline_24_regular.xml index 79fb0b548..db79b17ac 100644 --- a/mastodon/src/main/res/drawable/ic_fluent_timeline_24_regular.xml +++ b/mastodon/src/main/res/drawable/ic_fluent_timeline_24_regular.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/mastodon/src/main/res/layout/edit_timeline.xml b/mastodon/src/main/res/layout/edit_timeline.xml new file mode 100644 index 000000000..f2ee406b1 --- /dev/null +++ b/mastodon/src/main/res/layout/edit_timeline.xml @@ -0,0 +1,22 @@ + + + + + \ No newline at end of file diff --git a/mastodon/src/main/res/layout/item_text.xml b/mastodon/src/main/res/layout/item_text.xml index e29875512..b8ab38717 100644 --- a/mastodon/src/main/res/layout/item_text.xml +++ b/mastodon/src/main/res/layout/item_text.xml @@ -26,7 +26,18 @@ android:layout_width="wrap_content" android:layout_height="match_parent" android:visibility="gone" - android:paddingRight="16dp"/> + android:paddingHorizontal="8dp" + tools:ignore="RtlSymmetry" /> + + diff --git a/mastodon/src/main/res/menu/hashtag_timeline.xml b/mastodon/src/main/res/menu/hashtag_timeline.xml index 98d963ba8..efc7cc2e2 100644 --- a/mastodon/src/main/res/menu/hashtag_timeline.xml +++ b/mastodon/src/main/res/menu/hashtag_timeline.xml @@ -1,5 +1,10 @@ + + \ No newline at end of file diff --git a/mastodon/src/main/res/menu/home_switcher.xml b/mastodon/src/main/res/menu/home_switcher.xml deleted file mode 100644 index ccd7376a5..000000000 --- a/mastodon/src/main/res/menu/home_switcher.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/mastodon/src/main/res/menu/list.xml b/mastodon/src/main/res/menu/list.xml index 7693ee429..f2a85686e 100644 --- a/mastodon/src/main/res/menu/list.xml +++ b/mastodon/src/main/res/menu/list.xml @@ -1,13 +1,16 @@ + + android:icon="@drawable/ic_fluent_edit_24_regular" /> + android:icon="@drawable/ic_fluent_delete_24_regular" /> \ No newline at end of file diff --git a/mastodon/src/main/res/values/ids.xml b/mastodon/src/main/res/values/ids.xml index e03ac4a14..8c3028318 100644 --- a/mastodon/src/main/res/values/ids.xml +++ b/mastodon/src/main/res/values/ids.xml @@ -20,5 +20,6 @@ - + + \ 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 d32da7cd5..c095a1842 100644 --- a/mastodon/src/main/res/values/strings_sk.xml +++ b/mastodon/src/main/res/values/strings_sk.xml @@ -33,7 +33,7 @@ Follow requests Accept follow request Reject follow request - Lists with %s + Edit lists with %s Always reveal content warnings Disable scrolling text in title bars Contribute to Megalodon @@ -143,7 +143,7 @@ Home Local Federation - Type to start searching + Type something to start searching Remove as follower Remove %s as a follower by blocking and immediately unblocking them? Remove @@ -168,70 +168,6 @@ Icon Heart Star - City - Cat - Dog - Rabbit - Turtle - Balloon - Image - Bot - Language - Location - Megaphone - Microphone - Microscope - Keyboard - Coffee - Laugh - News - Pi - Color palette - Academic cap - Tag - Stethoscope - Weather - Games - Code - Light bulb - Train - Clapper board - Leaves - Sport - Aperture - Music - People - Health - Important - Chat - Shield - Book - Bicycle - Map - Math formula - Backpack - Briefcase - Fire - Bug - Pizza - Gavel - Gauge - Headphones - Human - Globe - Pin Edit timeline Edit timelines - ALT - edited - Edited posts - Edits a reblogged post - Attach file - Searching… - No results - Save draft? - Do you want to save your changes to this draft or publish it now? - No alt text available - Indicator for alt texts - Indicator for missing alt texts \ No newline at end of file From b36b1b2a28d4e1f752334d443b5005c83c838e2c Mon Sep 17 00:00:00 2001 From: sk Date: Sat, 21 Jan 2023 02:35:46 +0100 Subject: [PATCH 023/218] tweak alt button --- .../src/main/res/layout/display_item_photo.xml | 14 +++++++------- mastodon/src/main/res/values/strings_sk.xml | 1 + 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/mastodon/src/main/res/layout/display_item_photo.xml b/mastodon/src/main/res/layout/display_item_photo.xml index 00b0bd176..4a724ef42 100644 --- a/mastodon/src/main/res/layout/display_item_photo.xml +++ b/mastodon/src/main/res/layout/display_item_photo.xml @@ -17,22 +17,21 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="start|bottom" - android:layout_marginLeft="16dp" - android:layout_marginRight="16dp" - android:layout_marginTop="8dp" - android:layout_marginBottom="8dp" + android:layout_margin="12dp" android:importantForAccessibility="noHideDescendants" android:background="@drawable/bg_image_alt_overlay"> + android:paddingHorizontal="5dp" + android:paddingVertical="1dp" + android:text="@string/sk_alt_button"/> Star Edit timeline Edit timelines + ALT \ No newline at end of file From 79393801721a4c97b60eb5519f25d3e3f9494fd5 Mon Sep 17 00:00:00 2001 From: sk Date: Sat, 21 Jan 2023 12:17:53 -0300 Subject: [PATCH 024/218] different icon for post notifs --- .../org/joinmastodon/android/PushNotificationReceiver.java | 2 ++ .../android/fragments/discover/DiscoverFragment.java | 4 ++-- .../org/joinmastodon/android/model/TimelineDefinition.java | 2 +- mastodon/src/main/res/drawable/ic_fluent_chat_24_filled.xml | 3 +++ mastodon/src/main/res/drawable/ic_fluent_chat_24_regular.xml | 3 +++ 5 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 mastodon/src/main/res/drawable/ic_fluent_chat_24_filled.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_chat_24_regular.xml diff --git a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java index 492d724a9..a9e9265ee 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java +++ b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java @@ -160,6 +160,8 @@ public class PushNotificationReceiver extends BroadcastReceiver{ case FOLLOW -> builder.setSmallIcon(R.drawable.ic_fluent_person_add_24_filled); case MENTION -> builder.setSmallIcon(R.drawable.ic_fluent_mention_24_filled); case POLL -> builder.setSmallIcon(R.drawable.ic_fluent_poll_24_filled); + case STATUS -> R.drawable.ic_fluent_chat_24_filled; + default -> builder.setSmallIcon(R.drawable.ic_ntf_logo); } }else{ diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/DiscoverFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/DiscoverFragment.java index 30aa3cfca..ce67ac2b4 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/DiscoverFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/DiscoverFragment.java @@ -62,7 +62,7 @@ public class DiscoverFragment extends AppKitFragment implements ScrollableToTop, private String accountID; private Runnable searchDebouncer=this::onSearchChangedDebounced; - private final boolean noFederated = !GlobalUserPreferences.showFederatedTimeline; +// private final boolean noFederated = !GlobalUserPreferences.showFederatedTimeline; @Override public void onCreate(Bundle savedInstanceState){ @@ -324,7 +324,7 @@ public class DiscoverFragment extends AppKitFragment implements ScrollableToTop, } private Fragment getFragmentForPage(int page){ - if (noFederated && page > 0) page++; +// if (noFederated && page > 0) page++; // return switch(page){ // case 0 -> localTimelineFragment; diff --git a/mastodon/src/main/java/org/joinmastodon/android/model/TimelineDefinition.java b/mastodon/src/main/java/org/joinmastodon/android/model/TimelineDefinition.java index 1f3cc936d..4b48934ca 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/model/TimelineDefinition.java +++ b/mastodon/src/main/java/org/joinmastodon/android/model/TimelineDefinition.java @@ -169,7 +169,7 @@ public class TimelineDefinition { HOME(R.drawable.ic_fluent_home_24_regular, R.string.sk_timeline_home, true), LOCAL(R.drawable.ic_fluent_people_community_24_regular, R.string.sk_timeline_local, true), FEDERATED(R.drawable.ic_fluent_earth_24_regular, R.string.sk_timeline_federated, true), - POST_NOTIFICATIONS(R.drawable.ic_fluent_alert_24_regular, R.string.sk_timeline_posts, true), + POST_NOTIFICATIONS(R.drawable.ic_fluent_chat_24_regular, R.string.sk_timeline_posts, true), LIST(R.drawable.ic_fluent_people_list_24_regular, R.string.sk_list, true), HASHTAG(R.drawable.ic_fluent_number_symbol_24_regular, R.string.sk_hashtag, true); diff --git a/mastodon/src/main/res/drawable/ic_fluent_chat_24_filled.xml b/mastodon/src/main/res/drawable/ic_fluent_chat_24_filled.xml new file mode 100644 index 000000000..4757c7084 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_chat_24_filled.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_chat_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_chat_24_regular.xml new file mode 100644 index 000000000..0c0b72c3d --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_chat_24_regular.xml @@ -0,0 +1,3 @@ + + + From 9df738831fef2a1b62b07096a60e16018cc33e27 Mon Sep 17 00:00:00 2001 From: sk Date: Sat, 21 Jan 2023 15:24:33 -0300 Subject: [PATCH 025/218] work around crash onHidden re: mastodon#512 --- .../android/PushNotificationReceiver.java | 2 +- .../fragments/HomeTimelineFragment.java | 38 ++++++++++--------- .../res/drawable/ic_fluent_chat_24_filled.xml | 2 +- 3 files changed, 22 insertions(+), 20 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java index a9e9265ee..2eb148a76 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java +++ b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java @@ -160,7 +160,7 @@ public class PushNotificationReceiver extends BroadcastReceiver{ case FOLLOW -> builder.setSmallIcon(R.drawable.ic_fluent_person_add_24_filled); case MENTION -> builder.setSmallIcon(R.drawable.ic_fluent_mention_24_filled); case POLL -> builder.setSmallIcon(R.drawable.ic_fluent_poll_24_filled); - case STATUS -> R.drawable.ic_fluent_chat_24_filled; + case STATUS -> builder.setSmallIcon(R.drawable.ic_fluent_chat_24_filled); default -> builder.setSmallIcon(R.drawable.ic_ntf_logo); } 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 4bb9ea4c8..93e6d29eb 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTimelineFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTimelineFragment.java @@ -98,24 +98,26 @@ public class HomeTimelineFragment extends FabStatusListFragment { @Override protected void onHidden(){ super.onHidden(); -// if(!data.isEmpty()){ -// String topPostID=displayItems.get(list.getChildAdapterPosition(list.getChildAt(0))-getMainAdapterOffset()).parentID; -// if(!topPostID.equals(lastSavedMarkerID)){ -// lastSavedMarkerID=topPostID; -// new SaveMarkers(topPostID, null) -// .setCallback(new Callback<>(){ -// @Override -// public void onSuccess(SaveMarkers.Response result){ -// } -// -// @Override -// public void onError(ErrorResponse error){ -// lastSavedMarkerID=null; -// } -// }) -// .exec(accountID); -// } -// } + // workaround for mastodon#512. revert if fixed otherwise + int position = list.getChildAdapterPosition(list.getChildAt(0))-getMainAdapterOffset(); + if(!data.isEmpty() && position >= 0 && position < displayItems.size()){ + String topPostID=displayItems.get(position).parentID; + if(!topPostID.equals(lastSavedMarkerID)){ + lastSavedMarkerID=topPostID; + new SaveMarkers(topPostID, null) + .setCallback(new Callback<>(){ + @Override + public void onSuccess(SaveMarkers.Response result){ + } + + @Override + public void onError(ErrorResponse error){ + lastSavedMarkerID=null; + } + }) + .exec(accountID); + } + } } public void onStatusCreated(StatusCreatedEvent ev){ diff --git a/mastodon/src/main/res/drawable/ic_fluent_chat_24_filled.xml b/mastodon/src/main/res/drawable/ic_fluent_chat_24_filled.xml index 4757c7084..f9f5537c5 100644 --- a/mastodon/src/main/res/drawable/ic_fluent_chat_24_filled.xml +++ b/mastodon/src/main/res/drawable/ic_fluent_chat_24_filled.xml @@ -1,3 +1,3 @@ - + From 3622eba05756b88a0b9d5d528913848544029a17 Mon Sep 17 00:00:00 2001 From: sk Date: Sat, 21 Jan 2023 19:24:55 +0100 Subject: [PATCH 026/218] remove pivot for timeline title --- .../org/joinmastodon/android/fragments/HomeTabFragment.java | 2 -- 1 file changed, 2 deletions(-) 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 68c460322..1059722b5 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTabFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTabFragment.java @@ -280,8 +280,6 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab switcher.setPivotX(V.dp(28)); // padding + half of icon switcher.setPivotY(switcher.getHeight() / 2f); - timelineTitle.setPivotX(timelineTitle.getWidth() - V.dp(8)); - timelineTitle.setPivotY(timelineTitle.getHeight() / 2f); } }); } From 50baffefbece44eaef2912b66a213a05cd92c218 Mon Sep 17 00:00:00 2001 From: sk Date: Sat, 21 Jan 2023 21:39:11 +0100 Subject: [PATCH 027/218] add lists to status header --- .../ui/displayitems/HeaderStatusDisplayItem.java | 11 +++++++++++ mastodon/src/main/res/menu/post.xml | 1 + mastodon/src/main/res/values/strings_sk.xml | 2 +- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/HeaderStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/HeaderStatusDisplayItem.java index 0b99871ef..5af396cbe 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/HeaderStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/HeaderStatusDisplayItem.java @@ -33,6 +33,7 @@ import org.joinmastodon.android.api.session.AccountSession; import org.joinmastodon.android.api.session.AccountSessionManager; import org.joinmastodon.android.fragments.BaseStatusListFragment; import org.joinmastodon.android.fragments.ComposeFragment; +import org.joinmastodon.android.fragments.ListTimelinesFragment; import org.joinmastodon.android.fragments.NotificationsListFragment; import org.joinmastodon.android.fragments.ProfileFragment; import org.joinmastodon.android.fragments.ThreadFragment; @@ -264,6 +265,12 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{ UiUtils.confirmToggleBlockDomain(activity, item.parentFragment.getAccountID(), account.getDomain(), relationship!=null && relationship.domainBlocking, ()->{}); }else if(id==R.id.bookmark){ AccountSessionManager.getInstance().getAccount(item.accountID).getStatusInteractionController().setBookmarked(item.status, !item.status.bookmarked); + }else if(id==R.id.manage_user_lists){ + final Bundle args=new Bundle(); + args.putString("account", item.parentFragment.getAccountID()); + args.putString("profileAccount", account.id); + args.putString("profileDisplayUsername", account.getDisplayUsername()); + Nav.go(item.parentFragment.getActivity(), ListTimelinesFragment.class, args); } return true; }); @@ -464,6 +471,7 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{ MenuItem block=menu.findItem(R.id.block); MenuItem report=menu.findItem(R.id.report); MenuItem follow=menu.findItem(R.id.follow); + MenuItem manageUserLists = menu.findItem(R.id.manage_user_lists); MenuItem bookmark=menu.findItem(R.id.bookmark); bookmark.setVisible(false); /* disabled in megalodon: add/remove bookmark is already available through status footer @@ -480,6 +488,7 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{ report.setVisible(false); follow.setVisible(false); blockDomain.setVisible(false); + manageUserLists.setVisible(false); }else{ mute.setVisible(true); block.setVisible(true); @@ -500,6 +509,8 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{ boolean following = relationship!=null && relationship.following; follow.setTitle(item.parentFragment.getString(following ? R.string.unfollow_user : R.string.follow_user, account.getShortUsername())); follow.setIcon(following ? R.drawable.ic_fluent_person_delete_24_regular : R.drawable.ic_fluent_person_add_24_regular); + manageUserLists.setVisible(relationship != null && relationship.following); + manageUserLists.setTitle(item.parentFragment.getString(R.string.sk_lists_with_user, account.getShortUsername())); UiUtils.insetPopupMenuIcon(item.parentFragment.getContext(), follow); } } diff --git a/mastodon/src/main/res/menu/post.xml b/mastodon/src/main/res/menu/post.xml index b0de637d0..42d588d9e 100644 --- a/mastodon/src/main/res/menu/post.xml +++ b/mastodon/src/main/res/menu/post.xml @@ -12,6 +12,7 @@ + diff --git a/mastodon/src/main/res/values/strings_sk.xml b/mastodon/src/main/res/values/strings_sk.xml index 9baea2577..798906c1e 100644 --- a/mastodon/src/main/res/values/strings_sk.xml +++ b/mastodon/src/main/res/values/strings_sk.xml @@ -33,7 +33,7 @@ Follow requests Accept follow request Reject follow request - Edit lists with %s + Lists with %s Always reveal content warnings Disable scrolling text in title bars Contribute to Megalodon From bc9edf1f69ad71756e2b76ec5911369759e0aa05 Mon Sep 17 00:00:00 2001 From: sk Date: Sat, 21 Jan 2023 21:48:33 +0100 Subject: [PATCH 028/218] fix redrafting empty posts closes sk22#325 --- .../android/ui/displayitems/HeaderStatusDisplayItem.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/HeaderStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/HeaderStatusDisplayItem.java index 5af396cbe..76aed29ce 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/HeaderStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/HeaderStatusDisplayItem.java @@ -184,7 +184,8 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{ final Bundle args=new Bundle(); args.putString("account", item.parentFragment.getAccountID()); args.putParcelable("editStatus", Parcels.wrap(item.status)); - if (id==R.id.delete_and_redraft) { + boolean redraft = id==R.id.delete_and_redraft; + if (redraft) { args.putBoolean("redraftStatus", true); if (item.parentFragment instanceof ThreadFragment thread && !thread.isItemEnabled(item.status.id)) { // ("enabled" = clickable; opened status is not clickable) @@ -192,7 +193,7 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{ args.putBoolean("navigateToStatus", true); } } - if(TextUtils.isEmpty(item.status.content) && TextUtils.isEmpty(item.status.spoilerText)){ + if(!redraft && TextUtils.isEmpty(item.status.content) && TextUtils.isEmpty(item.status.spoilerText)){ Nav.go(item.parentFragment.getActivity(), ComposeFragment.class, args); }else if(item.scheduledStatus!=null){ args.putString("sourceText", item.status.text); @@ -207,7 +208,7 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{ public void onSuccess(GetStatusSourceText.Response result){ args.putString("sourceText", result.text); args.putString("sourceSpoiler", result.spoilerText); - if (id==R.id.delete_and_redraft) { + if (redraft) { UiUtils.confirmDeletePost(item.parentFragment.getActivity(), item.parentFragment.getAccountID(), item.status, s->{ Nav.go(item.parentFragment.getActivity(), ComposeFragment.class, args); }, true); From 0fcbf02a2cdbb263c5a99a7037c8d8cb42450e42 Mon Sep 17 00:00:00 2001 From: sk Date: Sat, 21 Jan 2023 18:06:00 -0300 Subject: [PATCH 029/218] notifications for edited posts closes sk22#331 --- .../android/PushNotificationReceiver.java | 30 +++++++++---------- .../fragments/NotificationsListFragment.java | 3 +- .../android/fragments/SettingsFragment.java | 19 +++++------- .../android/model/Notification.java | 4 ++- .../android/model/PushNotification.java | 4 ++- .../android/model/PushSubscription.java | 4 ++- .../drawable/ic_fluent_history_24_filled.xml | 3 ++ .../drawable/ic_fluent_history_24_regular.xml | 3 ++ mastodon/src/main/res/values/strings_sk.xml | 3 ++ 9 files changed, 41 insertions(+), 32 deletions(-) create mode 100644 mastodon/src/main/res/drawable/ic_fluent_history_24_filled.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_history_24_regular.xml diff --git a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java index 2eb148a76..43d95f569 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java +++ b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java @@ -144,28 +144,26 @@ public class PushNotificationReceiver extends BroadcastReceiver{ builder.setContentTitle(pn.title) .setContentText(pn.body) .setContentTitle(pn.title) - .setStyle(new Notification.InboxStyle() - .addLine(pn.body)) + .setStyle(new Notification.BigTextStyle().bigText(pn.body)) + .setSmallIcon(R.drawable.ic_ntf_logo) .setContentIntent(PendingIntent.getActivity(context, notificationId, contentIntent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT)) .setWhen(notification==null ? System.currentTimeMillis() : notification.createdAt.toEpochMilli()) .setShowWhen(true) .setCategory(Notification.CATEGORY_SOCIAL) .setAutoCancel(true) - .setGroup(accountID) - .setColor(context.getColor(R.color.shortcut_icon_background)); - if(!GlobalUserPreferences.uniformNotificationIcon){ - switch (pn.notificationType) { - case FAVORITE -> builder.setSmallIcon(R.drawable.ic_fluent_star_24_filled); - case REBLOG -> builder.setSmallIcon(R.drawable.ic_fluent_arrow_repeat_all_24_filled); - case FOLLOW -> builder.setSmallIcon(R.drawable.ic_fluent_person_add_24_filled); - case MENTION -> builder.setSmallIcon(R.drawable.ic_fluent_mention_24_filled); - case POLL -> builder.setSmallIcon(R.drawable.ic_fluent_poll_24_filled); - case STATUS -> builder.setSmallIcon(R.drawable.ic_fluent_chat_24_filled); + .setColor(context.getColor(R.color.primary_700)) + .setGroup(accountID); - default -> builder.setSmallIcon(R.drawable.ic_ntf_logo); - } - }else{ - builder.setSmallIcon(R.drawable.ic_ntf_logo); + if (!GlobalUserPreferences.uniformNotificationIcon) { + builder.setSmallIcon(switch (pn.notificationType) { + case FAVORITE -> R.drawable.ic_fluent_star_24_filled; + case REBLOG -> R.drawable.ic_fluent_arrow_repeat_all_24_filled; + case FOLLOW -> R.drawable.ic_fluent_person_add_24_filled; + case MENTION -> R.drawable.ic_fluent_mention_24_filled; + case POLL -> R.drawable.ic_fluent_poll_24_filled; + case STATUS -> R.drawable.ic_fluent_chat_24_filled; + case UPDATE -> R.drawable.ic_fluent_history_24_filled; + }); } if(avatar!=null){ 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 97ec6f770..8e97743c5 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsListFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsListFragment.java @@ -2,8 +2,6 @@ package org.joinmastodon.android.fragments; import android.app.Activity; import android.os.Bundle; -import android.view.Menu; -import android.view.MenuInflater; import android.view.View; import com.squareup.otto.Subscribe; @@ -78,6 +76,7 @@ public class NotificationsListFragment extends BaseStatusListFragment getString(R.string.notification_boosted); case FAVORITE -> getString(R.string.user_favorited); case POLL -> getString(R.string.poll_ended); + case UPDATE -> getString(R.string.sk_post_edited); }; HeaderStatusDisplayItem titleItem=extraText!=null ? new HeaderStatusDisplayItem(n.id, n.account, n.createdAt, this, accountID, null, extraText, n, null) : null; if(n.status!=null){ diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java index 3ac6aeb45..68190c213 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java @@ -210,15 +210,14 @@ public class SettingsFragment extends MastodonToolbarFragment{ GlobalUserPreferences.save(); needAppRestart=true; })); -// items.add(new SwitchItem(R.string.sk_enable_delete_notifications, R.drawable.ic_fluent_delete_24_regular, GlobalUserPreferences.enableDeleteNotifications, i->{ -// GlobalUserPreferences.enableDeleteNotifications=i.checked; -// GlobalUserPreferences.save(); -// needAppRestart=true; -// })); - items.add(new SwitchItem(R.string.mo_relocate_publish_button, R.drawable.ic_fluent_arrow_autofit_down_24_regular, GlobalUserPreferences.relocatePublishButton, i->{ - GlobalUserPreferences.relocatePublishButton=i.checked; + items.add(new SwitchItem(R.string.sk_settings_single_notification, R.drawable.ic_fluent_convert_range_24_regular, GlobalUserPreferences.keepOnlyLatestNotification, i->{ + GlobalUserPreferences.keepOnlyLatestNotification=i.checked; GlobalUserPreferences.save(); })); +// items.add(new SwitchItem(R.string.sk_settings_translate_only_opened, R.drawable.ic_fluent_translate_24_regular, GlobalUserPreferences.translateButtonOpenedOnly, i->{ +// GlobalUserPreferences.translateButtonOpenedOnly=i.checked; +// GlobalUserPreferences.save(); +// })); // items.add(new SwitchItem(R.string.sk_settings_hide_translate_in_timeline, R.drawable.ic_fluent_translate_24_regular, GlobalUserPreferences.translateButtonOpenedOnly, i->{ // GlobalUserPreferences.translateButtonOpenedOnly=i.checked; // GlobalUserPreferences.save(); @@ -246,11 +245,8 @@ public class SettingsFragment extends MastodonToolbarFragment{ items.add(new SwitchItem(R.string.notify_follow, R.drawable.ic_fluent_person_add_24_regular, pushSubscription.alerts.follow, i->onNotificationsChanged(PushNotification.Type.FOLLOW, i.checked))); items.add(new SwitchItem(R.string.notify_reblog, R.drawable.ic_fluent_arrow_repeat_all_24_regular, pushSubscription.alerts.reblog, i->onNotificationsChanged(PushNotification.Type.REBLOG, i.checked))); items.add(new SwitchItem(R.string.notify_mention, R.drawable.ic_fluent_mention_24_regular, pushSubscription.alerts.mention, i->onNotificationsChanged(PushNotification.Type.MENTION, i.checked))); + items.add(new SwitchItem(R.string.sk_notify_update, R.drawable.ic_fluent_history_24_regular, pushSubscription.alerts.update, i->onNotificationsChanged(PushNotification.Type.UPDATE, i.checked))); items.add(new SwitchItem(R.string.sk_notify_posts, R.drawable.ic_fluent_alert_24_regular, pushSubscription.alerts.status, i->onNotificationsChanged(PushNotification.Type.STATUS, i.checked))); - items.add(new SwitchItem(R.string.sk_settings_single_notification, R.drawable.ic_fluent_convert_range_24_regular, GlobalUserPreferences.keepOnlyLatestNotification, i->{ - GlobalUserPreferences.keepOnlyLatestNotification=i.checked; - GlobalUserPreferences.save(); - })); items.add(new HeaderItem(R.string.settings_account)); items.add(new TextItem(R.string.sk_settings_profile, ()->UiUtils.launchWebBrowser(getActivity(), "https://"+session.domain+"/settings/profile"), R.drawable.ic_fluent_open_24_regular)); @@ -455,6 +451,7 @@ public class SettingsFragment extends MastodonToolbarFragment{ case REBLOG -> subscription.alerts.reblog=enabled; case MENTION -> subscription.alerts.mention=subscription.alerts.poll=enabled; case STATUS -> subscription.alerts.status=enabled; + case UPDATE -> subscription.alerts.update=enabled; } needUpdateNotificationSettings=true; } diff --git a/mastodon/src/main/java/org/joinmastodon/android/model/Notification.java b/mastodon/src/main/java/org/joinmastodon/android/model/Notification.java index 545028add..ffd70d8cb 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/model/Notification.java +++ b/mastodon/src/main/java/org/joinmastodon/android/model/Notification.java @@ -48,6 +48,8 @@ public class Notification extends BaseModel implements DisplayItemsParent{ @SerializedName("poll") POLL, @SerializedName("status") - STATUS + STATUS, + @SerializedName("update") + UPDATE } } diff --git a/mastodon/src/main/java/org/joinmastodon/android/model/PushNotification.java b/mastodon/src/main/java/org/joinmastodon/android/model/PushNotification.java index de5cc3dba..09784d471 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/model/PushNotification.java +++ b/mastodon/src/main/java/org/joinmastodon/android/model/PushNotification.java @@ -45,7 +45,9 @@ public class PushNotification extends BaseModel{ @SerializedName("poll") POLL(R.string.notification_type_poll), @SerializedName("status") - STATUS(R.string.sk_notification_type_status); + STATUS(R.string.sk_notification_type_status), + @SerializedName("update") + UPDATE(R.string.sk_notification_type_update); @StringRes public final int localizedName; diff --git a/mastodon/src/main/java/org/joinmastodon/android/model/PushSubscription.java b/mastodon/src/main/java/org/joinmastodon/android/model/PushSubscription.java index 7c0fc0967..d9146931e 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/model/PushSubscription.java +++ b/mastodon/src/main/java/org/joinmastodon/android/model/PushSubscription.java @@ -45,10 +45,11 @@ public class PushSubscription extends BaseModel implements Cloneable{ public boolean mention; public boolean poll; public boolean status; + public boolean update; public static Alerts ofAll(){ Alerts alerts=new Alerts(); - alerts.follow=alerts.favourite=alerts.reblog=alerts.mention=alerts.poll=alerts.status=true; + alerts.follow=alerts.favourite=alerts.reblog=alerts.mention=alerts.poll=alerts.status=alerts.update=true; return alerts; } @@ -61,6 +62,7 @@ public class PushSubscription extends BaseModel implements Cloneable{ ", mention="+mention+ ", poll="+poll+ ", status="+status+ + ", update="+update+ '}'; } diff --git a/mastodon/src/main/res/drawable/ic_fluent_history_24_filled.xml b/mastodon/src/main/res/drawable/ic_fluent_history_24_filled.xml new file mode 100644 index 000000000..b32bc18c0 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_history_24_filled.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_history_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_history_24_regular.xml new file mode 100644 index 000000000..cf69e5f70 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_history_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/values/strings_sk.xml b/mastodon/src/main/res/values/strings_sk.xml index 798906c1e..2b82f6fcf 100644 --- a/mastodon/src/main/res/values/strings_sk.xml +++ b/mastodon/src/main/res/values/strings_sk.xml @@ -171,4 +171,7 @@ Edit timeline Edit timelines ALT + edited + Edited posts + Edits a reblogged posts \ No newline at end of file From 9a2df814c514044e17f40231050eb7de2a257134 Mon Sep 17 00:00:00 2001 From: sk Date: Sat, 21 Jan 2023 22:48:00 +0100 Subject: [PATCH 030/218] scroll image in alt text editor closes sk22#315 --- .../res/layout/fragment_image_description.xml | 46 ++++++++++--------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/mastodon/src/main/res/layout/fragment_image_description.xml b/mastodon/src/main/res/layout/fragment_image_description.xml index a1d2b0464..e8a4755b8 100644 --- a/mastodon/src/main/res/layout/fragment_image_description.xml +++ b/mastodon/src/main/res/layout/fragment_image_description.xml @@ -1,18 +1,19 @@ - + android:layout_height="match_parent" + android:orientation="vertical"> - + android:layout_height="match_parent" + android:layout_marginBottom="250dp" + android:layout_gravity="top"> - + + + + + android:layout_height="0.5dp" + android:background="?attr/colorPollVoted"/> + android:hint="@string/alt_text_hint" /> - \ No newline at end of file + \ No newline at end of file From 55640dddb9259a12c28600f3e2d1de890a5c5196 Mon Sep 17 00:00:00 2001 From: sk Date: Sat, 21 Jan 2023 22:50:11 +0100 Subject: [PATCH 031/218] fix typo in string --- mastodon/src/main/res/values/strings_sk.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mastodon/src/main/res/values/strings_sk.xml b/mastodon/src/main/res/values/strings_sk.xml index 2b82f6fcf..ef445cee2 100644 --- a/mastodon/src/main/res/values/strings_sk.xml +++ b/mastodon/src/main/res/values/strings_sk.xml @@ -173,5 +173,5 @@ ALT edited Edited posts - Edits a reblogged posts + Edits a reblogged post \ No newline at end of file From 55a2ae874831c17882206137b22ba0a01d4cd8c2 Mon Sep 17 00:00:00 2001 From: sk Date: Sat, 21 Jan 2023 23:06:31 +0100 Subject: [PATCH 032/218] fix wrong "hasSpoiler" value on restore closes sk22#324 --- .../java/org/joinmastodon/android/fragments/ComposeFragment.java | 1 + 1 file changed, 1 insertion(+) diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java index c72d7e982..e00cfc671 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java @@ -426,6 +426,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr spoilerBg.setDrawableByLayerId(R.id.right_drawable, new SpoilerStripesDrawable()); spoilerEdit.setBackground(spoilerBg); if((savedInstanceState!=null && savedInstanceState.getBoolean("hasSpoiler", false)) || hasSpoiler){ + hasSpoiler=true; spoilerEdit.setVisibility(View.VISIBLE); spoilerBtn.setSelected(true); }else if(editingStatus!=null && !TextUtils.isEmpty(editingStatus.spoilerText)){ From 8d827054bfbafb6da30b4aa9f68777f4dcd86974 Mon Sep 17 00:00:00 2001 From: Grishka Date: Sat, 21 Jan 2023 19:12:39 -0300 Subject: [PATCH 033/218] Fix #512 --- .../android/fragments/HomeTimelineFragment.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) 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 93e6d29eb..46c162144 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTimelineFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTimelineFragment.java @@ -98,10 +98,8 @@ public class HomeTimelineFragment extends FabStatusListFragment { @Override protected void onHidden(){ super.onHidden(); - // workaround for mastodon#512. revert if fixed otherwise - int position = list.getChildAdapterPosition(list.getChildAt(0))-getMainAdapterOffset(); - if(!data.isEmpty() && position >= 0 && position < displayItems.size()){ - String topPostID=displayItems.get(position).parentID; + if(!data.isEmpty()){ + String topPostID=displayItems.get(Math.max(0, list.getChildAdapterPosition(list.getChildAt(0))-getMainAdapterOffset())).parentID; if(!topPostID.equals(lastSavedMarkerID)){ lastSavedMarkerID=topPostID; new SaveMarkers(topPostID, null) From 8c6ac9e22b37642399b509cecb20586a99c403d5 Mon Sep 17 00:00:00 2001 From: sk Date: Sat, 21 Jan 2023 19:14:24 -0300 Subject: [PATCH 034/218] Revert "work around crash onHidden" This reverts commit 763c5fe2a7fbf7fe46c24f8c12ef8359a85b95af. --- .../joinmastodon/android/fragments/HomeTimelineFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 46c162144..e300d1ab5 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTimelineFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTimelineFragment.java @@ -99,7 +99,7 @@ public class HomeTimelineFragment extends FabStatusListFragment { protected void onHidden(){ super.onHidden(); if(!data.isEmpty()){ - String topPostID=displayItems.get(Math.max(0, list.getChildAdapterPosition(list.getChildAt(0))-getMainAdapterOffset())).parentID; + String topPostID=displayItems.get(list.getChildAdapterPosition(list.getChildAt(0))-getMainAdapterOffset()).parentID; if(!topPostID.equals(lastSavedMarkerID)){ lastSavedMarkerID=topPostID; new SaveMarkers(topPostID, null) From e5a6dc33b4152149a9842b07d6a58b11acdcb761 Mon Sep 17 00:00:00 2001 From: Grishka Date: Sun, 22 Jan 2023 02:05:36 +0300 Subject: [PATCH 035/218] Fix #510 --- .../android/ui/displayitems/PhotoStatusDisplayItem.java | 1 + 1 file changed, 1 insertion(+) diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/PhotoStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/PhotoStatusDisplayItem.java index 300077c24..104b02fb6 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/PhotoStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/PhotoStatusDisplayItem.java @@ -66,6 +66,7 @@ public class PhotoStatusDisplayItem extends ImageStatusDisplayItem{ altTextScroller.setVisibility(View.GONE); altTextClose.setVisibility(View.GONE); altTextButton.setVisibility(View.VISIBLE); + altTextButton.setAlpha(1f); if(TextUtils.isEmpty(item.attachment.description)){ altTextWrapper.setVisibility(View.GONE); }else{ From 6e314f0ea5e342cb8270527d70f4181cc3dbff14 Mon Sep 17 00:00:00 2001 From: Grishka Date: Sun, 22 Jan 2023 02:08:55 +0300 Subject: [PATCH 036/218] Fix #509 --- mastodon/src/main/AndroidManifest.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/mastodon/src/main/AndroidManifest.xml b/mastodon/src/main/AndroidManifest.xml index ac32ebde5..9a58cd0c3 100644 --- a/mastodon/src/main/AndroidManifest.xml +++ b/mastodon/src/main/AndroidManifest.xml @@ -12,6 +12,13 @@ + + + + + + + Date: Sat, 21 Jan 2023 20:43:17 -0300 Subject: [PATCH 037/218] rearrange home menus --- .../fragments/AnnouncementsFragment.java | 10 +- .../android/fragments/HomeTabFragment.java | 273 ++++++++++-------- .../android/ui/utils/UiUtils.java | 2 +- mastodon/src/main/res/layout/home_toolbar.xml | 2 + mastodon/src/main/res/menu/home.xml | 53 +++- mastodon/src/main/res/values/ids.xml | 1 + mastodon/src/main/res/values/strings_sk.xml | 2 +- 7 files changed, 200 insertions(+), 143 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/AnnouncementsFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/AnnouncementsFragment.java index 385d3464c..a945bf453 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/AnnouncementsFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/AnnouncementsFragment.java @@ -77,12 +77,7 @@ public class AnnouncementsFragment extends BaseStatusListFragment public void onMarkAsRead(String id) { if (unreadIDs == null) return; unreadIDs.remove(id); - if (unreadIDs.size() == 0) setResult(true, null); - } - - @Override - public void onDestroy() { - super.onDestroy(); + if (unreadIDs.isEmpty()) setResult(true, null); } @Override @@ -101,7 +96,8 @@ public class AnnouncementsFragment extends BaseStatusListFragment List read = result.stream().filter(a -> a.read).collect(toList()); onDataLoaded(unread, true); onDataLoaded(read, false); - unreadIDs = unread.stream().map(a -> a.id).collect(toList()); + if (unread.isEmpty()) setResult(true, null); + else unreadIDs = unread.stream().map(a -> a.id).collect(toList()); } }) .exec(accountID); 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 1059722b5..bed7c797a 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTabFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTabFragment.java @@ -9,6 +9,7 @@ import android.app.Activity; import android.app.Fragment; import android.app.FragmentTransaction; import android.content.Context; +import android.content.res.Configuration; import android.os.Build; import android.os.Bundle; import android.view.LayoutInflater; @@ -49,7 +50,6 @@ import org.joinmastodon.android.ui.SimpleViewHolder; import org.joinmastodon.android.ui.utils.UiUtils; import org.joinmastodon.android.updater.GithubSelfUpdater; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -64,11 +64,10 @@ import me.grishka.appkit.utils.V; public class HomeTabFragment extends MastodonToolbarFragment implements ScrollableToTop, OnBackPressedListener { private static final int ANNOUNCEMENTS_RESULT = 654; - private static final int PINNED_UPDATED_RESULT = 523; private String accountID; - private MenuItem announcements; - // private ImageView toolbarLogo; + private MenuItem announcements, announcementsAction, settings, settingsAction; +// private ImageView toolbarLogo; private Button toolbarShowNewPostsBtn; private boolean newPostsBtnShown; private AnimatorSet currentNewPostsAnim; @@ -86,7 +85,11 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab private Fragment[] fragments; private FrameLayout[] tabViews; private TimelineDefinition[] timelines; - private Map timelinesByMenuItem = new HashMap<>(); + private final Map timelinesByMenuItem = new HashMap<>(); + private SubMenu hashtagsMenu, listsMenu; + private Menu optionsMenu; + private MenuInflater optionsMenuInflater; + private boolean announcementsBadged, settingsBadged; @Override public void onCreate(Bundle savedInstanceState) { @@ -156,15 +159,9 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab switcherPopup = new PopupMenu(getContext(), switcher); switcherPopup.setOnMenuItemClickListener(this::onSwitcherItemSelected); UiUtils.enablePopupMenuIcons(getContext(), switcherPopup); - switcher.setOnClickListener(v->{ - updateSwitcherMenu(); - switcherPopup.show(); - }); - View.OnTouchListener listener = switcherPopup.getDragToOpenListener(); - switcher.setOnTouchListener((v, m)-> { - updateSwitcherMenu(); - return listener.onTouch(v, m); - }); + switcher.setOnClickListener(v->switcherPopup.show()); + switcher.setOnTouchListener(switcherPopup.getDragToOpenListener()); + updateSwitcherMenu(); UiUtils.reduceSwipeSensitivity(pager); pager.setUserInputEnabled(!GlobalUserPreferences.disableSwipe); @@ -192,34 +189,60 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab updateToolbarLogo(); + ViewTreeObserver vto = getToolbar().getViewTreeObserver(); + if (vto.isAlive()) { + vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + Toolbar t = getToolbar(); + if (t == null) return; + int toolbarWidth = t.getWidth(); + if (toolbarWidth == 0) return; + + int toolbarFrameWidth = toolbarFrame.getWidth(); + int padding = toolbarWidth - toolbarFrameWidth; + FrameLayout parent = ((FrameLayout) toolbarShowNewPostsBtn.getParent()); + if (padding == parent.getPaddingStart()) return; + + // toolbar frame goes from screen edge to beginning of right-aligned option buttons. + // centering button by applying the same space on the left + parent.setPaddingRelative(padding, 0, 0, 0); + toolbarShowNewPostsBtn.setMaxWidth(toolbarWidth - padding * 2); + + switcher.setPivotX(V.dp(28)); // padding + half of icon + switcher.setPivotY(switcher.getHeight() / 2f); + } + }); + } + if(GithubSelfUpdater.needSelfUpdating()){ E.register(this); updateUpdateState(GithubSelfUpdater.getInstance().getState()); } + } - new GetLists().setCallback(new Callback<>() { - @Override - public void onSuccess(List lists) { - addItemsToMap(lists, listItems); - } + private void addListsToOptionsMenu() { + Context ctx = getContext(); + listsMenu.clear(); + listsMenu.getItem().setVisible(listItems.size() > 0); + UiUtils.insetPopupMenuIcon(ctx, UiUtils.makeBackItem(listsMenu)); + listItems.forEach((id, list) -> { + MenuItem item = listsMenu.add(Menu.NONE, id, Menu.NONE, list.title); + item.setIcon(R.drawable.ic_fluent_people_list_24_regular); + UiUtils.insetPopupMenuIcon(ctx, item); + }); + } - @Override - public void onError(ErrorResponse error) { - error.showToast(getContext()); - } - }).exec(accountID); - - new GetFollowedHashtags().setCallback(new Callback<>() { - @Override - public void onSuccess(HeaderPaginationList hashtags) { - addItemsToMap(hashtags, hashtagsItems); - } - - @Override - public void onError(ErrorResponse error) { - error.showToast(getContext()); - } - }).exec(accountID); + private void addHashtagsToOptionsMenu() { + Context ctx = getContext(); + hashtagsMenu.clear(); + hashtagsMenu.getItem().setVisible(hashtagsItems.size() > 0); + UiUtils.insetPopupMenuIcon(ctx, UiUtils.makeBackItem(hashtagsMenu)); + hashtagsItems.forEach((id, hashtag) -> { + MenuItem item = hashtagsMenu.add(Menu.NONE, id, Menu.NONE, hashtag.name); + item.setIcon(R.drawable.ic_fluent_number_symbol_24_regular); + UiUtils.insetPopupMenuIcon(ctx, item); + }); } public void updateToolbarLogo(){ @@ -259,43 +282,70 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab toolbarShowNewPostsBtn.setScaleY(.8f); timelineTitle.setVisibility(View.VISIBLE); } + } - ViewTreeObserver vto = toolbar.getViewTreeObserver(); - if (vto.isAlive()) { - vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { - @Override - public void onGlobalLayout() { - Toolbar t = getToolbar(); - if (t == null) return; - int toolbarWidth = t.getWidth(); - if (toolbarWidth == 0) return; - t.getViewTreeObserver().removeOnGlobalLayoutListener(this); + private void createOptionsMenu() { + optionsMenu.clear(); + optionsMenuInflater.inflate(R.menu.home, optionsMenu); + announcements = optionsMenu.findItem(R.id.announcements); + announcementsAction = optionsMenu.findItem(R.id.announcements_action); + settings = optionsMenu.findItem(R.id.settings); + settingsAction = optionsMenu.findItem(R.id.settings_action); + hashtagsMenu = optionsMenu.findItem(R.id.hashtags).getSubMenu(); + listsMenu = optionsMenu.findItem(R.id.lists).getSubMenu(); - int toolbarFrameWidth = toolbarFrame.getWidth(); - int padding = toolbarWidth - toolbarFrameWidth; - // toolbar frame goes from screen edge to beginning of right-aligned option buttons. - // centering button by applying the same space on the left - ((FrameLayout) toolbarShowNewPostsBtn.getParent()).setPaddingRelative(padding, 0, 0, 0); - toolbarShowNewPostsBtn.setMaxWidth(toolbarWidth - padding * 2); + announcements.setVisible(!announcementsBadged); + announcementsAction.setVisible(announcementsBadged); + settings.setVisible(!settingsBadged); + settingsAction.setVisible(settingsBadged); - switcher.setPivotX(V.dp(28)); // padding + half of icon - switcher.setPivotY(switcher.getHeight() / 2f); - } - }); - } + UiUtils.enableOptionsMenuIcons(getContext(), optionsMenu, + R.id.overflow, R.id.announcements_action, R.id.settings_action); + + addListsToOptionsMenu(); + addHashtagsToOptionsMenu(); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater){ - inflater.inflate(R.menu.home, menu); - announcements = menu.findItem(R.id.announcements); + this.optionsMenu = menu; + this.optionsMenuInflater = inflater; + createOptionsMenu(); + + new GetLists().setCallback(new Callback<>() { + @Override + public void onSuccess(List lists) { + updateList(lists, listItems); + addListsToOptionsMenu(); + } + + @Override + public void onError(ErrorResponse error) { + error.showToast(getContext()); + } + }).exec(accountID); + + new GetFollowedHashtags().setCallback(new Callback<>() { + @Override + public void onSuccess(HeaderPaginationList hashtags) { + updateList(hashtags, hashtagsItems); + addHashtagsToOptionsMenu(); + } + + @Override + public void onError(ErrorResponse error) { + error.showToast(getContext()); + } + }).exec(accountID); new GetAnnouncements(false).setCallback(new Callback<>() { @Override public void onSuccess(List result) { - boolean hasUnread = result.stream().anyMatch(a -> !a.read); - announcements.setIcon(hasUnread ? R.drawable.ic_announcements_24_badged : R.drawable.ic_fluent_megaphone_24_regular); - updateBadgedOptionsItem(announcements, hasUnread); + if (result.stream().anyMatch(a -> !a.read)) { + announcementsBadged = true; + announcements.setVisible(false); + announcementsAction.setVisible(true); + } } @Override @@ -303,27 +353,14 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab error.showToast(getActivity()); } }).exec(accountID); - - UiUtils.enableOptionsMenuIcons(getContext(), menu); } - private void updateBadgedOptionsItem(MenuItem item, boolean asAction) { - item.setShowAsAction(asAction ? MenuItem.SHOW_AS_ACTION_ALWAYS : MenuItem.SHOW_AS_ACTION_NEVER); - if (asAction) { - UiUtils.resetPopupItemTint(item); - } else { - UiUtils.insetPopupMenuIcon(getContext(), item); - } - } - - private void addItemsToMap(List addItems, Map items) { + private void updateList(List addItems, Map items) { if (addItems.size() == 0) return; for (int i = 0; i < addItems.size(); i++) items.put(View.generateViewId(), addItems.get(i)); - updateSwitcherMenu(); } private void updateSwitcherMenu() { - Context context = getContext(); Menu switcherMenu = switcherPopup.getMenu(); switcherMenu.clear(); timelinesByMenuItem.clear(); @@ -333,40 +370,16 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab timelinesByMenuItem.put(menuItemId, tl); MenuItem item = switcherMenu.add(0, menuItemId, 0, tl.getTitle(getContext())); item.setIcon(tl.getIcon().iconRes); - UiUtils.insetPopupMenuIcon(getContext(), item); } - if (!listItems.isEmpty()) { - SubMenu listsMenu = switcherMenu.addSubMenu(R.string.sk_list_timelines); - UiUtils.insetPopupMenuIcon(context, listsMenu.getItem().setVisible(true) - .setIcon(R.drawable.ic_fluent_people_list_24_regular)); - listsMenu.clear(); - UiUtils.insetPopupMenuIcon(context, UiUtils.makeBackItem(listsMenu)); - listItems.forEach((id, list) -> { - MenuItem item = listsMenu.add(Menu.NONE, id, Menu.NONE, list.title); - item.setIcon(R.drawable.ic_fluent_people_list_24_regular); - UiUtils.insetPopupMenuIcon(context, item); - }); - } + switcherMenu.add(0, R.id.menu_edit, Menu.NONE, R.string.sk_edit_timelines) + .setIcon(R.drawable.ic_fluent_edit_24_regular); - if (!hashtagsItems.isEmpty()) { - SubMenu hashtagsMenu = switcherMenu.addSubMenu(R.string.sk_hashtags_you_follow); - UiUtils.insetPopupMenuIcon(context, hashtagsMenu.getItem().setVisible(true) - .setIcon(R.drawable.ic_fluent_number_symbol_24_regular)); - hashtagsMenu.clear(); - UiUtils.insetPopupMenuIcon(context, UiUtils.makeBackItem(hashtagsMenu)); - hashtagsItems.forEach((id, hashtag) -> { - MenuItem item = hashtagsMenu.add(Menu.NONE, id, Menu.NONE, hashtag.name); - item.setIcon(R.drawable.ic_fluent_number_symbol_24_regular); - UiUtils.insetPopupMenuIcon(context, item); - }); - } + UiUtils.enablePopupMenuIcons(getContext(), switcherPopup); } private boolean onSwitcherItemSelected(MenuItem item) { int id = item.getItemId(); - ListTimeline list; - Hashtag hashtag; Bundle args = new Bundle(); args.putString("account", accountID); @@ -374,15 +387,8 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab if (id == R.id.menu_back) { switcher.post(() -> switcherPopup.show()); return true; - } else if ((list = listItems.get(id)) != null) { - args.putString("listID", list.id); - args.putString("listTitle", list.title); - args.putInt("repliesPolicy", list.repliesPolicy.ordinal()); - Nav.goForResult(getActivity(), ListTimelineFragment.class, args, PINNED_UPDATED_RESULT, this); - } else if ((hashtag = hashtagsItems.get(id)) != null) { - args.putString("hashtag", hashtag.name); - args.putBoolean("following", hashtag.following); - Nav.goForResult(getActivity(), HashtagTimelineFragment.class, args, PINNED_UPDATED_RESULT, this); + } else if (id == R.id.menu_edit) { + Nav.go(getActivity(), EditTimelinesFragment.class, args); } else { TimelineDefinition tl = timelinesByMenuItem.get(id); if (tl != null) { @@ -415,12 +421,26 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab Bundle args=new Bundle(); args.putString("account", accountID); int id = item.getItemId(); - if (id == R.id.settings) { + ListTimeline list; + Hashtag hashtag; + + if (item.getItemId() == R.id.menu_back) { + createOptionsMenu(); + optionsMenu.performIdentifierAction(R.id.overflow, 0); + return true; + } else if (id == R.id.settings || id == R.id.settings_action) { Nav.go(getActivity(), SettingsFragment.class, args); - } else if (id == R.id.announcements) { + } else if (id == R.id.announcements || id == R.id.announcements_action) { Nav.goForResult(getActivity(), AnnouncementsFragment.class, args, ANNOUNCEMENTS_RESULT, this); - } else if (id == R.id.edit_timelines) { - Nav.go(getActivity(), EditTimelinesFragment.class, args); + } else if ((list = listItems.get(id)) != null) { + args.putString("listID", list.id); + args.putString("listTitle", list.title); + args.putInt("repliesPolicy", list.repliesPolicy.ordinal()); + Nav.go(getActivity(), ListTimelineFragment.class, args); + } else if ((hashtag = hashtagsItems.get(id)) != null) { + args.putString("hashtag", hashtag.name); + args.putBoolean("following", hashtag.following); + Nav.go(getActivity(), HashtagTimelineFragment.class, args); } return true; } @@ -508,19 +528,17 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab @Override public void onFragmentResult(int reqCode, boolean success, Bundle result){ if (reqCode == ANNOUNCEMENTS_RESULT && success) { - announcements.setIcon(R.drawable.ic_fluent_megaphone_24_regular); - announcements.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); - UiUtils.insetPopupMenuIcon(getContext(), announcements); - } else if (reqCode == PINNED_UPDATED_RESULT && result != null && result.getBoolean("pinnedUpdated", false)) { - UiUtils.restartApp(); + announcementsBadged = false; + announcements.setVisible(true); + announcementsAction.setVisible(false); } } private void updateUpdateState(GithubSelfUpdater.UpdateState state){ if(state!=GithubSelfUpdater.UpdateState.NO_UPDATE && state!=GithubSelfUpdater.UpdateState.CHECKING) { - MenuItem settings = getToolbar().getMenu().findItem(R.id.settings); - settings.setIcon(R.drawable.ic_settings_24_badged); - updateBadgedOptionsItem(settings, true); + settingsBadged = true; + settingsAction.setVisible(true); + settings.setVisible(false); } } @@ -546,6 +564,13 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab } } + @Override + protected void onShown() { + super.onShown(); + Object pinnedTimelines = GlobalUserPreferences.pinnedTimelines.get(accountID); + if (pinnedTimelines != null && timelineDefinitions != pinnedTimelines) UiUtils.restartApp(); + } + @Override public void onViewStateRestored(Bundle savedInstanceState) { super.onViewStateRestored(savedInstanceState); diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java b/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java index 14b91e9e4..02248af79 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java @@ -908,7 +908,7 @@ public class UiUtils{ public static MenuItem makeBackItem(Menu m) { MenuItem back = m.add(0, R.id.menu_back, NONE, R.string.back); - back.setIcon(R.drawable.ic_arrow_back); + back.setIcon(R.drawable.ic_fluent_arrow_left_24_regular); return back; } diff --git a/mastodon/src/main/res/layout/home_toolbar.xml b/mastodon/src/main/res/layout/home_toolbar.xml index 8b5af9473..a9d5b2b91 100644 --- a/mastodon/src/main/res/layout/home_toolbar.xml +++ b/mastodon/src/main/res/layout/home_toolbar.xml @@ -47,6 +47,8 @@ android:layout_height="wrap_content" android:paddingVertical="2dp" android:minHeight="32sp" + android:maxLines="2" + android:ellipsize="end" android:lineSpacingMultiplier="0.8" android:textAppearance="@style/m3_title_medium" android:text="@string/see_new_posts" diff --git a/mastodon/src/main/res/menu/home.xml b/mastodon/src/main/res/menu/home.xml index f55f48e12..3ebc28150 100644 --- a/mastodon/src/main/res/menu/home.xml +++ b/mastodon/src/main/res/menu/home.xml @@ -1,15 +1,48 @@ - + + android:id="@+id/announcements_action" + android:icon="@drawable/ic_announcements_24_badged" + android:title="@string/sk_announcements" + android:visible="false" + android:showAsAction="always" /> + android:id="@+id/settings_action" + android:icon="@drawable/ic_settings_24_badged" + android:title="@string/settings" + android:visible="false" + android:showAsAction="always" /> + android:id="@+id/overflow" + android:title="@string/more_options" + android:icon="@drawable/ic_fluent_more_vertical_24_regular" + android:showAsAction="always"> + + + + + + + + + + + \ No newline at end of file diff --git a/mastodon/src/main/res/values/ids.xml b/mastodon/src/main/res/values/ids.xml index 8c3028318..d1dca4b1c 100644 --- a/mastodon/src/main/res/values/ids.xml +++ b/mastodon/src/main/res/values/ids.xml @@ -22,4 +22,5 @@ + \ 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 ef445cee2..db16b5cfe 100644 --- a/mastodon/src/main/res/values/strings_sk.xml +++ b/mastodon/src/main/res/values/strings_sk.xml @@ -169,7 +169,7 @@ Heart Star Edit timeline - Edit timelines + Edit timelines… ALT edited Edited posts From d49733695dad50d42d4155b17ad1af47e838b078 Mon Sep 17 00:00:00 2001 From: sk Date: Sun, 22 Jan 2023 01:06:49 +0100 Subject: [PATCH 038/218] add back file opener closes sk22#328 --- .../android/fragments/ComposeFragment.java | 20 +++++++++++++++---- .../drawable/ic_fluent_attach_24_regular.xml | 3 +++ .../ic_fluent_document_24_regular.xml | 3 +++ .../src/main/res/layout/fragment_compose.xml | 2 +- mastodon/src/main/res/menu/attach.xml | 11 ++++++++++ mastodon/src/main/res/values/strings_sk.xml | 2 ++ 6 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 mastodon/src/main/res/drawable/ic_fluent_attach_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_document_24_regular.xml create mode 100644 mastodon/src/main/res/menu/attach.xml diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java index e00cfc671..883e381bc 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java @@ -175,7 +175,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr private int charCount, charLimit, trimmedCharCount; private Button publishButton, languageButton, scheduleTimeBtn, draftsBtn; - private PopupMenu languagePopup, visibilityPopup, draftOptionsPopup; + private PopupMenu languagePopup, visibilityPopup, draftOptionsPopup, attachPopup; private ImageButton mediaBtn, pollBtn, emojiBtn, spoilerBtn, visibilityBtn, scheduleDraftDismiss; private ImageView sensitiveIcon; private ComposeMediaLayout attachmentsView; @@ -348,7 +348,19 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr sensitiveItem=view.findViewById(R.id.sensitive_item); replyText=view.findViewById(R.id.reply_text); - mediaBtn.setOnClickListener(v->openFilePicker()); + if (isPhotoPickerAvailable()) { + PopupMenu attachPopup = new PopupMenu(getContext(), mediaBtn); + attachPopup.inflate(R.menu.attach); + attachPopup.setOnMenuItemClickListener(i -> { + openFilePicker(i.getItemId() == R.id.media); + return true; + }); + UiUtils.enablePopupMenuIcons(getContext(), attachPopup); + mediaBtn.setOnClickListener(v->attachPopup.show()); + mediaBtn.setOnTouchListener(attachPopup.getDragToOpenListener()); + } else { + mediaBtn.setOnClickListener(v -> openFilePicker(false)); + } pollBtn.setOnClickListener(v->togglePoll()); emojiBtn.setOnClickListener(v->emojiKeyboard.toggleKeyboardPopup(mainEditText)); spoilerBtn.setOnClickListener(v->toggleSpoiler()); @@ -1207,9 +1219,9 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr * *

For earlier versions use the built in docs ui via {@link Intent#ACTION_GET_CONTENT} */ - private void openFilePicker(){ + private void openFilePicker(boolean photoPicker){ Intent intent; - boolean usePhotoPicker = isPhotoPickerAvailable(); + boolean usePhotoPicker = photoPicker && isPhotoPickerAvailable(); if (usePhotoPicker) { intent = new Intent(MediaStore.ACTION_PICK_IMAGES); intent.putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, MediaStore.getPickImagesMaxLimit()); diff --git a/mastodon/src/main/res/drawable/ic_fluent_attach_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_attach_24_regular.xml new file mode 100644 index 000000000..06c6ed284 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_attach_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_document_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_document_24_regular.xml new file mode 100644 index 000000000..8fab94e5e --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_document_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/layout/fragment_compose.xml b/mastodon/src/main/res/layout/fragment_compose.xml index 4ef708752..8e0d0b633 100644 --- a/mastodon/src/main/res/layout/fragment_compose.xml +++ b/mastodon/src/main/res/layout/fragment_compose.xml @@ -331,7 +331,7 @@ android:tintMode="src_in" android:contentDescription="@string/add_media" android:tooltipText="@string/add_media" - android:src="@drawable/ic_fluent_image_24_regular"/> + android:src="@drawable/ic_fluent_attach_24_regular"/> +

+ + + \ 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 db16b5cfe..796586124 100644 --- a/mastodon/src/main/res/values/strings_sk.xml +++ b/mastodon/src/main/res/values/strings_sk.xml @@ -174,4 +174,6 @@ edited Edited posts Edits a reblogged post + Add media + Attach file \ No newline at end of file From 862a23af5d14ec343c67115c382eca035c92d57a Mon Sep 17 00:00:00 2001 From: sk Date: Sun, 22 Jan 2023 02:06:47 +0100 Subject: [PATCH 039/218] add a few icons --- .../android/model/TimelineDefinition.java | 51 +++++++++++++++++++ .../ic_fluent_accessibility_24_regular.xml | 3 ++ .../ic_fluent_animal_cat_24_regular.xml | 3 ++ .../ic_fluent_animal_dog_24_regular.xml | 3 ++ .../ic_fluent_animal_rabbit_24_regular.xml | 3 ++ .../ic_fluent_animal_turtle_24_regular.xml | 3 ++ .../ic_fluent_backpack_24_regular.xml | 3 ++ .../drawable/ic_fluent_balloon_24_regular.xml | 3 ++ .../ic_fluent_book_open_24_regular.xml | 3 ++ .../res/drawable/ic_fluent_bot_24_regular.xml | 3 ++ .../ic_fluent_briefcase_24_regular.xml | 3 ++ .../res/drawable/ic_fluent_bug_24_regular.xml | 3 ++ .../drawable/ic_fluent_city_24_regular.xml | 3 ++ .../drawable/ic_fluent_code_24_regular.xml | 3 ++ .../ic_fluent_drink_coffee_24_regular.xml | 3 ++ .../ic_fluent_emoji_laugh_24_regular.xml | 3 ++ .../drawable/ic_fluent_fire_24_regular.xml | 3 ++ .../ic_fluent_food_pizza_24_regular.xml | 3 ++ .../drawable/ic_fluent_games_24_regular.xml | 3 ++ .../drawable/ic_fluent_gauge_24_regular.xml | 3 ++ .../drawable/ic_fluent_gavel_24_regular.xml | 3 ++ .../ic_fluent_hat_graduation_24_regular.xml | 3 ++ ...luent_headphones_sound_wave_24_regular.xml | 3 ++ .../ic_fluent_heart_pulse_24_regular.xml | 3 ++ .../ic_fluent_important_24_regular.xml | 3 ++ .../ic_fluent_leaf_three_24_regular.xml | 3 ++ .../ic_fluent_lightbulb_24_regular.xml | 3 ++ .../ic_fluent_local_language_24_regular.xml | 3 ++ .../ic_fluent_location_24_regular.xml | 3 ++ .../res/drawable/ic_fluent_map_24_regular.xml | 3 ++ .../ic_fluent_math_formula_24_regular.xml | 3 ++ .../ic_fluent_megaphone_loud_24_regular.xml | 3 ++ .../res/drawable/ic_fluent_mic_24_regular.xml | 3 ++ .../ic_fluent_microscope_24_regular.xml | 3 ++ .../drawable/ic_fluent_midi_24_regular.xml | 3 ++ .../ic_fluent_movies_and_tv_24_regular.xml | 3 ++ .../ic_fluent_music_note_2_24_regular.xml | 3 ++ .../drawable/ic_fluent_news_24_regular.xml | 3 ++ .../res/drawable/ic_fluent_pi_24_regular.xml | 3 ++ .../drawable/ic_fluent_scan_24_regular.xml | 3 ++ .../drawable/ic_fluent_shield_24_regular.xml | 3 ++ .../drawable/ic_fluent_sport_24_regular.xml | 3 ++ .../ic_fluent_stethoscope_24_regular.xml | 3 ++ .../res/drawable/ic_fluent_tag_24_regular.xml | 3 ++ .../ic_fluent_vehicle_bicycle_24_regular.xml | 3 ++ .../ic_fluent_vehicle_subway_24_regular.xml | 3 ++ ...nt_weather_rain_showers_day_24_regular.xml | 3 ++ mastodon/src/main/res/values/strings_sk.xml | 51 +++++++++++++++++++ 48 files changed, 240 insertions(+) create mode 100644 mastodon/src/main/res/drawable/ic_fluent_accessibility_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_animal_cat_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_animal_dog_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_animal_rabbit_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_animal_turtle_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_backpack_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_balloon_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_book_open_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_bot_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_briefcase_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_bug_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_city_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_code_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_drink_coffee_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_emoji_laugh_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_fire_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_food_pizza_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_games_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_gauge_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_gavel_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_hat_graduation_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_headphones_sound_wave_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_heart_pulse_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_important_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_leaf_three_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_lightbulb_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_local_language_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_location_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_map_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_math_formula_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_megaphone_loud_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_mic_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_microscope_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_midi_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_movies_and_tv_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_music_note_2_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_news_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_pi_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_scan_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_shield_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_sport_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_stethoscope_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_tag_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_vehicle_bicycle_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_vehicle_subway_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_weather_rain_showers_day_24_regular.xml diff --git a/mastodon/src/main/java/org/joinmastodon/android/model/TimelineDefinition.java b/mastodon/src/main/java/org/joinmastodon/android/model/TimelineDefinition.java index 4b48934ca..e16c6fb98 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/model/TimelineDefinition.java +++ b/mastodon/src/main/java/org/joinmastodon/android/model/TimelineDefinition.java @@ -165,6 +165,57 @@ public class TimelineDefinition { public enum Icon { HEART(R.drawable.ic_fluent_heart_24_regular, R.string.sk_icon_heart), STAR(R.drawable.ic_fluent_star_24_regular, R.string.sk_icon_star), + PEOPLE(R.drawable.ic_fluent_people_24_regular, R.string.sk_icon_people), + CITY(R.drawable.ic_fluent_city_24_regular, R.string.sk_icon_city), + IMAGE(R.drawable.ic_fluent_image_24_regular, R.string.sk_icon_image), + NEWS(R.drawable.ic_fluent_news_24_regular, R.string.sk_icon_news), + COLOR_PALETTE(R.drawable.ic_fluent_color_24_regular, R.string.sk_icon_color_palette), + CAT(R.drawable.ic_fluent_animal_cat_24_regular, R.string.sk_icon_cat), + DOG(R.drawable.ic_fluent_animal_dog_24_regular, R.string.sk_icon_dog), + RABBIT(R.drawable.ic_fluent_animal_rabbit_24_regular, R.string.sk_icon_rabbit), + TURTLE(R.drawable.ic_fluent_animal_turtle_24_regular, R.string.sk_icon_turtle), + ACADEMIC_CAP(R.drawable.ic_fluent_hat_graduation_24_regular, R.string.sk_icon_academic_cap), + BOT(R.drawable.ic_fluent_bot_24_regular, R.string.sk_icon_bot), + IMPORTANT(R.drawable.ic_fluent_important_24_regular, R.string.sk_icon_important), + SHIELD(R.drawable.ic_fluent_shield_24_regular, R.string.sk_icon_shield), + CHAT(R.drawable.ic_fluent_chat_multiple_24_regular, R.string.sk_icon_chat), + TAG(R.drawable.ic_fluent_tag_24_regular, R.string.sk_icon_tag), + TRAIN(R.drawable.ic_fluent_vehicle_subway_24_regular, R.string.sk_icon_train), + BICYCLE(R.drawable.ic_fluent_vehicle_bicycle_24_regular, R.string.sk_icon_bicycle), + MAP(R.drawable.ic_fluent_map_24_regular, R.string.sk_icon_map), + BACKPACK(R.drawable.ic_fluent_backpack_24_regular, R.string.sk_icon_backpack), + BRIEFCASE(R.drawable.ic_fluent_briefcase_24_regular, R.string.sk_icon_briefcase), + BOOK(R.drawable.ic_fluent_book_open_24_regular, R.string.sk_icon_book), + LANGUAGE(R.drawable.ic_fluent_local_language_24_regular, R.string.sk_icon_language), + WEATHER(R.drawable.ic_fluent_weather_rain_showers_day_24_regular, R.string.sk_icon_weather), + APERTURE(R.drawable.ic_fluent_scan_24_regular, R.string.sk_icon_aperture), + MUSIC(R.drawable.ic_fluent_music_note_2_24_regular, R.string.sk_icon_music), + LOCATION(R.drawable.ic_fluent_location_24_regular, R.string.sk_icon_location), + GLOBE(R.drawable.ic_fluent_globe_24_regular, R.string.sk_icon_globe), + MEGAPHONE(R.drawable.ic_fluent_megaphone_loud_24_regular, R.string.sk_icon_megaphone), + MICROPHONE(R.drawable.ic_fluent_mic_24_regular, R.string.sk_icon_microphone), + MICROSCOPE(R.drawable.ic_fluent_microscope_24_regular, R.string.sk_icon_microscope), + STETHOSCOPE(R.drawable.ic_fluent_stethoscope_24_regular, R.string.sk_icon_stethoscope), + KEYBOARD(R.drawable.ic_fluent_midi_24_regular, R.string.sk_icon_keyboard), + COFFEE(R.drawable.ic_fluent_drink_coffee_24_regular, R.string.sk_icon_coffee), + CLAPPER_BOARD(R.drawable.ic_fluent_movies_and_tv_24_regular, R.string.sk_icon_clapper_board), + LAUGH(R.drawable.ic_fluent_emoji_laugh_24_regular, R.string.sk_icon_laugh), + BALLOON(R.drawable.ic_fluent_balloon_24_regular, R.string.sk_icon_balloon), + PI(R.drawable.ic_fluent_pi_24_regular, R.string.sk_icon_pi), + MATH_FORMULA(R.drawable.ic_fluent_math_formula_24_regular, R.string.sk_icon_math_formula), + GAMES(R.drawable.ic_fluent_games_24_regular, R.string.sk_icon_games), + CODE(R.drawable.ic_fluent_code_24_regular, R.string.sk_icon_code), + BUG(R.drawable.ic_fluent_bug_24_regular, R.string.sk_icon_bug), + LIGHT_BULB(R.drawable.ic_fluent_lightbulb_24_regular, R.string.sk_icon_light_bulb), + FIRE(R.drawable.ic_fluent_fire_24_regular, R.string.sk_icon_fire), + LEAVES(R.drawable.ic_fluent_leaf_three_24_regular, R.string.sk_icon_leaves), + SPORT(R.drawable.ic_fluent_sport_24_regular, R.string.sk_icon_sport), + HEALTH(R.drawable.ic_fluent_heart_pulse_24_regular, R.string.sk_icon_health), + PIZZA(R.drawable.ic_fluent_food_pizza_24_regular, R.string.sk_icon_pizza), + GAVEL(R.drawable.ic_fluent_gavel_24_regular, R.string.sk_icon_gavel), + GAUGE(R.drawable.ic_fluent_gauge_24_regular, R.string.sk_icon_gauge), + HEADPHONES(R.drawable.ic_fluent_headphones_sound_wave_24_regular, R.string.sk_icon_headphones), + HUMAN(R.drawable.ic_fluent_accessibility_24_regular, R.string.sk_icon_human), HOME(R.drawable.ic_fluent_home_24_regular, R.string.sk_timeline_home, true), LOCAL(R.drawable.ic_fluent_people_community_24_regular, R.string.sk_timeline_local, true), diff --git a/mastodon/src/main/res/drawable/ic_fluent_accessibility_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_accessibility_24_regular.xml new file mode 100644 index 000000000..1e0603d2b --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_accessibility_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_animal_cat_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_animal_cat_24_regular.xml new file mode 100644 index 000000000..6203e61ed --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_animal_cat_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_animal_dog_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_animal_dog_24_regular.xml new file mode 100644 index 000000000..53640efe7 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_animal_dog_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_animal_rabbit_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_animal_rabbit_24_regular.xml new file mode 100644 index 000000000..3925a7c2e --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_animal_rabbit_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_animal_turtle_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_animal_turtle_24_regular.xml new file mode 100644 index 000000000..df5c66995 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_animal_turtle_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_backpack_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_backpack_24_regular.xml new file mode 100644 index 000000000..8067b544d --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_backpack_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_balloon_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_balloon_24_regular.xml new file mode 100644 index 000000000..23c61eb37 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_balloon_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_book_open_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_book_open_24_regular.xml new file mode 100644 index 000000000..c6c56d0dc --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_book_open_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_bot_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_bot_24_regular.xml new file mode 100644 index 000000000..7f0d356af --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_bot_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_briefcase_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_briefcase_24_regular.xml new file mode 100644 index 000000000..5edf325a2 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_briefcase_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_bug_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_bug_24_regular.xml new file mode 100644 index 000000000..4511feb89 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_bug_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_city_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_city_24_regular.xml new file mode 100644 index 000000000..d64de55fd --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_city_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_code_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_code_24_regular.xml new file mode 100644 index 000000000..1ffd4232a --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_code_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_drink_coffee_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_drink_coffee_24_regular.xml new file mode 100644 index 000000000..d164b5185 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_drink_coffee_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_emoji_laugh_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_emoji_laugh_24_regular.xml new file mode 100644 index 000000000..58c6c4554 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_emoji_laugh_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_fire_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_fire_24_regular.xml new file mode 100644 index 000000000..4d2868f9f --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_fire_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_food_pizza_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_food_pizza_24_regular.xml new file mode 100644 index 000000000..5f36cf5c2 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_food_pizza_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_games_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_games_24_regular.xml new file mode 100644 index 000000000..b7f9497dd --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_games_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_gauge_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_gauge_24_regular.xml new file mode 100644 index 000000000..8cabd534a --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_gauge_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_gavel_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_gavel_24_regular.xml new file mode 100644 index 000000000..65496b10b --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_gavel_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_hat_graduation_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_hat_graduation_24_regular.xml new file mode 100644 index 000000000..c21171199 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_hat_graduation_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_headphones_sound_wave_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_headphones_sound_wave_24_regular.xml new file mode 100644 index 000000000..b336b7b38 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_headphones_sound_wave_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_heart_pulse_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_heart_pulse_24_regular.xml new file mode 100644 index 000000000..902bcb8a2 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_heart_pulse_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_important_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_important_24_regular.xml new file mode 100644 index 000000000..5a24a2b07 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_important_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_leaf_three_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_leaf_three_24_regular.xml new file mode 100644 index 000000000..72abc07ce --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_leaf_three_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_lightbulb_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_lightbulb_24_regular.xml new file mode 100644 index 000000000..8f6699965 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_lightbulb_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_local_language_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_local_language_24_regular.xml new file mode 100644 index 000000000..6928902ad --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_local_language_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_location_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_location_24_regular.xml new file mode 100644 index 000000000..10af130d0 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_location_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_map_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_map_24_regular.xml new file mode 100644 index 000000000..183efac0a --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_map_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_math_formula_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_math_formula_24_regular.xml new file mode 100644 index 000000000..45aaedb41 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_math_formula_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_megaphone_loud_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_megaphone_loud_24_regular.xml new file mode 100644 index 000000000..83a99f4da --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_megaphone_loud_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_mic_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_mic_24_regular.xml new file mode 100644 index 000000000..720623a9b --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_mic_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_microscope_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_microscope_24_regular.xml new file mode 100644 index 000000000..ffdb9b096 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_microscope_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_midi_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_midi_24_regular.xml new file mode 100644 index 000000000..e2593a7d9 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_midi_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_movies_and_tv_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_movies_and_tv_24_regular.xml new file mode 100644 index 000000000..0cd018717 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_movies_and_tv_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_music_note_2_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_music_note_2_24_regular.xml new file mode 100644 index 000000000..4ced5601b --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_music_note_2_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_news_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_news_24_regular.xml new file mode 100644 index 000000000..bcb6f260b --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_news_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_pi_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_pi_24_regular.xml new file mode 100644 index 000000000..b464e656b --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_pi_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_scan_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_scan_24_regular.xml new file mode 100644 index 000000000..3f94335f9 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_scan_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_shield_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_shield_24_regular.xml new file mode 100644 index 000000000..98ecd4947 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_shield_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_sport_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_sport_24_regular.xml new file mode 100644 index 000000000..72d513fa2 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_sport_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_stethoscope_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_stethoscope_24_regular.xml new file mode 100644 index 000000000..af3311024 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_stethoscope_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_tag_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_tag_24_regular.xml new file mode 100644 index 000000000..e3604263a --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_tag_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_vehicle_bicycle_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_vehicle_bicycle_24_regular.xml new file mode 100644 index 000000000..5327229f9 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_vehicle_bicycle_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_vehicle_subway_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_vehicle_subway_24_regular.xml new file mode 100644 index 000000000..65570be21 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_vehicle_subway_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_weather_rain_showers_day_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_weather_rain_showers_day_24_regular.xml new file mode 100644 index 000000000..2884433fa --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_weather_rain_showers_day_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/values/strings_sk.xml b/mastodon/src/main/res/values/strings_sk.xml index 796586124..5e85608f3 100644 --- a/mastodon/src/main/res/values/strings_sk.xml +++ b/mastodon/src/main/res/values/strings_sk.xml @@ -168,6 +168,57 @@ Icon Heart Star + City + Cat + Dog + Rabbit + Turtle + Balloon + Image + Bot + Language + Location + Megaphone + Microphone + Microscope + Keyboard + Coffee + Laugh + News + Pi + Color palette + Academic cap + Tag + Stethoscope + Weather + Games + Code + Light bulb + Train + Clapper board + Leaves + Sport + Aperture + Music + People + Health + Important + Chat + Shield + Book + Bicycle + Map + Math formula + Backpack + Briefcase + Fire + Bug + Pizza + Gavel + Gauge + Headphones + Human + Globe Edit timeline Edit timelines… ALT From 672ed866309ce6cf4724799c8cf6a31dc207d2ac Mon Sep 17 00:00:00 2001 From: gicorada Date: Sat, 21 Jan 2023 05:55:05 +0000 Subject: [PATCH 040/218] Translated using Weblate (Italian) Currently translated at 100.0% (149 of 149 strings) Translation: Megalodon/values Translate-URL: https://translate.codeberg.org/projects/megalodon/values/it/ --- mastodon/src/main/res/values-it-rIT/strings_sk.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mastodon/src/main/res/values-it-rIT/strings_sk.xml b/mastodon/src/main/res/values-it-rIT/strings_sk.xml index 0d2cb0fb5..9a420e83b 100644 --- a/mastodon/src/main/res/values-it-rIT/strings_sk.xml +++ b/mastodon/src/main/res/values-it-rIT/strings_sk.xml @@ -142,4 +142,10 @@ Home Sei sicuro di volere eliminare questo post in bozza\? I post devono essere programmati almeno tra 10 minuti. + Scrivi qualcosa per iniziare a cercare + Rimuovi come follower + Rimuovi %s come follower bloccandolo e sboccandolo immediatamente\? + Rimuovi + Follower rimosso con successo + Registro delle modifiche \ No newline at end of file From 1b31284a9589ddcb6a64c1446cdc82a6a208f358 Mon Sep 17 00:00:00 2001 From: sheepnik Date: Thu, 19 Jan 2023 17:31:51 -0300 Subject: [PATCH 041/218] Translated using Weblate (Welsh) Currently translated at 100.0% (149 of 149 strings) Translation: Megalodon/values Translate-URL: https://translate.codeberg.org/projects/megalodon/values/cy/ --- .../src/main/res/values-cy/strings_sk.xml | 84 ++++++++++++++++++- 1 file changed, 82 insertions(+), 2 deletions(-) diff --git a/mastodon/src/main/res/values-cy/strings_sk.xml b/mastodon/src/main/res/values-cy/strings_sk.xml index 30986d4a7..f226815d5 100644 --- a/mastodon/src/main/res/values-cy/strings_sk.xml +++ b/mastodon/src/main/res/values-cy/strings_sk.xml @@ -2,12 +2,12 @@ Dileu ac ailddrafftio Dileu ac ailddrafftio\'r neges - Pinio i\'ch proffil + Pinio neges i\'ch proffil Wrthi\'n pinio\'r neges… Dadbinio o\'ch proffil Dadbinio neges o\'ch proffil Wrthi\'n dadbinio\'r neges… - Dangos ymatebion + Dangos atebion Rhestri Datguddio rhybuddion cynnwys bob tro Cyfrannu at Megalodon @@ -68,4 +68,84 @@ Caiff y neges ei chadw fel drafft. Cadw newidiadau\? Cyhoeddiadau + Wedi pinio + Disgrifiad llun + Dangos nifer o ryngweithiadau + Ceisiadau dilyn + Derbyn cais dilyn + Gwrthod cais dilyn + Golygu rhestrau gyda %s + Analluogi testun sgrolio mewn bariau teitl + Dangos ffrwd ffederasiwn + Wedi\'i gyfieithu gyda %s + Cyfarchion o\'r siarc! I ddechrau, rhowch enw eich parth gartrefol isod. + example.social + Creu proffil + Ffurfweddu hidlyddion + Dileu hysbysiad + Dileu hysbysiad + Cyfieithu postiadau agor yn unig + Chwilio yn y Ffedysawd + Dadhybu + Dangos hybiau + Ffederasiwn + Dyma\'r negeseuon diweddaraf gan y pobl yn eich ffederasiwn. + Ydych chi\'n sicr eich bod eisiau clirio eich ieithoedd ddiweddar\? + Ydych chi\'n sicr eich bod eisiau dileu y hysbysiad hwn\? + Hysbysiadau bost ar %s gyfer wedi\'i galluogi + Agor gyda chyfrif arall + Methu dod o hyd i\'r adnodd + Nodi tudalen gyda chyfrif arall + Wedi\'i nodi fel %s + Wrthi\'n chwilio ar %s + Hybu gyda gwelededd + Postio am hyn + Wedi\'i nodi yn barod + Hoffi gyda chyfrif arall + Wedi\'i hoffi fel %s + Wedi\'i hoffi yn barod + Hybu gyda chyfrif arall + Wedi\'i hybu fel %s + Wedi\'i hybu yn barod + Ateb gyda chyfrif arall + Gyrru at %s + Amserlen + Dileu neges amserlenwyd + Ydych chi\'n sicr eich bod eisiau dileu y post amserlenwyd hwn\? + Drafftio neu amserlennu + Wedi\'i amserlennu am + Neges wedi\'i amserlennu + Mae amser a drefnwyd yn rhy agos + Cadw\'r drafft\? + Peidiwch â drafftio + Nodi fel wedi\'i ddarllen + Dangos un hysbysiad yn unig + Creu + Creu rhestr + Enw\'r rhestr + Dangos atebion i + Aelodau\'r rhestr + Defnyddwyr wedi\'u dilyn + Neb + Dileu rhestr + Golygu rhestr + Eich rhestrau + Hysbysiadau bost ar %s gyfer wedi\'i analluogi + Eicon unffurf ar gyfer pob hysbysiad + Lleol + Nodi fel drafft + Amserlennu neges + Am y gweinydd + Ffederasiwn + Tynnu fel dilynwr + Tynnu + Wedi dileu dilynwr yn llwyddiannus + Rhestr newidiadau + Rhaid amserlennu\'r neges o leiaf 10 munud yn y dyfodol. + Amserlennu neu drafftio + Peidiwch ag amserlennu + Lleihau mudiant mewn animeiddiadau + Ydych chi\'n sicr eich bod eisiau dileu\'r rhestr %s\? + Teipiwch rhywbeth i ddechrau chwilio + Tynnu %s fel dilynwr drwy eu rhwystro a\'i ddadrwystro ar unwaith\? \ No newline at end of file From 42dc6b74252aa4f602ddb23b6e960484f2d13fcc Mon Sep 17 00:00:00 2001 From: sheepnik Date: Sat, 21 Jan 2023 12:49:04 +0000 Subject: [PATCH 042/218] Translated using Weblate (Welsh) Currently translated at 15.3% (2 of 13 strings) Translation: Megalodon/metadata Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/cy/ --- metadata/cy/short_description.txt | 1 + metadata/cy/title.txt | 1 + 2 files changed, 2 insertions(+) create mode 100644 metadata/cy/short_description.txt create mode 100644 metadata/cy/title.txt diff --git a/metadata/cy/short_description.txt b/metadata/cy/short_description.txt new file mode 100644 index 000000000..498d9ba87 --- /dev/null +++ b/metadata/cy/short_description.txt @@ -0,0 +1 @@ +Mastodon ar gyfer Android ond mae'n binc ac mae ganddo fwy o nodweddion diff --git a/metadata/cy/title.txt b/metadata/cy/title.txt new file mode 100644 index 000000000..cf946e02c --- /dev/null +++ b/metadata/cy/title.txt @@ -0,0 +1 @@ +Megalodon From 09bf0f2c3c470896d97b8f552ae6f72b4c561ae1 Mon Sep 17 00:00:00 2001 From: florian-obernberger Date: Sat, 21 Jan 2023 20:30:25 -0300 Subject: [PATCH 043/218] Translated using Weblate (German) Currently translated at 91.9% (160 of 174 strings) Translation: Megalodon/values Translate-URL: https://translate.codeberg.org/projects/megalodon/values/de/ --- .../src/main/res/values-de-rDE/strings_sk.xml | 123 ++++-------------- 1 file changed, 24 insertions(+), 99 deletions(-) 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 1c4505e6b..908965022 100644 --- a/mastodon/src/main/res/values-de-rDE/strings_sk.xml +++ b/mastodon/src/main/res/values-de-rDE/strings_sk.xml @@ -4,7 +4,7 @@ Angeheftet Löschen und neu erstellen Beitrag löschen und neu erstellen - Bist du dir sicher, dass du diesen Beitrag löschen und neu erstellen möchtest\? + Bist du dir sicher, dass du diesen Beitrag löschen und neu erstellen möchtest? An Profil anheften Beitrag an Profil anheften Möchtest du den Beitrag an dein Profil anheften? @@ -38,31 +38,29 @@ Laufschrift in Titelleisten deaktivieren Zu Megalodon beitragen Föderierte Timeline anzeigen - Beiträge - Beitrags ​Benachrichtigungen + Beitrags-​Benachrichtigungen Farbschema - System Pink Violett Grün - Blau Braun - Rot Gelb + Beiträge + Blau Mehrfachantworten erlauben Übersetzt mit %s + Sprache: %s + %s (%s) + Sicher, dass du die Liste der zuletzt verwendeten Sprachen leeren willst\? Übersetzen Original anzeigen - Sprache: %s Verfügbare Sprachen - %s (%s) Zuletzt verwendete Sprachen leeren - Sicher, dass du die Liste der zuletzt verwendeten Sprachen leeren willst\? Willkommen! - Der Hai sagt Hi! Um anzufangen, gib den Domain-Namen deiner Heimat-Instanz unten ein. beispiel.social - - Wischen zwischen Tabs deaktivieren + Der Hai sagt Hi! Um anzufangen, gib den Domain-Namen deiner Heimat-Instanz unten ein. + System + Rot Profil einrichten Einstellungen für Beiträge Filter konfigurieren @@ -70,20 +68,20 @@ Regelwerk Über die App Spenden - Benachrichtigung löschen + Wischen zwischen Tabs deaktivieren Benachrichtigung löschen Benachrichtigung wirklich löschen\? - Alle Benachrichtigungen löschen Alle löschen - Wirklich alle Benachrichtigungen löschen\? Löschen von Benachrichtigungen aktivieren Veröffentlichen-Button-Text - Veröffentlichen-Button-Text anpassen Nur geöffnete Beiträge übersetzen + Benachrichtigung löschen + Alle Benachrichtigungen löschen + Veröffentlichen-Button-Text anpassen + Wirklich alle Benachrichtigungen löschen\? %s unterstützt Übersetzung! %s scheint keine Übersetzung zu unterstützen. Suche im Fediverse - Suche auf %s Reblog rückgängig machen Rebloggen mit Sichtbarkeit Drüberkommentieren @@ -91,6 +89,7 @@ Link zum Beitrag kopieren Mit anderem Konto öffnen Ressource nicht gefunden + Suche auf %s Lesezeichen mit anderem Konto Lesezeichen gesetzt als %s Bereits in den Lesezeichen @@ -117,18 +116,16 @@ Beitrag geplant Geplante Zeit ist zu früh Der Beitrag muss mindestens 10 Minuten in der Zukunft eingeplant werden. - Entwurf speichern\? Änderungen speichern\? - Als Entwurf markieren Beitrag planen + Entwurf speichern\? + Als Entwurf markieren Planen oder Vorlage Nicht planen Nicht entwerfen Bewegung in Animationen reduzieren - Ankündigungen Als gelesen markieren Über die Instanz - Nur eine Benachrichtigung anzeigen Erstellen Liste erstellen Name der Liste @@ -137,101 +134,29 @@ gefolgten User_innen niemandem Liste löschen - Liste “%s” wirklich löschen\? Liste bearbeiten Deine Listen + Ankündigungen + Nur eine Benachrichtigung anzeigen + Liste “%s” wirklich löschen\? Start Lokal Föderiert Tippe, um die Suche zu starten - Nicht mehr folgen lassen - %s als Follower_in entfernen\? Die Person wird dabei blockiert und gleich wieder freigegeben. Entfernen Follower_in erfolgreich entfernt Änderungsverlauf - Fehlende Bildbeschreibung + Nicht mehr folgen lassen + %s als Follower_in entfernen\? Die Person wird dabei blockiert und gleich wieder freigegeben. Mindestens ein Anhang hat keine Beschreibung. Trotzdem publizieren - Bildbeschreibungs-Erinnerung deaktivieren - Wenn du Beitrags Benachrichtigungen für jemanden aktiviert hast, erscheinen seine neuen Beiträge hier. - Timelines Beiträge Hinzufügen - Timeline Liste - Hashtag - Timeline anpinnen - Timeline lösen - An Start anpinnen - Von Start lösen Entfernen - Icon Herz Stern - Stadt - Katze - Hund - Hase - Schildkröte - Ballon - Bild - Bot - Sprache - Standort - Megaphon - Mikrophon - Mikroskop - Tastatur - Kaffee - Lachen - Nachrichten - Pi - Farbpalette - Doktorhut - Etikett - Stethoskop - Wetter - Spiele - Code - Leuchtmittel - Zug - Filmklappe - Blätter - Sport - Blende - Musik - Personen - Gesundheit - Wichtig - Unterhaltung - Schild - Buch - Fahrrad - Karte - Formel - Rucksack - Aktenkoffer - Feuer - Käfer - Pizza - Hammer - Gage - Kopfhörer - Mensch - Globus - Pin - Timeline bearbeiten - Timelines bearbeiten - ALT bearbeitet Bearbeitete Beiträge - Bearbeitet einen geteilten Beitrag - Datein anhängen - Suche… - Keine Ergebnisse - Entwurf speichern\? - Möchtest du die Änderungen an diesem Entwurf speichern oder jetzt veröffentlichen\? - Kein Bildbeschreibung verfügbar - Indikator für Bildbeschreibungen - Indikator für fehlende Bildbeschreibungen + Wenn du Beitrags Benachrichtigungen für jemanden aktiviert hast, erscheinen seine neuen Beiträge heir. \ No newline at end of file From b776b0bc1baa84275a91d6f9e047df961c020fc1 Mon Sep 17 00:00:00 2001 From: Choukajohn Date: Sat, 21 Jan 2023 21:44:55 -0300 Subject: [PATCH 044/218] Translated using Weblate (French) Currently translated at 100.0% (174 of 174 strings) Translation: Megalodon/values Translate-URL: https://translate.codeberg.org/projects/megalodon/values/fr/ --- .../src/main/res/values-fr-rFR/strings_sk.xml | 34 +++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) 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 8cd8764eb..76a7343c7 100644 --- a/mastodon/src/main/res/values-fr-rFR/strings_sk.xml +++ b/mastodon/src/main/res/values-fr-rFR/strings_sk.xml @@ -25,7 +25,7 @@ Suivre les demandes Accepter la demande de suivi Refuser la demande de suivi - Modifier les listes avec %s + Listes avec %s Toujours afficher les avertissements de contenu Désactiver le défilement du texte dans les barres de titre Contribuez à Megalodon @@ -77,7 +77,7 @@ Activer la suppression des notifications Personnaliser le texte du bouton Publier Texte du bouton Publier - Masquer le bouton de traduction dans la timeline + Traduire uniquement les messages ouverts %s prend en charge la traduction ! %s ne semble pas prendre en charge la traduction. Voulez-vous vraiment supprimer toutes les notifications \? @@ -144,4 +144,34 @@ Communauté Accueil Tapez quelque chose pour commencer la recherche + Supprimer + Abonné supprimé avec succès + Journal des modifications + Supprimer %s en tant qu\'abonné en le bloquant et en le débloquant immédiatement \? + Supprimer comme abonné + Détacher la timeline + Texte alternatif manquant + Au moins une pièce jointe ne contient pas de description. + Publier quand même + Si vous activez les notifications de message pour certaines personnes, leurs nouveaux messages apparaîtront ici. + Timelines + Messages + Ajouter + Timeline + Liste + Hashtag + Épingler la timeline + Détachée de l\'accueil + Épinglée à l\'accueil + Supprimer + Icône + Cœur + Favoris + Modifier les timelines + ALT + édité + Modifier la timeline + Modifie un article reposté + Désactiver le rappel de texte alternatif + Messages modifiés \ No newline at end of file From 1221a5622f54ec776ff11b5cf2470e72fe0ef095 Mon Sep 17 00:00:00 2001 From: Linerly Date: Sat, 21 Jan 2023 22:29:36 -0300 Subject: [PATCH 045/218] Translated using Weblate (Indonesian) Currently translated at 100.0% (174 of 174 strings) Translation: Megalodon/values Translate-URL: https://translate.codeberg.org/projects/megalodon/values/id/ --- .../src/main/res/values-in-rID/strings_sk.xml | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/mastodon/src/main/res/values-in-rID/strings_sk.xml b/mastodon/src/main/res/values-in-rID/strings_sk.xml index 47304a6e7..805b8d6c8 100644 --- a/mastodon/src/main/res/values-in-rID/strings_sk.xml +++ b/mastodon/src/main/res/values-in-rID/strings_sk.xml @@ -34,7 +34,7 @@ Tidak terdaftar Tandai media sebagai sensitif Permintaan pengikut - Sunting daftar dengan %s + Daftar dengan %s Selalu ungkap peringatan konten Nonaktifkan teks bergulir dalam bilah judul Tampilkan lini masa federasi @@ -146,4 +146,34 @@ Beranda Lokal Ketik sesuatu untuk memulai mencari + Hapus sebagai pengikut + Hapus %s sebagai pengikut dengan memblokir dan membuka blokir secara cepat\? + Hapus + Berhasil penghapus pengikut + Catatan perubahan + Sunting lini masa + Tidak ada teks alternatif + Setidaknya satu lampiran tidak memilki deskripsi. + Terbitkan saja + Nonaktifkan pengingat teks alternatif + Kiriman + Lini masa + Tambahkan + Lini masa + Daftar + Tagar + Sematkan lini masa + Lepaskan sematan lini masa + Disematkan ke beranda + Dilepas sematannya dari beranda + Hapus + Ikon + Hati + Bintang + Sunting lini masa + ALT + disunting + Kiriman tersunting + Menyunting kiriman yang telah dibagikan + Jika Anda mengaktifkan notifikasi kiriman untuk beberapa orang, kiriman baru mereka akan muncul di sini. \ No newline at end of file From 8a0f95affe4ec8e82b6d0cf2c643ef4c6f9167f0 Mon Sep 17 00:00:00 2001 From: ihor_ck Date: Sat, 21 Jan 2023 19:58:07 -0300 Subject: [PATCH 046/218] Translated using Weblate (Ukrainian) Currently translated at 100.0% (174 of 174 strings) Translation: Megalodon/values Translate-URL: https://translate.codeberg.org/projects/megalodon/values/uk/ --- .../src/main/res/values-uk-rUA/strings_sk.xml | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/mastodon/src/main/res/values-uk-rUA/strings_sk.xml b/mastodon/src/main/res/values-uk-rUA/strings_sk.xml index 5fde90341..0430a6b24 100644 --- a/mastodon/src/main/res/values-uk-rUA/strings_sk.xml +++ b/mastodon/src/main/res/values-uk-rUA/strings_sk.xml @@ -41,7 +41,7 @@ Запити на стеження Погодити запит на стеження Відхилити запит на стеження - Редагувати списки з %s + Списки з %s Вимкнути прокручування тексту у рядках заголовка Допомогти у розробці Megalodon Позначити медіа делікатним @@ -143,4 +143,34 @@ Локальна Федерація Введіть щось, щоб почати пошук + Вилучити як підписника + Вилучити %s як підписника заблокувавши й миттєво розблокувавши\? + Вилучити + Підписника успішно вилучено + Журнал змін + Зірка + Альтернативний + змінено + Стрічки + Дописи + Додати + Стрічка + Список + Хештеґ + Вилучити + Піктограма + Серце + Пропущений альтернативний текст + Усе одно опублікувати + Вимкнути нагадування про альтернативний текст + Принаймні одне вкладення не містить опису. + Якщо ви ввімкнули сповіщення про нові дописи для деяких користувачів, їхні нові дописи з\'являтимуться тут. + Закріпити стрічку + Відкріпити стрічку + Прикріплено на головну + Відкріплено з головної + Редагувати стрічку + Редагувати стрічки + Змінені дописи + Зміни й поширені дописи \ No newline at end of file From a6028e06ea957ac28f88b80235b271fa88d3c536 Mon Sep 17 00:00:00 2001 From: sk Date: Sat, 21 Jan 2023 22:06:47 -0300 Subject: [PATCH 047/218] add a few icons --- .../java/org/joinmastodon/android/model/TimelineDefinition.java | 1 + mastodon/src/main/res/values/strings_sk.xml | 1 + 2 files changed, 2 insertions(+) diff --git a/mastodon/src/main/java/org/joinmastodon/android/model/TimelineDefinition.java b/mastodon/src/main/java/org/joinmastodon/android/model/TimelineDefinition.java index e16c6fb98..9e898f070 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/model/TimelineDefinition.java +++ b/mastodon/src/main/java/org/joinmastodon/android/model/TimelineDefinition.java @@ -177,6 +177,7 @@ public class TimelineDefinition { ACADEMIC_CAP(R.drawable.ic_fluent_hat_graduation_24_regular, R.string.sk_icon_academic_cap), BOT(R.drawable.ic_fluent_bot_24_regular, R.string.sk_icon_bot), IMPORTANT(R.drawable.ic_fluent_important_24_regular, R.string.sk_icon_important), + PIN(R.drawable.ic_fluent_pin_24_regular, R.string.sk_icon_pin), SHIELD(R.drawable.ic_fluent_shield_24_regular, R.string.sk_icon_shield), CHAT(R.drawable.ic_fluent_chat_multiple_24_regular, R.string.sk_icon_chat), TAG(R.drawable.ic_fluent_tag_24_regular, R.string.sk_icon_tag), diff --git a/mastodon/src/main/res/values/strings_sk.xml b/mastodon/src/main/res/values/strings_sk.xml index 5e85608f3..22ba90334 100644 --- a/mastodon/src/main/res/values/strings_sk.xml +++ b/mastodon/src/main/res/values/strings_sk.xml @@ -219,6 +219,7 @@ Headphones Human Globe + Pin Edit timeline Edit timelines… ALT From 5fd17778f4cd791708e2db83124d3db8a45ecaa0 Mon Sep 17 00:00:00 2001 From: sk Date: Sun, 22 Jan 2023 03:26:18 +0100 Subject: [PATCH 048/218] remove add media string --- mastodon/src/main/res/menu/attach.xml | 2 +- mastodon/src/main/res/values/strings_sk.xml | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/mastodon/src/main/res/menu/attach.xml b/mastodon/src/main/res/menu/attach.xml index 53920919e..6e3fa27a0 100644 --- a/mastodon/src/main/res/menu/attach.xml +++ b/mastodon/src/main/res/menu/attach.xml @@ -2,7 +2,7 @@ edited Edited posts Edits a reblogged post - Add media Attach file \ No newline at end of file From 12a51eb51f3af20c4514d5bc305e11025885ddac Mon Sep 17 00:00:00 2001 From: sk22 Date: Sun, 22 Jan 2023 02:16:01 +0000 Subject: [PATCH 049/218] Translated using Weblate (German) Currently translated at 99.1% (225 of 227 strings) Translation: Megalodon/values Translate-URL: https://translate.codeberg.org/projects/megalodon/values/de/ --- .../src/main/res/values-de-rDE/strings_sk.xml | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) 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 908965022..39db08985 100644 --- a/mastodon/src/main/res/values-de-rDE/strings_sk.xml +++ b/mastodon/src/main/res/values-de-rDE/strings_sk.xml @@ -159,4 +159,69 @@ bearbeitet Bearbeitete Beiträge Wenn du Beitrags Benachrichtigungen für jemanden aktiviert hast, erscheinen seine neuen Beiträge heir. + Stadt + Buch + Fehlende Bildbeschreibung + Bildbeschreibungs-Erinnerung deaktivieren + ALT + Bearbeitet einen geteilten Beitrag + Timelines + Timeline + Hashtag + Timeline anpinnen + Timeline lösen + An Start anpinnen + Von Start gelöst + Symbol + Timeline bearbeiten + Timelines bearbeiten… + Katze + Hund + Hase + Schildkröte + Ballon + Bild + Bot + Sprache + Standort + Mikrophon + Mikroskop + Keyboard + Kaffee + Lachen + Nachrichten + Pi + Farbpalette + Doktorhut + Etikett + Stethoskop + Wetter + Spiele + Code + Zug + Filmklappe + Blätter + Sport + Blende + Musik + Personen + Gesundheit + Wichtig + Unterhaltung + Schild + Fahrrad + Karte + Formel + Rucksack + Aktenkoffer + Feuer + Käfer + Pizza + Hammer + Gage + Kopfhörer + Mensch + Megaphon + Glühbirne + Globus \ No newline at end of file From 5e27a4347139b94fbe9f951c5528c1092316ccd7 Mon Sep 17 00:00:00 2001 From: sk22 Date: Sun, 22 Jan 2023 13:38:29 +0100 Subject: [PATCH 050/218] Adding a 12 hour option for polls (#346) Co-authored-by: Pleclown closes #346 --- .../android/fragments/ComposeFragment.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java index 883e381bc..9b3cb4050 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java @@ -1659,18 +1659,20 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr menu.getMenu().add(0, 2, 0, getResources().getQuantityString(R.plurals.x_minutes, 30, 30)); menu.getMenu().add(0, 3, 0, getResources().getQuantityString(R.plurals.x_hours, 1, 1)); menu.getMenu().add(0, 4, 0, getResources().getQuantityString(R.plurals.x_hours, 6, 6)); - menu.getMenu().add(0, 5, 0, getResources().getQuantityString(R.plurals.x_days, 1, 1)); - menu.getMenu().add(0, 6, 0, getResources().getQuantityString(R.plurals.x_days, 3, 3)); - menu.getMenu().add(0, 7, 0, getResources().getQuantityString(R.plurals.x_days, 7, 7)); + menu.getMenu().add(0, 5, 0, getResources().getQuantityString(R.plurals.x_hours, 12, 12)); + menu.getMenu().add(0, 6, 0, getResources().getQuantityString(R.plurals.x_days, 1, 1)); + menu.getMenu().add(0, 7, 0, getResources().getQuantityString(R.plurals.x_days, 3, 3)); + menu.getMenu().add(0, 8, 0, getResources().getQuantityString(R.plurals.x_days, 7, 7)); menu.setOnMenuItemClickListener(item->{ pollDuration=switch(item.getItemId()){ case 1 -> 5*60; case 2 -> 30*60; case 3 -> 3600; case 4 -> 6*3600; - case 5 -> 24*3600; - case 6 -> 3*24*3600; - case 7 -> 7*24*3600; + case 5 -> 12*3600; + case 6 -> 24*3600; + case 7 -> 3*24*3600; + case 8 -> 7*24*3600; default -> throw new IllegalStateException("Unexpected value: "+item.getItemId()); }; pollDurationView.setText(getString(R.string.compose_poll_duration, pollDurationStr=item.getTitle().toString())); From aa4a1648af89998f8ac620cf9f693b34a0c165e2 Mon Sep 17 00:00:00 2001 From: sk22 Date: Sun, 22 Jan 2023 17:36:04 +0100 Subject: [PATCH 051/218] Update blocks.tsv --- mastodon/src/main/assets/blocks.tsv | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mastodon/src/main/assets/blocks.tsv b/mastodon/src/main/assets/blocks.tsv index 4eaee7053..ad6a59e93 100644 --- a/mastodon/src/main/assets/blocks.tsv +++ b/mastodon/src/main/assets/blocks.tsv @@ -83,3 +83,7 @@ mirr0r.city underage nnia.space underage ignorelist.com malicious repl.co malicious + +# custom + +pawoo.net csam From 8941c2bc1d8a88dabc00ab67ff9bf711145a8573 Mon Sep 17 00:00:00 2001 From: sk Date: Mon, 23 Jan 2023 10:07:43 +0100 Subject: [PATCH 052/218] fix double-click icon button --- .../joinmastodon/android/fragments/EditTimelinesFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/EditTimelinesFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/EditTimelinesFragment.java index 292fe1e74..98a960b82 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/EditTimelinesFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/EditTimelinesFragment.java @@ -306,7 +306,7 @@ public class EditTimelinesFragment extends BaseRecyclerFragment {}) .show(); - editText.requestFocus(); + btn.requestFocus(); } } From 16c0ff2f0b8f3b29e7b6b1246ef3c1dcc02dc18a Mon Sep 17 00:00:00 2001 From: sk Date: Mon, 23 Jan 2023 10:13:23 +0100 Subject: [PATCH 053/218] fix wrong status bar color closes sk22#363 --- .../joinmastodon/android/fragments/ThreadFragment.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ThreadFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ThreadFragment.java index b4de4d184..8c7933d2e 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ThreadFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ThreadFragment.java @@ -126,4 +126,14 @@ public class ThreadFragment extends StatusListFragment{ public boolean isItemEnabled(String id){ return !id.equals(mainStatus.id); } + + @Override + public boolean wantsLightStatusBar(){ + return !UiUtils.isDarkTheme(); + } + + @Override + public boolean wantsLightNavigationBar(){ + return !UiUtils.isDarkTheme(); + } } From ea4c7dc51d1186cfe4a9b0c3f63af6b57ac9f8f0 Mon Sep 17 00:00:00 2001 From: sk Date: Mon, 23 Jan 2023 10:20:06 +0100 Subject: [PATCH 054/218] probably fix options menu issue closes sk22#360 --- .../org/joinmastodon/android/fragments/HomeTabFragment.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 bed7c797a..c4e55c74f 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTabFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTabFragment.java @@ -316,7 +316,6 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab @Override public void onSuccess(List lists) { updateList(lists, listItems); - addListsToOptionsMenu(); } @Override @@ -329,7 +328,6 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab @Override public void onSuccess(HeaderPaginationList hashtags) { updateList(hashtags, hashtagsItems); - addHashtagsToOptionsMenu(); } @Override @@ -358,6 +356,7 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab private void updateList(List addItems, Map items) { if (addItems.size() == 0) return; for (int i = 0; i < addItems.size(); i++) items.put(View.generateViewId(), addItems.get(i)); + createOptionsMenu(); } private void updateSwitcherMenu() { From 446a2f8206e526fc6980a2f4c1952d8e624c45f7 Mon Sep 17 00:00:00 2001 From: sk Date: Mon, 23 Jan 2023 10:21:19 +0100 Subject: [PATCH 055/218] clean up code --- .../android/fragments/HomeTabFragment.java | 39 +++++++------------ 1 file changed, 15 insertions(+), 24 deletions(-) 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 c4e55c74f..c442d76c8 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTabFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTabFragment.java @@ -9,7 +9,6 @@ import android.app.Activity; import android.app.Fragment; import android.app.FragmentTransaction; import android.content.Context; -import android.content.res.Configuration; import android.os.Build; import android.os.Bundle; import android.view.LayoutInflater; @@ -191,27 +190,24 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab ViewTreeObserver vto = getToolbar().getViewTreeObserver(); if (vto.isAlive()) { - vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { - @Override - public void onGlobalLayout() { - Toolbar t = getToolbar(); - if (t == null) return; - int toolbarWidth = t.getWidth(); - if (toolbarWidth == 0) return; + vto.addOnGlobalLayoutListener(() -> { + Toolbar t = getToolbar(); + if (t == null) return; + int toolbarWidth = t.getWidth(); + if (toolbarWidth == 0) return; - int toolbarFrameWidth = toolbarFrame.getWidth(); - int padding = toolbarWidth - toolbarFrameWidth; - FrameLayout parent = ((FrameLayout) toolbarShowNewPostsBtn.getParent()); - if (padding == parent.getPaddingStart()) return; + int toolbarFrameWidth = toolbarFrame.getWidth(); + int padding = toolbarWidth - toolbarFrameWidth; + FrameLayout parent = ((FrameLayout) toolbarShowNewPostsBtn.getParent()); + if (padding == parent.getPaddingStart()) return; - // toolbar frame goes from screen edge to beginning of right-aligned option buttons. - // centering button by applying the same space on the left - parent.setPaddingRelative(padding, 0, 0, 0); - toolbarShowNewPostsBtn.setMaxWidth(toolbarWidth - padding * 2); + // toolbar frame goes from screen edge to beginning of right-aligned option buttons. + // centering button by applying the same space on the left + parent.setPaddingRelative(padding, 0, 0, 0); + toolbarShowNewPostsBtn.setMaxWidth(toolbarWidth - padding * 2); - switcher.setPivotX(V.dp(28)); // padding + half of icon - switcher.setPivotY(switcher.getHeight() / 2f); - } + switcher.setPivotX(V.dp(28)); // padding + half of icon + switcher.setPivotY(switcher.getHeight() / 2f); }); } @@ -257,11 +253,6 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab updateSwitcherIcon(pager.getCurrentItem()); -// toolbarLogo=new ImageView(getActivity()); -// toolbarLogo.setScaleType(ImageView.ScaleType.CENTER); -// toolbarLogo.setImageResource(R.drawable.logo); -// toolbarLogo.setImageTintList(ColorStateList.valueOf(UiUtils.getThemeColor(getActivity(), android.R.attr.textColorPrimary))); - toolbarShowNewPostsBtn=toolbarFrame.findViewById(R.id.show_new_posts_btn); toolbarShowNewPostsBtn.setCompoundDrawableTintList(toolbarShowNewPostsBtn.getTextColors()); if(Build.VERSION.SDK_INT Date: Mon, 23 Jan 2023 10:25:14 +0100 Subject: [PATCH 056/218] move edit timelines option --- .../android/fragments/HomeTabFragment.java | 24 +++++++++---------- mastodon/src/main/res/menu/home.xml | 4 ++++ .../src/main/res/values-de-rDE/strings_sk.xml | 2 +- mastodon/src/main/res/values/ids.xml | 1 - mastodon/src/main/res/values/strings_sk.xml | 2 +- 5 files changed, 17 insertions(+), 16 deletions(-) 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 c442d76c8..ad870fd8b 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTabFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTabFragment.java @@ -362,9 +362,6 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab item.setIcon(tl.getIcon().iconRes); } - switcherMenu.add(0, R.id.menu_edit, Menu.NONE, R.string.sk_edit_timelines) - .setIcon(R.drawable.ic_fluent_edit_24_regular); - UiUtils.enablePopupMenuIcons(getContext(), switcherPopup); } @@ -377,19 +374,18 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab if (id == R.id.menu_back) { switcher.post(() -> switcherPopup.show()); return true; - } else if (id == R.id.menu_edit) { - Nav.go(getActivity(), EditTimelinesFragment.class, args); - } else { - TimelineDefinition tl = timelinesByMenuItem.get(id); - if (tl != null) { - for (int i = 0; i < timelines.length; i++) { - if (timelines[i] == tl) { - navigateTo(i); - return true; - } + } + + TimelineDefinition tl = timelinesByMenuItem.get(id); + if (tl != null) { + for (int i = 0; i < timelines.length; i++) { + if (timelines[i] == tl) { + navigateTo(i); + return true; } } } + return false; } private void navigateTo(int i) { @@ -422,6 +418,8 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab Nav.go(getActivity(), SettingsFragment.class, args); } else if (id == R.id.announcements || id == R.id.announcements_action) { Nav.goForResult(getActivity(), AnnouncementsFragment.class, args, ANNOUNCEMENTS_RESULT, this); + } else if (id == R.id.edit_timelines) { + Nav.go(getActivity(), EditTimelinesFragment.class, args); } else if ((list = listItems.get(id)) != null) { args.putString("listID", list.id); args.putString("listTitle", list.title); diff --git a/mastodon/src/main/res/menu/home.xml b/mastodon/src/main/res/menu/home.xml index 3ebc28150..d0c5d65c1 100644 --- a/mastodon/src/main/res/menu/home.xml +++ b/mastodon/src/main/res/menu/home.xml @@ -29,6 +29,10 @@ android:id="@+id/announcements" android:icon="@drawable/ic_fluent_megaphone_24_regular" android:title="@string/sk_announcements" /> + Von Start gelöst Symbol Timeline bearbeiten - Timelines bearbeiten… + Timelines bearbeiten Katze Hund Hase diff --git a/mastodon/src/main/res/values/ids.xml b/mastodon/src/main/res/values/ids.xml index d1dca4b1c..8c3028318 100644 --- a/mastodon/src/main/res/values/ids.xml +++ b/mastodon/src/main/res/values/ids.xml @@ -22,5 +22,4 @@ - \ 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 a6d3a04d9..aa8bdb1ad 100644 --- a/mastodon/src/main/res/values/strings_sk.xml +++ b/mastodon/src/main/res/values/strings_sk.xml @@ -221,7 +221,7 @@ Globe Pin Edit timeline - Edit timelines… + Edit timelines ALT edited Edited posts From 5c8c888024ab1607b8af5ff9ca75fd3bd4e2dbc6 Mon Sep 17 00:00:00 2001 From: sk Date: Mon, 23 Jan 2023 06:51:24 -0300 Subject: [PATCH 057/218] fix akkoma crash on list edit closes sk22#352 --- .../android/fragments/HomeTabFragment.java | 2 +- .../fragments/ListTimelineFragment.java | 59 ++- .../fragments/ListTimelinesFragment.java | 375 +++++++++--------- .../android/model/ListTimeline.java | 4 +- .../android/ui/views/ListTimelineEditor.java | 9 +- 5 files changed, 221 insertions(+), 228 deletions(-) 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 ad870fd8b..957b8b534 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTabFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTabFragment.java @@ -423,7 +423,7 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab } else if ((list = listItems.get(id)) != null) { args.putString("listID", list.id); args.putString("listTitle", list.title); - args.putInt("repliesPolicy", list.repliesPolicy.ordinal()); + if (list.repliesPolicy != null) args.putInt("repliesPolicy", list.repliesPolicy.ordinal()); Nav.go(getActivity(), ListTimelineFragment.class, args); } else if ((hashtag = hashtagsItems.get(id)) != null) { args.putString("hashtag", hashtag.name); 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 156123e02..99cfa4021 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ListTimelineFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ListTimelineFragment.java @@ -2,16 +2,15 @@ package org.joinmastodon.android.fragments; import android.app.Activity; import android.os.Bundle; -import android.view.HapticFeedbackConstants; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ImageButton; -import android.widget.Toast; -import org.joinmastodon.android.GlobalUserPreferences; +import androidx.annotation.Nullable; + import org.joinmastodon.android.R; import org.joinmastodon.android.api.requests.lists.GetList; import org.joinmastodon.android.api.requests.lists.UpdateList; @@ -23,7 +22,6 @@ import org.joinmastodon.android.ui.M3AlertDialogBuilder; import org.joinmastodon.android.ui.utils.UiUtils; import org.joinmastodon.android.ui.views.ListTimelineEditor; -import java.util.ArrayList; import java.util.List; import me.grishka.appkit.Nav; @@ -36,9 +34,9 @@ import me.grishka.appkit.utils.V; public class ListTimelineFragment extends PinnableStatusListFragment { private String listID; private String listTitle; + @Nullable private ListTimeline.RepliesPolicy repliesPolicy; private ImageButton fab; - private Bundle resultArgs = new Bundle(); public ListTimelineFragment() { setListLayoutId(R.layout.recycler_fragment_with_fab); @@ -51,7 +49,6 @@ public class ListTimelineFragment extends PinnableStatusListFragment { listID = args.getString("listID"); listTitle = args.getString("listTitle"); repliesPolicy = ListTimeline.RepliesPolicy.values()[args.getInt("repliesPolicy", 0)]; - resultArgs.putString("listID", listID); setTitle(listTitle); setHasOptionsMenu(true); @@ -61,7 +58,9 @@ public class ListTimelineFragment extends PinnableStatusListFragment { public void onSuccess(ListTimeline listTimeline) { // TODO: save updated info if (!listTimeline.title.equals(listTitle)) setTitle(listTimeline.title); - if (!listTimeline.repliesPolicy.equals(repliesPolicy)) repliesPolicy = listTimeline.repliesPolicy; + if (listTimeline.repliesPolicy != null && !listTimeline.repliesPolicy.equals(repliesPolicy)) { + repliesPolicy = listTimeline.repliesPolicy; + } } @Override @@ -88,41 +87,39 @@ public class ListTimelineFragment extends PinnableStatusListFragment { .setTitle(R.string.sk_edit_list_title) .setIcon(R.drawable.ic_fluent_people_list_28_regular) .setView(editor) - .setPositiveButton(R.string.save, (d, which) -> { - new UpdateList(listID, editor.getTitle(), editor.getRepliesPolicy()).setCallback(new Callback<>() { - @Override - public void onSuccess(ListTimeline list) { - setTitle(list.title); - listTitle = list.title; - repliesPolicy = list.repliesPolicy; - resultArgs.putString("listTitle", listTitle); - resultArgs.putInt("repliesPolicy", repliesPolicy.ordinal()); - setResult(true, resultArgs); - } + .setPositiveButton(R.string.save, (d, which) -> + new UpdateList(listID, editor.getTitle(), editor.getRepliesPolicy()).setCallback(new Callback<>() { + @Override + public void onSuccess(ListTimeline list) { + setTitle(list.title); + listTitle = list.title; + repliesPolicy = list.repliesPolicy; + Bundle result = new Bundle(); + result.putString("listID", listID); + result.putString("listTitle", listTitle); + if (repliesPolicy != null) result.putInt("repliesPolicy", repliesPolicy.ordinal()); + setResult(true, result); + } - @Override - public void onError(ErrorResponse error) { - error.showToast(getContext()); - } - }).exec(accountID); - }) + @Override + public void onError(ErrorResponse error) { + error.showToast(getContext()); + } + }).exec(accountID)) .setNegativeButton(R.string.cancel, (d, which) -> {}) .show(); } else if (item.getItemId() == R.id.delete) { UiUtils.confirmDeleteList(getActivity(), accountID, listID, listTitle, () -> { - resultArgs.putBoolean("deleted", true); - setResult(true, resultArgs); + Bundle result = new Bundle(); + result.putBoolean("deleted", true); + result.putString("listID", listID); + setResult(true, result); Nav.finish(this); }); } return true; } - @Override - public Bundle getResultArgs() { - return resultArgs; - } - @Override protected TimelineDefinition makeTimelineDefinition() { return TimelineDefinition.ofList(listID, listTitle); diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ListTimelinesFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ListTimelinesFragment.java index 4eb83b807..221d46304 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ListTimelinesFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ListTimelinesFragment.java @@ -21,7 +21,6 @@ import org.joinmastodon.android.api.requests.lists.RemoveAccountsFromList; import org.joinmastodon.android.model.ListTimeline; import org.joinmastodon.android.ui.DividerItemDecoration; import org.joinmastodon.android.ui.M3AlertDialogBuilder; -import org.joinmastodon.android.ui.utils.UiUtils; import org.joinmastodon.android.ui.views.ListTimelineEditor; import java.util.ArrayList; @@ -38,218 +37,210 @@ import me.grishka.appkit.utils.BindableViewHolder; import me.grishka.appkit.views.UsableRecyclerView; public class ListTimelinesFragment extends BaseRecyclerFragment implements ScrollableToTop { - private static final int LIST_CHANGED_RESULT = 987; + private static final int LIST_CHANGED_RESULT = 987; - private String accountId; - private String profileAccountId; - private String profileDisplayUsername; - private HashMap userInListBefore = new HashMap<>(); - private HashMap userInList = new HashMap<>(); - private int inProgress = 0; - private ListsAdapter adapter; - private boolean pinnedUpdated; + private String accountId; + private String profileAccountId; + private final HashMap userInListBefore = new HashMap<>(); + private final HashMap userInList = new HashMap<>(); + private ListsAdapter adapter; - public ListTimelinesFragment() { - super(10); - } + public ListTimelinesFragment() { + super(10); + } - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - Bundle args=getArguments(); - accountId=args.getString("account"); - setHasOptionsMenu(true); + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + Bundle args=getArguments(); + accountId=args.getString("account"); + setHasOptionsMenu(true); - if(args.containsKey("profileAccount")){ - profileAccountId=args.getString("profileAccount"); - profileDisplayUsername=args.getString("profileDisplayUsername"); - setTitle(getString(R.string.sk_lists_with_user, profileDisplayUsername)); - } else { - setTitle(R.string.sk_your_lists); - } - } + if(args.containsKey("profileAccount")){ + profileAccountId=args.getString("profileAccount"); + String profileDisplayUsername = args.getString("profileDisplayUsername"); + setTitle(getString(R.string.sk_lists_with_user, profileDisplayUsername)); + } else { + setTitle(R.string.sk_your_lists); + } + } - @Override - protected void onShown(){ - super.onShown(); - if(!getArguments().getBoolean("noAutoLoad") && !loaded && !dataLoading) - loadData(); - } + @Override + protected void onShown(){ + super.onShown(); + if(!getArguments().getBoolean("noAutoLoad") && !loaded && !dataLoading) + loadData(); + } - @Override - public void onDestroy() { - super.onDestroy(); - if (pinnedUpdated) UiUtils.restartApp(); - } + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + list.addItemDecoration(new DividerItemDecoration(getActivity(), R.attr.colorPollVoted, 0.5f, 56, 16)); + } - @Override - public void onViewCreated(View view, Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - list.addItemDecoration(new DividerItemDecoration(getActivity(), R.attr.colorPollVoted, 0.5f, 56, 16)); - } + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + inflater.inflate(R.menu.menu_list, menu); + } - @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - inflater.inflate(R.menu.menu_list, menu); - } + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == R.id.create) { + ListTimelineEditor editor = new ListTimelineEditor(getContext()); + new M3AlertDialogBuilder(getActivity()) + .setTitle(R.string.sk_create_list_title) + .setIcon(R.drawable.ic_fluent_people_add_28_regular) + .setView(editor) + .setPositiveButton(R.string.sk_create, (d, which) -> + new CreateList(editor.getTitle(), editor.getRepliesPolicy()).setCallback(new Callback<>() { + @Override + public void onSuccess(ListTimeline list) { + saveListMembership(list.id, true); + data.add(0, list); + adapter.notifyItemRangeInserted(0, 1); + } - @Override - public boolean onOptionsItemSelected(MenuItem item) { - if (item.getItemId() == R.id.create) { - ListTimelineEditor editor = new ListTimelineEditor(getContext()); - new M3AlertDialogBuilder(getActivity()) - .setTitle(R.string.sk_create_list_title) - .setIcon(R.drawable.ic_fluent_people_add_28_regular) - .setView(editor) - .setPositiveButton(R.string.sk_create, (d, which) -> { - new CreateList(editor.getTitle(), editor.getRepliesPolicy()).setCallback(new Callback<>() { - @Override - public void onSuccess(ListTimeline list) { - saveListMembership(list.id, true); - data.add(0, list); - adapter.notifyItemRangeInserted(0, 1); - } + @Override + public void onError(ErrorResponse error) { + error.showToast(getContext()); + } + }).exec(accountId) + ) + .setNegativeButton(R.string.cancel, (d, which) -> {}) + .show(); + } + return true; + } - @Override - public void onError(ErrorResponse error) { - error.showToast(getContext()); - } - }).exec(accountId); - }) - .setNegativeButton(R.string.cancel, (d, which) -> {}) - .show(); - } - return true; - } + private void saveListMembership(String listId, boolean isMember) { + userInList.put(listId, isMember); + List accountIdList = Collections.singletonList(profileAccountId); + MastodonAPIRequest req = isMember ? new AddAccountsToList(listId, accountIdList) : new RemoveAccountsFromList(listId, accountIdList); + req.setCallback(new SimpleCallback<>(this) { + @Override + public void onSuccess(Object o) {} + }).exec(accountId); + } - private void saveListMembership(String listId, boolean isMember) { - userInList.put(listId, isMember); - List accountIdList = Collections.singletonList(profileAccountId); - MastodonAPIRequest req = isMember ? new AddAccountsToList(listId, accountIdList) : new RemoveAccountsFromList(listId, accountIdList); - req.setCallback(new SimpleCallback<>(this) { - @Override - public void onSuccess(Object o) {} - }).exec(accountId); - } + @Override + protected void doLoadData(int offset, int count){ + userInListBefore.clear(); + userInList.clear(); + currentRequest=(profileAccountId != null ? new GetLists(profileAccountId) : new GetLists()) + .setCallback(new SimpleCallback<>(this) { + @Override + public void onSuccess(List lists) { + for (ListTimeline l : lists) userInListBefore.put(l.id, true); + userInList.putAll(userInListBefore); + if (profileAccountId == null || !lists.isEmpty()) onDataLoaded(lists, false); + if (profileAccountId == null) return; - @Override - protected void doLoadData(int offset, int count){ - userInListBefore.clear(); - userInList.clear(); - currentRequest=(profileAccountId != null ? new GetLists(profileAccountId) : new GetLists()) - .setCallback(new SimpleCallback<>(this) { - @Override - public void onSuccess(List lists) { - for (ListTimeline l : lists) userInListBefore.put(l.id, true); - userInList.putAll(userInListBefore); - if (profileAccountId == null || !lists.isEmpty()) onDataLoaded(lists, false); - if (profileAccountId == null) return; + currentRequest=new GetLists().setCallback(new SimpleCallback<>(ListTimelinesFragment.this) { + @Override + public void onSuccess(List allLists) { + List newLists = new ArrayList<>(); + for (ListTimeline l : allLists) { + if (lists.stream().noneMatch(e -> e.id.equals(l.id))) newLists.add(l); + if (!userInListBefore.containsKey(l.id)) { + userInListBefore.put(l.id, false); + } + } + userInList.putAll(userInListBefore); + onDataLoaded(newLists, false); + } + }).exec(accountId); + } + }) + .exec(accountId); + } - currentRequest=new GetLists().setCallback(new SimpleCallback<>(ListTimelinesFragment.this) { - @Override - public void onSuccess(List allLists) { - List newLists = new ArrayList<>(); - for (ListTimeline l : allLists) { - if (lists.stream().noneMatch(e -> e.id.equals(l.id))) newLists.add(l); - if (!userInListBefore.containsKey(l.id)) { - userInListBefore.put(l.id, false); - } - } - userInList.putAll(userInListBefore); - onDataLoaded(newLists, false); - } - }).exec(accountId); - } - }) - .exec(accountId); - } + @Override + public void onFragmentResult(int reqCode, boolean listChanged, Bundle result){ + if (reqCode == LIST_CHANGED_RESULT && listChanged) { + String listID = result.getString("listID"); + for (int i = 0; i < data.size(); i++) { + ListTimeline item = data.get(i); + if (item.id.equals(listID)) { + if (result.getBoolean("deleted")) { + data.remove(i); + adapter.notifyItemRemoved(i); + } else { + item.title = result.getString("listTitle", item.title); + if (result.containsKey("repliesPolicy")) { + item.repliesPolicy = ListTimeline.RepliesPolicy.values()[result.getInt("repliesPolicy")]; + } + adapter.notifyItemChanged(i); + } + break; + } + } + } + } - @Override - public void onFragmentResult(int reqCode, boolean listChanged, Bundle result){ - if (reqCode == LIST_CHANGED_RESULT && listChanged) { - if (result.getBoolean("pinnedUpdated")) pinnedUpdated = true; - String listID = result.getString("listID"); - for (int i = 0; i < data.size(); i++) { - ListTimeline item = data.get(i); - if (item.id.equals(listID)) { - if (result.getBoolean("deleted")) { - data.remove(i); - adapter.notifyItemRemoved(i); - } else { - item.title = result.getString("listTitle", item.title); - item.repliesPolicy = ListTimeline.RepliesPolicy.values()[result.getInt("repliesPolicy")]; - adapter.notifyItemChanged(i); - } - break; - } - } - } - } + @Override + protected RecyclerView.Adapter getAdapter() { + return adapter = new ListsAdapter(); + } - @Override - protected RecyclerView.Adapter getAdapter() { - return adapter = new ListsAdapter(); - } + @Override + public void scrollToTop() { + smoothScrollRecyclerViewToTop(list); + } - @Override - public void scrollToTop() { - smoothScrollRecyclerViewToTop(list); - } + private class ListsAdapter extends RecyclerView.Adapter{ + @NonNull + @Override + public ListViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){ + return new ListViewHolder(); + } - private class ListsAdapter extends RecyclerView.Adapter{ - @NonNull - @Override - public ListViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){ - return new ListViewHolder(); - } + @Override + public void onBindViewHolder(@NonNull ListViewHolder holder, int position) { + holder.bind(data.get(position)); + } - @Override - public void onBindViewHolder(@NonNull ListViewHolder holder, int position) { - holder.bind(data.get(position)); - } + @Override + public int getItemCount() { + return data.size(); + } + } - @Override - public int getItemCount() { - return data.size(); - } - } + private class ListViewHolder extends BindableViewHolder implements UsableRecyclerView.Clickable{ + private final TextView title; + private final CheckBox listToggle; - private class ListViewHolder extends BindableViewHolder implements UsableRecyclerView.Clickable{ - private final TextView title; - private final CheckBox listToggle; + public ListViewHolder(){ + super(getActivity(), R.layout.item_text, list); + title=findViewById(R.id.title); + listToggle=findViewById(R.id.list_toggle); + } - public ListViewHolder(){ - super(getActivity(), R.layout.item_text, list); - title=findViewById(R.id.title); - listToggle=findViewById(R.id.list_toggle); - } + @Override + public void onBind(ListTimeline item) { + title.setText(item.title); + title.setCompoundDrawablesRelativeWithIntrinsicBounds(itemView.getContext().getDrawable(R.drawable.ic_fluent_people_list_24_regular), null, null, null); + if (profileAccountId != null) { + Boolean checked = userInList.get(item.id); + listToggle.setVisibility(View.VISIBLE); + listToggle.setChecked(userInList.containsKey(item.id) && checked != null && checked); + listToggle.setOnClickListener(this::onClickToggle); + } else { + listToggle.setVisibility(View.GONE); + } + } - @Override - public void onBind(ListTimeline item) { - title.setText(item.title); - title.setCompoundDrawablesRelativeWithIntrinsicBounds(itemView.getContext().getDrawable(R.drawable.ic_fluent_people_list_24_regular), null, null, null); - if (profileAccountId != null) { - Boolean checked = userInList.get(item.id); - listToggle.setVisibility(View.VISIBLE); - listToggle.setChecked(userInList.containsKey(item.id) && checked != null && checked); - listToggle.setOnClickListener(this::onClickToggle); - } else { - listToggle.setVisibility(View.GONE); - } - } + private void onClickToggle(View view) { + saveListMembership(item.id, listToggle.isChecked()); + } - private void onClickToggle(View view) { - saveListMembership(item.id, listToggle.isChecked()); - } - - @Override - public void onClick() { - Bundle args=new Bundle(); - args.putString("account", accountId); - args.putString("listID", item.id); - args.putString("listTitle", item.title); - args.putInt("repliesPolicy", item.repliesPolicy.ordinal()); - Nav.goForResult(getActivity(), ListTimelineFragment.class, args, LIST_CHANGED_RESULT, ListTimelinesFragment.this); - } - } + @Override + public void onClick() { + Bundle args=new Bundle(); + args.putString("account", accountId); + args.putString("listID", item.id); + args.putString("listTitle", item.title); + if (item.repliesPolicy != null) args.putInt("repliesPolicy", item.repliesPolicy.ordinal()); + Nav.goForResult(getActivity(), ListTimelineFragment.class, args, LIST_CHANGED_RESULT, ListTimelinesFragment.this); + } + } } diff --git a/mastodon/src/main/java/org/joinmastodon/android/model/ListTimeline.java b/mastodon/src/main/java/org/joinmastodon/android/model/ListTimeline.java index df0d54263..9344756da 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/model/ListTimeline.java +++ b/mastodon/src/main/java/org/joinmastodon/android/model/ListTimeline.java @@ -1,5 +1,7 @@ package org.joinmastodon.android.model; +import androidx.annotation.NonNull; + import com.google.gson.annotations.SerializedName; import org.joinmastodon.android.api.RequiredField; @@ -11,9 +13,9 @@ public class ListTimeline extends BaseModel { public String id; @RequiredField public String title; - @RequiredField public RepliesPolicy repliesPolicy; + @NonNull @Override public String toString() { return "List{" + diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/views/ListTimelineEditor.java b/mastodon/src/main/java/org/joinmastodon/android/ui/views/ListTimelineEditor.java index d1f2fbf06..e4438199e 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/views/ListTimelineEditor.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/views/ListTimelineEditor.java @@ -10,6 +10,9 @@ import android.widget.Button; import android.widget.LinearLayout; import android.widget.PopupMenu; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + import org.joinmastodon.android.R; import org.joinmastodon.android.model.ListTimeline; @@ -37,9 +40,9 @@ public class ListTimelineEditor extends LinearLayout { setRepliesPolicy(ListTimeline.RepliesPolicy.LIST); } - public void applyList(String title, ListTimeline.RepliesPolicy policy) { + public void applyList(String title, @Nullable ListTimeline.RepliesPolicy policy) { input.getEditText().setText(title); - setRepliesPolicy(policy); + if (policy != null) setRepliesPolicy(policy); } public String getTitle() { @@ -50,7 +53,7 @@ public class ListTimelineEditor extends LinearLayout { return policy; } - public void setRepliesPolicy(ListTimeline.RepliesPolicy policy) { + public void setRepliesPolicy(@NonNull ListTimeline.RepliesPolicy policy) { this.policy = policy; switch (policy) { case FOLLOWED -> button.setText(R.string.sk_list_replies_policy_followed); From 5280ba1930432c18abcec0697f7896f4776bbb2a Mon Sep 17 00:00:00 2001 From: sk Date: Mon, 23 Jan 2023 11:43:19 +0100 Subject: [PATCH 058/218] use fluent more icon, correct padding closes sk22#350 --- mastodon/src/main/res/values/styles.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mastodon/src/main/res/values/styles.xml b/mastodon/src/main/res/values/styles.xml index 1c9304bd0..130006550 100644 --- a/mastodon/src/main/res/values/styles.xml +++ b/mastodon/src/main/res/values/styles.xml @@ -225,6 +225,12 @@ @style/Widget.Mastodon.Toolbar ?colorGray800 ?colorGray800 + @style/Theme.Mastodon.ActionButton.Overflow + + + -