diff --git a/fastlane/metadata/android/be-BY/full_description.txt b/fastlane/metadata/android/be-BY/full_description.txt index 0f54689a5..f702b54fe 100644 --- a/fastlane/metadata/android/be-BY/full_description.txt +++ b/fastlane/metadata/android/be-BY/full_description.txt @@ -2,15 +2,15 @@ Mastodon - гэта найбуйнейшая дэцэнтралізаваная Далучайцеся да супольнасці і стварыце свой профіль. Знаходзьце цікавых людзей, сачыце за імі і чытайце іх допісы ў храналагічнай стужцы без рэкламы. Выяўляйце сябе з дапамогай карыстальніцкіх эмодзі, малюнкаў, GIF-файлаў, відэа і аўдыя ў допісах на 500 знакаў. Удзельнічайце ў абмеркаваннях і прасоўвайце выдатныя допісы ад іншых людзей. Знаходзьце новыя ўліковыя запісы, на якія можна падпісацца, і папулярныя хэштэгі, каб пашырыць сваю сетку. -Mastodon створаны з акцэнтам на прыватнасць і бяспеку. Вырашайце з кім абагульваць вашы допісы: з вашымі падпісчыкамі, толькі з людзьмі, якіх вы згадваеце, або з усім светам. Папярэджанні аб змесце дазваляюць схаваць допісы, якія змяшчаюць канфідэнцыяльны або правакацыйны матэрыял, пакуль вы не будзеце гатовыя да яго. Кожная суполка мае ўласныя правілы і мадэратараў, якія забяспечваюць бяспеку яе ўдзельнікаў, а надзейныя інструменты блакіроўкі і сістэма скарг дапамагаюць прадухіліць злоўжыванні. +Mastodon створаны з акцэнтам на прыватнасць і бяспеку. Вырашайце з кім абагульваць вашы допісы: з вашымі падпісчыкамі, толькі з людзьмі, якіх вы згадваеце або з усім светам. Папярэджанні аб змесціве дазваляюць схаваць допісы, якія змяшчаюць канфідэнцыяльны або правакацыйны матэрыял, пакуль вы не будзеце гатовыя да яго. Кожная суполка мае ўласныя правілы і мадэратараў, якія забяспечваюць бяспеку яе ўдзельнікаў, а надзейныя інструменты блакіроўкі і сістэма скарг дапамагаюць прадухіліць злоўжыванні. Больш функцый: • Цёмны рэжым: чытайце допісы ў светлым, цёмным або сапраўдным чорным рэжыме • Апытанні: пытайцеся ў падпісчыкаў іх меркаванне і падлічвайце галасы -• Даследуйце: папулярныя хэштэгі і ўліковыя запісы даступныя адным націскам +• Даследуйце: папулярныя хэштэгі і ўліковыя запісы — адным дотыкам • Апавяшчэнні: атрымлівайце апавяшчэнні аб новых падпісчыках, адказах і рэпостах • Абагульванне: публікуйце непасрэдна ў Mastodon з любога меню абагульвання ў любой праграме -• Прывабнасць: наш талісман - чароўны слон, і вы будзеце бачыць, як ён з'яўляецца час ад часу +• Прывабнасць: нашым талісманам з'яўляецца чароўны слон, і час ад часу ён будзеце з'яўляцца перад вамі Mastodon з'яўляецца зарэгістраванай некамерцыйнай арганізацыяй і яго развіццё падтрымліваецца непасрэдна вашымі ахвяраваннямі. У нас няма рэкламы, манетызацыі і венчурнага капіталу, і мы плануем так і працягваць. diff --git a/fastlane/metadata/android/el-GR/full_description.txt b/fastlane/metadata/android/el-GR/full_description.txt index 11d74abb1..6f999f707 100644 --- a/fastlane/metadata/android/el-GR/full_description.txt +++ b/fastlane/metadata/android/el-GR/full_description.txt @@ -1,16 +1,16 @@ -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! +Το Mastodon είναι το μεγαλύτερο αποκεντρωμένο κοινωνικό δίκτυο στο διαδίκτυο. Αντί για μία ενιαία ιστοσελίδα, είναι ένα δίκτυο εκατομμυρίων χρηστών σε ανεξάρτητες κοινότητες που μπορούν όλοι να αλληλεπιδράσουν μεταξύ τους, απρόσκοπτα. Δεν έχει σημασία τί σας αρέσει, μπορείτε να συναντήσετε παθιασμένους ανθρώπους να μιλάνε γι' αυτό στο Mastodon! -Join a community and create your profile. Find 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. +Εγγραφείτε σε μια κοινότητα και δημιουργήστε το προφίλ σας. Βρείτε και ακολουθήστε συναρπαστικούς ανθρώπους και διαβάσετε τις αναρτήσεις τους σε μία χωρίς διαφημίσεις, χρονολογική ροή. Εκφραστείτε με προσαρμοσμένα emoji, εικόνες, GIF, βίντεο και ήχο σε αναρτήσεις 500 χαρακτήρων. Απαντήστε σε νήματα και παραθέστε αναρτήσεις από οποιονδήποτε για να μοιραστείτε μεγάλα πράγματα. Βρείτε νέους λογαριασμούς για να ακολουθήσετε και δημοφιλείς ετικέτες για να επεκτείνετε το δίκτυό σας. -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. +Το Mastodon είναι κατασκευασμένο με έμφαση στην ιδιωτικότητα και την ασφάλεια. Αποφασίστε αν οι αναρτήσεις σας μοιράζονται με τους ακόλουθούς σας, μόνο τα άτομα που αναφέρετε ή ολόκληρο τον κόσμο. Προειδοποιήσεις περιεχομένου σας επιτρέπουν να κρύψετε αναρτήσεις που περιέχουν ευαίσθητο ή ανησυχητικό υλικό μέχρι να είστε έτοιμοι να συμμετάσχετε μαζί τους. Κάθε κοινότητα έχει τις δικές της οδηγίες και συντονιστές για να κρατήσει τα μέλη της ασφαλή και ισχυρά εργαλεία αποκλεισμού και αναφοράς βοηθούν στην πρόληψη της κατάχρησης. -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 από οποιαδήποτε καρτέλα κοινής χρήσης σε οποιαδήποτε εφαρμογή +• Χάρη: Η μασκότ μας είναι ένας αξιολάτρευτος ελέφαντας και θα τον δείτε να εμφανίζεται πού και πού -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. +Το Mastodon είναι μη κερδοσκοπική και η ανάπτυξη υποστηρίζεται άμεσα από τις δωρεές σας. Δεν υπάρχουν διαφημίσεις, δεν γίνεται δημιουργία εσόδων και χωρίς επιχειρηματικά κεφάλαια και σκοπεύουμε να το διατηρήσουμε έτσι. diff --git a/fastlane/metadata/android/el-GR/short_description.txt b/fastlane/metadata/android/el-GR/short_description.txt index 8f5a9b847..f67c145d0 100644 --- a/fastlane/metadata/android/el-GR/short_description.txt +++ b/fastlane/metadata/android/el-GR/short_description.txt @@ -1 +1 @@ -Decentralized social network \ No newline at end of file +Αποκεντρωμένο κοινωνικό δίκτυο \ No newline at end of file diff --git a/fastlane/metadata/android/ja-JP/full_description.txt b/fastlane/metadata/android/ja-JP/full_description.txt index 16b9652d1..510abe7fe 100644 --- a/fastlane/metadata/android/ja-JP/full_description.txt +++ b/fastlane/metadata/android/ja-JP/full_description.txt @@ -1,8 +1,8 @@ -Mastodonは、インターネット上で最大の分散型ソーシャルネットワークです。 Mastodonは単一のウェブサイトではなく、それぞれ独立したコミュニティに参加している何百万人ものユーザーによって構成されたネットワークなのです。ユーザーたちはその中で、誰もがお互いとシームレスにやり取りできます。 あなたの興味関心がどんな分野にあっても、きっとMastodonのどこかで同じ情熱を投稿している仲間がいますよ! +Mastodonは、インターネット上で最大の分散型ソーシャルネットワークです。 Mastodonは単一のウェブサイトではなく、それぞれ独立したコミュニティに参加している何百万人ものユーザーによって構成されたネットワークなのです。ユーザーたちはその中で、誰もがお互いとシームレスにやり取りできます。 あなたの興味関心がどんな分野にあっても、きっとMastodonのどこかで同じ情熱を投稿している仲間がいることでしょう。 -まずはコミュニティに参加して、自分のプロフィールを作成しましょう。 Find and follow fascinating folks and read their posts in an ad-free, chronological timeline. あるいは、500文字まで使える投稿で自分を表現してみましょう。カスタム絵文字や画像、GIF、動画、音声も使用できます。 スレッドに返事したり、他の誰かの面白い投稿をブーストして共有したりすることもできます。 新しいアカウントとホットなタグを見つけて、あなた自身のネットワークを広げていきましょう! +まずはコミュニティに参加して、自分のプロフィールを作成しましょう。 魅力的なユーザーを見つけたら、フォローしてタイムラインで投稿を見てみましょう。タイムラインに広告は出てきません。順番も時系列順です。 そして、500文字まで使える投稿で自分を表現してみましょう。カスタム絵文字や画像、GIF、動画、音声も使用できます。 スレッドに返事したり、他の誰かの面白い投稿をブーストして共有したりすることもできます。 興味のあるアカウントとホットなハッシュタグをどんどん見つけて、あなた自身のネットワークを広げていきましょう。 -Mastondonはプライバシーと安全性を重視しています。 自分の投稿をフォロワー限定公開にするのか、メンションした特定のユーザーにだけ共有するのか、全世界に大放流するのかは、すべてあなた次第。 また、入力中の投稿について「ちょっとセンシティブな内容だな」と思ったら、閲覧注意機能で内容を伏せることで、見たくない人に配慮した投稿が作成できます。 そして、各コミュニティにはそれぞれのガイドラインと管理者・モデレーターが存在し、コミュニティメンバーの安全を守っています。強力なブロック・通報機能も、不正利用の防止をお手伝いします。 +Mastondonはプライバシーと安全性を重視しています。 自分の投稿をフォロワーだけに限定公開にするのか、メンションした特定のユーザーだけに共有するのか、全世界に放流するのか、自由に決められます。 また、入力中の投稿について「ちょっとセンシティブな内容だな」と思ったら、閲覧注意機能で内容を伏せることで、見たくない人に配慮した投稿が作成できます。 そして、各コミュニティにはそれぞれのガイドラインと管理者・モデレーターが存在し、コミュニティメンバーの安全を守っています。強力なブロック・通報機能も、不正利用の防止をお手伝いします。 その他の機能: diff --git a/fastlane/metadata/android/ru-RU/full_description.txt b/fastlane/metadata/android/ru-RU/full_description.txt index 4139e9a5b..01db6f1a1 100644 --- a/fastlane/metadata/android/ru-RU/full_description.txt +++ b/fastlane/metadata/android/ru-RU/full_description.txt @@ -1,16 +1,16 @@ Mastodon — это крупнейшая распределённая социальная сеть в интернете. Вместо одного сайта, это сеть из независимых сообществ с миллионами пользователей, которые могут бесшовно взаимодействовать друг с другом. Вне зависимости от того, чем вы увлекаетесь, вы всегда найдёте себе единомышленников в Mastodon! -Вступите в сообщество по интересу и создайте свой профиль. Find and follow fascinating folks and read their posts in an ad-free, chronological timeline. Выражайте себя в 500-символьных постах, дополняя их пользовательскими эмодзи, изображениями, гифками, видео и аудио. Участвуйте в обсуждениях и продвигайте отличные посты от других людей. Расширяйте свой кругозор, находя новых интересных людей и следя за актуальными хэштегами. +Вступите в сообщество по интересу и создайте свой профиль. Ищите и подписывайтесь на увлекательных пользователей, читайте их посты без рекламы в хронологической ленте. Выражайте себя в 500-символьных постах, дополняя их пользовательскими эмодзи, изображениями, гифками, видео и аудио. Участвуйте в обсуждениях и продвигайте отличные посты от других людей. Расширяйте свой кругозор, находя новых интересных людей и следя за актуальными хэштегами. Mastodon создан с акцентом на конфиденциальность и безопасность. Решайте с кем вы хотите поделиться своими постами: своими подписчиками, только упомянутыми людьми или же вообще со всем миром. Предупреждения о содержимом позволят вам скрыть посты содержащие материалы деликатного или шокирующего характера. В каждом сообществе свои правила и модераторы, следящие за порядком, а надёжные инструменты блокировки и система жалоб помогают предотвращать злоупотребление. Ещё больше возможностей: • Темы на любой вкус: читайте посты в светлом, тёмном или OLED режимах -• Спрашивайте мнение подписчиков и подсчитывайте их голоса с опросами -• Найдите актуальные хэштеги, интересные посты и профили во вкладке «Обзор» -• Будьте в курсе происходящего с уведомлениями о новых подписчиках, ответах и продвижениях +• Опросы: спрашивайте мнение подписчиков и подсчитывайте их голоса +• Обзор: в одно касание найдите актуальные хэштеги, посты и профили +• Уведомления: узнавайте о новых подписках, ответах и продвижениях • Делитесь в Mastodon содержимым из любого приложения -• Умиляйтесь с нашим талисманом, восхитительным слонёнком, которого можно встретить и тут и там +• Милота: Наш талисман является восхитительным слоном, и вы будете видеть его время от времени Mastodon является зарегистрированной некоммерческой организацией, его разработка поддерживается непосредственно вашими пожертвованиями. У нас нет рекламы, монетизации и венчурного капитала, и мы не планируем это менять. diff --git a/fastlane/metadata/android/ru-RU/short_description.txt b/fastlane/metadata/android/ru-RU/short_description.txt index 62e451d16..b95eb0558 100644 --- a/fastlane/metadata/android/ru-RU/short_description.txt +++ b/fastlane/metadata/android/ru-RU/short_description.txt @@ -1 +1 @@ -Распределённая социальная сеть \ No newline at end of file +Децентрализованная социальная сеть \ No newline at end of file diff --git a/fastlane/metadata/android/tr-TR/full_description.txt b/fastlane/metadata/android/tr-TR/full_description.txt index 17bc9435e..97da30b82 100644 --- a/fastlane/metadata/android/tr-TR/full_description.txt +++ b/fastlane/metadata/android/tr-TR/full_description.txt @@ -1,6 +1,6 @@ Mastodon, internetteki merkezi olmayan en büyük sosyal ağdır. Tek bir web siteye bağlı kalmaksızın, milyonlarca kullanıcının bağımsız olarak birbiri ile kolayca etkileşebileceği bir ağdır. Hangi konuyla ilgili olduğun önemli değil, Mastodon'da onunla ilgili gönderi paylaşan tutkulu insanlarla tanışabilirsin! -Bir topluluğa katıl ve profilini oluştur. Find and follow fascinating folks and read their posts in an ad-free, chronological timeline. Gönderilerinde 500 karakter sınırlamasıyla kendini emojiler, görseller, GIFler, videolar ve sesler ile ifade et. Harika içerikler paylaşmak için başlıklara yanıt yaz, insanların gönderilerini yeniden paylaş. Ağınızı genişletmek için takip edilecek yeni hesaplar ve hashtagler bul. +Bir topluluğa katıl ve profilini oluştur. Olağanüstü kişileri bul ve takip et; gönderilerini reklamsız ve kronolojik bir akışta oku. Gönderilerinde 500 karakter sınırlamasıyla kendini emojiler, görseller, GIFler, videolar ve sesler ile ifade et. Harika içerikler paylaşmak için başlıklara yanıt yaz, insanların gönderilerini yeniden paylaş. Ağınızı genişletmek için takip edilecek yeni hesaplar ve hashtagler bul. Mastodon gizlilik ve güvenlik odaklı yapılmıştır. Her postunuz için takipçilerinizle mi, bahsettiğiniz kişilerle mi ya da tüm dünyayla mı paylaşılacağına karar verin. Gönderi uyarıları, hassas ve tetikleyici olabilecek içerikleri kişi görmeyi hazır olana kadar gizler. Her topluluk, üyelerini güvende tutmak için kendi kurallarına ve moderatörlerine; istismarı önlemek için de güçlü engelleme ve bildirme araçlarına sahiptir. diff --git a/fastlane/metadata/android/ur-IN/full_description.txt b/fastlane/metadata/android/ur-IN/full_description.txt new file mode 100644 index 000000000..11d74abb1 --- /dev/null +++ b/fastlane/metadata/android/ur-IN/full_description.txt @@ -0,0 +1,16 @@ +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 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. diff --git a/fastlane/metadata/android/ur-IN/short_description.txt b/fastlane/metadata/android/ur-IN/short_description.txt new file mode 100644 index 000000000..8f5a9b847 --- /dev/null +++ b/fastlane/metadata/android/ur-IN/short_description.txt @@ -0,0 +1 @@ +Decentralized social network \ No newline at end of file diff --git a/fastlane/metadata/android/ur-IN/title.txt b/fastlane/metadata/android/ur-IN/title.txt new file mode 100644 index 000000000..8123241a0 --- /dev/null +++ b/fastlane/metadata/android/ur-IN/title.txt @@ -0,0 +1 @@ +Mastodon \ No newline at end of file diff --git a/fastlane/metadata/android/zh-TW/full_description.txt b/fastlane/metadata/android/zh-TW/full_description.txt index e3c329055..62315058a 100644 --- a/fastlane/metadata/android/zh-TW/full_description.txt +++ b/fastlane/metadata/android/zh-TW/full_description.txt @@ -1,4 +1,4 @@ -Mastodon 是網際網路上最大的去中心化社交網路。 它是一個由能無縫互動的獨立社群中,數百萬使用者組成的網路,而非單一網站。 無論您對什麼事情感興趣,您都能在 Mastodon 上遇到充滿熱情的人們討論該話題。 它是一個由能無縫互動的獨立社群中,數百萬使用者組成的網路,而非單一網站。 Mastodon 以隱私與安全為要。 決定您的嘟文要與您的跟隨者分享、只與您提及的人們分享,又或是與全世界分享。 內容警告可讓您隱藏包含敏感或可能觸發強烈情緒反應的嘟文,直到您準備好與它們進行互動。 每個社群都有它們自己的指導方針與管理原來確保其成員安全,強大的封鎖與回報工具有助於防止濫用。 +Mastodon 是網際網路上最大的去中心化社群網路。 它是一個由能無縫互動的獨立社群中,數百萬使用者組成的網路,而非單一網站。 無論您對什麼事情感興趣,您都能在 Mastodon 上遇到充滿熱情的人們討論該話題。 加入社群並建立您的個人檔案。 尋找並跟隨迷人的朋友們,並在無廣告、按時間順序排列的時間軸上閱讀他們的嘟文。 在 500 個字元的嘟文中使用自訂表情符號、GIF、視訊與音訊來表達您自己。 回覆任何人的話題與轉發貼文以分享精彩內容。 尋找要跟隨的新帳號與熱門主題標籤來拓展您的網路。 diff --git a/mastodon/build.gradle b/mastodon/build.gradle index 96a7ef374..69409dbea 100644 --- a/mastodon/build.gradle +++ b/mastodon/build.gradle @@ -9,10 +9,10 @@ android { applicationId "org.joinmastodon.android" minSdk 23 targetSdk 33 - versionCode 52 + versionCode 53 versionName "1.3.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - resConfigs "ar-rSA", "be-rBY", "bn-rBD", "bs-rBA", "ca-rES", "cs-rCZ", "da-rDK", "de-rDE", "el-rGR", "es-rES", "eu-rES", "fa-rIR", "fi-rFI", "fil-rPH", "fr-rFR", "ga-rIE", "gd-rGB", "gl-rES", "hi-rIN", "hr-rHR", "hu-rHU", "hy-rAM", "ig-rNG", "in-rID", "is-rIS", "it-rIT", "iw-rIL", "ja-rJP", "kab", "ko-rKR", "my-rMM", "nl-rNL", "no-rNO", "oc-rFR", "pl-rPL", "pt-rBR", "pt-rPT", "ro-rRO", "ru-rRU", "si-rLK", "sl-rSI", "sv-rSE", "th-rTH", "tr-rTR", "uk-rUA", "vi-rVN", "zh-rCN", "zh-rTW" + resConfigs "ar-rSA", "be-rBY", "bn-rBD", "bs-rBA", "ca-rES", "cs-rCZ", "da-rDK", "de-rDE", "el-rGR", "es-rES", "eu-rES", "fa-rIR", "fi-rFI", "fil-rPH", "fr-rFR", "ga-rIE", "gd-rGB", "gl-rES", "hi-rIN", "hr-rHR", "hu-rHU", "hy-rAM", "ig-rNG", "in-rID", "is-rIS", "it-rIT", "iw-rIL", "ja-rJP", "kab", "ko-rKR", "my-rMM", "nl-rNL", "no-rNO", "oc-rFR", "pl-rPL", "pt-rBR", "pt-rPT", "ro-rRO", "ru-rRU", "si-rLK", "sl-rSI", "sv-rSE", "th-rTH", "tr-rTR", "uk-rUA", "ur-rIN", "vi-rVN", "zh-rCN", "zh-rTW" } buildTypes { diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/SplashFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/SplashFragment.java index 5359eea81..6b6097458 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/SplashFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/SplashFragment.java @@ -1,20 +1,13 @@ package org.joinmastodon.android.fragments; -import android.graphics.Canvas; -import android.graphics.Paint; import android.graphics.drawable.ColorDrawable; -import android.graphics.drawable.Drawable; import android.os.Bundle; -import android.text.SpannableString; -import android.text.style.ReplacementSpan; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.view.WindowInsets; import android.widget.Button; -import android.widget.LinearLayout; -import android.widget.TextView; import org.joinmastodon.android.MastodonApp; import org.joinmastodon.android.R; @@ -28,10 +21,7 @@ import org.joinmastodon.android.ui.utils.UiUtils; import org.joinmastodon.android.ui.views.SizeListenerFrameLayout; import org.parceler.Parcels; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.recyclerview.widget.RecyclerView; -import androidx.viewpager2.widget.ViewPager2; import me.grishka.appkit.Nav; import me.grishka.appkit.api.Callback; import me.grishka.appkit.api.ErrorResponse; @@ -74,11 +64,12 @@ public class SplashFragment extends AppKitFragment{ artContainer=contentView.findViewById(R.id.art_container); blueFill=contentView.findViewById(R.id.blue_fill); greenFill=contentView.findViewById(R.id.green_fill); - motionEffect.addViewEffect(new InterpolatingMotionEffect.ViewEffect(contentView.findViewById(R.id.art_clouds), V.dp(-5), V.dp(5), V.dp(-5), V.dp(5))); - motionEffect.addViewEffect(new InterpolatingMotionEffect.ViewEffect(contentView.findViewById(R.id.art_right_hill), V.dp(-15), V.dp(25), V.dp(-10), V.dp(10))); - motionEffect.addViewEffect(new InterpolatingMotionEffect.ViewEffect(contentView.findViewById(R.id.art_left_hill), V.dp(-25), V.dp(15), V.dp(-15), V.dp(15))); - motionEffect.addViewEffect(new InterpolatingMotionEffect.ViewEffect(contentView.findViewById(R.id.art_center_hill), V.dp(-14), V.dp(14), V.dp(-5), V.dp(25))); - motionEffect.addViewEffect(new InterpolatingMotionEffect.ViewEffect(contentView.findViewById(R.id.art_plane_elephant), V.dp(-20), V.dp(12), V.dp(-20), V.dp(12))); + motionEffect.addViewEffect(new InterpolatingMotionEffect.ViewEffect(artClouds, V.dp(-5), V.dp(5), V.dp(-5), V.dp(5))); + motionEffect.addViewEffect(new InterpolatingMotionEffect.ViewEffect(artRightHill, V.dp(-15), V.dp(25), V.dp(-10), V.dp(10))); + motionEffect.addViewEffect(new InterpolatingMotionEffect.ViewEffect(artLeftHill, V.dp(-25), V.dp(15), V.dp(-15), V.dp(15))); + motionEffect.addViewEffect(new InterpolatingMotionEffect.ViewEffect(artCenterHill, V.dp(-14), V.dp(14), V.dp(-5), V.dp(25))); + motionEffect.addViewEffect(new InterpolatingMotionEffect.ViewEffect(artPlaneElephant, V.dp(-20), V.dp(12), V.dp(-20), V.dp(12))); + artContainer.setOnTouchListener(motionEffect); contentView.setSizeListener(new SizeListenerFrameLayout.OnSizeChangedListener(){ @Override @@ -177,61 +168,4 @@ public class SplashFragment extends AppKitFragment{ super.onHidden(); motionEffect.deactivate(); } - - private class PagerAdapter extends RecyclerView.Adapter{ - - @NonNull - @Override - public PagerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){ - return new PagerViewHolder(viewType); - } - - @Override - public void onBindViewHolder(@NonNull PagerViewHolder holder, int position){} - - @Override - public int getItemCount(){ - return 3; - } - - @Override - public int getItemViewType(int position){ - return position; - } - } - - private class PagerViewHolder extends RecyclerView.ViewHolder{ - public PagerViewHolder(int page){ - super(new LinearLayout(getActivity())); - LinearLayout ll=(LinearLayout) itemView; - ll.setOrientation(LinearLayout.VERTICAL); - int pad=V.dp(16); - ll.setPadding(pad, pad, pad, pad); - ll.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); - - TextView title=new TextView(getActivity()); - title.setTextAppearance(R.style.m3_headline_medium); - title.setText(switch(page){ - case 0 -> getString(R.string.welcome_page1_title); - case 1 -> getString(R.string.welcome_page2_title); - case 2 -> getString(R.string.welcome_page3_title); - default -> throw new IllegalStateException("Unexpected value: "+page); - }); - title.setTextColor(0xFF17063B); - LinearLayout.LayoutParams lp=new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, V.dp(page==0 ? 46 : 36)); - lp.bottomMargin=V.dp(page==0 ? 4 : 14); - ll.addView(title, lp); - - TextView text=new TextView(getActivity()); - text.setTextAppearance(R.style.m3_body_medium); - text.setText(switch(page){ - case 0 -> R.string.welcome_page1_text; - case 1 -> R.string.welcome_page2_text; - case 2 -> R.string.welcome_page3_text; - default -> throw new IllegalStateException("Unexpected value: "+page); - }); - text.setTextColor(0xFF17063B); - ll.addView(text, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); - } - } } diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/InterpolatingMotionEffect.java b/mastodon/src/main/java/org/joinmastodon/android/ui/InterpolatingMotionEffect.java index 1302aa65d..4221d1c29 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/InterpolatingMotionEffect.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/InterpolatingMotionEffect.java @@ -1,17 +1,25 @@ package org.joinmastodon.android.ui; +import android.annotation.SuppressLint; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; +import android.view.MotionEvent; import android.view.Surface; import android.view.View; import android.view.WindowManager; +import android.view.animation.PathInterpolator; import java.util.ArrayList; -public class InterpolatingMotionEffect implements SensorEventListener{ +import androidx.dynamicanimation.animation.DynamicAnimation; +import androidx.dynamicanimation.animation.FloatValueHolder; +import androidx.dynamicanimation.animation.SpringAnimation; +import androidx.dynamicanimation.animation.SpringForce; + +public class InterpolatingMotionEffect implements SensorEventListener, View.OnTouchListener{ private SensorManager sm; private WindowManager wm; @@ -20,6 +28,34 @@ public class InterpolatingMotionEffect implements SensorEventListener{ private Sensor accelerometer; private boolean accelerometerEnabled; private ArrayList views=new ArrayList<>(); + private float pitch, roll; + private float touchDownX, touchDownY, touchAddX, touchAddY, touchAddLastAnimX, touchAddLastAnimY; + private PathInterpolator touchInterpolator=new PathInterpolator(0.5f, 1f, 0.89f, 1f); + private SpringAnimation touchSpringX, touchSpringY; + private FloatValueHolder touchSpringXHolder=new FloatValueHolder(){ + @Override + public float getValue(){ + return touchAddX; + } + + @Override + public void setValue(float value){ + touchAddX=value; + updateEffects(); + } + }; + private FloatValueHolder touchSpringYHolder=new FloatValueHolder(){ + @Override + public float getValue(){ + return touchAddY; + } + + @Override + public void setValue(float value){ + touchAddY=value; + updateEffects(); + } + }; public InterpolatingMotionEffect(Context context){ sm=context.getSystemService(SensorManager.class); @@ -50,8 +86,8 @@ public class InterpolatingMotionEffect implements SensorEventListener{ float z=event.values[2]/SensorManager.GRAVITY_EARTH; - float pitch=(float) (Math.atan2(x, Math.sqrt(y*y+z*z))/Math.PI*2.0); - float roll=(float) (Math.atan2(y, Math.sqrt(x*x+z*z))/Math.PI*2.0); + pitch=(float) (Math.atan2(x, Math.sqrt(y*y+z*z))/Math.PI*2.0); + roll=(float) (Math.atan2(y, Math.sqrt(x*x+z*z))/Math.PI*2.0); switch(rotation){ case Surface.ROTATION_0: @@ -88,9 +124,7 @@ public class InterpolatingMotionEffect implements SensorEventListener{ }else if(roll<-1f){ roll=-2f-roll; } - for(ViewEffect view:views){ - view.update(pitch, roll); - } + updateEffects(); } @Override @@ -110,6 +144,62 @@ public class InterpolatingMotionEffect implements SensorEventListener{ views.clear(); } + @SuppressLint("ClickableViewAccessibility") + @Override + public boolean onTouch(View v, MotionEvent ev){ + switch(ev.getAction()){ + case MotionEvent.ACTION_DOWN -> { + if(touchSpringX!=null){ + touchAddLastAnimX=touchAddX; + touchSpringX.cancel(); + touchSpringX=null; + }else{ + touchAddLastAnimX=0; + } + if(touchSpringY!=null){ + touchAddLastAnimY=touchAddY; + touchSpringY.cancel(); + touchSpringY=null; + }else{ + touchAddLastAnimY=0; + } + touchDownX=ev.getX(); + touchDownY=ev.getY(); + } + case MotionEvent.ACTION_MOVE -> { + touchAddX=touchInterpolator.getInterpolation(Math.min(1f, Math.abs((ev.getX()-touchDownX)/(v.getWidth()/2f)))); + touchAddY=touchInterpolator.getInterpolation(Math.min(1f, Math.abs((ev.getY()-touchDownY)/(v.getHeight()/2f)))); + if(ev.getX()>touchDownX) + touchAddX=-touchAddX; + if(ev.getY() { + touchSpringX=new SpringAnimation(touchSpringXHolder, 0f); + touchSpringX.setMinimumVisibleChange(0.01f); + touchSpringX.getSpring().setStiffness(SpringForce.STIFFNESS_LOW).setDampingRatio(0.85f); + touchSpringX.addEndListener((animation, canceled, value, velocity)->touchSpringX=null); + touchSpringX.start(); + touchSpringY=new SpringAnimation(touchSpringYHolder, 0f); + touchSpringY.setMinimumVisibleChange(0.01f); + touchSpringY.getSpring().setStiffness(SpringForce.STIFFNESS_LOW).setDampingRatio(0.85f); + touchSpringY.addEndListener((animation, canceled, value, velocity)->touchSpringY=null); + touchSpringY.start(); + updateEffects(); + } + } + return true; + } + + private void updateEffects(){ + for(ViewEffect view:views){ + view.update(Math.min(1f, Math.max(-1f, pitch+touchAddX)), Math.min(1f, Math.max(-1f, roll+touchAddY))); + } + } + public static class ViewEffect{ private View view; private float minX, maxX, minY, maxY; diff --git a/mastodon/src/main/res/drawable/bg_button_m3_outlined_white.xml b/mastodon/src/main/res/drawable/bg_button_m3_outlined_white.xml new file mode 100644 index 000000000..99a5afc4b --- /dev/null +++ b/mastodon/src/main/res/drawable/bg_button_m3_outlined_white.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mastodon/src/main/res/drawable/bg_button_m3_text_white.xml b/mastodon/src/main/res/drawable/bg_button_m3_text_white.xml new file mode 100644 index 000000000..24dc754fd --- /dev/null +++ b/mastodon/src/main/res/drawable/bg_button_m3_text_white.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/mastodon/src/main/res/layout/fragment_splash.xml b/mastodon/src/main/res/layout/fragment_splash.xml index 497ab5f39..7fcbe1f7a 100644 --- a/mastodon/src/main/res/layout/fragment_splash.xml +++ b/mastodon/src/main/res/layout/fragment_splash.xml @@ -6,7 +6,7 @@ android:layout_height="match_parent" android:fitsSystemWindows="true" android:clipToPadding="false" - android:theme="@style/Theme.Mastodon.Dark"> + android:theme="@style/Theme.Mastodon.Dark.SplashFragment"> @@ -137,7 +139,7 @@ android:layout_height="1dp" android:layout_weight="1" android:layout_gravity="center_vertical" - android:background="?colorM3Secondary"/> + android:background="#B2FFFFFF"/> @@ -155,7 +157,7 @@ android:layout_height="1dp" android:layout_weight="1" android:layout_gravity="center_vertical" - android:background="?colorM3Secondary"/> + android:background="#B2FFFFFF"/> @@ -172,7 +174,9 @@ android:layout_height="wrap_content" android:layout_margin="8dp" android:layout_weight="1" + android:textColor="#FFF" style="@style/Widget.Mastodon.M3.Button.Text" + android:background="@drawable/bg_button_m3_text_white" android:text="@string/learn_more"/>