Compare commits

...

376 Commits

Author SHA1 Message Date
LucasGGamerM
03cb0b3c47 fix: fix missing app icon for stable builds 2023-09-29 17:14:39 -03:00
LucasGGamerM
53c454a59b build: fix oopsie where I forgot to increase the version code as well 2023-09-29 16:57:43 -03:00
LucasGGamerM
d21ae9d94e build: bump version 2023-09-29 16:35:23 -03:00
LucasGGamerM
453f082822 Merge remote-tracking branch 'megalodon_weblate/main'
# Conflicts:
#	mastodon/src/main/res/values-pt-rBR/strings_sk.xml
#	metadata/ar/short_description.txt
#	metadata/id/changelogs/67.txt
2023-09-29 16:29:16 -03:00
LucasGGamerM
23843e9002 fix: use built-in appkit empty view styles entry and remove hack to apply colors to the empty view texts 2023-09-29 16:23:33 -03:00
LucasGGamerM
232d2e7e6d build: upgrade to appkit 1.2.14 2023-09-29 16:23:33 -03:00
LucasGGamerM
e9d73cbe32 build(CI): use LucasGGamerM's appkit repo 2023-09-29 16:17:14 -03:00
LucasGGamerM
4bb0597edf Merge remote-tracking branch 'mastodon/master'
# Conflicts:
#	mastodon/build.gradle
2023-09-29 07:56:14 -03:00
Grishka
a00afd5d7f Same crash fix in 2 more places ugh 2023-09-29 03:20:58 +03:00
LucasGGamerM
796bdf2893 Merge pull request #264 from Xen4n/master
Posts divider brightness fix (now looks like in settings and profile)
2023-09-28 19:25:11 -03:00
Xen4n
5b7868b44e Posts divider brightness fix (now looks like in settings and profile) 2023-09-28 23:52:35 +02:00
LucasGGamerM
66e67231c8 build: revert appkit to 1.2.9 and gson to 2.9.0 for app stability's sake 2023-09-28 15:31:31 -03:00
LucasGGamerM
58be2214a4 Merge remote-tracking branch 'mastodon/master'
# Conflicts:
#	mastodon/build.gradle
#	mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java
2023-09-28 15:19:32 -03:00
LucasGGamerM
72a370aa84 fix(nord-theme): fix nord theme pill color 2023-09-28 14:20:14 -03:00
Grishka
9a41a2d6fb Merge branch 'l10n_master' 2023-09-28 20:14:21 +03:00
LucasGGamerM
2629e0039c chore: remove untested privacy settings category 2023-09-28 14:11:43 -03:00
Grishka
2cd98a6620 More crash fixes 2023-09-28 20:11:43 +03:00
LucasGGamerM
24048a677f fix: make app compile again (again) 2023-09-28 14:07:31 -03:00
Grishka
283b56be5b Finally fix the mysterious RecyclerView crash 2023-09-28 19:56:25 +03:00
LucasGGamerM
debf8c52a1 Merge remote-tracking branch 'mastodon/master'
# Conflicts:
#	fastlane/metadata/android/fi-FI/full_description.txt
#	fastlane/metadata/android/th-TH/full_description.txt
#	mastodon/build.gradle
#	mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java
#	mastodon/src/main/java/org/joinmastodon/android/api/requests/statuses/TranslateStatus.java
#	mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSession.java
#	mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSessionManager.java
#	mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java
#	mastodon/src/main/java/org/joinmastodon/android/fragments/FeaturedHashtagsListFragment.java
#	mastodon/src/main/java/org/joinmastodon/android/fragments/HashtagTimelineFragment.java
#	mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFeaturedFragment.java
#	mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java
#	mastodon/src/main/java/org/joinmastodon/android/fragments/ThreadFragment.java
#	mastodon/src/main/java/org/joinmastodon/android/fragments/discover/SearchFragment.java
#	mastodon/src/main/java/org/joinmastodon/android/fragments/discover/SearchQueryFragment.java
#	mastodon/src/main/java/org/joinmastodon/android/fragments/discover/TrendingHashtagsFragment.java
#	mastodon/src/main/java/org/joinmastodon/android/fragments/settings/SettingsMainFragment.java
#	mastodon/src/main/java/org/joinmastodon/android/model/Status.java
#	mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/HeaderStatusDisplayItem.java
#	mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/TextStatusDisplayItem.java
#	mastodon/src/main/java/org/joinmastodon/android/ui/text/HtmlParser.java
#	mastodon/src/main/java/org/joinmastodon/android/ui/text/LinkSpan.java
#	mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java
#	mastodon/src/main/java/org/joinmastodon/android/ui/viewcontrollers/ComposePollViewController.java
#	mastodon/src/main/res/layout/display_item_text.xml
#	mastodon/src/main/res/menu/post.xml
#	mastodon/src/main/res/values/styles.xml
2023-09-28 13:52:48 -03:00
LucasGGamerM
7fdea9710f fix: make app compile again 2023-09-28 13:52:04 -03:00
Grishka
d2de62ee55 Probably fix #703 2023-09-28 13:33:59 -03:00
Grishka
d706768112 Fix #682 2023-09-28 13:29:16 -03:00
Grishka
1614213aae Fix #683 2023-09-28 13:27:20 -03:00
Grishka
3045fe0357 Probably need to set this too 2023-09-28 13:27:20 -03:00
Grishka
5a35be0ebd Specify LED color for notifications
closes #695
2023-09-28 13:27:20 -03:00
Grishka
22b1cd0d0b Crash fixes 2023-09-28 13:26:06 -03:00
Eugen Rochko
49f10bacb3 New translations strings.xml (Turkish) 2023-09-28 13:24:59 -03:00
Eugen Rochko
2926e5096e New translations strings.xml (Chinese Traditional) 2023-09-28 13:24:59 -03:00
Eugen Rochko
361f27d5df New translations strings.xml (Filipino) 2023-09-28 13:24:59 -03:00
Grishka
d068093c5a Add a tool to detect invalid formatting in localized strings 2023-09-28 13:24:27 -03:00
Eugen Rochko
3bea1b7f3e New translations strings.xml (Filipino) 2023-09-28 13:24:26 -03:00
Eugen Rochko
5a34d9ffce New translations strings.xml (Greek) 2023-09-28 13:23:35 -03:00
Eugen Rochko
240754b70a New translations strings.xml (Turkish) 2023-09-28 13:23:34 -03:00
Eugen Rochko
7973ad7042 New translations strings.xml (Chinese Simplified) 2023-09-28 13:23:34 -03:00
Eugen Rochko
8446dbe05d New translations strings.xml (Japanese) 2023-09-28 13:23:34 -03:00
Eugen Rochko
7b0313cc69 New translations strings.xml (Japanese) 2023-09-28 13:23:23 -03:00
Grishka
994ae0242c Fix indexable setting 2023-09-28 13:23:22 -03:00
Eugen Rochko
fd34be3c66 New translations strings.xml (Russian) 2023-09-28 13:23:22 -03:00
Grishka
20785d53fe Fix custom emojis in names setting 2023-09-28 13:23:05 -03:00
Eugen Rochko
3cc1748231 New translations strings.xml (Slovenian) 2023-09-28 13:22:54 -03:00
Eugen Rochko
079112b905 New translations strings.xml (Japanese) 2023-09-28 13:22:54 -03:00
Eugen Rochko
38aa55b371 New translations strings.xml (Japanese) 2023-09-28 13:22:53 -03:00
Eugen Rochko
e07c01018b New translations strings.xml (Russian) 2023-09-28 13:22:53 -03:00
Eugen Rochko
08de4525eb New translations strings.xml (Italian) 2023-09-28 13:22:53 -03:00
Eugen Rochko
062dca6a77 New translations strings.xml (Thai) 2023-09-28 13:22:53 -03:00
Eugen Rochko
d9abb8dfa1 New translations strings.xml (Icelandic) 2023-09-28 13:22:53 -03:00
Eugen Rochko
5bcbe19435 New translations strings.xml (Persian) 2023-09-28 13:22:52 -03:00
Eugen Rochko
955b985d1a New translations strings.xml (Swedish) 2023-09-28 13:22:31 -03:00
Grishka
6d6ab789a3 Privacy settings 2023-09-28 13:22:30 -03:00
Grishka
ad8be2f7a3 Scroll profile tab views to top when tab is reselected 2023-09-28 13:13:33 -03:00
Eugen Rochko
64be55e406 New translations strings.xml (French) 2023-09-28 13:09:44 -03:00
Eugen Rochko
6230f32135 New translations strings.xml (Persian) 2023-09-28 13:09:43 -03:00
Eugen Rochko
30db82fc98 New translations strings.xml (Persian) 2023-09-28 13:09:43 -03:00
Eugen Rochko
921589b9bb New translations strings.xml (Vietnamese) 2023-09-28 13:09:43 -03:00
Eugen Rochko
0b0de7a4e3 New translations strings.xml (Italian) 2023-09-28 13:09:42 -03:00
Eugen Rochko
c790eaf9c0 New translations strings.xml (Finnish) 2023-09-28 13:09:42 -03:00
Grishka
2c7cef488b Paginate search results 2023-09-28 13:09:41 -03:00
Grishka
c26603e0ca Crash fixes 2023-09-28 13:08:40 -03:00
Grishka
e1e5c9b0bd Crash fix 2023-09-28 13:08:40 -03:00
Grishka
96f0817c20 Fix #690 2023-09-28 13:07:01 -03:00
Eugen Rochko
e0165a25f4 New translations strings.xml (Arabic) 2023-09-28 13:02:35 -03:00
Eugen Rochko
e465fb944a New translations strings.xml (Arabic) 2023-09-28 13:02:35 -03:00
Eugen Rochko
fb159b5a52 New translations strings.xml (Vietnamese) 2023-09-28 13:02:35 -03:00
Eugen Rochko
1a349f0bb8 New translations strings.xml (Chinese Traditional) 2023-09-28 13:02:31 -03:00
Eugen Rochko
034dfe551c New translations strings.xml (Chinese Traditional) 2023-09-28 13:02:30 -03:00
Eugen Rochko
1f713dc50e New translations strings.xml (Finnish) 2023-09-28 13:02:21 -03:00
Eugen Rochko
258df9546b New translations strings.xml (Thai) 2023-09-28 13:02:21 -03:00
Eugen Rochko
2daabd6a7e New translations strings.xml (Finnish) 2023-09-28 13:02:21 -03:00
Eugen Rochko
1e96b76b33 New translations strings.xml (Dutch) 2023-09-28 13:02:21 -03:00
Eugen Rochko
6dd944341e New translations strings.xml (Dutch) 2023-09-28 13:02:20 -03:00
Eugen Rochko
5dca70c657 New translations strings.xml (Urdu (India)) 2023-09-28 13:02:20 -03:00
Eugen Rochko
c6f2e8151f New translations strings.xml (Kabyle) 2023-09-28 13:02:20 -03:00
Eugen Rochko
99135ebdd6 New translations strings.xml (Igbo) 2023-09-28 13:02:20 -03:00
Eugen Rochko
53348be732 New translations strings.xml (Occitan) 2023-09-28 13:02:20 -03:00
Eugen Rochko
023c1d1598 New translations strings.xml (Scottish Gaelic) 2023-09-28 13:02:20 -03:00
Eugen Rochko
1d0c591cdb New translations strings.xml (Sinhala) 2023-09-28 13:02:20 -03:00
Eugen Rochko
a03482fa53 New translations strings.xml (Bosnian) 2023-09-28 13:02:19 -03:00
Eugen Rochko
bc5fd2530a New translations strings.xml (Filipino) 2023-09-28 13:02:19 -03:00
Eugen Rochko
0ca57c3d72 New translations strings.xml (Burmese) 2023-09-28 13:02:19 -03:00
Eugen Rochko
5d20697e07 New translations strings.xml (Hindi) 2023-09-28 13:02:19 -03:00
Eugen Rochko
2847a1fae0 New translations strings.xml (Croatian) 2023-09-28 13:02:19 -03:00
Eugen Rochko
4bd78f31f2 New translations strings.xml (Thai) 2023-09-28 13:02:19 -03:00
Eugen Rochko
e6281f9bb5 New translations strings.xml (Bengali) 2023-09-28 13:02:18 -03:00
Eugen Rochko
2c83b5aa02 New translations strings.xml (Persian) 2023-09-28 13:02:18 -03:00
Eugen Rochko
586d48c80e New translations strings.xml (Indonesian) 2023-09-28 13:02:18 -03:00
Eugen Rochko
fff2c5a3f5 New translations strings.xml (Portuguese, Brazilian) 2023-09-28 13:02:18 -03:00
Eugen Rochko
3411cf4e56 New translations strings.xml (Icelandic) 2023-09-28 13:02:17 -03:00
Eugen Rochko
e126858e7a New translations strings.xml (Galician) 2023-09-28 13:02:17 -03:00
Eugen Rochko
9e0b40d409 New translations strings.xml (Vietnamese) 2023-09-28 13:02:17 -03:00
Eugen Rochko
e362efb453 New translations strings.xml (Chinese Traditional) 2023-09-28 13:02:17 -03:00
Eugen Rochko
8095d3004a New translations strings.xml (Chinese Simplified) 2023-09-28 13:02:16 -03:00
Eugen Rochko
27f023863b New translations strings.xml (Ukrainian) 2023-09-28 13:02:16 -03:00
Eugen Rochko
af6fae4d86 New translations strings.xml (Turkish) 2023-09-28 13:02:15 -03:00
Eugen Rochko
8119049df1 New translations strings.xml (Swedish) 2023-09-28 13:02:13 -03:00
Eugen Rochko
b5c09a4398 New translations strings.xml (Slovenian) 2023-09-28 13:02:13 -03:00
Eugen Rochko
14df6c4e05 New translations strings.xml (Russian) 2023-09-28 13:02:11 -03:00
Eugen Rochko
5c34d38783 New translations strings.xml (Portuguese) 2023-09-28 13:02:11 -03:00
Eugen Rochko
cfce3595f6 New translations strings.xml (Polish) 2023-09-28 13:02:07 -03:00
Eugen Rochko
411b561a3a New translations strings.xml (Norwegian) 2023-09-28 13:02:04 -03:00
Eugen Rochko
ff9c211f3c New translations strings.xml (Dutch) 2023-09-28 13:02:03 -03:00
Eugen Rochko
c8a650acd4 New translations strings.xml (Korean) 2023-09-28 13:02:01 -03:00
Eugen Rochko
a8cca76392 New translations strings.xml (Japanese) 2023-09-28 13:02:00 -03:00
Eugen Rochko
5e2f653d30 New translations strings.xml (Italian) 2023-09-28 13:01:54 -03:00
Eugen Rochko
418f87999c New translations strings.xml (Armenian) 2023-09-28 13:01:52 -03:00
Eugen Rochko
c330428c07 New translations strings.xml (Hungarian) 2023-09-28 13:01:50 -03:00
Eugen Rochko
119537f45f New translations strings.xml (Hebrew) 2023-09-28 13:01:48 -03:00
Eugen Rochko
9f09b437ab New translations strings.xml (Irish) 2023-09-28 13:01:46 -03:00
Eugen Rochko
1141dd5875 New translations strings.xml (Finnish) 2023-09-28 13:01:45 -03:00
Eugen Rochko
a008a0ac9a New translations strings.xml (Basque) 2023-09-28 13:01:44 -03:00
Eugen Rochko
5cf5267e49 New translations strings.xml (Greek) 2023-09-28 13:01:42 -03:00
Eugen Rochko
df2246b71a New translations strings.xml (German) 2023-09-28 13:01:42 -03:00
Eugen Rochko
7862fefe94 New translations strings.xml (Danish) 2023-09-28 13:01:40 -03:00
Eugen Rochko
b59957bd90 New translations strings.xml (Czech) 2023-09-28 13:01:39 -03:00
Eugen Rochko
e307f1cca2 New translations strings.xml (Catalan) 2023-09-28 13:01:37 -03:00
Eugen Rochko
de185e5a27 New translations strings.xml (Belarusian) 2023-09-28 13:01:36 -03:00
Eugen Rochko
e1fbe2c96e New translations strings.xml (Arabic) 2023-09-28 13:01:36 -03:00
Eugen Rochko
d7babf1e4d New translations strings.xml (Spanish) 2023-09-28 13:01:36 -03:00
Eugen Rochko
1203de0015 New translations strings.xml (French) 2023-09-28 13:01:35 -03:00
Eugen Rochko
e7148acefb New translations strings.xml (Romanian) 2023-09-28 13:01:35 -03:00
Eugen Rochko
88741b0db4 New translations strings.xml (Portuguese, Brazilian) 2023-09-28 13:00:55 -03:00
Eugen Rochko
12f9a11f03 New translations strings.xml (Finnish) 2023-09-28 13:00:55 -03:00
Eugen Rochko
234972352d New translations strings.xml (Finnish) 2023-09-28 13:00:55 -03:00
Eugen Rochko
67448f9de5 New translations strings.xml (Indonesian) 2023-09-28 13:00:54 -03:00
Eugen Rochko
9681256a06 New translations strings.xml (Finnish) 2023-09-28 13:00:53 -03:00
Eugen Rochko
7f44c2ca49 New translations strings.xml (Finnish) 2023-09-28 13:00:53 -03:00
Eugen Rochko
f355919660 New translations strings.xml (Ukrainian) 2023-09-28 13:00:52 -03:00
Eugen Rochko
928f24b460 New translations strings.xml (Finnish) 2023-09-28 13:00:52 -03:00
Eugen Rochko
40e54b165b New translations strings.xml (Finnish) 2023-09-28 13:00:51 -03:00
Eugen Rochko
57d6b33b58 New translations strings.xml (Finnish) 2023-09-28 13:00:51 -03:00
Grishka
6b02a2df68 Fix #658, fix #620 2023-09-28 13:00:51 -03:00
Eugen Rochko
6d56771aba New translations strings.xml (Galician) 2023-09-28 16:51:59 +02:00
LucasGGamerM
56a83e66cd feat(notifications): readd account card for follow notifications 2023-09-28 08:31:21 -03:00
LucasGGamerM
9f17f1600a feat(profile): update unmute icon
This is to be consistent with the mute hashtag icon thingy
2023-09-28 07:43:22 -03:00
Grishka
1724d8a532 Probably fix #703 2023-09-27 19:50:59 +03:00
LucasGGamerM
7b4be83781 refactor(notification-headers): make only avatar and icon be clickable. Also fixes the ripple not being drawn correctly 2023-09-27 12:16:39 -03:00
butterflyoffire
52030b3b2d Translated using Weblate (Arabic)
Currently translated at 76.1% (294 of 386 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/ar/
2023-09-27 07:53:09 +00:00
CDN18
3b36434dff Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (34 of 34 strings)

Translation: Moshidon/metadata
Translate-URL: https://translate.codeberg.org/projects/moshidon/metadata/zh_Hans/
2023-09-26 17:16:44 +00:00
CDN18
f73be653ce Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (97 of 97 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/zh_Hans/
2023-09-26 17:16:44 +00:00
Oliebol
808c922637 Translated using Weblate (Dutch)
Currently translated at 86.5% (84 of 97 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/nl/
2023-09-26 17:16:44 +00:00
Andrewblasco
ceef155e03 Translated using Weblate (Spanish)
Currently translated at 100.0% (97 of 97 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/es/
2023-09-26 17:16:43 +00:00
dontobi
eb5a38d514 Translated using Weblate (German)
Currently translated at 100.0% (97 of 97 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/de/
2023-09-26 17:16:43 +00:00
LucasGGamerM
33d4e05e96 refactor(translations): remove blocks/mutes strings in favor of blocked accounts/muted accounts strings 2023-09-26 11:08:54 -03:00
LucasGGamerM
968668e38c Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (99 of 99 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/pt_BR/
2023-09-26 14:02:01 +00:00
butterflyoffire
097a18fa92 Translated using Weblate (Arabic (Algeria))
Currently translated at 90.5% (86 of 95 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/ar_DZ/
2023-09-26 13:56:53 +00:00
butterflyoffire
5a85420866 Translated using Weblate (Arabic (Algeria))
Currently translated at 63.7% (58 of 91 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/ar_DZ/
2023-09-26 13:56:53 +00:00
Parsa Ranjbar
50cee02191 Translated using Weblate (Persian)
Currently translated at 93.4% (85 of 91 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/fa/
2023-09-26 13:56:53 +00:00
butterflyoffire
e7dbb9fdf7 Translated using Weblate (French)
Currently translated at 93.4% (85 of 91 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/fr/
2023-09-26 13:56:52 +00:00
Parsa Ranjbar
e2b2361ad2 Translated using Weblate (Persian)
Currently translated at 92.3% (84 of 91 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/fa/
2023-09-26 13:56:52 +00:00
Andrewblasco
89fe1dc783 Translated using Weblate (Spanish)
Currently translated at 100.0% (91 of 91 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/es/
2023-09-26 13:56:52 +00:00
LucasGGamerM
eaadd80eeb refactor(translations): move blocks/mutes strings to strings_mo.xml while we wait for megalodon to merge sk22#821 2023-09-26 10:53:22 -03:00
LucasGGamerM
c8063e961e fix(mute-hashtag): clear the filter optional when successfully deleting the hashtag filter on the server 2023-09-26 07:56:20 -03:00
LucasGGamerM
3057546c55 fix(mute-hashtag): make the mute button follow the mute state of the hashtag 2023-09-26 07:54:18 -03:00
LucasGGamerM
f90e799caa Revert "fix(hashtag-timeline): (un)show mute button as action"
This reverts commit 72ca3d0204.
2023-09-26 07:37:35 -03:00
Eugen Rochko
b4cdf35d36 New translations strings.xml (Russian) 2023-09-25 23:39:42 +02:00
Eugen Rochko
cad0ad7a59 New translations strings.xml (Ukrainian) 2023-09-25 22:25:17 +02:00
Grishka
ca60003c39 Fix #682 2023-09-25 23:11:10 +03:00
Grishka
0f030e0bac Fix #683 2023-09-25 23:07:34 +03:00
Grishka
6d4f212a18 Probably need to set this too 2023-09-25 23:00:15 +03:00
Grishka
183b39bc24 Specify LED color for notifications
closes #695
2023-09-25 22:58:08 +03:00
Grishka
27ad0c6fcf Crash fixes 2023-09-25 22:52:51 +03:00
LucasGGamerM
9944185424 Merge pull request #263 from FineFindus/feat/mute-hashtag
fix(hashtag/mute): update state on unmute
2023-09-25 16:39:33 -03:00
LucasGGamerM
72ca3d0204 fix(hashtag-timeline): (un)show mute button as action
Lets wait until I have enough life force to actually update the icon of this thing
2023-09-25 16:26:03 -03:00
FineFindus
53204a9998 fix(hashtag/mute): update state on unmute 2023-09-25 21:15:45 +02:00
LucasGGamerM
c3624eddb3 feat(hashtag-timeline): show mute button as action 2023-09-25 16:09:37 -03:00
LucasGGamerM
e144d0ac6f Merge pull request #261 from FineFindus/feat/mute-hashtag
feat: add option to mute hashtag
2023-09-25 15:43:22 -03:00
FineFindus
ac8562aaa2 fix(hashtag/mute): mute hashtag with prefixed #-symbol 2023-09-25 20:31:29 +02:00
FineFindus
4f8c4c67d2 feat(hashtag): allow unmuting hashtag 2023-09-25 20:22:06 +02:00
Grishka
b5f661f1af I forgot to increment the version code 2023-09-25 19:25:59 +03:00
Grishka
0015f3f0bf Merge branch 'l10n_master' 2023-09-25 19:22:38 +03:00
Eugen Rochko
c5d0fdd645 New translations strings.xml (Turkish) 2023-09-25 18:20:56 +02:00
Grishka
2d09ad44fb Merge branch 'l10n_master' 2023-09-25 19:18:24 +03:00
Eugen Rochko
667fffd124 New translations strings.xml (Chinese Traditional) 2023-09-25 18:18:22 +02:00
Eugen Rochko
699233d8c7 New translations strings.xml (Filipino) 2023-09-25 18:18:05 +02:00
Grishka
56aabdc4a6 Fix empty view text style
closes #701
2023-09-25 19:12:04 +03:00
Grishka
443e2c7a6f Add a tool to detect invalid formatting in localized strings 2023-09-25 18:51:49 +03:00
Eugen Rochko
985b0f6e63 New translations strings.xml (Filipino) 2023-09-25 17:49:57 +02:00
Grishka
cc86edf276 Fix #700 2023-09-25 17:18:42 +03:00
Grishka
4071b9342d Update appkit 2023-09-25 17:13:59 +03:00
LucasGGamerM
c92ab11dcd fix(recycler-empty-view): make the textViews in the empty views follow the color themes 2023-09-25 11:10:37 -03:00
LucasGGamerM
f3a1e7cf58 fix(poll-options): fix poll options layout when screen is too small and there are multiple lines in a poll option
cc: @FineFindus
2023-09-25 08:41:14 -03:00
LucasGGamerM
ebcafbf90d Merge branch 'fix/long-poll-options' 2023-09-25 08:21:11 -03:00
LucasGGamerM
b5f7135e38 Merge branch 'fix/chipify' 2023-09-25 08:13:03 -03:00
LucasGGamerM
8a3df3657b fix(ProfileFragment): max out number of profile roles to 4 2023-09-25 07:18:46 -03:00
Eugen Rochko
f71d1bc5d3 New translations strings.xml (Greek) 2023-09-24 23:27:13 +02:00
FineFindus
f293619189 feat: add mute hashtag option
Fixes https://github.com/LucasGGamerM/moshidon/issues/260, by opening the create filter page
2023-09-24 12:33:17 +02:00
FineFindus
68ec3499ea fix: show individual chips 2023-09-24 12:18:55 +02:00
FineFindus
4b79d35854 feat(settings/filter): allow passing words 2023-09-24 11:47:42 +02:00
FineFindus
54ec1d781a fix: show multiline poll options 2023-09-24 10:57:23 +02:00
Andrewblasco
2b926ffa46 Translated using Weblate (Spanish)
Currently translated at 100.0% (386 of 386 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/es/
2023-09-24 08:53:08 +00:00
Eugen Rochko
6bcdbaba34 New translations strings.xml (Turkish) 2023-09-24 08:49:38 +02:00
Eugen Rochko
a2beead3a5 New translations strings.xml (Chinese Simplified) 2023-09-23 18:34:38 +02:00
Eugen Rochko
e7a25e353d New translations strings.xml (Japanese) 2023-09-23 14:15:37 +02:00
Eugen Rochko
af04a01130 New translations strings.xml (Japanese) 2023-09-23 13:16:04 +02:00
Grishka
fe1cfa1d7b Fix indexable setting 2023-09-22 21:33:21 +03:00
Eugen Rochko
b248797bb0 New translations strings.xml (Russian) 2023-09-22 20:28:14 +02:00
Grishka
f24eba08d3 Fix custom emojis in names setting 2023-09-22 21:27:30 +03:00
Eugen Rochko
0e89559a47 New translations strings.xml (Slovenian) 2023-09-22 19:30:53 +02:00
LucasGGamerM
d7ab019107 fix(ProfileFragment): hide lock/bot icons on enter edit mode 2023-09-22 10:13:36 -03:00
Espasant3
858657799f Translated using Weblate (Galician)
Currently translated at 98.1% (379 of 386 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/gl/
2023-09-22 12:53:08 +00:00
Eugen Rochko
d02a72e079 New translations strings.xml (Japanese) 2023-09-22 13:01:51 +02:00
Eugen Rochko
3be57d1b0b New translations strings.xml (Japanese) 2023-09-22 11:08:13 +02:00
Eugen Rochko
bed550e97c New translations strings.xml (Russian) 2023-09-22 09:19:11 +02:00
Eugen Rochko
7e2619ea75 New translations strings.xml (Italian) 2023-09-22 01:48:10 +02:00
Eugen Rochko
4b22f1d3a7 New translations strings.xml (Thai) 2023-09-21 21:39:59 +02:00
LucasGGamerM
885b3e3c60 refactor(ScheduledStatusListFragment): refactor the apply window insets method
This allows for a smoother experience in my views
2023-09-21 11:45:27 -03:00
Eugen Rochko
9dcc7e293f New translations strings.xml (Icelandic) 2023-09-21 15:39:27 +02:00
Eugen Rochko
6a68cf5e41 New translations strings.xml (Persian) 2023-09-21 13:13:31 +02:00
LucasGGamerM
1edcf847b5 fix(mute-conversation): don't show mute conversation toggle on scheduled posts 2023-09-21 07:48:24 -03:00
LucasGGamerM
f5aff4d262 fix(drafts): fix crash when editing a draft with a poll
Fixes #243
2023-09-21 07:32:24 -03:00
Grishka
29297be4a3 Merge branch 'l10n_master' 2023-09-20 22:43:16 +03:00
Eugen Rochko
90b87529e0 New translations strings.xml (Swedish) 2023-09-20 21:16:11 +02:00
Grishka
39af05524d Privacy settings 2023-09-20 21:44:28 +03:00
LucasGGamerM
2c8246341a fix(search): stop empty search queries from happening 2023-09-20 14:21:52 -03:00
LucasGGamerM
77e19b4d6f fix(compose): make 'This post will be saved as a draft' view work better on smaller screens
cc: @sk22
2023-09-20 10:31:59 -03:00
LucasGGamerM
18857e6233 refactor(compose): remove unnecessary drawables 2023-09-20 10:26:08 -03:00
LucasGGamerM
4aee67382b refactor(compose): move publish button icon coloring to compose_button.xml 2023-09-20 10:12:37 -03:00
LucasGGamerM
3656402277 fix(compose): fix bottom bar icons tint
This uses the action_bar_icons.xml color scheme to dictate the colors of the compose bottom bar items
2023-09-20 10:06:03 -03:00
Grishka
e3fb2cd03c Scroll profile tab views to top when tab is reselected 2023-09-20 14:47:25 +03:00
LucasGGamerM
56e752c0b3 feat(mute-conversations): also show mute conversation when your acct matches the mention acct
We all gotta love some edge cases
2023-09-20 08:42:52 -03:00
LucasGGamerM
de7bc49f85 feat(mute-conversations): also show mute conversation when your fully qualified name matches the username of the mention 2023-09-20 08:31:50 -03:00
LucasGGamerM
beeffdff91 fix(mute-conversations): fix NPE when the mention id is null
This fixes an issue causing the app to crash when there is a mention on a post from a remote timeline and you tap on the three dot menu on the post header
2023-09-20 08:20:54 -03:00
Gregory K
90f84d628a Merge pull request #694 from LucasGGamerM/mastodon-android
fix(compose): fix photoPicker not popping up when there is less than 2 spaces available for media
2023-09-20 14:10:26 +03:00
LucasGGamerM
b89e0b5c5a fix(compose): fix photoPicker not popping up when there is less than 2 spaces available for media 2023-09-20 07:55:23 -03:00
LucasGGamerM
2dd983c803 fix(compose): fix photoPicker not popping up when there is less than 2 spaces available for media 2023-09-20 07:46:39 -03:00
LucasGGamerM
bb895c88b2 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (91 of 91 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/pt_BR/
2023-09-20 10:21:48 +00:00
LucasGGamerM
e33d0e692c Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (91 of 91 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/pt_BR/
2023-09-20 10:20:58 +00:00
Andrewblasco
133c941dc8 Translated using Weblate (Spanish)
Currently translated at 100.0% (91 of 91 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/es/
2023-09-20 10:20:58 +00:00
LucasGGamerM
62222cd1d9 feat(mute-conversations-toggle): Update mute/unmute confirmation dialog strings (again) 2023-09-20 07:20:41 -03:00
LucasGGamerM
5d358d79ff feat(mute-conversations-toggle): Update mute/unmute confirmation dialog strings 2023-09-20 07:12:17 -03:00
Espasant3
f724644d84 Translated using Weblate (Galician)
Currently translated at 89.6% (346 of 386 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/gl/
2023-09-19 21:53:09 +00:00
LucasGGamerM
f71c4b1374 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (91 of 91 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/pt_BR/
2023-09-19 18:05:28 +00:00
Parsa Ranjbar
a921a925b0 Translated using Weblate (Persian)
Currently translated at 72.2% (60 of 83 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/fa/
2023-09-19 18:00:04 +00:00
butterflyoffire
0f08af8c03 Translated using Weblate (Arabic (Algeria))
Currently translated at 62.6% (52 of 83 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/ar_DZ/
2023-09-19 18:00:04 +00:00
butterflyoffire
d54a59dbee Translated using Weblate (French)
Currently translated at 98.7% (82 of 83 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/fr/
2023-09-19 18:00:04 +00:00
dontobi
c6cd3995b0 Translated using Weblate (German)
Currently translated at 100.0% (83 of 83 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/de/
2023-09-19 18:00:04 +00:00
edxkl
54d06b7a23 Translated using Weblate (Portuguese (Brazil))
Currently translated at 26.4% (9 of 34 strings)

Translation: Moshidon/metadata
Translate-URL: https://translate.codeberg.org/projects/moshidon/metadata/pt_BR/
2023-09-19 18:00:04 +00:00
Andrewblasco
1ec0505d52 Translated using Weblate (Spanish)
Currently translated at 100.0% (83 of 83 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/es/
2023-09-19 18:00:04 +00:00
LucasGGamerM
be225f8bb4 feat(mute-conversations-toggle): add success confirmation toast 2023-09-19 14:56:16 -03:00
LucasGGamerM
f5732fd2ae fix(mute-conversations-toggle): fix oversight where only the answers would get muted/unmuted on the conversion. This make the whole thread either muted or unmuted 2023-09-19 14:35:40 -03:00
LucasGGamerM
17fc14de97 refactor(mute-conversations-toggle): implement event for StatusMuteChanged 2023-09-19 14:26:46 -03:00
LucasGGamerM
7c9d11fab0 fix(thread-fragment): fixes crash when status.inReplyTo is null on getDirectDescendants 2023-09-19 14:25:03 -03:00
LucasGGamerM
24abf9d317 refactor(mute-conversations-toggle): remove unused method 2023-09-19 13:20:38 -03:00
LucasGGamerM
22bf8840d5 fix(mute-conversations-toggle): make unmute option work 2023-09-19 12:21:12 -03:00
LucasGGamerM
a1fbb733ce refactor(mute-conversations-toggle): move mute and unmute options to own menu group 2023-09-19 12:19:56 -03:00
LucasGGamerM
851fa70563 feat: add mute conversations menu item 2023-09-19 12:13:03 -03:00
LucasGGamerM
6cab15b4c6 fix(file-display-tem): fix title text padding 2023-09-19 11:44:08 -03:00
Eugen Rochko
aac89c354c New translations full_description.txt (Thai) 2023-09-18 20:35:41 +02:00
Eugen Rochko
a032f9af10 New translations strings.xml (French) 2023-09-18 20:34:32 +02:00
LucasGGamerM
ec3670d562 fix(reply-icon): fix reply icon side text coloring 2023-09-18 11:35:16 -03:00
LucasGGamerM
96c3bd890a fix(boost-icon): fixes coloring on boost icon (again)
why
2023-09-18 11:32:12 -03:00
LucasGGamerM
8a0852d1a4 fix(video-player): fixes coloring on video player items 2023-09-18 11:18:42 -03:00
LucasGGamerM
77e2c6c09f fix(video-player): fixes looping video Seekbar and timestamp going on indefinitely as video restarts 2023-09-18 10:36:32 -03:00
LucasGGamerM
af60c8ba4a fix(insets): fix window insets on video player 2023-09-18 07:37:47 -03:00
LucasGGamerM
70a2f1fc0b fix(themes): fix pink dark theme bottom bar pill color 2023-09-17 13:30:50 -03:00
LucasGGamerM
b7d06a47db fix(compose): fixes compose language button being too thin when
You can see its too thin by tapping on it and seeing the button shadow, which indicates its too thin
2023-09-17 13:03:18 -03:00
LucasGGamerM
f0a5799eea fix: fix warning status display item background being too bright 2023-09-17 12:50:10 -03:00
LucasGGamerM
f0b2a25dce fix(themes): fix purple light theme bottom bar pills being slightly off 2023-09-17 12:38:40 -03:00
LucasGGamerM
de1a3fb939 fix(strings): use correct "sk_settings_see_new_posts_button" instead of "sk_settings_show_new_posts_button" 2023-09-17 10:11:33 -03:00
LucasGGamerM
823344dfc0 Merge branch 'feat/mutes-list'
# Conflicts:
#	mastodon/src/main/res/menu/profile_own.xml
#	mastodon/src/main/res/values/strings_sk.xml
2023-09-17 10:09:02 -03:00
LucasGGamerM
a6e6143157 Merge branch 'fix/akkoma_media_issue_fix' 2023-09-17 10:02:14 -03:00
LucasGGamerM
b5feab89b4 Merge branch 'fix/gap-singular' 2023-09-17 09:59:15 -03:00
LucasGGamerM
c2c31de433 fix(notifications): make reply language equal to language of the status being replied to 2023-09-17 09:45:11 -03:00
LucasGGamerM
775f799968 fix(notifications): fix reply visibility being PUBLIC no matter the status being replied to 2023-09-17 09:41:58 -03:00
LucasGGamerM
5cda112129 refactor(PreviewlessMedia): move margin value to layout file 2023-09-17 09:26:33 -03:00
Eugen Rochko
642aaec6da New translations strings.xml (Persian) 2023-09-17 14:08:04 +02:00
Eugen Rochko
ff667d6aed New translations strings.xml (Persian) 2023-09-17 12:27:57 +02:00
Eugen Rochko
5e98496ea6 New translations strings.xml (Vietnamese) 2023-09-17 10:39:46 +02:00
Eugen Rochko
972fe1d15b New translations strings.xml (Italian) 2023-09-17 10:39:45 +02:00
Eugen Rochko
26eaa36faa New translations strings.xml (Finnish) 2023-09-17 10:39:44 +02:00
Grishka
c517f41595 Paginate search results 2023-09-17 11:20:12 +03:00
Grishka
56a6d7243f Crash fixes 2023-09-17 10:49:13 +03:00
Grishka
18e43dfc22 Crash fix 2023-09-17 10:32:59 +03:00
Grishka
816f6370ef Fix #690 2023-09-17 10:26:27 +03:00
butterflyoffire
30866a5292 Translated using Weblate (Arabic)
Currently translated at 71.5% (276 of 386 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/ar/
2023-09-16 08:53:08 +00:00
Espasant3
3e1403d18a Translated using Weblate (Galician)
Currently translated at 85.2% (329 of 386 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/gl/
2023-09-16 08:53:08 +00:00
Eugen Rochko
ebc2b2e59d New translations strings.xml (Arabic) 2023-09-15 11:51:46 +02:00
FineFindus
10c2ee9597 fix(timeline/gap): use plurals for time 2023-09-15 10:19:43 +02:00
Eugen Rochko
c9a796dbfe New translations strings.xml (Arabic) 2023-09-15 10:16:56 +02:00
Eugen Rochko
1ba185ea9c New translations strings.xml (Vietnamese) 2023-09-15 03:45:44 +02:00
EndermanCo
1a50c3ff5f Translated using Weblate (Persian)
Currently translated at 66.6% (12 of 18 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/fa/
2023-09-14 17:53:07 +00:00
EndermanCo
35a85c3247 Translated using Weblate (Persian)
Currently translated at 100.0% (386 of 386 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/fa/
2023-09-14 17:53:07 +00:00
GunChleoc
6a729fa97f Translated using Weblate (Gaelic)
Currently translated at 100.0% (386 of 386 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/gd/
2023-09-14 17:53:07 +00:00
kallekn
923639a329 Translated using Weblate (Finnish)
Currently translated at 94.5% (365 of 386 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/fi/
2023-09-14 17:53:07 +00:00
Jacocococo
fd99879ffc Revert "Fix media layout with unknown sizes"
This reverts commit a014fe9443.
2023-09-14 17:16:03 +02:00
Eugen Rochko
a78be8bc1d New translations strings.xml (Chinese Traditional) 2023-09-14 12:55:27 +02:00
Eugen Rochko
abfb497577 New translations strings.xml (Chinese Traditional) 2023-09-14 11:17:24 +02:00
Eugen Rochko
a10b184508 New translations full_description.txt (Finnish) 2023-09-13 21:32:19 +02:00
Eugen Rochko
f0ea6660e6 New translations strings.xml (Finnish) 2023-09-13 21:32:18 +02:00
Eugen Rochko
a829f25d56 New translations strings.xml (Thai) 2023-09-13 20:36:48 +02:00
Eugen Rochko
deff3dd8e0 New translations strings.xml (Finnish) 2023-09-13 20:36:47 +02:00
EndermanCo
dab596f527 Translated using Weblate (Persian)
Currently translated at 55.5% (10 of 18 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/fa/
2023-09-13 09:53:07 +00:00
EndermanCo
0c18ab2319 Translated using Weblate (Persian)
Currently translated at 95.5% (369 of 386 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/fa/
2023-09-13 09:53:07 +00:00
Eugen Rochko
6c5fb5ea09 New translations strings.xml (Dutch) 2023-09-12 12:25:35 +02:00
Eugen Rochko
afe0c9e0db New translations strings.xml (Dutch) 2023-09-12 10:19:31 +02:00
Eugen Rochko
1f2213042f New translations strings.xml (Urdu (India)) 2023-09-12 06:51:43 +02:00
Eugen Rochko
5edd2466f9 New translations strings.xml (Kabyle) 2023-09-12 06:51:42 +02:00
Eugen Rochko
f3b3a1a577 New translations strings.xml (Igbo) 2023-09-12 06:51:41 +02:00
Eugen Rochko
068619b815 New translations strings.xml (Occitan) 2023-09-12 06:51:40 +02:00
Eugen Rochko
f121e94979 New translations strings.xml (Scottish Gaelic) 2023-09-12 06:51:39 +02:00
Eugen Rochko
b5b52529d4 New translations strings.xml (Sinhala) 2023-09-12 06:51:38 +02:00
Eugen Rochko
876bf73454 New translations strings.xml (Bosnian) 2023-09-12 06:51:37 +02:00
Eugen Rochko
522dbf6e4a New translations strings.xml (Filipino) 2023-09-12 06:51:36 +02:00
Eugen Rochko
ae685095ba New translations strings.xml (Burmese) 2023-09-12 06:51:35 +02:00
Eugen Rochko
30d5fe2f12 New translations strings.xml (Hindi) 2023-09-12 06:51:34 +02:00
Eugen Rochko
2bf27c561c New translations strings.xml (Croatian) 2023-09-12 06:51:33 +02:00
Eugen Rochko
bbdc72323d New translations strings.xml (Thai) 2023-09-12 06:51:31 +02:00
Eugen Rochko
6e335930f3 New translations strings.xml (Bengali) 2023-09-12 06:51:31 +02:00
Eugen Rochko
9b309939da New translations strings.xml (Persian) 2023-09-12 06:51:30 +02:00
Eugen Rochko
faf2e5115d New translations strings.xml (Indonesian) 2023-09-12 06:51:28 +02:00
Eugen Rochko
dc5d9412c8 New translations strings.xml (Portuguese, Brazilian) 2023-09-12 06:51:27 +02:00
Eugen Rochko
fc0680d66f New translations strings.xml (Icelandic) 2023-09-12 06:51:26 +02:00
Eugen Rochko
56c9a5433f New translations strings.xml (Galician) 2023-09-12 06:51:25 +02:00
Eugen Rochko
60e473ee55 New translations strings.xml (Vietnamese) 2023-09-12 06:51:24 +02:00
Eugen Rochko
ae34ecd5c3 New translations strings.xml (Chinese Traditional) 2023-09-12 06:51:23 +02:00
Eugen Rochko
fd1caa8729 New translations strings.xml (Chinese Simplified) 2023-09-12 06:51:22 +02:00
Eugen Rochko
1182e5c60c New translations strings.xml (Ukrainian) 2023-09-12 06:51:21 +02:00
Eugen Rochko
d99d515dfa New translations strings.xml (Turkish) 2023-09-12 06:51:20 +02:00
Eugen Rochko
70a15e7d9c New translations strings.xml (Swedish) 2023-09-12 06:51:19 +02:00
Eugen Rochko
1691382369 New translations strings.xml (Slovenian) 2023-09-12 06:51:18 +02:00
Eugen Rochko
b7da9c6d51 New translations strings.xml (Russian) 2023-09-12 06:51:17 +02:00
Eugen Rochko
3426538dca New translations strings.xml (Portuguese) 2023-09-12 06:51:16 +02:00
Eugen Rochko
63de2b200b New translations strings.xml (Polish) 2023-09-12 06:51:15 +02:00
Eugen Rochko
ff1ee766dc New translations strings.xml (Norwegian) 2023-09-12 06:51:14 +02:00
Eugen Rochko
f033411adf New translations strings.xml (Dutch) 2023-09-12 06:51:13 +02:00
Eugen Rochko
a738eaf8c0 New translations strings.xml (Korean) 2023-09-12 06:51:12 +02:00
Eugen Rochko
5074aadd6e New translations strings.xml (Japanese) 2023-09-12 06:51:11 +02:00
Eugen Rochko
0854961470 New translations strings.xml (Italian) 2023-09-12 06:51:10 +02:00
Eugen Rochko
227b077935 New translations strings.xml (Armenian) 2023-09-12 06:51:09 +02:00
Eugen Rochko
1e4358290a New translations strings.xml (Hungarian) 2023-09-12 06:51:08 +02:00
Eugen Rochko
925169eb31 New translations strings.xml (Hebrew) 2023-09-12 06:51:07 +02:00
Eugen Rochko
e1abeb9252 New translations strings.xml (Irish) 2023-09-12 06:51:07 +02:00
Eugen Rochko
cbe0add211 New translations strings.xml (Finnish) 2023-09-12 06:51:06 +02:00
Eugen Rochko
299b524d62 New translations strings.xml (Basque) 2023-09-12 06:51:05 +02:00
Eugen Rochko
31c094e696 New translations strings.xml (Greek) 2023-09-12 06:51:04 +02:00
Eugen Rochko
a8038a2863 New translations strings.xml (German) 2023-09-12 06:51:02 +02:00
Eugen Rochko
29933bb916 New translations strings.xml (Danish) 2023-09-12 06:51:01 +02:00
Eugen Rochko
5ec0c078d8 New translations strings.xml (Czech) 2023-09-12 06:51:00 +02:00
Eugen Rochko
e6287f1ff2 New translations strings.xml (Catalan) 2023-09-12 06:50:59 +02:00
Eugen Rochko
be9caf8905 New translations strings.xml (Belarusian) 2023-09-12 06:50:58 +02:00
Eugen Rochko
f375142084 New translations strings.xml (Arabic) 2023-09-12 06:50:57 +02:00
Eugen Rochko
fd3668d520 New translations strings.xml (Spanish) 2023-09-12 06:50:56 +02:00
Eugen Rochko
d5e03e9d9e New translations strings.xml (French) 2023-09-12 06:50:55 +02:00
Eugen Rochko
d62f094919 New translations strings.xml (Romanian) 2023-09-12 06:50:54 +02:00
Grishka
6d84f28600 Hashtag following
closes #684, closes #233
2023-09-12 07:49:14 +03:00
Grishka
209e603f2c oops 2023-09-12 06:05:45 +03:00
Grishka
1b4dc01c74 Post translation
closes #267, closes #671, closes #502
2023-09-12 06:00:40 +03:00
Andrewblasco
6aab8f6578 Translated using Weblate (Spanish)
Currently translated at 100.0% (386 of 386 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/es/
2023-09-12 02:43:45 +00:00
Grishka
645af12c3f Merge branch 'l10n_master' 2023-09-12 02:32:38 +03:00
Grishka
fadc42d72b New version 2023-09-12 02:32:23 +03:00
Eugen Rochko
fc831e7d42 New translations strings.xml (Portuguese, Brazilian) 2023-09-11 22:36:20 +02:00
Eugen Rochko
2998ee9145 New translations strings.xml (Finnish) 2023-09-11 20:09:41 +02:00
Eugen Rochko
971c4e5879 New translations strings.xml (Finnish) 2023-09-11 19:00:28 +02:00
Linerly
48c53ee88b Translated using Weblate (Indonesian)
Currently translated at 100.0% (18 of 18 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/id/
2023-09-11 14:53:07 +00:00
Linerly
acf1fa15da Translated using Weblate (Indonesian)
Currently translated at 100.0% (386 of 386 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/id/
2023-09-11 14:53:07 +00:00
poesty
1c3b28f9d7 Translated using Weblate (Chinese (Simplified))
Currently translated at 99.7% (385 of 386 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/zh_Hans/
2023-09-11 14:53:07 +00:00
FineFindus
e274cf89c0 refactor: add query params 2023-09-10 21:31:06 +02:00
FineFindus
8929482466 feat: add blocks fragment 2023-09-10 21:29:40 +02:00
FineFindus
b570c8d946 feat: add mutes fragment 2023-09-10 21:19:50 +02:00
Eugen Rochko
b396ee7987 New translations strings.xml (Indonesian) 2023-09-10 15:07:27 +02:00
butterflyoffire
90856a414a Translated using Weblate (Arabic)
Currently translated at 16.6% (3 of 18 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/ar/
2023-09-09 20:53:07 +00:00
butterflyoffire
ea19925be6 Translated using Weblate (Arabic)
Currently translated at 69.1% (267 of 386 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/ar/
2023-09-09 20:53:07 +00:00
ihor_ck
03b3775843 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (386 of 386 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/uk/
2023-09-09 20:53:07 +00:00
edxkl
38b39751ae Translated using Weblate (Portuguese (Brazil))
Currently translated at 97.1% (375 of 386 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/pt_BR/
2023-09-09 20:53:07 +00:00
Oliebol
54a4b0fe41 Translated using Weblate (Dutch)
Currently translated at 81.8% (316 of 386 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/nl/
2023-09-09 20:53:07 +00:00
Choukajohn
3bf591c944 Translated using Weblate (French)
Currently translated at 100.0% (386 of 386 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/fr/
2023-09-09 20:53:06 +00:00
gallegonovato
584a6bbfa3 Translated using Weblate (Spanish)
Currently translated at 100.0% (386 of 386 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/es/
2023-09-09 20:53:06 +00:00
Eugen Rochko
0f803cd4fa New translations strings.xml (Finnish) 2023-09-09 20:30:25 +02:00
Eugen Rochko
167a14b8db New translations strings.xml (Finnish) 2023-09-09 19:29:29 +02:00
Eugen Rochko
81cbc2d10c New translations strings.xml (Ukrainian) 2023-09-09 15:40:28 +02:00
Eugen Rochko
9bd8aff99b New translations strings.xml (Finnish) 2023-09-09 12:08:15 +02:00
Eugen Rochko
a770828165 New translations strings.xml (Finnish) 2023-09-09 11:09:40 +02:00
Eugen Rochko
ab457035ff New translations strings.xml (Finnish) 2023-09-09 08:34:27 +02:00
Grishka
f886e4c1d2 Fix #658, fix #620 2023-09-09 03:39:27 +03:00
edxkl
464dc93d99 Translated using Weblate (Portuguese (Brazil))
Currently translated at 95.8% (368 of 384 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/pt_BR/
2023-09-08 20:22:51 +00:00
gallegonovato
dcdfd3e5d3 Translated using Weblate (Spanish)
Currently translated at 100.0% (384 of 384 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/es/
2023-09-08 20:22:51 +00:00
169 changed files with 2780 additions and 291 deletions

View File

@@ -13,7 +13,7 @@ jobs:
- name: Checkout Appkit Repo
uses: actions/checkout@v3
with:
repository: grishka/appkit
repository: LucasGGamerM/appkit
- name: set up JDK 17
uses: actions/setup-java@v3

View File

@@ -16,8 +16,8 @@ android {
applicationId "org.joinmastodon.android.moshinda"
minSdk 23
targetSdk 33
versionCode 101
versionName "1.2.3+fork.101.moshinda"
versionCode 102
versionName "2.1.4+fork.102.moshinda"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
resourceConfigurations += ['ar-rSA', 'ar-rDZ', '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']
}
@@ -118,7 +118,7 @@ dependencies {
implementation 'me.grishka.litex:viewpager:1.0.0'
implementation 'me.grishka.litex:viewpager2:1.0.0'
implementation 'me.grishka.litex:palette:1.0.0'
implementation 'me.grishka.appkit:appkit:1.2.9'
implementation 'me.grishka.appkit:appkit:1.2.14'
implementation 'com.google.code.gson:gson:2.9.0'
implementation 'org.jsoup:jsoup:1.14.3'
implementation 'com.squareup:otto:1.3.8'

View File

@@ -151,7 +151,7 @@ public class MainActivity extends FragmentStackActivity implements ProvidesAssis
}
public void openSearchQuery(String q, String accountID, int progressText, boolean fromSearch){
new GetSearchResults(q, null, true)
new GetSearchResults(q, null, true, null, 0, 0)
.setCallback(new Callback<>(){
@Override
public void onSuccess(SearchResults result){

View File

@@ -182,6 +182,8 @@ public class PushNotificationReceiver extends BroadcastReceiver{
List<NotificationChannel> channels=Arrays.stream(PushNotification.Type.values())
.map(type->{
NotificationChannel channel=new NotificationChannel(accountID+"_"+type, context.getString(type.localizedName), NotificationManager.IMPORTANCE_DEFAULT);
channel.setLightColor(context.getColor(R.color.primary_700));
channel.enableLights(true);
channel.setGroup(accountID);
return channel;
})
@@ -211,6 +213,7 @@ public class PushNotificationReceiver extends BroadcastReceiver{
.setShowWhen(true)
.setCategory(Notification.CATEGORY_SOCIAL)
.setAutoCancel(true)
.setLights(context.getColor(R.color.primary_700), 500, 1000)
.setColor(context.getColor(R.color.shortcut_icon_background));
if (!GlobalUserPreferences.uniformNotificationIcon) {
@@ -336,8 +339,8 @@ public class PushNotificationReceiver extends BroadcastReceiver{
CreateStatus.Request req=new CreateStatus.Request();
req.status = initialText + input.toString();
req.language = preferences.postingDefaultLanguage;
req.visibility = preferences.postingDefaultVisibility;
req.language = notification.status.language;
req.visibility = (notification.status.visibility == StatusPrivacy.PUBLIC && GlobalUserPreferences.defaultToUnlistedReplies ? StatusPrivacy.UNLISTED : notification.status.visibility);
req.inReplyToId = notification.status.id;
if (notification.status.hasSpoiler() &&

View File

@@ -6,6 +6,7 @@ import org.joinmastodon.android.E;
import org.joinmastodon.android.MastodonApp;
import org.joinmastodon.android.api.requests.statuses.SetStatusBookmarked;
import org.joinmastodon.android.api.requests.statuses.SetStatusFavorited;
import org.joinmastodon.android.api.requests.statuses.SetStatusMuted;
import org.joinmastodon.android.api.requests.statuses.SetStatusReblogged;
import org.joinmastodon.android.events.StatusCountersUpdatedEvent;
import org.joinmastodon.android.model.Status;
@@ -23,6 +24,7 @@ public class StatusInteractionController{
private final HashMap<String, SetStatusFavorited> runningFavoriteRequests=new HashMap<>();
private final HashMap<String, SetStatusReblogged> runningReblogRequests=new HashMap<>();
private final HashMap<String, SetStatusBookmarked> runningBookmarkRequests=new HashMap<>();
private final HashMap<String, SetStatusMuted> runningMuteRequests=new HashMap<>();
public StatusInteractionController(String accountID, boolean updateCounters) {
this.accountID=accountID;

View File

@@ -0,0 +1,16 @@
package org.joinmastodon.android.api.requests.accounts;
import com.google.gson.reflect.TypeToken;
import org.joinmastodon.android.api.requests.HeaderPaginationRequest;
import org.joinmastodon.android.model.Account;
public class GetAccountBlocks extends HeaderPaginationRequest<Account>{
public GetAccountBlocks(String maxID, int limit){
super(HttpMethod.GET, "/blocks", new TypeToken<>(){});
if(maxID!=null)
addQueryParameter("max_id", maxID);
if(limit>0)
addQueryParameter("limit", limit+"");
}
}

View File

@@ -0,0 +1,16 @@
package org.joinmastodon.android.api.requests.accounts;
import com.google.gson.reflect.TypeToken;
import org.joinmastodon.android.api.requests.HeaderPaginationRequest;
import org.joinmastodon.android.model.Account;
public class GetAccountMutes extends HeaderPaginationRequest<Account>{
public GetAccountMutes(String maxID, int limit){
super(HttpMethod.GET, "/mutes/", new TypeToken<>(){});
if(maxID!=null)
addQueryParameter("max_id", maxID);
if(limit>0)
addQueryParameter("limit", limit+"");
}
}

View File

@@ -6,18 +6,19 @@ import org.joinmastodon.android.model.Preferences;
import org.joinmastodon.android.model.StatusPrivacy;
public class UpdateAccountCredentialsPreferences extends MastodonAPIRequest<Account>{
public UpdateAccountCredentialsPreferences(Preferences preferences, Boolean locked, Boolean discoverable){
public UpdateAccountCredentialsPreferences(Preferences preferences, Boolean locked, Boolean discoverable, Boolean indexable){
super(HttpMethod.PATCH, "/accounts/update_credentials", Account.class);
setRequestBody(new Request(locked, discoverable, new RequestSource(preferences.postingDefaultVisibility, preferences.postingDefaultLanguage)));
setRequestBody(new Request(locked, discoverable, indexable, new RequestSource(preferences.postingDefaultVisibility, preferences.postingDefaultLanguage)));
}
private static class Request{
public Boolean locked, discoverable;
public Boolean locked, discoverable, indexable;
public RequestSource source;
public Request(Boolean locked, Boolean discoverable, RequestSource source){
public Request(Boolean locked, Boolean discoverable, Boolean indexable, RequestSource source){
this.locked=locked;
this.discoverable=discoverable;
this.indexable=indexable;
this.source=source;
}
}

View File

@@ -6,6 +6,9 @@ import org.joinmastodon.android.model.FilterContext;
import java.util.EnumSet;
import java.util.List;
import androidx.annotation.Keep;
@Keep
class FilterRequest{
public String title;
public EnumSet<FilterContext> context;

View File

@@ -4,13 +4,19 @@ import org.joinmastodon.android.api.MastodonAPIRequest;
import org.joinmastodon.android.model.SearchResults;
public class GetSearchResults extends MastodonAPIRequest<SearchResults>{
public GetSearchResults(String query, Type type, boolean resolve){
public GetSearchResults(String query, Type type, boolean resolve, String maxID, int offset, int count){
super(HttpMethod.GET, "/search", SearchResults.class);
addQueryParameter("q", query);
if(type!=null)
addQueryParameter("type", type.name().toLowerCase());
if(resolve)
addQueryParameter("resolve", "true");
if(maxID!=null)
addQueryParameter("max_id", maxID);
if(offset>0)
addQueryParameter("offset", String.valueOf(offset));
if(count>0)
addQueryParameter("limit", String.valueOf(count));
}
public GetSearchResults limit(int limit){

View File

@@ -0,0 +1,11 @@
package org.joinmastodon.android.api.requests.statuses;
import org.joinmastodon.android.api.MastodonAPIRequest;
import org.joinmastodon.android.model.Status;
public class SetStatusMuted extends MastodonAPIRequest<Status>{
public SetStatusMuted(String id, boolean muted){
super(HttpMethod.POST, "/statuses/"+id+"/"+(muted ? "mute" : "unmute"), Status.class);
setRequestBody(new Object());
}
}

View File

@@ -0,0 +1,10 @@
package org.joinmastodon.android.api.requests.tags;
import org.joinmastodon.android.api.MastodonAPIRequest;
import org.joinmastodon.android.model.Hashtag;
public class GetTag extends MastodonAPIRequest<Hashtag>{
public GetTag(String tag){
super(HttpMethod.GET, "/tags/"+tag, Hashtag.class);
}
}

View File

@@ -0,0 +1,11 @@
package org.joinmastodon.android.api.requests.tags;
import org.joinmastodon.android.api.MastodonAPIRequest;
import org.joinmastodon.android.model.Hashtag;
public class SetTagFollowed extends MastodonAPIRequest<Hashtag>{
public SetTagFollowed(String tag, boolean followed){
super(HttpMethod.POST, "/tags/"+tag+(followed ? "/follow" : "/unfollow"), Hashtag.class);
setRequestBody(new Object());
}
}

View File

@@ -219,7 +219,7 @@ public class AccountSession{
public void savePreferencesIfPending(){
if(preferencesNeedSaving){
new UpdateAccountCredentialsPreferences(preferences, null, null)
new UpdateAccountCredentialsPreferences(preferences, null, self.discoverable, self.source.indexable)
.setCallback(new Callback<>(){
@Override
public void onSuccess(Account result){
@@ -319,4 +319,8 @@ public class AccountSession{
.map(instance->"https://"+domain+(instance.isAkkoma() ? "/images/avi.png" : "/avatars/original/missing.png"))
.orElse("");
}
public void updateAccountInfo(){
AccountSessionManager.getInstance().updateSessionLocalInfo(this);
}
}

View File

@@ -315,7 +315,7 @@ public class AccountSessionManager{
}
private void updateSessionLocalInfo(AccountSession session){
public void updateSessionLocalInfo(AccountSession session){
new GetOwnAccount()
.setCallback(new Callback<>(){
@Override

View File

@@ -0,0 +1,15 @@
package org.joinmastodon.android.events;
import org.joinmastodon.android.model.Status;
public class StatusMuteChangedEvent{
public String id;
public boolean muted;
public Status status;
public StatusMuteChangedEvent(Status s){
id=s.id;
muted=s.muted;
status=s;
}
}

View File

@@ -931,9 +931,9 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
private Paint dividerPaint=new Paint();
{
dividerPaint.setColor(UiUtils.getThemeColor(getActivity(), GlobalUserPreferences.showDividers ? R.attr.colorM3Outline : R.attr.colorM3Surface));
dividerPaint.setColor(UiUtils.getThemeColor(getActivity(), GlobalUserPreferences.showDividers ? R.attr.colorM3OutlineVariant : R.attr.colorM3Surface));
dividerPaint.setStyle(Paint.Style.STROKE);
dividerPaint.setStrokeWidth(V.dp(0.5f));
dividerPaint.setStrokeWidth(V.dp(1f));
}
@Override

View File

@@ -1419,7 +1419,8 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
boolean usePhotoPicker=photoPicker && UiUtils.isPhotoPickerAvailable();
if(usePhotoPicker){
intent=new Intent(MediaStore.ACTION_PICK_IMAGES);
intent.putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, mediaViewController.getMaxAttachments()-mediaViewController.getMediaAttachmentsCount());
if(mediaViewController.getMaxAttachments()-mediaViewController.getMediaAttachmentsCount()>1)
intent.putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, mediaViewController.getMaxAttachments()-mediaViewController.getMediaAttachmentsCount());
}else{
intent=new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
@@ -1598,7 +1599,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
} else {
draftsBtn.setImageDrawable(getContext().getDrawable(GlobalUserPreferences.relocatePublishButton ? R.drawable.ic_fluent_clock_24_regular : R.drawable.ic_fluent_clock_20_regular));
if(GlobalUserPreferences.relocatePublishButton){
publishButtonRelocated.setImageResource(R.drawable.ic_fluent_send_24_selector);
publishButtonRelocated.setImageResource(R.drawable.ic_fluent_send_24_regular);
}
resetPublishButtonText();
}

View File

@@ -274,16 +274,21 @@ public class EditTimelinesFragment extends MastodonRecyclerFragment<TimelineDefi
private boolean setTagListContent(NachoTextView editText, @Nullable List<String> tags) {
if (tags == null || tags.isEmpty()) return false;
editText.setText(String.join(",", tags));
editText.chipifyAllUnterminatedTokens();
editText.setText(tags);
editText.chipifyAllUnterminatedTokens();
return true;
}
private NachoTextView prepareChipTextView(NachoTextView nacho) {
nacho.addChipTerminator(',', BEHAVIOR_CHIPIFY_ALL);
nacho.addChipTerminator('\n', BEHAVIOR_CHIPIFY_ALL);
nacho.addChipTerminator(' ', BEHAVIOR_CHIPIFY_ALL);
nacho.addChipTerminator(';', BEHAVIOR_CHIPIFY_ALL);
//Ill Be Back
nacho.setChipTerminators(
Map.of(
',', BEHAVIOR_CHIPIFY_ALL,
'\n', BEHAVIOR_CHIPIFY_ALL,
' ', BEHAVIOR_CHIPIFY_ALL,
';', BEHAVIOR_CHIPIFY_ALL
)
);
nacho.enableEditChipOnTouch(true, true);
nacho.setOnFocusChangeListener((v, hasFocus) -> nacho.chipifyAllUnterminatedTokens());
return nacho;

View File

@@ -13,18 +13,29 @@ import android.widget.Toast;
import org.joinmastodon.android.E;
import org.joinmastodon.android.R;
import org.joinmastodon.android.api.requests.filters.CreateFilter;
import org.joinmastodon.android.api.requests.filters.DeleteFilter;
import org.joinmastodon.android.api.requests.filters.GetFilters;
import org.joinmastodon.android.api.requests.tags.GetHashtag;
import org.joinmastodon.android.api.requests.tags.SetHashtagFollowed;
import org.joinmastodon.android.api.requests.timelines.GetHashtagTimeline;
import org.joinmastodon.android.events.HashtagUpdatedEvent;
import org.joinmastodon.android.fragments.settings.EditFilterFragment;
import org.joinmastodon.android.model.Filter;
import org.joinmastodon.android.model.FilterAction;
import org.joinmastodon.android.model.FilterContext;
import org.joinmastodon.android.model.FilterKeyword;
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 org.joinmastodon.android.utils.StatusFilterPredicate;
import org.parceler.Parcels;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import me.grishka.appkit.Nav;
@@ -41,6 +52,8 @@ public class HashtagTimelineFragment extends PinnableStatusListFragment {
private boolean following;
private boolean localOnly;
private MenuItem followButton;
private MenuItem muteButton;
private Optional<Filter> filter = Optional.empty();
@Override
protected boolean wantsComposeButton() {
@@ -72,13 +85,19 @@ public class HashtagTimelineFragment extends PinnableStatusListFragment {
E.post(new HashtagUpdatedEvent(hashtag, following));
}
private void updateMuteState(boolean newMute) {
muteButton.setTitle(getString(newMute ? R.string.unmute_user : R.string.mute_user, "#" + hashtag));
muteButton.setIcon(newMute ? R.drawable.ic_fluent_speaker_2_24_regular : R.drawable.ic_fluent_speaker_off_24_regular);
}
@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);
muteButton = menu.findItem(R.id.mute_hashtag);
updateMuteState(filter.isPresent());
new GetHashtag(hashtag).setCallback(new Callback<>() {
@Override
public void onSuccess(Hashtag hashtag) {
@@ -92,6 +111,20 @@ public class HashtagTimelineFragment extends PinnableStatusListFragment {
error.showToast(getActivity());
}
}).exec(accountID);
new GetFilters().setCallback(new Callback<>() {
@Override
public void onSuccess(List<Filter> filters) {
if (getActivity() == null) return;
filter=filters.stream().filter(filter->filter.title.equals("#"+hashtag)).findAny();
updateMuteState(filter.isPresent());
}
@Override
public void onError(ErrorResponse error) {
error.showToast(getActivity());
}
}).exec(accountID);
}
@@ -116,10 +149,58 @@ public class HashtagTimelineFragment extends PinnableStatusListFragment {
}
}).exec(accountID);
return true;
} else if (item.getItemId() == R.id.mute_hashtag) {
showMuteDialog(filter.isPresent());
return true;
}
return false;
}
private void showMuteDialog(boolean mute) {
UiUtils.showConfirmationAlert(getContext(),
mute ? R.string.mo_unmute_hashtag : R.string.mo_mute_hashtag,
mute ? R.string.mo_confirm_to_unmute_hashtag : R.string.mo_confirm_to_mute_hashtag,
mute ? R.string.do_unmute : R.string.do_mute,
mute ? R.drawable.ic_fluent_speaker_2_28_regular : R.drawable.ic_fluent_speaker_off_28_regular,
mute ? this::unmuteHashtag : this::muteHashtag
);
}
private void unmuteHashtag() {
//safe to get, this only called if filter is present
new DeleteFilter(filter.get().id).setCallback(new Callback<>(){
@Override
public void onSuccess(Void result){
filter=Optional.empty();
updateMuteState(false);
}
@Override
public void onError(ErrorResponse error){
error.showToast(getContext());
}
}).exec(accountID);
}
private void muteHashtag() {
FilterKeyword hashtagFilter=new FilterKeyword();
hashtagFilter.wholeWord=true;
hashtagFilter.keyword="#"+hashtag;
new CreateFilter("#"+hashtag, EnumSet.of(FilterContext.HOME), FilterAction.HIDE, 0 , List.of(hashtagFilter)).setCallback(new Callback<>(){
@Override
public void onSuccess(Filter result){
filter=Optional.of(result);
updateMuteState(true);
}
@Override
public void onError(ErrorResponse error){
error.showToast(getContext());
}
}).exec(accountID);
}
@Override
protected TimelineDefinition makeTimelineDefinition() {
return TimelineDefinition.ofHashtag(hashtag);

View File

@@ -189,6 +189,7 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene
});
}
}
tabBar.selectTab(currentTab);
return content;
}

View File

@@ -2,6 +2,8 @@ package org.joinmastodon.android.fragments;
import android.os.Bundle;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toolbar;
import org.joinmastodon.android.R;
@@ -38,12 +40,11 @@ public abstract class MastodonRecyclerFragment<T> extends BaseRecyclerFragment<T
@CallSuper
public void onViewCreated(View view, Bundle savedInstanceState){
super.onViewCreated(view, savedInstanceState);
if (getParentFragment() instanceof HasElevationOnScrollListener elevator)
list.addOnScrollListener(elevator.getElevationOnScrollListener());
else if(wantsElevationOnScrollEffect())
if(wantsElevationOnScrollEffect())
list.addOnScrollListener(elevationOnScrollListener=new ElevationOnScrollListener((FragmentRootLinearLayout) view, getViewsForElevationEffect()));
if(refreshLayout!=null)
if(refreshLayout!=null){
setRefreshLayoutColors(refreshLayout);
}
}
@Override

View File

@@ -38,6 +38,7 @@ import org.parceler.Parcels;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -93,7 +94,7 @@ public class NotificationsListFragment extends BaseStatusListFragment<Notificati
}else{
titleItem=new NotificationHeaderStatusDisplayItem(n.id, this, n, accountID);
}
if (n.type == Notification.Type.FOLLOW_REQUEST) {
if (n.type == Notification.Type.FOLLOW_REQUEST || n.type == Notification.Type.FOLLOW) {
ArrayList<StatusDisplayItem> items = new ArrayList<>();
items.add(titleItem);
items.add(new AccountCardStatusDisplayItem(n.id, this, accountID, n.account, n));
@@ -134,6 +135,13 @@ public class NotificationsListFragment extends BaseStatusListFragment<Notificati
public void onSuccess(PaginatedResponse<List<Notification>> result){
if(getActivity()==null)
return;
Set<String> needRelationships=result.items.stream()
.filter(ntf->ntf.status==null && !relationships.containsKey(ntf.account.id))
.map(ntf->ntf.account.id)
.collect(Collectors.toSet());
loadRelationships(needRelationships);
maxID=result.maxID;
onDataLoaded(result.items.stream().filter(n->n.type!=null).collect(Collectors.toList()), !result.items.isEmpty());
reloadingFromCache=false;
@@ -143,6 +151,17 @@ public class NotificationsListFragment extends BaseStatusListFragment<Notificati
}
});
}
@Override
protected void onRelationshipsLoaded(){
if(getActivity()==null)
return;
for(int i=0;i<list.getChildCount();i++){
RecyclerView.ViewHolder holder=list.getChildViewHolder(list.getChildAt(i));
if(holder instanceof AccountCardStatusDisplayItem.Holder accountHolder)
accountHolder.rebind();
}
}
@Override
protected void onShown(){

View File

@@ -44,7 +44,7 @@ import me.grishka.appkit.utils.V;
import me.grishka.appkit.views.UsableRecyclerView;
public class ProfileAboutFragment extends Fragment implements WindowInsetsAwareFragment{
static final int MAX_FIELDS=Integer.MAX_VALUE;
static final int MAX_FIELDS=4;
public UsableRecyclerView list;
private List<AccountField> fields=Collections.emptyList();

View File

@@ -68,8 +68,10 @@ import org.joinmastodon.android.api.requests.accounts.SetPrivateNote;
import org.joinmastodon.android.api.requests.accounts.UpdateAccountCredentials;
import org.joinmastodon.android.api.requests.instance.GetInstance;
import org.joinmastodon.android.api.session.AccountSessionManager;
import org.joinmastodon.android.fragments.account_list.BlocksListFragment;
import org.joinmastodon.android.fragments.account_list.FollowerListFragment;
import org.joinmastodon.android.fragments.account_list.FollowingListFragment;
import org.joinmastodon.android.fragments.account_list.MutesListFragment;
import org.joinmastodon.android.fragments.report.ReportReasonChoiceFragment;
import org.joinmastodon.android.fragments.settings.SettingsServerFragment;
import org.joinmastodon.android.model.Account;
@@ -153,7 +155,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
private TextView followsYouView;
private ViewGroup rolesView;
private LinearLayout countersLayout;
private View nameEditWrap, bioEditWrap;
private View nameEditWrap, bioEditWrap, usernameWrap;
private View tabsDivider;
private View actionButtonWrap;
private CustomDrawingOrderLinearLayout scrollableContent;
@@ -259,6 +261,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
bioEdit=content.findViewById(R.id.bio_edit);
nameEditWrap=content.findViewById(R.id.name_edit_wrap);
bioEditWrap=content.findViewById(R.id.bio_edit_wrap);
usernameWrap=content.findViewById(R.id.username_wrap);
actionProgress=content.findViewById(R.id.action_progress);
notifyProgress=content.findViewById(R.id.notify_progress);
fab=content.findViewById(R.id.fab);
@@ -379,6 +382,19 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
if (position == 4) tab.view.setVisibility(View.GONE);
}
});
tabbar.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener(){
@Override
public void onTabSelected(TabLayout.Tab tab){}
@Override
public void onTabUnselected(TabLayout.Tab tab){}
@Override
public void onTabReselected(TabLayout.Tab tab){
if(getFragmentForPage(tab.getPosition()) instanceof ScrollableToTop stt)
stt.scrollToTop();
}
});
cover.setOutlineProvider(new ViewOutlineProvider(){
@Override
@@ -739,7 +755,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
followingCount.setText(UiUtils.abbreviateNumber(account.followingCount));
followersLabel.setText(getResources().getQuantityString(R.plurals.followers, (int)Math.min(999, account.followersCount)));
followingLabel.setText(getResources().getQuantityString(R.plurals.following, (int)Math.min(999, account.followingCount)));
if (account.followersCount < 0) followersBtn.setVisibility(View.GONE);
if (account.followingCount < 0) followingBtn.setVisibility(View.GONE);
if (account.followersCount < 0 || account.followingCount < 0)
@@ -838,7 +854,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
MenuItem mute = menu.findItem(R.id.mute);
mute.setTitle(getString(relationship.muting ? R.string.unmute_user : R.string.mute_user, account.getShortUsername()));
mute.setIcon(relationship.muting ? R.drawable.ic_fluent_speaker_0_24_regular : R.drawable.ic_fluent_speaker_off_24_regular);
mute.setIcon(relationship.muting ? R.drawable.ic_fluent_speaker_2_24_regular : R.drawable.ic_fluent_speaker_off_24_regular);
UiUtils.insetPopupMenuIcon(getContext(), mute);
menu.findItem(R.id.block).setTitle(getString(relationship.blocking ? R.string.unblock_user : R.string.block_user, account.getShortUsername()));
menu.findItem(R.id.report).setTitle(getString(R.string.report_user, account.getShortUsername()));
@@ -917,6 +933,16 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
args.putString("profileDisplayUsername", account.getDisplayUsername());
}
Nav.go(getActivity(), ListsFragment.class, args);
}else if(id==R.id.mutes){
final Bundle args=new Bundle();
args.putString("account", accountID);
args.putParcelable("targetAccount", Parcels.wrap(account));
Nav.go(getActivity(), MutesListFragment.class, args);
}else if(id==R.id.blocks){
final Bundle args=new Bundle();
args.putString("account", accountID);
args.putParcelable("targetAccount", Parcels.wrap(account));
Nav.go(getActivity(), BlocksListFragment.class, args);
}else if(id==R.id.followed_hashtags){
Bundle args=new Bundle();
args.putString("account", accountID);
@@ -1179,7 +1205,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
name.setVisibility(View.GONE);
rolesView.setVisibility(View.GONE);
username.setVisibility(View.GONE);
usernameWrap.setVisibility(View.GONE);
bio.setVisibility(View.GONE);
countersLayout.setVisibility(View.GONE);
@@ -1228,7 +1254,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
bioEditWrap.setVisibility(View.GONE);
name.setVisibility(View.VISIBLE);
rolesView.setVisibility(View.VISIBLE);
username.setVisibility(View.VISIBLE);
usernameWrap.setVisibility(View.VISIBLE);
bio.setVisibility(View.VISIBLE);
countersLayout.setVisibility(View.VISIBLE);
refreshLayout.setEnabled(true);
@@ -1402,9 +1428,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
@NonNull
@Override
public SimpleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){
FrameLayout view=tabViews[viewType];
if (view.getParent() != null) ((ViewGroup)view.getParent()).removeView(view);
view.setVisibility(View.VISIBLE);
FrameLayout view=new FrameLayout(parent.getContext());
view.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
return new SimpleViewHolder(view);
}
@@ -1412,8 +1436,13 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
@Override
public void onBindViewHolder(@NonNull SimpleViewHolder holder, int position){
Fragment fragment=getFragmentForPage(position);
FrameLayout fragmentView=tabViews[position];
fragmentView.setVisibility(View.VISIBLE);
if(fragmentView.getParent() instanceof ViewGroup parent)
parent.removeView(fragmentView);
((FrameLayout)holder.itemView).addView(fragmentView);
if(!fragment.isAdded()){
getChildFragmentManager().beginTransaction().add(holder.itemView.getId(), fragment).commit();
getChildFragmentManager().beginTransaction().add(fragmentView.getId(), fragment).commit();
holder.itemView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener(){
@Override
public boolean onPreDraw(){

View File

@@ -195,10 +195,7 @@ public class ScheduledStatusListFragment extends BaseStatusListFragment<Schedule
public void onApplyWindowInsets(WindowInsets insets){
if(contentView!=null){
if(Build.VERSION.SDK_INT>=29 && insets.getTappableElementInsets().bottom==0){
int insetBottom=insets.getSystemWindowInsetBottom();
((ViewGroup.MarginLayoutParams) list.getLayoutParams()).bottomMargin=insetBottom;
((ViewGroup.MarginLayoutParams) fab.getLayoutParams()).bottomMargin=V.dp(16)+insetBottom;
insets=insets.inset(0, 0, 0, insetBottom);
((ViewGroup.MarginLayoutParams) fab.getLayoutParams()).bottomMargin=V.dp(16)+insets.getSystemWindowInsetBottom();
}else{
((ViewGroup.MarginLayoutParams) fab.getLayoutParams()).bottomMargin=V.dp(16);
}

View File

@@ -11,8 +11,8 @@ import org.joinmastodon.android.E;
import org.joinmastodon.android.GlobalUserPreferences;
import org.joinmastodon.android.api.session.AccountLocalPreferences;
import org.joinmastodon.android.api.session.AccountSessionManager;
import org.joinmastodon.android.events.StatusMuteChangedEvent;
import org.joinmastodon.android.events.EmojiReactionsUpdatedEvent;
import org.joinmastodon.android.MainActivity;
import org.joinmastodon.android.events.PollUpdatedEvent;
import org.joinmastodon.android.events.RemoveAccountPostsEvent;
import org.joinmastodon.android.events.StatusCountersUpdatedEvent;
@@ -24,6 +24,7 @@ import org.joinmastodon.android.model.Status;
import org.joinmastodon.android.ui.displayitems.EmojiReactionsStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.ExtendedFooterStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.FooterStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.HeaderStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.StatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.TextStatusDisplayItem;
import org.joinmastodon.android.ui.utils.UiUtils;
@@ -257,6 +258,28 @@ public abstract class StatusListFragment extends BaseStatusListFragment<Status>
}
}
@Subscribe
public void onStatusMuteChaged(StatusMuteChangedEvent ev){
for(Status s:data){
if(s.getContentStatus().id.equals(ev.id)){
s.getContentStatus().update(ev);
AccountSessionManager.get(accountID).getCacheController().updateStatus(s);
for(int i=0;i<list.getChildCount();i++){
RecyclerView.ViewHolder holder=list.getChildViewHolder(list.getChildAt(i));
if(holder instanceof HeaderStatusDisplayItem.Holder header && header.getItem().status==s.getContentStatus()){
header.rebind();
}
}
}
}
for(Status s:preloadedData){
if(s.getContentStatus().id.equals(ev.id)){
s.getContentStatus().update(ev);
AccountSessionManager.get(accountID).getCacheController().updateStatus(s);
}
}
}
@Subscribe
public void onEmojiReactionsChanged(EmojiReactionsUpdatedEvent ev){
for(Status s:data){

View File

@@ -7,14 +7,17 @@ import android.view.View;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.squareup.otto.Subscribe;
import org.joinmastodon.android.E;
import org.joinmastodon.android.GlobalUserPreferences;
import org.joinmastodon.android.GlobalUserPreferences.AutoRevealMode;
import org.joinmastodon.android.R;
import org.joinmastodon.android.api.requests.statuses.GetStatusByID;
import org.joinmastodon.android.api.requests.statuses.GetStatusContext;
import org.joinmastodon.android.api.session.AccountSessionManager;
import org.joinmastodon.android.events.StatusCountersUpdatedEvent;
import org.joinmastodon.android.events.StatusCreatedEvent;
import org.joinmastodon.android.events.StatusMuteChangedEvent;
import org.joinmastodon.android.events.StatusUpdatedEvent;
import org.joinmastodon.android.model.Account;
import org.joinmastodon.android.model.FilterContext;
@@ -23,6 +26,7 @@ import org.joinmastodon.android.model.StatusContext;
import org.joinmastodon.android.ui.BetterItemAnimator;
import org.joinmastodon.android.ui.displayitems.ExtendedFooterStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.FooterStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.HeaderStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.ReblogOrReplyLineStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.StatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.TextStatusDisplayItem;
@@ -66,6 +70,28 @@ public class ThreadFragment extends StatusListFragment implements ProvidesAssist
onAppendItems(Collections.singletonList(mainStatus));
setTitle(HtmlParser.parseCustomEmoji(getString(R.string.post_from_user, mainStatus.account.displayName), mainStatus.account.emojis));
transitionFinished = getArguments().getBoolean("noTransition", false);
E.register(this);
}
@Override
public void onDestroy(){
super.onDestroy();
E.unregister(this);
}
@Subscribe
public void onStatusMuteChaged(StatusMuteChangedEvent ev){
for(Status s:data){
s.getContentStatus().update(ev);
AccountSessionManager.get(accountID).getCacheController().updateStatus(s);
for(int i=0;i<list.getChildCount();i++){
RecyclerView.ViewHolder holder=list.getChildViewHolder(list.getChildAt(i));
if(holder instanceof HeaderStatusDisplayItem.Holder header && header.getItem().status==s.getContentStatus()){
header.rebind();
}
}
}
}
@Override
@@ -321,7 +347,7 @@ public class ThreadFragment extends StatusListFragment implements ProvidesAssist
private static List<Status> getDirectDescendants(String id, List<Status> statuses){
return statuses.stream()
.filter(s -> s.inReplyToId.equals(id))
.filter(s -> id.equals(s.inReplyToId))
.collect(Collectors.toList());
}

View File

@@ -0,0 +1,36 @@
package org.joinmastodon.android.fragments.account_list;
import android.net.Uri;
import android.os.Bundle;
import org.joinmastodon.android.R;
import org.joinmastodon.android.api.requests.HeaderPaginationRequest;
import org.joinmastodon.android.api.requests.accounts.GetAccountBlocks;
import org.joinmastodon.android.model.Account;
import org.joinmastodon.android.ui.viewholders.AccountViewHolder;
public class BlocksListFragment extends AccountRelatedAccountListFragment{
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setTitle(R.string.mo_blocked_accounts);
}
@Override
public HeaderPaginationRequest<Account> onCreateRequest(String maxID, int count){
return new GetAccountBlocks(maxID, count);
}
@Override
protected void onConfigureViewHolder(AccountViewHolder holder){
super.onConfigureViewHolder(holder);
holder.setStyle(AccountViewHolder.AccessoryType.NONE, false);
}
@Override
public Uri getWebUri(Uri.Builder base) {
return super.getWebUri(base).buildUpon()
.appendPath("/blocks").build();
}
}

View File

@@ -48,7 +48,7 @@ public class ComposeAccountSearchFragment extends BaseAccountListFragment{
@Override
protected void doLoadData(int offset, int count){
refreshing=true;
currentRequest=new GetSearchResults(currentQuery, GetSearchResults.Type.ACCOUNTS, false)
currentRequest=new GetSearchResults(currentQuery, GetSearchResults.Type.ACCOUNTS, false, null, 0, 0)
.setCallback(new SimpleCallback<>(this){
@Override
public void onSuccess(SearchResults result){

View File

@@ -0,0 +1,36 @@
package org.joinmastodon.android.fragments.account_list;
import android.net.Uri;
import android.os.Bundle;
import org.joinmastodon.android.R;
import org.joinmastodon.android.api.requests.HeaderPaginationRequest;
import org.joinmastodon.android.api.requests.accounts.GetAccountMutes;
import org.joinmastodon.android.model.Account;
import org.joinmastodon.android.ui.viewholders.AccountViewHolder;
public class MutesListFragment extends AccountRelatedAccountListFragment{
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setTitle(R.string.mo_muted_accounts);
}
@Override
public HeaderPaginationRequest<Account> onCreateRequest(String maxID, int count){
return new GetAccountMutes(maxID, count);
}
@Override
protected void onConfigureViewHolder(AccountViewHolder holder){
super.onConfigureViewHolder(holder);
holder.setStyle(AccountViewHolder.AccessoryType.NONE, false);
}
@Override
public Uri getWebUri(Uri.Builder base) {
return super.getWebUri(base).buildUpon()
.appendPath("/mutes").build();
}
}

View File

@@ -295,15 +295,19 @@ public class DiscoverFragment extends AppKitFragment implements ScrollableToTop,
@NonNull
@Override
public SimpleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){
FrameLayout view=tabViews[viewType];
((ViewGroup)view.getParent()).removeView(view);
view.setVisibility(View.VISIBLE);
FrameLayout view=new FrameLayout(parent.getContext());
view.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
return new SimpleViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull SimpleViewHolder holder, int position){}
public void onBindViewHolder(@NonNull SimpleViewHolder holder, int position){
FrameLayout view=tabViews[position];
if(view.getParent() instanceof ViewGroup parent)
parent.removeView(view);
view.setVisibility(View.VISIBLE);
((FrameLayout)holder.itemView).addView(view, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
}
@Override
public int getItemCount(){

View File

@@ -23,7 +23,6 @@ import org.joinmastodon.android.model.Status;
import org.joinmastodon.android.ui.displayitems.AccountStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.HashtagStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.StatusDisplayItem;
import org.joinmastodon.android.ui.tabs.TabLayout;
import org.joinmastodon.android.ui.utils.UiUtils;
import org.parceler.Parcels;
@@ -31,7 +30,7 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.EnumSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import me.grishka.appkit.Nav;
@@ -113,7 +112,7 @@ public class SearchFragment extends BaseStatusListFragment<SearchResult>{
}
@Override
protected void doLoadData(int offset, int count){
protected void doLoadData(int _offset, int count){
GetSearchResults.Type type;
if(currentFilter.size()==1){
type=switch(currentFilter.iterator().next()){
@@ -128,7 +127,21 @@ public class SearchFragment extends BaseStatusListFragment<SearchResult>{
dataLoaded();
return;
}
currentRequest=new GetSearchResults(currentQuery, type, true)
String maxID=null;
// TODO server-side bug
/*int offset=0;
if(_offset>0){
if(type==GetSearchResults.Type.STATUSES){
if(!preloadedData.isEmpty())
maxID=preloadedData.get(preloadedData.size()-1).status.id;
else if(!data.isEmpty())
maxID=data.get(data.size()-1).status.id;
}else{
offset=_offset;
}
}*/
int offset=_offset;
currentRequest=new GetSearchResults(currentQuery, type, type==null, maxID, offset, type==null ? 0 : count)
.setCallback(new Callback<>(){
@Override
public void onSuccess(SearchResults result){
@@ -142,12 +155,15 @@ public class SearchFragment extends BaseStatusListFragment<SearchResult>{
results.add(new SearchResult(tag));
}
if(result.statuses!=null){
for(Status status:result.statuses)
results.add(new SearchResult(status));
Set<String> alreadyLoadedStatuses=data.stream().filter(r->r.type==SearchResult.Type.STATUS).map(r->r.status.id).collect(Collectors.toSet());
for(Status status:result.statuses){
if(!alreadyLoadedStatuses.contains(status.id))
results.add(new SearchResult(status));
}
}
prevDisplayItems=new ArrayList<>(displayItems);
unfilteredResults=results;
onDataLoaded(filterSearchResults(results), false);
onDataLoaded(filterSearchResults(results), type!=null && !results.isEmpty());
}
@Override

View File

@@ -122,7 +122,7 @@ public class SearchQueryFragment extends MastodonRecyclerFragment<SearchResultVi
recentsHeader.setVisible(!data.isEmpty());
});
}else{
currentRequest=new GetSearchResults(currentQuery, null, false)
currentRequest=new GetSearchResults(currentQuery, null, false, null, 0, 0)
.limit(2)
.setCallback(new SimpleCallback<>(this){
@Override
@@ -424,6 +424,8 @@ public class SearchQueryFragment extends MastodonRecyclerFragment<SearchResultVi
}
private void onSearchViewEnter(){
if(TextUtils.isEmpty(currentQuery) || currentQuery.trim().isEmpty())
return;
wrapSuicideDialog(()->deliverResult(currentQuery, null));
}
@@ -475,6 +477,8 @@ public class SearchQueryFragment extends MastodonRecyclerFragment<SearchResultVi
}
private void deliverResult(String query, SearchResult.Type typeFilter){
if(query.isEmpty())
return;
Bundle res=new Bundle();
res.putString("query", query);
if(typeFilter!=null)

View File

@@ -271,7 +271,7 @@ public class SignupFragment extends ToolbarFragment{
@Override
public void tail(Node node, int depth){
if(node instanceof Element){
ssb.setSpan(new LinkSpan("", SignupFragment.this::onGoBackLinkClick, LinkSpan.Type.CUSTOM, null), spanStart, ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ssb.setSpan(new LinkSpan("", SignupFragment.this::onGoBackLinkClick, LinkSpan.Type.CUSTOM, null, null), spanStart, ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ssb.setSpan(new TypefaceSpan("sans-serif-medium"), spanStart, ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}

View File

@@ -68,6 +68,10 @@ public class EditFilterFragment extends BaseSettingsFragment<Void> implements On
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
filter=Parcels.unwrap(getArguments().getParcelable("filter"));
ArrayList<Parcelable> words=getArguments().getParcelableArrayList("words");
if (words != null) {
words.stream().map(p->(FilterKeyword)Parcels.unwrap(p)).forEach(keywords::add);
}
setTitle(filter==null ? R.string.settings_add_filter : R.string.settings_edit_filter);
onDataLoaded(List.of(
durationItem=new ListItem<>(R.string.settings_filter_duration, 0, this::onDurationClick),

View File

@@ -61,7 +61,7 @@ public class SettingsBehaviorFragment extends BaseSettingsFragment<Void> impleme
prefixRepliesItem=new ListItem<>(R.string.sk_settings_prefix_reply_cw_with_re, getPrefixWithRepliesString(), R.drawable.ic_fluent_arrow_reply_24_regular, this::onPrefixRepliesClick),
forwardReportsItem=new CheckableListItem<>(R.string.sk_settings_forward_report_default, 0, CheckableListItem.Style.SWITCH, GlobalUserPreferences.forwardReportDefault, R.drawable.ic_fluent_arrow_forward_24_regular, ()->toggleCheckableItem(forwardReportsItem)),
loadNewPostsItem=new CheckableListItem<>(R.string.sk_settings_load_new_posts, 0, CheckableListItem.Style.SWITCH, GlobalUserPreferences.loadNewPosts, R.drawable.ic_fluent_arrow_sync_24_regular, this::onLoadNewPostsClick),
seeNewPostsBtnItem=new CheckableListItem<>(R.string.sk_settings_show_new_posts_button, 0, CheckableListItem.Style.SWITCH, GlobalUserPreferences.showNewPostsButton, R.drawable.ic_fluent_arrow_up_24_regular, ()->toggleCheckableItem(seeNewPostsBtnItem)),
seeNewPostsBtnItem=new CheckableListItem<>(R.string.sk_settings_see_new_posts_button, 0, CheckableListItem.Style.SWITCH, GlobalUserPreferences.showNewPostsButton, R.drawable.ic_fluent_arrow_up_24_regular, ()->toggleCheckableItem(seeNewPostsBtnItem)),
remoteLoadingItem=new CheckableListItem<>(R.string.sk_settings_allow_remote_loading, R.string.sk_settings_allow_remote_loading_explanation, CheckableListItem.Style.SWITCH, GlobalUserPreferences.allowRemoteLoading, R.drawable.ic_fluent_communication_24_regular, ()->toggleCheckableItem(remoteLoadingItem)),
mentionRebloggerAutomaticallyItem=new CheckableListItem<>(R.string.mo_mention_reblogger_automatically, 0, CheckableListItem.Style.SWITCH, GlobalUserPreferences.mentionRebloggerAutomatically, R.drawable.ic_fluent_comment_mention_24_regular, ()->toggleCheckableItem(mentionRebloggerAutomaticallyItem)),
hapticFeedbackItem=new CheckableListItem<>(R.string.mo_haptic_feedback, R.string.mo_setting_haptic_feedback_summary, CheckableListItem.Style.SWITCH, GlobalUserPreferences.hapticFeedback, R.drawable.ic_fluent_phone_vibrate_24_regular,()->toggleCheckableItem(hapticFeedbackItem), true),

View File

@@ -55,6 +55,7 @@ public class SettingsMainFragment extends BaseSettingsFragment<Void>{
onDataLoaded(List.of(
new ListItem<>(R.string.settings_behavior, 0, R.drawable.ic_fluent_settings_24_regular, this::onBehaviorClick),
new ListItem<>(R.string.settings_display, 0, R.drawable.ic_fluent_color_24_regular, this::onDisplayClick),
// new ListItem<>(R.string.settings_privacy, 0, R.drawable.ic_privacy_tip_24px, this::onPrivacyClick),
new ListItem<>(R.string.settings_notifications, 0, R.drawable.ic_fluent_alert_24_regular, this::onNotificationsClick),
new ListItem<>(R.string.sk_settings_instance, 0, R.drawable.ic_fluent_server_24_regular, this::onInstanceClick),
new ListItem<>(getString(R.string.about_app, getString(R.string.mo_app_name)), null, R.drawable.ic_fluent_info_24_regular, this::onAboutClick, null, 0, true),
@@ -133,6 +134,10 @@ public class SettingsMainFragment extends BaseSettingsFragment<Void>{
Nav.go(getActivity(), SettingsDisplayFragment.class, makeFragmentArgs());
}
// private void onPrivacyClick(){
// Nav.go(getActivity(), SettingsPrivacyFragment.class, makeFragmentArgs());
// }
private void onFiltersClick(){
Nav.go(getActivity(), SettingsFiltersFragment.class, makeFragmentArgs());
}

View File

@@ -0,0 +1,41 @@
package org.joinmastodon.android.fragments.settings;
import android.os.Bundle;
import org.joinmastodon.android.R;
import org.joinmastodon.android.api.session.AccountSessionManager;
import org.joinmastodon.android.model.Account;
import org.joinmastodon.android.model.viewmodel.CheckableListItem;
import java.util.List;
public class SettingsPrivacyFragment extends BaseSettingsFragment<Void>{
private CheckableListItem<Void> discoverableItem, indexableItem;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setTitle(R.string.settings_privacy);
Account self=AccountSessionManager.get(accountID).self;
onDataLoaded(List.of(
discoverableItem=new CheckableListItem<>(R.string.settings_discoverable, 0, CheckableListItem.Style.SWITCH, self.discoverable, R.drawable.ic_thumbs_up_down_24px, ()->toggleCheckableItem(discoverableItem)),
indexableItem=new CheckableListItem<>(R.string.settings_indexable, 0, CheckableListItem.Style.SWITCH, self.source.indexable!=null ? self.source.indexable : true, R.drawable.ic_search_24px, ()->toggleCheckableItem(indexableItem))
));
if(self.source.indexable==null)
indexableItem.isEnabled=false;
}
@Override
protected void doLoadData(int offset, int count){}
@Override
public void onPause(){
super.onPause();
Account self=AccountSessionManager.get(accountID).self;
if(self.discoverable!=discoverableItem.checked || (self.source.indexable!=null && self.source.indexable!=indexableItem.checked)){
self.discoverable=discoverableItem.checked;
self.source.indexable=indexableItem.checked;
AccountSessionManager.get(accountID).savePreferencesLater();
}
}
}

View File

@@ -153,18 +153,21 @@ public class SettingsServerFragment extends AppKitFragment{
@NonNull
@Override
public SimpleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){
FrameLayout view=tabViews[viewType];
((ViewGroup)view.getParent()).removeView(view);
view.setVisibility(View.VISIBLE);
FrameLayout view=new FrameLayout(parent.getContext());
view.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
return new SimpleViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull SimpleViewHolder holder, int position){
FrameLayout view=tabViews[position];
if(view.getParent() instanceof ViewGroup parent)
parent.removeView(view);
view.setVisibility(View.VISIBLE);
((FrameLayout)holder.itemView).addView(view, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
Fragment fragment=getFragmentForPage(position);
if(!fragment.isAdded()){
getChildFragmentManager().beginTransaction().add(holder.itemView.getId(), fragment).commit();
getChildFragmentManager().beginTransaction().add(view.getId(), fragment).commit();
holder.itemView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener(){
@Override
public boolean onPreDraw(){

View File

@@ -139,6 +139,7 @@ public class Account extends BaseModel implements Searchable{
* When a timed mute will expire, if applicable.
*/
public Instant muteExpiresAt;
public boolean noindex;
public List<Role> roles;
@@ -238,6 +239,7 @@ public class Account extends BaseModel implements Searchable{
", source="+source+
", suspended="+suspended+
", muteExpiresAt="+muteExpiresAt+
", noindex="+noindex+
'}';
}
}

View File

@@ -46,26 +46,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(){

View File

@@ -23,6 +23,7 @@ public class Hashtag extends BaseModel implements DisplayItemsParent{
", following="+following+
", history="+history+
", statusesCount="+statusesCount+
", following="+following+
'}';
}
@@ -30,4 +31,19 @@ public class Hashtag extends BaseModel implements DisplayItemsParent{
public String getID(){
return name;
}
@Override
public boolean equals(Object o){
if(this==o) return true;
if(o==null || getClass()!=o.getClass()) return false;
Hashtag hashtag=(Hashtag) o;
return name.equals(hashtag.name);
}
@Override
public int hashCode(){
return name.hashCode();
}
}

View File

@@ -20,4 +20,22 @@ public class Mention extends BaseModel{
", url='"+url+'\''+
'}';
}
@Override
public boolean equals(Object o){
if(this==o) return true;
if(o==null || getClass()!=o.getClass()) return false;
Mention mention=(Mention) o;
if(!id.equals(mention.id)) return false;
return url.equals(mention.url);
}
@Override
public int hashCode(){
int result=id.hashCode();
result=31*result+url.hashCode();
return result;
}
}

View File

@@ -37,6 +37,8 @@ public class Source extends BaseModel{
* The number of pending follow requests.
*/
public int followRequestCount;
public Boolean indexable;
public boolean hideCollections;
@Override
public void postprocess() throws ObjectValidationException{
@@ -54,6 +56,8 @@ public class Source extends BaseModel{
", sensitive="+sensitive+
", language='"+language+'\''+
", followRequestCount="+followRequestCount+
", indexable="+indexable+
", hideCollections="+hideCollections+
'}';
}
}

View File

@@ -20,6 +20,7 @@ import org.joinmastodon.android.api.RequiredField;
import org.joinmastodon.android.api.session.AccountSessionManager;
import org.joinmastodon.android.events.EmojiReactionsUpdatedEvent;
import org.joinmastodon.android.events.StatusCountersUpdatedEvent;
import org.joinmastodon.android.events.StatusMuteChangedEvent;
import org.joinmastodon.android.ui.text.HtmlParser;
import org.parceler.Parcel;
@@ -28,8 +29,6 @@ import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
import androidx.annotation.NonNull;
@Parcel
public class Status extends BaseModel implements DisplayItemsParent, Searchable{
@RequiredField
@@ -183,6 +182,10 @@ public class Status extends BaseModel implements DisplayItemsParent, Searchable{
pinned=ev.pinned;
}
public void update(StatusMuteChangedEvent ev) {
muted=ev.muted;
}
public void update(EmojiReactionsUpdatedEvent ev){
reactions=ev.reactions;
}

View File

@@ -0,0 +1,10 @@
package org.joinmastodon.android.model;
import org.joinmastodon.android.api.AllFieldsAreRequired;
@AllFieldsAreRequired
public class Translation extends BaseModel{
public String content;
public String detectedSourceLanguage;
public String provider;
}

View File

@@ -38,6 +38,7 @@ import org.joinmastodon.android.fragments.ThreadFragment;
import org.joinmastodon.android.fragments.report.ReportReasonChoiceFragment;
import org.joinmastodon.android.model.Account;
import org.joinmastodon.android.model.Announcement;
import org.joinmastodon.android.model.Mention;
import org.joinmastodon.android.model.Notification;
import org.joinmastodon.android.model.Relationship;
import org.joinmastodon.android.model.ScheduledStatus;
@@ -56,6 +57,7 @@ import java.time.format.FormatStyle;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Objects;
import java.util.function.Consumer;
import androidx.annotation.LayoutRes;
@@ -248,6 +250,8 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
UiUtils.confirmPinPost(item.parentFragment.getActivity(), item.parentFragment.getAccountID(), item.status, !item.status.pinned, s->{});
}else if(id==R.id.mute){
UiUtils.confirmToggleMuteUser(item.parentFragment.getActivity(), item.parentFragment.getAccountID(), account, relationship!=null && relationship.muting, r->{});
}else if (id==R.id.mute_conversation || id==R.id.unmute_conversation) {
UiUtils.confirmToggleMuteConversation(item.parentFragment.getActivity(), item.parentFragment.getAccountID(), item.status, ()->{});
}else if(id==R.id.block){
UiUtils.confirmToggleBlockUser(item.parentFragment.getActivity(), item.parentFragment.getAccountID(), account, relationship!=null && relationship.blocking, r->{});
}else if(id==R.id.report){
@@ -507,6 +511,14 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
menu.findItem(R.id.delete_and_redraft).setVisible(!isPostScheduled && item.status!=null && isOwnPost);
menu.findItem(R.id.pin).setVisible(!isPostScheduled && item.status!=null && isOwnPost && !item.status.pinned);
menu.findItem(R.id.unpin).setVisible(!isPostScheduled && item.status!=null && isOwnPost && item.status.pinned);
menu.findItem(R.id.mute_conversation).setVisible((item.status!=null && !item.status.muted && !isPostScheduled) && (isOwnPost || item.status.mentions.stream().anyMatch(m->{
if(m==null)
return false;
return AccountSessionManager.get(item.parentFragment.getAccountID()).self.id.equals(m.id) ||
AccountSessionManager.get(item.parentFragment.getAccountID()).self.getFullyQualifiedName().equals(m.username) ||
AccountSessionManager.get(item.parentFragment.getAccountID()).self.acct.equals(m.acct);
})));
menu.findItem(R.id.unmute_conversation).setVisible(item.status!=null && item.status.muted);
menu.findItem(R.id.open_in_browser).setVisible(!isPostScheduled && item.status!=null);
menu.findItem(R.id.copy_link).setVisible(!isPostScheduled && item.status!=null);
MenuItem blockDomain=menu.findItem(R.id.block_domain);

View File

@@ -113,7 +113,6 @@ public class NotificationHeaderStatusDisplayItem extends StatusDisplayItem{
public static class Holder extends StatusDisplayItem.Holder<NotificationHeaderStatusDisplayItem> implements ImageLoaderViewHolder{
private final ImageView icon, avatar;
private final TextView text;
private final int selectableItemBackground;
public Holder(Activity activity, ViewGroup parent){
super(activity, R.layout.display_item_notification_header, parent);
@@ -124,10 +123,8 @@ public class NotificationHeaderStatusDisplayItem extends StatusDisplayItem{
avatar.setOutlineProvider(OutlineProviders.roundedRect(8));
avatar.setClipToOutline(true);
itemView.setOnClickListener(this::onItemClick);
TypedValue outValue = new TypedValue();
context.getTheme().resolveAttribute(android.R.attr.selectableItemBackground, outValue, true);
selectableItemBackground = outValue.resourceId;
icon.setOnClickListener(this::onItemClick);
avatar.setOnClickListener(this::onItemClick);
}
@Override
@@ -170,10 +167,7 @@ public class NotificationHeaderStatusDisplayItem extends StatusDisplayItem{
case POLL -> R.attr.colorPoll;
default -> android.R.attr.colorAccent;
})));
itemView.setBackgroundResource(item.notification.type != Notification.Type.POLL
&& item.notification.type != Notification.Type.REPORT ?
selectableItemBackground : 0);
itemView.setClickable(item.notification.type != Notification.Type.POLL);
itemView.setBackgroundResource(0);
}
public void onItemClick(View v) {

View File

@@ -73,10 +73,9 @@ public class PreviewlessMediaGridStatusDisplayItem extends StatusDisplayItem{
super(new FrameLayoutThatOnlyMeasuresFirstChild(activity));
wrapper=(FrameLayout)itemView;
layout= new LinearLayout(activity);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
params.setMargins(V.dp(16), 0, V.dp(16), 0);
layout.setLayoutParams(params);
layout.setOrientation(LinearLayout.VERTICAL);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
layout.setLayoutParams(params);
wrapper.addView(layout);
wrapper.setClipToPadding(false);

View File

@@ -15,6 +15,7 @@ import android.widget.TextView;
import org.joinmastodon.android.GlobalUserPreferences;
import org.joinmastodon.android.R;
import org.joinmastodon.android.api.session.AccountSessionManager;
import org.joinmastodon.android.fragments.BaseStatusListFragment;
import org.joinmastodon.android.model.Emoji;
import org.joinmastodon.android.model.Status;
@@ -53,7 +54,8 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{
public ReblogOrReplyLineStatusDisplayItem(String parentID, BaseStatusListFragment parentFragment, CharSequence text, List<Emoji> emojis, @DrawableRes int icon, StatusPrivacy visibility, @Nullable View.OnClickListener handleClick, CharSequence fullText, Status status) {
super(parentID, parentFragment);
SpannableStringBuilder ssb=new SpannableStringBuilder(text);
HtmlParser.parseCustomEmoji(ssb, emojis);
if(AccountSessionManager.get(parentFragment.getAccountID()).getLocalPreferences().customEmojiInNames)
HtmlParser.parseCustomEmoji(ssb, emojis);
this.text=ssb;
emojiHelper.setText(ssb);
this.icon=icon;

View File

@@ -99,15 +99,11 @@ public class BlurhashCrossfadeDrawable extends Drawable{
@Override
public int getIntrinsicWidth(){
if(width==0)
return imageDrawable==null ? 1920 : imageDrawable.getIntrinsicWidth();
return width;
}
@Override
public int getIntrinsicHeight(){
if(height==0)
return imageDrawable==null ? 1080 : imageDrawable.getIntrinsicHeight();
return height;
}

View File

@@ -147,7 +147,7 @@ public class PhotoViewer implements ZoomPanView.Listener{
toolbarWrap.setPadding(0, 0, 0, 0);
videoControls.setPadding(0, 0, 0, 0);
}
insets=insets.replaceSystemWindowInsets(tappable.left, tappable.top, tappable.right, tappable.bottom);
insets=insets.replaceSystemWindowInsets(tappable.left, tappable.top, tappable.right, insets.getSystemWindowInsetBottom());
}
uiOverlay.dispatchApplyWindowInsets(insets);
int bottomInset=insets.getSystemWindowInsetBottom();
@@ -602,7 +602,7 @@ public class PhotoViewer implements ZoomPanView.Listener{
private void updateVideoPosition(){
if(videoPositionNeedsUpdating){
int currentPosition=videoInitialPosition+(int)(SystemClock.uptimeMillis()-videoInitialPositionTime);
int currentPosition=(videoInitialPosition+(int)(SystemClock.uptimeMillis()-videoInitialPositionTime))%videoDuration;
videoSeekBar.setProgress(Math.round((float)currentPosition/videoDuration*10000f));
updateVideoTimeText(currentPosition);
windowView.postOnAnimation(videoPositionUpdater);
@@ -878,6 +878,8 @@ public class PhotoViewer implements ZoomPanView.Listener{
@Override
public void onVideoSizeChanged(MediaPlayer mp, int width, int height){
if(width<=0 || height<=0)
return;
FrameLayout.LayoutParams params=(FrameLayout.LayoutParams) wrap.getLayoutParams();
params.width=width;
params.height=height;

View File

@@ -119,6 +119,9 @@ public class ZoomPanView extends FrameLayout implements ScaleGestureDetector.OnS
int width=right-left;
int height=bottom-top;
if(width==0 || height==0)
return;
float scale=Math.min(width/(float)child.getWidth(), height/(float)child.getHeight());
minScale=scale;
maxScale=Math.max(3f, height/(float)child.getHeight());
@@ -306,8 +309,6 @@ public class ZoomPanView extends FrameLayout implements ScaleGestureDetector.OnS
}, 1f).setMinimumVisibleChange(DynamicAnimation.MIN_VISIBLE_CHANGE_ALPHA));
}
}else{
if(animatingTransition)
Log.w(TAG, "updateViewTransform: ", new Throwable().fillInStackTrace());
child.setScaleX(matrixValues[Matrix.MSCALE_X]);
child.setScaleY(matrixValues[Matrix.MSCALE_Y]);
child.setTranslationX(matrixValues[Matrix.MTRANS_X]);

View File

@@ -71,7 +71,6 @@ import org.joinmastodon.android.R;
import org.joinmastodon.android.api.MastodonAPIRequest;
import org.joinmastodon.android.api.MastodonErrorResponse;
import org.joinmastodon.android.api.StatusInteractionController;
import org.joinmastodon.android.api.requests.accounts.GetAccountByHandle;
import org.joinmastodon.android.api.requests.accounts.SetAccountBlocked;
import org.joinmastodon.android.api.requests.accounts.SetAccountFollowed;
import org.joinmastodon.android.api.requests.accounts.SetAccountMuted;
@@ -85,9 +84,11 @@ import org.joinmastodon.android.api.requests.search.GetSearchResults;
import org.joinmastodon.android.api.requests.statuses.CreateStatus;
import org.joinmastodon.android.api.requests.statuses.DeleteStatus;
import org.joinmastodon.android.api.requests.statuses.GetStatusByID;
import org.joinmastodon.android.api.requests.statuses.SetStatusMuted;
import org.joinmastodon.android.api.requests.statuses.SetStatusPinned;
import org.joinmastodon.android.api.session.AccountSession;
import org.joinmastodon.android.api.session.AccountSessionManager;
import org.joinmastodon.android.events.StatusMuteChangedEvent;
import org.joinmastodon.android.events.ScheduledStatusDeletedEvent;
import org.joinmastodon.android.events.StatusCountersUpdatedEvent;
import org.joinmastodon.android.events.FollowRequestHandledEvent;
@@ -140,7 +141,6 @@ import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.BiConsumer;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.BiPredicate;
import java.util.function.Consumer;
import java.util.function.Function;
@@ -219,11 +219,20 @@ public class UiUtils {
if(diff<1000L){
return context.getString(R.string.time_now);
}else if(diff<60_000L){
return context.getString(ago ? R.string.time_seconds_ago_short : R.string.sk_time_seconds, diff/1000L);
long time = diff/1000L;
return ago ?
context.getString(R.string.time_seconds_ago_short, time) :
context.getResources().getQuantityString(R.plurals.sk_time_seconds, (int) time, time);
}else if(diff<3600_000L){
return context.getString(ago ? R.string.time_minutes_ago_short : R.string.sk_time_minutes, diff/60_000L);
long time = diff/60_000L;
return ago ?
context.getString(R.string.time_minutes_ago_short, time) :
context.getResources().getQuantityString(R.plurals.sk_time_minutes, (int) time, time);
}else if(diff<3600_000L*24L){
return context.getString(ago ? R.string.time_hours_ago_short : R.string.sk_time_hours, diff/3600_000L);
long time = diff/3600_000L;
return ago ?
context.getString(R.string.time_hours_ago_short, time) :
context.getResources().getQuantityString(R.plurals.sk_time_hours, (int) time, time);
} else {
int days = (int) (diff / (3600_000L * 24L));
if (ago && days > 30) {
@@ -234,7 +243,7 @@ public class UiUtils {
return DATE_FORMATTER_SHORT_WITH_YEAR.format(dt);
}
}
return context.getString(ago ? R.string.time_days_ago_short : R.string.sk_time_days, days);
return ago ? context.getString(R.string.time_days_ago_short, days) : context.getResources().getQuantityString(R.plurals.sk_time_days, days, days);
}
}
@@ -624,7 +633,7 @@ public class UiUtils {
.exec(accountID);
})
.setNegativeButton(R.string.cancel, null)
.setIcon(currentlyMuted ? R.drawable.ic_fluent_speaker_0_28_regular : R.drawable.ic_fluent_speaker_off_28_regular)
.setIcon(currentlyMuted ? R.drawable.ic_fluent_speaker_2_28_regular : R.drawable.ic_fluent_speaker_off_28_regular)
.show();
}
@@ -657,6 +666,32 @@ public class UiUtils {
);
}
public static void confirmToggleMuteConversation(Activity activity, String accountID, Status status, Runnable resultCallback) {
showConfirmationAlert(activity,
status.muted ? R.string.mo_unmute_conversation : R.string.mo_mute_conversation,
status.muted ? R.string.mo_confirm_to_unmute_conversation : R.string.mo_confirm_to_mute_conversation,
status.muted ? R.string.do_unmute : R.string.do_mute,
status.muted ? R.drawable.ic_fluent_alert_28_regular : R.drawable.ic_fluent_alert_off_28_regular,
() -> new SetStatusMuted(status.id, !status.muted)
.setCallback(new Callback<Status>(){
@Override
public void onSuccess(Status result){
resultCallback.run();
Toast.makeText(activity, result.muted ? R.string.mo_muted_conversation_successfully : R.string.mo_unmuted_conversation_successfully, Toast.LENGTH_SHORT).show();
E.post(new StatusMuteChangedEvent(result));
}
@Override
public void onError(ErrorResponse error){
error.showToast(activity);
}
})
.wrapProgress(activity, status.muted ? R.string.mo_unmuting : R.string.mo_muting, false)
.exec(accountID)
);
}
public static void confirmDeleteScheduledPost(Activity activity, String accountID, ScheduledStatus status, Runnable resultCallback) {
boolean isDraft = status.scheduledAt.isAfter(CreateStatus.DRAFTS_AFTER_INSTANT);
showConfirmationAlert(activity,
@@ -1192,7 +1227,7 @@ public class UiUtils {
return Optional.empty();
}
return Optional.of(new GetSearchResults(query.getQuery(), type, true).setCallback(new Callback<>() {
return Optional.of(new GetSearchResults(query.getQuery(), type, true, null, 0, 0).setCallback(new Callback<>() {
@Override
public void onSuccess(SearchResults results) {
Optional<T> result = extractResult.apply(results);
@@ -1289,7 +1324,7 @@ public class UiUtils {
}
public static MastodonAPIRequest<SearchResults> lookupAccountHandle(Context context, String accountID, Pair<String, Optional<String>> queryHandle, BiConsumer<Class<? extends Fragment>, Bundle> go) {
String fullHandle = ("@" + queryHandle.first) + (queryHandle.second.map(domain -> "@" + domain).orElse(""));
return new GetSearchResults(fullHandle, GetSearchResults.Type.ACCOUNTS, true)
return new GetSearchResults(fullHandle, GetSearchResults.Type.ACCOUNTS, true, null, 0, 0)
.setCallback(new Callback<>() {
@Override
public void onSuccess(SearchResults results) {
@@ -1352,7 +1387,7 @@ public class UiUtils {
})
.execNoAuth(uri.getHost()));
} else if (looksLikeMastodonUrl(url)) {
return Optional.of(new GetSearchResults(url, null, true)
return Optional.of(new GetSearchResults(url, null, true, null, 0, 0)
.setCallback(new Callback<>() {
@Override
public void onSuccess(SearchResults results) {

View File

@@ -15,15 +15,12 @@ import android.widget.TextView;
import org.joinmastodon.android.R;
import org.joinmastodon.android.api.requests.search.GetSearchResults;
import org.joinmastodon.android.api.session.AccountSessionManager;
import org.joinmastodon.android.model.Account;
import org.joinmastodon.android.model.Emoji;
import org.joinmastodon.android.model.Hashtag;
import org.joinmastodon.android.model.SearchResults;
import org.joinmastodon.android.model.viewmodel.AccountViewModel;
import org.joinmastodon.android.ui.BetterItemAnimator;
import org.joinmastodon.android.ui.OutlineProviders;
import org.joinmastodon.android.ui.text.HtmlParser;
import org.joinmastodon.android.ui.utils.CustomEmojiHelper;
import org.joinmastodon.android.ui.utils.HideableSingleViewRecyclerAdapter;
import org.joinmastodon.android.ui.utils.UiUtils;
import org.joinmastodon.android.ui.views.FilterChipView;
@@ -96,6 +93,24 @@ public class ComposeAutocompleteViewController{
outRect.right=V.dp(8);
}
});
// Set empty adapter to prevent NPEs
list.setAdapter(new RecyclerView.Adapter<>(){
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){
throw new UnsupportedOperationException();
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position){
}
@Override
public int getItemCount(){
return 0;
}
});
contentView.addView(list, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
emptyButton=new FilterChipView(activity);
@@ -222,11 +237,13 @@ public class ComposeAutocompleteViewController{
}
private void doSearchUsers(){
currentRequest=new GetSearchResults(lastText, GetSearchResults.Type.ACCOUNTS, false)
currentRequest=new GetSearchResults(lastText, GetSearchResults.Type.ACCOUNTS, false, null, 0, 0)
.setCallback(new Callback<>(){
@Override
public void onSuccess(SearchResults result){
currentRequest=null;
if(mode!=Mode.USERS)
return;
List<AccountViewModel> oldList=users;
users=result.accounts.stream().map(a->new AccountViewModel(a, accountID)).collect(Collectors.toList());
if(isLoading){
@@ -256,7 +273,7 @@ public class ComposeAutocompleteViewController{
}
private void doSearchHashtags(){
currentRequest=new GetSearchResults(lastText, GetSearchResults.Type.HASHTAGS, false)
currentRequest=new GetSearchResults(lastText, GetSearchResults.Type.HASHTAGS, false, null, 0, 0)
.setCallback(new Callback<>(){
@Override
public void onSuccess(SearchResults result){

View File

@@ -80,10 +80,10 @@ public class ComposePollViewController{
if(instance.configuration!=null && instance.configuration.polls!=null && instance.configuration.polls.maxCharactersPerOption>0)
maxPollOptionLength=instance.configuration.polls.maxCharactersPerOption;
} else {
if (instance.pollLimits!=null && instance.pollLimits.maxOptions>0)
maxPollOptions=instance.pollLimits.maxOptions;
if(instance.pollLimits!=null && instance.pollLimits.maxOptionChars>0)
maxPollOptionLength=instance.pollLimits.maxOptionChars;
if(instance!=null && instance.configuration!=null && instance.configuration.polls!=null && instance.configuration.polls.maxOptions>0)
maxPollOptions=instance.configuration.polls.maxOptions;
if(instance!=null && instance.configuration!=null && instance.configuration.polls!=null && instance.configuration.polls.maxCharactersPerOption>0)
maxPollOptionLength=instance.configuration.polls.maxCharactersPerOption;
}
pollOptionsView=pollWrap.findViewById(R.id.poll_options);
@@ -134,7 +134,8 @@ public class ComposePollViewController{
DraftPollOption opt=createDraftPollOption(false);
opt.edit.setText(eopt.title);
}
pollDuration=(int)fragment.editingStatus.poll.expiresAt.minus(fragment.editingStatus.createdAt.toEpochMilli(), ChronoUnit.MILLIS).getEpochSecond();
if(fragment.editingStatus.poll.expiresAt!=null)
pollDuration=(int)fragment.editingStatus.poll.expiresAt.minus(fragment.editingStatus.createdAt.toEpochMilli(), ChronoUnit.MILLIS).getEpochSecond();
updatePollOptionHints();
pollDurationValue.setText(UiUtils.formatDuration(fragment.getContext(), pollDuration));
pollIsMultipleChoice=fragment.editingStatus.poll.multiple;

View File

@@ -15,7 +15,7 @@ public class MediaGridLayout extends ViewGroup{
private static final int GAP=2; // dp
private PhotoLayoutHelper.TiledLayoutResult tiledLayout;
private int[] columnStarts=new int[10], columnEnds=new int[10], rowStarts=new int[10], rowEnds=new int[10];
private int[] columnStarts, columnEnds, rowStarts, rowEnds;
public MediaGridLayout(Context context){
this(context, null);
@@ -41,6 +41,14 @@ public class MediaGridLayout extends ViewGroup{
width=Math.round(width*(tiledLayout.width/(float)PhotoLayoutHelper.MAX_WIDTH));
}
if(rowStarts==null || rowStarts.length<tiledLayout.rowSizes.length){
rowStarts=new int[tiledLayout.rowSizes.length];
rowEnds=new int[tiledLayout.rowSizes.length];
}
if(columnStarts==null || columnStarts.length<tiledLayout.columnSizes.length){
columnStarts=new int[tiledLayout.columnSizes.length];
columnEnds=new int[tiledLayout.columnSizes.length];
}
int offset=0;
for(int i=0;i<tiledLayout.columnSizes.length;i++){
columnStarts[i]=offset;
@@ -73,7 +81,7 @@ public class MediaGridLayout extends ViewGroup{
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b){
if(tiledLayout==null)
if(tiledLayout==null || rowStarts==null)
return;
int maxWidth=UiUtils.MAX_WIDTH;

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="?colorM3Primary" android:state_selected="true"/>
<item android:color="?colorM3OnBackground" android:state_enabled="true"/>
<item android:color="?android:textColorSecondary"/>
<item android:color="?android:textColorSecondary" android:state_enabled="true"/>
<item android:color="@color/m3_on_surface_alpha38"/>
</selector>

View File

@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="?colorM3OnSurfaceVariant" android:alpha="0.3" android:state_enabled="false"/>
<item android:color="?colorM3OnPrimary" android:state_selected="true"/>
<item android:color="?colorM3OnSurfaceVariant"/>
<item android:color="?colorM3Surface" android:state_enabled="true"/>
<item android:color="?colorM3OnSurface"/>
</selector>

View File

@@ -1,21 +1,25 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:pathData="M63.51,35.47C67.74,36.09 71.31,39.31 71.86,43.39C72.1,45.82 71.98,49.47 71.92,51.24C71.9,51.68 71.89,52.01 71.89,52.17C71.89,52.41 71.86,54.58 71.85,54.81C71.48,60.65 67.83,62.95 64,63.69C63.95,63.7 63.91,63.71 63.86,63.72C63.85,63.72 63.83,63.72 63.82,63.72C61.39,64.2 58.79,64.32 56.32,64.39C55.73,64.41 55.14,64.41 54.55,64.41L54.55,64.41C52.1,64.41 49.65,64.12 47.26,63.54C47.25,63.54 47.24,63.54 47.22,63.54C47.21,63.55 47.2,63.55 47.19,63.56C47.18,63.57 47.17,63.58 47.17,63.59C47.16,63.6 47.16,63.62 47.16,63.63C47.23,64.4 47.39,65.17 47.66,65.9C47.99,66.74 49.15,68.78 53.44,68.78C55.94,68.78 58.42,68.49 60.85,67.91C60.86,67.91 60.88,67.91 60.89,67.91C60.9,67.92 60.91,67.92 60.92,67.93C60.93,67.94 60.94,67.95 60.95,67.96C60.95,67.97 60.95,67.98 60.95,67.99L60.95,70.86C60.95,70.87 60.95,70.89 60.94,70.9C60.94,70.91 60.93,70.92 60.92,70.93C60.16,71.48 59.14,71.8 58.25,72.08C58.21,72.09 58.17,72.11 58.12,72.12C57.72,72.25 57.31,72.36 56.89,72.46C53.1,73.32 49.15,73.11 45.47,71.85C42.04,70.65 38.53,67.71 37.67,64.17C37.2,62.25 36.88,60.3 36.69,58.34C36.5,56.19 36.43,54.04 36.36,51.89C36.34,51.08 36.31,50.27 36.28,49.45C36.2,47.38 36.25,45.13 36.69,43.09C37.6,38.96 41.35,36.07 45.46,35.47C45.55,35.45 45.64,35.44 45.75,35.42C46.56,35.28 48.26,34.98 53.78,34.98L53.83,34.98C60.09,34.98 62.8,35.36 63.51,35.47ZM65.64,58L65.64,47.91C65.64,45.85 65.11,44.21 64.06,43C62.96,41.79 61.54,41.16 59.76,41.16C57.72,41.16 56.16,41.95 55.13,43.52L54.13,45.19L53.13,43.52C52.1,41.95 50.55,41.16 48.5,41.16C46.72,41.16 45.3,41.79 44.21,43C43.15,44.21 42.62,45.85 42.62,47.91L42.62,58L46.63,58L46.63,48.21C46.63,46.15 47.5,45.1 49.24,45.1C51.17,45.1 52.14,46.34 52.14,48.8L52.14,54.16L56.12,54.16L56.12,48.8C56.12,46.34 57.09,45.1 59.01,45.1C60.77,45.1 61.63,46.15 61.63,48.21L61.63,58L65.64,58Z">
<aapt:attr name="android:fillColor">
<gradient
android:startX="54.12"
android:startY="34.98"
android:endX="54.12"
android:endY="72.98"
android:type="linear">
<item android:offset="0" android:color="#FFF0F3FE"/>
<item android:offset="1" android:color="#FFDAE0FB"/>
</gradient>
</aapt:attr>
</path>
</vector>
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportWidth="43.043"
android:viewportHeight="43.043">
<group android:scaleX="0.73"
android:scaleY="0.73"
android:translateX="5.810805"
android:translateY="5.810805">
<path
android:pathData="M0,0h43.043v43.043h-43.043z"
android:strokeWidth="1.53886"
android:fillColor="#282c37"/>
<path
android:pathData="m13.779,14.841c-1.097,0 -1.983,0.387 -2.658,1.141 -0.655,0.754 -0.981,1.771 -0.981,3.053l0,6.27L12.622,25.304L12.622,19.219c0,-1.284 0.539,-1.935 1.618,-1.935 1.192,0 1.791,0.773 1.791,2.3l0,3.331l2.468,0l0,-3.331c0,-1.527 0.598,-2.3 1.791,-2.3 1.078,0 1.618,0.651 1.618,1.935l0,6.085l2.482,0l0,-6.27c0,-1.281 -0.326,-2.299 -0.981,-3.053 -0.676,-0.754 -1.56,-1.141 -2.658,-1.141 -1.27,0 -2.232,0.488 -2.868,1.466L17.265,17.345 16.646,16.306C16.01,15.329 15.049,14.841 13.779,14.841Z"
android:strokeWidth="0.796"
android:fillColor="#eed7f4"/>
<path
android:pathData="m29.087,25.304q-1.113,0 -1.986,-0.493 -0.873,-0.507 -1.366,-1.366 -0.479,-0.873 -0.479,-1.958 0,-1.07 0.479,-1.944 0.493,-0.873 1.366,-1.366 0.873,-0.507 1.986,-0.507 1.099,0 1.972,0.507 0.873,0.493 1.352,1.366 0.493,0.873 0.493,1.944 0,1.085 -0.493,1.958 -0.479,0.859 -1.352,1.366 -0.873,0.493 -1.972,0.493zM29.087,23.6q0.535,0 0.986,-0.254 0.451,-0.254 0.718,-0.732 0.268,-0.479 0.268,-1.127 0,-0.634 -0.268,-1.113 -0.268,-0.479 -0.718,-0.732 -0.451,-0.254 -0.986,-0.254 -0.535,0 -0.986,0.254 -0.451,0.254 -0.732,0.732 -0.268,0.479 -0.268,1.113 0,0.634 0.268,1.127 0.282,0.479 0.732,0.732 0.451,0.254 0.986,0.254z"
android:strokeWidth="0.687"
android:fillColor="#eed7f4"
android:strokeColor="#00000000"/>
</group>
</vector>

View File

@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M5.219,6.28L2.22,3.28C1.927,2.987 1.927,2.512 2.22,2.22C2.513,1.927 2.987,1.927 3.28,2.22L21.78,20.72C22.073,21.013 22.073,21.487 21.78,21.78C21.487,22.073 21.012,22.073 20.719,21.78L17.44,18.501L15,18.501C15,20.158 13.657,21.501 12,21.501C10.402,21.501 9.096,20.252 9.005,18.678L9,18.499L4.275,18.5C4.104,18.5 3.934,18.465 3.777,18.396C3.144,18.121 2.853,17.385 3.128,16.752L4.5,13.594V9.496C4.5,8.344 4.758,7.254 5.219,6.28ZM15.939,17L6.365,7.425C6.129,8.07 6,8.767 6,9.496V13.906L4.656,17H15.939ZM13.5,18.499L10.5,18.501C10.5,19.33 11.172,20.001 12,20.001C12.78,20.001 13.421,19.406 13.493,18.646L13.5,18.499ZM18,13.907L18.708,15.527L20.896,17.714C20.953,17.57 20.985,17.414 20.985,17.25C20.985,17.077 20.949,16.907 20.88,16.749L19.5,13.593V9.496L19.496,9.245C19.357,5.191 16.05,1.996 12,1.996C10.098,1.996 8.364,2.699 7.043,3.861L8.107,4.925C9.154,4.033 10.513,3.496 12,3.496C15.242,3.496 17.885,6.05 17.997,9.284L18,9.509L18,13.907Z"
android:fillColor="@color/fluent_default_icon_tint"/>
</vector>

View File

@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="28dp"
android:height="28dp"
android:viewportWidth="28"
android:viewportHeight="28">
<path
android:pathData="M3.28,2.22C2.987,1.927 2.513,1.927 2.22,2.22C1.927,2.513 1.927,2.987 2.22,3.28L6.477,7.538C5.852,8.721 5.499,10.07 5.499,11.501L5.498,16.112L4.082,19.756L4.04,19.88C3.868,20.506 4.193,21.173 4.811,21.413C4.959,21.471 5.116,21.5 5.275,21.5L10.498,21.499L10.504,21.693C10.603,23.538 12.131,25.003 14,25.003C15.934,25.003 17.501,23.435 17.501,21.501L20.44,21.5L24.719,25.781C25.012,26.073 25.487,26.073 25.78,25.781C26.073,25.488 26.073,25.013 25.78,24.72L3.28,2.22ZM18.938,19.999H5.596L6.948,16.525L6.976,16.437C6.991,16.377 6.999,16.315 6.999,16.253V11.501L7.003,11.261C7.034,10.337 7.244,9.459 7.599,8.66L18.938,19.999ZM15.996,21.65C15.92,22.686 15.055,23.503 14,23.503C12.895,23.503 11.998,22.606 11.998,21.501L16,21.499L15.996,21.65ZM8.34,5.158L9.403,6.221C10.632,5.149 12.24,4.5 14,4.5C17.867,4.5 21.001,7.635 21.001,11.501V16.253L21.007,16.346C21.014,16.407 21.03,16.467 21.052,16.525L21.905,18.723L23.901,20.719C23.966,20.566 24.002,20.397 24.002,20.22L23.992,20.062C23.979,19.958 23.953,19.855 23.915,19.757L22.501,16.113L22.501,11.501L22.497,11.246C22.362,6.669 18.61,3 14,3C11.826,3 9.843,3.816 8.34,5.158Z"
android:fillColor="@color/fluent_default_icon_tint"/>
</vector>

View File

@@ -1,3 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:pathData="M13.94 5l5.061 5.06L9.063 20c-0.277 0.277-0.621 0.477-1 0.58l-5.115 1.395c-0.56 0.153-1.073-0.361-0.92-0.921l1.394-5.116c0.103-0.377 0.303-0.722 0.58-0.999L13.94 5zm-7.414 6l-1.5 1.5H2.75C2.337 12.5 2 12.165 2 11.75 2 11.336 2.337 11 2.75 11h3.775zm14.352-8.174l0.153 0.144 0.145 0.153c1.25 1.405 1.203 3.56-0.145 4.908L20.061 9 15 3.94l0.97-0.97c1.348-1.348 3.503-1.396 4.908-0.144zM10.526 7l-1.5 1.5H2.75C2.337 8.5 2 8.165 2 7.75 2 7.336 2.337 7 2.75 7h7.775zm4-4l-1.5 1.5H2.75C2.337 4.5 2 4.165 2 3.75 2 3.336 2.337 3 2.75 3h11.775z" android:fillColor="@color/fluent_default_icon_tint"/>
</vector>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_fluent_drafts_24_filled_enabled" android:state_enabled="true"/>
<item android:drawable="@drawable/ic_fluent_drafts_24_filled" android:state_enabled="true"/>
<item android:drawable="@drawable/ic_fluent_drafts_24_regular"/>
</selector>

View File

@@ -1,9 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M6.75,3H5.75C4.231,3 3,4.231 3,5.75V18.25C3,19.769 4.231,21 5.75,21H6V15C6,13.757 7.007,12.75 8.25,12.75H15.75C16.993,12.75 18,13.757 18,15V21H18.25C19.769,21 21,19.769 21,18.25V8.286C21,7.424 20.658,6.597 20.048,5.987L18.013,3.952C17.411,3.351 16.599,3.009 15.75,3V7.5C15.75,8.743 14.743,9.75 13.5,9.75H9C7.757,9.75 6.75,8.743 6.75,7.5V3ZM14.25,3V7.5C14.25,7.914 13.914,8.25 13.5,8.25H9C8.586,8.25 8.25,7.914 8.25,7.5V3H14.25ZM16.5,21V15C16.5,14.586 16.164,14.25 15.75,14.25H8.25C7.836,14.25 7.5,14.586 7.5,15V21H16.5Z"
android:fillColor="?colorM3Surface"/>
</vector>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_fluent_save_24_filled_enabled" android:state_enabled="true"/>
<item android:drawable="@drawable/ic_fluent_save_24_filled" android:state_enabled="true"/>
<item android:drawable="@drawable/ic_fluent_save_24_regular"/>
</selector>

View File

@@ -1,3 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:pathData="M5.694 12L2.299 3.27C2.063 2.664 2.655 2.083 3.241 2.29l0.093 0.039 18 9c0.518 0.259 0.55 0.968 0.097 1.284l-0.097 0.058-18 9c-0.583 0.291-1.216-0.245-1.065-0.848l0.03-0.095L5.694 12 2.299 3.27 5.694 12zM4.402 4.54l2.61 6.71h6.627c0.38 0 0.693 0.282 0.743 0.648L14.389 12c0 0.38-0.282 0.693-0.649 0.743l-0.1 0.007H7.01l-2.609 6.71L19.322 12 4.401 4.54z" android:fillColor="?colorM3Surface"/>
</vector>

View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_fluent_send_24_enabled" android:state_activated="true"/>
<item android:drawable="@drawable/ic_fluent_send_24_enabled" android:state_checked="true"/>
<item android:drawable="@drawable/ic_fluent_send_24_enabled" android:state_selected="true"/>
<item android:drawable="@drawable/ic_fluent_send_24_enabled" android:state_enabled="true"/>
<item android:drawable="@drawable/ic_fluent_send_24_regular"/>
</selector>

View File

@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M11,17H13V11H11ZM12,9Q12.425,9 12.713,8.712Q13,8.425 13,8Q13,7.575 12.713,7.287Q12.425,7 12,7Q11.575,7 11.288,7.287Q11,7.575 11,8Q11,8.425 11.288,8.712Q11.575,9 12,9ZM12,22Q8.525,21.125 6.263,18.012Q4,14.9 4,11.1V5L12,2L20,5V11.1Q20,14.9 17.738,18.012Q15.475,21.125 12,22ZM12,19.9Q14.6,19.075 16.3,16.6Q18,14.125 18,11.1V6.375L12,4.125L6,6.375V11.1Q6,14.125 7.7,16.6Q9.4,19.075 12,19.9ZM12,12Q12,12 12,12Q12,12 12,12Q12,12 12,12Q12,12 12,12Z"/>
</vector>

View File

@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M2,14Q1.175,14 0.588,13.412Q0,12.825 0,12V6Q0,5.7 0.125,5.425Q0.25,5.15 0.45,4.95L5.4,0L6.15,0.75Q6.3,0.9 6.4,1.137Q6.5,1.375 6.5,1.6V1.8L5.8,5H11Q11.425,5 11.713,5.287Q12,5.575 12,6V7.25Q12,7.4 11.975,7.537Q11.95,7.675 11.9,7.8L9.65,13.1Q9.475,13.525 9.088,13.762Q8.7,14 8.25,14ZM7.95,12 L10,7.15V7Q10,7 10,7Q10,7 10,7H3.35L3.95,4.3L2,6.2V12Q2,12 2,12Q2,12 2,12ZM18.6,24 L17.85,23.25Q17.7,23.1 17.6,22.863Q17.5,22.625 17.5,22.4V22.2L18.2,19H13Q12.575,19 12.288,18.712Q12,18.425 12,18V16.75Q12,16.6 12.025,16.462Q12.05,16.325 12.1,16.2L14.35,10.9Q14.55,10.475 14.925,10.238Q15.3,10 15.75,10H22Q22.825,10 23.413,10.587Q24,11.175 24,12V18Q24,18.3 23.888,18.562Q23.775,18.825 23.55,19.05ZM16.05,12 L14,16.85V17Q14,17 14,17Q14,17 14,17H20.65L20.05,19.7L22,17.8V12Q22,12 22,12Q22,12 22,12ZM2,12V6.2V7Q2,7 2,7Q2,7 2,7V7.15V12Q2,12 2,12Q2,12 2,12ZM22,12V17.8V17Q22,17 22,17Q22,17 22,17V16.85V12Q22,12 22,12Q22,12 22,12Z"/>
</vector>

View File

@@ -2,7 +2,7 @@
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:gravity="center_vertical">
<shape>
<solid android:color="?colorGray500"/>
<solid android:color="?colorM3DisabledBackground"/>
<corners android:radius="1dp"/>
<size android:height="2dp"/>
</shape>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
<solid android:color="?colorGray25"/>
<solid android:color="?colorGray50t"/>
<size android:width="18dp" android:height="18dp"/>
</shape>

View File

@@ -12,7 +12,7 @@
android:id="@+id/language_btn"
style="@style/Widget.Mastodon.M3.Button.Text"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_height="wrap_content"
android:paddingStart="12dp"
android:paddingEnd="12dp"
android:drawableStart="@drawable/ic_fluent_local_language_16_regular"

View File

@@ -3,12 +3,12 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_marginHorizontal="16dp"
android:layout_height="wrap_content">
<org.joinmastodon.android.ui.views.MaxWidthFrameLayout
android:id="@+id/inner"
android:layout_marginBottom="16dp"
android:layout_marginHorizontal="16dp"
android:background="@drawable/bg_search_field"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -34,7 +34,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:paddingEnd="16dp"
android:paddingEnd="32dp"
android:orientation="vertical">
<TextView
android:id="@+id/title"

View File

@@ -47,6 +47,7 @@
android:minWidth="16dp"
android:gravity="center_vertical"
android:textAppearance="@style/m3_label_large"
android:textColor="?android:textColorSecondary"
android:maxLines="1"
android:ellipsize="end"
tools:text="123"

View File

@@ -11,7 +11,7 @@
<LinearLayout
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_height="wrap_content"
android:background="@drawable/bg_poll_option_clickable"
android:duplicateParentState="true"
android:layoutDirection="locale">
@@ -41,7 +41,6 @@
android:layout_marginEnd="8dp"
android:textAppearance="@style/m3_label_large"
android:textColor="?colorM3Primary"
android:singleLine="true"
android:ellipsize="end"
android:paddingEnd="26dp"
tools:text="scream into void jsfdklfjdalskfjdsalkfjdsalkfjdsalkfdjsalkfdsajlk"/>

View File

@@ -4,7 +4,7 @@
android:layout_height="wrap_content"
android:minHeight="75dp"
android:id="@+id/warning_wrap"
android:background="@drawable/bg_timeline_gap"
android:background="@drawable/bg_m3_surface3"
android:orientation="horizontal">
<TextView

View File

@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ProgressBar
android:id="@+id/translation_progress"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center"
style="?android:progressBarStyleSmall"/>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingHorizontal="16dp"
android:paddingVertical="8dp"
android:clipToPadding="false"
android:baselineAligned="false"
android:gravity="center_vertical">
<TextView
android:id="@+id/translation_info_text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textAppearance="@style/m3_body_small"
android:textColor="?colorM3Secondary"
tools:text="Translated from Japanese using DeepL.com"/>
<Button
android:id="@+id/translation_show_original"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
style="@style/Widget.Mastodon.M3.Button.Text"
android:paddingHorizontal="8dp"
android:layout_marginEnd="-8dp"
android:text="@string/translation_show_original"/>
</LinearLayout>
</FrameLayout>

View File

@@ -382,7 +382,7 @@
</LinearLayout>
</ScrollView>
<org.joinmastodon.android.ui.views.AutoOrientationLinearLayout
<LinearLayout
android:id="@+id/schedule_draft_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -397,6 +397,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="6dp"
android:ellipsize="end"
android:drawableStart="@drawable/ic_fluent_drafts_20_regular"
android:drawableTint="?android:textColorSecondary"
android:drawablePadding="16dp"
@@ -431,7 +432,7 @@
android:tooltipText="@string/sk_compose_no_schedule"
android:contentDescription="@string/sk_compose_no_schedule" />
</org.joinmastodon.android.ui.views.AutoOrientationLinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/bottom_bar"
@@ -467,6 +468,8 @@
android:padding="0px"
android:contentDescription="@string/add_media"
android:tooltipText="@string/add_media"
android:tint="@color/action_bar_icons"
android:tintMode="src_in"
android:src="@drawable/ic_fluent_image_add_24_regular"/>
<ImageButton
@@ -477,6 +480,8 @@
android:padding="0px"
android:contentDescription="@string/add_poll"
android:tooltipText="@string/add_poll"
android:tint="@color/action_bar_icons"
android:tintMode="src_in"
android:src="@drawable/ic_fluent_poll_24_selector"/>
<ImageButton
@@ -487,6 +492,8 @@
android:padding="0px"
android:contentDescription="@string/emoji"
android:tooltipText="@string/emoji"
android:tint="@color/action_bar_icons"
android:tintMode="src_in"
android:src="@drawable/ic_fluent_emoji_24_selector"/>
<ImageButton
@@ -497,6 +504,8 @@
android:padding="0px"
android:contentDescription="@string/content_warning"
android:tooltipText="@string/content_warning"
android:tint="@color/action_bar_icons"
android:tintMode="src_in"
android:src="@drawable/ic_fluent_chat_warning_24_selector"/>
<ImageButton
@@ -507,6 +516,8 @@
android:padding="0px"
android:contentDescription="@string/sk_content_type"
android:tooltipText="@string/sk_content_type"
android:tint="@color/action_bar_icons"
android:tintMode="src_in"
android:src="@drawable/ic_fluent_text_edit_style_24_selector"/>
<ImageButton
@@ -520,6 +531,8 @@
android:textColor="?android:textColorSecondary"
android:background="@drawable/bg_icon_button"
android:visibility="gone"
android:tint="@color/action_bar_icons"
android:tintMode="src_in"
android:contentDescription="@string/sk_schedule_or_draft"
android:tooltipText="@string/sk_schedule_or_draft" />
@@ -535,7 +548,7 @@
android:layout_marginEnd="24dp"
android:background="?android:attr/selectableItemBackgroundBorderless"
android:padding="0px"
android:tint="@color/compose_button"
android:tint="@color/action_bar_icons"
android:tintMode="src_in"
android:contentDescription="@string/more_options"
android:tooltipText="@string/more_options"
@@ -564,7 +577,9 @@
android:drawablePadding="0dp"
android:tooltipText="@string/publish"
android:contentDescription="@string/publish"
android:src="@drawable/ic_fluent_send_24_selector"
android:tint="@color/compose_button"
android:tintMode="src_in"
android:src="@drawable/ic_fluent_send_24_regular"
android:visibility="gone"
android:singleLine="true" />

View File

@@ -0,0 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingHorizontal="16dp"
android:paddingBottom="8dp">
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toStartOf="@id/follow_btn_wrap"
android:layout_marginEnd="8dp"
android:textAppearance="@style/m3_headline_small"
android:textColor="?colorM3OnSurface"
android:maxLines="4"
android:ellipsize="end"
android:minHeight="36dp"
android:gravity="center_vertical"
tools:text="#CatsOfMastodonButLong"/>
<FrameLayout
android:id="@+id/follow_btn_wrap"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@id/title"
android:layout_alignBottom="@id/title"
android:layout_alignParentEnd="true">
<org.joinmastodon.android.ui.views.ProgressBarButton
android:id="@+id/profile_action_btn"
android:layout_width="wrap_content"
android:layout_height="36dp"
android:layout_gravity="center"
style="@style/Widget.Mastodon.M3.Button.Filled"
android:paddingHorizontal="16dp"
tools:text="@string/button_follow" />
<ProgressBar
android:id="@+id/action_progress"
style="?android:progressBarStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:elevation="10dp"
android:indeterminate="true"
android:outlineProvider="none"
android:visibility="gone" />
</FrameLayout>
<TextView
android:id="@+id/subtitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/title"
android:layout_marginTop="8dp"
android:textAppearance="@style/m3_label_large"
android:textColor="?colorM3OnSurfaceVariant"
tools:text="123 posts"/>
</RelativeLayout>

View File

@@ -69,7 +69,7 @@
android:layout_marginEnd="16dp"
android:gravity="center_vertical"
android:textAppearance="@style/m3_body_large"
android:textColor="#fff"
android:textColor="?colorGray50"
tools:text="1:23 / 4:56"/>
</RelativeLayout>

View File

@@ -5,6 +5,11 @@
android:title="@string/sk_pin_timeline"
android:icon="@drawable/ic_fluent_pin_24_regular"
android:showAsAction="always" />
<item
android:id="@+id/mute_hashtag"
android:icon="@drawable/ic_fluent_speaker_mute_24_regular"
android:showAsAction="always"
android:title="@string/mo_mute_hashtag"/>
<item
android:id="@+id/follow_hashtag"
android:icon="@drawable/ic_fluent_person_add_24_regular"

View File

@@ -16,6 +16,10 @@
<item android:id="@+id/report" android:title="@string/report_user" android:icon="@drawable/ic_fluent_warning_24_regular"/>
</group>
<group android:id="@+id/menu_group3">
<item android:id="@+id/mute_conversation" android:title="@string/mo_mute_conversation" android:icon="@drawable/ic_fluent_alert_off_24_regular" />
<item android:id="@+id/unmute_conversation" android:title="@string/mo_unmute_conversation" android:icon="@drawable/ic_fluent_alert_24_regular" />
</group>
<group android:id="@+id/menu_group4">
<!-- <item android:id="@+id/share" android:title="@string/button_share" android:icon="@drawable/ic_fluent_share_24_regular"/>-->
<item android:id="@+id/copy_link" android:title="@string/sk_copy_link_to_post" android:icon="@drawable/ic_fluent_link_24_regular"/>
<item android:id="@+id/open_in_browser" android:title="@string/open_in_browser" android:icon="@drawable/ic_fluent_globe_24_regular"/>

View File

@@ -8,5 +8,7 @@
<item android:id="@+id/manage_user_lists" android:title="@string/sk_your_lists" android:icon="@drawable/ic_fluent_people_24_regular"/>
<item android:id="@+id/favorites" android:title="@string/your_favorites" android:icon="@drawable/ic_fluent_star_24_regular" android:showAsAction="always"/>
<item android:id="@+id/scheduled" android:title="@string/sk_unsent_posts" android:icon="@drawable/ic_fluent_folder_open_24_regular" android:showAsAction="always"/>
<item android:id="@+id/mutes" android:title="@string/mo_muted_accounts" android:icon="@drawable/ic_fluent_speaker_off_24_regular"/>
<item android:id="@+id/blocks" android:title="@string/mo_blocked_accounts" android:icon="@drawable/ic_fluent_shield_24_regular"/>
<item android:id="@+id/share" android:title="@string/share_user" android:icon="@drawable/ic_fluent_share_24_regular"/>
</menu>

View File

@@ -7,7 +7,7 @@
<string name="mo_download_latest_nightly_release">تنزيل آخر إصدار ليلي</string>
<string name="mo_double_tap_to_search">الضغط مرتان لفتح البحث</string>
<string name="mo_color_palette_black_and_white">أبيض وأسود</string>
<string name="mo_personal_note">إضافة ملاحظة إلى هذا الملف التعريفي</string>
<string name="mo_personal_note">إضافة ملاحظة حول الملف التعريفي هذا</string>
<string name="mo_personal_note_confirm">تأكيد التغييرات التي طرأت على الملاحظة</string>
<string name="mo_personal_note_update_failed">فشل حفظ الملاحظة</string>
<string name="mo_settings_contribute">المساهمة على Moshidon</string>
@@ -46,4 +46,39 @@
<string name="mo_notification_audience_settings">جمهور الإشعارات</string>
<string name="mo_welcome_text">للبداية، يرجى إدخال اسم نطاق خادمك هنا.</string>
<string name="mo_recent_emoji_cleared">تم مسح وجوه الإيموجي التعبيرية</string>
<string name="mo_show_media_preview">إظهار معاينات الوسائط في الخيوط الزمنية</string>
<string name="mo_settings_show_posts_without_alt">إظهار الوسائط الخالية مِن نص بديل</string>
<string name="mo_setting_interaction_count_summary">إظهار عدد الأشخاص الذين تفاعلوا مع منشور ما في الخيوط الزمنية</string>
<string name="mo_confirm_to_mute_conversation">أتريد حقا كتم هذه المحادَثة؟</string>
<string name="mo_unmute_conversation">إلغاء كتم المحادَثة</string>
<string name="mo_mute_conversation">كتم المحادَثة</string>
<string name="mo_confirm_unfollow">تأكيد إلغاء متابَعة %s</string>
<string name="mo_setting_marquee_summary">تعطيل تمرير العنوان المُقطع</string>
<string name="mo_setting_reduced_motion_summary">تعطيل تأثيرات التفاعل</string>
<string name="mo_unmute_hashtag">إلغاء كتم الوسم</string>
<string name="mo_camera_not_available">الكاميرا غير متوفرة!</string>
<string name="mo_unmuted_conversation_successfully">تم إلغاء كتم المحادثة بنجاح</string>
<string name="mo_no_image_desc">الصور المدرجة ليس لديها وصف. يرجى النظر في إضافة وصف للسماح للأشخاص ذوي الإعاقة البصرية بالمشاركة.</string>
<string name="mo_confirm_to_unmute_conversation">هل أنت متأكد أنك تريد إلغاء كتم هذه المحادثة؟</string>
<string name="mo_confirm_to_unmute_hashtag">هل أنت متأكد أنك تريد إلغاء كتم هذا الوسم؟</string>
<string name="mo_change_default_reply_visibility_to_unlisted">الرد كـ ”غير مُدرج“ افتراضيًا</string>
<string name="mo_composer_behavior">سلوك المحرر</string>
<string name="mo_notification_action_replied">تم الرد بنجاح على منشور %s</string>
<string name="mo_disable_relocate_publish_button_to_enable_customization">تعطيل ”نقل زر النشر“ للسماح بالتخصيص</string>
<string name="mo_enable_dividers">عرض فواصل المنشورات</string>
<string name="mo_color_palette_nord">نورد</string>
<string name="mo_setting_true_black_summary">قد يوفر الطاقة على شاشات AMOLED</string>
<string name="mo_clear_recent_emoji">مسح الرموز التعبيرية المستخدَمة مؤخرًا</string>
<string name="mo_muted_conversation_successfully">تم كتم المحادثة بنجاح</string>
<string name="mo_filtered">مُصَفى: %s</string>
<string name="mo_setting_play_gif_summary">تحريك الرموز التعبيرية و GIF للصور الرمزية</string>
<string name="mo_mute_hashtag">أكتم الوسم</string>
<string name="mo_disable_reminder_to_add_alt_text">تعطيل تذكير إضافة نص بديل</string>
<string name="mo_muting">الكتم جارٍ…</string>
<string name="mo_unmuting">جارٍ إلغاء الكتم…</string>
<string name="mo_confirm_to_mute_hashtag">هل أنت متأكد أنك تريد كتم هذا الوسم؟</string>
<string name="mo_hide_compose_button_while_scrolling_setting">إخفاء زر النشر أثناء التمرير</string>
<string name="mo_fab_compose">تحرير</string>
<string name="mo_relocate_publish_button">نقل زر النشر</string>
<string name="mo_setting_remote_follower_summary">إظهار المتابِعين مِن الخوادم الأخرى</string>
</resources>

View File

@@ -8,7 +8,7 @@
<string name="ok">حسنًا</string>
<string name="preparing_auth">جَارٍ الإعدَادُ لِلمُصادَقَة…</string>
<string name="finishing_auth">يُنهي المصادقة…</string>
<string name="user_boosted">%s إعادة نشر</string>
<string name="user_boosted">قام %s بإعادة نشر</string>
<string name="in_reply_to">ردًا على %s</string>
<string name="notifications">الإشعارات</string>
<string name="user_followed_you">%s بَدَأ بِمُتابَعَتِك</string>
@@ -242,7 +242,7 @@
<string name="skip">تخطى</string>
<string name="notification_type_follow">متابعُون جُدُد</string>
<string name="notification_type_favorite">المفضلة</string>
<string name="notification_type_reblog">المشاركات</string>
<string name="notification_type_reblog">المعاد نشرها</string>
<string name="notification_type_mention">الإشارات</string>
<string name="notification_type_poll">استطلاع رأي</string>
<string name="choose_account">اختر حسابًا</string>
@@ -277,7 +277,7 @@
<string name="more_options">مزيد من الخيارات</string>
<string name="new_post">منشور جديد</string>
<string name="button_reply">ردّ</string>
<string name="button_reblog">شارك</string>
<string name="button_reblog">إعادة النشر</string>
<string name="button_favorite">فضّل</string>
<string name="button_share">شارك</string>
<string name="media_no_description">وسائط بدون وصف</string>
@@ -292,8 +292,8 @@
<string name="followed_user">أنت تتابع الآن %s</string>
<string name="following_user_requested">طَلَبَ %s مُتابَعتك</string>
<string name="open_in_browser">افتح في المتصفح</string>
<string name="hide_boosts_from_user">اخف مشاركات %s</string>
<string name="show_boosts_from_user">أظهر مشاركات %s</string>
<string name="hide_boosts_from_user">أخفِ المعاد نشرها مِن %s</string>
<string name="show_boosts_from_user">أظهر ما أعاد %s نشرَه</string>
<string name="signup_reason">لماذا تريد الانضمام؟</string>
<string name="signup_reason_note">هذا سوف يساعدنا في مراجعة تطبيقك.</string>
<string name="clear">امسح</string>
@@ -346,10 +346,10 @@
<item quantity="other">%,d تفضيل</item>
</plurals>
<plurals name="x_reblogs">
<item quantity="zero">%,d إعادة نشر</item>
<item quantity="zero">لم يُعد نشره</item>
<item quantity="one">إعادة نشر واحدة</item>
<item quantity="two">أعيد نشره مرّتان</item>
<item quantity="few">أعيد نشره %,d مرة</item>
<item quantity="few">أعيد نشره %,d مرات</item>
<item quantity="many">أعيد نشره %,d مرات</item>
<item quantity="other">أعيد نشره %,d مرات</item>
</plurals>
@@ -698,4 +698,18 @@
<string name="time_minutes_ago_short">مُنذُ %dد</string>
<string name="time_hours_ago_short">مُنذُ %dسا</string>
<string name="time_days_ago_short">مُنذُ %d أيام</string>
<!-- %s is the name of the post language -->
<string name="translate_post">تُرجِم مِن %s</string>
<!-- %1$s is the language, %2$s is the name of the translation service -->
<string name="post_translated">مُترجَم مِن %1$s باستخدام %2$s</string>
<string name="translation_show_original">إظهار الأصل</string>
<string name="translation_failed">فشِلَت الترجَمة. قد لم يتمكّن مدير الخادم من تفعيل الترجمات على هذا الخادم أو أنّ هذا الخادم يُشغِّل نسخة قديمة من ماستدون حيث الترجمات غير مدعومة بعد.</string>
<plurals name="x_participants">
<item quantity="zero">لا مُشارِك</item>
<item quantity="one">مشارِك واحد</item>
<item quantity="two">مشاركَيْنِ</item>
<item quantity="few">مشاركين</item>
<item quantity="many">مُشارِكًا</item>
<item quantity="other">مُشارك</item>
</plurals>
</resources>

View File

@@ -249,4 +249,55 @@
<string name="sk_notify_poll_results">نتيجة استطلاع الرأي</string>
<string name="sk_filtered">تمت تصفيته: %s</string>
<string name="sk_search_fediverse">البحث في الفديفرس</string>
<string name="sk_suicide_search_terms">انتحار, انتِحار, الانتحار, الإنتحار, أنتحر</string>
<string name="sk_search_suicide_title">إن كنت في مِحنة وبحاجة إلى مساعدة…</string>
<string name="sk_search_suicide_message">إذا كنت تبحث عن إشارة لعدم الانتحار، فها هي. إذا كنت تعاني من ضائقة و/أو تراودك أفكار انتحارية، وإذا كنت بحاجة إلى مساعدة، فيمكنك الاتصال بخط المساعدة للوقاية من الانتحار إن كنت في مِحنة.</string>
<string name="sk_load_missing_posts_above">حمِّل المنشورات الحديثة</string>
<string name="sk_load_missing_posts_below">حمِّل المنشورات القديمة</string>
<string name="sk_time_seconds">%d ثواني</string>
<string name="sk_time_minutes">%d دقائق</string>
<string name="sk_time_hours">%d ساعات</string>
<string name="sk_time_days">%d أيام</string>
<string name="sk_search_suicide_hotlines">للعثور على خط للمساعدة</string>
<string name="sk_confirm_delete_scheduled_post_title">احذف المنشور المُبَرمَج</string>
<string name="sk_compose_scheduled">مُبَرمَج لـ</string>
<string name="sk_do_remove_follower">إزالة</string>
<string name="sk_icon_academic_cap">قبعة جامعية</string>
<string name="sk_icon_tag">ملصقة</string>
<string name="sk_add_timeline_tag_error_empty">لا يجب أن يُترَك الوسم فارغًا</string>
<string name="sk_unfinished_attachments">إصلاح المرفقات؟</string>
<plurals name="sk_posts_count_label">
<item quantity="zero">لا منشور</item>
<item quantity="one">منشور واحد</item>
<item quantity="two">منشورَيْنِ</item>
<item quantity="few">منشورات</item>
<item quantity="many">منشورًا</item>
<item quantity="other">منشور</item>
</plurals>
<string name="sk_notification_mention">لقد قام %s بذِكرك</string>
<string name="sk_settings_emoji_reactions">تمكين الوجوه التعبيرية للتفاعل</string>
<string name="sk_icon_verified">مُتحَقَّق مِنه</string>
<string name="sk_switch_timeline">تبديل الخيط الزمني</string>
<string name="sk_settings_show_emoji_reactions_always">إظهار زر الإضافة دائما</string>
<string name="sk_do_not_show_again">لا تظهر مرة أخرى</string>
<string name="sk_settings_display_pronouns_in_user_listings">إظهار الأسماء في قوائم المستخدِمين</string>
<string name="sk_post_contains_media">يحتوي المنشور على وسائط</string>
<string name="sk_settings_see_new_posts_button">أظهر زِرّ ”إظهار المنشورات الجديدة“</string>
<string name="sk_followed_as">مُتابَع عبر %s</string>
<string name="sk_settings_allow_remote_loading">تحميل المعلومات مِن الخوادم البعيدة</string>
<string name="sk_content_type_html">HTML</string>
<string name="sk_reacted">تَفاعَل %s</string>
<string name="sk_reacted_with">تَفاعَلَ %1$s مع %2$s</string>
<string name="sk_external_share_or_open_title">إعادة نشر أو فتح بحساب آخَر</string>
<string name="sk_content_type_plain">نص عادي</string>
<string name="sk_settings_prefix_replies_always">ردًّا على أي كان</string>
<string name="sk_settings_forward_report_default">إعادة ”تحويل الإبلاغ“ افتراضيا</string>
<string name="sk_content_type_mfm">MFM</string>
<string name="sk_settings_hide_fab">إخفاء زر التحرير مبدئيا</string>
<string name="sk_enter_emoji_hint">اضغط للتفاعل بوجوه تعبيرية</string>
<string name="sk_content_type_markdown">Markdown</string>
<string name="sk_content_type_bbcode">BBCode</string>
<string name="sk_enter_emoji_toast">يُرجى إدخال إيموجي</string>
<string name="sk_in_reply">ردّا على</string>
<string name="sk_open_in_app_failed">لا يمكن فتحه في التطبيق</string>
</resources>

View File

@@ -527,4 +527,6 @@
<string name="time_minutes_ago_short">%d хв таму</string>
<string name="time_hours_ago_short">%d г таму</string>
<string name="time_days_ago_short">%d дз таму</string>
<!-- %s is the name of the post language -->
<!-- %1$s is the language, %2$s is the name of the translation service -->
</resources>

View File

@@ -199,4 +199,6 @@
<!-- %s is the timestamp ("tomorrow at 12:34") -->
<!-- Shown like a content warning, %s is the name of the filter -->
<!-- Shown in the post header. Please keep it short -->
<!-- %s is the name of the post language -->
<!-- %1$s is the language, %2$s is the name of the translation service -->
</resources>

View File

@@ -182,4 +182,6 @@
<!-- %s is the timestamp ("tomorrow at 12:34") -->
<!-- Shown like a content warning, %s is the name of the filter -->
<!-- Shown in the post header. Please keep it short -->
<!-- %s is the name of the post language -->
<!-- %1$s is the language, %2$s is the name of the translation service -->
</resources>

View File

@@ -293,4 +293,6 @@
<!-- %s is the timestamp ("tomorrow at 12:34") -->
<!-- Shown like a content warning, %s is the name of the filter -->
<!-- Shown in the post header. Please keep it short -->
<!-- %s is the name of the post language -->
<!-- %1$s is the language, %2$s is the name of the translation service -->
</resources>

View File

@@ -639,4 +639,6 @@
<string name="time_minutes_ago_short">Před %dm</string>
<string name="time_hours_ago_short">Před %dh</string>
<string name="time_days_ago_short">Před %dd</string>
<!-- %s is the name of the post language -->
<!-- %1$s is the language, %2$s is the name of the translation service -->
</resources>

View File

@@ -503,4 +503,6 @@
<string name="search_open_url">Åbn URL i Mastodon</string>
<string name="posts_matching_hashtag">Indlæg med “%s”</string>
<!-- Shown in the post header. Please keep it short -->
<!-- %s is the name of the post language -->
<!-- %1$s is the language, %2$s is the name of the translation service -->
</resources>

View File

@@ -582,4 +582,6 @@
<string name="time_minutes_ago_short">vor %d Minuten</string>
<string name="time_hours_ago_short">vor %d Stunden</string>
<string name="time_days_ago_short">vor %d Tagen</string>
<!-- %s is the name of the post language -->
<!-- %1$s is the language, %2$s is the name of the translation service -->
</resources>

View File

@@ -81,4 +81,21 @@
<string name="mo_haptic_feedback">Haptisches Feedback</string>
<string name="mo_setting_haptic_feedback_summary">Vibrieren beim Interagieren mit Posts</string>
<string name="mo_camera_not_available">Keine Kamera verfügbar!</string>
<string name="mo_show_media_preview">Medienvorschau in Timelines anzeigen</string>
<string name="mo_recent_emoji_cleared">Neueste Emoji gelöscht</string>
<string name="mo_double_tap_to_search">Doppeltippen zum Öffnen der Suche</string>
<string name="mo_unmute_hashtag">Stummschaltung des Hashtags aufheben</string>
<string name="mo_muted_accounts">Stummgeschaltete Konten</string>
<string name="mo_unmuted_conversation_successfully">Stummschaltung der Konversation erfolgreich aufgehoben</string>
<string name="mo_confirm_to_unmute_conversation">Sind Sie sicher, dass Sie die Stummschaltung dieser Konversation aufheben möchten\?</string>
<string name="mo_confirm_to_unmute_hashtag">Sind Sie sicher, dass Sie die Stummschaltung dieses Hashtags aufheben möchten\?</string>
<string name="mo_blocked_accounts">Gesperrte Konten</string>
<string name="mo_confirm_to_mute_conversation">Sind Sie sicher, dass Sie diese Konversation stummschalten möchten\?</string>
<string name="mo_muted_conversation_successfully">Konversation erfolgreich stummgeschaltet</string>
<string name="mo_unmute_conversation">Stummschaltung für Konversation aufheben</string>
<string name="mo_mute_conversation">Konversation stummschalten</string>
<string name="mo_mute_hashtag">Hashtag stummschalten</string>
<string name="mo_muting">Stummschalten…</string>
<string name="mo_unmuting">Stummschaltung aufheben…</string>
<string name="mo_confirm_to_mute_hashtag">Sind Sie sicher, dass Sie diesen Hashtag stummschalten möchten\?</string>
</resources>

View File

@@ -382,10 +382,6 @@
<item quantity="other">Beiträge</item>
</plurals>
<string name="sk_settings_show_labels_in_navigation_bar">Tab-Bezeichnungen in der Navigationsleiste anzeigen</string>
<string name="sk_time_seconds">%d Sekunden</string>
<string name="sk_time_minutes">%d Minuten</string>
<string name="sk_time_hours">%d Stunden</string>
<string name="sk_time_days">%d Tage</string>
<string name="sk_suicide_helplines_url">https://findahelpline.com</string>
<string name="sk_load_missing_posts_below">Ältere Beiträge laden</string>
<string name="sk_load_missing_posts_above">Neuere Beiträge laden</string>

View File

@@ -387,6 +387,7 @@
<string name="welcome_to_mastodon">Καλώς ήρθες στο Mastodon</string>
<string name="welcome_paragraph1">Το Mastodon είναι ένα αποκεντρωμένο κοινωνικό δίκτυο που σημαίνει ότι καμία εταιρεία δεν το ελέγχει. Αποτελείται από πολλούς ανεξάρτητους διακομιστές, όλοι συνδεδεμένοι μαζί.</string>
<string name="what_are_servers">Τι είναι οι διακομιστές;</string>
<string name="welcome_paragraph2">Κάθε λογαριασμός Mastodon φιλοξενείται σε ένα διακομιστή - ο καθένας με τις δικές του αξίες, κανόνες &amp; διαχειριστές. Ανεξάρτητα από το ποιον μπορεί να επιλέξεις, μπορείς να ακολουθήσεις και να αλληλεπιδράσεις με άτομα από οποιονδήποτε διακομιστή.</string>
<string name="opening_link">Άνοιγμα συνδέσμου…</string>
<string name="link_not_supported">Αυτός ο σύνδεσμος δεν υποστηρίζεται στην εφαρμογή</string>
<string name="log_out_all_accounts">Αποσύνδεση από όλους τους λογαριασμούς</string>
@@ -581,4 +582,21 @@
<string name="time_minutes_ago_short">%dλ πριν</string>
<string name="time_hours_ago_short">%dώ πριν</string>
<string name="time_days_ago_short">%dημ πριν</string>
<!-- %s is the name of the post language -->
<string name="translate_post">Μετάφραση από %s</string>
<!-- %1$s is the language, %2$s is the name of the translation service -->
<string name="post_translated">Μεταφράστηκε από %1$s χρησιμοποιώντας %2$s</string>
<string name="translation_show_original">Εμφάνιση αρχικού</string>
<string name="translation_failed">Η μετάφραση απέτυχε. Ίσως ο διαχειριστής δεν έχει ενεργοποιήσει μεταφράσεις σε αυτόν τον διακομιστή ή αυτός ο διακομιστής εκτελεί μια παλαιότερη έκδοση του Mastodon όπου οι μεταφράσεις δεν υποστηρίζονται ακόμα.</string>
<string name="settings_privacy">Ιδιωτικότητα και προσιτότητα</string>
<string name="settings_discoverable">Παροχή προφίλ και δημοσιεύσεων σε αλγορίθμους ανακάλυψης</string>
<string name="settings_indexable">Συμπερίληψη δημόσιων αναρτήσεων στα αποτελέσματα αναζήτησης</string>
<plurals name="x_participants">
<item quantity="one">%,d συμμετέχων</item>
<item quantity="other">%,d συμμετέχοντες</item>
</plurals>
<plurals name="x_posts_today">
<item quantity="one">%,d ανάρτηση σήμερα</item>
<item quantity="other">%,d αναρτήσεις σήμερα</item>
</plurals>
</resources>

View File

@@ -573,4 +573,6 @@
<string name="time_minutes_ago_short">hace %dm</string>
<string name="time_hours_ago_short">hace %dh</string>
<string name="time_days_ago_short">hace %dd</string>
<!-- %s is the name of the post language -->
<!-- %1$s is the language, %2$s is the name of the translation service -->
</resources>

View File

@@ -44,9 +44,9 @@
<string name="mo_confirm_unfollow_title">Dejar de seguir</string>
<string name="mo_confirm_unfollow">Confirmar para dejar de seguir a %s</string>
<string name="mo_instance_contact">Contacto</string>
<string name="mo_instance_users">Usuarixs</string>
<string name="mo_instance_users">Cuentas</string>
<string name="mo_instance_status">Publicaciones</string>
<string name="mo_instance_registration_open">Abrir</string>
<string name="mo_instance_registration_open">Abierto</string>
<string name="mo_instance_registration_approval">Requiere aprobación</string>
<string name="mo_instance_info_open_timeline">Cronología Local</string>
<string name="mo_instance_info_moderated_servers">Servidores moderados</string>
@@ -75,10 +75,24 @@
<string name="mo_haptic_feedback">Vibración</string>
<string name="mo_color_palette_black_and_white">Blanco y Negro</string>
<string name="mo_donate_url">https://github.com/sponsors/LucasGGamerM</string>
<string name="mo_settings_show_posts_without_alt">Mostrar las publicaciones de los medios a las que les falta un texto alternativo</string>
<string name="mo_settings_show_posts_without_alt">Mostrar las publicaciones con multimedia que carece de un texto alternativo</string>
<string name="mo_repo_url">https://github.com/LucasGGamerM/moshidon</string>
<string name="mo_settings_show_posts_without_alt_summary">Las publicaciones estarán ocultas en todas las líneas de tiempo, pero se pueden revelar en los hilos y las notificaciones</string>
<string name="mo_settings_show_posts_without_alt_summary">Las publicaciones estarán ocultas en todas las cronologías, pero se pueden mostrar en los hilos y las notificaciones</string>
<string name="mo_show_media_preview">Mostrar previsualización de multimedia en la cronología</string>
<string name="mo_recent_emoji_cleared">Emojis recientes eliminados</string>
<string name="mo_double_tap_to_search">Doble toque para abrir la búsqueda</string>
<string name="mo_unmuted_conversation_successfully">Conversación sin silencio</string>
<string name="mo_confirm_to_unmute_conversation">¿Quieres dejar de silenciar esta conversación\?</string>
<string name="mo_confirm_to_mute_conversation">¿Quieres silenciar esta conversación\?</string>
<string name="mo_muted_conversation_successfully">Conversación silenciada</string>
<string name="mo_unmute_conversation">No silenciar conversación</string>
<string name="mo_mute_conversation">Silenciar conversación</string>
<string name="mo_muting">Silenciando…</string>
<string name="mo_unmuting">Quitando silencio…</string>
<string name="mo_unmute_hashtag">No silenciar etiqueta</string>
<string name="mo_muted_accounts">Cuentas silenciadas</string>
<string name="mo_confirm_to_unmute_hashtag">¿Seguro que quieres dejar de silenciar esta etiqueta\?</string>
<string name="mo_blocked_accounts">Cuentas bloqueadas</string>
<string name="mo_mute_hashtag">Silenciar etiqueta</string>
<string name="mo_confirm_to_mute_hashtag">¿Seguro que quieres silenciar esta etiqueta\?</string>
</resources>

Some files were not shown because too many files have changed in this diff Show More