From e9fe4a82df33273703e56d82d259b64fd26bb6f2 Mon Sep 17 00:00:00 2001 From: Poussinou Date: Sun, 4 Dec 2022 05:26:19 +0930 Subject: [PATCH 001/719] Update README.md --- README.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 326d74f52..9508321b9 100644 --- a/README.md +++ b/README.md @@ -3,10 +3,17 @@ Mastodon for Android [![Crowdin](https://badges.crowdin.net/mastodon-for-android/localized.svg)](https://crowdin.com/project/mastodon-for-android) - - This is the repository for the official Android app for Mastodon. +[Get it on F-Droid](https://f-droid.org/packages/org.joinmastodon.android/) +[Get it on Google Play](https://play.google.com/store/apps/details?id=org.joinmastodon.android) + +or get the APK from the [The Releases Section](https://github.com/mastodon/mastodon-android/releases/latest). + ## Contributing Our goal is delivering a polished, professionally designed and user-friendly app. We proceed according to wireframes provided by a professional UX designer that works with Mastodon gGmbH. This means that any outside contributions that change the app visually must first be coordinated with the UX designer. *This can take time.* Furthermore, we work off of an internal roadmap and aim for feature-parity and consistency with our iOS app. The iOS app is designated as the "primary" between the two, therefore, if you want to request features, please do so in the [Mastodon for iOS](https://github.com/mastodon/mastodon-ios) repository, as you are requesting a feature to be both in iOS and Android (exceptions being system integrations specific to Android). On the other hand, any contributions that improve existing functionality, performance, or accessibility should not have any roadblocks to being merged. From 63b1b58c4e7d9d54e2cefb1951e97c0746aeb195 Mon Sep 17 00:00:00 2001 From: sk Date: Wed, 7 Dec 2022 19:05:38 +0100 Subject: [PATCH 002/719] use dashes instead of asterisks --- metadata/en-US/changelogs/56.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/metadata/en-US/changelogs/56.txt b/metadata/en-US/changelogs/56.txt index 06e2c8370..988a6f97f 100644 --- a/metadata/en-US/changelogs/56.txt +++ b/metadata/en-US/changelogs/56.txt @@ -1,5 +1,5 @@ -* Custom color themes by @LucasGGamerM -* Better emoji search while composing -* Tweaked voting (display own vote, always display vote button, don't cut off long answers) -* Add push notification setting for post notifications -* Bugfixes +- Custom color themes by @LucasGGamerM +- Better emoji search while composing +- Tweaked voting (display own vote, always display vote button, don't cut off long answers) +- Add push notification setting for post notifications +- Bugfixes From 5f0382456fd6bdc4aa6affd0eb9df754936ec257 Mon Sep 17 00:00:00 2001 From: sk Date: Wed, 7 Dec 2022 19:09:13 +0100 Subject: [PATCH 003/719] remove upstream fastlane changes --- .../metadata/android/cs-CZ/full_description.txt | 16 ---------------- .../metadata/android/de-DE/full_description.txt | 16 ---------------- .../metadata/android/fil-PH/full_description.txt | 16 ---------------- .../android/fil-PH/short_description.txt | 1 - fastlane/metadata/android/fil-PH/title.txt | 1 - .../metadata/android/hu-HU/full_description.txt | 16 ---------------- .../metadata/android/hu-HU/short_description.txt | 1 - fastlane/metadata/android/hu-HU/title.txt | 1 - 8 files changed, 68 deletions(-) delete mode 100644 fastlane/metadata/android/cs-CZ/full_description.txt delete mode 100644 fastlane/metadata/android/de-DE/full_description.txt delete mode 100644 fastlane/metadata/android/fil-PH/full_description.txt delete mode 100644 fastlane/metadata/android/fil-PH/short_description.txt delete mode 100644 fastlane/metadata/android/fil-PH/title.txt delete mode 100644 fastlane/metadata/android/hu-HU/full_description.txt delete mode 100644 fastlane/metadata/android/hu-HU/short_description.txt delete mode 100644 fastlane/metadata/android/hu-HU/title.txt diff --git a/fastlane/metadata/android/cs-CZ/full_description.txt b/fastlane/metadata/android/cs-CZ/full_description.txt deleted file mode 100644 index 7596fd3ad..000000000 --- a/fastlane/metadata/android/cs-CZ/full_description.txt +++ /dev/null @@ -1,16 +0,0 @@ -Mastodon je největší decentralizovanou sociální sítí na internetu. Místo jediné webové stránky je to síť pro miliony uživatelů v nezávislých komunitách, ve kterých mohou všichni vzájemně a bezproblémově komunikovat. Bez ohledu na to, co vás baví, můžete se setkat s vášnivými lidmi, kteří o tom přispívají na Mastodon! - -Připojte se ke komunitě a vytvořte svůj profil. Najděte a sledujte fascinující lidi a přečtěte si jejich příspěvky v chronologické časové ose bez reklam. Vyjádřete se pomocí vlastních emoji, obrázků, GIFů, videí a zvuku v 500-znakových příspěvcích. Odpovězte na vlákna a boostujte příspěvky od kohokoliv, abyste mohli sdílet skvělé věci. Najděte nové účty pro sledování a populární hashtagy pro rozšíření vaší sítě. - -Mastodon je postaven se zaměřením na soukromí a bezpečnost. Rozhodněte, zda jsou vaše příspěvky sdíleny se vašimi sledujícími, jen s lidmi, které zmíníte, nebo s celým světem. Upozornění na obsah vám umožní skrýt příspěvky obsahující citlivý nebo spouštěcí materiál, dokud se s nimi nezačnete zabývat. Každá komunita má vlastní pokyny a moderátory, aby udržela své členy v bezpečí, a robustní blokování a nahlašovací nástroje pomáhácí předcházení zneužití. - -Více funkcí: - -• Tmavý režim: Čtěte příspěvky ve světlém, tmavém nebo pravém černém režimu -• Ankety: Požádejte sledující o jejich názor a sečtěte jejich hlasy -• Objevit: Populární hashtagy a účty jsou pryč na jedno klepnutí -• Oznámení: Dostávejte oznámení o nových sledujících, odpovědích a boostech -• Sdílení: Odesílání přímo do Mastodonu z libovolného seznamu sdílení v jakékoliv aplikaci -• Roztomilost: Naším maskotem je roztomilý slon, kterého čas od času uvidíte - -Mastodon je registrovaný neziskový projekt a vývojový program je podporován přímo vašimi dary. Neexistuje žádná reklama, žádná monetizace a žádný rizikový kapitál a máme v plánu to udržet. \ No newline at end of file diff --git a/fastlane/metadata/android/de-DE/full_description.txt b/fastlane/metadata/android/de-DE/full_description.txt deleted file mode 100644 index 9d2abfa3b..000000000 --- a/fastlane/metadata/android/de-DE/full_description.txt +++ /dev/null @@ -1,16 +0,0 @@ -Mastodon ist das größte dezentralisierte soziale Netzwerk im Internet. Statt einer einzigen Webseite ist es ein Netzwerk von Millionen von Benutzer*innen in unabhängigen Gemeinschaften, die alle miteinander interagieren können. Egal, was du magst, auf Mastodon kannst du begeisterte Menschen treffen, die darüber schreiben! - -Tritt einer Gemeinschaft bei und erstelle dein Profil. Finde und folge faszinierenden Leuten und lies ihre Beiträge in einer werbefreien, chronologischen Zeitachse. Drücke dich mit eigenen Emojis, Bildern, GIFs, Videos und Klängen in 500-Zeichen-Beiträgen aus. Antworte auf Themen und teile Beiträge von anderen, um tolle Dinge zu verbreiten. Finde neue Konten zum Folgen und angesagte Hashtags, um dein Netzwerk zu erweitern. - -Mastodon wurde mit einem Schwerpunkt auf Privatsphäre und Sicherheit gebaut. Entscheide, ob du deine Beiträge mit deinen Followern, nur mit den Menschen, die du erwähnst, oder mit der ganzen Welt teilen möchtest. Mit Inhaltswarnungen kannst du Beiträge mit sensiblem oder bedenklichen Inhalten ausblenden, bis du bereit bist, dich damit auseinanderzusetzen. Jede Gemeinschaft hat ihre eigenen Regeln und Moderator*innen, um die Sicherheit ihrer Mitglieder zu gewährleisten, sowie robuste Sperr- und Meldewerkzeuge, um Missbrauch vorzubeugen. - -Weitere Funktionen: - -• Dunkler Modus: Beiträge im hellen, dunklen oder schwarzen Modus lesen -• Umfragen: frage deine Follower nach ihrer Meinung und zähle die Stimmen -• Entdecken: trendende Hashtags und Profile sind nur einen Fingertipp entfernt -• Benachrichtigungen: erhalte Benachrichtigungen über neue Follower, Antworten und geteilte Beiträge -• Teilen: veröffentliche auf Mastodon aus jeder beliebigen anderen App -• Niedlichkeit: unser Maskottchen ist ein entzückender Elefant und du wirst ihn von Zeit zu Zeit auftauchen sehen - -Mastodon ist eine eingetragene gemeinnützige Organisation und die Entwicklung wird direkt durch deine Spenden unterstützt. Es gibt keine Werbung, keine Monetarisierung und kein Risikokapital und so soll es auch bleiben. \ No newline at end of file diff --git a/fastlane/metadata/android/fil-PH/full_description.txt b/fastlane/metadata/android/fil-PH/full_description.txt deleted file mode 100644 index 69aa29ff9..000000000 --- a/fastlane/metadata/android/fil-PH/full_description.txt +++ /dev/null @@ -1,16 +0,0 @@ -Mastodon is the largest decentralized social network on the internet. Instead of a single website, it’s a network of millions of users in independent communities that can all interact with one another, seamlessly. No matter what you’re into, you can meet passionate people posting about it on Mastodon! - -Join a community and create your profile. Find and and follow fascinating folks and read their posts in an ad-free, chronological timeline. Express yourself with custom emoji, images, GIFs, videos, and audio in 500-character posts. Reply to threads and reblog posts from anyone to share great stuff. Find new accounts to follow and trending hashtags to expand your network. - -Mastodon is built with a focus on privacy and safety. Decide whether your posts are shared with your followers, just the people you mention, or the whole world. Content warnings let you hide posts containing sensitive or triggering material until you're ready to engage with them. Each community has its own guidelines and moderators to keep its members safe, and robust blocking and reporting tools help prevent abuse. - -More features: - -• Dark Mode: Read posts in light, dark, or true black mode -• Polls: Ask followers for their opinion and tally the votes -• Explore: Trending hashtags and accounts are a tap away -• Notifications: Get notified about new follows, replies, and reblogs -• Sharing: Post directly to Mastodon from any share sheet in any app -• Cuteness: Our mascot is an adorable elephant, and you'll see them pop up from time to time - -Mastodon is a registered nonprofit and development is supported directly by your donations. There’s no advertising, no monetization, and no venture capital, and we plan to keep it that way. \ No newline at end of file diff --git a/fastlane/metadata/android/fil-PH/short_description.txt b/fastlane/metadata/android/fil-PH/short_description.txt deleted file mode 100644 index 8f5a9b847..000000000 --- a/fastlane/metadata/android/fil-PH/short_description.txt +++ /dev/null @@ -1 +0,0 @@ -Decentralized social network \ No newline at end of file diff --git a/fastlane/metadata/android/fil-PH/title.txt b/fastlane/metadata/android/fil-PH/title.txt deleted file mode 100644 index 8123241a0..000000000 --- a/fastlane/metadata/android/fil-PH/title.txt +++ /dev/null @@ -1 +0,0 @@ -Mastodon \ No newline at end of file diff --git a/fastlane/metadata/android/hu-HU/full_description.txt b/fastlane/metadata/android/hu-HU/full_description.txt deleted file mode 100644 index 8e76178ab..000000000 --- a/fastlane/metadata/android/hu-HU/full_description.txt +++ /dev/null @@ -1,16 +0,0 @@ -A Mastodon a legnagyobb decentralizált közösségi hálózat az interneten. Egyetlen weboldal helyett, ez több millió felhasználóból álló, független közösségek hálózata, amelyek egymással kapcsolatba tudnak lépni, zökkenőmentesen. Nem számít, mi a hobbid, a Mastodonon találkozhatsz róla posztoló lelkes emberekkel! - -Csatlakozz egy közösséghez és készítsd el a profilodat. Keress és kövess lenyűgöző embereket, és olvasd egy reklámmentes, kronologikus idővonalon a bejegyzéseiket. Fejezd ki magad egyedi hangulatjelekkel, képekkel, GIFekkel, videókkal és hanggal, 500 karakter hosszúságú posztokban. Reply to threads and reblog posts from anyone to share great stuff. Fedezz fel új fiókokat amiket követhetsz és felkapott hashtageket, hogy bővíthesd a kapcsolataidat. - -A Mastodon az adatvédelemre és a biztonságra összpontosítva épült. Döntsd el, hogy a posztjaidat csak a követőiddel, csak azokkal akiket megemlítesz, vagy az egész világgal osztod meg. Content warnings let you hide posts containing sensitive or triggering material until you're ready to engage with them. Each community has its own guidelines and moderators to keep its members safe, and robust blocking and reporting tools help prevent abuse. - -More features: - -• Dark Mode: Read posts in light, dark, or true black mode -• Polls: Ask followers for their opinion and tally the votes -• Explore: Trending hashtags and accounts are a tap away -• Notifications: Get notified about new follows, replies, and reblogs -• Sharing: Post directly to Mastodon from any share sheet in any app -• Cuteness: Our mascot is an adorable elephant, and you'll see them pop up from time to time - -Mastodon is a registered nonprofit and development is supported directly by your donations. There’s no advertising, no monetization, and no venture capital, and we plan to keep it that way. \ No newline at end of file diff --git a/fastlane/metadata/android/hu-HU/short_description.txt b/fastlane/metadata/android/hu-HU/short_description.txt deleted file mode 100644 index bf21b3e31..000000000 --- a/fastlane/metadata/android/hu-HU/short_description.txt +++ /dev/null @@ -1 +0,0 @@ -Decentralizált szociális hálózat \ No newline at end of file diff --git a/fastlane/metadata/android/hu-HU/title.txt b/fastlane/metadata/android/hu-HU/title.txt deleted file mode 100644 index 8123241a0..000000000 --- a/fastlane/metadata/android/hu-HU/title.txt +++ /dev/null @@ -1 +0,0 @@ -Mastodon \ No newline at end of file From 2db39f8c66734cd858f942a39c065af36da44b43 Mon Sep 17 00:00:00 2001 From: sk22 Date: Wed, 7 Dec 2022 17:54:07 +0000 Subject: [PATCH 004/719] Translated using Weblate (German) Currently translated at 100.0% (47 of 47 strings) Translation: Megalodon/values Translate-URL: https://translate.codeberg.org/projects/megalodon/values/de/ --- .../src/main/res/values-de-rDE/strings_sk.xml | 87 ++++++++++--------- 1 file changed, 48 insertions(+), 39 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 af013215f..d6279f72a 100644 --- a/mastodon/src/main/res/values-de-rDE/strings_sk.xml +++ b/mastodon/src/main/res/values-de-rDE/strings_sk.xml @@ -1,41 +1,50 @@ - Megalodon - 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? - An Profil anheften - Beitrag an Profil anheften - Möchtest du den Beitrag an dein Profil anheften? - Wird angeheftet… - Von Profil lösen - Angehefteten Beitrag von Profil lösen - Bist du dir sicher, dass du den angehefteten Beitrag von deinem Profil lösen möchtest? - Wird vom Profil gelöst… - Bildbeschreibung - Nicht gelistet - Antworten anzeigen - Geteilte Beiträge anzeigen - Automatisch neue Beiträge laden - Interaktions-Anzahlen anzeigen - Megalodon v%1$s (%2$d) - Medien als sensibel markieren - Benachrichtigungen über Beiträge von %s aktiviert - Benachrichtigungen über Beiträge von %s deaktiviert - Föderation - Das sind die neuesten Beiträge von Personen, die in der Föderation deines Servers sind. - Megalodon %s ist zum Herunterladen bereit. - Megalodon %s wurde heruntergeladen und kann jetzt installiert werden. - Auf Update prüfen - Kein Update verfügbar - Listen - Folgeanfragen - Folgeanfrage akzeptieren - Folgeanfrage ablehnen - Listen mit %s - Inhaltswarnungen immer ausklappen - Laufschrift in Titelleisten deaktivieren - Zu Megalodon beitragen - Föderierte Timeline anzeigen - + Megalodon + 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? + An Profil anheften + Beitrag an Profil anheften + Möchtest du den Beitrag an dein Profil anheften? + Wird angeheftet… + Von Profil lösen + Angehefteten Beitrag von Profil lösen + Bist du dir sicher, dass du den angehefteten Beitrag von deinem Profil lösen möchtest? + Wird vom Profil gelöst… + Bildbeschreibung + Nicht gelistet + Antworten anzeigen + Geteilte Beiträge anzeigen + Automatisch neue Beiträge laden + Interaktions-Anzahlen anzeigen + Megalodon v%1$s (%2$d) + Medien als sensibel markieren + Benachrichtigungen über Beiträge von %s aktiviert + Benachrichtigungen über Beiträge von %s deaktiviert + Föderation + Das sind die neuesten Beiträge von Personen, die in der Föderation deines Servers sind. + Megalodon %s ist zum Herunterladen bereit. + Megalodon %s wurde heruntergeladen und kann jetzt installiert werden. + Auf Update prüfen + Kein Update verfügbar + Listen + Folgeanfragen + Folgeanfrage akzeptieren + Folgeanfrage ablehnen + Listen mit %s + Inhaltswarnungen immer ausklappen + Laufschrift in Titelleisten deaktivieren + Zu Megalodon beitragen + Föderierte Timeline anzeigen + Beitrags-Benachrichtigungen + Farbschema + Pink + Violett + Grün + Braun + Gelb + Beiträge + Blau + \ No newline at end of file From ede7ece25aa8853af02674ed66ac3fb47b71e992 Mon Sep 17 00:00:00 2001 From: sk22 Date: Wed, 7 Dec 2022 18:06:17 +0000 Subject: [PATCH 005/719] Translated using Weblate (German) Currently translated at 100.0% (7 of 7 strings) Translation: Megalodon/metadata Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/de/ --- metadata/de-DE/changelogs/55.txt | 4 ++++ metadata/de-DE/changelogs/56.txt | 5 +++++ 2 files changed, 9 insertions(+) create mode 100644 metadata/de-DE/changelogs/55.txt create mode 100644 metadata/de-DE/changelogs/56.txt diff --git a/metadata/de-DE/changelogs/55.txt b/metadata/de-DE/changelogs/55.txt new file mode 100644 index 000000000..8af23d89b --- /dev/null +++ b/metadata/de-DE/changelogs/55.txt @@ -0,0 +1,4 @@ +- HTML-Tags und Markdown-Formatierung richtig darstellen +- Weblate-Übersetzungsprojekt einrichten +- Schalter für die Föderierte Timeline +- Versionen 52-54 waren kleine Anpassungen für den Google Play-Release diff --git a/metadata/de-DE/changelogs/56.txt b/metadata/de-DE/changelogs/56.txt new file mode 100644 index 000000000..854b7523b --- /dev/null +++ b/metadata/de-DE/changelogs/56.txt @@ -0,0 +1,5 @@ +- Eigene Farbschemata von @LucasGGamerM +- Bessere Emoji-Suche beim Verfassen +- Verbesserungen bei Abstimmungen (eigene Stimme wird angezeigt, Abstimmen-Button wird immer angezeigt, lange Antworten werden nicht abgeschnitten) +- Push-Notification-Einstellung für Beitrags-Benachrichtigungen +- Fehlerbehebungen From 2515a8d381730bb6e717f330fc1776f88dc0bc7e Mon Sep 17 00:00:00 2001 From: sk Date: Wed, 7 Dec 2022 19:16:14 +0100 Subject: [PATCH 006/719] add missing item to changelog --- README.md | 1 + metadata/en-US/changelogs/56.txt | 1 + 2 files changed, 2 insertions(+) diff --git a/README.md b/README.md index ac64558ab..346f95db5 100644 --- a/README.md +++ b/README.md @@ -156,6 +156,7 @@ There's also a handful of custom strings exclusive to this projects that would n * [Improvements to the true black mode](https://github.com/mastodon/mastodon-android/compare/master...sk22:megalodon:true-black-improvements) * [Profile header tweaks](https://github.com/mastodon/mastodon-android/compare/master...sk22:megalodon:ui/profile-header-tweaks) * [Custom color themes](https://github.com/sk22/megalodon/pull/124) by [@LucasGGamerM](https://github.com/LucasGGamerM) +* [Custom "megalodon" text logo](https://github.com/sk22/megalodon/commit/563afd487ca5c608cfbb00fa3909d3c27384acc0) by [@LucasGGamerM](https://github.com/LucasGGamerM) ## Building diff --git a/metadata/en-US/changelogs/56.txt b/metadata/en-US/changelogs/56.txt index 988a6f97f..5cc904d40 100644 --- a/metadata/en-US/changelogs/56.txt +++ b/metadata/en-US/changelogs/56.txt @@ -1,4 +1,5 @@ - Custom color themes by @LucasGGamerM +- New "megalodon" text logo submitted by @LucasGGamerM - Better emoji search while composing - Tweaked voting (display own vote, always display vote button, don't cut off long answers) - Add push notification setting for post notifications From 79025c2f36970e690bfcd087e855d96b262ad150 Mon Sep 17 00:00:00 2001 From: sk Date: Wed, 7 Dec 2022 19:19:05 +0100 Subject: [PATCH 007/719] update description --- metadata/en-US/full_description.txt | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/metadata/en-US/full_description.txt b/metadata/en-US/full_description.txt index 4afd4be3a..779f88864 100644 --- a/metadata/en-US/full_description.txt +++ b/metadata/en-US/full_description.txt @@ -1,4 +1,4 @@ -Megalodon is a modified version of the official Mastodon Android app adding important features that are missing in the official app, such as the federated timeline, unlisted posting, bookmarks and an image description viewer. +Megalodon is a modified version of the official Mastodon Android app adding important features that are missing in the official app, such as the federated timeline, unlisted posting and an image description viewer. Key features @@ -6,12 +6,6 @@ Megalodon is a modified version of the offiziellen Mastodon-Android-App mit vielen Features, die in der offiziellen App fehlen, z.B. die föderierte Timeline, ungelistete Beiträge posten, Lesezeichen und die Möglichkeit, Bildbeschreibungen anzuzeigen. +Megalodon ist eine modifizierte Version der offiziellen Mastodon-Android-App mit vielen Features, die in der offiziellen App fehlen, z.B. die föderierte Timeline, ungelistete Beiträge posten und die Möglichkeit, Bildbeschreibungen anzuzeigen. Die wichtigsten Features @@ -6,12 +6,6 @@ Megalodon ist eine modifizierte Version der ](https://play.google.com/store/apps/details?id=org.joinmastodon.android) -or get the APK from the [The Releases Section](https://github.com/mastodon/mastodon-android/releases/latest). +Or get the APK from the [The Releases Section](https://github.com/mastodon/mastodon-android/releases/latest). ## Contributing From 4a9cb9f2dcaacd1f304ccb2e3e325e9e15a64a27 Mon Sep 17 00:00:00 2001 From: sk Date: Thu, 8 Dec 2022 15:53:35 +0100 Subject: [PATCH 010/719] fix poll option displaying wrong own vote fixes #132 --- mastodon/src/main/res/layout/display_item_poll_option.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/mastodon/src/main/res/layout/display_item_poll_option.xml b/mastodon/src/main/res/layout/display_item_poll_option.xml index 7d9f53ec7..5747d0f3b 100644 --- a/mastodon/src/main/res/layout/display_item_poll_option.xml +++ b/mastodon/src/main/res/layout/display_item_poll_option.xml @@ -26,7 +26,6 @@ android:layout_height="24dp" android:layout_marginStart="12dp" android:layout_gravity="center_vertical" - android:duplicateParentState="true" android:tint="?colorDarkIcon" android:src="@drawable/ic_poll_option_button"/> From b58074361931b5b4af89f2f5179b920c50978671 Mon Sep 17 00:00:00 2001 From: sk Date: Thu, 8 Dec 2022 16:03:46 +0100 Subject: [PATCH 011/719] fix poll option displaying wrong own vote fixes #132 --- .../android/ui/displayitems/PollOptionStatusDisplayItem.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/PollOptionStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/PollOptionStatusDisplayItem.java index 70be9b87b..c16169b04 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/PollOptionStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/PollOptionStatusDisplayItem.java @@ -80,10 +80,10 @@ public class PollOptionStatusDisplayItem extends StatusDisplayItem{ percent.setVisibility(item.showResults ? View.VISIBLE : View.GONE); itemView.setClickable(!item.showResults); if(item.showResults){ - icon.setSelected(item.poll.ownVotes.contains(item.poll.options.indexOf(item.option))); progressBg.setLevel(Math.round(10000f*item.votesFraction)); button.setBackground(progressBg); itemView.setSelected(item.isMostVoted); + icon.setSelected(item.poll.ownVotes.contains(item.poll.options.indexOf(item.option))); percent.setText(String.format(Locale.getDefault(), "%d%%", Math.round(item.votesFraction*100f))); }else{ itemView.setSelected(item.poll.selectedOptions!=null && item.poll.selectedOptions.contains(item.option)); From 6fd58c96827cb1d2da329cebdc170a1425dd18d7 Mon Sep 17 00:00:00 2001 From: sk Date: Thu, 8 Dec 2022 19:55:46 +0100 Subject: [PATCH 012/719] improve semantics for poll options --- .../ui/displayitems/PollOptionStatusDisplayItem.java | 9 +++++++-- .../drawable/ic_fluent_checkbox_checked_24_filled.xml | 3 +++ .../drawable/ic_fluent_checkbox_checked_24_regular.xml | 3 +++ .../drawable/ic_fluent_checkbox_unchecked_24_filled.xml | 3 +++ .../drawable/ic_fluent_checkbox_unchecked_24_regular.xml | 3 +++ .../res/drawable/ic_fluent_radio_button_24_filled.xml | 3 +++ .../res/drawable/ic_fluent_radio_button_24_selector.xml | 8 ++++++++ .../res/drawable/ic_poll_checkbox_filled_selector.xml | 7 +++++++ .../res/drawable/ic_poll_checkbox_regular_selector.xml | 7 +++++++ 9 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 mastodon/src/main/res/drawable/ic_fluent_checkbox_checked_24_filled.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_checkbox_checked_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_checkbox_unchecked_24_filled.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_checkbox_unchecked_24_regular.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_radio_button_24_filled.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_radio_button_24_selector.xml create mode 100644 mastodon/src/main/res/drawable/ic_poll_checkbox_filled_selector.xml create mode 100644 mastodon/src/main/res/drawable/ic_poll_checkbox_regular_selector.xml diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/PollOptionStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/PollOptionStatusDisplayItem.java index c16169b04..c00edada3 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/PollOptionStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/PollOptionStatusDisplayItem.java @@ -5,6 +5,7 @@ import android.graphics.drawable.Animatable; import android.graphics.drawable.Drawable; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageView; import android.widget.TextView; import org.joinmastodon.android.R; @@ -60,7 +61,8 @@ public class PollOptionStatusDisplayItem extends StatusDisplayItem{ public static class Holder extends StatusDisplayItem.Holder implements ImageLoaderViewHolder{ private final TextView text, percent; - private final View icon, button; + private final View button; + private final ImageView icon; private final Drawable progressBg; public Holder(Activity activity, ViewGroup parent){ @@ -76,9 +78,12 @@ public class PollOptionStatusDisplayItem extends StatusDisplayItem{ @Override public void onBind(PollOptionStatusDisplayItem item){ text.setText(item.text); -// icon.setVisibility(item.showResults ? View.GONE : View.VISIBLE); percent.setVisibility(item.showResults ? View.VISIBLE : View.GONE); itemView.setClickable(!item.showResults); + icon.setImageDrawable(itemView.getContext().getDrawable(item.poll.multiple ? + item.showResults ? R.drawable.ic_poll_checkbox_regular_selector : R.drawable.ic_poll_checkbox_filled_selector : + item.showResults ? R.drawable.ic_poll_option_button : R.drawable.ic_fluent_radio_button_24_selector + )); if(item.showResults){ progressBg.setLevel(Math.round(10000f*item.votesFraction)); button.setBackground(progressBg); diff --git a/mastodon/src/main/res/drawable/ic_fluent_checkbox_checked_24_filled.xml b/mastodon/src/main/res/drawable/ic_fluent_checkbox_checked_24_filled.xml new file mode 100644 index 000000000..fa9b028b3 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_checkbox_checked_24_filled.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_checkbox_checked_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_checkbox_checked_24_regular.xml new file mode 100644 index 000000000..033e1a14d --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_checkbox_checked_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_checkbox_unchecked_24_filled.xml b/mastodon/src/main/res/drawable/ic_fluent_checkbox_unchecked_24_filled.xml new file mode 100644 index 000000000..49398070b --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_checkbox_unchecked_24_filled.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_checkbox_unchecked_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_checkbox_unchecked_24_regular.xml new file mode 100644 index 000000000..792b97833 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_checkbox_unchecked_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_radio_button_24_filled.xml b/mastodon/src/main/res/drawable/ic_fluent_radio_button_24_filled.xml new file mode 100644 index 000000000..179f464bc --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_radio_button_24_filled.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/drawable/ic_fluent_radio_button_24_selector.xml b/mastodon/src/main/res/drawable/ic_fluent_radio_button_24_selector.xml new file mode 100644 index 000000000..80162e2b7 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_radio_button_24_selector.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/mastodon/src/main/res/drawable/ic_poll_checkbox_filled_selector.xml b/mastodon/src/main/res/drawable/ic_poll_checkbox_filled_selector.xml new file mode 100644 index 000000000..1e03f145c --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_poll_checkbox_filled_selector.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/mastodon/src/main/res/drawable/ic_poll_checkbox_regular_selector.xml b/mastodon/src/main/res/drawable/ic_poll_checkbox_regular_selector.xml new file mode 100644 index 000000000..e22f22dea --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_poll_checkbox_regular_selector.xml @@ -0,0 +1,7 @@ + + + + + + + From 5b28468efd49387b4f8b83f142f3adf3104ca60c Mon Sep 17 00:00:00 2001 From: sk Date: Thu, 8 Dec 2022 20:53:34 +0100 Subject: [PATCH 013/719] add option to allow multiple poll choices --- .../android/fragments/ComposeFragment.java | 36 +++++++++++++++++++ .../ic_fluent_add_square_24_regular.xml | 3 ++ .../main/res/layout/compose_poll_option.xml | 1 + .../src/main/res/layout/fragment_compose.xml | 34 ++++++++++++++++++ mastodon/src/main/res/values/strings.xml | 1 + 5 files changed, 75 insertions(+) create mode 100644 mastodon/src/main/res/drawable/ic_fluent_add_square_24_regular.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 406d74673..cdee35419 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java @@ -40,6 +40,7 @@ import android.view.WindowManager; import android.view.animation.LinearInterpolator; import android.view.inputmethod.InputMethodManager; import android.widget.Button; +import android.widget.CheckBox; import android.widget.EditText; import android.widget.FrameLayout; import android.widget.ImageButton; @@ -150,6 +151,8 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr private ReorderableLinearLayout pollOptionsView; private View pollWrap; private View addPollOptionBtn; + private View pollAllowMultipleItem; + private CheckBox pollAllowMultipleCheckbox; private TextView pollDurationView; private ArrayList pollOptions=new ArrayList<>(); @@ -288,6 +291,9 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr pollOptionsView=view.findViewById(R.id.poll_options); pollWrap=view.findViewById(R.id.poll_wrap); addPollOptionBtn=view.findViewById(R.id.add_poll_option); + pollAllowMultipleItem=view.findViewById(R.id.poll_allow_multiple); + pollAllowMultipleCheckbox=view.findViewById(R.id.poll_allow_multiple_checkbox); + pollAllowMultipleItem.setOnClickListener(v->this.togglePollAllowMultiple()); addPollOptionBtn.setOnClickListener(v->{ createDraftPollOption().edit.requestFocus(); @@ -302,6 +308,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr pollBtn.setSelected(true); mediaBtn.setEnabled(false); pollWrap.setVisibility(View.VISIBLE); + updatePollAllowMultiple(savedInstanceState.getBoolean("pollAllowMultiple", false)); for(String oldText:savedInstanceState.getStringArrayList("pollOptions")){ DraftPollOption opt=createDraftPollOption(); opt.edit.setText(oldText); @@ -312,6 +319,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr pollBtn.setSelected(true); mediaBtn.setEnabled(false); pollWrap.setVisibility(View.VISIBLE); + updatePollAllowMultiple(editingStatus.poll.multiple); for(Poll.Option eopt:editingStatus.poll.options){ DraftPollOption opt=createDraftPollOption(); opt.edit.setText(eopt.title); @@ -381,6 +389,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr outState.putStringArrayList("pollOptions", opts); outState.putInt("pollDuration", pollDuration); outState.putString("pollDurationStr", pollDurationStr); + outState.putBoolean("pollAllowMultiple", pollAllowMultipleItem.isSelected()); } outState.putBoolean("hasSpoiler", hasSpoiler); if(!attachments.isEmpty()){ @@ -658,6 +667,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr if(!pollOptions.isEmpty()){ req.poll=new CreateStatus.Request.Poll(); req.poll.expiresIn=pollDuration; + req.poll.multiple=pollAllowMultipleItem.isSelected(); for(DraftPollOption opt:pollOptions) req.poll.options.add(opt.edit.getText().toString()); } @@ -1158,6 +1168,11 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr option.view=LayoutInflater.from(getActivity()).inflate(R.layout.compose_poll_option, pollOptionsView, false); option.edit=option.view.findViewById(R.id.edit); option.dragger=option.view.findViewById(R.id.dragger_thingy); + ImageView icon = option.view.findViewById(R.id.icon); + icon.setImageDrawable(getContext().getDrawable(pollAllowMultipleItem.isSelected() ? + R.drawable.ic_poll_checkbox_regular_selector : + R.drawable.ic_poll_option_button + )); option.dragger.setOnLongClickListener(v->{ pollOptionsView.startDragging(option.view); @@ -1319,6 +1334,27 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr }); } + private void togglePollAllowMultiple() { + updatePollAllowMultiple(!pollAllowMultipleItem.isSelected()); + } + + private void updatePollAllowMultiple(boolean multiple){ + pollAllowMultipleItem.setSelected(multiple); + pollAllowMultipleCheckbox.setChecked(multiple); + ImageView btn = addPollOptionBtn.findViewById(R.id.add_poll_option_icon); + btn.setImageDrawable(getContext().getDrawable(multiple ? + R.drawable.ic_fluent_add_square_24_regular : + R.drawable.ic_fluent_add_circle_24_regular + )); + for (DraftPollOption opt:pollOptions) { + ImageView icon = opt.view.findViewById(R.id.icon); + icon.setImageDrawable(getContext().getDrawable(multiple ? + R.drawable.ic_poll_checkbox_regular_selector : + R.drawable.ic_poll_option_button + )); + } + } + @Override public void onSelectionChanged(int start, int end){ if(ignoreSelectionChanges) diff --git a/mastodon/src/main/res/drawable/ic_fluent_add_square_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_add_square_24_regular.xml new file mode 100644 index 000000000..0aa232d6c --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_add_square_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/layout/compose_poll_option.xml b/mastodon/src/main/res/layout/compose_poll_option.xml index d806da362..d93a68014 100644 --- a/mastodon/src/main/res/layout/compose_poll_option.xml +++ b/mastodon/src/main/res/layout/compose_poll_option.xml @@ -15,6 +15,7 @@ android:outlineProvider="background" android:elevation="2dp"> + + + + + + + Welcome Back Log in with the server where you created your account. Server URL + Allow multiple choices \ No newline at end of file From b370fcda6d07aaf16f61d2cfad753b73e130b960 Mon Sep 17 00:00:00 2001 From: sk Date: Thu, 8 Dec 2022 21:00:30 +0100 Subject: [PATCH 014/719] add bottom margin to sensitive toggle --- mastodon/src/main/res/layout/fragment_compose.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/mastodon/src/main/res/layout/fragment_compose.xml b/mastodon/src/main/res/layout/fragment_compose.xml index 90d7ac8b0..72efb5426 100644 --- a/mastodon/src/main/res/layout/fragment_compose.xml +++ b/mastodon/src/main/res/layout/fragment_compose.xml @@ -159,6 +159,7 @@ android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginBottom="16dp" android:layout_marginTop="8dp" android:gravity="center_vertical" android:layoutDirection="locale" From c4adbc8e459d79f44889cbba0692bc3c37127814 Mon Sep 17 00:00:00 2001 From: sk Date: Thu, 8 Dec 2022 21:02:06 +0100 Subject: [PATCH 015/719] update changelog/readme --- README.md | 2 ++ metadata/en-US/changelogs/57.txt | 3 +++ 2 files changed, 5 insertions(+) create mode 100644 metadata/en-US/changelogs/57.txt diff --git a/README.md b/README.md index 346f95db5..75afc39f2 100644 --- a/README.md +++ b/README.md @@ -132,6 +132,7 @@ There's also a handful of custom strings exclusive to this projects that would n * [Clickable reply/boost line above posts](https://github.com/mastodon/mastodon-android/compare/master...sk22:megalodon:clickable-boost-reply-line) * [Clickable reply line while replying to open original post](https://github.com/mastodon/mastodon-android/compare/master...sk22:megalodon:feature/clickable-reply-line-compose) * [Add push notification setting for post notifications](https://github.com/sk22/megalodon/commit/b190480d7739be47f23543d9e7644660f9b4b4ee) +* [Add option to allow voting for multiple options on polls](https://github.com/sk22/megalodon/commit/5b28468efd49387b4f8b83f142f3adf3104ca60c) ### Behavior @@ -148,6 +149,7 @@ There's also a handful of custom strings exclusive to this projects that would n * [Show own vote after voting](https://github.com/mastodon/mastodon-android/commit/4ab9e25fec4fd9c10b7a8ddd1be522b3cc12cf28) ([Closes issue](https://github.com/mastodon/mastodon-android/commit/4ab9e25fec4fd9c10b7a8ddd1be522b3cc12cf28)) * [Make inline emoji search case-insensitive and don't only search from start of emoji names](https://github.com/mastodon/mastodon-android/compare/master...sk22:megalodon:better-inline-emoji-search) ([Pull request](https://github.com/mastodon/mastodon-android/pull/445)) * [Include subject line when sharing e.g. a website to Megalodon](https://github.com/mastodon/mastodon-android/compare/master...sk22:megalodon:external-share-include-subject) +* [Improve semantics for voting on polls (radio buttons and checkboxes)](https://github.com/sk22/megalodon/commit/6fd58c96827cb1d2da329cebdc170a1425dd18d7) ### Visual diff --git a/metadata/en-US/changelogs/57.txt b/metadata/en-US/changelogs/57.txt new file mode 100644 index 000000000..811e427a6 --- /dev/null +++ b/metadata/en-US/changelogs/57.txt @@ -0,0 +1,3 @@ +- Improve semantics for voting on polls (radio buttons and checkboxes) +- Add option to allow voting for multiple options on polls +- Bugfixes \ No newline at end of file From ceb08ea78d4f9f4df87ad48f6268a4fce95e38e9 Mon Sep 17 00:00:00 2001 From: sk Date: Thu, 8 Dec 2022 21:36:50 +0100 Subject: [PATCH 016/719] fix get started button color --- .../src/main/res/color/button_text_primary_dark_on_light.xml | 2 +- .../src/main/res/color/button_text_primary_light_on_dark.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mastodon/src/main/res/color/button_text_primary_dark_on_light.xml b/mastodon/src/main/res/color/button_text_primary_dark_on_light.xml index 373da7995..731181a08 100644 --- a/mastodon/src/main/res/color/button_text_primary_dark_on_light.xml +++ b/mastodon/src/main/res/color/button_text_primary_dark_on_light.xml @@ -1,5 +1,5 @@ - + \ No newline at end of file diff --git a/mastodon/src/main/res/color/button_text_primary_light_on_dark.xml b/mastodon/src/main/res/color/button_text_primary_light_on_dark.xml index d8f4d9034..685841e0a 100644 --- a/mastodon/src/main/res/color/button_text_primary_light_on_dark.xml +++ b/mastodon/src/main/res/color/button_text_primary_light_on_dark.xml @@ -1,5 +1,5 @@ - + \ No newline at end of file From dee21222a7b0b775b6bb617649fca7059d82a2db Mon Sep 17 00:00:00 2001 From: sk Date: Fri, 9 Dec 2022 02:37:38 +0100 Subject: [PATCH 017/719] implement translate feature --- .../api/requests/instance/GetInstance.java | 11 ++++ .../requests/statuses/TranslateStatus.java | 11 ++++ .../android/api/session/AccountSession.java | 2 + .../api/session/AccountSessionManager.java | 57 +++++++++++++--- .../joinmastodon/android/model/Instance.java | 17 +++++ .../android/model/TranslatedStatus.java | 7 ++ .../displayitems/TextStatusDisplayItem.java | 65 +++++++++++++++++-- .../src/main/res/layout/display_item_text.xml | 51 +++++++++++++-- mastodon/src/main/res/values/strings.xml | 3 + 9 files changed, 202 insertions(+), 22 deletions(-) create mode 100644 mastodon/src/main/java/org/joinmastodon/android/api/requests/statuses/TranslateStatus.java create mode 100644 mastodon/src/main/java/org/joinmastodon/android/model/TranslatedStatus.java diff --git a/mastodon/src/main/java/org/joinmastodon/android/api/requests/instance/GetInstance.java b/mastodon/src/main/java/org/joinmastodon/android/api/requests/instance/GetInstance.java index 84273ce22..2ed250b96 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/api/requests/instance/GetInstance.java +++ b/mastodon/src/main/java/org/joinmastodon/android/api/requests/instance/GetInstance.java @@ -7,4 +7,15 @@ public class GetInstance extends MastodonAPIRequest{ public GetInstance(){ super(HttpMethod.GET, "/instance", Instance.class); } + + public static class V2 extends MastodonAPIRequest{ + public V2(){ + super(HttpMethod.GET, "/instance", Instance.V2.class); + } + + @Override + protected String getPathPrefix() { + return "/api/v2"; + } + } } diff --git a/mastodon/src/main/java/org/joinmastodon/android/api/requests/statuses/TranslateStatus.java b/mastodon/src/main/java/org/joinmastodon/android/api/requests/statuses/TranslateStatus.java new file mode 100644 index 000000000..bb3c29888 --- /dev/null +++ b/mastodon/src/main/java/org/joinmastodon/android/api/requests/statuses/TranslateStatus.java @@ -0,0 +1,11 @@ +package org.joinmastodon.android.api.requests.statuses; + +import org.joinmastodon.android.api.MastodonAPIRequest; +import org.joinmastodon.android.model.TranslatedStatus; + +public class TranslateStatus extends MastodonAPIRequest { + public TranslateStatus(String id) { + super(HttpMethod.POST, "/statuses/"+id+"/translate", TranslatedStatus.class); + setRequestBody(new Object()); + } +} diff --git a/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSession.java b/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSession.java index 2bd331573..f1de0f707 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSession.java +++ b/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSession.java @@ -7,6 +7,7 @@ import org.joinmastodon.android.api.StatusInteractionController; import org.joinmastodon.android.model.Account; import org.joinmastodon.android.model.Application; import org.joinmastodon.android.model.Filter; +import org.joinmastodon.android.model.Preferences; import org.joinmastodon.android.model.PushSubscription; import org.joinmastodon.android.model.Token; @@ -28,6 +29,7 @@ public class AccountSession{ public long filtersLastUpdated; public List wordFilters=new ArrayList<>(); public String pushAccountID; + public Preferences preferences; private transient MastodonAPIController apiController; private transient StatusInteractionController statusInteractionController; private transient CacheController cacheController; diff --git a/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSessionManager.java b/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSessionManager.java index 52c27480f..20580ea60 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSessionManager.java +++ b/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSessionManager.java @@ -22,6 +22,7 @@ import org.joinmastodon.android.MastodonApp; import org.joinmastodon.android.R; import org.joinmastodon.android.api.MastodonAPIController; import org.joinmastodon.android.api.PushSubscriptionManager; +import org.joinmastodon.android.api.requests.accounts.GetPreferences; import org.joinmastodon.android.api.requests.accounts.GetWordFilters; import org.joinmastodon.android.api.requests.instance.GetCustomEmojis; import org.joinmastodon.android.api.requests.accounts.GetOwnAccount; @@ -34,6 +35,7 @@ import org.joinmastodon.android.model.Emoji; import org.joinmastodon.android.model.EmojiCategory; import org.joinmastodon.android.model.Filter; import org.joinmastodon.android.model.Instance; +import org.joinmastodon.android.model.Preferences; import org.joinmastodon.android.model.Token; import java.io.File; @@ -248,12 +250,13 @@ public class AccountSessionManager{ HashSet domains=new HashSet<>(); for(AccountSession session:sessions.values()){ domains.add(session.domain.toLowerCase()); - if(now-session.infoLastUpdated>24L*3600_000L){ - updateSessionLocalInfo(session); - } - if(now-session.filtersLastUpdated>3600_000L){ - updateSessionWordFilters(session); - } +// if(now-session.infoLastUpdated>24L*3600_000L){ + updateSessionPreferences(session); + updateSessionLocalInfo(session); +// } +// if(now-session.filtersLastUpdated>3600_000L){ + updateSessionWordFilters(session); +// } } if(loadedInstances){ maybeUpdateCustomEmojis(domains); @@ -263,10 +266,10 @@ public class AccountSessionManager{ private void maybeUpdateCustomEmojis(Set domains){ long now=System.currentTimeMillis(); for(String domain:domains){ - Long lastUpdated=instancesLastUpdated.get(domain); - if(lastUpdated==null || now-lastUpdated>24L*3600_000L){ - updateInstanceInfo(domain); - } +// Long lastUpdated=instancesLastUpdated.get(domain); +// if(lastUpdated==null || now-lastUpdated>24L*3600_000L){ + updateInstanceInfo(domain); +// } } } @@ -288,6 +291,18 @@ public class AccountSessionManager{ .exec(session.getID()); } + private void updateSessionPreferences(AccountSession session){ + new GetPreferences().setCallback(new Callback<>() { + @Override + public void onSuccess(Preferences preferences) { + session.preferences=preferences; + } + + @Override + public void onError(ErrorResponse error) {} + }).exec(session.getID()); + } + private void updateSessionWordFilters(AccountSession session){ new GetWordFilters() .setCallback(new Callback<>(){ @@ -313,6 +328,11 @@ public class AccountSessionManager{ public void onSuccess(Instance instance){ instances.put(domain, instance); updateInstanceEmojis(instance, domain); + try { + if (Integer.parseInt(instance.version.split("\\.")[0]) >= 4) { + updateInstanceInfoV2(domain); + } + } catch (Exception ignored) {} } @Override @@ -323,6 +343,19 @@ public class AccountSessionManager{ .execNoAuth(domain); } + public void updateInstanceInfoV2(String domain) { + new GetInstance.V2().setCallback(new Callback<>() { + @Override + public void onSuccess(Instance.V2 v2) { + Instance instanceInfo = instances.get(domain); + if (instanceInfo != null) instanceInfo.v2 = v2; + } + + @Override + public void onError(ErrorResponse errorResponse) {} + }).execNoAuth(domain); + } + private void updateInstanceEmojis(Instance instance, String domain){ new GetCustomEmojis() .setCallback(new Callback<>(){ @@ -398,6 +431,10 @@ public class AccountSessionManager{ return instances.get(domain); } + public Instance getInstanceInfoForAccount(String account) { + return AccountSessionManager.getInstance().getInstanceInfo(instance.getAccount(account).domain); + } + public void updateAccountInfo(String id, Account account){ AccountSession session=getAccount(id); session.self=account; diff --git a/mastodon/src/main/java/org/joinmastodon/android/model/Instance.java b/mastodon/src/main/java/org/joinmastodon/android/model/Instance.java index a9a0aeab7..d2bba026f 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/model/Instance.java +++ b/mastodon/src/main/java/org/joinmastodon/android/model/Instance.java @@ -82,6 +82,8 @@ public class Instance extends BaseModel{ // non-standard field in some Mastodon forks public int maxTootChars; + public V2 v2; + @Override public void postprocess() throws ObjectValidationException{ super.postprocess(); @@ -176,4 +178,19 @@ public class Instance extends BaseModel{ public int minExpiration; public int maxExpiration; } + + @Parcel + public static class V2 extends BaseModel { + public V2.Configuration configuration; + + @Parcel + public static class Configuration { + public TranslationConfiguration translation; + } + + @Parcel + public static class TranslationConfiguration{ + public boolean enabled; + } + } } diff --git a/mastodon/src/main/java/org/joinmastodon/android/model/TranslatedStatus.java b/mastodon/src/main/java/org/joinmastodon/android/model/TranslatedStatus.java new file mode 100644 index 000000000..891c86c03 --- /dev/null +++ b/mastodon/src/main/java/org/joinmastodon/android/model/TranslatedStatus.java @@ -0,0 +1,7 @@ +package org.joinmastodon.android.model; + +public class TranslatedStatus extends BaseModel { + public String content; + public String detectedSourceLanguage; + public String provider; +} diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/TextStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/TextStatusDisplayItem.java index 557bede7e..06bbb1f70 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/TextStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/TextStatusDisplayItem.java @@ -6,15 +6,24 @@ import android.graphics.drawable.Drawable; import android.text.TextUtils; import android.view.View; import android.view.ViewGroup; +import android.widget.Button; import android.widget.TextView; import org.joinmastodon.android.R; +import org.joinmastodon.android.api.requests.statuses.TranslateStatus; +import org.joinmastodon.android.api.session.AccountSession; +import org.joinmastodon.android.api.session.AccountSessionManager; import org.joinmastodon.android.fragments.BaseStatusListFragment; +import org.joinmastodon.android.model.Instance; import org.joinmastodon.android.model.Status; +import org.joinmastodon.android.model.StatusPrivacy; +import org.joinmastodon.android.model.TranslatedStatus; import org.joinmastodon.android.ui.text.HtmlParser; import org.joinmastodon.android.ui.utils.CustomEmojiHelper; import org.joinmastodon.android.ui.views.LinkedTextView; +import me.grishka.appkit.api.Callback; +import me.grishka.appkit.api.ErrorResponse; import me.grishka.appkit.imageloader.ImageLoaderViewHolder; import me.grishka.appkit.imageloader.MovieDrawable; import me.grishka.appkit.imageloader.requests.ImageLoaderRequest; @@ -25,6 +34,12 @@ public class TextStatusDisplayItem extends StatusDisplayItem{ private CharSequence parsedSpoilerText; public boolean textSelectable; public final Status status; + public boolean translated = false; + public TranslatedStatus translation = null; + + private AccountSession session; + private Instance instanceInfo; + private boolean translateEnabled; public TextStatusDisplayItem(String parentID, CharSequence text, BaseStatusListFragment parentFragment, Status status){ super(parentID, parentFragment); @@ -36,6 +51,9 @@ public class TextStatusDisplayItem extends StatusDisplayItem{ spoilerEmojiHelper=new CustomEmojiHelper(); spoilerEmojiHelper.setText(parsedSpoilerText); } + session = AccountSessionManager.getInstance().getAccount(parentFragment.getAccountID()); + instanceInfo = AccountSessionManager.getInstance().getInstanceInfo(session.domain); + translateEnabled = instanceInfo.v2 != null && instanceInfo.v2.configuration.translation != null && instanceInfo.v2.configuration.translation.enabled; } @Override @@ -59,38 +77,73 @@ public class TextStatusDisplayItem extends StatusDisplayItem{ public static class Holder extends StatusDisplayItem.Holder implements ImageLoaderViewHolder{ private final LinkedTextView text; - private final TextView spoilerTitle; - private final View spoilerOverlay; + private final TextView spoilerTitle, translateInfo; + private final View spoilerOverlay, textWrap, translateWrap; + private final Button translateButton; public Holder(Activity activity, ViewGroup parent){ super(activity, R.layout.display_item_text, parent); text=findViewById(R.id.text); spoilerTitle=findViewById(R.id.spoiler_title); spoilerOverlay=findViewById(R.id.spoiler_overlay); + textWrap=findViewById(R.id.text_wrap); + translateWrap=findViewById(R.id.translate_wrap); + translateButton=findViewById(R.id.translate_btn); + translateInfo=findViewById(R.id.translate_info); itemView.setOnClickListener(v->item.parentFragment.onRevealSpoilerClick(this)); } @Override public void onBind(TextStatusDisplayItem item){ - text.setText(item.text); + text.setText(item.translated + ? HtmlParser.parse(item.translation.content, item.status.emojis, item.status.mentions, item.status.tags, item.parentFragment.getAccountID()) + : item.text); text.setTextIsSelectable(item.textSelectable); text.setInvalidateOnEveryFrame(false); + if(!TextUtils.isEmpty(item.status.spoilerText)){ spoilerTitle.setText(item.parsedSpoilerText); if(item.status.spoilerRevealed){ spoilerOverlay.setVisibility(View.GONE); - text.setVisibility(View.VISIBLE); + textWrap.setVisibility(View.VISIBLE); itemView.setClickable(false); }else{ spoilerOverlay.setVisibility(View.VISIBLE); - text.setVisibility(View.INVISIBLE); + textWrap.setVisibility(View.INVISIBLE); itemView.setClickable(true); } }else{ spoilerOverlay.setVisibility(View.GONE); - text.setVisibility(View.VISIBLE); + textWrap.setVisibility(View.VISIBLE); itemView.setClickable(false); } + + translateWrap.setVisibility(item.textSelectable && item.translateEnabled && + !item.status.visibility.isLessVisibleThan(StatusPrivacy.UNLISTED) && + (item.session.preferences == null || !item.status.language.equalsIgnoreCase(item.session.preferences.postingDefaultLanguage)) + ? View.VISIBLE : View.GONE); + translateButton.setText(item.translated ? R.string.translate_show_original : R.string.translate_post); + translateInfo.setText(item.translated ? itemView.getResources().getString(R.string.translated_using, item.translation.provider) : ""); + translateButton.setOnClickListener(v->{ + if (item.translation == null) { + new TranslateStatus(item.status.id).setCallback(new Callback<>() { + @Override + public void onSuccess(TranslatedStatus translatedStatus) { + item.translation = translatedStatus; + item.translated = true; + rebind(); + } + + @Override + public void onError(ErrorResponse error) { + error.showToast(itemView.getContext()); + } + }).exec(item.parentFragment.getAccountID()); + } else { + item.translated = !item.translated; + rebind(); + } + }); } @Override diff --git a/mastodon/src/main/res/layout/display_item_text.xml b/mastodon/src/main/res/layout/display_item_text.xml index 90d06c6a8..baf06cff7 100644 --- a/mastodon/src/main/res/layout/display_item_text.xml +++ b/mastodon/src/main/res/layout/display_item_text.xml @@ -3,23 +3,62 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingLeft="16dp" - android:paddingRight="16dp" android:paddingTop="10dp" android:paddingBottom="12dp"> - + android:orientation="vertical"> + + + + + +