Compare commits

...

206 Commits

Author SHA1 Message Date
LucasGGamerM
c3e5f4d254 Changelog for 87 2023-01-21 16:11:14 -03:00
LucasGGamerM
2e5ff452fd Bumping version number 2023-01-21 16:03:52 -03:00
LucasGGamerM
c397c08e40 In the process of trying to make them stack I just couldnt. So I guess this is the new release then 2023-01-21 16:02:11 -03:00
LucasGGamerM
a4d2101f54 a little less broken 2023-01-20 22:12:24 -03:00
sk
f956a17797 Experimental notifications improvement, still a long while to go 2023-01-20 22:06:42 -03:00
sk
1c1d1772a3 Adding needAppRestart to reduceMotion setting 2023-01-20 17:30:12 -03:00
sk
4db87feec4 Making sure it compiles! 2023-01-20 17:30:12 -03:00
sk
bef3c72513 fix "0" reply to ID 2023-01-20 17:30:12 -03:00
sk
4fa641b482 fix null-pointer when switching themes 2023-01-20 17:30:12 -03:00
sk
885b5d781a tweak timeline title animation 2023-01-20 17:30:12 -03:00
sk
2f3bfb3e74 fix clearing notifications
closes sk22#292
2023-01-20 17:30:12 -03:00
sk
2be625fd76 add missing draft params
closes sk22#302
2023-01-20 17:30:12 -03:00
sk
134a371263 only show new posts button at home 2023-01-20 17:30:12 -03:00
sk
8b0eddb8e1 set pivot of timeline title
closes sk22#296
2023-01-20 17:30:12 -03:00
sk
bd2d56b953 remove debug statements 2023-01-20 17:30:12 -03:00
sk
38e429f738 improve multi-line style 2023-01-20 17:30:12 -03:00
sk
de8b15d447 don't cut off multi-line strings 2023-01-20 17:30:12 -03:00
sk
0df1bcce31 fix new posts centered layout 2023-01-20 17:30:12 -03:00
sk
4e17256cfa fix centering button in rtl 2023-01-20 17:30:12 -03:00
sk
e12c3e2d68 fix rtl direction 2023-01-20 17:30:12 -03:00
sk
aec2704f15 restore current tab 2023-01-20 17:30:12 -03:00
sk
31f9173126 don't use old fragments 2023-01-20 17:30:12 -03:00
sk
90196df65d simplify method 2023-01-20 17:30:12 -03:00
sk
6b9fa71806 change crash workaround 2023-01-20 17:30:12 -03:00
sk
130085f804 Revert "work around crash theme switch"
This reverts commit 58fd0c444f30aa5352486b97cab34b2aca6ce8ab.
2023-01-20 17:30:12 -03:00
sk
f4356e74a4 add pager title transition 2023-01-20 17:30:12 -03:00
sk
9c8a4b7a8e Fixing some compile problems 2023-01-20 17:30:12 -03:00
sk22
b7ccf1144c New home layout with public timelines (#288)
* add dummy popup menu
* add pager to home fragment
* reduce pager sensitivity
* remove timelines from discover fragment
* add fabs to timelines
* change info banner color
* add back toolbar functionality
* update icons on navigate
* handle back press
* add lists and hashtags
* use tabs
* improve timeline title
* tweak switcher behavior
* fix show new posts button appearance
* hide show new posts button on reload
* tweak show new posts animations
* work around crash theme switch
* enable disabling federated timeline
Thanks @sk22!
2023-01-20 17:30:11 -03:00
sk
87d5b92a99 change crash workaround 2023-01-20 17:29:23 -03:00
LucasGGamerM
29f8260852 Merge remote-tracking branch 'origin/master' 2023-01-20 11:26:10 -03:00
LucasGGamerM
060745869b Revert "New home layout with public timelines (#288)"
This reverts commit 78d0add808.
2023-01-20 11:19:20 -03:00
LucasGGamerM
1aff3eacd8 Revert "New home layout with public timelines (#288)"
This reverts commit 0207ddb774.
2023-01-20 11:19:16 -03:00
LucasGGamerM
0207ddb774 New home layout with public timelines (#288)
* add dummy popup menu
* add pager to home fragment
* reduce pager sensitivity
* remove timelines from discover fragment
* add fabs to timelines
* change info banner color
* add back toolbar functionality
* update icons on navigate
* handle back press
* add lists and hashtags
* use tabs
* improve timeline title
* tweak switcher behavior
* fix show new posts button appearance
* hide show new posts button on reload
* tweak show new posts animations
* work around crash theme switch
* enable disabling federated timeline
2023-01-20 11:19:09 -03:00
sk22
78d0add808 New home layout with public timelines (#288)
* add dummy popup menu
* add pager to home fragment
* reduce pager sensitivity
* remove timelines from discover fragment
* add fabs to timelines
* change info banner color
* add back toolbar functionality
* update icons on navigate
* handle back press
* add lists and hashtags
* use tabs
* improve timeline title
* tweak switcher behavior
* fix show new posts button appearance
* hide show new posts button on reload
* tweak show new posts animations
* work around crash theme switch
* enable disabling federated timeline
2023-01-20 11:17:26 -03:00
LucasGGamerM
2fa042490a Revert "feat(status/footer): add tooltips to icons"
This reverts commit 707c51e4d6.
2023-01-20 11:09:16 -03:00
LucasGGamerM
885f559092 Revert "Revert "click "replying to" to scroll up""
This reverts commit 77af7ceae3.
2023-01-20 11:01:39 -03:00
sk
77af7ceae3 Revert "click "replying to" to scroll up"
This reverts commit cd0cfba7
2023-01-20 11:00:53 -03:00
sk
09d4188d54 click "replying to" to scroll up
closes #241
2023-01-20 10:59:02 -03:00
LucasGGamerM
1ad03828e3 Merge pull request #49 from dontobi/master
Update german translation
2023-01-19 20:36:22 -03:00
LucasGGamerM
870ac2b946 Making it so the fab doesnt reappear when the notes is in edit mode 2023-01-19 20:19:33 -03:00
FineFindus
394a3eebb1 feat(composeButton): hide when scrolling in profile fragment 2023-01-19 20:01:39 -03:00
FineFindus
95c10a9fea feat(composeButton): hide fab on scroll 2023-01-19 20:00:54 -03:00
dontobi
f0e14c5a13 Update german translation 2023-01-18 21:26:47 +01:00
LucasGGamerM
616049bff2 Fixing weird icon in the profile 2023-01-18 14:15:07 -03:00
sk
1a79bc0b61 Changing Megalodon to Moshidon in the strings.
The command I use for automating this is "find values* -type f -exec sed -i 's/Megalodon/Moshidon/g' {} \;". Run this in the resources folder and it should all be changed
2023-01-18 14:10:38 -03:00
sk
d43cbe642f disable translating scheduled posts
closes sk22#318
2023-01-18 14:07:12 -03:00
sk
77cee4c46a fix "0" reply to ID 2023-01-18 14:07:07 -03:00
sk22
0949ad1ce6 Translated using Weblate (German)
Currently translated at 100.0% (13 of 13 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/de/
2023-01-18 14:07:00 -03:00
sk22
1e411c0c23 Translated using Weblate (German)
Currently translated at 100.0% (13 of 13 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/de/
2023-01-18 14:07:00 -03:00
ling0412
76d306aef7 Translated using Weblate (Chinese (Simplified))
Currently translated at 97.9% (146 of 149 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/zh_Hans/
2023-01-18 14:07:00 -03:00
sk22
7ff19ef481 Translated using Weblate (German)
Currently translated at 100.0% (149 of 149 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/de/
2023-01-18 14:07:00 -03:00
ihor_ck
6650bb946f Translated using Weblate (Ukrainian)
Currently translated at 100.0% (144 of 144 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/uk/
2023-01-18 14:06:50 -03:00
Linerly
bbbf1683aa Translated using Weblate (Indonesian)
Currently translated at 100.0% (144 of 144 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/id/
2023-01-18 14:06:50 -03:00
Choukajohn
5cdea99eb0 Translated using Weblate (French)
Currently translated at 100.0% (144 of 144 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/fr/
2023-01-18 14:06:50 -03:00
ling0412
356426b5fc Translated using Weblate (Chinese (Simplified))
Currently translated at 98.6% (142 of 144 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/zh_Hans/
2023-01-18 14:06:49 -03:00
gicorada
7577d60f42 Translated using Weblate (Italian)
Currently translated at 100.0% (12 of 12 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/it/
2023-01-18 14:06:49 -03:00
ihor_ck
8c7364d57d Translated using Weblate (Ukrainian)
Currently translated at 100.0% (143 of 143 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/uk/
2023-01-18 14:06:49 -03:00
Oliebol
c0a2945378 Translated using Weblate (Dutch)
Currently translated at 93.7% (134 of 143 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/nl/
2023-01-18 14:06:49 -03:00
gicorada
1af9a71210 Translated using Weblate (Italian)
Currently translated at 100.0% (143 of 143 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/it/
2023-01-18 14:06:48 -03:00
Choukajohn
dc859fe91c Translated using Weblate (French)
Currently translated at 100.0% (143 of 143 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/fr/
2023-01-18 14:06:42 -03:00
Nicolas_Horvath
d50c37af23 Translated using Weblate (Czech)
Currently translated at 13.9% (20 of 143 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/cs/
2023-01-18 14:06:42 -03:00
ca
00c8a03b80 Translated using Weblate (Catalan)
Currently translated at 100.0% (143 of 143 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/ca/
2023-01-18 14:06:42 -03:00
ca
d15d222b72 Translated using Weblate (Catalan)
Currently translated at 100.0% (12 of 12 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/ca/
2023-01-18 14:06:41 -03:00
ca
34d134cb57 Translated using Weblate (Catalan)
Currently translated at 100.0% (143 of 143 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/ca/
2023-01-18 14:06:34 -03:00
EifionLlwyd
40eb3e2400 Translated using Weblate (Welsh)
Currently translated at 48.2% (69 of 143 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/cy/
2023-01-18 14:06:34 -03:00
McKris
0af45e5f56 Translated using Weblate (Polish)
Currently translated at 58.3% (7 of 12 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/pl/
2023-01-18 14:06:34 -03:00
ihor_ck
82e3250623 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (143 of 143 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/uk/
2023-01-18 14:06:31 -03:00
HudobniVolk
533a51fc77 Translated using Weblate (Slovenian)
Currently translated at 15.3% (22 of 143 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/sl/
2023-01-18 14:06:31 -03:00
edxkl
6fc82cf26b Translated using Weblate (Portuguese (Brazil))
Currently translated at 95.1% (136 of 143 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/pt_BR/
2023-01-18 14:06:31 -03:00
McKris
6dcfdb9735 Translated using Weblate (Polish)
Currently translated at 100.0% (143 of 143 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/pl/
2023-01-18 14:06:30 -03:00
Linerly
217d8348d4 Translated using Weblate (Indonesian)
Currently translated at 100.0% (143 of 143 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/id/
2023-01-18 14:06:22 -03:00
ghose
9bce934944 Translated using Weblate (Galician)
Currently translated at 25.1% (36 of 143 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/gl/
2023-01-18 14:06:21 -03:00
Choukajohn
a1ef3e1cae Translated using Weblate (French)
Currently translated at 100.0% (143 of 143 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/fr/
2023-01-18 14:06:21 -03:00
gallegonovato
978c1cfdc4 Translated using Weblate (Spanish)
Currently translated at 100.0% (143 of 143 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/es/
2023-01-18 14:06:20 -03:00
ling0412
9fb9ffc269 Translated using Weblate (Chinese (Simplified))
Currently translated at 98.6% (141 of 143 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/zh_Hans/
2023-01-18 14:06:20 -03:00
AiOO
4f357637de Translated using Weblate (Korean)
Currently translated at 100.0% (143 of 143 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/ko/
2023-01-18 14:06:20 -03:00
maxocito
1acd177e81 Translated using Weblate (German)
Currently translated at 100.0% (143 of 143 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/de/
2023-01-18 14:06:20 -03:00
ca
e4b1bf452f Translated using Weblate (Catalan)
Currently translated at 98.6% (141 of 143 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/ca/
2023-01-18 14:06:20 -03:00
Anonymous
ce22cb4678 Translated using Weblate (Burmese)
Currently translated at 71.4% (100 of 140 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/my/
2023-01-18 14:06:20 -03:00
Linerly
3c45215fca Translated using Weblate (Indonesian)
Currently translated at 100.0% (140 of 140 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/id/
2023-01-18 14:06:20 -03:00
ghose
b17e63acae Translated using Weblate (Galician)
Currently translated at 10.7% (15 of 140 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/gl/
2023-01-18 14:06:20 -03:00
mondstern
859ba5ebb9 Translated using Weblate (Czech)
Currently translated at 13.5% (19 of 140 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/cs/
2023-01-18 14:06:20 -03:00
NovaQ64
164579cbb5 Translated using Weblate (Portuguese (Brazil))
Currently translated at 97.1% (136 of 140 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/pt_BR/
2023-01-18 14:06:20 -03:00
EifionLlwyd
990f8189e4 Translated using Weblate (Welsh)
Currently translated at 23.5% (33 of 140 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/cy/
2023-01-18 14:06:20 -03:00
ihor_ck
4d0a642fd9 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (140 of 140 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/uk/
2023-01-18 14:06:16 -03:00
brenno
84b2994b99 Translated using Weblate (Portuguese (Brazil))
Currently translated at 96.4% (135 of 140 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/pt_BR/
2023-01-18 14:06:15 -03:00
Linerly
efbca327c1 Translated using Weblate (Indonesian)
Currently translated at 88.5% (124 of 140 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/id/
2023-01-18 14:06:06 -03:00
Choukajohn
aa4b007d25 Translated using Weblate (French)
Currently translated at 100.0% (140 of 140 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/fr/
2023-01-18 14:06:06 -03:00
gallegonovato
23dccef4b4 Translated using Weblate (Spanish)
Currently translated at 100.0% (140 of 140 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/es/
2023-01-18 14:06:06 -03:00
ling0412
1ef96ed5e6 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (140 of 140 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/zh_Hans/
2023-01-18 14:06:06 -03:00
sk22
31e2a32233 Translated using Weblate (German)
Currently translated at 100.0% (140 of 140 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/de/
2023-01-18 14:06:06 -03:00
irure
168ae80743 Translated using Weblate (Basque)
Currently translated at 100.0% (125 of 125 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/eu/
2023-01-18 14:06:06 -03:00
Hiajen
8acf23ddac Translated using Weblate (German)
Currently translated at 97.6% (122 of 125 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/de/
2023-01-18 14:06:05 -03:00
AiOO
eb40211582 Translated using Weblate (Korean)
Currently translated at 100.0% (125 of 125 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/ko/
2023-01-18 14:06:00 -03:00
irure
bf35161c9f Translated using Weblate (Basque)
Currently translated at 93.6% (117 of 125 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/eu/
2023-01-18 14:05:59 -03:00
Linerly
456c50f69e Translated using Weblate (Indonesian)
Currently translated at 100.0% (125 of 125 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/id/
2023-01-18 14:05:44 -03:00
Choukajohn
587212cf46 Translated using Weblate (French)
Currently translated at 100.0% (125 of 125 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/fr/
2023-01-18 14:05:44 -03:00
AiOO
fe800a259d Translated using Weblate (Korean)
Currently translated at 100.0% (125 of 125 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/ko/
2023-01-18 14:05:44 -03:00
Linerly
c193741013 Translated using Weblate (Indonesian)
Currently translated at 100.0% (124 of 124 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/id/
2023-01-18 14:05:39 -03:00
Choukajohn
a7b752264f Translated using Weblate (French)
Currently translated at 100.0% (124 of 124 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/fr/
2023-01-18 14:05:31 -03:00
AiOO
9075027f69 Translated using Weblate (Korean)
Currently translated at 100.0% (124 of 124 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/ko/
2023-01-18 14:05:25 -03:00
EifionLlwyd
28faf4277a Added translation using Weblate (Welsh) 2023-01-18 14:04:53 -03:00
irure
120ab8ca54 Translated using Weblate (Basque)
Currently translated at 100.0% (125 of 125 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/eu/
2023-01-18 14:04:53 -03:00
AiOO
a3fc1a6a74 Translated using Weblate (Korean)
Currently translated at 100.0% (125 of 125 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/ko/
2023-01-18 14:04:51 -03:00
irure
ec1fe07fea Translated using Weblate (Basque)
Currently translated at 93.6% (117 of 125 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/eu/
2023-01-18 14:04:51 -03:00
mondstern
e3d054ae3e Translated using Weblate (Hungarian)
Currently translated at 100.0% (125 of 125 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/hu/
2023-01-18 14:04:51 -03:00
edxkl
795d4b0801 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (12 of 12 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/pt_BR/
2023-01-18 14:04:51 -03:00
khant
0cf0f07f2d Translated using Weblate (Burmese)
Currently translated at 16.6% (2 of 12 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/my/
2023-01-18 14:04:51 -03:00
AiOO
2cc5872ec7 Translated using Weblate (Korean)
Currently translated at 100.0% (12 of 12 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/ko/
2023-01-18 14:04:51 -03:00
HitaloM
6a151e00ac Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (12 of 12 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/pt_BR/
2023-01-18 14:04:47 -03:00
ling0412
1e99862d40 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (12 of 12 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/zh_Hans/
2023-01-18 14:04:41 -03:00
khant
3a1b12306b Translated using Weblate (Burmese)
Currently translated at 80.0% (100 of 125 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/my/
2023-01-18 14:04:31 -03:00
ihor_ck
e31db6d506 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (125 of 125 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/uk/
2023-01-18 14:04:31 -03:00
edxkl
b22c0a5d3d Translated using Weblate (Portuguese (Brazil))
Currently translated at 84.0% (105 of 125 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/pt_BR/
2023-01-18 14:04:31 -03:00
Linerly
e7d856acf4 Translated using Weblate (Indonesian)
Currently translated at 100.0% (125 of 125 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/id/
2023-01-18 14:04:31 -03:00
Choukajohn
ee8b087b61 Translated using Weblate (French)
Currently translated at 100.0% (125 of 125 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/fr/
2023-01-18 14:04:31 -03:00
gallegonovato
4e86314df5 Translated using Weblate (Spanish)
Currently translated at 100.0% (125 of 125 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/es/
2023-01-18 14:04:31 -03:00
ling0412
cf5fbe3b55 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (125 of 125 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/zh_Hans/
2023-01-18 14:04:31 -03:00
AiOO
952416fefc Translated using Weblate (Korean)
Currently translated at 100.0% (125 of 125 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/ko/
2023-01-18 14:04:31 -03:00
AiOO
1645ce4486 Translated using Weblate (Korean)
Currently translated at 100.0% (12 of 12 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/ko/
2023-01-18 14:04:30 -03:00
Linerly
2bde95b4d2 Translated using Weblate (Indonesian)
Currently translated at 100.0% (124 of 124 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/id/
2023-01-18 14:04:21 -03:00
Choukajohn
2de003c5bb Translated using Weblate (French)
Currently translated at 100.0% (124 of 124 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/fr/
2023-01-18 14:04:21 -03:00
AiOO
a04e16c572 Translated using Weblate (Korean)
Currently translated at 100.0% (124 of 124 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/ko/
2023-01-18 14:04:21 -03:00
sk
eb41d77d54 implement soft-blocking
sk22#297
2023-01-18 14:03:36 -03:00
sk
9325590319 change search placeholder string 2023-01-18 14:03:15 -03:00
sk
d32a57a18d fix akkoma link previews not showing
closes sk22#183
2023-01-18 14:02:53 -03:00
sk
13b5462f63 fix images not loading on akkoma
closes sk22#25
2023-01-18 14:02:50 -03:00
sk
480d4ad904 make announcements selectable
closes sk22#275
2023-01-18 14:02:23 -03:00
sk
7fa52247e8 display unread announcements first
closes sk22#274
2023-01-18 14:02:20 -03:00
sk
5a547015e6 include list title in delete prompt
closes sk22#304
2023-01-18 14:02:11 -03:00
LucasGGamerM
513736f765 Fixing duplicate settings item 2023-01-18 14:02:04 -03:00
sk
c6164b1bcd display image cache size
closes sk22#301
2023-01-18 14:00:15 -03:00
sk
87342782d7 fix clearing notifications
closes sk22#292
2023-01-18 13:58:03 -03:00
sk
a4b18de72c add missing draft params
closes sk22#302
2023-01-18 13:57:59 -03:00
sk
3064b549cd fix cut off text
closes sk22#295
2023-01-18 13:57:50 -03:00
sk
6666f82329 don't require unused fields 2023-01-18 13:55:49 -03:00
Grishka
ad87efa7e2 Fix #484 2023-01-18 13:55:34 -03:00
Grishka
d06cf1bb1e Paginate trending posts 2023-01-18 13:55:29 -03:00
sk
096aa23f69 don't use person icon for unblock
close #245
2023-01-18 13:54:25 -03:00
Grishka
2464042329 Fix #499 2023-01-18 13:54:06 -03:00
sk
928b04eda6 tweak list decoration
closes sk22#273
2023-01-18 13:54:03 -03:00
sk
a31e33415e fix edit user lists always visible
closes sk22#272
2023-01-18 13:53:59 -03:00
Grishka
87ce6b8bb1 Fix #498 2023-01-18 13:53:45 -03:00
sk
bb08d6585c disable more button when read
closes #262
2023-01-18 13:53:33 -03:00
sk
94fa1133fd fix editing sensitive option
closes sk22#260
2023-01-18 13:52:58 -03:00
sk
83822b8f69 add more domains 2023-01-18 13:52:50 -03:00
sk
9f3bd186ba improve domain check logic 2023-01-18 13:52:46 -03:00
sk
58cb338cb2 add missing icons to popup 2023-01-18 13:52:16 -03:00
sk
6f447909eb add dividers to lists 2023-01-18 13:52:11 -03:00
sk
af953e294d move lists and change icons 2023-01-18 13:51:39 -03:00
LucasGGamerM
7504a1b9cb Revert "move lists and change icons"
This reverts commit 3842ecb0d1.
2023-01-18 13:47:29 -03:00
LucasGGamerM
60ee781004 Revert "Revert "move lists and change icons""
This reverts commit 4b88ce5115.
2023-01-18 13:47:29 -03:00
LucasGGamerM
4b88ce5115 Revert "move lists and change icons"
This reverts commit d0ad5561
2023-01-18 13:45:41 -03:00
sk
3842ecb0d1 move lists and change icons 2023-01-18 13:44:30 -03:00
sk
3713063ce3 implement editing lists
re: sk22#30
2023-01-18 13:35:26 -03:00
sk
83b089457e implement deleting lists
re: sk22#30
2023-01-18 13:34:54 -03:00
sk
ed9813f093 implement creating lists
re: sk22#30
2023-01-18 13:34:34 -03:00
sk
e45f3f30f3 change lists string 2023-01-18 13:33:02 -03:00
sk
df44d4cc4f don't overwrite notifications
re: sk22#219
2023-01-18 13:32:58 -03:00
sk
b666048603 add missing margin 2023-01-18 13:29:48 -03:00
FineFindus
153542e1b4 feat(settings): add about instance link (#263) 2023-01-18 13:29:45 -03:00
Tyler Saunders
57e0b96f36 Update ComposeFragment to use the photopicker.
The android platform has a great photopicker, and this change checks
for the current device's sdk version, and uses the photopicker if it's
available on the device.

For pre Android R sdkrev2 devices, the experience remains unchanged.
2023-01-18 13:27:08 -03:00
mishnz
ff65d150e3 serverKey assignment was missing, corrected. 2023-01-18 13:23:23 -03:00
mishnz
88474ba826 Second fix for MIME64 inconsistency in serverKey.
The previous fix https://github.com/mastodon/mastodon-android/pull/486 would break any connections to any instances using WEB_SAFE MIME64 encoding on the serverKey, which actually appears to be the usual case.
This update reverts to the previous logic, but also converts standard MIME64 characters ('/' and '+') to their WEB_SAFE equivalents.
This ensures the standard case of WEB_SAFE BASE64 serverKeys and the anomolous case of DEFAULT BASE64 keys both work.
2023-01-18 13:23:17 -03:00
mishnz
dd92f1b66f The Mastodon server does not currently use URL_SAFE encoding on its serverKey. Using URL_SAFE in this client means the client will crash for any server that uses a key that generates a Mime64 string containing a "+" or "/". This change removes the URL_SAFE logic. See: https://github.com/mastodon/mastodon-android/issues/483 2023-01-18 13:23:10 -03:00
LucasGGamerM
7c7f3cc42a Properly Fixing the bot icon at the end of the username on the header of posts. 2023-01-17 22:26:54 -03:00
LucasGGamerM
734a8049a5 Taking the notes out of the about section until further notice 2023-01-17 21:38:01 -03:00
LucasGGamerM
417faa66f9 Deleting some old stuff 2023-01-17 21:35:58 -03:00
LucasGGamerM
7223a13d08 Editing the padding so that text doesnt go below the button to save 2023-01-17 21:29:51 -03:00
LucasGGamerM
a55002da0c Messing a bit with the colors, I think I like this one 2023-01-17 21:26:44 -03:00
LucasGGamerM
ce89733f2d Making the notes thing more beautiful, and also saves when back button is pressed. i love this. Try it later @FineFindus! 2023-01-17 21:12:04 -03:00
LucasGGamerM
18811ec32a Adding a bigger margin for consistency 2023-01-17 20:42:02 -03:00
LucasGGamerM
e65e6163ba Successfully putting it back where it was. Still need to add a toggle for it 2023-01-16 21:32:54 -03:00
LucasGGamerM
9c3db24d2f Little improvement on the note field 2023-01-16 21:10:06 -03:00
LucasGGamerM
19abbe199b Fixing the Bot icon. Look at how gorgeous this is @FineFindus! 2023-01-16 20:57:05 -03:00
LucasGGamerM
b33003f7b0 Merge pull request #46
Feat/private notes
2023-01-16 20:24:53 -03:00
LucasGGamerM
9a5747efc8 Revert "Fixing it"
This reverts commit 1a075e32de.
2023-01-16 15:26:27 -03:00
LucasGGamerM
980503ed57 Merge remote-tracking branch 'origin/master' 2023-01-16 14:49:59 -03:00
LucasGGamerM
c2dd858de8 Merge pull request #47
refactor(settings): reorder settings
2023-01-16 14:49:53 -03:00
LucasGGamerM
d2ef6fb567 Merge remote-tracking branch 'origin/master' 2023-01-16 14:48:34 -03:00
LucasGGamerM
9c996b3568 Merge pull request #45 from FineFindus/feat/tooltips
feat(status/footer): add tooltips to icons
2023-01-16 14:48:26 -03:00
FineFindus
2387d84bc0 fix(settings): reorder settings 2023-01-14 22:48:03 +01:00
FineFindus
3bd69b5447 fix(note/confirm): animation not displaying 2023-01-14 14:58:31 +01:00
FineFindus
71f6311598 merge: update to latest master 2023-01-14 12:51:29 +01:00
FineFindus
e808977717 refactor(profile/note): rephrase confirm tooltip 2023-01-14 12:50:06 +01:00
FineFindus
8594e34bb5 refactor(profile/note): move note in about tab 2023-01-14 12:46:40 +01:00
FineFindus
4591f06d63 refactor(profile/note): rework edit text hint 2023-01-14 12:44:57 +01:00
FineFindus
b9c3143c6f feat(profile/note): increase animation duration 2023-01-14 11:01:29 +01:00
FineFindus
adefb0e567 feat(profile/note): add fade animation to confirm icon 2023-01-13 23:46:58 +01:00
FineFindus
5a8fed3c06 feat(profile/note): add toast on save failure 2023-01-13 23:41:57 +01:00
FineFindus
2c1b8da475 feat(profile): add private notes textfield 2023-01-13 23:38:40 +01:00
FineFindus
707c51e4d6 feat(status/footer): add tooltips to icons 2023-01-12 19:32:30 +01:00
LucasGGamerM
26297fbb5b Lastcomm 2022-12-28 18:02:38 -03:00
LucasGGamerM
cd342d1034 I am trying my best 2022-12-28 14:56:49 -03:00
LucasGGamerM
029650ef2d Its almost working, the UI side is done. But the request is being canceled when the back button is pressed. 2022-12-28 12:34:00 -03:00
LucasGGamerM
ac24f636df Its a little less broken 2022-12-28 11:15:12 -03:00
LucasGGamerM
1688168bc1 The ui is less broken 2022-12-28 11:05:33 -03:00
LucasGGamerM
46b842afc4 It still does not work, but its one step closer to working 2022-12-28 10:45:15 -03:00
LucasGGamerM
3f773a52cc Created the class. Lets leave this for tomorrow 2022-12-27 21:43:42 -03:00
LucasGGamerM
48664bb580 Idk what to call this commit, so Note Improver it is 2022-12-27 21:42:21 -03:00
LucasGGamerM
094cd67728 Now adding a confirm button 2022-12-27 21:19:54 -03:00
LucasGGamerM
9d800106cc Added a framelayout just for adding the confirm button 2022-12-27 20:20:44 -03:00
LucasGGamerM
68bb23e3b4 It actually loads something. Perfect 2022-12-27 18:48:08 -03:00
LucasGGamerM
68397bd487 How did I add some many lines? Removing them 2022-12-27 18:27:57 -03:00
LucasGGamerM
3104ddb4b6 More polishes the UI side a little more, now also hides the private note on the personal profile 2022-12-27 18:26:35 -03:00
LucasGGamerM
9bddd6b274 The ui side is ready somehow. Still need to handle it all 2022-12-27 16:53:21 -03:00
131 changed files with 3308 additions and 543 deletions

View File

@@ -9,8 +9,8 @@ android {
applicationId "org.joinmastodon.android.moshinda"
minSdk 23
targetSdk 33
versionCode 86
versionName "1.1.4+fork.86.moshinda"
versionCode 87
versionName "1.1.4+fork.87.moshinda"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
resConfigs "ar-rSA", "be-rBY", "bn-rBD", "bs-rBA", "ca-rES", "cs-rCZ", "de-rDE", "el-rGR", "es-rES", "eu-rES", "fi-rFI", "fil-rPH", "fr-rFR", "ga-rIE", "gd-rGB", "gl-rES", "hi-rIN", "hr-rHR", "hu-rHU", "hy-rAM", "in-rID", "is-rIS", "it-rIT", "iw-rIL", "ja-rJP", "kab", "ko-rKR", "nl-rNL", "oc-rFR", "pl-rPL", "pt-rBR", "pt-rPT", "ro-rRO", "ru-rRU", "si-rLK", "sl-rSI", "sv-rSE", "th-rTH", "tr-rTR", "uk-rUA", "vi-rVN", "zh-rCN", "zh-rTW"
}

View File

@@ -36,4 +36,50 @@ shadowsocial.org
kiwifarms.net
kiwifarms.cc
kiwifarms.is
kiwifarms.pleroma.net
kiwifarms.pleroma.net
# https://mastodon.art/@Curator/109649354849593592
poa.st antisemitic racist homophobic
nicecrew.digital antisemitic
beefyboys.win antisemitic racist homophobic harassment
cawfee.club antisemitic racist homophobic
comfyboy.club antisemitic racist homophobic
freespeechextremist.com racist homophobic
cum.salon racist misogynist
bae.st racist
natehiggers.online racist
rapemeat.solutions misogynist
rapist.town misogynist
rapefeminists.network misogynist
kiwifarms.cc harassment
noagendasocial.com noagenda
posting.lolicon.rocks underage
urchan.org harassment homophobic racist
ryona.agency harassment
yggdrasil.social antisemitic homophobic racist
genderheretics.xyz transphobic
baraag.net underage
lolison.top underage
shota.house underage
shota.social underage
aethy.com underage
taullo.social underage
childpawn.shop underage
posting.lolicon.rocks underage
loli.best underage
gothloli.club underage
smuglo.li underage
youjo.love underage
pedo.school underage
lolison.network underage
freak.university underage
mirr0r.city underage
xhais.love underage
refusal.biz underage
refusal.llc underage
mirr0r.city underage
nnia.space underage
ignorelist.com malicious
repl.co malicious
1 # lists.d Mastodon Blocklist (c) 2022 Greyhat Academy LICENSED UNDER: CC-BY-NC-SA 4.0
36 nicecrew.digital antisemitic
37 beefyboys.win antisemitic racist homophobic harassment
38 cawfee.club antisemitic racist homophobic
39 comfyboy.club antisemitic racist homophobic
40 freespeechextremist.com racist homophobic
41 cum.salon racist misogynist
42 bae.st racist
43 natehiggers.online racist
44 rapemeat.solutions misogynist
45 rapist.town misogynist
46 rapefeminists.network misogynist
47 kiwifarms.cc harassment
48 noagendasocial.com noagenda
49 posting.lolicon.rocks underage
50 urchan.org harassment homophobic racist
51 ryona.agency harassment
52 yggdrasil.social antisemitic homophobic racist
53 genderheretics.xyz transphobic
54 baraag.net underage
55 lolison.top underage
56 shota.house underage
57 shota.social underage
58 aethy.com underage
59 taullo.social underage
60 childpawn.shop underage
61 posting.lolicon.rocks underage
62 loli.best underage
63 gothloli.club underage
64 smuglo.li underage
65 youjo.love underage
66 pedo.school underage
67 lolison.network underage
68 freak.university underage
69 mirr0r.city underage
70 xhais.love underage
71 refusal.biz underage
72 refusal.llc underage
73 mirr0r.city underage
74 nnia.space underage
75 ignorelist.com malicious
76 repl.co malicious
77
78
79
80
81
82
83
84
85

View File

@@ -37,8 +37,8 @@ public class PushNotificationReceiver extends BroadcastReceiver{
private static final String TAG="PushNotificationReceive";
public static final int NOTIFICATION_ID=178;
private static int notificationID;
private static final int SUMMARY_ID = 791;
private static int notificationId = 0;
@Override
public void onReceive(Context context, Intent intent){
@@ -99,6 +99,7 @@ public class PushNotificationReceiver extends BroadcastReceiver{
Account self=AccountSessionManager.getInstance().getAccount(accountID).self;
String accountName="@"+self.username+"@"+AccountSessionManager.getInstance().getAccount(accountID).domain;
Notification.Builder builder;
Notification.Builder summaryNotification;
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
boolean hasGroup=false;
List<NotificationChannelGroup> channelGroups=nm.getNotificationChannelGroups();
@@ -121,31 +122,36 @@ public class PushNotificationReceiver extends BroadcastReceiver{
nm.createNotificationChannels(channels);
}
builder=new Notification.Builder(context, accountID+"_"+pn.notificationType);
// summaryNotification=new Notification.Builder(context, accountID);
}else{
builder=new Notification.Builder(context)
.setPriority(Notification.PRIORITY_DEFAULT)
.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE);
summaryNotification=new Notification.Builder(context)
.setPriority(Notification.PRIORITY_DEFAULT)
.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE);
}
Drawable avatar=ImageCache.getInstance(context).get(new UrlImageLoaderRequest(pn.icon, V.dp(50), V.dp(50)));
notificationID = GlobalUserPreferences.keepOnlyLatestNotification ? NOTIFICATION_ID : (int)System.currentTimeMillis();
Intent contentIntent=new Intent(context, MainActivity.class);
contentIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
contentIntent.putExtra("fromNotification", true);
contentIntent.putExtra("accountID", accountID);
contentIntent.putExtra("notificationID", notificationID);
contentIntent.putExtra("notificationID", notificationId);
if(notification!=null){
contentIntent.putExtra("notification", Parcels.wrap(notification));
}
builder.setContentTitle(pn.title)
.setContentText(pn.body)
.setStyle(new Notification.BigTextStyle().bigText(pn.body))
.setContentIntent(PendingIntent.getActivity(context, notificationID, contentIntent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT))
.setContentTitle(pn.title)
.setStyle(new Notification.InboxStyle()
.addLine(pn.body))
.setContentIntent(PendingIntent.getActivity(context, notificationId, contentIntent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT))
.setWhen(notification==null ? System.currentTimeMillis() : notification.createdAt.toEpochMilli())
.setShowWhen(true)
.setCategory(Notification.CATEGORY_SOCIAL)
.setAutoCancel(true)
.setGroup(accountID)
.setColor(context.getColor(R.color.shortcut_icon_background));
if(!GlobalUserPreferences.uniformNotificationIcon){
switch (pn.notificationType) {
@@ -166,6 +172,9 @@ public class PushNotificationReceiver extends BroadcastReceiver{
if(AccountSessionManager.getInstance().getLoggedInAccounts().size()>1){
builder.setSubText(accountName);
}
nm.notify(accountID, notificationID, builder.build());
notificationId++;
nm.notify(accountID, GlobalUserPreferences.keepOnlyLatestNotification ? NOTIFICATION_ID : notificationId, builder.build());
}
}

View File

@@ -61,7 +61,11 @@ public class MastodonAPIController{
String line;
while ((line = reader.readLine()) != null) {
if (line.isBlank() || line.startsWith("#")) continue;
badDomains.add(line.toLowerCase().trim());
String[] parts = line.replaceAll("\"", "").split("[\s,;]");
if (parts.length == 0) continue;
String domain = parts[0].toLowerCase().trim();
if (domain.isBlank()) continue;
badDomains.add(domain);
}
} catch (IOException e) {
e.printStackTrace();
@@ -73,8 +77,8 @@ public class MastodonAPIController{
}
public <T> void submitRequest(final MastodonAPIRequest<T> req){
final String host = req.getURL().getHost().toLowerCase();
final boolean isBad = badDomains.stream().anyMatch(host::endsWith);
final String host = req.getURL().getHost();
final boolean isBad = host == null || badDomains.stream().anyMatch(h -> h.equalsIgnoreCase(host) || host.toLowerCase().endsWith("." + h));
thread.postRunnable(()->{
try{
if (isBad) throw new IllegalArgumentException();

View File

@@ -0,0 +1,19 @@
package org.joinmastodon.android.api.requests.accounts;
import org.joinmastodon.android.api.MastodonAPIRequest;
import org.joinmastodon.android.model.Relationship;
public class SetPrivateNote extends MastodonAPIRequest<Relationship>{
public SetPrivateNote(String id, String comment){
super(MastodonAPIRequest.HttpMethod.POST, "/accounts/"+id+"/note", Relationship.class);
Request req = new Request(comment);
setRequestBody(req);
}
private static class Request{
public String comment;
public Request(String comment){
this.comment=comment;
}
}
}

View File

@@ -0,0 +1,19 @@
package org.joinmastodon.android.api.requests.lists;
import org.joinmastodon.android.api.MastodonAPIRequest;
import org.joinmastodon.android.model.ListTimeline;
public class CreateList extends MastodonAPIRequest<ListTimeline> {
public CreateList(String title, ListTimeline.RepliesPolicy repliesPolicy) {
super(HttpMethod.POST, "/lists", ListTimeline.class);
Request req = new Request();
req.title = title;
req.repliesPolicy = repliesPolicy;
setRequestBody(req);
}
public static class Request {
public String title;
public ListTimeline.RepliesPolicy repliesPolicy;
}
}

View File

@@ -0,0 +1,10 @@
package org.joinmastodon.android.api.requests.lists;
import org.joinmastodon.android.api.MastodonAPIRequest;
import org.joinmastodon.android.model.ListTimeline;
public class DeleteList extends MastodonAPIRequest<Object> {
public DeleteList(String id) {
super(HttpMethod.DELETE, "/lists/" + id, Object.class);
}
}

View File

@@ -0,0 +1,14 @@
package org.joinmastodon.android.api.requests.lists;
import org.joinmastodon.android.api.MastodonAPIRequest;
import org.joinmastodon.android.model.ListTimeline;
public class UpdateList extends MastodonAPIRequest<ListTimeline> {
public UpdateList(String id, String title, ListTimeline.RepliesPolicy repliesPolicy) {
super(HttpMethod.PUT, "/lists/" + id, ListTimeline.class);
CreateList.Request req = new CreateList.Request();
req.title = title;
req.repliesPolicy = repliesPolicy;
setRequestBody(req);
}
}

View File

@@ -9,6 +9,10 @@ import org.joinmastodon.android.model.Hashtag;
import java.util.List;
public class GetFollowedHashtags extends HeaderPaginationRequest<Hashtag> {
public GetFollowedHashtags() {
this(null, null, -1, null);
}
public GetFollowedHashtags(String maxID, String minID, int limit, String sinceID){
super(HttpMethod.GET, "/followed_tags", new TypeToken<>(){});
if(maxID!=null)

View File

@@ -8,9 +8,11 @@ import org.joinmastodon.android.model.Status;
import java.util.List;
public class GetTrendingStatuses extends MastodonAPIRequest<List<Status>>{
public GetTrendingStatuses(int limit){
public GetTrendingStatuses(int offset, int limit){
super(HttpMethod.GET, "/trends/statuses", new TypeToken<>(){});
if(limit>0)
addQueryParameter("limit", ""+limit);
if(offset>0)
addQueryParameter("offset", ""+offset);
}
}

View File

@@ -3,6 +3,10 @@ package org.joinmastodon.android.fragments;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.animation.TranslateAnimation;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import org.joinmastodon.android.R;
import org.joinmastodon.android.api.requests.accounts.GetAccountStatuses;
@@ -67,6 +71,7 @@ public class AccountTimelineFragment extends StatusListFragment{
@Override
public void onViewCreated(View view, Bundle savedInstanceState){
super.onViewCreated(view, savedInstanceState);
fab = ((ProfileFragment) getParentFragment()).getFab();
}
@Override

View File

@@ -1,5 +1,7 @@
package org.joinmastodon.android.fragments;
import static java.util.stream.Collectors.toList;
import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
@@ -34,6 +36,7 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import me.grishka.appkit.Nav;
import me.grishka.appkit.api.PaginatedList;
@@ -63,9 +66,11 @@ public class AnnouncementsFragment extends BaseStatusListFragment<Announcement>
instanceUser.avatar = instanceUser.avatarStatic = instance.thumbnail;
instanceUser.emojis = List.of();
Status fakeStatus = a.toStatus();
TextStatusDisplayItem textItem = new TextStatusDisplayItem(a.id, HtmlParser.parse(a.content, a.emojis, a.mentions, a.tags, accountID), this, fakeStatus, true);
textItem.textSelectable = true;
return List.of(
HeaderStatusDisplayItem.fromAnnouncement(a, fakeStatus, instanceUser, this, accountID, this::onMarkAsRead),
new TextStatusDisplayItem(a.id, HtmlParser.parse(a.content, a.emojis, a.mentions, a.tags, accountID), this, fakeStatus)
textItem
);
}
@@ -84,14 +89,7 @@ public class AnnouncementsFragment extends BaseStatusListFragment<Announcement>
protected void addAccountToKnown(Announcement s) {}
@Override
public void onItemClick(String id) {
}
@Override
protected void onDataLoaded(List<Announcement> d, boolean more) {
unreadIDs = d.stream().filter(a -> !a.read).map(a -> a.id).collect(Collectors.toList());
super.onDataLoaded(d, more);
}
public void onItemClick(String id) {}
@Override
protected void doLoadData(int offset, int count){
@@ -99,7 +97,11 @@ public class AnnouncementsFragment extends BaseStatusListFragment<Announcement>
.setCallback(new SimpleCallback<>(this){
@Override
public void onSuccess(List<Announcement> result){
onDataLoaded(result, false);
List<Announcement> unread = result.stream().filter(a -> !a.read).collect(toList());
List<Announcement> read = result.stream().filter(a -> a.read).collect(toList());
onDataLoaded(unread, true);
onDataLoaded(read, false);
unreadIDs = unread.stream().map(a -> a.id).collect(toList());
}
})
.exec(accountID);

View File

@@ -13,9 +13,12 @@ import android.text.Layout;
import android.text.StaticLayout;
import android.text.TextPaint;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowInsets;
import android.view.animation.TranslateAnimation;
import android.widget.ImageButton;
import android.widget.Toolbar;
import org.joinmastodon.android.E;
@@ -71,6 +74,8 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
protected DisplayItemsAdapter adapter;
protected String accountID;
protected PhotoViewer currentPhotoViewer;
protected ImageButton fab;
protected boolean isScrollingUp = false;
protected HashMap<String, Account> knownAccounts=new HashMap<>();
protected HashMap<String, Relationship> relationships=new HashMap<>();
protected Rect tmpRect=new Rect();
@@ -273,11 +278,42 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
@Override
public void onViewCreated(View view, Bundle savedInstanceState){
super.onViewCreated(view, savedInstanceState);
fab=view.findViewById(R.id.fab);
list.addOnScrollListener(new RecyclerView.OnScrollListener(){
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy){
if(currentPhotoViewer!=null)
currentPhotoViewer.offsetView(-dx, -dy);
if (fab!=null) {
if (dy >= 0 ) {
if (isScrollingUp) {
fab.setVisibility(View.INVISIBLE);
TranslateAnimation animate = new TranslateAnimation(
0,
0,
0,
fab.getHeight() * 2);
animate.setDuration(300);
animate.setFillAfter(true);
fab.startAnimation(animate);
isScrollingUp = false;
}
} else {
if (!isScrollingUp) {
fab.setVisibility(View.VISIBLE);
TranslateAnimation animate = new TranslateAnimation(
0,
0,
fab.getHeight() * 2,
0);
animate.setDuration(300);
animate.setFillAfter(true);
fab.startAnimation(animate);
isScrollingUp = true;
}
}
}
}
});
list.addItemDecoration(new StatusListItemDecoration());

View File

@@ -1,5 +1,7 @@
package org.joinmastodon.android.fragments;
import static android.os.ext.SdkExtensions.getExtensionVersion;
import static org.joinmastodon.android.GlobalUserPreferences.recentLanguages;
import static org.joinmastodon.android.api.requests.statuses.CreateStatus.DRAFTS_AFTER_INSTANT;
import static org.joinmastodon.android.api.requests.statuses.CreateStatus.getDraftInstant;
@@ -29,6 +31,7 @@ import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Parcelable;
import android.provider.MediaStore;
import android.provider.OpenableColumns;
import android.text.Editable;
import android.text.InputFilter;
@@ -432,6 +435,13 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
spoilerBtn.setSelected(true);
}
sensitive = savedInstanceState==null && editingStatus != null ? editingStatus.sensitive
: savedInstanceState!=null && savedInstanceState.getBoolean("sensitive", false);
if (sensitive) {
sensitiveItem.setVisibility(View.VISIBLE);
sensitiveIcon.setSelected(true);
}
if(savedInstanceState!=null && savedInstanceState.containsKey("attachments")){
ArrayList<Parcelable> serializedAttachments=savedInstanceState.getParcelableArrayList("attachments");
for(Parcelable a:serializedAttachments){
@@ -517,6 +527,8 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
mainEditText.setSelectionListener(this);
mainEditText.addTextChangedListener(new TextWatcher(){
private int lastChangeStart, lastChangeCount;
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after){
@@ -526,6 +538,16 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
public void onTextChanged(CharSequence s, int start, int before, int count){
if(s.length()==0)
return;
lastChangeStart=start;
lastChangeCount=count;
}
@Override
public void afterTextChanged(Editable s){
if(s.length()==0)
return;
int start=lastChangeStart;
int count=lastChangeCount;
// offset one char back to catch an already typed '@' or '#' or ':'
int realStart=start;
start=Math.max(0, start-1);
@@ -571,10 +593,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
editable.removeSpan(span);
}
}
}
@Override
public void afterTextChanged(Editable s){
updateCharCounter();
}
});
@@ -657,6 +676,10 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
replyText.setOnClickListener(v->{
scrollView.smoothScrollTo(0, 0);
});
replyText.setOnClickListener(v->{
scrollView.smoothScrollTo(0, 0);
});
ArrayList<String> mentions=new ArrayList<>();
String ownID=AccountSessionManager.getInstance().getAccount(accountID).self.id;
@@ -701,7 +724,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
DraftMediaAttachment da=new DraftMediaAttachment();
da.serverAttachment=att;
da.description=att.description;
da.uri=Uri.parse(att.previewUrl);
da.uri=att.previewUrl!=null ? Uri.parse(att.previewUrl) : null;
da.state=AttachmentUploadState.DONE;
attachmentsView.addView(createMediaAttachmentView(da));
attachments.add(da);
@@ -1162,14 +1185,50 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
.show();
}
/**
* Check to see if Android platform photopicker is available on the device\
* @return whether the device supports photopicker intents.
*/
private boolean isPhotoPickerAvailable() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
return true;
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
return getExtensionVersion(Build.VERSION_CODES.R) >= 2;
} else
return false;
}
/**
* Builds the correct intent for the device version to select media.
*
* <p>For Device version > T or R_SDK_v2, use the android platform photopicker via
* {@link MediaStore#ACTION_PICK_IMAGES}
*
* <p>For earlier versions use the built in docs ui via {@link Intent#ACTION_GET_CONTENT}
*/
private void openFilePicker(){
Intent intent=new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
if(instance.configuration!=null && instance.configuration.mediaAttachments!=null && instance.configuration.mediaAttachments.supportedMimeTypes!=null && !instance.configuration.mediaAttachments.supportedMimeTypes.isEmpty()){
intent.putExtra(Intent.EXTRA_MIME_TYPES, instance.configuration.mediaAttachments.supportedMimeTypes.toArray(new String[0]));
}else{
intent.putExtra(Intent.EXTRA_MIME_TYPES, new String[]{"image/*", "video/*"});
Intent intent;
boolean usePhotoPicker = isPhotoPickerAvailable();
if (usePhotoPicker) {
intent = new Intent(MediaStore.ACTION_PICK_IMAGES);
intent.putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, MediaStore.getPickImagesMaxLimit());
} else {
intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
}
if (!usePhotoPicker && instance.configuration != null &&
instance.configuration.mediaAttachments != null &&
instance.configuration.mediaAttachments.supportedMimeTypes != null &&
!instance.configuration.mediaAttachments.supportedMimeTypes.isEmpty()) {
intent.putExtra(Intent.EXTRA_MIME_TYPES,
instance.configuration.mediaAttachments.supportedMimeTypes.toArray(
new String[0]));
} else {
if (!usePhotoPicker) {
// If photo picker is being used these are the default mimetypes.
intent.putExtra(Intent.EXTRA_MIME_TYPES, new String[]{"image/*", "video/*"});
}
}
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
startActivityForResult(intent, MEDIA_RESULT);
@@ -1252,7 +1311,8 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
View thumb=getActivity().getLayoutInflater().inflate(R.layout.compose_media_thumb, attachmentsView, false);
ImageView img=thumb.findViewById(R.id.thumb);
if(draft.serverAttachment!=null){
ViewImageLoader.load(img, draft.serverAttachment.blurhashPlaceholder, new UrlImageLoaderRequest(draft.serverAttachment.previewUrl, V.dp(250), V.dp(250)));
if(draft.serverAttachment.previewUrl!=null)
ViewImageLoader.load(img, draft.serverAttachment.blurhashPlaceholder, new UrlImageLoaderRequest(draft.serverAttachment.previewUrl, V.dp(250), V.dp(250)));
}else{
if(draft.mimeType.startsWith("image/")){
ViewImageLoader.load(img, null, new UrlImageLoaderRequest(draft.uri, V.dp(250), V.dp(250)));

View File

@@ -0,0 +1,37 @@
package org.joinmastodon.android.fragments;
import android.content.res.Configuration;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
import org.joinmastodon.android.R;
import org.joinmastodon.android.ui.utils.UiUtils;
import me.grishka.appkit.Nav;
public abstract class FabStatusListFragment extends StatusListFragment {
protected ImageButton fab;
public FabStatusListFragment() {
setListLayoutId(R.layout.recycler_fragment_with_fab);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
fab = view.findViewById(R.id.fab);
fab.setOnClickListener(this::onFabClick);
fab.setOnLongClickListener(this::onFabLongClick);
}
protected void onFabClick(View v){
Bundle args=new Bundle();
args.putString("account", accountID);
Nav.go(getActivity(), ComposeFragment.class, args);
}
protected boolean onFabLongClick(View v) {
return UiUtils.pickAccountForCompose(getActivity(), accountID);
}
}

View File

@@ -1,6 +1,7 @@
package org.joinmastodon.android.fragments;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
@@ -11,6 +12,7 @@ import org.joinmastodon.android.R;
import org.joinmastodon.android.api.requests.tags.GetFollowedHashtags;
import org.joinmastodon.android.model.Hashtag;
import org.joinmastodon.android.model.HeaderPaginationList;
import org.joinmastodon.android.ui.DividerItemDecoration;
import org.joinmastodon.android.ui.utils.UiUtils;
import me.grishka.appkit.api.SimpleCallback;
@@ -41,6 +43,12 @@ public class FollowedHashtagsFragment extends BaseRecyclerFragment<Hashtag> impl
loadData();
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
list.addItemDecoration(new DividerItemDecoration(getActivity(), R.attr.colorPollVoted, 0.5f, 56, 16));
}
@Override
protected void doLoadData(int offset, int count){
currentRequest=new GetFollowedHashtags(offset==0 ? null : nextMaxID, null, count, null)

View File

@@ -5,6 +5,7 @@ import android.app.NotificationManager;
import android.graphics.Outline;
import android.os.Build;
import android.os.Bundle;
import android.service.notification.StatusBarNotification;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -41,7 +42,11 @@ import me.grishka.appkit.views.FragmentRootLinearLayout;
public class HomeFragment extends AppKitFragment implements OnBackPressedListener{
private FragmentRootLinearLayout content;
private HomeTimelineFragment homeTimelineFragment;
private HomeTabFragment homeTabFragment;
// private HomeTimelineFragment homeTimelineFragment;
private NotificationsFragment notificationsFragment;
private DiscoverFragment searchFragment;
private ProfileFragment profileFragment;
@@ -65,8 +70,13 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene
if(savedInstanceState==null){
Bundle args=new Bundle();
args.putString("account", accountID);
homeTimelineFragment=new HomeTimelineFragment();
homeTimelineFragment.setArguments(args);
homeTabFragment=new HomeTabFragment();
homeTabFragment.setArguments(args);
// homeTimelineFragment=new HomeTimelineFragment();
// homeTimelineFragment.setArguments(args);
args=new Bundle(args);
args.putBoolean("noAutoLoad", true);
searchFragment=new DiscoverFragment();
@@ -110,12 +120,19 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene
if(savedInstanceState==null){
getChildFragmentManager().beginTransaction()
.add(R.id.fragment_wrap, homeTimelineFragment)
.add(R.id.fragment_wrap, homeTabFragment)
.add(R.id.fragment_wrap, searchFragment).hide(searchFragment)
.add(R.id.fragment_wrap, notificationsFragment).hide(notificationsFragment)
.add(R.id.fragment_wrap, profileFragment).hide(profileFragment)
.commit();
// getChildFragmentManager().beginTransaction()
// .add(R.id.fragment_wrap, homeTimelineFragment)
// .add(R.id.fragment_wrap, searchFragment).hide(searchFragment)
// .add(R.id.fragment_wrap, notificationsFragment).hide(notificationsFragment)
// .add(R.id.fragment_wrap, profileFragment).hide(profileFragment)
// .commit();
String defaultTab=getArguments().getString("tab");
if("notifications".equals(defaultTab)){
tabBar.selectTab(R.id.tab_notifications);
@@ -136,21 +153,36 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene
@Override
public void onViewStateRestored(Bundle savedInstanceState){
super.onViewStateRestored(savedInstanceState);
if(savedInstanceState==null || homeTimelineFragment!=null)
return;
homeTimelineFragment=(HomeTimelineFragment) getChildFragmentManager().getFragment(savedInstanceState, "homeTimelineFragment");
if(savedInstanceState==null) return;
// if(savedInstanceState==null || homeTimelineFragment!=null)
// return;
homeTabFragment=(HomeTabFragment) getChildFragmentManager().getFragment(savedInstanceState, "homeTabFragment");
// homeTimelineFragment=(HomeTimelineFragment) getChildFragmentManager().getFragment(savedInstanceState, "homeTimelineFragment");
searchFragment=(DiscoverFragment) getChildFragmentManager().getFragment(savedInstanceState, "searchFragment");
notificationsFragment=(NotificationsFragment) getChildFragmentManager().getFragment(savedInstanceState, "notificationsFragment");
profileFragment=(ProfileFragment) getChildFragmentManager().getFragment(savedInstanceState, "profileFragment");
currentTab=savedInstanceState.getInt("selectedTab");
Fragment current=fragmentForTab(currentTab);
getChildFragmentManager().beginTransaction()
.hide(homeTimelineFragment)
.hide(homeTabFragment)
.hide(searchFragment)
.hide(notificationsFragment)
.hide(profileFragment)
.show(current)
.commit();
// getChildFragmentManager().beginTransaction()
// .hide(homeTimelineFragment)
// .hide(searchFragment)
// .hide(notificationsFragment)
// .hide(profileFragment)
// .show(current)
// .commit();
maybeTriggerLoading(current);
}
@@ -180,7 +212,11 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene
super.onApplyWindowInsets(insets.replaceSystemWindowInsets(insets.getSystemWindowInsetLeft(), 0, insets.getSystemWindowInsetRight(), insets.getSystemWindowInsetBottom()));
}
WindowInsets topOnlyInsets=insets.replaceSystemWindowInsets(0, insets.getSystemWindowInsetTop(), 0, 0);
homeTimelineFragment.onApplyWindowInsets(topOnlyInsets);
homeTabFragment.onApplyWindowInsets(topOnlyInsets);
// homeTimelineFragment.onApplyWindowInsets(topOnlyInsets);
searchFragment.onApplyWindowInsets(topOnlyInsets);
notificationsFragment.onApplyWindowInsets(topOnlyInsets);
profileFragment.onApplyWindowInsets(topOnlyInsets);
@@ -188,7 +224,10 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene
private Fragment fragmentForTab(@IdRes int tab){
if(tab==R.id.tab_home){
return homeTimelineFragment;
return homeTabFragment;
// if(tab==R.id.tab_home){
// return homeTimelineFragment;
}else if(tab==R.id.tab_search){
return searchFragment;
}else if(tab==R.id.tab_notifications){
@@ -233,7 +272,11 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene
((NotificationsFragment) newFragment).loadData();
// TODO make an interface?
NotificationManager nm=getActivity().getSystemService(NotificationManager.class);
nm.cancel(accountID, PushNotificationReceiver.NOTIFICATION_ID);
for (StatusBarNotification notification : nm.getActiveNotifications()) {
if (accountID.equals(notification.getTag())) {
nm.cancel(accountID, notification.getId());
}
}
}
}
@@ -265,17 +308,24 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene
tabBar.selectTab(R.id.tab_home);
onTabSelected(R.id.tab_home);
return true;
} else {
return homeTabFragment.onBackPressed();
}
return false;
}
@Override
public void onSaveInstanceState(Bundle outState){
super.onSaveInstanceState(outState);
outState.putInt("selectedTab", currentTab);
getChildFragmentManager().putFragment(outState, "homeTimelineFragment", homeTimelineFragment);
getChildFragmentManager().putFragment(outState, "searchFragment", searchFragment);
getChildFragmentManager().putFragment(outState, "notificationsFragment", notificationsFragment);
getChildFragmentManager().putFragment(outState, "profileFragment", profileFragment);
if (homeTabFragment.isAdded()) getChildFragmentManager().putFragment(outState, "homeTabFragment", homeTabFragment);
if (searchFragment.isAdded()) getChildFragmentManager().putFragment(outState, "searchFragment", searchFragment);
if (notificationsFragment.isAdded()) getChildFragmentManager().putFragment(outState, "notificationsFragment", notificationsFragment);
if (profileFragment.isAdded()) getChildFragmentManager().putFragment(outState, "profileFragment", profileFragment);
// getChildFragmentManager().putFragment(outState, "homeTimelineFragment", homeTimelineFragment);
// getChildFragmentManager().putFragment(outState, "searchFragment", searchFragment);
// getChildFragmentManager().putFragment(outState, "notificationsFragment", notificationsFragment);
// getChildFragmentManager().putFragment(outState, "profileFragment", profileFragment);
}
}

View File

@@ -0,0 +1,556 @@
package org.joinmastodon.android.fragments;
import static org.joinmastodon.android.GlobalUserPreferences.showFederatedTimeline;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.view.ViewTreeObserver;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.PopupMenu;
import android.widget.TextView;
import android.widget.Toolbar;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import androidx.viewpager2.widget.ViewPager2;
import com.squareup.otto.Subscribe;
import org.joinmastodon.android.E;
import org.joinmastodon.android.GlobalUserPreferences;
import org.joinmastodon.android.R;
import org.joinmastodon.android.api.requests.announcements.GetAnnouncements;
import org.joinmastodon.android.api.requests.lists.GetLists;
import org.joinmastodon.android.api.requests.tags.GetFollowedHashtags;
import org.joinmastodon.android.events.SelfUpdateStateChangedEvent;
import org.joinmastodon.android.fragments.discover.FederatedTimelineFragment;
import org.joinmastodon.android.fragments.discover.LocalTimelineFragment;
import org.joinmastodon.android.model.Announcement;
import org.joinmastodon.android.model.Hashtag;
import org.joinmastodon.android.model.HeaderPaginationList;
import org.joinmastodon.android.model.ListTimeline;
import org.joinmastodon.android.ui.SimpleViewHolder;
import org.joinmastodon.android.ui.utils.UiUtils;
import org.joinmastodon.android.updater.GithubSelfUpdater;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import me.grishka.appkit.Nav;
import me.grishka.appkit.api.Callback;
import me.grishka.appkit.api.ErrorResponse;
import me.grishka.appkit.fragments.BaseRecyclerFragment;
import me.grishka.appkit.fragments.OnBackPressedListener;
import me.grishka.appkit.utils.CubicBezierInterpolator;
import me.grishka.appkit.utils.V;
public class HomeTabFragment extends MastodonToolbarFragment implements ScrollableToTop, OnBackPressedListener {
private static final int ANNOUNCEMENTS_RESULT = 654;
private String accountID;
private MenuItem announcements;
// private ImageView toolbarLogo;
private Button toolbarShowNewPostsBtn;
private boolean newPostsBtnShown;
private AnimatorSet currentNewPostsAnim;
private ViewPager2 pager;
private final List<Fragment> fragments = new ArrayList<>();
private final List<FrameLayout> tabViews = new ArrayList<>();
private View switcher;
private FrameLayout toolbarFrame;
private ImageView timelineIcon;
private ImageView collapsedChevron;
private TextView timelineTitle;
private PopupMenu switcherPopup;
private final Map<Integer, ListTimeline> listItems = new HashMap<>();
private final Map<Integer, Hashtag> hashtagsItems = new HashMap<>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
accountID = getArguments().getString("account");
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
setHasOptionsMenu(true);
}
@Override
public View onCreateContentView(LayoutInflater inflater, ViewGroup container, Bundle bundle) {
FrameLayout view = new FrameLayout(getContext());
pager = new ViewPager2(getContext());
toolbarFrame = (FrameLayout) LayoutInflater.from(getContext()).inflate(R.layout.home_toolbar, getToolbar(), false);
if (fragments.size() == 0) {
Bundle args = new Bundle();
args.putString("account", accountID);
args.putBoolean("__is_tab", true);
fragments.add(new HomeTimelineFragment());
fragments.add(new LocalTimelineFragment());
if (showFederatedTimeline) fragments.add(new FederatedTimelineFragment());
args=new Bundle(args);
args.putBoolean("onlyPosts", true);
NotificationsListFragment postsFragment=new NotificationsListFragment();
postsFragment.setArguments(args);
fragments.add(postsFragment);
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
for (int i = 0; i < fragments.size(); i++) {
fragments.get(i).setArguments(args);
FrameLayout tabView = new FrameLayout(getActivity());
tabView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
tabView.setVisibility(View.GONE);
tabView.setId(i + 1);
transaction.add(i + 1, fragments.get(i));
view.addView(tabView);
tabViews.add(tabView);
}
transaction.commit();
}
view.addView(pager, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
return view;
}
@SuppressLint("ClickableViewAccessibility")
@Override
public void onViewCreated(View view, Bundle savedInstanceState){
super.onViewCreated(view, savedInstanceState);
timelineIcon = toolbarFrame.findViewById(R.id.timeline_icon);
timelineTitle = toolbarFrame.findViewById(R.id.timeline_title);
collapsedChevron = toolbarFrame.findViewById(R.id.collapsed_chevron);
switcher = toolbarFrame.findViewById(R.id.switcher_btn);
switcherPopup = new PopupMenu(getContext(), switcher);
switcherPopup.inflate(R.menu.home_switcher);
switcherPopup.setOnMenuItemClickListener(this::onSwitcherItemSelected);
UiUtils.enablePopupMenuIcons(getContext(), switcherPopup);
switcher.setOnClickListener(v->{
updateSwitcherMenu();
switcherPopup.show();
});
View.OnTouchListener listener = switcherPopup.getDragToOpenListener();
switcher.setOnTouchListener((v, m)-> {
updateSwitcherMenu();
return listener.onTouch(v, m);
});
UiUtils.reduceSwipeSensitivity(pager);
pager.setUserInputEnabled(!GlobalUserPreferences.disableSwipe);
pager.setAdapter(new HomePagerAdapter());
pager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback(){
@Override
public void onPageSelected(int position){
updateSwitcherIcon(position);
if (position==0) return;
hideNewPostsButton();
if (fragments.get(position) instanceof BaseRecyclerFragment<?> page){
if(!page.loaded && !page.isDataLoading()) page.loadData();
}
}
});
if (!GlobalUserPreferences.reduceMotion) {
pager.setPageTransformer((v, pos) -> {
if (tabViews.get(pager.getCurrentItem()) != v) return;
float scaleFactor = Math.max(0.85f, 1 - Math.abs(pos) * 0.06f);
switcher.setScaleY(scaleFactor);
switcher.setScaleX(scaleFactor);
switcher.setAlpha(Math.max(0.65f, 1 - Math.abs(pos)));
});
}
updateToolbarLogo();
if(GithubSelfUpdater.needSelfUpdating()){
E.register(this);
updateUpdateState(GithubSelfUpdater.getInstance().getState());
}
new GetLists().setCallback(new Callback<>() {
@Override
public void onSuccess(List<ListTimeline> lists) {
addItemsToMap(lists, listItems);
}
@Override
public void onError(ErrorResponse error) {
error.showToast(getContext());
}
}).exec(accountID);
new GetFollowedHashtags().setCallback(new Callback<>() {
@Override
public void onSuccess(HeaderPaginationList<Hashtag> hashtags) {
addItemsToMap(hashtags, hashtagsItems);
}
@Override
public void onError(ErrorResponse error) {
error.showToast(getContext());
}
}).exec(accountID);
}
public void updateToolbarLogo(){
Toolbar toolbar = getToolbar();
ViewParent parentView = toolbarFrame.getParent();
if (parentView == toolbar) return;
if (parentView instanceof Toolbar parentToolbar) parentToolbar.removeView(toolbarFrame);
toolbar.addView(toolbarFrame, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
toolbar.setOnClickListener(v->scrollToTop());
toolbar.setNavigationContentDescription(R.string.back);
toolbar.setContentInsetsAbsolute(0, toolbar.getContentInsetRight());
updateSwitcherIcon(pager.getCurrentItem());
// toolbarLogo=new ImageView(getActivity());
// toolbarLogo.setScaleType(ImageView.ScaleType.CENTER);
// toolbarLogo.setImageResource(R.drawable.logo);
// toolbarLogo.setImageTintList(ColorStateList.valueOf(UiUtils.getThemeColor(getActivity(), android.R.attr.textColorPrimary)));
toolbarShowNewPostsBtn=toolbarFrame.findViewById(R.id.show_new_posts_btn);
toolbarShowNewPostsBtn.setCompoundDrawableTintList(toolbarShowNewPostsBtn.getTextColors());
if(Build.VERSION.SDK_INT<Build.VERSION_CODES.N) UiUtils.fixCompoundDrawableTintOnAndroid6(toolbarShowNewPostsBtn);
toolbarShowNewPostsBtn.setOnClickListener(this::onNewPostsBtnClick);
if(newPostsBtnShown){
toolbarShowNewPostsBtn.setVisibility(View.VISIBLE);
collapsedChevron.setVisibility(View.VISIBLE);
collapsedChevron.setAlpha(1f);
timelineTitle.setVisibility(View.GONE);
timelineTitle.setAlpha(0f);
}else{
toolbarShowNewPostsBtn.setVisibility(View.INVISIBLE);
toolbarShowNewPostsBtn.setAlpha(0f);
collapsedChevron.setVisibility(View.GONE);
collapsedChevron.setAlpha(0f);
toolbarShowNewPostsBtn.setScaleX(.8f);
toolbarShowNewPostsBtn.setScaleY(.8f);
timelineTitle.setVisibility(View.VISIBLE);
}
ViewTreeObserver vto = toolbar.getViewTreeObserver();
if (vto.isAlive()) {
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Toolbar t = getToolbar();
if (t == null) return;
int toolbarWidth = t.getWidth();
if (toolbarWidth == 0) return;
t.getViewTreeObserver().removeOnGlobalLayoutListener(this);
int toolbarFrameWidth = toolbarFrame.getWidth();
int padding = toolbarWidth - toolbarFrameWidth;
// toolbar frame goes from screen edge to beginning of right-aligned option buttons.
// centering button by applying the same space on the left
((FrameLayout) toolbarShowNewPostsBtn.getParent()).setPaddingRelative(padding, 0, 0, 0);
toolbarShowNewPostsBtn.setMaxWidth(toolbarWidth - padding * 2);
switcher.setPivotX(V.dp(28)); // padding + half of icon
switcher.setPivotY(switcher.getHeight() / 2f);
timelineTitle.setPivotX(timelineTitle.getWidth() - V.dp(8));
timelineTitle.setPivotY(timelineTitle.getHeight() / 2f);
}
});
}
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater){
inflater.inflate(R.menu.home, menu);
announcements = menu.findItem(R.id.announcements);
new GetAnnouncements(false).setCallback(new Callback<>() {
@Override
public void onSuccess(List<Announcement> result) {
boolean hasUnread = result.stream().anyMatch(a -> !a.read);
announcements.setIcon(hasUnread ? R.drawable.ic_announcements_24_badged : R.drawable.ic_fluent_megaphone_24_regular);
}
@Override
public void onError(ErrorResponse error) {
error.showToast(getActivity());
}
}).exec(accountID);
}
private <T> void addItemsToMap(List<T> addItems, Map<Integer, T> items) {
if (addItems.size() == 0) return;
for (int i = 0; i < addItems.size(); i++) items.put(View.generateViewId(), addItems.get(i));
updateSwitcherMenu();
}
private void updateSwitcherMenu() {
Context context = getContext();
switcherPopup.getMenu().findItem(R.id.federated).setVisible(showFederatedTimeline);
if (!listItems.isEmpty()) {
MenuItem listsItem = switcherPopup.getMenu().findItem(R.id.lists);
listsItem.setVisible(true);
SubMenu listsMenu = listsItem.getSubMenu();
listsMenu.clear();
listItems.forEach((id, list) -> {
MenuItem item = listsMenu.add(Menu.NONE, id, Menu.NONE, list.title);
item.setIcon(R.drawable.ic_fluent_people_list_24_regular);
UiUtils.insetPopupMenuIcon(context, item);
});
}
if (!hashtagsItems.isEmpty()) {
MenuItem hashtagsItem = switcherPopup.getMenu().findItem(R.id.followed_hashtags);
hashtagsItem.setVisible(true);
SubMenu hashtagsMenu = hashtagsItem.getSubMenu();
hashtagsMenu.clear();
hashtagsItems.forEach((id, hashtag) -> {
MenuItem item = hashtagsMenu.add(Menu.NONE, id, Menu.NONE, hashtag.name);
item.setIcon(R.drawable.ic_fluent_number_symbol_24_regular);
UiUtils.insetPopupMenuIcon(context, item);
});
}
}
private boolean onSwitcherItemSelected(MenuItem item) {
int id = item.getItemId();
ListTimeline list;
Hashtag hashtag;
if (id == R.id.home) {
navigateTo(0);
return true;
} else if (id == R.id.local) {
navigateTo(1);
return true;
} else if (id == R.id.federated) {
navigateTo(2);
return true;
} else if (id == R.id.post_notifications) {
navigateTo(showFederatedTimeline ? 3 : 2);
} else if ((list = listItems.get(id)) != null) {
Bundle args = new Bundle();
args.putString("account", accountID);
args.putString("listID", list.id);
args.putString("listTitle", list.title);
args.putInt("repliesPolicy", list.repliesPolicy.ordinal());
Nav.go(getActivity(), ListTimelineFragment.class, args);
} else if ((hashtag = hashtagsItems.get(id)) != null) {
UiUtils.openHashtagTimeline(getActivity(), accountID, hashtag.name, hashtag.following);
}
return false;
}
private void navigateTo(int i) {
navigateTo(i, !GlobalUserPreferences.reduceMotion);
}
private void navigateTo(int i, boolean smooth) {
pager.setCurrentItem(i, smooth);
updateSwitcherIcon(i);
}
private void updateSwitcherIcon(int i) {
// todo: refactor when implementing pinned tabs
if (i == (showFederatedTimeline ? 3 : 2)) {
timelineIcon.setImageResource(R.drawable.ic_fluent_alert_24_regular);
timelineTitle.setText(R.string.sk_notify_posts);
} else {
timelineIcon.setImageResource(switch (i) {
default -> R.drawable.ic_fluent_home_24_regular;
case 1 -> R.drawable.ic_fluent_people_community_24_regular;
case 2 -> R.drawable.ic_fluent_earth_24_regular;
});
timelineTitle.setText(switch (i) {
default -> R.string.sk_timeline_home;
case 1 -> R.string.sk_timeline_local;
case 2 -> R.string.sk_timeline_federated;
});
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item){
Bundle args=new Bundle();
args.putString("account", accountID);
if (item.getItemId() == R.id.settings) Nav.go(getActivity(), SettingsFragment.class, args);
if (item.getItemId() == R.id.announcements) {
Nav.goForResult(getActivity(), AnnouncementsFragment.class, args, ANNOUNCEMENTS_RESULT, this);
}
return true;
}
@Override
public void scrollToTop(){
((ScrollableToTop) fragments.get(pager.getCurrentItem())).scrollToTop();
}
public void hideNewPostsButton(){
if(!newPostsBtnShown)
return;
newPostsBtnShown=false;
if(currentNewPostsAnim!=null){
currentNewPostsAnim.cancel();
}
timelineTitle.setVisibility(View.VISIBLE);
AnimatorSet set=new AnimatorSet();
set.playTogether(
ObjectAnimator.ofFloat(timelineTitle, View.ALPHA, 1f),
ObjectAnimator.ofFloat(timelineTitle, View.SCALE_X, 1f),
ObjectAnimator.ofFloat(timelineTitle, View.SCALE_Y, 1f),
ObjectAnimator.ofFloat(toolbarShowNewPostsBtn, View.ALPHA, 0f),
ObjectAnimator.ofFloat(toolbarShowNewPostsBtn, View.SCALE_X, .8f),
ObjectAnimator.ofFloat(toolbarShowNewPostsBtn, View.SCALE_Y, .8f),
ObjectAnimator.ofFloat(collapsedChevron, View.ALPHA, 0f)
);
set.setDuration(GlobalUserPreferences.reduceMotion ? 0 : 300);
set.setInterpolator(CubicBezierInterpolator.DEFAULT);
set.addListener(new AnimatorListenerAdapter(){
@Override
public void onAnimationEnd(Animator animation){
toolbarShowNewPostsBtn.setVisibility(View.INVISIBLE);
collapsedChevron.setVisibility(View.GONE);
currentNewPostsAnim=null;
}
});
currentNewPostsAnim=set;
set.start();
}
public void showNewPostsButton(){
if(newPostsBtnShown || pager == null || pager.getCurrentItem() != 0)
return;
newPostsBtnShown=true;
if(currentNewPostsAnim!=null){
currentNewPostsAnim.cancel();
}
toolbarShowNewPostsBtn.setVisibility(View.VISIBLE);
collapsedChevron.setVisibility(View.VISIBLE);
AnimatorSet set=new AnimatorSet();
set.playTogether(
ObjectAnimator.ofFloat(timelineTitle, View.ALPHA, 0f),
ObjectAnimator.ofFloat(timelineTitle, View.SCALE_X, .8f),
ObjectAnimator.ofFloat(timelineTitle, View.SCALE_Y, .8f),
ObjectAnimator.ofFloat(toolbarShowNewPostsBtn, View.ALPHA, 1f),
ObjectAnimator.ofFloat(toolbarShowNewPostsBtn, View.SCALE_X, 1f),
ObjectAnimator.ofFloat(toolbarShowNewPostsBtn, View.SCALE_Y, 1f),
ObjectAnimator.ofFloat(collapsedChevron, View.ALPHA, 1f)
);
set.setDuration(GlobalUserPreferences.reduceMotion ? 0 : 300);
set.setInterpolator(CubicBezierInterpolator.DEFAULT);
set.addListener(new AnimatorListenerAdapter(){
@Override
public void onAnimationEnd(Animator animation){
timelineTitle.setVisibility(View.GONE);
currentNewPostsAnim=null;
}
});
currentNewPostsAnim=set;
set.start();
}
public boolean isNewPostsBtnShown() {
return newPostsBtnShown;
}
private void onNewPostsBtnClick(View view) {
if(newPostsBtnShown){
hideNewPostsButton();
scrollToTop();
}
}
@Override
public void onFragmentResult(int reqCode, boolean noMoreUnread, Bundle result){
if (reqCode == ANNOUNCEMENTS_RESULT && noMoreUnread) {
announcements.setIcon(R.drawable.ic_fluent_megaphone_24_regular);
}
}
private void updateUpdateState(GithubSelfUpdater.UpdateState state){
if(state!=GithubSelfUpdater.UpdateState.NO_UPDATE && state!=GithubSelfUpdater.UpdateState.CHECKING)
getToolbar().getMenu().findItem(R.id.settings).setIcon(R.drawable.ic_settings_24_badged);
}
@Subscribe
public void onSelfUpdateStateChanged(SelfUpdateStateChangedEvent ev){
updateUpdateState(ev.state);
}
@Override
public boolean onBackPressed(){
if(pager.getCurrentItem() > 0){
navigateTo(0);
return true;
}
return false;
}
@Override
public void onDestroyView(){
super.onDestroyView();
if(GithubSelfUpdater.needSelfUpdating()){
E.unregister(this);
}
}
@Override
public void onViewStateRestored(Bundle savedInstanceState) {
super.onViewStateRestored(savedInstanceState);
if (savedInstanceState == null) return;
navigateTo(savedInstanceState.getInt("selectedTab"), false);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("selectedTab", pager.getCurrentItem());
}
private class HomePagerAdapter extends RecyclerView.Adapter<SimpleViewHolder> {
@NonNull
@Override
public SimpleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
FrameLayout tabView = tabViews.get(viewType % getItemCount());
((ViewGroup)tabView.getParent()).removeView(tabView);
tabView.setVisibility(View.VISIBLE);
return new SimpleViewHolder(tabView);
}
@Override
public void onBindViewHolder(@NonNull SimpleViewHolder holder, int position){}
@Override
public int getItemCount(){
return fragments.size();
}
@Override
public int getItemViewType(int position){
return position;
}
}
}

View File

@@ -1,47 +1,21 @@
package org.joinmastodon.android.fragments;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.app.Activity;
import android.content.res.ColorStateList;
import android.content.res.Configuration;
import android.os.Build;
import android.os.Bundle;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.Toolbar;
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.R;
import org.joinmastodon.android.api.requests.announcements.GetAnnouncements;
import org.joinmastodon.android.api.requests.timelines.GetHomeTimeline;
import org.joinmastodon.android.api.session.AccountSessionManager;
import org.joinmastodon.android.events.SelfUpdateStateChangedEvent;
import org.joinmastodon.android.events.StatusCreatedEvent;
import org.joinmastodon.android.model.Announcement;
import org.joinmastodon.android.model.CacheablePaginatedResponse;
import org.joinmastodon.android.model.Filter;
import org.joinmastodon.android.model.Status;
import org.joinmastodon.android.ui.displayitems.GapStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.StatusDisplayItem;
import org.joinmastodon.android.ui.utils.UiUtils;
import org.joinmastodon.android.updater.GithubSelfUpdater;
import org.joinmastodon.android.utils.StatusFilterPredicate;
import java.util.Collections;
@@ -50,33 +24,19 @@ import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import me.grishka.appkit.Nav;
import me.grishka.appkit.api.Callback;
import me.grishka.appkit.api.ErrorResponse;
import me.grishka.appkit.api.SimpleCallback;
import me.grishka.appkit.utils.CubicBezierInterpolator;
import me.grishka.appkit.utils.V;
public class HomeTimelineFragment extends StatusListFragment{
private static final int ANNOUNCEMENTS_RESULT = 654;
private ImageButton fab;
private ImageView toolbarLogo;
private Button toolbarShowNewPostsBtn;
private boolean newPostsBtnShown;
private AnimatorSet currentNewPostsAnim;
private MenuItem announcements;
public class HomeTimelineFragment extends FabStatusListFragment {
private HomeTabFragment parent;
private String maxID;
public HomeTimelineFragment(){
setListLayoutId(R.layout.recycler_fragment_with_fab);
}
@Override
public void onAttach(Activity activity){
super.onAttach(activity);
setHasOptionsMenu(true);
if (getParentFragment() instanceof HomeTabFragment home) parent = home;
loadData();
}
@@ -108,67 +68,15 @@ public class HomeTimelineFragment extends StatusListFragment{
@Override
public void onViewCreated(View view, Bundle savedInstanceState){
super.onViewCreated(view, savedInstanceState);
fab=view.findViewById(R.id.fab);
fab.setOnClickListener(this::onFabClick);
fab.setOnLongClickListener(v->UiUtils.pickAccountForCompose(getActivity(), accountID));
updateToolbarLogo();
list.addOnScrollListener(new RecyclerView.OnScrollListener(){
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy){
if(newPostsBtnShown && list.getChildAdapterPosition(list.getChildAt(0))<=getMainAdapterOffset()){
hideNewPostsButton();
if(parent != null && parent.isNewPostsBtnShown() && list.getChildAdapterPosition(list.getChildAt(0))<=getMainAdapterOffset()){
parent.hideNewPostsButton();
}
}
});
if(GithubSelfUpdater.needSelfUpdating()){
E.register(this);
updateUpdateState(GithubSelfUpdater.getInstance().getState());
}
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater){
inflater.inflate(R.menu.home, menu);
announcements = menu.findItem(R.id.announcements);
new GetAnnouncements(false).setCallback(new Callback<>() {
@Override
public void onSuccess(List<Announcement> result) {
boolean hasUnread = result.stream().anyMatch(a -> !a.read);
announcements.setIcon(hasUnread ? R.drawable.ic_announcements_24_badged : R.drawable.ic_fluent_megaphone_24_regular);
}
@Override
public void onError(ErrorResponse error) {
error.showToast(getActivity());
}
}).exec(accountID);
}
@Override
public boolean onOptionsItemSelected(MenuItem item){
Bundle args=new Bundle();
args.putString("account", accountID);
if (item.getItemId() == R.id.settings) Nav.go(getActivity(), SettingsFragment.class, args);
if (item.getItemId() == R.id.announcements) {
Nav.goForResult(getActivity(), AnnouncementsFragment.class, args, ANNOUNCEMENTS_RESULT, this);
}
return true;
}
@Override
public void onFragmentResult(int reqCode, boolean noMoreUnread, Bundle result){
if (reqCode == ANNOUNCEMENTS_RESULT && noMoreUnread) {
announcements.setIcon(R.drawable.ic_fluent_megaphone_24_regular);
}
}
@Override
public void onConfigurationChanged(Configuration newConfig){
super.onConfigurationChanged(newConfig);
updateToolbarLogo();
}
@Override
@@ -187,12 +95,6 @@ public class HomeTimelineFragment extends StatusListFragment{
prependItems(Collections.singletonList(ev.status), true);
}
private void onFabClick(View v){
Bundle args=new Bundle();
args.putString("account", accountID);
Nav.go(getActivity(), ComposeFragment.class, args);
}
private void loadNewPosts(){
if (!GlobalUserPreferences.loadNewPosts) return;
dataLoading=true;
@@ -221,7 +123,7 @@ public class HomeTimelineFragment extends StatusListFragment{
toAdd=toAdd.stream().filter(filterPredicate).collect(Collectors.toList());
if(!toAdd.isEmpty()){
prependItems(toAdd, true);
showNewPostsButton();
if (parent != null) parent.showNewPostsButton();
AccountSessionManager.getInstance().getAccount(accountID).getCacheController().putHomeTimeline(toAdd, false);
}
}
@@ -337,132 +239,10 @@ public class HomeTimelineFragment extends StatusListFragment{
currentRequest=null;
dataLoading=false;
}
if (parent != null) parent.hideNewPostsButton();
super.onRefresh();
}
private void updateToolbarLogo(){
toolbarLogo=new ImageView(getActivity());
toolbarLogo.setScaleType(ImageView.ScaleType.CENTER);
toolbarLogo.setImageResource(R.drawable.logo);
toolbarLogo.setImageTintList(ColorStateList.valueOf(UiUtils.getThemeColor(getActivity(), android.R.attr.textColorPrimary)));
// toolbarLogo =new TextView(getActivity());
// toolbarLogo.setText(getString(R.string.app_name).toLowerCase(Locale.getDefault()));
// toolbarLogo.setTextAppearance(R.style.app_title);
toolbarShowNewPostsBtn=new Button(getActivity());
toolbarShowNewPostsBtn.setTextAppearance(R.style.m3_title_medium);
toolbarShowNewPostsBtn.setTextColor(0xffffffff);
toolbarShowNewPostsBtn.setStateListAnimator(null);
toolbarShowNewPostsBtn.setBackgroundResource(R.drawable.bg_button_new_posts);
toolbarShowNewPostsBtn.setText(R.string.see_new_posts);
toolbarShowNewPostsBtn.setCompoundDrawablesRelativeWithIntrinsicBounds(R.drawable.ic_fluent_arrow_up_16_filled, 0, 0, 0);
toolbarShowNewPostsBtn.setCompoundDrawableTintList(toolbarShowNewPostsBtn.getTextColors());
toolbarShowNewPostsBtn.setCompoundDrawablePadding(V.dp(8));
if(Build.VERSION.SDK_INT<Build.VERSION_CODES.N)
UiUtils.fixCompoundDrawableTintOnAndroid6(toolbarShowNewPostsBtn);
toolbarShowNewPostsBtn.setOnClickListener(this::onNewPostsBtnClick);
if(newPostsBtnShown){
toolbarShowNewPostsBtn.setVisibility(View.VISIBLE);
toolbarLogo.setVisibility(View.INVISIBLE);
toolbarLogo.setAlpha(0f);
}else{
toolbarShowNewPostsBtn.setVisibility(View.INVISIBLE);
toolbarShowNewPostsBtn.setAlpha(0f);
toolbarShowNewPostsBtn.setScaleX(.8f);
toolbarShowNewPostsBtn.setScaleY(.8f);
toolbarLogo.setVisibility(View.VISIBLE);
}
FrameLayout logoWrap=new FrameLayout(getActivity());
logoWrap.addView(toolbarLogo, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.CENTER));
logoWrap.addView(toolbarShowNewPostsBtn, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, V.dp(32), Gravity.CENTER));
Toolbar toolbar=getToolbar();
toolbar.addView(logoWrap, new Toolbar.LayoutParams(Gravity.CENTER));
}
private void showNewPostsButton(){
if(newPostsBtnShown)
return;
newPostsBtnShown=true;
if(currentNewPostsAnim!=null){
currentNewPostsAnim.cancel();
}
toolbarShowNewPostsBtn.setVisibility(View.VISIBLE);
AnimatorSet set=new AnimatorSet();
set.playTogether(
ObjectAnimator.ofFloat(toolbarLogo, View.ALPHA, 0f),
ObjectAnimator.ofFloat(toolbarShowNewPostsBtn, View.ALPHA, 1f),
ObjectAnimator.ofFloat(toolbarShowNewPostsBtn, View.SCALE_X, 1f),
ObjectAnimator.ofFloat(toolbarShowNewPostsBtn, View.SCALE_Y, 1f)
);
set.setDuration(300);
set.setInterpolator(CubicBezierInterpolator.DEFAULT);
set.addListener(new AnimatorListenerAdapter(){
@Override
public void onAnimationEnd(Animator animation){
toolbarLogo.setVisibility(View.INVISIBLE);
currentNewPostsAnim=null;
}
});
currentNewPostsAnim=set;
set.start();
}
private void hideNewPostsButton(){
if(!newPostsBtnShown)
return;
newPostsBtnShown=false;
if(currentNewPostsAnim!=null){
currentNewPostsAnim.cancel();
}
toolbarLogo.setVisibility(View.VISIBLE);
AnimatorSet set=new AnimatorSet();
set.playTogether(
ObjectAnimator.ofFloat(toolbarLogo, View.ALPHA, 1f),
ObjectAnimator.ofFloat(toolbarShowNewPostsBtn, View.ALPHA, 0f),
ObjectAnimator.ofFloat(toolbarShowNewPostsBtn, View.SCALE_X, .8f),
ObjectAnimator.ofFloat(toolbarShowNewPostsBtn, View.SCALE_Y, .8f)
);
set.setDuration(300);
set.setInterpolator(CubicBezierInterpolator.DEFAULT);
set.addListener(new AnimatorListenerAdapter(){
@Override
public void onAnimationEnd(Animator animation){
toolbarShowNewPostsBtn.setVisibility(View.INVISIBLE);
currentNewPostsAnim=null;
}
});
currentNewPostsAnim=set;
set.start();
}
private void onNewPostsBtnClick(View v){
if(newPostsBtnShown){
hideNewPostsButton();
scrollToTop();
}
}
@Override
public void onDestroyView(){
super.onDestroyView();
if(GithubSelfUpdater.needSelfUpdating()){
E.unregister(this);
}
}
private void updateUpdateState(GithubSelfUpdater.UpdateState state){
if(state!=GithubSelfUpdater.UpdateState.NO_UPDATE && state!=GithubSelfUpdater.UpdateState.CHECKING)
getToolbar().getMenu().findItem(R.id.settings).setIcon(R.drawable.ic_settings_24_badged);
}
@Subscribe
public void onSelfUpdateStateChanged(SelfUpdateStateChangedEvent ev){
updateUpdateState(ev.state);
}
@Override
protected boolean shouldRemoveAccountPostsWhenUnfollowing(){
return true;

View File

@@ -4,18 +4,26 @@ import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import org.joinmastodon.android.R;
import org.joinmastodon.android.api.requests.lists.CreateList;
import org.joinmastodon.android.api.requests.lists.UpdateList;
import org.joinmastodon.android.api.requests.timelines.GetListTimeline;
import org.joinmastodon.android.model.ListTimeline;
import org.joinmastodon.android.model.Status;
import org.joinmastodon.android.ui.M3AlertDialogBuilder;
import org.joinmastodon.android.ui.utils.UiUtils;
import org.joinmastodon.android.ui.views.ListTimelineEditor;
import java.util.List;
import me.grishka.appkit.Nav;
import me.grishka.appkit.api.Callback;
import me.grishka.appkit.api.ErrorResponse;
import me.grishka.appkit.api.SimpleCallback;
import me.grishka.appkit.utils.V;
@@ -23,6 +31,7 @@ import me.grishka.appkit.utils.V;
public class ListTimelineFragment extends StatusListFragment {
private String listID;
private String listTitle;
private ListTimeline.RepliesPolicy repliesPolicy;
private ImageButton fab;
public ListTimelineFragment() {
@@ -32,8 +41,11 @@ public class ListTimelineFragment extends StatusListFragment {
@Override
public void onAttach(Activity activity){
super.onAttach(activity);
listID=getArguments().getString("listID");
listTitle=getArguments().getString("listTitle");
Bundle args = getArguments();
listID = args.getString("listID");
listTitle = args.getString("listTitle");
repliesPolicy = ListTimeline.RepliesPolicy.values()[args.getInt("repliesPolicy", 0)];
setTitle(listTitle);
setHasOptionsMenu(true);
}
@@ -41,8 +53,48 @@ public class ListTimelineFragment extends StatusListFragment {
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
// TODO: implement edit, delete
// inflater.inflate(R.menu.list, menu);
inflater.inflate(R.menu.list, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Bundle args = new Bundle();
args.putString("listID", listID);
if (item.getItemId() == R.id.edit) {
ListTimelineEditor editor = new ListTimelineEditor(getContext());
editor.applyList(listTitle, repliesPolicy);
new M3AlertDialogBuilder(getActivity())
.setTitle(R.string.sk_edit_list_title)
.setIcon(R.drawable.ic_fluent_people_list_28_regular)
.setView(editor)
.setPositiveButton(R.string.save, (d, which) -> {
new UpdateList(listID, editor.getTitle(), editor.getRepliesPolicy()).setCallback(new Callback<>() {
@Override
public void onSuccess(ListTimeline list) {
setTitle(list.title);
listTitle = list.title;
repliesPolicy = list.repliesPolicy;
args.putString("listTitle", listTitle);
args.putInt("repliesPolicy", repliesPolicy.ordinal());
setResult(true, args);
}
@Override
public void onError(ErrorResponse error) {
error.showToast(getContext());
}
}).exec(accountID);
})
.setNegativeButton(R.string.cancel, (d, which) -> {})
.show();
} else if (item.getItemId() == R.id.delete) {
UiUtils.confirmDeleteList(getActivity(), accountID, listID, listTitle, () -> {
args.putBoolean("deleted", true);
setResult(true, args);
Nav.finish(this);
});
}
return true;
}
@Override

View File

@@ -1,6 +1,9 @@
package org.joinmastodon.android.fragments;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
@@ -12,28 +15,37 @@ import androidx.recyclerview.widget.RecyclerView;
import org.joinmastodon.android.R;
import org.joinmastodon.android.api.MastodonAPIRequest;
import org.joinmastodon.android.api.requests.lists.AddAccountsToList;
import org.joinmastodon.android.api.requests.lists.CreateList;
import org.joinmastodon.android.api.requests.lists.GetLists;
import org.joinmastodon.android.api.requests.lists.RemoveAccountsFromList;
import org.joinmastodon.android.model.ListTimeline;
import org.joinmastodon.android.ui.utils.UiUtils;
import org.joinmastodon.android.ui.DividerItemDecoration;
import org.joinmastodon.android.ui.M3AlertDialogBuilder;
import org.joinmastodon.android.ui.views.ListTimelineEditor;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import me.grishka.appkit.Nav;
import me.grishka.appkit.api.Callback;
import me.grishka.appkit.api.ErrorResponse;
import me.grishka.appkit.api.SimpleCallback;
import me.grishka.appkit.fragments.BaseRecyclerFragment;
import me.grishka.appkit.utils.BindableViewHolder;
import me.grishka.appkit.views.UsableRecyclerView;
public class ListTimelinesFragment extends BaseRecyclerFragment<ListTimeline> implements ScrollableToTop {
private static final int LIST_CHANGED_RESULT = 987;
private String accountId;
private String profileAccountId;
private String profileDisplayUsername;
private HashMap<String, Boolean> userInListBefore = new HashMap<>();
private HashMap<String, Boolean> userInList = new HashMap<>();
private int inProgress = 0;
private ListsAdapter adapter;
public ListTimelinesFragment() {
super(10);
@@ -44,12 +56,14 @@ public class ListTimelinesFragment extends BaseRecyclerFragment<ListTimeline> im
super.onCreate(savedInstanceState);
Bundle args=getArguments();
accountId=args.getString("account");
setHasOptionsMenu(true);
if(args.containsKey("profileAccount")){
profileAccountId=args.getString("profileAccount");
profileDisplayUsername=args.getString("profileDisplayUsername");
setTitle(getString(R.string.sk_lists_with_user, profileDisplayUsername));
// setHasOptionsMenu(true);
} else {
setTitle(R.string.sk_your_lists);
}
}
@@ -60,20 +74,45 @@ public class ListTimelinesFragment extends BaseRecyclerFragment<ListTimeline> im
loadData();
}
// @Override
// public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// Button saveButton=new Button(getActivity());
// saveButton.setText(R.string.save);
// saveButton.setOnClickListener(this::onSaveClick);
// LinearLayout wrap=new LinearLayout(getActivity());
// wrap.setOrientation(LinearLayout.HORIZONTAL);
// wrap.addView(saveButton, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
// wrap.setPadding(V.dp(16), V.dp(4), V.dp(16), V.dp(8));
// wrap.setClipToPadding(false);
// MenuItem item=menu.add(R.string.save);
// item.setActionView(wrap);
// item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
// }
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
list.addItemDecoration(new DividerItemDecoration(getActivity(), R.attr.colorPollVoted, 0.5f, 56, 16));
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu_list, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.create) {
ListTimelineEditor editor = new ListTimelineEditor(getContext());
new M3AlertDialogBuilder(getActivity())
.setTitle(R.string.sk_create_list_title)
.setIcon(R.drawable.ic_fluent_people_add_28_regular)
.setView(editor)
.setPositiveButton(R.string.sk_create, (d, which) -> {
new CreateList(editor.getTitle(), editor.getRepliesPolicy()).setCallback(new Callback<>() {
@Override
public void onSuccess(ListTimeline list) {
saveListMembership(list.id, true);
data.add(0, list);
adapter.notifyItemRangeInserted(0, 1);
}
@Override
public void onError(ErrorResponse error) {
error.showToast(getContext());
}
}).exec(accountId);
})
.setNegativeButton(R.string.cancel, (d, which) -> {})
.show();
}
return true;
}
private void saveListMembership(String listId, boolean isMember) {
userInList.put(listId, isMember);
@@ -118,8 +157,29 @@ public class ListTimelinesFragment extends BaseRecyclerFragment<ListTimeline> im
}
@Override
protected RecyclerView.Adapter getAdapter() {
return new ListsAdapter();
public void onFragmentResult(int reqCode, boolean listChanged, Bundle result){
if (reqCode == LIST_CHANGED_RESULT && listChanged) {
String listID = result.getString("listID");
for (int i = 0; i < data.size(); i++) {
ListTimeline item = data.get(i);
if (item.id.equals(listID)) {
if (result.getBoolean("deleted")) {
data.remove(i);
adapter.notifyItemRemoved(i);
} else {
item.title = result.getString("listTitle", item.title);
item.repliesPolicy = ListTimeline.RepliesPolicy.values()[result.getInt("repliesPolicy")];
adapter.notifyItemChanged(i);
}
break;
}
}
}
}
@Override
protected RecyclerView.Adapter<ListViewHolder> getAdapter() {
return adapter = new ListsAdapter();
}
@Override
@@ -158,7 +218,7 @@ public class ListTimelinesFragment extends BaseRecyclerFragment<ListTimeline> im
@Override
public void onBind(ListTimeline item) {
title.setText(item.title);
title.setCompoundDrawablesRelativeWithIntrinsicBounds(itemView.getContext().getDrawable(R.drawable.ic_fluent_people_community_24_regular), null, null, null);
title.setCompoundDrawablesRelativeWithIntrinsicBounds(itemView.getContext().getDrawable(R.drawable.ic_fluent_people_list_24_regular), null, null, null);
if (profileAccountId != null) {
Boolean checked = userInList.get(item.id);
listToggle.setVisibility(View.VISIBLE);
@@ -175,7 +235,12 @@ public class ListTimelinesFragment extends BaseRecyclerFragment<ListTimeline> im
@Override
public void onClick() {
UiUtils.openListTimeline(getActivity(), accountId, item);
Bundle args=new Bundle();
args.putString("account", accountId);
args.putString("listID", item.id);
args.putString("listTitle", item.title);
args.putInt("repliesPolicy", item.repliesPolicy.ordinal());
Nav.goForResult(getActivity(), ListTimelineFragment.class, args, LIST_CHANGED_RESULT, ListTimelinesFragment.this);
}
}
}

View File

@@ -102,6 +102,7 @@ public class NotificationsFragment extends MastodonToolbarFragment implements Sc
tabLayout=view.findViewById(R.id.tabbar);
pager=view.findViewById(R.id.pager);
UiUtils.reduceSwipeSensitivity(pager);
tabViews=new FrameLayout[3];
for(int i=0;i<tabViews.length;i++){

View File

@@ -1,5 +1,6 @@
package org.joinmastodon.android.fragments;
import android.app.Activity;
import android.app.Fragment;
import android.graphics.Canvas;
import android.graphics.Paint;
@@ -12,11 +13,23 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowInsets;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import org.joinmastodon.android.R;
import org.joinmastodon.android.api.requests.accounts.SetPrivateNote;
import org.joinmastodon.android.model.AccountField;
import org.joinmastodon.android.model.Relationship;
import org.joinmastodon.android.ui.BetterItemAnimator;
import org.joinmastodon.android.ui.text.CustomEmojiSpan;
import org.joinmastodon.android.ui.utils.SimpleTextWatcher;
@@ -26,11 +39,8 @@ import org.joinmastodon.android.ui.views.LinkedTextView;
import java.util.Collections;
import java.util.List;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import me.grishka.appkit.api.Callback;
import me.grishka.appkit.api.ErrorResponse;
import me.grishka.appkit.fragments.WindowInsetsAwareFragment;
import me.grishka.appkit.imageloader.ImageLoaderRecyclerAdapter;
import me.grishka.appkit.imageloader.ImageLoaderViewHolder;
@@ -46,6 +56,11 @@ public class ProfileAboutFragment extends Fragment implements WindowInsetsAwareF
private static final int MAX_FIELDS=4;
public UsableRecyclerView list;
public FrameLayout noteWrap;
public EditText noteEdit;
private String accountID;
private String profileAccountID;
private String note;
private List<AccountField> fields=Collections.emptyList();
private AboutAdapter adapter;
private Paint dividerPaint=new Paint();
@@ -64,11 +79,49 @@ public class ProfileAboutFragment extends Fragment implements WindowInsetsAwareF
adapter.notifyDataSetChanged();
}
public void setNote(String note, String accountID, String profileAccountID){
this.note=note;
this.accountID=accountID;
this.profileAccountID=profileAccountID;
// noteWrap.setVisibility(View.VISIBLE);
// noteEdit.setVisibility(View.VISIBLE);
// noteEdit.setText(note);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState){
list=new UsableRecyclerView(getActivity());
list.setId(R.id.list);
View view = inflater.inflate(R.layout.fragment_profile_about, null);
noteEdit = view.findViewById(R.id.note_edit);
noteWrap = view.findViewById(R.id.note_edit_wrap);
ImageButton noteEditConfirm = view.findViewById(R.id.note_edit_confirm);
noteEdit.setOnFocusChangeListener((v, hasFocus) -> {
if (hasFocus) {
noteEditConfirm.setVisibility(View.VISIBLE);
noteEditConfirm.animate()
.alpha(1.0f)
.setDuration(700);
} else {
noteEditConfirm.animate()
.alpha(0.0f)
.setDuration(700);
noteEditConfirm.setVisibility(View.INVISIBLE);
}
});
noteEditConfirm.setOnClickListener((v -> {
if (!noteEdit.getText().toString().trim().equals(note)) {
savePrivateNote();
}
InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(this.getView().getRootView().getWindowToken(), 0);
noteEdit.clearFocus();
}));
list = view.findViewById(R.id.list);
list.setItemAnimator(new BetterItemAnimator());
list.setDrawSelectorOnTop(true);
list.setLayoutManager(new LinearLayoutManager(getActivity()));
@@ -95,8 +148,20 @@ public class ProfileAboutFragment extends Fragment implements WindowInsetsAwareF
}
}
});
return list;
return view;
}
private void savePrivateNote(){
new SetPrivateNote(profileAccountID, noteEdit.getText().toString()).setCallback(new Callback<>() {
@Override
public void onSuccess(Relationship result) {}
@Override
public void onError(ErrorResponse result) {
Toast.makeText(getActivity(), getString(R.string.sk_personal_note_update_failed), Toast.LENGTH_LONG).show();
}
}).exec(accountID);
}
public void enterEditMode(List<AccountField> editableFields){
isInEditMode=true;

View File

@@ -17,23 +17,29 @@ import android.os.Bundle;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
import android.text.style.ImageSpan;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewOutlineProvider;
import android.view.ViewTreeObserver;
import android.view.WindowInsets;
import android.view.inputmethod.InputMethodManager;
import android.view.animation.TranslateAnimation;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.Toolbar;
import androidx.annotation.NonNull;
@@ -48,6 +54,7 @@ import org.joinmastodon.android.api.requests.accounts.GetAccountRelationships;
import org.joinmastodon.android.api.requests.accounts.GetAccountStatuses;
import org.joinmastodon.android.api.requests.accounts.GetOwnAccount;
import org.joinmastodon.android.api.requests.accounts.SetAccountFollowed;
import org.joinmastodon.android.api.requests.accounts.SetPrivateNote;
import org.joinmastodon.android.api.requests.accounts.UpdateAccountCredentials;
import org.joinmastodon.android.api.session.AccountSessionManager;
import org.joinmastodon.android.fragments.account_list.FollowerListFragment;
@@ -115,6 +122,9 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
private TabLayoutMediator tabLayoutMediator;
private TextView followsYouView;
public FrameLayout noteWrap;
public EditText noteEdit;
private String note;
private Account account;
private String accountID;
private Relationship relationship;
@@ -126,10 +136,11 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
private Uri editNewAvatar, editNewCover;
private String profileAccountID;
private boolean refreshing;
private View fab;
private ImageButton fab;
private WindowInsets childInsets;
private PhotoViewer currentPhotoViewer;
private boolean editModeLoading;
private boolean isScrollingUp = false;
public ProfileFragment(){
super(R.layout.loader_fragment_overlay_toolbar);
@@ -200,6 +211,10 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
fab=content.findViewById(R.id.fab);
followsYouView=content.findViewById(R.id.follows_you);
noteEdit = content.findViewById(R.id.note_edit);
noteWrap = content.findViewById(R.id.note_edit_wrap);
Button noteEditConfirm = content.findViewById(R.id.note_edit_confirm);
avatar.setOutlineProvider(new ViewOutlineProvider(){
@Override
public void getOutline(View view, Outline outline){
@@ -208,6 +223,31 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
});
avatar.setClipToOutline(true);
noteEdit.setOnFocusChangeListener((v, hasFocus) -> {
if (hasFocus) {
fab.setVisibility(View.GONE);
noteEditConfirm.setVisibility(View.VISIBLE);
noteEditConfirm.animate()
.alpha(1.0f)
.setDuration(700);
} else {
fab.setVisibility(View.VISIBLE);
noteEditConfirm.animate()
.alpha(0.0f)
.setDuration(700);
noteEditConfirm.setVisibility(View.INVISIBLE);
}
});
noteEditConfirm.setOnClickListener((v -> {
if (!noteEdit.getText().toString().trim().equals(note)) {
savePrivateNote();
}
InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(this.getView().getRootView().getWindowToken(), 0);
noteEdit.clearFocus();
}));
FrameLayout sizeWrapper=new FrameLayout(getActivity()){
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
@@ -234,6 +274,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
tabViews[i]=tabView;
}
UiUtils.reduceSwipeSensitivity(pager);
pager.setOffscreenPageLimit(5);
pager.setUserInputEnabled(!GlobalUserPreferences.disableSwipe);
pager.setAdapter(new ProfilePagerAdapter());
@@ -286,10 +327,6 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
followersBtn.setOnClickListener(this::onFollowersOrFollowingClick);
followingBtn.setOnClickListener(this::onFollowersOrFollowingClick);
if (account != null && account.bot) {
username.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_fluent_bot_24_filled, 0, 0, 0);
}
username.setOnLongClickListener(v->{
String usernameString=account.acct;
if(!usernameString.contains("@")){
@@ -302,6 +339,25 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
return sizeWrapper;
}
public void setNote(String note){
this.note=note;
noteWrap.setVisibility(View.VISIBLE);
noteEdit.setVisibility(View.VISIBLE);
noteEdit.setText(note);
}
private void savePrivateNote(){
new SetPrivateNote(profileAccountID, noteEdit.getText().toString()).setCallback(new Callback<>() {
@Override
public void onSuccess(Relationship result) {}
@Override
public void onError(ErrorResponse result) {
Toast.makeText(getActivity(), getString(R.string.sk_personal_note_update_failed), Toast.LENGTH_LONG).show();
}
}).exec(accountID);
}
@Override
protected void doLoadData(){
currentRequest=new GetAccountByID(profileAccountID)
@@ -330,7 +386,11 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
if(mediaFragment.loaded)
mediaFragment.onRefresh();
}
V.setVisibilityAnimated(fab, View.VISIBLE);
// if(noteEdit.hasFocus()){
// V.setVisibilityAnimated(fab, View.GONE);
// }else{
// V.setVisibilityAnimated(fab, View.VISIBLE);
// }
}
})
.exec(accountID);
@@ -449,6 +509,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
boolean isSelf=AccountSessionManager.getInstance().isSelf(accountID, account);
if(account.locked){
ssb=new SpannableStringBuilder("@");
ssb.append(account.acct);
@@ -462,6 +523,19 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
lock.setTint(username.getCurrentTextColor());
ssb.append(getString(R.string.manually_approves_followers), new ImageSpan(lock, ImageSpan.ALIGN_BASELINE), 0);
username.setText(ssb);
}else if(account.bot){
ssb=new SpannableStringBuilder("@");
ssb.append(account.acct);
if(isSelf){
ssb.append('@');
ssb.append(AccountSessionManager.getInstance().getAccount(accountID).domain);
}
ssb.append(" ");
Drawable botIcon=username.getResources().getDrawable(R.drawable.ic_bot, getActivity().getTheme()).mutate();
botIcon.setBounds(0, 0, botIcon.getIntrinsicWidth(), botIcon.getIntrinsicHeight());
botIcon.setTint(username.getCurrentTextColor());
ssb.append(getString(R.string.manually_approves_followers), new ImageSpan(botIcon, ImageSpan.ALIGN_BASELINE), 0);
username.setText(ssb);
}else{
// noinspection SetTextI18n
username.setText('@'+account.acct+(isSelf ? ('@'+AccountSessionManager.getInstance().getAccount(accountID).domain) : ""));
@@ -473,6 +547,8 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
bio.setVisibility(View.VISIBLE);
bio.setText(parsedBio);
}
followersCount.setText(UiUtils.abbreviateNumber(account.followersCount));
followingCount.setText(UiUtils.abbreviateNumber(account.followingCount));
postsCount.setText(UiUtils.abbreviateNumber(account.statusesCount));
@@ -553,7 +629,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
return;
inflater.inflate(isOwnProfile ? R.menu.profile_own : R.menu.profile, menu);
if(isOwnProfile){
UiUtils.enableOptionsMenuIcons(getActivity(), menu, R.id.bookmarks, R.id.followed_hashtags, R.id.favorites, R.id.scheduled, R.id.share);
UiUtils.enableOptionsMenuIcons(getActivity(), menu, R.id.manage_user_lists, R.id.bookmarks, R.id.followed_hashtags, R.id.favorites, R.id.scheduled, R.id.share);
}else{
UiUtils.enableOptionsMenuIcons(getActivity(), menu, R.id.bookmarks, R.id.followed_hashtags, R.id.favorites, R.id.scheduled);
}
@@ -568,17 +644,16 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
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()));
MenuItem manageUserLists=menu.findItem(R.id.manage_user_lists);
menu.findItem(R.id.manage_user_lists).setVisible(relationship.following);
menu.findItem(R.id.soft_block).setVisible(relationship.followedBy && !relationship.following);
if(relationship.following) {
MenuItem hideBoosts = menu.findItem(R.id.hide_boosts);
hideBoosts.setTitle(getString(relationship.showingReblogs ? R.string.hide_boosts_from_user : R.string.show_boosts_from_user, account.getShortUsername()));
hideBoosts.setIcon(relationship.showingReblogs ? R.drawable.ic_fluent_arrow_repeat_all_off_24_regular : R.drawable.ic_fluent_arrow_repeat_all_24_regular);
UiUtils.insetPopupMenuIcon(getContext(), hideBoosts);
manageUserLists.setTitle(getString(R.string.sk_lists_with_user, account.getShortUsername()));
manageUserLists.setVisible(true);
menu.findItem(R.id.manage_user_lists).setTitle(getString(R.string.sk_lists_with_user, account.getShortUsername()));
}else {
menu.findItem(R.id.hide_boosts).setVisible(false);
manageUserLists.setVisible(false);
}
if(!account.isLocal())
menu.findItem(R.id.block_domain).setTitle(getString(relationship.domainBlocking ? R.string.unblock_domain : R.string.block_domain, account.getDomain()));
@@ -598,6 +673,8 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
confirmToggleMuted();
}else if(id==R.id.block){
confirmToggleBlocked();
}else if(id==R.id.soft_block){
confirmSoftBlockUser();
}else if(id==R.id.report){
Bundle args=new Bundle();
args.putString("account", accountID);
@@ -636,8 +713,10 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
}else if(id==R.id.manage_user_lists){
final Bundle args=new Bundle();
args.putString("account", accountID);
args.putString("profileAccount", profileAccountID);
args.putString("profileDisplayUsername", account.getDisplayUsername());
if (!isOwnProfile) {
args.putString("profileAccount", profileAccountID);
args.putString("profileDisplayUsername", account.getDisplayUsername());
}
Nav.go(getActivity(), ListTimelinesFragment.class, args);
}else if(id==R.id.followed_hashtags){
Bundle args=new Bundle();
@@ -685,9 +764,17 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
notifyProgress.setIndeterminateTintList(notifyButton.getTextColors());
followsYouView.setVisibility(relationship.followedBy ? View.VISIBLE : View.GONE);
notifyButton.setSelected(relationship.notifying);
if (!isOwnProfile) {
setNote(relationship.note);
aboutFragment.setNote(relationship.note, accountID, profileAccountID);
}
if (getActivity() != null) notifyButton.setContentDescription(getString(relationship.notifying ? R.string.sk_user_post_notifications_on : R.string.sk_user_post_notifications_off, '@'+account.username));
}
public ImageButton getFab() {
return fab;
}
private void onScrollChanged(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY){
int topBarsH=getToolbar().getHeight()+statusBarHeight;
if(scrollY>avatarBorder.getTop()-topBarsH){
@@ -902,6 +989,10 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
UiUtils.confirmToggleBlockUser(getActivity(), accountID, account, relationship.blocking, this::updateRelationship);
}
private void confirmSoftBlockUser(){
UiUtils.confirmSoftBlockUser(getActivity(), accountID, account, this::updateRelationship);
}
private void updateRelationship(Relationship r){
relationship=r;
updateRelationship();
@@ -909,6 +1000,9 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
@Override
public boolean onBackPressed(){
if(noteEdit.hasFocus()) {
savePrivateNote();
}
if(isInEditMode){
exitEditMode();
return true;

View File

@@ -69,7 +69,7 @@ public class ScheduledStatusListFragment extends BaseStatusListFragment<Schedule
@Override
protected List<StatusDisplayItem> buildDisplayItems(ScheduledStatus s) {
return StatusDisplayItem.buildItems(this, s.toStatus(), accountID, s, knownAccounts, false, false, null);
return StatusDisplayItem.buildItems(this, s.toStatus(), accountID, s, knownAccounts, false, false, null, true);
}
@Override

View File

@@ -53,6 +53,7 @@ import org.joinmastodon.android.model.PushSubscription;
import org.joinmastodon.android.ui.M3AlertDialogBuilder;
import org.joinmastodon.android.ui.OutlineProviders;
import org.joinmastodon.android.ui.utils.UiUtils;
import org.joinmastodon.android.ui.views.TextInputFrameLayout;
import org.joinmastodon.android.updater.GithubSelfUpdater;
import org.parceler.Parcels;
@@ -84,7 +85,8 @@ public class SettingsFragment extends MastodonToolbarFragment{
private PushSubscription pushSubscription;
private ImageView themeTransitionWindowView;
private TextItem checkForUpdateItem;
private TextItem checkForUpdateItem, clearImageCacheItem;
private ImageCache imageCache;
@Override
public void onCreate(Bundle savedInstanceState){
@@ -92,6 +94,7 @@ public class SettingsFragment extends MastodonToolbarFragment{
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.N)
setRetainInstance(true);
setTitle(R.string.settings);
imageCache = ImageCache.getInstance(getActivity());
accountID=getArguments().getString("account");
AccountSession session=AccountSessionManager.getInstance().getAccount(accountID);
Instance instance = AccountSessionManager.getInstance().getInstanceInfo(session.domain);
@@ -112,6 +115,15 @@ public class SettingsFragment extends MastodonToolbarFragment{
GlobalUserPreferences.disableMarquee=i.checked;
GlobalUserPreferences.save();
}));
items.add(new SwitchItem(R.string.sk_settings_uniform_icon_for_notifications, R.drawable.ic_ntf_logo, GlobalUserPreferences.uniformNotificationIcon, i->{
GlobalUserPreferences.uniformNotificationIcon=i.checked;
GlobalUserPreferences.save();
}));
items.add(new SwitchItem(R.string.sk_settings_reduce_motion, R.drawable.ic_fluent_star_emphasis_24_regular, GlobalUserPreferences.reduceMotion, i->{
GlobalUserPreferences.reduceMotion=i.checked;
GlobalUserPreferences.save();
needAppRestart=true;
}));
items.add(new ButtonItem(R.string.sk_settings_color_palette, R.drawable.ic_fluent_color_24_regular, b->{
PopupMenu popupMenu=new PopupMenu(getActivity(), b, Gravity.CENTER_HORIZONTAL);
popupMenu.inflate(R.menu.color_palettes);
@@ -139,40 +151,33 @@ public class SettingsFragment extends MastodonToolbarFragment{
Toast.LENGTH_LONG).show();
});
} else {
b.setOnClickListener(l -> {
FrameLayout inputWrap = new FrameLayout(getContext());
EditText input = new EditText(getContext());
input.setHint(R.string.publish);
input.setText(GlobalUserPreferences.publishButtonText.trim());
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
params.setMargins(V.dp(16), V.dp(4), V.dp(16), V.dp(16));
input.setLayoutParams(params);
inputWrap.addView(input);
new M3AlertDialogBuilder(getContext()).setTitle(R.string.sk_settings_publish_button_text_title).setView(inputWrap)
.setPositiveButton(R.string.save, (d, which) -> {
GlobalUserPreferences.publishButtonText = input.getText().toString().trim();
GlobalUserPreferences.save();
updatePublishText(b);
})
.setNeutralButton(R.string.clear, (d, which) -> {
GlobalUserPreferences.publishButtonText = "";
GlobalUserPreferences.save();
updatePublishText(b);
})
.setNegativeButton(R.string.cancel, (d, which) -> {
})
.show();
});}
}));
items.add(new SwitchItem(R.string.sk_settings_uniform_icon_for_notifications, R.drawable.ic_ntf_logo, GlobalUserPreferences.uniformNotificationIcon, i->{
GlobalUserPreferences.uniformNotificationIcon=i.checked;
GlobalUserPreferences.save();
}));
items.add(new SwitchItem(R.string.sk_settings_reduce_motion, R.drawable.ic_fluent_star_emphasis_24_regular, GlobalUserPreferences.reduceMotion, i->{
GlobalUserPreferences.reduceMotion=i.checked;
GlobalUserPreferences.save();
b.setOnClickListener(l -> {
FrameLayout inputWrap = new FrameLayout(getContext());
EditText input = new EditText(getContext());
input.setHint(R.string.publish);
input.setText(GlobalUserPreferences.publishButtonText.trim());
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
params.setMargins(V.dp(16), V.dp(4), V.dp(16), V.dp(16));
input.setLayoutParams(params);
inputWrap.addView(input);
new M3AlertDialogBuilder(getContext()).setTitle(R.string.sk_settings_publish_button_text_title).setView(inputWrap)
.setPositiveButton(R.string.save, (d, which) -> {
GlobalUserPreferences.publishButtonText = input.getText().toString().trim();
GlobalUserPreferences.save();
updatePublishText(b);
})
.setNeutralButton(R.string.clear, (d, which) -> {
GlobalUserPreferences.publishButtonText = "";
GlobalUserPreferences.save();
updatePublishText(b);
})
.setNegativeButton(R.string.cancel, (d, which) -> {
})
.show();
});}
}));
items.add(new HeaderItem(R.string.settings_behavior));
items.add(new SwitchItem(R.string.sk_settings_show_federated_timeline, R.drawable.ic_fluent_earth_24_regular, GlobalUserPreferences.showFederatedTimeline, i->{
GlobalUserPreferences.showFederatedTimeline=i.checked;
@@ -243,7 +248,7 @@ public class SettingsFragment extends MastodonToolbarFragment{
items.add(new SwitchItem(R.string.notify_reblog, R.drawable.ic_fluent_arrow_repeat_all_24_regular, pushSubscription.alerts.reblog, i->onNotificationsChanged(PushNotification.Type.REBLOG, i.checked)));
items.add(new SwitchItem(R.string.notify_mention, R.drawable.ic_fluent_mention_24_regular, pushSubscription.alerts.mention, i->onNotificationsChanged(PushNotification.Type.MENTION, i.checked)));
items.add(new SwitchItem(R.string.sk_notify_posts, R.drawable.ic_fluent_alert_24_regular, pushSubscription.alerts.status, i->onNotificationsChanged(PushNotification.Type.STATUS, i.checked)));
items.add(new SwitchItem(R.string.sk_keep_only_latest_notification, R.drawable.ic_fluent_custom_alert_latest_24_regular, GlobalUserPreferences.keepOnlyLatestNotification, i->{
items.add(new SwitchItem(R.string.sk_settings_single_notification, R.drawable.ic_fluent_convert_range_24_regular, GlobalUserPreferences.keepOnlyLatestNotification, i->{
GlobalUserPreferences.keepOnlyLatestNotification=i.checked;
GlobalUserPreferences.save();
}));
@@ -260,6 +265,7 @@ public class SettingsFragment extends MastodonToolbarFragment{
args.putParcelable("instance", Parcels.wrap(instance));
Nav.go(getActivity(), InstanceRulesFragment.class, args);
}, R.drawable.ic_fluent_task_list_ltr_24_regular));
items.add(new TextItem(R.string.sk_settings_about_instance , ()->UiUtils.launchWebBrowser(getActivity(), "https://"+session.domain+"/about"), R.drawable.ic_fluent_info_24_regular));
items.add(new TextItem(R.string.settings_tos, ()->UiUtils.launchWebBrowser(getActivity(), "https://"+session.domain+"/terms"), R.drawable.ic_fluent_open_24_regular));
items.add(new TextItem(R.string.settings_privacy_policy, ()->UiUtils.launchWebBrowser(getActivity(), "https://"+session.domain+"/terms"), R.drawable.ic_fluent_open_24_regular));
items.add(new TextItem(R.string.log_out, this::confirmLogOut, R.drawable.ic_fluent_sign_out_24_regular));
@@ -278,7 +284,9 @@ public class SettingsFragment extends MastodonToolbarFragment{
}
items.add(new TextItem(R.string.sk_settings_contribute, ()->UiUtils.launchWebBrowser(getActivity(), "https://github.com/LucasGGamerM/moshidon"), R.drawable.ic_fluent_open_24_regular));
items.add(new TextItem(R.string.sk_settings_donate, ()->UiUtils.launchWebBrowser(getActivity(), "https://github.com/sponsors/LucasGGamerM"), R.drawable.ic_fluent_heart_24_regular));
items.add(new TextItem(R.string.settings_clear_cache, this::clearImageCache));
// items.add(new TextItem(R.string.settings_clear_cache, this::clearImageCache));
clearImageCacheItem = new TextItem(R.string.settings_clear_cache, UiUtils.formatFileSize(getContext(), imageCache.getDiskCache().size(), true), this::clearImageCache, 0);
items.add(clearImageCacheItem);
items.add(new TextItem(R.string.sk_clear_recent_languages, ()->UiUtils.showConfirmationAlert(getActivity(), R.string.sk_clear_recent_languages, R.string.sk_confirm_clear_recent_languages, R.string.clear, ()->{
GlobalUserPreferences.recentLanguages.remove(accountID);
GlobalUserPreferences.save();
@@ -527,9 +535,13 @@ public class SettingsFragment extends MastodonToolbarFragment{
private void clearImageCache(){
MastodonAPIController.runInBackground(()->{
Activity activity=getActivity();
ImageCache.getInstance(getActivity()).clear();
imageCache.clear();
Toast.makeText(activity, R.string.media_cache_cleared, Toast.LENGTH_SHORT).show();
});
if (list.findViewHolderForAdapterPosition(items.indexOf(clearImageCacheItem)) instanceof TextViewHolder tvh) {
clearImageCacheItem.secondaryText = UiUtils.formatFileSize(getContext(), 0, true);
tvh.rebind();
}
}
@Subscribe
@@ -660,27 +672,29 @@ public class SettingsFragment extends MastodonToolbarFragment{
private class TextItem extends Item{
private String text;
private String secondaryText;
private Runnable onClick;
private boolean loading;
private int icon;
public TextItem(@StringRes int text, Runnable onClick) {
this(text, onClick, false, 0);
}
public TextItem(@StringRes int text, Runnable onClick, boolean loading) {
this(text, onClick, loading, 0);
this(text, null, onClick, false, 0);
}
public TextItem(@StringRes int text, Runnable onClick, @DrawableRes int icon) {
this(text, onClick, false, icon);
this(text, null, onClick, false, icon);
}
public TextItem(@StringRes int text, Runnable onClick, boolean loading, @DrawableRes int icon){
public TextItem(@StringRes int text, String secondaryText, Runnable onClick, @DrawableRes int icon) {
this(text, secondaryText, onClick, false, icon);
}
public TextItem(@StringRes int text, String secondaryText, Runnable onClick, boolean loading, @DrawableRes int icon){
this.text=getString(text);
this.onClick=onClick;
this.loading=loading;
this.icon=icon;
this.secondaryText = secondaryText;
}
@Override
@@ -932,22 +946,27 @@ public class SettingsFragment extends MastodonToolbarFragment{
}
private class TextViewHolder extends BindableViewHolder<TextItem> implements UsableRecyclerView.Clickable{
private final TextView text;
private final TextView text, secondaryText;
private final ProgressBar progress;
private final ImageView icon;
public TextViewHolder(){
super(getActivity(), R.layout.item_settings_text, list);
text = itemView.findViewById(R.id.text);
secondaryText = itemView.findViewById(R.id.secondary_text);
progress = itemView.findViewById(R.id.progress);
icon = itemView.findViewById(R.id.icon);
}
@Override
public void onBind(TextItem item){
icon.setVisibility(item.icon != 0 ? View.VISIBLE : View.GONE);
secondaryText.setVisibility(item.secondaryText != null ? View.VISIBLE : View.GONE);
text.setText(item.text);
progress.animate().alpha(item.loading ? 1 : 0);
if (item.icon != 0) icon.setImageDrawable(getActivity().getTheme().getDrawable(item.icon));
icon.setImageResource(item.icon);
secondaryText.setText(item.secondaryText);
}
@Override

View File

@@ -1,5 +1,6 @@
package org.joinmastodon.android.fragments;
import android.content.res.Configuration;
import android.os.Bundle;
import com.squareup.otto.Subscribe;
@@ -171,6 +172,12 @@ public abstract class StatusListFragment extends BaseStatusListFragment<Status>{
adapter.notifyItemRangeRemoved(index, lastIndex-index);
}
@Override
public void onConfigurationChanged(Configuration newConfig){
super.onConfigurationChanged(newConfig);
if (getParentFragment() instanceof HomeTabFragment home) home.updateToolbarLogo();
}
public class EventListener{
@Subscribe

View File

@@ -225,6 +225,7 @@ public abstract class BaseAccountListFragment extends BaseRecyclerFragment<BaseA
contextMenu=new PopupMenu(getActivity(), menuAnchor);
contextMenu.inflate(R.menu.profile);
contextMenu.setOnMenuItemClickListener(this::onContextMenuItemSelected);
UiUtils.enablePopupMenuIcons(getActivity(), contextMenu);
}
@Override
@@ -283,29 +284,32 @@ public abstract class BaseAccountListFragment extends BaseRecyclerFragment<BaseA
Menu menu=contextMenu.getMenu();
Account account=item.account;
menu.findItem(R.id.share).setTitle(getString(R.string.share_user, account.getDisplayUsername()));
menu.findItem(R.id.mute).setTitle(getString(relationship.muting ? R.string.unmute_user : R.string.mute_user, account.getDisplayUsername()));
menu.findItem(R.id.block).setTitle(getString(relationship.blocking ? R.string.unblock_user : R.string.block_user, account.getDisplayUsername()));
menu.findItem(R.id.report).setTitle(getString(R.string.report_user, account.getDisplayUsername()));
menu.findItem(R.id.manage_user_lists).setTitle(getString(R.string.sk_lists_with_user, account.getDisplayUsername())).setVisible(relationship.following);
menu.findItem(R.id.share).setTitle(getString(R.string.share_user, account.getShortUsername()));
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);
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()));
menu.findItem(R.id.manage_user_lists).setTitle(getString(R.string.sk_lists_with_user, account.getShortUsername())).setVisible(relationship.following);
menu.findItem(R.id.soft_block).setVisible(relationship.followedBy && !relationship.following);
MenuItem hideBoosts=menu.findItem(R.id.hide_boosts);
MenuItem manageUserLists=menu.findItem(R.id.manage_user_lists);
if(relationship.following){
hideBoosts.setTitle(getString(relationship.showingReblogs ? R.string.hide_boosts_from_user : R.string.show_boosts_from_user, account.getDisplayUsername()));
hideBoosts.setTitle(getString(relationship.showingReblogs ? R.string.hide_boosts_from_user : R.string.show_boosts_from_user, account.getShortUsername()));
hideBoosts.setIcon(relationship.showingReblogs ? R.drawable.ic_fluent_arrow_repeat_all_off_24_regular : R.drawable.ic_fluent_arrow_repeat_all_24_regular);
hideBoosts.setVisible(true);
manageUserLists.setTitle(getString(R.string.sk_lists_with_user, account.getDisplayUsername()));
UiUtils.insetPopupMenuIcon(getContext(), hideBoosts);
manageUserLists.setTitle(getString(R.string.sk_lists_with_user, account.getShortUsername()));
manageUserLists.setVisible(true);
}else{
hideBoosts.setVisible(false);
manageUserLists.setVisible(true);
}
MenuItem blockDomain=menu.findItem(R.id.block_domain);
if(!account.isLocal()){
blockDomain.setTitle(getString(relationship.domainBlocking ? R.string.unblock_domain : R.string.block_domain, account.getDomain()));
blockDomain.setVisible(true);
}else{
blockDomain.setVisible(false);
}
menu.findItem(R.id.block_domain).setVisible(false);
menuAnchor.setTranslationX(x);
menuAnchor.setTranslationY(y);
@@ -346,6 +350,8 @@ public abstract class BaseAccountListFragment extends BaseRecyclerFragment<BaseA
UiUtils.confirmToggleMuteUser(getActivity(), accountID, account, relationship.muting, this::updateRelationship);
}else if(id==R.id.block){
UiUtils.confirmToggleBlockUser(getActivity(), accountID, account, relationship.blocking, this::updateRelationship);
}else if(id==R.id.soft_block){
UiUtils.confirmSoftBlockUser(getActivity(), accountID, account, this::updateRelationship);
}else if(id==R.id.report){
Bundle args=new Bundle();
args.putString("account", accountID);

View File

@@ -81,20 +81,30 @@ public class DiscoverFragment extends AppKitFragment implements ScrollableToTop,
tabLayout=view.findViewById(R.id.tabbar);
pager=view.findViewById(R.id.pager);
tabViews=new FrameLayout[noFederated ? 6 : 7];
// tabViews=new FrameLayout[noFederated ? 5 : 6];
tabViews=new FrameLayout[4];
for(int i=0;i<tabViews.length;i++){
FrameLayout tabView=new FrameLayout(getActivity());
int switchIndex = noFederated && i > 0 ? i + 1 : i;
tabView.setId(switch(switchIndex){
case 0 -> R.id.discover_local_timeline;
case 1 -> R.id.discover_federated_timeline;
case 2 -> R.id.discover_lists;
case 3 -> R.id.discover_hashtags;
case 4 -> R.id.discover_posts;
case 5 -> R.id.discover_news;
case 6 -> R.id.discover_users;
default -> throw new IllegalStateException("Unexpected value: "+switchIndex);
/// int switchIndex = noFederated && i > 0 ? i + 1 : i;
// tabView.setId(switch(switchIndex){
// case 0 -> R.id.discover_local_timeline;
// case 1 -> R.id.discover_federated_timeline;
// case 2 -> R.id.discover_hashtags;
// case 3 -> R.id.discover_posts;
// case 4 -> R.id.discover_news;
// case 5 -> R.id.discover_users;
// default -> throw new IllegalStateException("Unexpected value: "+switchIndex);
// });
tabView.setId(switch(i){
case 0 -> R.id.discover_hashtags;
case 1 -> R.id.discover_posts;
case 2 -> R.id.discover_news;
case 3 -> R.id.discover_users;
default -> throw new IllegalStateException("Unexpected value: "+i);
});
tabView.setVisibility(View.GONE);
view.addView(tabView); // needed so the fragment manager will have somewhere to restore the tab fragment
tabViews[i]=tabView;
@@ -103,6 +113,7 @@ public class DiscoverFragment extends AppKitFragment implements ScrollableToTop,
tabLayout.setTabTextSize(V.dp(16));
tabLayout.setTabTextColors(UiUtils.getThemeColor(getActivity(), R.attr.colorTabInactive), UiUtils.getThemeColor(getActivity(), android.R.attr.textColorPrimary));
UiUtils.reduceSwipeSensitivity(pager);
pager.setOffscreenPageLimit(4);
pager.setUserInputEnabled(!GlobalUserPreferences.disableSwipe);
pager.setAdapter(new DiscoverPagerAdapter());
@@ -119,7 +130,7 @@ public class DiscoverFragment extends AppKitFragment implements ScrollableToTop,
}
});
if(localTimelineFragment==null){
if(localTimelineFragment==null || hashtagsFragment==null){
Bundle args=new Bundle();
args.putString("account", accountID);
args.putBoolean("__is_tab", true);
@@ -139,39 +150,56 @@ public class DiscoverFragment extends AppKitFragment implements ScrollableToTop,
localTimelineFragment=new LocalTimelineFragment();
localTimelineFragment.setArguments(args);
listTimelinesFragment=new ListTimelinesFragment();
listTimelinesFragment.setArguments(args);
// listTimelinesFragment=new ListTimelinesFragment();
// listTimelinesFragment.setArguments(args);
//
// FragmentTransaction transaction = getChildFragmentManager().beginTransaction()
// .add(R.id.discover_posts, postsFragment)
// .add(R.id.discover_local_timeline, localTimelineFragment)
// .add(R.id.discover_hashtags, hashtagsFragment)
// .add(R.id.discover_news, newsFragment)
// .add(R.id.discover_users, accountsFragment)
// .add(R.id.discover_lists, listTimelinesFragment);
//
// if (!noFederated) {
// federatedTimelineFragment=new FederatedTimelineFragment();
// federatedTimelineFragment.setArguments(args);
// transaction.add(R.id.discover_federated_timeline, federatedTimelineFragment);
// }
//
// transaction.commit();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction()
getChildFragmentManager().beginTransaction()
.add(R.id.discover_posts, postsFragment)
.add(R.id.discover_local_timeline, localTimelineFragment)
.add(R.id.discover_hashtags, hashtagsFragment)
.add(R.id.discover_news, newsFragment)
.add(R.id.discover_users, accountsFragment)
.add(R.id.discover_lists, listTimelinesFragment);
if (!noFederated) {
federatedTimelineFragment=new FederatedTimelineFragment();
federatedTimelineFragment.setArguments(args);
transaction.add(R.id.discover_federated_timeline, federatedTimelineFragment);
}
transaction.commit();
.commit();
}
tabLayoutMediator=new TabLayoutMediator(tabLayout, pager, new TabLayoutMediator.TabConfigurationStrategy(){
@Override
public void onConfigureTab(@NonNull TabLayout.Tab tab, int position){
if (noFederated && position > 0) position++;
tab.setText(switch(position){
case 0 -> R.string.local_timeline;
case 1 -> R.string.sk_federated_timeline;
case 2 -> R.string.sk_list_timelines;
case 3 -> R.string.hashtags;
case 4 -> R.string.posts;
case 5 -> R.string.news;
case 6 -> R.string.for_you;
// if (noFederated && position > 0) position++;
// tab.setText(switch(position){
// case 0 -> R.string.local_timeline;
// case 1 -> R.string.sk_federated_timeline;
// case 2 -> R.string.sk_list_timelines;
// case 3 -> R.string.hashtags;
// case 4 -> R.string.posts;
// case 5 -> R.string.news;
// case 6 -> R.string.for_you;
//
// default -> throw new IllegalStateException("Unexpected value: "+position);
// });
tab.setText(switch(position){
case 0 -> R.string.hashtags;
case 1 -> R.string.posts;
case 2 -> R.string.news;
case 3 -> R.string.for_you;
default -> throw new IllegalStateException("Unexpected value: "+position);
});
tab.view.textView.setAllCaps(true);
@@ -257,8 +285,11 @@ public class DiscoverFragment extends AppKitFragment implements ScrollableToTop,
}
public void loadData(){
if(localTimelineFragment!=null && !localTimelineFragment.loaded && !localTimelineFragment.dataLoading)
localTimelineFragment.loadData();
if(hashtagsFragment!=null && !hashtagsFragment.loaded && !hashtagsFragment.dataLoading)
hashtagsFragment.loadData();
// if(localTimelineFragment!=null && !localTimelineFragment.loaded && !localTimelineFragment.dataLoading)
// localTimelineFragment.loadData();
}
private void onSearchEditFocusChanged(View v, boolean hasFocus){
@@ -294,14 +325,23 @@ public class DiscoverFragment extends AppKitFragment implements ScrollableToTop,
private Fragment getFragmentForPage(int page){
if (noFederated && page > 0) page++;
// return switch(page){
// case 0 -> localTimelineFragment;
// case 1 -> federatedTimelineFragment;
// case 2 -> hashtagsFragment;
// case 3 -> postsFragment;
// case 4 -> newsFragment;
// case 5 -> accountsFragment;
// case 6 -> listTimelinesFragment;
// default -> throw new IllegalStateException("Unexpected value: "+page);
// };
return switch(page){
case 0 -> localTimelineFragment;
case 1 -> federatedTimelineFragment;
case 2 -> hashtagsFragment;
case 3 -> postsFragment;
case 4 -> newsFragment;
case 5 -> accountsFragment;
case 6 -> listTimelinesFragment;
case 0 -> hashtagsFragment;
case 1 -> postsFragment;
case 2 -> newsFragment;
case 3 -> accountsFragment;
default -> throw new IllegalStateException("Unexpected value: "+page);
};
}

View File

@@ -17,11 +17,11 @@ public class DiscoverPostsFragment extends StatusListFragment{
@Override
protected void doLoadData(int offset, int count){
currentRequest=new GetTrendingStatuses(count)
currentRequest=new GetTrendingStatuses(offset, count)
.setCallback(new SimpleCallback<>(this){
@Override
public void onSuccess(List<Status> result){
onDataLoaded(result, false);
onDataLoaded(result, !result.isEmpty());
}
}).exec(accountID);
}

View File

@@ -3,7 +3,9 @@ package org.joinmastodon.android.fragments.discover;
import android.os.Bundle;
import android.view.View;
import org.joinmastodon.android.R;
import org.joinmastodon.android.api.requests.timelines.GetPublicTimeline;
import org.joinmastodon.android.fragments.FabStatusListFragment;
import org.joinmastodon.android.fragments.StatusListFragment;
import org.joinmastodon.android.model.Filter;
import org.joinmastodon.android.model.Status;
@@ -15,7 +17,7 @@ import java.util.stream.Collectors;
import me.grishka.appkit.api.SimpleCallback;
public class FederatedTimelineFragment extends StatusListFragment{
public class FederatedTimelineFragment extends FabStatusListFragment {
private DiscoverInfoBannerHelper bannerHelper=new DiscoverInfoBannerHelper(DiscoverInfoBannerHelper.BannerType.FEDERATED_TIMELINE);
private String maxID;

View File

@@ -3,7 +3,9 @@ package org.joinmastodon.android.fragments.discover;
import android.os.Bundle;
import android.view.View;
import org.joinmastodon.android.R;
import org.joinmastodon.android.api.requests.timelines.GetPublicTimeline;
import org.joinmastodon.android.fragments.FabStatusListFragment;
import org.joinmastodon.android.fragments.StatusListFragment;
import org.joinmastodon.android.model.Filter;
import org.joinmastodon.android.model.Status;
@@ -15,7 +17,7 @@ import java.util.stream.Collectors;
import me.grishka.appkit.api.SimpleCallback;
public class LocalTimelineFragment extends StatusListFragment{
public class LocalTimelineFragment extends FabStatusListFragment {
private DiscoverInfoBannerHelper bannerHelper=new DiscoverInfoBannerHelper(DiscoverInfoBannerHelper.BannerType.LOCAL_TIMELINE);
private String maxID;

View File

@@ -14,9 +14,11 @@ import org.parceler.Parcel;
import org.parceler.ParcelConstructor;
import org.parceler.ParcelProperty;
import java.util.UUID;
@Parcel
public class Attachment extends BaseModel{
@RequiredField
// @RequiredField
public String id;
@RequiredField
public Type type;
@@ -85,6 +87,12 @@ public class Attachment extends BaseModel{
if(placeholder!=null)
blurhashPlaceholder=new BlurHashDrawable(placeholder, getWidth(), getHeight());
}
if (id == null) {
// akkoma servers doesn't provide IDs for attachments,
// but IDs are needed by the AudioPlayerService
id = "" + this.hashCode();
}
}
@Override

View File

@@ -27,7 +27,7 @@ public class Instance extends BaseModel{
/**
* Admin-defined description of the Mastodon site.
*/
@RequiredField
// @RequiredField
public String description;
/**
* A shorter description defined by the admin.
@@ -37,7 +37,7 @@ public class Instance extends BaseModel{
/**
* An email that may be contacted for any inquiries.
*/
@RequiredField
// @RequiredField
public String email;
/**
* The version of Mastodon installed on the instance.

View File

@@ -66,10 +66,12 @@ public class ScheduledStatus extends BaseModel implements DisplayItemsParent{
s.id = id;
s.mediaAttachments = mediaAttachments;
s.createdAt = scheduledAt;
s.inReplyToId = params.inReplyToId > 0 ? "" + params.inReplyToId : null;
s.content = s.text = params.text;
s.spoilerText = params.spoilerText;
s.visibility = params.visibility;
s.language = params.language;
s.sensitive = params.sensitive;
s.mentions = List.of();
s.tags = List.of();
s.emojis = List.of();

View File

@@ -9,7 +9,9 @@ import android.os.Build;
import android.os.Bundle;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
import android.text.style.ImageSpan;
import android.util.Log;
import android.util.TypedValue;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
@@ -135,7 +137,7 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
public static class Holder extends StatusDisplayItem.Holder<HeaderStatusDisplayItem> implements ImageLoaderViewHolder{
private final TextView name, username, timestamp, extraText, separator;
private final ImageView avatar, more, visibility, deleteNotification, unreadIndicator;
private final ImageView avatar, more, visibility, deleteNotification, unreadIndicator, botIcon;
private final PopupMenu optionsMenu;
private Relationship relationship;
private APIRequest<?> currentRelationshipRequest;
@@ -158,6 +160,7 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
visibility=findViewById(R.id.visibility);
deleteNotification=findViewById(R.id.delete_notification);
unreadIndicator=findViewById(R.id.unread_indicator);
botIcon=findViewById(R.id.bot_icon);
extraText=findViewById(R.id.extra_text);
avatar.setOnClickListener(this::onAvaClick);
avatar.setOutlineProvider(roundCornersOutline);
@@ -282,10 +285,23 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
public void onBind(HeaderStatusDisplayItem item){
name.setText(item.parsedName);
username.setText('@'+item.user.acct);
botIcon.setVisibility(item.user.bot ? View.VISIBLE : View.GONE);
botIcon.setColorFilter(username.getCurrentTextColor());
separator.setVisibility(View.VISIBLE);
// if(item.user.bot){
// SpannableStringBuilder ssb = new SpannableStringBuilder();
// ssb.append('@'+item.user.acct);
// ssb.append(" ");
// Drawable botIcon=username.getResources().getDrawable(R.drawable.ic_bot, itemView.getContext().getTheme()).mutate();
// botIcon.setBounds(0, 0, botIcon.getIntrinsicWidth(), botIcon.getIntrinsicHeight());
// botIcon.setTint(username.getCurrentTextColor());
// ssb.append(itemView.getContext().getString(R.string.manually_approves_followers), new ImageSpan(botIcon, ImageSpan.ALIGN_BASELINE), 0);
// username.setPaddingRelative(0,0,16,0);
// username.setText(ssb);
// }
username.setCompoundDrawablesWithIntrinsicBounds(item.user.bot ? R.drawable.ic_fluent_bot_24_filled : 0, 0, 0, 0);
// username.setCompoundDrawablesWithIntrinsicBounds(item.user.bot ? R.drawable.ic_fluent_bot_24_filled : 0, 0, 0, 0);
if (item.scheduledStatus!=null)
if (item.scheduledStatus.scheduledAt.isAfter(CreateStatus.DRAFTS_AFTER_INSTANT)) {
@@ -338,7 +354,9 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
desc = item.parentFragment.getString(R.string.sk_mark_as_read);
more.animate().alpha(alpha);
unreadIndicator.animate().alpha(alpha);
more.setEnabled(!item.announcement.read);
more.setOnClickListener(v -> {
if (item.announcement.read) return;
new DismissAnnouncement(item.announcement.id).setCallback(new Callback<>() {
@Override
public void onSuccess(Object o) {

View File

@@ -73,7 +73,12 @@ public class LinkCardStatusDisplayItem extends StatusDisplayItem{
photo.setImageDrawable(null);
if(item.imgRequest!=null){
crossfadeDrawable.setSize(card.width, card.height);
if (card.width > 0) {
// akkoma servers don't provide width and height
crossfadeDrawable.setSize(card.width, card.height);
} else {
crossfadeDrawable.setSize(itemView.getWidth(), itemView.getHeight());
}
crossfadeDrawable.setBlurhashDrawable(card.blurhashPlaceholder);
crossfadeDrawable.setCrossfadeAlpha(item.status.spoilerRevealed ? 0f : 1f);
photo.setImageDrawable(crossfadeDrawable);

View File

@@ -77,6 +77,10 @@ public abstract class StatusDisplayItem{
}
public static ArrayList<StatusDisplayItem> buildItems(BaseStatusListFragment fragment, Status status, String accountID, DisplayItemsParent parentObject, Map<String, Account> knownAccounts, boolean inset, boolean addFooter, Notification notification){
return buildItems(fragment, status, accountID, parentObject, knownAccounts, inset, addFooter, notification, false);
}
public static ArrayList<StatusDisplayItem> buildItems(BaseStatusListFragment fragment, Status status, String accountID, DisplayItemsParent parentObject, Map<String, Account> knownAccounts, boolean inset, boolean addFooter, Notification notification, boolean disableTranslate){
String parentID=parentObject.getID();
ArrayList<StatusDisplayItem> items=new ArrayList<>();
Status statusForContent=status.getContentStatus();
@@ -100,7 +104,7 @@ public abstract class StatusDisplayItem{
HeaderStatusDisplayItem header;
items.add(header=new HeaderStatusDisplayItem(parentID, statusForContent.account, statusForContent.createdAt, fragment, accountID, statusForContent, null, notification, scheduledStatus));
if(!TextUtils.isEmpty(statusForContent.content))
items.add(new TextStatusDisplayItem(parentID, HtmlParser.parse(statusForContent.content, statusForContent.emojis, statusForContent.mentions, statusForContent.tags, accountID), fragment, statusForContent));
items.add(new TextStatusDisplayItem(parentID, HtmlParser.parse(statusForContent.content, statusForContent.emojis, statusForContent.mentions, statusForContent.tags, accountID), fragment, statusForContent, disableTranslate));
else
header.needBottomPadding=true;
List<Attachment> imageAttachments=statusForContent.mediaAttachments.stream().filter(att->att.type.isImage()).collect(Collectors.toList());

View File

@@ -40,14 +40,16 @@ public class TextStatusDisplayItem extends StatusDisplayItem{
private CharSequence parsedSpoilerText;
public boolean textSelectable;
public final Status status;
public boolean disableTranslate;
public boolean translated = false;
public TranslatedStatus translation = null;
private AccountSession session;
public TextStatusDisplayItem(String parentID, CharSequence text, BaseStatusListFragment parentFragment, Status status){
public TextStatusDisplayItem(String parentID, CharSequence text, BaseStatusListFragment parentFragment, Status status, boolean disableTranslate){
super(parentID, parentFragment);
this.text=text;
this.status=status;
this.disableTranslate=disableTranslate;
emojiHelper.setText(text);
if(!TextUtils.isEmpty(status.spoilerText)){
parsedSpoilerText=HtmlParser.parseCustomEmoji(status.spoilerText, status.emojis);
@@ -143,7 +145,8 @@ public class TextStatusDisplayItem extends StatusDisplayItem{
}
Instance instanceInfo = AccountSessionManager.getInstance().getInstanceInfo(item.session.domain);
boolean translateEnabled = instanceInfo.v2 != null && instanceInfo.v2.configuration.translation != null && instanceInfo.v2.configuration.translation.enabled;
boolean translateEnabled = !item.disableTranslate && instanceInfo.v2 != null &&
instanceInfo.v2.configuration.translation != null && instanceInfo.v2.configuration.translation.enabled;
translateWrap.setVisibility(translateEnabled &&
!item.status.visibility.isLessVisibleThan(StatusPrivacy.UNLISTED) &&

View File

@@ -31,6 +31,7 @@ import android.provider.OpenableColumns;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextUtils;
import android.util.Log;
import android.view.HapticFeedbackConstants;
import android.view.Menu;
import android.view.MenuItem;
@@ -52,6 +53,7 @@ import org.joinmastodon.android.api.requests.accounts.SetAccountMuted;
import org.joinmastodon.android.api.requests.accounts.SetDomainBlocked;
import org.joinmastodon.android.api.requests.accounts.AuthorizeFollowRequest;
import org.joinmastodon.android.api.requests.accounts.RejectFollowRequest;
import org.joinmastodon.android.api.requests.lists.DeleteList;
import org.joinmastodon.android.api.requests.notifications.DismissNotification;
import org.joinmastodon.android.api.requests.search.GetSearchResults;
import org.joinmastodon.android.api.requests.statuses.CreateStatus;
@@ -86,6 +88,7 @@ import org.joinmastodon.android.ui.text.CustomEmojiSpan;
import org.parceler.Parcels;
import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.URI;
import java.net.URISyntaxException;
@@ -110,6 +113,8 @@ import androidx.annotation.StringRes;
import androidx.browser.customtabs.CustomTabsIntent;
import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.RecyclerView;
import androidx.viewpager2.widget.ViewPager2;
import me.grishka.appkit.Nav;
import me.grishka.appkit.api.Callback;
import me.grishka.appkit.api.ErrorResponse;
@@ -339,14 +344,6 @@ public class UiUtils{
Nav.go((Activity)context, HashtagTimelineFragment.class, args);
}
public static void openListTimeline(Context context, String accountID, ListTimeline list){
Bundle args=new Bundle();
args.putString("account", accountID);
args.putString("listID", list.id);
args.putString("listTitle", list.title);
Nav.go((Activity)context, ListTimelineFragment.class, args);
}
public static void showConfirmationAlert(Context context, @StringRes int title, @StringRes int message, @StringRes int confirmButton, Runnable onConfirmed){
showConfirmationAlert(context, title, message, confirmButton, 0, onConfirmed);
}
@@ -369,7 +366,7 @@ public class UiUtils{
showConfirmationAlert(activity, activity.getString(currentlyBlocked ? R.string.confirm_unblock_title : R.string.confirm_block_title),
activity.getString(currentlyBlocked ? R.string.confirm_unblock : R.string.confirm_block, account.displayName),
activity.getString(currentlyBlocked ? R.string.do_unblock : R.string.do_block),
currentlyBlocked ? R.drawable.ic_fluent_person_28_regular : R.drawable.ic_fluent_person_prohibited_28_regular,
R.drawable.ic_fluent_person_prohibited_28_regular,
()->{
new SetAccountBlocked(account.id, !currentlyBlocked)
.setCallback(new Callback<>(){
@@ -391,6 +388,38 @@ public class UiUtils{
});
}
public static void confirmSoftBlockUser(Activity activity, String accountID, Account account, Consumer<Relationship> resultCallback){
showConfirmationAlert(activity,
activity.getString(R.string.sk_remove_follower),
activity.getString(R.string.sk_remove_follower_confirm, account.displayName),
activity.getString(R.string.sk_do_remove_follower),
R.drawable.ic_fluent_person_delete_24_regular,
() -> new SetAccountBlocked(account.id, true).setCallback(new Callback<>() {
@Override
public void onSuccess(Relationship relationship) {
new SetAccountBlocked(account.id, false).setCallback(new Callback<>() {
@Override
public void onSuccess(Relationship relationship) {
Toast.makeText(activity, R.string.sk_remove_follower_success, Toast.LENGTH_SHORT).show();
resultCallback.accept(relationship);
}
@Override
public void onError(ErrorResponse error) {
error.showToast(activity);
resultCallback.accept(relationship);
}
}).exec(accountID);
}
@Override
public void onError(ErrorResponse error) {
error.showToast(activity);
}
}).exec(accountID)
);
}
public static void confirmToggleBlockDomain(Activity activity, String accountID, String domain, boolean currentlyBlocked, Runnable resultCallback){
showConfirmationAlert(activity, activity.getString(currentlyBlocked ? R.string.confirm_unblock_domain_title : R.string.confirm_block_domain_title),
activity.getString(currentlyBlocked ? R.string.confirm_unblock : R.string.confirm_block, domain),
@@ -541,6 +570,27 @@ public class UiUtils{
);
}
public static void confirmDeleteList(Activity activity, String accountID, String listID, String listTitle, Runnable callback) {
showConfirmationAlert(activity,
activity.getString(R.string.sk_delete_list),
activity.getString(R.string.sk_delete_list_confirm, listTitle),
activity.getString(R.string.delete),
R.drawable.ic_fluent_delete_28_regular,
() -> new DeleteList(listID).setCallback(new Callback<>() {
@Override
public void onSuccess(Object o) {
callback.run();
}
@Override
public void onError(ErrorResponse error) {
error.showToast(activity);
}
})
.wrapProgress(activity, R.string.deleting, false)
.exec(accountID));
}
public static void setRelationshipToActionButton(Relationship relationship, Button button){
setRelationshipToActionButton(relationship, button, false);
}
@@ -1013,4 +1063,19 @@ public class UiUtils{
case DIRECT -> R.string.visibility_private;
});
}
// https://github.com/tuskyapp/Tusky/pull/3148
public static void reduceSwipeSensitivity(ViewPager2 pager) {
try {
Field recyclerViewField = ViewPager2.class.getDeclaredField("mRecyclerView");
recyclerViewField.setAccessible(true);
RecyclerView recyclerView = (RecyclerView) recyclerViewField.get(pager);
Field touchSlopField = RecyclerView.class.getDeclaredField("mTouchSlop");
touchSlopField.setAccessible(true);
int touchSlop = touchSlopField.getInt(recyclerView);
touchSlopField.set(recyclerView, touchSlop * 3);
} catch (Exception ex) {
Log.e("reduceSwipeSensitivity", Log.getStackTraceString(ex));
}
}
}

View File

@@ -0,0 +1,84 @@
package org.joinmastodon.android.ui.views;
import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.PopupMenu;
import org.joinmastodon.android.R;
import org.joinmastodon.android.model.ListTimeline;
public class ListTimelineEditor extends LinearLayout {
private ListTimeline.RepliesPolicy policy = null;
private final TextInputFrameLayout input;
private final Button button;
@SuppressLint("ClickableViewAccessibility")
public ListTimelineEditor(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
LayoutInflater.from(context).inflate(R.layout.list_timeline_editor, this);
button = findViewById(R.id.button);
input = findViewById(R.id.input);
PopupMenu popupMenu = new PopupMenu(context, button, Gravity.CENTER_HORIZONTAL);
popupMenu.inflate(R.menu.list_reply_policies);
popupMenu.setOnMenuItemClickListener(this::onMenuItemClick);
button.setOnTouchListener(popupMenu.getDragToOpenListener());
button.setOnClickListener(v->popupMenu.show());
input.getEditText().setHint(context.getString(R.string.sk_list_name_hint));
setRepliesPolicy(ListTimeline.RepliesPolicy.LIST);
}
public void applyList(String title, ListTimeline.RepliesPolicy policy) {
input.getEditText().setText(title);
setRepliesPolicy(policy);
}
public String getTitle() {
return input.getEditText().getText().toString();
}
public ListTimeline.RepliesPolicy getRepliesPolicy() {
return policy;
}
public void setRepliesPolicy(ListTimeline.RepliesPolicy policy) {
this.policy = policy;
switch (policy) {
case FOLLOWED -> button.setText(R.string.sk_list_replies_policy_followed);
case LIST -> button.setText(R.string.sk_list_replies_policy_list);
case NONE -> button.setText(R.string.sk_list_replies_policy_none);
}
}
private boolean onMenuItemClick(MenuItem i) {
if (i.getItemId() == R.id.reply_policy_none) {
setRepliesPolicy(ListTimeline.RepliesPolicy.NONE);
} else if (i.getItemId() == R.id.reply_policy_followed) {
setRepliesPolicy(ListTimeline.RepliesPolicy.FOLLOWED);
} else if (i.getItemId() == R.id.reply_policy_list) {
setRepliesPolicy(ListTimeline.RepliesPolicy.LIST);
}
return true;
}
public ListTimelineEditor(Context context, AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
}
public ListTimelineEditor(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public ListTimelineEditor(Context context) {
this(context, null);
}
}

View File

@@ -0,0 +1,51 @@
package org.joinmastodon.android.ui.views;
import android.content.Context;
import android.util.AttributeSet;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.FrameLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import me.grishka.appkit.utils.V;
public class TextInputFrameLayout extends FrameLayout {
private final EditText editText;
public TextInputFrameLayout(@NonNull Context context, CharSequence hint, CharSequence text) {
this(context, null, 0, 0, hint, text);
}
public TextInputFrameLayout(@NonNull Context context) {
this(context, null);
}
public TextInputFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public TextInputFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
}
public TextInputFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
this(context, attrs, defStyleAttr, defStyleRes, null, null);
}
public TextInputFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes, CharSequence hint, CharSequence text) {
super(context, attrs, defStyleAttr, defStyleRes);
editText = new EditText(context);
editText.setHint(hint);
editText.setText(text);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
params.setMargins(V.dp(24), V.dp(4), V.dp(24), V.dp(16));
editText.setLayoutParams(params);
addView(editText);
}
public EditText getEditText() {
return editText;
}
}

View File

@@ -2,9 +2,9 @@
<ripple xmlns:android="http://schemas.android.com/apk/res/android" android:color="@color/highlight_over_dark">
<item>
<shape>
<solid android:color="?android:colorAccent"/>
<corners android:radius="16dp"/>
<padding android:left="16dp" android:right="16dp"/>
<solid android:color="?colorPrimary800"/>
<corners android:radius="16sp"/>
<padding android:left="16sp" android:right="16sp"/>
</shape>
</item>
</ripple>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="?colorBackgroundLightest"/>
<corners android:radius="10dp"/>
</shape>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="16dp" android:height="16dp" android:viewportWidth="16" android:viewportHeight="16">
<group android:translateX="-2" android:translateY="-1">
<path android:pathData="M14.69 11.503c1 0 1.81 0.81 1.81 1.81v0.689h-0.005c-0.034 0.78-0.248 1.757-1.123 2.555C14.416 17.43 12.765 18 10 18c-2.766 0-4.416-0.57-5.372-1.443-0.875-0.798-1.089-1.776-1.123-2.555H3.5v-0.69c0-0.999 0.81-1.809 1.81-1.809h9.38zM6.5 3C5.672 3 5 3.672 5 4.5v4C5 9.328 5.672 10 6.5 10h7c0.828 0 1.5-0.672 1.5-1.5v-4C15 3.672 14.328 3 13.5 3h-3V2.5C10.5 2.191 10.276 2 10 2S9.5 2.23 9.5 2.5V3h-3zM7 6.5c0-0.552 0.448-1 1-1s1 0.448 1 1-0.448 1-1 1-1-0.448-1-1zm4 0c0-0.552 0.448-1 1-1s1 0.448 1 1-0.448 1-1 1-1-0.448-1-1z" android:fillColor="@color/fluent_default_icon_tint"/>
</group>
</vector>

View File

@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="16dp"
android:height="16dp"
android:viewportWidth="16"
android:viewportHeight="16">
<path
android:pathData="M11.754,9.203C12.551,9.203 13.199,9.852 13.199,10.648L13.199,11.203L13.195,11.203C13.168,11.824 12.996,12.605 12.297,13.246C11.531,13.945 10.211,14.398 8,14.398C5.789,14.398 4.469,13.945 3.703,13.246C3.004,12.605 2.832,11.824 2.805,11.203L2.801,11.203L2.801,10.648C2.801,9.852 3.449,9.203 4.246,9.203ZM5.199,2.398C4.539,2.398 4,2.938 4,3.602L4,6.801C4,7.461 4.539,8 5.199,8L10.801,8C11.461,8 12,7.461 12,6.801L12,3.602C12,2.938 11.461,2.398 10.801,2.398L8.398,2.398C8.398,2.398 8.398,2.246 8.398,2C8.398,1.754 8.223,1.602 8,1.602C7.777,1.602 7.602,1.785 7.602,2C7.602,2.215 7.602,2.398 7.602,2.398ZM5.602,5.199C5.602,4.758 5.957,4.398 6.398,4.398C6.844,4.398 7.199,4.758 7.199,5.199C7.199,5.641 6.844,6 6.398,6C5.957,6 5.602,5.641 5.602,5.199ZM8.801,5.199C8.801,4.758 9.156,4.398 9.602,4.398C10.043,4.398 10.398,4.758 10.398,5.199C10.398,5.641 10.043,6 9.602,6C9.156,6 8.801,5.641 8.801,5.199ZM8.801,5.199"
android:fillColor="?android:textColorPrimary" />
</vector>

View File

@@ -0,0 +1,3 @@
<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="M17.75 3c1.733 0 3.15 1.356 3.245 3.066L21 6.25v5.772c-0.463-0.297-0.966-0.536-1.5-0.709V6.25c0-0.918-0.707-1.671-1.606-1.744L17.75 4.5H6.25c-0.6 0-1.13 0.302-1.445 0.763C4.491 5.095 4.132 5 3.75 5 3.57 5 3.393 5.021 3.224 5.062 3.677 3.909 4.77 3.078 6.066 3.005L6.25 3h11.5zm-6.437 16.5c0.173 0.534 0.412 1.037 0.709 1.5H6.25c-1.733 0-3.15-1.357-3.245-3.066L3 17.75V9.372C3.235 9.455 3.487 9.5 3.75 9.5S4.266 9.455 4.5 9.372v8.378c0 0.918 0.707 1.671 1.607 1.744L6.25 19.5h5.063zm0.418-4.997c0.286-0.55 0.65-1.056 1.076-1.5h-4.06l-0.1 0.007c-0.367 0.05-0.65 0.363-0.65 0.743 0 0.414 0.337 0.75 0.75 0.75h2.984zm3.521-5.007c0.415 0 0.75 0.336 0.75 0.75 0 0.38-0.282 0.694-0.648 0.743l-0.102 0.007H8.748c-0.414 0-0.75-0.336-0.75-0.75 0-0.38 0.282-0.693 0.648-0.743l0.102-0.007h6.504zM3.75 6C4.44 6 5 6.56 5 7.25S4.44 8.5 3.75 8.5 2.5 7.94 2.5 7.25 3.06 6 3.75 6zM23 17.5c0-3.038-2.462-5.5-5.5-5.5S12 14.462 12 17.5s2.462 5.5 5.5 5.5 5.5-2.462 5.5-5.5zM18 18l0.001 2.503c0 0.277-0.224 0.5-0.5 0.5s-0.5-0.223-0.5-0.5V18h-2.505c-0.276 0-0.5-0.224-0.5-0.5s0.224-0.5 0.5-0.5H17v-2.5c0-0.277 0.224-0.5 0.5-0.5s0.5 0.223 0.5 0.5V17h2.497c0.276 0 0.5 0.224 0.5 0.5s-0.224 0.5-0.5 0.5H18z" android:fillColor="@color/fluent_default_icon_tint"/>
</vector>

View File

@@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="16dp" android:height="16dp" android:viewportWidth="16" android:viewportHeight="16">
<path android:pathData="M3.2 5.74C3.482 5.436 3.957 5.419 4.26 5.7L8 9.226 11.74 5.7c0.303-0.281 0.778-0.264 1.06 0.04 0.281 0.303 0.264 0.778-0.04 1.06l-4.25 4c-0.287 0.267-0.733 0.267-1.02 0l-4.25-4C2.936 6.518 2.919 6.043 3.2 5.74z" android:fillColor="@color/fluent_default_icon_tint"/>
</vector>

View File

@@ -0,0 +1,3 @@
<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.25 3C5.007 3 4 4.007 4 5.25v2.5C4 8.993 5.007 10 6.25 10h9.5C16.993 10 18 8.993 18 7.75v-2.5C18 4.007 16.993 3 15.75 3h-9.5zM5.5 5.25c0-0.414 0.336-0.75 0.75-0.75h9.5c0.414 0 0.75 0.336 0.75 0.75v2.5c0 0.414-0.336 0.75-0.75 0.75h-9.5C5.836 8.5 5.5 8.164 5.5 7.75v-2.5zM8.7 16C8.313 16 8 16.336 8 16.75s0.313 0.75 0.7 0.75h4.6c0.387 0 0.7-0.336 0.7-0.75S13.687 16 13.3 16H8.7zm8.653 0.445L17.28 16.53c-0.266 0.267-0.683 0.29-0.976 0.073L16.22 16.53l-2-2c-0.267-0.266-0.29-0.682-0.073-0.976l0.073-0.084 2-2c0.293-0.293 0.767-0.293 1.06 0 0.267 0.266 0.29 0.683 0.073 0.976L17.28 12.53l-0.719 0.721h1.5c0.647 0 1.18-0.492 1.243-1.122L19.311 12V9.75c0-0.415 0.335-0.75 0.75-0.75 0.38 0 0.693 0.282 0.743 0.648L20.81 9.75V12c0 1.462-1.142 2.658-2.583 2.745L18.06 14.75h-1.499l0.718 0.719c0.267 0.266 0.29 0.683 0.073 0.976zM18 19.25v-2.026l-0.013 0.012c-0.405 0.406-0.96 0.57-1.487 0.495v1.519c0 0.414-0.336 0.75-0.75 0.75h-9.5c-0.414 0-0.75-0.336-0.75-0.75v-5c0-0.414 0.336-0.75 0.75-0.75h6.822c0.058-0.192 0.148-0.376 0.272-0.543l0.022-0.03 0.12-0.14L14.275 12H6.25C5.007 12 4 13.007 4 14.25v5c0 1.243 1.007 2.25 2.25 2.25h9.5c1.243 0 2.25-1.007 2.25-2.25z" android:fillColor="@color/fluent_default_icon_tint"/>
</vector>

View File

@@ -0,0 +1,3 @@
<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="M10.946 2.047l0.005 0.007C11.296 2.02 11.646 2 12 2c5.522 0 10 4.477 10 10s-4.478 10-10 10c-3.21 0-6.066-1.512-7.896-3.862H4.102v-0.003C2.786 16.441 2 14.312 2 12c0-5.162 3.911-9.41 8.932-9.944l0.014-0.009zM12 3.5c-0.053 0-0.106 0-0.16 0.002 0.123 0.244 0.255 0.532 0.374 0.85 0.347 0.921 0.666 2.28 0.1 3.486-0.522 1.113-1.424 1.4-2.09 1.573L10.14 9.432c-0.657 0.17-0.91 0.235-1.093 0.514-0.17 0.257-0.144 0.582 0.061 1.25l0.046 0.148c0.082 0.258 0.18 0.57 0.23 0.863 0.064 0.364 0.082 0.827-0.152 1.275-0.231 0.444-0.538 0.747-0.9 0.945-0.341 0.185-0.694 0.256-0.958 0.302l-0.093 0.017c-0.515 0.09-0.761 0.134-1 0.39-0.187 0.2-0.307 0.553-0.377 1.079-0.029 0.214-0.046 0.427-0.064 0.646l-0.01 0.117c-0.02 0.242-0.044 0.521-0.099 0.76v0.002c1.554 1.696 3.787 2.76 6.27 2.76 1.576 0 3.053-0.43 4.319-1.178-0.099-0.1-0.205-0.218-0.31-0.35-0.34-0.428-0.786-1.164-0.631-2.033 0.074-0.418 0.298-0.768 0.515-1.036 0.22-0.274 0.486-0.526 0.72-0.74l0.158-0.146c0.179-0.163 0.33-0.301 0.46-0.437 0.172-0.18 0.21-0.262 0.212-0.267 0.068-0.224-0.015-0.384-0.106-0.454-0.046-0.035-0.107-0.06-0.19-0.061-0.084 0-0.22 0.024-0.401 0.14-0.21 0.132-0.515 0.214-0.836 0.085-0.267-0.108-0.415-0.314-0.486-0.432-0.144-0.237-0.225-0.546-0.278-0.772-0.04-0.174-0.08-0.372-0.115-0.553l-0.04-0.206c-0.05-0.25-0.094-0.428-0.134-0.54l-0.02-0.037c-0.014-0.027-0.035-0.062-0.064-0.105-0.058-0.089-0.133-0.192-0.227-0.317l-0.11-0.143c-0.16-0.212-0.353-0.463-0.516-0.712-0.196-0.298-0.417-0.688-0.487-1.104-0.037-0.22-0.036-0.475 0.055-0.734 0.094-0.264 0.265-0.482 0.487-0.649 0.483-0.362 1.193-1.172 1.823-1.959 0.288-0.359 0.544-0.695 0.736-0.95C15.222 3.98 13.667 3.5 12 3.5z" android:fillColor="@color/fluent_default_icon_tint"/>
</vector>

View File

@@ -0,0 +1,3 @@
<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="M10.55 2.534c0.837-0.707 2.063-0.707 2.9 0L20.2 8.23C20.708 8.657 21 9.286 21 9.95v9.802c0 0.967-0.784 1.75-1.75 1.75h-3c-0.966 0-1.75-0.783-1.75-1.75v-5c0-0.414-0.336-0.75-0.75-0.75h-3.5c-0.414 0-0.75 0.336-0.75 0.75v5c0 0.967-0.784 1.75-1.75 1.75h-3c-0.966 0-1.75-0.783-1.75-1.75V9.948c0-0.663 0.292-1.292 0.8-1.72l6.75-5.694z" android:fillColor="@color/fluent_default_icon_tint"/>
</vector>

View File

@@ -0,0 +1,3 @@
<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="M10.55 2.532c0.837-0.707 2.063-0.707 2.9 0l6.75 5.692c0.507 0.428 0.8 1.057 0.8 1.72v9.803c0 0.966-0.784 1.75-1.75 1.75h-3.5c-0.966 0-1.75-0.784-1.75-1.75v-5.5c0-0.138-0.112-0.25-0.25-0.25h-3.5c-0.138 0-0.25 0.112-0.25 0.25v5.5c0 0.966-0.784 1.75-1.75 1.75h-3.5c-0.966 0-1.75-0.784-1.75-1.75V9.944c0-0.663 0.293-1.293 0.8-1.72l6.75-5.692zm1.933 1.147c-0.279-0.236-0.687-0.236-0.966 0L4.767 9.37C4.596 9.513 4.5 9.723 4.5 9.944v9.803c0 0.138 0.112 0.25 0.25 0.25h3.5c0.138 0 0.25-0.112 0.25-0.25v-5.5c0-0.967 0.784-1.75 1.75-1.75h3.5c0.966 0 1.75 0.783 1.75 1.75v5.5c0 0.138 0.112 0.25 0.25 0.25h3.5c0.138 0 0.25-0.112 0.25-0.25V9.944c0-0.221-0.098-0.43-0.267-0.573l-6.75-5.692z" android:fillColor="@color/fluent_default_icon_tint"/>
</vector>

View File

@@ -0,0 +1,3 @@
<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="M12 1.999c5.524 0 10.002 4.478 10.002 10.002 0 5.523-4.478 10.001-10.002 10.001-5.524 0-10.002-4.478-10.002-10.001C1.998 6.477 6.476 1.999 12 1.999zm0 1.5c-4.695 0-8.502 3.806-8.502 8.502 0 4.695 3.807 8.501 8.502 8.501s8.502-3.806 8.502-8.501c0-4.696-3.807-8.502-8.502-8.502zm-0.004 7c0.38 0 0.694 0.282 0.744 0.648l0.007 0.102 0.004 5.502c0 0.414-0.336 0.75-0.75 0.75-0.38 0-0.694-0.282-0.744-0.648l-0.006-0.101-0.004-5.502c0-0.414 0.335-0.75 0.75-0.75zm0.005-3.497c0.551 0 0.998 0.447 0.998 0.999 0 0.551-0.447 0.998-0.998 0.998-0.552 0-1-0.447-1-0.998 0-0.552 0.448-1 1-1z" 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="20dp"
android:height="20dp"
android:viewportWidth="20"
android:viewportHeight="20">
<path
android:pathData="M7.5,7C7.224,7 7,7.224 7,7.5C7,7.776 7.224,8 7.5,8H12.5C12.776,8 13,7.776 13,7.5C13,7.224 12.776,7 12.5,7H7.5ZM7,10.5C7,10.224 7.224,10 7.5,10H12.5C12.776,10 13,10.224 13,10.5C13,10.776 12.776,11 12.5,11H7.5C7.224,11 7,10.776 7,10.5ZM7.5,13C7.224,13 7,13.224 7,13.5C7,13.776 7.224,14 7.5,14H9.5C9.776,14 10,13.776 10,13.5C10,13.224 9.776,13 9.5,13H7.5ZM6.5,2C6.224,2 6,2.224 6,2.5V3H5.5C4.672,3 4,3.672 4,4.5V16.5C4,17.328 4.672,18 5.5,18H11.5C11.633,18 11.76,17.947 11.854,17.854L15.854,13.854C15.947,13.76 16,13.633 16,13.5V4.5C16,3.672 15.328,3 14.5,3H14V2.5C14,2.224 13.776,2 13.5,2C13.224,2 13,2.224 13,2.5V3H10.5V2.5C10.5,2.224 10.276,2 10,2C9.724,2 9.5,2.224 9.5,2.5V3H7V2.5C7,2.224 6.776,2 6.5,2ZM14.5,4C14.776,4 15,4.224 15,4.5V13H12.5C11.672,13 11,13.672 11,14.5V17H5.5C5.224,17 5,16.776 5,16.5V4.5C5,4.224 5.224,4 5.5,4H14.5ZM14.293,14L12,16.293V14.5C12,14.224 12.224,14 12.5,14H14.293Z"
android:fillColor="#212121"/>
</vector>

View File

@@ -0,0 +1,3 @@
<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.5 8c0-1.38 1.12-2.5 2.5-2.5s2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5S5.5 9.38 5.5 8zM8 4C5.79 4 4 5.79 4 8s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm7.5 5c0-0.828 0.672-1.5 1.5-1.5s1.5 0.672 1.5 1.5-0.672 1.5-1.5 1.5-1.5-0.672-1.5-1.5zM17 6c-1.657 0-3 1.343-3 3s1.343 3 3 3 3-1.343 3-3-1.343-3-3-3zm-2.752 13.038c0.703 0.285 1.604 0.462 2.753 0.462 2.282 0 3.586-0.697 4.297-1.558 0.345-0.418 0.52-0.84 0.61-1.163 0.044-0.16 0.067-0.299 0.08-0.402 0.006-0.052 0.009-0.095 0.01-0.128l0.003-0.043v-0.027c0-1.204-0.975-2.179-2.179-2.179H14.18c-0.028 0-0.055 0-0.082 0.002 0.394 0.41 0.68 0.925 0.816 1.498h4.908c0.372 0 0.674 0.299 0.679 0.669L20.498 16.2c-0.005 0.038-0.015 0.1-0.037 0.18-0.043 0.16-0.133 0.38-0.32 0.605C19.792 17.412 18.97 18 17.002 18c-0.98 0-1.676-0.146-2.17-0.345-0.108 0.4-0.286 0.883-0.583 1.383zM4.25 14C3.007 14 2 15.007 2 16.25v0.278l0.002 0.05c0.002 0.039 0.006 0.093 0.012 0.158 0.013 0.13 0.038 0.309 0.088 0.52 0.098 0.422 0.295 0.984 0.69 1.55C3.61 19.974 5.172 21 8 21c2.828 0 4.39-1.025 5.208-2.195 0.396-0.565 0.592-1.127 0.69-1.549 0.05-0.211 0.075-0.39 0.088-0.52 0.007-0.066 0.01-0.12 0.012-0.159L14 16.527V16.25c0-1.243-1.007-2.25-2.25-2.25h-7.5zM3.5 16.507V16.25c0-0.414 0.336-0.75 0.75-0.75h7.5c0.414 0 0.75 0.336 0.75 0.75v0.257l-0.007 0.08c-0.007 0.074-0.023 0.188-0.055 0.329-0.066 0.281-0.198 0.656-0.459 1.029C11.486 18.65 10.422 19.5 8 19.5s-3.486-0.85-3.98-1.555c-0.26-0.373-0.392-0.748-0.458-1.03-0.032-0.14-0.048-0.254-0.055-0.328-0.004-0.038-0.006-0.065-0.006-0.08z" android:fillColor="@color/fluent_default_icon_tint"/>
</vector>

View File

@@ -0,0 +1,3 @@
<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.5 7c0-1.38 1.12-2.5 2.5-2.5s2.5 1.12 2.5 2.5S9.38 9.5 8 9.5 5.5 8.38 5.5 7zM8 3C5.79 3 4 4.79 4 7s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm7.5 5c0-0.828 0.672-1.5 1.5-1.5s1.5 0.672 1.5 1.5-0.672 1.5-1.5 1.5-1.5-0.672-1.5-1.5zM17 5c-1.657 0-3 1.343-3 3s1.343 3 3 3 3-1.343 3-3-1.343-3-3-3zM4.25 13C3.007 13 2 14.007 2 15.25v0.278l0.002 0.05c0.002 0.039 0.006 0.093 0.012 0.158 0.013 0.13 0.038 0.309 0.088 0.52 0.098 0.422 0.295 0.984 0.69 1.55C3.61 18.974 5.172 20 8 20c1.369 0 2.441-0.24 3.276-0.62-0.15-0.495-0.241-1.014-0.268-1.55C10.363 18.21 9.413 18.5 8 18.5c-2.422 0-3.486-0.85-3.98-1.555-0.26-0.373-0.392-0.748-0.458-1.03-0.032-0.14-0.048-0.254-0.055-0.329C3.502 15.55 3.5 15.522 3.5 15.507V15.25c0-0.414 0.336-0.75 0.75-0.75h7.482c0.249-0.477 0.555-0.919 0.909-1.317C12.366 13.065 12.066 13 11.75 13h-7.5zM23 17.5c0-3.038-2.462-5.5-5.5-5.5S12 14.462 12 17.5s2.462 5.5 5.5 5.5 5.5-2.462 5.5-5.5zM18 18l0.001 2.503c0 0.277-0.224 0.5-0.5 0.5s-0.5-0.223-0.5-0.5V18h-2.505c-0.276 0-0.5-0.224-0.5-0.5s0.224-0.5 0.5-0.5H17v-2.5c0-0.277 0.224-0.5 0.5-0.5s0.5 0.223 0.5 0.5V17h2.497c0.276 0 0.5 0.224 0.5 0.5s-0.224 0.5-0.5 0.5H18z" android:fillColor="@color/fluent_default_icon_tint"/>
</vector>

View File

@@ -0,0 +1,3 @@
<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="M9.5 4C7.015 4 5 6.015 5 8.5S7.015 13 9.5 13 14 10.985 14 8.5 11.985 4 9.5 4zm-3 4.5c0-1.657 1.343-3 3-3s3 1.343 3 3-1.343 3-3 3-3-1.343-3-3zM20 6c-1.933 0-3.5 1.567-3.5 3.5S18.067 13 20 13s3.5-1.567 3.5-3.5S21.933 6 20 6zm-2 3.5c0-1.105 0.895-2 2-2s2 0.895 2 2-0.895 2-2 2-2-0.895-2-2zM4.25 15C3.007 15 2 16.007 2 17.25v0.531l0.003 0.057c0.002 0.046 0.006 0.109 0.014 0.185 0.017 0.153 0.049 0.363 0.11 0.612 0.125 0.497 0.373 1.156 0.867 1.815C4.008 21.803 5.942 23 9.5 23c1.531 0 2.762-0.222 3.747-0.582-0.128-0.489-0.21-0.996-0.236-1.518-0.836 0.355-1.97 0.6-3.511 0.6-3.192 0-4.633-1.053-5.306-1.95-0.35-0.466-0.524-0.932-0.61-1.279-0.044-0.173-0.065-0.314-0.075-0.408-0.005-0.046-0.007-0.08-0.008-0.1L3.5 17.745V17.25c0-0.414 0.336-0.75 0.75-0.75h9.905c0.33-0.523 0.723-1.002 1.168-1.426C15.14 15.026 14.948 15 14.75 15H4.25zM27 20.5c0 3.59-2.91 6.5-6.5 6.5S14 24.09 14 20.5s2.91-6.5 6.5-6.5 6.5 2.91 6.5 6.5zm-6-4c0-0.276-0.224-0.5-0.5-0.5S20 16.224 20 16.5V20h-3.5c-0.276 0-0.5 0.224-0.5 0.5s0.224 0.5 0.5 0.5H20v3.5c0 0.276 0.224 0.5 0.5 0.5s0.5-0.224 0.5-0.5V21h3.5c0.276 0 0.5-0.224 0.5-0.5S24.776 20 24.5 20H21v-3.5z" android:fillColor="@color/fluent_default_icon_tint"/>
</vector>

View File

@@ -0,0 +1,3 @@
<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="M14.75 15c0.966 0 1.75 0.784 1.75 1.75l-0.001 0.962c0.117 2.19-1.511 3.297-4.432 3.297-2.91 0-4.567-1.09-4.567-3.259v-1C7.5 15.784 8.284 15 9.25 15h5.5zm-11-5h4.376C8.044 10.32 8 10.655 8 11c0 1.116 0.457 2.124 1.193 2.85L9.355 14H9.25c-0.301 0-0.591 0.049-0.863 0.138-0.864 0.286-1.54 0.988-1.786 1.87L6.567 16.01C3.657 16.009 2 14.919 2 12.75v-1C2 10.784 2.784 10 3.75 10zm16.5 0c0.966 0 1.75 0.784 1.75 1.75l-0.001 0.962c0.117 2.19-1.511 3.297-4.432 3.297l-0.169-0.002c-0.238-0.854-0.88-1.54-1.705-1.841-0.235-0.086-0.486-0.14-0.746-0.16L14.75 14l-0.105 0.001C15.475 13.268 16 12.195 16 11c0-0.345-0.044-0.68-0.126-1h4.376zM12 8c1.657 0 3 1.343 3 3s-1.343 3-3 3-3-1.343-3-3 1.343-3 3-3zM6.5 3c1.657 0 3 1.343 3 3s-1.343 3-3 3-3-1.343-3-3 1.343-3 3-3zm11 0c1.657 0 3 1.343 3 3s-1.343 3-3 3-3-1.343-3-3 1.343-3 3-3z" android:fillColor="@color/fluent_default_icon_tint"/>
</vector>

View File

@@ -0,0 +1,3 @@
<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="M8 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm9 0c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zM4.25 14C3.007 14 2 15.007 2 16.25v0.25S2 21 8 21c1.855 0 3.136-0.43 4.021-1.024 0.06-0.38 0.242-0.719 0.504-0.976C12.201 18.682 12 18.24 12 17.75s0.201-0.932 0.525-1.25C12.201 16.182 12 15.74 12 15.25c0-0.438 0.161-0.84 0.428-1.146C12.214 14.036 11.986 14 11.75 14h-7.5zm9.5 0.5c-0.414 0-0.75 0.336-0.75 0.75S13.336 16 13.75 16h7.5c0.414 0 0.75-0.336 0.75-0.75s-0.336-0.75-0.75-0.75h-7.5zm0 2.5C13.336 17 13 17.336 13 17.75s0.336 0.75 0.75 0.75h7.5c0.414 0 0.75-0.336 0.75-0.75S21.664 17 21.25 17h-7.5zm0 2.5c-0.414 0-0.75 0.336-0.75 0.75S13.336 21 13.75 21h7.5c0.414 0 0.75-0.336 0.75-0.75s-0.336-0.75-0.75-0.75h-7.5z" android:fillColor="@color/fluent_default_icon_tint"/>
</vector>

View File

@@ -0,0 +1,3 @@
<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.5 8c0-1.38 1.12-2.5 2.5-2.5s2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5S5.5 9.38 5.5 8zM8 4C5.79 4 4 5.79 4 8s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm7.5 5c0-0.828 0.672-1.5 1.5-1.5s1.5 0.672 1.5 1.5-0.672 1.5-1.5 1.5-1.5-0.672-1.5-1.5zM17 6c-1.657 0-3 1.343-3 3s1.343 3 3 3 3-1.343 3-3-1.343-3-3-3zM4.25 14C3.007 14 2 15.007 2 16.25v0.278l0.002 0.05c0.002 0.039 0.006 0.093 0.012 0.158 0.013 0.13 0.038 0.309 0.088 0.52 0.098 0.422 0.295 0.984 0.69 1.55C3.61 19.974 5.172 21 8 21c1.819 0 3.113-0.424 4.024-1.037 0.061-0.375 0.242-0.709 0.501-0.963-0.29-0.284-0.48-0.667-0.518-1.095l-0.028 0.04C11.486 18.65 10.422 19.5 8 19.5s-3.486-0.85-3.98-1.555c-0.26-0.373-0.392-0.748-0.458-1.03-0.032-0.14-0.048-0.254-0.055-0.328-0.004-0.038-0.006-0.065-0.006-0.08L3.5 16.495V16.25c0-0.414 0.336-0.75 0.75-0.75h7.5c0.098 0 0.19 0.019 0.276 0.052C12.009 15.454 12 15.353 12 15.25c0-0.438 0.161-0.84 0.428-1.146C12.214 14.036 11.986 14 11.75 14h-7.5zm8.275 2.5l-0.027 0.027 0.002-0.02v-0.032l0.025 0.025zm1.225-2c-0.414 0-0.75 0.336-0.75 0.75S13.336 16 13.75 16h7.5c0.414 0 0.75-0.336 0.75-0.75s-0.336-0.75-0.75-0.75h-7.5zm0 2.5C13.336 17 13 17.336 13 17.75s0.336 0.75 0.75 0.75h7.5c0.414 0 0.75-0.336 0.75-0.75S21.664 17 21.25 17h-7.5zm0 2.5c-0.414 0-0.75 0.336-0.75 0.75S13.336 21 13.75 21h7.5c0.414 0 0.75-0.336 0.75-0.75s-0.336-0.75-0.75-0.75h-7.5z" android:fillColor="@color/fluent_default_icon_tint"/>
</vector>

View File

@@ -0,0 +1,3 @@
<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="M5 9.5C5 7.015 7.015 5 9.5 5S14 7.015 14 9.5 11.985 14 9.5 14 5 11.985 5 9.5zm4.5-3c-1.657 0-3 1.343-3 3s1.343 3 3 3 3-1.343 3-3-1.343-3-3-3zm7 4C16.5 8.567 18.067 7 20 7s3.5 1.567 3.5 3.5S21.933 14 20 14s-3.5-1.567-3.5-3.5zm3.5-2c-1.105 0-2 0.895-2 2s0.895 2 2 2 2-0.895 2-2-0.895-2-2-2zM2 18.25C2 17.007 3.007 16 4.25 16h10.5c0.236 0 0.464 0.036 0.678 0.104C15.16 16.41 15 16.812 15 17.25c0 0.103 0.009 0.204 0.026 0.302-0.085-0.033-0.178-0.052-0.276-0.052H4.25c-0.414 0-0.75 0.336-0.75 0.75v0.513l0.009 0.1c0.01 0.094 0.03 0.235 0.074 0.408 0.087 0.347 0.261 0.813 0.61 1.279 0.674 0.897 2.115 1.95 5.307 1.95s4.633-1.053 5.306-1.95c0.072-0.096 0.136-0.191 0.194-0.286 0.005 0.608 0.32 1.141 0.793 1.451-0.066 0.078-0.135 0.154-0.208 0.229-0.049 0.044-0.095 0.09-0.139 0.139C14.332 23.155 12.489 24 9.5 24c-3.558 0-5.492-1.197-6.506-2.55-0.495-0.659-0.742-1.318-0.866-1.815-0.062-0.249-0.094-0.459-0.11-0.612-0.009-0.076-0.013-0.139-0.015-0.185L2 18.781V18.25zm14.75-1.75c-0.414 0-0.75 0.336-0.75 0.75S16.336 18 16.75 18h8.5c0.414 0 0.75-0.336 0.75-0.75s-0.336-0.75-0.75-0.75h-8.5zm0 3c-0.414 0-0.75 0.336-0.75 0.75S16.336 21 16.75 21h8.5c0.414 0 0.75-0.336 0.75-0.75s-0.336-0.75-0.75-0.75h-8.5zm0 3c-0.414 0-0.75 0.336-0.75 0.75S16.336 24 16.75 24h8.5c0.414 0 0.75-0.336 0.75-0.75s-0.336-0.75-0.75-0.75h-8.5z" android:fillColor="@color/fluent_default_icon_tint"/>
</vector>

View File

@@ -103,7 +103,7 @@
<TextView
android:id="@+id/state_title"
android:layout_width="match_parent"
android:layout_height="16dp"
android:layout_height="wrap_content"
android:layout_below="@id/retry_or_cancel_upload"
android:layout_marginTop="16dp"
android:textColor="?colorGray200"
@@ -118,7 +118,7 @@
<TextView
android:id="@+id/state_text"
android:layout_width="match_parent"
android:layout_height="32dp"
android:layout_height="wrap_content"
android:layout_below="@id/state_title"
android:includeFontPadding="false"
android:textColor="?colorGray200"

View File

@@ -8,7 +8,7 @@
android:layout_gravity="top"
android:elevation="1dp"
android:outlineProvider="background"
android:background="?colorWindowBackground">
android:background="?colorBackgroundLight">
<TextView
android:id="@+id/banner_text"

View File

@@ -120,6 +120,14 @@
android:textAppearance="@style/m3_title_small"
tools:text="\@Gargron" />
<ImageView
android:id="@+id/bot_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:importantForAccessibility="no"
android:layout_marginTop="2dp"
android:src="@drawable/ic_fluent_bot_16_filled" />
<TextView
android:id="@+id/separator"
android:layout_width="wrap_content"

View File

@@ -90,6 +90,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toEndOf="@id/self_avatar"
android:layout_marginTop="2sp"
android:minHeight="24sp"
android:ellipsize="end"
android:singleLine="true"

View File

@@ -253,11 +253,53 @@
android:textColor="?android:textColorSecondary"
tools:text="\@Gargron" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/username"
android:id="@+id/note_edit_wrap"
android:layout_marginTop="4dp"
android:layout_marginBottom="16dp"
android:layout_marginHorizontal="16dp"
android:visibility="gone">
<EditText
android:id="@+id/note_edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingVertical="16dp"
android:inputType="textMultiLine|textCapSentences"
android:singleLine="false"
android:drawableStart="@drawable/ic_fluent_notepad_20_regular"
android:drawablePadding="12dp"
android:drawableTint="?android:textColorSecondary"
android:background="@drawable/bg_note_edit"
android:paddingEnd="48dp"
android:paddingHorizontal="16dp"
android:elevation="0dp"
android:visibility="gone"
android:hint="@string/sk_personal_note"/>
<Button
android:id="@+id/note_edit_confirm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:paddingHorizontal="8dp"
android:visibility="invisible"
android:backgroundTint="?colorBackgroundLightest"
android:layout_gravity="right|center_vertical"
android:tooltipText="@string/sk_personal_note_confirm"
android:contentDescription="@string/sk_personal_note_confirm"
android:drawableStart="@drawable/ic_fluent_checkmark_24_regular"
/>
</FrameLayout>
<org.joinmastodon.android.ui.views.LinkedTextView
android:id="@+id/bio"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/username"
android:layout_below="@id/note_edit_wrap"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:textAppearance="@style/m3_body_large"

View File

@@ -0,0 +1,54 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/note_edit_wrap"
android:visibility="gone">
<EditText
android:id="@+id/note_edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingVertical="16dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="4dp"
android:layout_marginHorizontal="16dp"
android:inputType="textMultiLine|textCapSentences"
android:singleLine="false"
android:drawableStart="@drawable/ic_fluent_notepad_20_regular"
android:drawablePadding="12dp"
android:drawableTint="?android:textColorSecondary"
android:background="@drawable/bg_note_edit"
android:paddingHorizontal="16dp"
android:elevation="0dp"
android:visibility="gone"
android:hint="@string/sk_personal_note"/>
<ImageButton
android:id="@+id/note_edit_confirm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_fluent_checkmark_24_filled"
android:backgroundTint="#00000000"
android:layout_marginTop="2dp"
android:visibility="invisible"
android:layout_marginEnd="20dp"
android:layout_gravity="right|center_vertical"
android:tooltipText="@string/sk_personal_note_confirm"
android:contentDescription="@string/sk_personal_note_confirm" />
</FrameLayout>
<me.grishka.appkit.views.UsableRecyclerView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"
android:clipToPadding="false"/>
</LinearLayout>

View File

@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/switcher_btn"
android:background="?android:selectableItemBackgroundBorderless"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center_vertical|start"
android:paddingHorizontal="16dp">
<ImageView
android:id="@+id/timeline_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:src="@drawable/ic_fluent_home_24_regular" />
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical">
<ImageView
android:id="@+id/collapsed_chevron"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_gravity="center_vertical"
android:src="@drawable/ic_fluent_chevron_down_16_filled"
android:visibility="gone" />
<TextView
android:id="@+id/timeline_title"
style="?android:attr/titleTextAppearance"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:drawablePadding="8dp"
android:drawableEnd="@drawable/ic_fluent_chevron_down_16_filled" />
</FrameLayout>
</LinearLayout>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/show_new_posts_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingVertical="2dp"
android:minHeight="32sp"
android:lineSpacingMultiplier="0.8"
android:textAppearance="@style/m3_title_medium"
android:text="@string/see_new_posts"
android:textColor="@color/gray_25"
android:background="@drawable/bg_button_new_posts"
android:drawableStart="@drawable/ic_fluent_arrow_up_16_filled"
android:drawablePadding="8dp"
android:layout_gravity="center" />
</FrameLayout>
</FrameLayout>

View File

@@ -91,7 +91,6 @@
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:gravity="center_horizontal"
android:layout_weight="1"
android:orientation="vertical">
<TextView
@@ -116,7 +115,6 @@
android:layout_marginTop="16dp"
android:layout_marginStart="12dp"
android:orientation="vertical"
android:layout_weight="1"
android:gravity="center_horizontal">
<TextView
android:id="@+id/followers_count"
@@ -140,7 +138,6 @@
android:layout_marginTop="16dp"
android:layout_marginStart="12dp"
android:orientation="vertical"
android:layout_weight="1"
android:gravity="center_horizontal">
<TextView
android:id="@+id/following_count"
@@ -228,9 +225,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:padding="8dp"
android:layout_weight="1"
android:clipToPadding="false">
<org.joinmastodon.android.ui.views.ProgressBarButton

View File

@@ -6,7 +6,7 @@
<TextView
android:layout_width="0dp"
android:layout_height="28dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginTop="12dp"
android:layout_marginStart="16dp"
@@ -22,6 +22,7 @@
android:layout_height="44dp"
android:layout_marginTop="4dp"
android:layout_marginEnd="6dp"
android:layout_gravity="center_vertical"
android:tint="?android:textColorSecondary"
android:background="?android:selectableItemBackgroundBorderless"
android:contentDescription="@string/clear"

View File

@@ -24,8 +24,13 @@
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center"
android:alpha="0"
/>
android:alpha="0" />
<TextView
android:id="@+id/secondary_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textColor="?android:textColorSecondary" />
<ImageView
android:id="@+id/icon"
android:importantForAccessibility="no"

View File

@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<org.joinmastodon.android.ui.views.AutoOrientationLinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginHorizontal="24dp">
<TextView
android:id="@+id/text"
android:text="@string/sk_list_replies_policy"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:paddingVertical="8dp"
android:singleLine="true"
android:ellipsize="none"
android:gravity="center_vertical"
android:textColor="?android:textColorPrimary"
android:textSize="16sp" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="32dp"
android:background="@drawable/bg_inline_button"
android:elevation="0dp"
android:ellipsize="none"
android:fontFamily="sans-serif-medium"
android:singleLine="true"
android:stateListAnimator="@null"
android:textColor="?android:textColorPrimary"
android:textSize="16sp" />
</org.joinmastodon.android.ui.views.AutoOrientationLinearLayout>
<org.joinmastodon.android.ui.views.TextInputFrameLayout
android:id="@+id/input"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/home" android:icon="@drawable/ic_fluent_home_24_regular" android:title="@string/sk_timeline_home" />
<item android:id="@+id/local" android:icon="@drawable/ic_fluent_people_community_24_regular" android:title="@string/sk_timeline_local" />
<item android:id="@+id/federated" android:icon="@drawable/ic_fluent_earth_24_regular" android:title="@string/sk_timeline_federated" />
<item android:id="@+id/post_notifications" android:icon="@drawable/ic_fluent_alert_24_regular" android:title="@string/sk_notify_posts" />
<item android:id="@+id/lists" android:icon="@drawable/ic_fluent_people_list_24_regular" android:title="@string/sk_list_timelines" android:visible="false">
<menu />
</item>
<item android:id="@+id/followed_hashtags" android:icon="@drawable/ic_fluent_number_symbol_24_regular" android:title="@string/sk_hashtags_you_follow" android:visible="false">
<menu />
</item>
</menu>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/reply_policy_list" android:title="@string/sk_list_replies_policy_list" />
<item android:id="@+id/reply_policy_followed" android:title="@string/sk_list_replies_policy_followed" />
<item android:id="@+id/reply_policy_none" android:title="@string/sk_list_replies_policy_none" />
</menu>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/create"
android:title="@string/sk_create"
android:icon="@drawable/ic_fluent_people_add_24_regular"
android:showAsAction="always" />
</menu>

View File

@@ -4,8 +4,9 @@
<item android:id="@+id/mute" android:title="@string/mute_user" android:icon="@drawable/ic_fluent_speaker_mute_24_regular"/>
<item android:id="@+id/block" android:title="@string/block_user" android:icon="@drawable/ic_fluent_person_prohibited_24_regular"/>
<item android:id="@+id/report" android:title="@string/report_user" android:icon="@drawable/ic_fluent_warning_24_regular"/>
<item android:id="@+id/soft_block" android:title="@string/sk_remove_follower" android:icon="@drawable/ic_fluent_person_delete_24_regular"/>
<item android:id="@+id/block_domain" android:title="@string/block_domain" android:icon="@drawable/ic_fluent_shield_prohibited_24_regular"/>
<item android:id="@+id/hide_boosts" android:title="@string/hide_boosts_from_user" android:icon="@drawable/ic_fluent_arrow_repeat_all_off_24_regular"/>
<item android:id="@+id/manage_user_lists" android:title="@string/sk_lists_with_user" android:icon="@drawable/ic_fluent_people_community_24_regular"/>
<item android:id="@+id/manage_user_lists" android:title="@string/sk_lists_with_user" android:icon="@drawable/ic_fluent_people_list_24_regular"/>
<item android:id="@+id/open_in_browser" android:title="@string/open_in_browser" android:icon="@drawable/ic_fluent_globe_24_regular"/>
</menu>

View File

@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/followed_hashtags" android:title="@string/sk_hashtags_you_follow" android:icon="@drawable/ic_fluent_number_symbol_24_regular" android:showAsAction="always"/>
<item android:id="@+id/manage_user_lists" android:title="@string/sk_your_lists" android:icon="@drawable/ic_fluent_people_list_24_regular" android:showAsAction="always"/>
<item android:id="@+id/bookmarks" android:title="@string/bookmarks" android:icon="@drawable/ic_fluent_bookmark_multiple_24_regular" android:showAsAction="always"/>
<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_drafts_24_regular" android:showAsAction="always"/>

View File

@@ -34,7 +34,7 @@
<string name="sk_list_timelines">Llistes</string>
<string name="sk_follow_requests">Sol·licituds de seguiment</string>
<string name="sk_reject_follow_request">Rebutja la sol·licitud</string>
<string name="sk_lists_with_user">Llistes amb %s</string>
<string name="sk_lists_with_user">Edita les llistes amb %s</string>
<string name="sk_settings_always_reveal_content_warnings">Mostra sempre els avisos de contingut</string>
<string name="sk_settings_contribute">Contribueix a Moshidon</string>
<string name="sk_settings_show_federated_timeline">Mostra la línia de temps federada</string>
@@ -47,4 +47,99 @@
<string name="sk_color_palette_blue">Blau</string>
<string name="sk_color_palette_brown">Marró</string>
<string name="sk_color_palette_yellow">Groc</string>
<string name="sk_timeline_local">Local</string>
<string name="sk_timeline_federated">Federació</string>
<string name="sk_poll_allow_multiple">Permet resposta múltiple</string>
<string name="sk_translate_post">Tradueix</string>
<string name="sk_example_domain">exemple.social</string>
<string name="sk_welcome_title">Et donem la benvinguda!</string>
<string name="sk_clear_recent_languages">Esborra les llengües recents</string>
<string name="sk_settings_translate_only_opened">Tradueix només les publicacions obertes</string>
<string name="sk_bookmark_as">Afig als marcadors amb un altre compte</string>
<string name="sk_bookmarked_as">Afegit marcador com a %s</string>
<string name="sk_already_bookmarked">Ja està als marcadors</string>
<string name="sk_favorite_as">Marca com a preferit amb un altre compte</string>
<string name="sk_favorited_as">Marcat com a preferit com a %s</string>
<string name="sk_already_favorited">Ja està marcat com a preferit</string>
<string name="sk_reblog_as">Impulsa amb un altre compte</string>
<string name="sk_already_reblogged">Ja s\'ha impulsat</string>
<string name="sk_reply_as">Respon amb un altre compte</string>
<string name="sk_settings_uniform_icon_for_notifications">Unifica la icona per a totes les notificacions</string>
<string name="sk_translate_show_original">Mostra l\'original</string>
<string name="sk_translated_using">Traduït amb %s</string>
<string name="sk_post_language">Llengua: %s</string>
<string name="sk_available_languages">Llengües disponibles</string>
<string name="sk_language_name">%s (%s)</string>
<string name="sk_confirm_clear_recent_languages">Segur que vols esborrar les llengües recents\?</string>
<string name="sk_welcome_text">El tauró et saluda! Per a començar, introdueix el domini de la instància a continuació.</string>
<string name="sk_tabs_disable_swipe">Desactiva el desplaçament entre pestanyes</string>
<string name="sk_settings_auth">Configuració de seguretat</string>
<string name="sk_reblogged_as">Impulsat com a %s</string>
<string name="sk_announcements">Anuncis</string>
<string name="sk_list_name_hint">Nom de la llista</string>
<string name="sk_delete_list_confirm">Segur que vols eliminar la llista «%s»\?</string>
<string name="sk_timeline_home">Inici</string>
<string name="sk_settings_profile">Configura el perfil</string>
<string name="sk_settings_posting">Preferències de publicació</string>
<string name="sk_settings_filters">Configura filtres</string>
<string name="sk_settings_rules">Normes</string>
<string name="sk_settings_about">Quant a l\'aplicació</string>
<string name="sk_settings_donate">Dona</string>
<string name="sk_color_palette_material3">Sistema</string>
<string name="sk_color_palette_red">Vermell</string>
<string name="sk_delete_notification">Elimina la notificació</string>
<string name="sk_delete_notification_confirm_action">Elimina la notificació</string>
<string name="sk_delete_notification_confirm">Segur que vols eliminar la notificació\?</string>
<string name="sk_settings_publish_button_text">Text del botó de publicació</string>
<string name="sk_settings_publish_button_text_title">Personalitza el text del botó de publicació</string>
<string name="sk_enable_delete_notifications">Activa l\'eliminació de notificacions</string>
<string name="sk_settings_translation_availability_note_available">%s admet la traducció!</string>
<string name="sk_settings_translation_availability_note_unavailable">Sembla que %s no admet la traducció.</string>
<string name="sk_clear_all_notifications">Esborr totes les notificacions</string>
<string name="sk_clear_all_notifications_confirm_action">Elimina-ho tot</string>
<string name="sk_clear_all_notifications_confirm">Segur que vols esborrar totes les notificacions\?</string>
<string name="sk_undo_reblog">Desfés l\'impuls</string>
<string name="sk_reblog_with_visibility">Impulsa amb visibilitat</string>
<string name="sk_quote_post">Publica sobre açò</string>
<string name="sk_hashtags_you_follow">Etiquetes que segueixes</string>
<string name="sk_copy_link_to_post">Copia l\'enllaç a la publicació</string>
<string name="sk_open_with_account">Obri amb un altre compte</string>
<string name="sk_resource_not_found">No s\'ha trobat el recurs</string>
<string name="sk_forward_report_to">Reenvia a %s</string>
<string name="sk_unsent_posts">Publicacions sense enviar</string>
<string name="sk_draft">Esborrany</string>
<string name="sk_schedule">Programa</string>
<string name="sk_confirm_delete_draft_title">Elimina l\'esborrany</string>
<string name="sk_confirm_delete_draft">Segur que vols eliminar l\'esborrany\?</string>
<string name="sk_confirm_delete_scheduled_post_title">Elimina la publicació programada</string>
<string name="sk_confirm_delete_scheduled_post">Segur que vols eliminar la publicació programada\?</string>
<string name="sk_compose_draft">La publicació es desarà com a esborrany.</string>
<string name="sk_draft_or_schedule">Com a esborrany o programa</string>
<string name="sk_compose_scheduled">Programada per a</string>
<string name="sk_post_scheduled">S\'ha programat la publicació</string>
<string name="sk_draft_saved">S\'ha desat l\'esborrany</string>
<string name="sk_scheduled_too_soon_title">L\'hora de programació és massa prompte</string>
<string name="sk_scheduled_too_soon">La programació s\'ha de fer amb almenys 10 minuts d\'antelació.</string>
<string name="sk_confirm_save_draft">Vols desar com a esborrany\?</string>
<string name="sk_confirm_save_changes">Vols desar els canvis\?</string>
<string name="sk_mark_as_draft">Desa com a esborrany</string>
<string name="sk_schedule_post">Programa la publicació</string>
<string name="sk_schedule_or_draft">Programa o com a esborrany</string>
<string name="sk_compose_no_schedule">No la programes</string>
<string name="sk_compose_no_draft">No deses com a esborrany</string>
<string name="sk_settings_reduce_motion">Redueix el moviment de les animacions</string>
<string name="sk_mark_as_read">Marca com a llegit</string>
<string name="sk_settings_about_instance">Quant a la instància</string>
<string name="sk_settings_single_notification">Mostra només una notificació</string>
<string name="sk_create">Crea</string>
<string name="sk_create_list_title">Crea una llista</string>
<string name="sk_list_replies_policy">Mostra les respostes a</string>
<string name="sk_list_replies_policy_list">membres de la llista</string>
<string name="sk_list_replies_policy_followed">usuaris seguits</string>
<string name="sk_list_replies_policy_none">ningú</string>
<string name="sk_delete_list">Elimina la llista</string>
<string name="sk_edit_list_title">Edita la llista</string>
<string name="sk_your_lists">Llistes</string>
<string name="sk_loading_fediverse_resource_title">Buscant-ho al Fedivers</string>
<string name="sk_loading_resource_on_instance_title">Buscant-ho a %s</string>
</resources>

View File

@@ -1,3 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
</resources>
<string name="sk_confirm_delete_and_redraft">Jste si jisti, že chcete tento příspěvek smazat a přepsat\?</string>
<string name="sk_confirm_unpin_post">Jste si jisti, že chcete tento příspěvek odepnout\?</string>
<string name="sk_confirm_pin_post">Chcete si tento příspěvek připnout na svůj profil\?</string>
<string name="sk_federated_timeline_info_banner">Toto jsou nejnovější příspěvky lidí z vaší federace.</string>
<string name="sk_disable_marquee">Zakázat posouvání textu v titulkových lištách</string>
<string name="sk_welcome_text">Žralok tě zdraví! Chcete-li začít, zadejte níže název domény své domovské instance.</string>
<string name="sk_clear_recent_languages">Vymazat nedávno použité jazyky</string>
<string name="sk_confirm_clear_recent_languages">Jste si jisti, že chcete vymazat nedávno použité jazyky\?</string>
<string name="sk_delete_notification_confirm">Opravdu chcete toto oznámení odstranit\?</string>
<string name="sk_settings_translation_availability_note_unavailable">%s zřejmě nepodporuje překlad.</string>
<string name="sk_clear_all_notifications_confirm">Opravdu chcete vymazat všechna oznámení\?</string>
<string name="sk_loading_fediverse_resource_title">Podívejte se na Fediverse</string>
<string name="sk_loading_resource_on_instance_title">Vyhledávání na %s</string>
<string name="sk_resource_not_found">Zdroj se nepodařilo najít</string>
<string name="sk_scheduled_too_soon">Příspěvek musí být naplánován alespoň 10 minut dopředu.</string>
<string name="sk_confirm_delete_draft">Jste si jistý, že chcete tento navržený příspěvek smazat\?</string>
<string name="sk_confirm_delete_scheduled_post">Určitě chcete tento naplánovaný příspěvek smazat\?</string>
<string name="sk_delete_list_confirm">Opravdu chcete tento seznam odstranit\?</string>
<string name="sk_app_name">Moshidon</string>
<string name="sk_pinned_posts">Připnutý</string>
<string name="sk_delete_and_redraft">vymazat a přepracovat</string>
</resources>

View File

@@ -0,0 +1,71 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="sk_delete_and_redraft">Dileu ac ailddrafftio</string>
<string name="sk_confirm_delete_and_redraft_title">Dileu ac ailddrafftio\'r neges</string>
<string name="sk_confirm_pin_post_title">Pinio i\'ch proffil</string>
<string name="sk_pinning">Wrthi\'n pinio\'r neges…</string>
<string name="sk_unpin_post">Dadbinio o\'ch proffil</string>
<string name="sk_confirm_unpin_post_title">Dadbinio neges o\'ch proffil</string>
<string name="sk_unpinning">Wrthi\'n dadbinio\'r neges…</string>
<string name="sk_settings_show_replies">Dangos ymatebion</string>
<string name="sk_list_timelines">Rhestri</string>
<string name="sk_settings_always_reveal_content_warnings">Datguddio rhybuddion cynnwys bob tro</string>
<string name="sk_settings_contribute">Cyfrannu at Moshidon</string>
<string name="sk_notification_type_status">Negeseuon</string>
<string name="sk_color_palette_material3">System</string>
<string name="sk_color_palette_pink">Pinc</string>
<string name="sk_color_palette_purple">Porffor</string>
<string name="sk_color_palette_green">Gwyrdd</string>
<string name="sk_color_palette_blue">Glas</string>
<string name="sk_color_palette_brown">Brown</string>
<string name="sk_color_palette_red">Coch</string>
<string name="sk_app_name">Moshidon</string>
<string name="sk_confirm_pin_post">Hoffech chi binio\'r neges hon i\'ch proffil\?</string>
<string name="sk_visibility_unlisted">Heb ei restru</string>
<string name="sk_settings_load_new_posts">Llwytho negeseuon newydd yn ddiofyn</string>
<string name="sk_settings_app_version">Moshidon v%1$s (%2$d)</string>
<string name="sk_update_available">Mae Moshidon %s yn barod i\'w lawrlwytho.</string>
<string name="sk_update_ready">Mae Moshidon %s wedi ei lawrlwytho ac yn barod i\'w osod.</string>
<string name="sk_color_palette_yellow">Melyn</string>
<string name="sk_translate_post">Cyfieithu</string>
<string name="sk_translate_show_original">Dangos y gwreiddiol</string>
<string name="sk_post_language">Iaith: %s</string>
<string name="sk_welcome_title">Croeso!</string>
<string name="sk_settings_auth">Gosodiadau diogelwch</string>
<string name="sk_pin_post">Pinio i\'ch proffil</string>
<string name="sk_confirm_delete_and_redraft">Ydych chi\'n siŵr eich bod am ddileu ac ailddrafftio\'r neges hon\?</string>
<string name="sk_confirm_unpin_post">Ydych chi\'n siŵr eich bod am ddadbinio\'r neges hon\?</string>
<string name="sk_notify_posts">Hysbysiadau negeseuon</string>
<string name="sk_settings_color_palette">Palet lliwiau</string>
<string name="sk_no_update_available">Dim diweddariad ar gael</string>
<string name="sk_check_for_update">Gwirio am ddiweddariad</string>
<string name="sk_poll_allow_multiple">Caniatáu mwy nag un dewis</string>
<string name="sk_language_name">%s (%s)</string>
<string name="sk_tabs_disable_swipe">Analluogi llusgo rhwng tabiau</string>
<string name="sk_settings_posting">Dewisiadau postio</string>
<string name="sk_settings_rules">Rheolau</string>
<string name="sk_settings_donate">Rhoddi</string>
<string name="sk_settings_publish_button_text">Testun y botwm cyhoeddi</string>
<string name="sk_settings_translation_availability_note_unavailable">Nid yw\'n ymddangos bod %s yn cefnogi cyfieithu.</string>
<string name="sk_hashtags_you_follow">Hashnodau rydych chi\'n eu dilyn</string>
<string name="sk_copy_link_to_post">Copïo dolen i\'r neges</string>
<string name="sk_draft">Drafft</string>
<string name="sk_confirm_delete_draft_title">Dileu\'r drafft</string>
<string name="sk_draft_saved">Drafft wedi\'i gadw</string>
<string name="sk_timeline_home">Hafan</string>
<string name="sk_mark_media_as_sensitive">Nodi fel cynnwys sensitif</string>
<string name="sk_available_languages">Pob iaith</string>
<string name="sk_clear_recent_languages">Clirio\'r ieithoedd a ddefnyddiwyd yn ddiweddar</string>
<string name="sk_settings_about">Ynghylch yr ap</string>
<string name="sk_clear_all_notifications">Dileu pob hysbysiad</string>
<string name="sk_clear_all_notifications_confirm_action">Dileu\'r cwbl</string>
<string name="sk_clear_all_notifications_confirm">Ydych chi\'n siŵr eich bod am ddileu pob hysbysiad\?</string>
<string name="sk_enable_delete_notifications">Galluogi dileu hysbysiadau</string>
<string name="sk_settings_publish_button_text_title">Addasu testun y botwm cyhoeddi</string>
<string name="sk_settings_translation_availability_note_available">Mae %s yn cefnogi cyfieithu!</string>
<string name="sk_unsent_posts">Negeseuon heb eu hanfon</string>
<string name="sk_confirm_delete_draft">Ydych chi\'n siŵr eich bod am ddileu\'r neges ddrafft hon\?</string>
<string name="sk_compose_draft">Caiff y neges ei chadw fel drafft.</string>
<string name="sk_confirm_save_changes">Cadw newidiadau\?</string>
<string name="sk_announcements">Cyhoeddiadau</string>
</resources>

View File

@@ -13,21 +13,25 @@
<string name="user_boosted">%s hat diesen Beitrag geteilt</string>
<string name="in_reply_to">Als Antwort auf %s</string>
<string name="notifications">Benachrichtigungen</string>
<string name="user_followed_you">folgt dir jetzt</string>
<string name="user_sent_follow_request">hat dir eine Follower-Anfrage gesendet</string>
<string name="user_favorited">favorisierte</string>
<string name="notification_boosted">teilte</string>
<string name="poll_ended">Abstimmung beendet</string>
<string name="time_seconds">vor %d Sekunden</string>
<string name="time_minutes">vor %d Minuten</string>
<string name="time_hours">vor %d Stunden</string>
<string name="time_days">vor %d Tagen</string>
<string name="share_toot_title">Teilen</string>
<string name="settings">Einstellungen</string>
<string name="publish">Veröffentlichen</string>
<string name="discard_draft">Entwurf verwerfen?</string>
<string name="discard">Verwerfen</string>
<string name="cancel">Abbrechen</string>
<plurals name="followers">
<item quantity="one">Follower</item>
<item quantity="other">Follower</item>
@@ -198,6 +202,7 @@
<string name="category_regional">Regional</string>
<string name="category_tech">Technik</string>
<string name="confirm_email_title">Eine letzte Sache noch</string>
<!-- %s is the email address -->
<string name="confirm_email_subtitle">Tippe auf den Link, den wir dir per E-Mail geschickt haben, um dein Konto zu verifizieren.</string>
<string name="confirm_email_didnt_get">Keinen Link bekommen?</string>
<string name="resend">Erneut abschicken</string>
@@ -315,6 +320,7 @@
<string name="manually_approves_followers">Manuelles Genehmigen von Followern</string>
<string name="current_account">Aktuelles Konto</string>
<string name="log_out_account">%s abmelden</string>
<!-- translators: %,d is a valid placeholder, it formats the number with locale-dependent grouping separators -->
<plurals name="x_followers">
<item quantity="one">%,d Follower</item>
@@ -393,6 +399,7 @@
<string name="login_title">Willkommen zurück</string>
<string name="login_subtitle">Melde dich mit dem Server an, auf dem du dein Konto erstellt hast.</string>
<string name="server_url">Serveradresse</string>
<!-- {logo} is a placeholder that is replaced with the Mastodon logo image at runtime. Please copy it into your translation as is. -->
<string name="welcome_page1_title">Was ist {logo}?</string>
<string name="welcome_page1_text">Stellen Sie sich vor, Sie haben eine E-Mail-Adresse mit der Endung @example.com.\n\nSie können weiterhin E-Mails von jeder Person senden und empfangen, auch wenn deren E-Mail-Adresse auf @gmail.com oder @icloud.com oder @example.com endet.</string>
<string name="welcome_page2_title">Mastodon ist genau so.</string>
@@ -414,4 +421,4 @@
<string name="category_special_interests">Besondere Interessen</string>
<string name="signup_passwords_dont_match">Passwörter stimmen nicht überein</string>
<string name="loading_fediverse_resource_title">Ich habe im Fediverse nachgeschaut...</string>
</resources>
</resources>

View File

@@ -11,7 +11,7 @@
<string name="sk_pinning">Wird angeheftet…</string>
<string name="sk_unpin_post">Von Profil lösen</string>
<string name="sk_confirm_unpin_post_title">Angehefteten Beitrag von Profil lösen</string>
<string name="sk_confirm_unpin_post">Bist du dir sicher, dass du den angehefteten Beitrag von deinem Profil lösen möchtest\?</string>
<string name="sk_confirm_unpin_post">Diesen angehefteten Beitrag wirklich von deinem Profil lösen\?</string>
<string name="sk_unpinning">Wird vom Profil gelöst…</string>
<string name="sk_image_description">Bildbeschreibung</string>
<string name="sk_visibility_unlisted">Nicht gelistet</string>
@@ -27,14 +27,14 @@
<string name="sk_federated_timeline_info_banner">Das sind die neuesten Beiträge von Personen, die in der Föderation deines Servers sind.</string>
<string name="sk_update_available">Moshidon %s ist zum Herunterladen bereit.</string>
<string name="sk_update_ready">Moshidon %s wurde heruntergeladen und kann jetzt installiert werden.</string>
<string name="sk_changelog">Changelog:</string>
<string name="sk_changelog">Änderungsverlauf:</string>
<string name="sk_check_for_update">Auf Update prüfen</string>
<string name="sk_no_update_available">Kein Update verfügbar</string>
<string name="sk_list_timelines">Listen</string>
<string name="sk_follow_requests">Folgeanfragen</string>
<string name="sk_accept_follow_request">Folgeanfrage akzeptieren</string>
<string name="sk_reject_follow_request">Folgeanfrage ablehnen</string>
<string name="sk_lists_with_user">Listen mit %s</string>
<string name="sk_lists_with_user">Listen mit %s bearbeiten</string>
<string name="sk_settings_always_reveal_content_warnings">Inhaltswarnungen immer ausklappen</string>
<string name="sk_disable_marquee">Laufschrift in Titelleisten deaktivieren</string>
<string name="sk_disable_dividers">Beitrags Trennung deaktivieren</string>
@@ -67,6 +67,9 @@
<string name="sk_example_domain">beispiel.social</string>
<string name="sk_tabs_disable_swipe">Wischen zwischen Tabs deaktivieren</string>
<string name="sk_settings_profile">Profil einrichten</string>
<string name="sk_personal_note">Notiz zu diesem Profil hinzufügen</string>
<string name="sk_personal_note_confirm">Änderungen der Notiz bestätigen</string>
<string name="sk_personal_note_update_failed">Speichern der Notiz fehlgeschlagen</string>
<string name="sk_settings_posting">Einstellungen für Beiträge</string>
<string name="sk_settings_filters">Filter konfigurieren</string>
<string name="sk_settings_auth">Sicherheits-Einstellungen</string>
@@ -95,13 +98,13 @@
<string name="sk_open_in_account">In anderem Konto öffnen</string>
<string name="sk_open_with_account">Mit anderem Konto öffnen</string>
<string name="sk_resource_not_found">Ressource nicht gefunden</string>
<string name="sk_bookmark_as">Lesezeichen in anderem Konto</string>
<string name="sk_bookmark_as">Lesezeichen mit anderem Konto</string>
<string name="sk_bookmarked_as">Lesezeichen gesetzt als %s</string>
<string name="sk_already_bookmarked">Bereits in den Lesezeichen</string>
<string name="sk_favorite_as">Favorit von anderem Konto</string>
<string name="sk_favorite_as">Favorit mit anderem Konto</string>
<string name="sk_favorited_as">Favorisiert als %s</string>
<string name="sk_already_favorited">Bereits favorisiert</string>
<string name="sk_reblog_as">Von einem anderen Konto boosten</string>
<string name="sk_reblog_as">Mit einem anderen Konto boosten</string>
<string name="sk_reblogged_as">Geboostet als %s</string>
<string name="sk_already_reblogged">Bereits geboostet</string>
<string name="sk_reply_as">Antworten mit anderem Konto</string>
@@ -121,14 +124,14 @@
<string name="sk_post_scheduled">Beitrag geplant</string>
<string name="sk_scheduled_too_soon_title">Geplante Zeit ist zu früh</string>
<string name="sk_scheduled_too_soon">Der Beitrag muss mindestens 10 Minuten in der Zukunft eingeplant werden.</string>
<string name="sk_confirm_save_draft">Entwurf speichern?</string>
<string name="sk_confirm_save_changes">Änderungen speichern?</string>
<string name="sk_confirm_save_draft">Entwurf speichern\?</string>
<string name="sk_confirm_save_changes">Änderungen speichern\?</string>
<string name="sk_mark_as_draft">Als Entwurf markieren</string>
<string name="sk_schedule_post">Beitrag planen</string>
<string name="sk_schedule_or_draft">Planen oder Entwurf</string>
<string name="sk_schedule_or_draft">Planen oder Vorlage</string>
<string name="sk_compose_no_schedule">Nicht planen</string>
<string name="sk_compose_no_draft">Nicht entwerfen</string>
<string name="sk_settings_reduce_motion">Bewegungen in Animationen reduzieren</string>
<string name="sk_settings_reduce_motion">Bewegung in Animationen reduzieren</string>
<string name="sk_bot_account">Dies ist ein Bot-Konto</string>
<string name="sk_no_image_desc_title">Keine Bildbeschreibung</string>
<string name="sk_no_image_desc">Die enthaltenen Bilder haben keine Beschreibung. Bitte füge eine Beschreibung hinzu, damit auch sehbehinderte Personen teilnehmen können.</string>
@@ -138,7 +141,30 @@
<string name="sk_keep_only_latest_notification">Nur neueste Benachrichtigung behalten</string>
<string name="sk_announcements">Ankündigungen</string>
<string name="sk_mark_as_read">Als gelesen markieren</string>
<string name="sk_settings_about_instance">Über die Instanz</string>
<string name="sk_settings_single_notification">Nur eine Benachrichtigung anzeigen</string>
<string name="sk_create">Erstellen</string>
<string name="sk_create_list_title">Liste erstellen</string>
<string name="sk_list_name_hint">Name der Liste</string>
<string name="sk_list_replies_policy">Mit Antworten von</string>
<string name="sk_list_replies_policy_list">Listen-Mitgliedern</string>
<string name="sk_list_replies_policy_followed">gefolgten User_innen</string>
<string name="sk_list_replies_policy_none">niemandem</string>
<string name="sk_delete_list">Liste löschen</string>
<string name="sk_delete_list_confirm">Liste “%s” wirklich löschen\?</string>
<string name="sk_edit_list_title">Liste bearbeiten</string>
<string name="sk_your_lists">Deine Listen</string>
<string name="sk_timeline_home">Start</string>
<string name="sk_timeline_local">Lokal</string>
<string name="sk_timeline_federated">Föderiert</string>
<string name="sk_recent_searches_placeholder">Tippe, um die Suche zu starten</string>
<string name="sk_remove_follower">Nicht mehr folgen lassen</string>
<string name="sk_remove_follower_confirm">%s als Follower_in entfernen\? Die Person wird dabei blockiert und gleich wieder freigegeben.</string>
<string name="sk_do_remove_follower">Entfernen</string>
<string name="sk_remove_follower_success">Follower_in erfolgreich entfernt</string>
<!-- accessibility labels-->
<string name="sk_poll_option_add">Neue Umfrageoption hinzufügen</string>
<string name="sk_fab_compose">Verfassen</string>
<string name="sk_sending_error">Fehler beim Veröffentlichen</string>
</resources>
</resources>

View File

@@ -32,7 +32,7 @@
<string name="sk_follow_requests">Solicitudes de seguimiento</string>
<string name="sk_accept_follow_request">Aceptar solicitud de seguimiento</string>
<string name="sk_reject_follow_request">Rechazar solicitud de seguimiento</string>
<string name="sk_lists_with_user">Listas con %s</string>
<string name="sk_lists_with_user">Editar listas con %s</string>
<string name="sk_settings_always_reveal_content_warnings">Mostrar siempre advertencias de contenido</string>
<string name="sk_disable_marquee">Desactivar desplazamiento de texto en barras del título</string>
<string name="sk_settings_contribute">Contribuir a Moshidon</string>
@@ -94,12 +94,12 @@
<string name="sk_already_bookmarked">Ya marcado</string>
<string name="sk_favorited_as">Favorito como %s</string>
<string name="sk_already_favorited">Ya es un favorito</string>
<string name="sk_reblog_as">Compartir desde otra cuenta</string>
<string name="sk_reblog_as">Compartir con otra cuenta</string>
<string name="sk_reblogged_as">Compartido como %s</string>
<string name="sk_already_reblogged">Ya se volvió a publicar</string>
<string name="sk_reply_as">Responder con otra cuenta</string>
<string name="sk_bookmark_as">Marcador de otra cuenta</string>
<string name="sk_favorite_as">Favoritos de otra cuenta</string>
<string name="sk_bookmark_as">Marcar con otra cuenta</string>
<string name="sk_favorite_as">Favoritos con otra cuenta</string>
<string name="sk_settings_uniform_icon_for_notifications">Mismo icono para todas las notificaciones</string>
<string name="sk_forward_report_to">Reenviar a %s</string>
<string name="sk_unsent_posts">Mensajes no enviados</string>
@@ -120,4 +120,26 @@
<string name="sk_confirm_save_changes">¿Guardar los cambios\?</string>
<string name="sk_mark_as_draft">Marcar como borrador</string>
<string name="sk_schedule_post">Programar la publicación</string>
<string name="sk_schedule_or_draft">Calendario o proyecto</string>
<string name="sk_compose_no_schedule">No programar</string>
<string name="sk_compose_no_draft">No hagas borradores</string>
<string name="sk_settings_reduce_motion">Reducir el movimiento en las animaciones</string>
<string name="sk_announcements">Anuncios</string>
<string name="sk_mark_as_read">Marcar como leído</string>
<string name="sk_settings_about_instance">Sobre la instancia</string>
<string name="sk_settings_single_notification">Mostrar solo una notificación</string>
<string name="sk_create">Crear</string>
<string name="sk_create_list_title">Crear una lista</string>
<string name="sk_list_name_hint">Lista de nombres</string>
<string name="sk_list_replies_policy">Mostrar respuestas a</string>
<string name="sk_list_replies_policy_followed">Usuarios a los que sigues</string>
<string name="sk_list_replies_policy_none">Ninguno</string>
<string name="sk_delete_list">Eliminar la lista</string>
<string name="sk_delete_list_confirm">¿Está seguro de que desea eliminar esta lista\?</string>
<string name="sk_edit_list_title">Editar la lista</string>
<string name="sk_your_lists">Tus listas</string>
<string name="sk_list_replies_policy_list">Lista de miembros</string>
<string name="sk_timeline_home">Inicio</string>
<string name="sk_timeline_federated">Federación</string>
<string name="sk_timeline_local">Local</string>
</resources>

View File

@@ -36,12 +36,12 @@
<string name="sk_translated_using">%s-ekin itzulia</string>
<string name="sk_post_language">Hizkuntza: %s</string>
<string name="sk_language_name">%s (%s)</string>
<string name="sk_bookmark_as">Beste kontu bateko laster-marka</string>
<string name="sk_bookmark_as">Beste kontu baten laster-marka</string>
<string name="sk_bookmarked_as">%s bezala laster-markara eramana</string>
<string name="sk_already_bookmarked">Dagoeneko laster-marka da</string>
<string name="sk_favorite_as">Beste kontu bateko gogokoa</string>
<string name="sk_favorite_as">Beste kontu baten gogokoa</string>
<string name="sk_favorited_as">%s bezela dago gogokoetan</string>
<string name="sk_reblog_as">Beste kontu batetik bultzatua</string>
<string name="sk_reblog_as">Beste kontu batekin bultzatua</string>
<string name="sk_reblogged_as">%s bezela bultzatua</string>
<string name="sk_already_reblogged">Dagoeneko bultzatua izan da</string>
<string name="sk_reply_as">Erantzun beste kontu batekin</string>
@@ -70,7 +70,7 @@
<string name="sk_settings_publish_button_text">Argitaratze botoiaren testua</string>
<string name="sk_settings_publish_button_text_title">Pertsonalizatu argitaratze botoiaren testua</string>
<string name="sk_settings_translation_availability_note_available">%s-k itzulpena onartzen du!</string>
<string name="sk_settings_translation_availability_note_unavailable">%s ez da itzulpena onartzen duten hizkuntzen artean ageri.</string>
<string name="sk_settings_translation_availability_note_unavailable">%s ez da itzulpena onartzen duten instantzien artean ageri.</string>
<string name="sk_clear_all_notifications">Ezabatu jakinarazpen guztiak</string>
<string name="sk_clear_all_notifications_confirm_action">Ezabatu dena</string>
<string name="sk_clear_all_notifications_confirm">Ziur al zaude jakinarazpen guztiak ezabatu nahi dituzula\?</string>
@@ -101,4 +101,27 @@
<string name="sk_settings_translate_only_opened">Irekitako argitalpenak soilik itzuli</string>
<string name="sk_already_favorited">Dagoeneko gogokoen artean dago</string>
<string name="sk_settings_uniform_icon_for_notifications">Ikono berdina jakinarazpen guztietarako</string>
<string name="sk_forward_report_to">%s-(e)ri birbidali</string>
<string name="sk_unsent_posts">Bidali gabeko argitalpenak</string>
<string name="sk_draft">Zirriborroa</string>
<string name="sk_schedule">Programatu</string>
<string name="sk_confirm_delete_draft_title">Ezabatu zirriborroa</string>
<string name="sk_confirm_delete_draft">Ziur al zaude zirriborro hau ezabatu nahi duzula\?</string>
<string name="sk_confirm_delete_scheduled_post_title">Ezabatu programatutako argitalpena</string>
<string name="sk_confirm_delete_scheduled_post">Ziur al zaude programatutako argitalpena ezabatu nahi duzula\?</string>
<string name="sk_draft_or_schedule">Zirriborrotara bidali edo programatu</string>
<string name="sk_compose_draft">Argitalpena zirriborro bezala gordeko da.</string>
<string name="sk_compose_scheduled">Honentzako programatu</string>
<string name="sk_draft_saved">Zirriborroa gorde da</string>
<string name="sk_post_scheduled">Argitalpena programatu da</string>
<string name="sk_scheduled_too_soon_title">Programatze denbora murritzegia da</string>
<string name="sk_scheduled_too_soon">Argitalpena gutxienez 10 minutu lehenago programatu behar da.</string>
<string name="sk_confirm_save_changes">Aldaketak gorde nahi dituzu\?</string>
<string name="sk_confirm_save_draft">Zirriborroa gorde nahi duzu\?</string>
<string name="sk_mark_as_draft">Markatu zirriborro gisa</string>
<string name="sk_schedule_post">Argitalpena programatu</string>
<string name="sk_schedule_or_draft">Programatu edo zirriborro egin</string>
<string name="sk_compose_no_schedule">Ez programatu</string>
<string name="sk_compose_no_draft">Ez egin zirriborrorik</string>
<string name="sk_settings_reduce_motion">Animazioen mugimenduak gutxitu</string>
</resources>

View File

@@ -25,7 +25,7 @@
<string name="sk_follow_requests">Suivre les demandes</string>
<string name="sk_accept_follow_request">Accepter la demande de suivi</string>
<string name="sk_reject_follow_request">Refuser la demande de suivi</string>
<string name="sk_lists_with_user">Listes avec %s</string>
<string name="sk_lists_with_user">Modifier les listes avec %s</string>
<string name="sk_settings_always_reveal_content_warnings">Toujours afficher les avertissements de contenu</string>
<string name="sk_disable_marquee">Désactiver le défilement du texte dans les barres de titre</string>
<string name="sk_settings_contribute">Contribuez à Moshidon</string>
@@ -77,7 +77,7 @@
<string name="sk_enable_delete_notifications">Activer la suppression des notifications</string>
<string name="sk_settings_publish_button_text_title">Personnaliser le texte du bouton Publier</string>
<string name="sk_settings_publish_button_text">Texte du bouton Publier</string>
<string name="sk_settings_hide_translate_in_timeline">Masquer le bouton de traduction dans la timeline</string>
<string name="sk_settings_translate_only_opened">Masquer le bouton de traduction dans la timeline</string>
<string name="sk_settings_translation_availability_note_available">%s prend en charge la traduction !</string>
<string name="sk_settings_translation_availability_note_unavailable">%s ne semble pas prendre en charge la traduction.</string>
<string name="sk_clear_all_notifications_confirm">Voulez-vous vraiment supprimer toutes les notifications \?</string>
@@ -91,7 +91,7 @@
<string name="sk_loading_resource_on_instance_title">Rechercher sur %s</string>
<string name="sk_open_with_account">Ouvrir avec un autre compte</string>
<string name="sk_resource_not_found">La ressource est introuvable</string>
<string name="sk_favorite_as">Favoris d\'un autre compte</string>
<string name="sk_favorite_as">Mettre en favoris avec un autre compte</string>
<string name="sk_already_bookmarked">Déjà mis en signet</string>
<string name="sk_already_favorited">Déjà mis en favori</string>
<string name="sk_reblogged_as">Reposté en tant que %s</string>
@@ -99,8 +99,8 @@
<string name="sk_bookmarked_as">Ajouté aux signets en tant que %s</string>
<string name="sk_favorited_as">Ajouté aux favoris en tant que %s</string>
<string name="sk_reply_as">Répondre avec un autre compte</string>
<string name="sk_bookmark_as">Mettre en signet sur un autre compte</string>
<string name="sk_reblog_as">Reposter depuis un autre compte</string>
<string name="sk_bookmark_as">Mettre en signet avec un autre compte</string>
<string name="sk_reblog_as">Reposter avec un autre compte</string>
<string name="sk_settings_uniform_icon_for_notifications">Icône uniforme pour toutes les notifications</string>
<string name="sk_forward_report_to">Transférer à %s</string>
<string name="sk_unsent_posts">Messages non envoyés</string>
@@ -110,9 +110,9 @@
<string name="sk_confirm_delete_scheduled_post">Voulez-vous vraiment supprimer ce message planifié \?</string>
<string name="sk_schedule">Planifier</string>
<string name="sk_confirm_delete_scheduled_post_title">Supprimer le message planifié</string>
<string name="sk_draft_or_schedule">Rédiger ou planifier</string>
<string name="sk_draft_or_schedule">Rédiger un brouillon ou planifier</string>
<string name="sk_compose_draft">Le message sera enregistré en tant que brouillon.</string>
<string name="sk_compose_scheduled">Planifié pour</string>
<string name="sk_compose_scheduled">Planifié pour le</string>
<string name="sk_draft_saved">Brouillon enregistré</string>
<string name="sk_post_scheduled">Message planifié</string>
<string name="sk_scheduled_too_soon_title">L\'heure prévue est trop proche</string>
@@ -121,4 +121,27 @@
<string name="sk_mark_as_draft">Marquer comme brouillon</string>
<string name="sk_schedule_post">Planifier le message</string>
<string name="sk_confirm_save_changes">Sauvegarder les modifications \?</string>
<string name="sk_compose_no_schedule">Ne pas planifier</string>
<string name="sk_compose_no_draft">Ne pas marquer comme brouillon</string>
<string name="sk_schedule_or_draft">Planifier ou rédiger un brouillon</string>
<string name="sk_settings_reduce_motion">Réduire le mouvement dans les animations</string>
<string name="sk_mark_as_read">Marquer comme lu</string>
<string name="sk_settings_about_instance">À propos de l\'instance</string>
<string name="sk_create">Créer</string>
<string name="sk_create_list_title">Créer une liste</string>
<string name="sk_list_name_hint">Nom de la liste</string>
<string name="sk_list_replies_policy">Afficher les réponses à</string>
<string name="sk_list_replies_policy_list">membres de la liste</string>
<string name="sk_list_replies_policy_followed">utilisateurs suivis</string>
<string name="sk_list_replies_policy_none">personne</string>
<string name="sk_delete_list">Supprimer la liste</string>
<string name="sk_edit_list_title">Modifier la liste</string>
<string name="sk_announcements">Annonces</string>
<string name="sk_settings_single_notification">Afficher une seule notification</string>
<string name="sk_delete_list_confirm">Êtes-vous sûr de vouloir supprimer la liste \"%s\" \?</string>
<string name="sk_your_lists">Vos listes</string>
<string name="sk_timeline_federated">Fédération</string>
<string name="sk_timeline_local">Communauté</string>
<string name="sk_timeline_home">Accueil</string>
<string name="sk_recent_searches_placeholder">Tapez quelque chose pour commencer la recherche</string>
</resources>

View File

@@ -1,3 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
</resources>
<string name="sk_app_name">Moshidon</string>
<string name="sk_delete_and_redraft">Eliminar e rescribir</string>
<string name="sk_confirm_delete_and_redraft">Tes a certeza de querere eliminar e rescribir esta publicación\?</string>
<string name="sk_pinned_posts">Fixado</string>
<string name="sk_confirm_delete_and_redraft_title">Elimina e rescribe a Publicación</string>
<string name="sk_pin_post">Fixar no perfil</string>
<string name="sk_confirm_pin_post_title">Fixar publicación ao perfil</string>
<string name="sk_confirm_pin_post">Queres fixar esta publicación ao teu perfil\?</string>
<string name="sk_pinning">Fixando a publicación…</string>
<string name="sk_unpin_post">Desafixar do perfil</string>
<string name="sk_confirm_unpin_post_title">Desafixar publicación do perfil</string>
<string name="sk_confirm_unpin_post">Tes a certeza de querer desafixar esta publicación\?</string>
<string name="sk_unpinning">Desafixando publicación…</string>
<string name="sk_image_description">Descrición da imaxe</string>
<string name="sk_lists_with_user">Editar listas con %s</string>
<string name="sk_visibility_unlisted">Non listado</string>
<string name="sk_settings_show_replies">Mostrar respostas</string>
<string name="sk_settings_show_boosts">Mostrar promocións</string>
<string name="sk_settings_load_new_posts">Cargar automáticamente novas publicacións</string>
<string name="sk_settings_show_interaction_counts">Mostrar contadores de interaccións</string>
<string name="sk_settings_app_version">Moshidon v%1$s (%2$d)</string>
<string name="sk_mark_media_as_sensitive">Marcar multimedia como sensible</string>
<string name="sk_user_post_notifications_on">Acender notificación de publicación para %s</string>
<string name="sk_user_post_notifications_off">Apagar notificación de publicación para %s</string>
<string name="sk_federated_timeline">Federación</string>
<string name="sk_federated_timeline_info_banner">Estas son as publicacións máis recentes das persoas da túa federación.</string>
<string name="sk_update_available">Moshidon %s está lista para descargar.</string>
<string name="sk_update_ready">Moshidon %s foi descargada e está lista para instalar.</string>
<string name="sk_check_for_update">Comprobar actualizacións</string>
<string name="sk_no_update_available">Non hai actualizacións</string>
<string name="sk_list_timelines">Listas</string>
<string name="sk_follow_requests">Solicitudes de seguimento</string>
<string name="sk_accept_follow_request">Aceptar solicitude</string>
<string name="sk_reject_follow_request">Rexeitar solicitude</string>
<string name="sk_settings_always_reveal_content_warnings">Mostrar sempre o contido con avisos</string>
</resources>

View File

@@ -1,3 +1,127 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
</resources>
<string name="sk_notification_type_status">Hozzászólások</string>
<string name="sk_notify_posts">Postai értesítések</string>
<string name="sk_translate_post">Lefordítani</string>
<string name="sk_post_language">Nyelv: %s</string>
<string name="sk_clear_recent_languages">Nemrég használt nyelvek törlése</string>
<string name="sk_welcome_title">Üdvözöljük!</string>
<string name="sk_example_domain">példa.social</string>
<string name="sk_confirm_pin_post">Szeretné ezt a bejegyzést a profiljához tűzni\?</string>
<string name="sk_confirm_unpin_post">Biztos vagy benne, hogy vissza akarod törölni ezt a posztot\?</string>
<string name="sk_pinned_posts">Tűzött</string>
<string name="sk_delete_and_redraft">Törlés és újraszövegezés</string>
<string name="sk_pin_post">Pin a profilhoz</string>
<string name="sk_confirm_pin_post_title">Hozzászólás rögzítése a profilhoz</string>
<string name="sk_pinning">Pinning poszt…</string>
<string name="sk_unpin_post">Unpin a profilból</string>
<string name="sk_confirm_unpin_post_title">Hozzászólás feloldása a profilból</string>
<string name="sk_unpinning">Unpinning poszt…</string>
<string name="sk_settings_show_replies">Válaszok megjelenítése</string>
<string name="sk_visibility_unlisted">Felsorolatlan</string>
<string name="sk_app_name">Moshidon</string>
<string name="sk_settings_load_new_posts">Automatikusan töltse be az új hozzászólásokat</string>
<string name="sk_settings_app_version">Moshidon v%1$s (%2$d)</string>
<string name="sk_user_post_notifications_on">Bekapcsoltuk a postai értesítéseket %s számára</string>
<string name="sk_user_post_notifications_off">Kikapcsoltam a postai értesítéseket %s számára</string>
<string name="sk_mark_media_as_sensitive">A média érzékenynek jelölése</string>
<string name="sk_federated_timeline">Föderáció</string>
<string name="sk_update_ready">A Moshidon %s letöltődött és telepítésre kész.</string>
<string name="sk_disable_marquee">A görgethető szöveg kikapcsolása a címsorokban</string>
<string name="sk_check_for_update">Frissítés ellenőrzése</string>
<string name="sk_no_update_available">Nincs frissítés elérhető</string>
<string name="sk_list_timelines">Listák</string>
<string name="sk_follow_requests">Kérések követése</string>
<string name="sk_accept_follow_request">Követési kérés elfogadása</string>
<string name="sk_lists_with_user">%s-t tartalmazó listák</string>
<string name="sk_settings_always_reveal_content_warnings">Mindig fedje fel a tartalmi figyelmeztetéseket</string>
<string name="sk_settings_contribute">Hozzájárulni Moshidon</string>
<string name="sk_settings_show_federated_timeline">Összevont idővonal megjelenítése</string>
<string name="sk_confirm_clear_recent_languages">Biztos, hogy törölni szeretné a nemrég használt nyelveket\?</string>
<string name="sk_available_languages">Elérhető nyelvek</string>
<string name="sk_language_name">%s (%s)</string>
<string name="sk_settings_translate_only_opened">Csak a megnyitott hozzászólások lefordítása</string>
<string name="sk_already_reblogged">Már reblogoltam</string>
<string name="sk_reblogged_as">Átlogolva mint %s</string>
<string name="sk_reblog_as">Reblog más fiókkal</string>
<string name="sk_already_favorited">Már kedvelt</string>
<string name="sk_favorited_as">Kedvelt mint %s</string>
<string name="sk_favorite_as">Kedvenc más fiókkal</string>
<string name="sk_already_bookmarked">Már könyvjelzővel van ellátva</string>
<string name="sk_bookmarked_as">Könyvjelzőként %s</string>
<string name="sk_bookmark_as">Könyvjelző más fiókkal</string>
<string name="sk_settings_uniform_icon_for_notifications">Egységes ikon minden értesítéshez</string>
<string name="sk_reply_as">Válasz más fiókkal</string>
<string name="sk_translate_show_original">Eredeti megjelenítése</string>
<string name="sk_translated_using">Fordítás %s használatával</string>
<string name="sk_settings_profile">Profil beállítása</string>
<string name="sk_settings_posting">Postázási preferenciák</string>
<string name="sk_settings_filters">Szűrők konfigurálása</string>
<string name="sk_settings_auth">Biztonsági beállítások</string>
<string name="sk_settings_rules">Szabályok</string>
<string name="sk_settings_donate">Adományozni</string>
<string name="sk_settings_color_palette">Színek palettája</string>
<string name="sk_color_palette_material3">Rendszer</string>
<string name="sk_color_palette_green">Zöld</string>
<string name="sk_color_palette_blue">Kék</string>
<string name="sk_color_palette_brown">Barna</string>
<string name="sk_color_palette_red">Piros</string>
<string name="sk_color_palette_yellow">Sárga</string>
<string name="sk_color_palette_pink">Rózsaszín</string>
<string name="sk_color_palette_purple">Lila</string>
<string name="sk_delete_notification_confirm">Biztos, hogy törölni szeretné ezt az értesítést\?</string>
<string name="sk_enable_delete_notifications">Értesítések törlésének engedélyezése</string>
<string name="sk_settings_publish_button_text">Közzététel gomb szövege</string>
<string name="sk_settings_publish_button_text_title">Közzététel gomb szövegének testreszabása</string>
<string name="sk_delete_notification">Értesítés törlése</string>
<string name="sk_delete_notification_confirm_action">Értesítés törlése</string>
<string name="sk_settings_translation_availability_note_available">%s támogatja a fordítást!</string>
<string name="sk_settings_translation_availability_note_unavailable">Úgy tűnik, hogy a %s nem támogatja a fordítást.</string>
<string name="sk_clear_all_notifications_confirm">Biztos, hogy törölni szeretné az összes értesítést\?</string>
<string name="sk_clear_all_notifications">Minden értesítés törlése</string>
<string name="sk_clear_all_notifications_confirm_action">Törölje az összes</string>
<string name="sk_loading_fediverse_resource_title">Utánanézek a Fediverse-en</string>
<string name="sk_reblog_with_visibility">Reblog láthatósággal</string>
<string name="sk_quote_post">Poszt erről</string>
<string name="sk_undo_reblog">Reblog visszavonása</string>
<string name="sk_copy_link_to_post">Link másolása a bejegyzéshez</string>
<string name="sk_hashtags_you_follow">Követett hashtagek</string>
<string name="sk_loading_resource_on_instance_title">Utánanézek a %s oldalon</string>
<string name="sk_resource_not_found">Az erőforrás nem található</string>
<string name="sk_open_with_account">Más számlával együtt nyitva</string>
<string name="sk_scheduled_too_soon">A bejegyzést legalább 10 perccel későbbre kell időzíteni.</string>
<string name="sk_confirm_delete_draft">Biztos vagy benne, hogy törölni akarod ezt a vázlatos hozzászólást\?</string>
<string name="sk_confirm_delete_scheduled_post">Biztos, hogy törölni akarod ezt a tervezett hozzászólást\?</string>
<string name="sk_compose_draft">A hozzászólás tervezetként lesz elmentve.</string>
<string name="sk_scheduled_too_soon_title">A tervezett időpont túl korai</string>
<string name="sk_post_scheduled">Tervezett poszt</string>
<string name="sk_draft_saved">Tervezet mentve</string>
<string name="sk_compose_scheduled">Beütemezve a</string>
<string name="sk_draft_or_schedule">Tervezet vagy ütemterv</string>
<string name="sk_confirm_delete_scheduled_post_title">Időzített bejegyzés törlése</string>
<string name="sk_confirm_delete_draft_title">Tervezet törlése</string>
<string name="sk_schedule">Ütemterv</string>
<string name="sk_draft">Tervezet</string>
<string name="sk_forward_report_to">Továbbítás %s-re</string>
<string name="sk_unsent_posts">Nem elküldött hozzászólások</string>
<string name="sk_schedule_post">Ütemterv posta</string>
<string name="sk_mark_as_draft">Vázlatként megjelölni</string>
<string name="sk_confirm_save_changes">Változások mentése\?</string>
<string name="sk_confirm_save_draft">Tervezet mentése\?</string>
<string name="sk_compose_no_draft">Ne draftoljon</string>
<string name="sk_compose_no_schedule">Ne ütemezzen</string>
<string name="sk_schedule_or_draft">Ütemterv vagy tervezet</string>
<string name="sk_settings_reduce_motion">Mozgás csökkentése animációkban</string>
<string name="sk_welcome_text">A cápa tiszteleg előtted! A kezdéshez kérjük, adja meg az alábbiakban az otthoni domain nevét.</string>
<string name="sk_federated_timeline_info_banner">Ezek a szövetséged tagjainak legfrissebb bejegyzései.</string>
<string name="sk_confirm_delete_and_redraft">Biztos, hogy törölni és újrafogalmazni akarod ezt a hozzászólást\?</string>
<string name="sk_update_available">Moshidon %s készen áll a letöltésre.</string>
<string name="sk_confirm_delete_and_redraft_title">Törlés és újraszövegezés Hozzászólás</string>
<string name="sk_image_description">Kép leírása</string>
<string name="sk_settings_show_boosts">Show boostok</string>
<string name="sk_settings_show_interaction_counts">Interakciószámok megjelenítése</string>
<string name="sk_reject_follow_request">Követési kérelem elutasítása</string>
<string name="sk_poll_allow_multiple">Több választási lehetőség engedélyezése</string>
<string name="sk_tabs_disable_swipe">Lapok közötti lapozás letiltása</string>
<string name="sk_settings_about">Az alkalmazásról</string>
</resources>

View File

@@ -34,31 +34,31 @@
<string name="sk_visibility_unlisted">Tidak terdaftar</string>
<string name="sk_mark_media_as_sensitive">Tandai media sebagai sensitif</string>
<string name="sk_follow_requests">Permintaan pengikut</string>
<string name="sk_lists_with_user">Daftar dengan %s</string>
<string name="sk_lists_with_user">Sunting daftar dengan %s</string>
<string name="sk_settings_always_reveal_content_warnings">Selalu ungkap peringatan konten</string>
<string name="sk_disable_marquee">Nonaktifkan teks bergulir dalam bilah judul</string>
<string name="sk_settings_show_federated_timeline">Tampilkan lini masa federasi</string>
<string name="sk_notification_type_status">Kiriman</string>
<string name="sk_notify_posts">Notifikasi kiriman</string>
<string name="sk_settings_color_picker">Warna tema</string>
<string name="sk_color_theme_pink">Merah Muda</string>
<string name="sk_color_theme_purple">Ungu</string>
<string name="sk_color_theme_green">Hijau</string>
<string name="sk_color_theme_blue">Biru</string>
<string name="sk_color_theme_brown">Cokelat</string>
<string name="sk_color_theme_yellow">Kuning</string>
<string name="sk_settings_color_palette">Warna tema</string>
<string name="sk_color_palette_pink">Merah Muda</string>
<string name="sk_color_palette_purple">Ungu</string>
<string name="sk_color_palette_green">Hijau</string>
<string name="sk_color_palette_blue">Biru</string>
<string name="sk_color_palette_brown">Cokelat</string>
<string name="sk_color_palette_yellow">Kuning</string>
<string name="sk_poll_allow_multiple">Perbolehkan beberapa pilihan</string>
<string name="sk_clear_recent_languages">Hapus bahasa terkini yang digunakan</string>
<string name="sk_welcome_title">Selamat datang!</string>
<string name="sk_confirm_clear_recent_languages">Apakah Anda yakin ingin menghapus bahasa terkini yang Anda gunakan\?</string>
<string name="sk_color_theme_material3">Sistem</string>
<string name="sk_color_palette_material3">Sistem</string>
<string name="sk_available_languages">Bahasa yang tersedia</string>
<string name="sk_language_name">%s (%s)</string>
<string name="sk_translate_post">Terjemahkan</string>
<string name="sk_translate_show_original">Tampilkan yang asli</string>
<string name="sk_post_language">Bahasa: %s</string>
<string name="sk_example_domain">contoh.social</string>
<string name="sk_color_theme_red">Merah</string>
<string name="sk_color_palette_red">Merah</string>
<string name="sk_translated_using">Diterjemahkan menggunakan %s</string>
<string name="sk_welcome_text">Hiu menyapamu! Untuk memulai, silakan memasukkan nama domain instansi Anda di bawah.</string>
<string name="sk_tabs_disable_swipe">Nonaktifkan mengusap antara tab</string>
@@ -67,7 +67,7 @@
<string name="sk_enable_delete_notifications">Aktifkan menghapus notifikasi</string>
<string name="sk_settings_publish_button_text">Teks tombol Terbitkan</string>
<string name="sk_settings_publish_button_text_title">Ubah teks tombol Terbitkan</string>
<string name="sk_settings_hide_translate_in_timeline">Sembunyikan tombol terjemahkan di lini masa</string>
<string name="sk_settings_translate_only_opened">Sembunyikan tombol terjemahkan di lini masa</string>
<string name="sk_settings_translation_availability_note_available">%s mendukung penerjemahan!</string>
<string name="sk_settings_translation_availability_note_unavailable">%s sepertinya tidak mendukung penerjemahan.</string>
<string name="sk_clear_all_notifications_confirm">Apakah Anda yakin ingin menghapus semua notifikasi\?</string>
@@ -95,12 +95,12 @@
<string name="sk_already_bookmarked">Sudah dimarkahi</string>
<string name="sk_favorited_as">Difavorit sebagai %s</string>
<string name="sk_already_favorited">Sudah difavorit</string>
<string name="sk_reblog_as">Bagikan dari akun lain</string>
<string name="sk_reblog_as">Bagikan dengan akun lain</string>
<string name="sk_reblogged_as">Dibagikan sebagai %s</string>
<string name="sk_already_reblogged">Sudah dibagikan</string>
<string name="sk_reply_as">Balas dengan akun lain</string>
<string name="sk_bookmark_as">Markahi dalam akun lain</string>
<string name="sk_favorite_as">Favorit dari akun lain</string>
<string name="sk_bookmark_as">Markahi dengan akun lain</string>
<string name="sk_favorite_as">Favorit dengan akun lain</string>
<string name="sk_settings_uniform_icon_for_notifications">Ikon yang sama untuk semua notifikasi</string>
<string name="sk_unsent_posts">Kiriman yang belum dikirim</string>
<string name="sk_draft">Draf</string>
@@ -123,4 +123,27 @@
<string name="sk_mark_as_draft">Tandai sebagai draf</string>
<string name="sk_schedule_post">Jadwalkan kiriman</string>
<string name="sk_confirm_save_draft">Simpan draf\?</string>
<string name="sk_compose_no_schedule">Jangan dijadwalkan</string>
<string name="sk_compose_no_draft">Jangan didraf</string>
<string name="sk_schedule_or_draft">Jadwalkan atau draf</string>
<string name="sk_settings_reduce_motion">Kurangi gerakan dalam animasi</string>
<string name="sk_list_replies_policy">Tampilkan balasan ke</string>
<string name="sk_announcements">Pengumuman</string>
<string name="sk_mark_as_read">Tandai sebagai dibaca</string>
<string name="sk_settings_about_instance">Tentang server</string>
<string name="sk_settings_single_notification">Hanya tampilkan satu notifikasi</string>
<string name="sk_create">Buat</string>
<string name="sk_create_list_title">Buat daftar</string>
<string name="sk_list_name_hint">Nama daftar</string>
<string name="sk_list_replies_policy_list">anggota daftar</string>
<string name="sk_list_replies_policy_followed">pengguna mengikuti</string>
<string name="sk_list_replies_policy_none">tidak ada siapa pun</string>
<string name="sk_delete_list">Hapus daftar</string>
<string name="sk_delete_list_confirm">Apakah Anda yakin ingin menghapus daftar “%s”\?</string>
<string name="sk_edit_list_title">Sunting daftar</string>
<string name="sk_your_lists">Daftar Anda</string>
<string name="sk_timeline_federated">Federasi</string>
<string name="sk_timeline_home">Beranda</string>
<string name="sk_timeline_local">Lokal</string>
<string name="sk_recent_searches_placeholder">Ketik sesuatu untuk memulai mencari</string>
</resources>

View File

@@ -42,7 +42,7 @@
<string name="sk_no_update_available">Non ci sono aggiornamenti disponibili</string>
<string name="sk_list_timelines">Liste</string>
<string name="sk_settings_always_reveal_content_warnings">Apri sempre contenuti segnalati come sensibili</string>
<string name="sk_lists_with_user">Liste con %s</string>
<string name="sk_lists_with_user">Modifica liste con %s</string>
<string name="sk_settings_contribute">Contribuisci a Moshidon</string>
<string name="sk_settings_show_federated_timeline">Mostra timeline federata</string>
<string name="sk_disable_marquee">Disabilita scorrimento titoli</string>
@@ -60,4 +60,86 @@
<string name="sk_available_languages">Lingue disponibili</string>
<string name="sk_welcome_text">Lo squalo ti saluta! Per iniziare inserisci il dominio dell\'istanza a cui sei iscritto.</string>
<string name="sk_color_palette_material3">Sistema</string>
<string name="sk_timeline_local">Locale</string>
<string name="sk_timeline_federated">Federazione</string>
<string name="sk_bookmark_as">Salva con un altro account</string>
<string name="sk_bookmarked_as">Salvato come %s</string>
<string name="sk_favorite_as">Inserisci tra i preferiti con un altro account</string>
<string name="sk_favorited_as">Inserito tra i preferiti come %s</string>
<string name="sk_already_favorited">Già tra i preferiti</string>
<string name="sk_reblog_as">Esegui il reblog con un altro account</string>
<string name="sk_already_reblogged">Reblog già eseguito</string>
<string name="sk_settings_profile">Imposta il profilo</string>
<string name="sk_settings_posting">Preferenze dei post</string>
<string name="sk_settings_filters">Configura filtri</string>
<string name="sk_settings_rules">Regole</string>
<string name="sk_settings_about">Riguardo all\'app</string>
<string name="sk_settings_donate">Dona</string>
<string name="sk_delete_notification_confirm_action">Elimina notifica</string>
<string name="sk_enable_delete_notifications">Abilita l\'eliminazione delle notifiche</string>
<string name="sk_settings_publish_button_text">Testo del pulsante Pubblica</string>
<string name="sk_settings_publish_button_text_title">Personalizza il testo del pulsante Pubblica</string>
<string name="sk_settings_translation_availability_note_available">%s supporta la traduzione!</string>
<string name="sk_settings_translation_availability_note_unavailable">Sembra che %s non supporti la traduzione.</string>
<string name="sk_clear_all_notifications">Elimina tutte le notifiche</string>
<string name="sk_clear_all_notifications_confirm_action">Elimina tutto</string>
<string name="sk_clear_all_notifications_confirm">Sei sicuro di volere eliminare tutte le notifiche\?</string>
<string name="sk_loading_fediverse_resource_title">Cercando nel Fediverso</string>
<string name="sk_quote_post">Crea un post riguardo a questo</string>
<string name="sk_undo_reblog">Annulla il reblog</string>
<string name="sk_reblog_with_visibility">Esegui il reblog con visibilità</string>
<string name="sk_copy_link_to_post">Copia il link del post</string>
<string name="sk_open_with_account">Apri con un altro account</string>
<string name="sk_resource_not_found">La risorsa non può essere trovata</string>
<string name="sk_draft">Bozza</string>
<string name="sk_schedule">Programma</string>
<string name="sk_confirm_delete_draft_title">Elimina bozza</string>
<string name="sk_draft_or_schedule">Bozza o programma</string>
<string name="sk_compose_scheduled">Programmato per</string>
<string name="sk_draft_saved">Bozza salvata</string>
<string name="sk_forward_report_to">Inoltra a %s</string>
<string name="sk_confirm_delete_scheduled_post_title">Elimina post programmato</string>
<string name="sk_confirm_delete_scheduled_post">Sei sicuro di volere eliminare questo post programmato\?</string>
<string name="sk_compose_draft">Il post verrà salvato come bozza.</string>
<string name="sk_post_scheduled">Post programmato</string>
<string name="sk_scheduled_too_soon_title">L\'orario programmato è troppo presto</string>
<string name="sk_mark_as_draft">Segna come bozza</string>
<string name="sk_schedule_post">Programma post</string>
<string name="sk_compose_no_schedule">Non programmare</string>
<string name="sk_compose_no_draft">Non tenere in bozza</string>
<string name="sk_announcements">Annunci</string>
<string name="sk_mark_as_read">Segna come letto</string>
<string name="sk_settings_single_notification">Mostra solo una notifica</string>
<string name="sk_create">Crea</string>
<string name="sk_create_list_title">Crea lista</string>
<string name="sk_list_name_hint">Nome della lista</string>
<string name="sk_list_replies_policy">Mostra risposte a</string>
<string name="sk_list_replies_policy_list">membri della lista</string>
<string name="sk_list_replies_policy_followed">utenti seguiti</string>
<string name="sk_list_replies_policy_none">nessuno</string>
<string name="sk_delete_list">Elimina lista</string>
<string name="sk_edit_list_title">Modifica lista</string>
<string name="sk_your_lists">Le tue liste</string>
<string name="sk_reply_as">Rispondi con un altro account</string>
<string name="sk_settings_uniform_icon_for_notifications">Icona uniforme per tutte le notifiche</string>
<string name="sk_color_palette_red">Rosso</string>
<string name="sk_tabs_disable_swipe">Disabilita lo scorrimento tra schede</string>
<string name="sk_settings_auth">Impostazioni della sicurezza</string>
<string name="sk_delete_notification">Elimina notifica</string>
<string name="sk_delete_notification_confirm">Sei sicuro di volere eliminare questa notifica\?</string>
<string name="sk_settings_translate_only_opened">Traduci solamente i post aperti</string>
<string name="sk_loading_resource_on_instance_title">Cercando in %s</string>
<string name="sk_hashtags_you_follow">Hashtags che segui</string>
<string name="sk_already_bookmarked">Già salvato</string>
<string name="sk_reblogged_as">Reblog eseguito come %s</string>
<string name="sk_unsent_posts">Post annullati</string>
<string name="sk_confirm_save_draft">Salva bozza\?</string>
<string name="sk_confirm_save_changes">Salva le modifiche\?</string>
<string name="sk_schedule_or_draft">Programma o bozza</string>
<string name="sk_settings_reduce_motion">Riduci il movimento delle animazioni</string>
<string name="sk_settings_about_instance">Riguardo all\'istanza</string>
<string name="sk_delete_list_confirm">Sei sicuro di volere eliminare la lista \"%s\"\?</string>
<string name="sk_timeline_home">Home</string>
<string name="sk_confirm_delete_draft">Sei sicuro di volere eliminare questo post in bozza\?</string>
<string name="sk_scheduled_too_soon">I post devono essere programmati almeno tra 10 minuti.</string>
</resources>

View File

@@ -29,7 +29,7 @@
<string name="sk_follow_requests">팔로우 요청</string>
<string name="sk_accept_follow_request">팔로우 요청 허가</string>
<string name="sk_reject_follow_request">팔로우 요청 거부</string>
<string name="sk_lists_with_user">%s 님이 포함된 리스트</string>
<string name="sk_lists_with_user">%s 님이 포함된 리스트 수정</string>
<string name="sk_settings_always_reveal_content_warnings">열람주의 게시물을 항상 펼치기</string>
<string name="sk_disable_marquee">제목 표시줄의 텍스트 스크롤 비활성화</string>
<string name="sk_app_name">Moshidon</string>
@@ -73,7 +73,7 @@
<string name="sk_enable_delete_notifications">알림 삭제 활성화</string>
<string name="sk_settings_publish_button_text">게시 버튼 텍스트</string>
<string name="sk_settings_publish_button_text_title">게시 버튼 사용자화</string>
<string name="sk_settings_hide_translate_in_timeline">타임라인에서 번역 버튼 숨김</string>
<string name="sk_settings_translate_only_opened">타임라인에서 번역 버튼 숨김</string>
<string name="sk_delete_notification">알림 삭제</string>
<string name="sk_settings_translation_availability_note_available">%s 서버는 번역을 지원합니다!</string>
<string name="sk_settings_translation_availability_note_unavailable">%s 서버는 번역을 지원하지 않는 것 같습니다.</string>
@@ -101,4 +101,45 @@
<string name="sk_resource_not_found">리소스를 찾을 수 없습니다</string>
<string name="sk_loading_resource_on_instance_title">%s에서 찾아보는 중</string>
<string name="sk_quote_post">언급하여 게시</string>
<string name="sk_unsent_posts">게시하지 않은 게시물</string>
<string name="sk_draft">초안 작성</string>
<string name="sk_schedule">게시 예약</string>
<string name="sk_confirm_delete_draft_title">초안 삭제</string>
<string name="sk_confirm_delete_draft">정말로 이 초안을 삭제하시겠습니까\?</string>
<string name="sk_confirm_delete_scheduled_post_title">예약한 게시물 삭제</string>
<string name="sk_confirm_delete_scheduled_post">정말로 이 예약한 게시물을 삭제하시겠습니까\?</string>
<string name="sk_compose_draft">게시물이 초안으로 저장됩니다.</string>
<string name="sk_compose_scheduled">예약한 시각</string>
<string name="sk_post_scheduled">게시 예약함</string>
<string name="sk_scheduled_too_soon">게시 예약은 최소한 10분 뒤로 설정해야 합니다.</string>
<string name="sk_draft_or_schedule">초안 작성 또는 게시 예약</string>
<string name="sk_scheduled_too_soon_title">예약한 시각이 머지않았습니다</string>
<string name="sk_draft_saved">초안 저장함</string>
<string name="sk_forward_report_to">%s 인스턴스로 전달</string>
<string name="sk_schedule_post">게시 예약</string>
<string name="sk_confirm_save_changes">변경 사항을 저장하시겠습니까\?</string>
<string name="sk_compose_no_schedule">게시 예약 안 함</string>
<string name="sk_compose_no_draft">초안 작성 안 함</string>
<string name="sk_confirm_save_draft">초안으로 저장하시겠습니까\?</string>
<string name="sk_schedule_or_draft">게시 예약 또는 초안 작성</string>
<string name="sk_mark_as_draft">초안으로 표시</string>
<string name="sk_settings_reduce_motion">애니메이션의 동작 감소</string>
<string name="sk_timeline_home"></string>
<string name="sk_timeline_local">로컬</string>
<string name="sk_timeline_federated">연합</string>
<string name="sk_list_replies_policy">답글을 표시할 대상</string>
<string name="sk_delete_list_confirm">정말로 이 리스트를 삭제하시겠습니까\?</string>
<string name="sk_announcements">공지사항</string>
<string name="sk_mark_as_read">읽음으로 표시</string>
<string name="sk_settings_about_instance">인스턴스에 대하여</string>
<string name="sk_create_list_title">리스트 만들기</string>
<string name="sk_list_name_hint">리스트 이름</string>
<string name="sk_create">만들기</string>
<string name="sk_list_replies_policy_list">리스트의 구성원들</string>
<string name="sk_list_replies_policy_followed">팔로우한 사용자 누구나</string>
<string name="sk_list_replies_policy_none">아무도 없음</string>
<string name="sk_delete_list">리스트 삭제</string>
<string name="sk_edit_list_title">리스트 편집</string>
<string name="sk_your_lists">리스트</string>
<string name="sk_settings_single_notification">하나의 알림만 표시</string>
</resources>

View File

@@ -17,9 +17,9 @@
<string name="sk_update_available">Moshidon %s ကို ဒေါင်းလုဒ်ဆွဲလို့ရပါပြီ။</string>
<string name="sk_update_ready">Moshidon %s ကို ဒေါင်းလုဒ်ဆွဲပြီးပြီမလို့ အင်စတောလုပ်နိုင်ပါပြီ။</string>
<string name="sk_no_update_available">မည်သည့်အပ်ဒိတ်မျှ မရှိသေးပါ</string>
<string name="sk_follow_requests">ဖောလိုဝါအဖြစ် တောင်းဆိုမှုများ</string>
<string name="sk_accept_follow_request">ဖောလိုဝါအဖြစ်တောင်းဆိုမှုကို လက်ခံမည်</string>
<string name="sk_reject_follow_request">ဖောလိုဝါအဖြစ်တောင်းဆိုမှုကို ငြင်းပယ်မည်</string>
<string name="sk_follow_requests">ဖောလိုဝါအဖြစ် တောင်းဆိုမှုများ</string>
<string name="sk_accept_follow_request">ဖောလိုဝါအဖြစ်တောင်းဆိုမှုကို လက်ခံမည်</string>
<string name="sk_reject_follow_request">ဖောလိုဝါအဖြစ်တောင်းဆိုမှုကို ငြင်းပယ်မည်</string>
<string name="sk_confirm_pin_post_title">ပို့စ်အား ပရိုဖိုင်းတွင် ပင်တွဲခြင်း</string>
<string name="sk_confirm_delete_and_redraft_title">ပို့စ်အား ဖျက်ပြီးပြန်ရေးခြင်း</string>
<string name="sk_confirm_delete_and_redraft">ဖျက်ပြီးပြန်ရေးမှာ သေချာပြီလား\?</string>
@@ -31,4 +31,72 @@
<string name="sk_federated_timeline_info_banner">သင့်ဖက်ဒရေးရှင်းကလူတွေရဲ့ လတ်တလောပို့စ်တွေ ဖြစ်ပါတယ်။</string>
<string name="sk_check_for_update">အပ်ဒိတ်ရှိလားစစ်ဆေးမည်</string>
<string name="sk_disable_marquee">ခေါင်းစီးဘားများတွင် စာများရွေ့လျားမှု ပိတ်မည်</string>
<string name="sk_poll_allow_multiple">တစ်ခုထက်ပိုသောရွေးချယ်မှုများကို ခွင့်ပြုမည်</string>
<string name="sk_clear_recent_languages">လတ်တလောသုံးထားသည့် ဘာသာစကားများကို ရှင်းလင်းမည်</string>
<string name="sk_welcome_title">မင်္ဂလာပါ</string>
<string name="sk_pinned_posts">ပင်တွဲထားသည်များ</string>
<string name="sk_bookmark_as">တခြားအကောင့်ဖြင့် ဘွတ်ခ်မာ့ခ်လုပ်မည်</string>
<string name="sk_favorite_as">တခြားအကောင့်ဖြင့် favorite လုပ်မည်</string>
<string name="sk_favorited_as">%s ဖြင့် favorite လုပ်လိုက်သည်</string>
<string name="sk_bookmarked_as">%s ဖြင့် ဘွတ်ခ်မာ့ခ်လုပ်လိုက်သည်</string>
<string name="sk_already_favorited">Favorite လုပ်ပြီးသားဖြစ်သည်</string>
<string name="sk_reblogged_as">%s ဖြင့် reblog လုပ်လိုက်သည်</string>
<string name="sk_already_reblogged">Reblog လုပ်ပြီးသားဖြစ်သည်</string>
<string name="sk_reply_as">တခြားအကောင့်ဖြင့် ရီပလိုင်းပြန်မည်</string>
<string name="sk_translated_using">%s ဖြင့် ဘာသာပြန်ထားသည်</string>
<string name="sk_post_language">ဘာသာစကား။ ။%s</string>
<string name="sk_language_name">%s (%s)</string>
<string name="sk_settings_filters">Filter များကို စီစဉ်မည်</string>
<string name="sk_settings_auth">လုံခြုံရေးဆိုင်ရာ ဆက်တင်များ</string>
<string name="sk_settings_rules">စည်းကမ်းချက်များ</string>
<string name="sk_settings_about">အက်ပ်အကြောင်း</string>
<string name="sk_settings_donate">လှူဒါန်းမည်</string>
<string name="sk_settings_posting">ပို့စ်တင်ခြင်းဆိုင်ရာ အပြင်အဆင်များ</string>
<string name="sk_color_palette_purple">ခရမ်းရောင်</string>
<string name="sk_color_palette_green">အစိမ်းရောင်</string>
<string name="sk_color_palette_blue">အပြာရောင်</string>
<string name="sk_color_palette_brown">အညိုရောင်</string>
<string name="sk_color_palette_yellow">အဝါရောင်</string>
<string name="sk_settings_translation_availability_note_available">%s က ဘာသာပြန်တာကို အထောက်အပံ့ပေးထားပါတယ်။</string>
<string name="sk_settings_translation_availability_note_unavailable">%s က ဘာသာပြန်တာကို အထောက်အပံ့ပေးထားပုံမရပါဘူး။</string>
<string name="sk_clear_all_notifications_confirm_action">အားလုံးဖျက်</string>
<string name="sk_clear_all_notifications">နိုတီအားလုံးကို ရှင်းလင်းမည်</string>
<string name="sk_clear_all_notifications_confirm">နိုတီအားလုံးကို ရှင်းလင်းမှာ သေချာပြီလား\?</string>
<string name="sk_undo_reblog">Reblog မလုပ်တော့ပါ</string>
<string name="sk_hashtags_you_follow">သင်ဖော်လိုးထားသည့် ဟက်ရှ်တက်များ</string>
<string name="sk_copy_link_to_post">ပို့စ်လင့်ခ်ကို ကော်ပီကူးမည်</string>
<string name="sk_open_with_account">တခြားအကောင့်ဖြင့် ဖွင့်မည်</string>
<string name="sk_resource_not_found">ရင်းမြစ်ရှာမတွေ့ပါ</string>
<string name="sk_draft">အကြမ်း</string>
<string name="sk_schedule">စီစဉ်မည်</string>
<string name="sk_confirm_delete_draft_title">အကြမ်းကို ဖျက်မည်</string>
<string name="sk_unsent_posts">မတင်ဖြစ်ခဲ့သော ပို့စ်များ</string>
<string name="sk_confirm_delete_scheduled_post_title">စီစဉ်ထားသောပို့စ်ကို ဖျက်မည်</string>
<string name="sk_confirm_delete_scheduled_post">စီစဉ်ထားတဲ့ ဒီပို့စ်ကိုဖျက်မှာ သေချာပြီလား\?</string>
<string name="sk_confirm_delete_draft">ဒီပို့စ်အကြမ်းကို ဖျက်မှာသေချာပြီလား\?</string>
<string name="sk_compose_draft">ပို့စ်ကို အကြမ်းအဖြစ် သိမ်းထားမှာဖြစ်ပါတယ်။</string>
<string name="sk_compose_scheduled">စီစဉ်ထားသည့်အချိန်</string>
<string name="sk_draft_saved">အကြမ်းမှတ်လိုက်သည်</string>
<string name="sk_post_scheduled">ပို့စ်ကို စီစဉ်လိုက်သည်</string>
<string name="sk_confirm_save_draft">အကြမ်းမှတ်ထားမှာလား\?</string>
<string name="sk_confirm_save_changes">အပြောင်းအလဲလုပ်ထားတာတွေကို သိမ်းမှာလား\?</string>
<string name="sk_mark_as_draft">အကြမ်းသတ်မှတ်မည်</string>
<string name="sk_schedule_post">ပိုစ့်စီစဉ်မည်</string>
<string name="sk_settings_reduce_motion">အန်နီမေးရှင်းများတွင် ရွေ့လျားမှုလျှော့မည်</string>
<string name="sk_settings_always_reveal_content_warnings">အကြောင်းအရာသတိပေးချက်များကို အမြဲတမ်းဖော်ပြမည်</string>
<string name="sk_color_palette_pink">ပန်းရောင်</string>
<string name="sk_color_palette_red">အနီရောင်</string>
<string name="sk_translate_post">ဘာသာပြန်မည်</string>
<string name="sk_example_domain">example.social</string>
<string name="sk_settings_profile">ပရိုဖိုင်းကို ပြင်မည်</string>
<string name="sk_already_bookmarked">ဘွတ်ခ်မာ့ခ်လုပ်ပြီးသားဖြစ်သည်</string>
<string name="sk_reblog_as">တခြားအကောင့်ဖြင့် reblog လုပ်မည်</string>
<string name="sk_settings_uniform_icon_for_notifications">နိုတီအားလုံးကို အိုင်ကွန်တူတူထားမည်</string>
<string name="sk_notification_type_status">ပို့စ်များ</string>
<string name="sk_translate_show_original">မူရင်းပို့စ်ကို ပြသမည်</string>
<string name="sk_settings_translate_only_opened">ဖွင့်ထားသည့်ပို့စ်များကိုသာ ဘာသာပြန်မည်</string>
<string name="sk_confirm_clear_recent_languages">အခုနောက်ပိုင်းသုံးထားတဲ့ ဘာသာစကားတွေကို ရှင်းလင်းမှာ သေချာပြီလား</string>
<string name="sk_welcome_text">ငါးမန်းလေးက သင့်ကိုအလေးပြုကြိုဆိုပါတယ်။ စတင်ဖို့အတွက် Home instance ရဲ့ဒိုမိန်းနာမည်ကိုအောက်တွင် ရိုက်ထည့်ပါ။</string>
<string name="sk_scheduled_too_soon_title">စီစဉ်ထားသည့်အချိန်မှာ စောလွန်းနေသည်</string>
<string name="sk_scheduled_too_soon">စီစဉ်ထားသည့်ပို့စ်သည် လက်ရှိအချိန်နှင့် အနည်းဆုံး ၁၀ မိနစ်ကွာရမည်။</string>
</resources>

View File

@@ -14,7 +14,7 @@
<string name="sk_confirm_unpin_post">Weet je zeker dat je dit bericht wilt losmaken\?</string>
<string name="sk_unpinning">Bericht losmaken…</string>
<string name="sk_follow_requests">Volgverzoeken</string>
<string name="sk_visibility_unlisted">Geheim</string>
<string name="sk_visibility_unlisted">Minder openbaar</string>
<string name="sk_image_description">Afbeelding beschrijving</string>
<string name="sk_settings_show_replies">Reacties weergeven</string>
<string name="sk_settings_show_boosts">Boosts weergeven</string>
@@ -33,9 +33,104 @@
<string name="sk_list_timelines">Lijsten</string>
<string name="sk_reject_follow_request">Volgverzoek afwijzen</string>
<string name="sk_accept_follow_request">Volgverzoek accepteren</string>
<string name="sk_lists_with_user">Lijsten met %s</string>
<string name="sk_lists_with_user">Bewerk lijsten met %s</string>
<string name="sk_settings_always_reveal_content_warnings">Onthul altijd inhoudswaarschuwingen</string>
<string name="sk_disable_marquee">Schakel scrollende tekst in titelbalken uit</string>
<string name="sk_settings_contribute">Bijdragen aan Moshidon</string>
<string name="sk_settings_show_federated_timeline">Toon gefedereerde tijdlijn</string>
<string name="sk_notification_type_status">Berichten</string>
<string name="sk_notify_posts">Bericht meldingen</string>
<string name="sk_timeline_local">Lokaal</string>
<string name="sk_timeline_home">Home</string>
<string name="sk_timeline_federated">Federatie</string>
<string name="sk_translate_post">Vertaal</string>
<string name="sk_poll_allow_multiple">Meerdere keuzes toestaan</string>
<string name="sk_clear_recent_languages">Wis recent gebruikte talen</string>
<string name="sk_welcome_text">De haai groet je! Graag je home instance naam hieronder invullen om te beginnen.</string>
<string name="sk_welcome_title">Welkom!</string>
<string name="sk_translated_using">Vertaald met %s</string>
<string name="sk_post_language">Taal: %s</string>
<string name="sk_bookmarked_as">Als bookmark opgeslagen als %s</string>
<string name="sk_already_bookmarked">Al als bookmark opgeslagen</string>
<string name="sk_favorited_as">Als favoriet opgeslagen als %s</string>
<string name="sk_language_name">%s (%s)</string>
<string name="sk_example_domain">example.social</string>
<string name="sk_reply_as">Antwoord met ander account</string>
<string name="sk_settings_uniform_icon_for_notifications">Zelfde icoon voor alle meldingen</string>
<string name="sk_tabs_disable_swipe">Uitschakelen swipen tussen tabs</string>
<string name="sk_settings_profile">Profiel instellen</string>
<string name="sk_settings_posting">Voorkeuren plaatsen bericht</string>
<string name="sk_settings_filters">Filters instellen</string>
<string name="sk_settings_auth">Instellingen beveiliging</string>
<string name="sk_settings_rules">Regels</string>
<string name="sk_settings_about">Over de app</string>
<string name="sk_settings_donate">Doneer</string>
<string name="sk_settings_color_palette">Kleurpalet</string>
<string name="sk_color_palette_material3">Systeem</string>
<string name="sk_color_palette_pink">Roze</string>
<string name="sk_color_palette_purple">Paars</string>
<string name="sk_color_palette_green">Groen</string>
<string name="sk_color_palette_blue">Blauw</string>
<string name="sk_color_palette_brown">Bruin</string>
<string name="sk_color_palette_red">Rood</string>
<string name="sk_color_palette_yellow">Geel</string>
<string name="sk_delete_notification_confirm_action">Verwijder melding</string>
<string name="sk_delete_notification_confirm">Weet je zeker dat je de melding wilt verwijderen\?</string>
<string name="sk_enable_delete_notifications">Meldingen verwijderen inschakelen</string>
<string name="sk_settings_publish_button_text">Publiceer knop tekst</string>
<string name="sk_settings_publish_button_text_title">Tekst publiceer knop aanpassen</string>
<string name="sk_settings_translation_availability_note_available">%s ondersteunt vertaling!</string>
<string name="sk_settings_translation_availability_note_unavailable">%s lijkt vertaling niet te ondersteunen.</string>
<string name="sk_clear_all_notifications">Wis alle meldingen</string>
<string name="sk_clear_all_notifications_confirm_action">Verwijder alles</string>
<string name="sk_clear_all_notifications_confirm">Weet je zeker dat je alle meldingen wilt verwijderen\?</string>
<string name="sk_loading_fediverse_resource_title">Opzoeken in de Fediverse</string>
<string name="sk_copy_link_to_post">Kopieer link naar bericht</string>
<string name="sk_loading_resource_on_instance_title">Opzoeken op %s</string>
<string name="sk_open_with_account">Open met ander account</string>
<string name="sk_unsent_posts">Niet-verzonden berichten</string>
<string name="sk_draft">Concept</string>
<string name="sk_schedule">Inplannen</string>
<string name="sk_confirm_delete_draft">Weet je zeker dat je dit concept bericht wilt verwijderen\?</string>
<string name="sk_confirm_delete_scheduled_post_title">Verwijder ingepland bericht</string>
<string name="sk_draft_or_schedule">Concept of ingepland</string>
<string name="sk_compose_draft">Bericht wordt als concept bewaard.</string>
<string name="sk_compose_scheduled">Ingepland om</string>
<string name="sk_draft_saved">Concept opgeslagen</string>
<string name="sk_post_scheduled">Bericht ingepland</string>
<string name="sk_scheduled_too_soon_title">Ingeplande tijd is te snel</string>
<string name="sk_scheduled_too_soon">Bericht moet minstens 10 minuten in de toekomst ingepland zijn.</string>
<string name="sk_confirm_save_changes">Wijzigingen opslaan\?</string>
<string name="sk_mark_as_draft">Markeer als concept</string>
<string name="sk_schedule_post">Bericht inplannen</string>
<string name="sk_settings_reduce_motion">Beweging in animaties verminderen</string>
<string name="sk_announcements">Aankondigingen</string>
<string name="sk_mark_as_read">Markeer als gelezen</string>
<string name="sk_settings_about_instance">Over instance</string>
<string name="sk_settings_single_notification">Toon alleen één melding</string>
<string name="sk_create">Maken</string>
<string name="sk_create_list_title">Maak lijst</string>
<string name="sk_list_name_hint">Lijstnaam</string>
<string name="sk_list_replies_policy">Toon antwoorden aan</string>
<string name="sk_list_replies_policy_none">niemand</string>
<string name="sk_list_replies_policy_followed">gevolgde users</string>
<string name="sk_delete_list">Verwijder lijst</string>
<string name="sk_delete_list_confirm">Weet je zeker dat je deze lijst wilt verwijderen: “%s”\?</string>
<string name="sk_edit_list_title">Bewerk lijst</string>
<string name="sk_your_lists">Jouw lijsten</string>
<string name="sk_translate_show_original">Toon origineel</string>
<string name="sk_available_languages">Beschikbare talen</string>
<string name="sk_confirm_clear_recent_languages">Weet je zeker dat je de laatst gebruikte talen wilt wissen\?</string>
<string name="sk_delete_notification">Verwijder melding</string>
<string name="sk_settings_translate_only_opened">Vertaal alleen geopende berichten</string>
<string name="sk_hashtags_you_follow">Hashtags die je volgt</string>
<string name="sk_resource_not_found">Bron kon niet worden gevonden</string>
<string name="sk_bookmark_as">Bookmark met ander account</string>
<string name="sk_favorite_as">Maak favoriet met ander account</string>
<string name="sk_already_favorited">Al als favoriet opgeslagen</string>
<string name="sk_forward_report_to">Doorsturen naar %s</string>
<string name="sk_confirm_delete_draft_title">Verwijder concept</string>
<string name="sk_confirm_delete_scheduled_post">Weet je zeker dat je dit ingeplande bericht wilt verwijderen\?</string>
<string name="sk_confirm_save_draft">Concept opslaan\?</string>
<string name="sk_compose_no_schedule">Niet inplannen</string>
</resources>

View File

@@ -13,17 +13,17 @@
<string name="sk_settings_load_new_posts">Automatycznie wczytuj nowe wpisy</string>
<string name="sk_settings_show_interaction_counts">Pokaż dane ilości interakcji</string>
<string name="sk_mark_media_as_sensitive">Oznacz jako wrażliwe</string>
<string name="sk_user_post_notifications_on">Włączono powiadomienia dla postu %s</string>
<string name="sk_user_post_notifications_off">Wyłączono powiadomienia dla postu %s</string>
<string name="sk_user_post_notifications_on">Włączono powiadomienia dla wpisu %s</string>
<string name="sk_user_post_notifications_off">Wyłączono powiadomienia dla wpisu %s</string>
<string name="sk_federated_timeline">fediwersum</string>
<string name="sk_federated_timeline_info_banner">To są najnowsze post ze znanej sieci fediwersum dla twojego serwera.</string>
<string name="sk_federated_timeline_info_banner">To są najnowsze wpisy z wszystkich serwerów z którymi twoja instancja jest sfederowana.</string>
<string name="sk_update_available">Moshidon %s jest dostępny do pobrania.</string>
<string name="sk_update_ready">Moshidon %s został pobrany i jest gotowy do instalacji.</string>
<string name="sk_check_for_update">Sprawdź dostępność aktualizacji</string>
<string name="sk_no_update_available">Brak dostępnych aktualizacji</string>
<string name="sk_app_name">Moshidon</string>
<string name="sk_pinned_posts">Przypięte</string>
<string name="sk_confirm_delete_and_redraft">Jesteś pewnien, że chcesz usunąć zmodyfikowany wpis\?</string>
<string name="sk_confirm_delete_and_redraft">Jesteś pewien, że chcesz usunąć wpis i utworzyć jego kopię roboczą\?</string>
<string name="sk_confirm_unpin_post">Jesteś pewien, że chcesz odpiąć ten wpis\?</string>
<string name="sk_image_description">Opis zdjęcia</string>
<string name="sk_confirm_delete_and_redraft_title">Usuń i zmodyfikuj wpis</string>
@@ -31,7 +31,7 @@
<string name="sk_follow_requests">Prośby o obserwację</string>
<string name="sk_accept_follow_request">Zaakceptuj prośby o obserwację</string>
<string name="sk_reject_follow_request">Odrzuć prośby o obserwację</string>
<string name="sk_lists_with_user">Listy z %s</string>
<string name="sk_lists_with_user">Edytuj listy z %s</string>
<string name="sk_settings_always_reveal_content_warnings">Zawsze odkrywaj ostrzeżenia o zawartości</string>
<string name="sk_disable_marquee">Wyłącz tekst przewijany w paskach tytułowych</string>
<string name="sk_settings_contribute">Wspomóż Moshidon</string>
@@ -59,4 +59,87 @@
<string name="sk_example_domain">przykład.social</string>
<string name="sk_welcome_title">Witaj!</string>
<string name="sk_welcome_text">Rekin się kłania! Aby zacząć, wpisz adres swojej instancji poniżej.</string>
<string name="sk_timeline_local">Lokalne</string>
<string name="sk_timeline_federated">Federacja</string>
<string name="sk_announcements">Ogłoszenia</string>
<string name="sk_list_name_hint">Nazwa listy</string>
<string name="sk_timeline_home">Główny widok</string>
<string name="sk_bookmark_as">Zapisz zakładkę w innym koncie</string>
<string name="sk_bookmarked_as">Zapisano zakładkę jako %s</string>
<string name="sk_already_bookmarked">Zakładka została już zapisana</string>
<string name="sk_favorited_as">Polubiono jako %s</string>
<string name="sk_already_favorited">Już polubiono</string>
<string name="sk_reblogged_as">Zrebloguj jako %s</string>
<string name="sk_already_reblogged">Już zreblogowano</string>
<string name="sk_reply_as">Odpowiedz innym kontem</string>
<string name="sk_settings_uniform_icon_for_notifications">Identyczna ikona dla wszystkich notyfikacji</string>
<string name="sk_settings_translate_only_opened">Tłumacz tylko otwarte wpisy</string>
<string name="sk_tabs_disable_swipe">Wyłącz przeskakiwanie między zakładkami poprzez przesuwanie</string>
<string name="sk_settings_profile">Skonfiguruj profil</string>
<string name="sk_settings_posting">Preferencje publikowania</string>
<string name="sk_settings_filters">Skonfiguruj filtry</string>
<string name="sk_settings_auth">Ustawienia bezpieczeństwa</string>
<string name="sk_settings_rules">Zasady</string>
<string name="sk_settings_about">O aplikacji</string>
<string name="sk_settings_donate">Donacje</string>
<string name="sk_color_palette_material3">System</string>
<string name="sk_color_palette_red">Czerwony</string>
<string name="sk_delete_notification">Usuń powiadomienie</string>
<string name="sk_delete_notification_confirm_action">Usuń powiadomienie</string>
<string name="sk_delete_notification_confirm">Czy jesteś pewien że chcesz usunąć to powiadomienie\?</string>
<string name="sk_enable_delete_notifications">Włącz usuwanie notyfikacji</string>
<string name="sk_settings_publish_button_text">Opis przycisku publikacji</string>
<string name="sk_settings_publish_button_text_title">Skonfiguruj opis przycisku publikacji</string>
<string name="sk_settings_translation_availability_note_available">%s wspiera funkcję tłumaczenia!</string>
<string name="sk_settings_translation_availability_note_unavailable">Wygląda na to, że %s nie wspiera funkcji tłumaczenia.</string>
<string name="sk_clear_all_notifications">Wyczyść wszystkie powiadomienia</string>
<string name="sk_clear_all_notifications_confirm_action">Usuń wszystkie</string>
<string name="sk_clear_all_notifications_confirm">Czy jesteś pewien że chcesz usunąć wszystkie powiadomienia\?</string>
<string name="sk_loading_fediverse_resource_title">Wyszukiwanie na Fediwersum</string>
<string name="sk_undo_reblog">Cofnij reblog</string>
<string name="sk_reblog_with_visibility">Reblog z widocznością</string>
<string name="sk_quote_post">Wpis o tym</string>
<string name="sk_hashtags_you_follow">Hashtagi które obserwujesz</string>
<string name="sk_copy_link_to_post">Kopiuj link do wpisu</string>
<string name="sk_loading_resource_on_instance_title">Wyszukiwanie na %s</string>
<string name="sk_open_with_account">Otwórz w innym koncie</string>
<string name="sk_resource_not_found">Nie znaleziono zasobu</string>
<string name="sk_forward_report_to">Prześlij dalej do %s</string>
<string name="sk_draft">Wersja robocza</string>
<string name="sk_schedule">Harmonogram</string>
<string name="sk_confirm_delete_draft_title">Usuń wersję roboczą</string>
<string name="sk_compose_scheduled">Zaplanowany na</string>
<string name="sk_draft_saved">Kopia robocza zapisana</string>
<string name="sk_scheduled_too_soon_title">Czas publikacji jest za wcześnie</string>
<string name="sk_scheduled_too_soon">Czas publikacji musi być najwcześniej za 10 minut.</string>
<string name="sk_post_scheduled">Wpis zaplanowany</string>
<string name="sk_compose_draft">Wpis zostanie zapisany jako wersja robocza.</string>
<string name="sk_draft_or_schedule">Kopia robocza lub zaplanowany wpis</string>
<string name="sk_confirm_delete_scheduled_post">Czy chcesz usunąć ten zaplanowany wpis\?</string>
<string name="sk_confirm_delete_scheduled_post_title">Usuń zaplanowany wpis</string>
<string name="sk_unsent_posts">Niewysłane wpisy</string>
<string name="sk_confirm_delete_draft">Czy jesteś pewien że chcesz usunąć tę kopię roboczą\?</string>
<string name="sk_confirm_save_draft">Zapisać kopię roboczą\?</string>
<string name="sk_confirm_save_changes">Zapisać zmiany\?</string>
<string name="sk_mark_as_draft">Oznacz jako wersja robocza</string>
<string name="sk_schedule_post">Zaplanuj wpis</string>
<string name="sk_compose_no_schedule">Nie planuj publikacji</string>
<string name="sk_compose_no_draft">Nie twórz wersji roboczej</string>
<string name="sk_schedule_or_draft">Zaplanowany wpis lub kopia robocza</string>
<string name="sk_favorite_as">Polub innym kontem</string>
<string name="sk_reblog_as">Już zreblogowano</string>
<string name="sk_settings_reduce_motion">Zmniejsz ruch animacji</string>
<string name="sk_mark_as_read">Oznacz jako przeczytane</string>
<string name="sk_settings_about_instance">O instancji</string>
<string name="sk_create_list_title">Stwórz listę</string>
<string name="sk_create">Stwórz</string>
<string name="sk_list_replies_policy">Pokaż odpowiedzi do</string>
<string name="sk_list_replies_policy_list">członkowie listy</string>
<string name="sk_list_replies_policy_followed">obserwowani użytkownicy</string>
<string name="sk_settings_single_notification">Pokazuj tylko jedną notyfikację</string>
<string name="sk_list_replies_policy_none">nikt</string>
<string name="sk_delete_list">Usuń listę</string>
<string name="sk_delete_list_confirm">Czy jesteś pewien że chcesz usunąć tą listę\?</string>
<string name="sk_edit_list_title">Edytuj listę</string>
<string name="sk_your_lists">Twoje listy</string>
</resources>

View File

@@ -6,7 +6,7 @@
<string name="sk_pin_post">Fixar no perfil</string>
<string name="sk_confirm_pin_post_title">Fixar postagem no perfil</string>
<string name="sk_confirm_pin_post">Você deseja fixar esta postagem em seu perfil\?</string>
<string name="sk_pinning">Fixando postagem</string>
<string name="sk_pinning">Fixando publicação</string>
<string name="sk_app_name">Moshidon</string>
<string name="sk_pinned_posts">Fixado</string>
<string name="sk_unpin_post">Desafixar do perfil</string>
@@ -19,7 +19,7 @@
<string name="sk_settings_load_new_posts">Carregar novas postagens automaticamente</string>
<string name="sk_mark_media_as_sensitive">Marcar mídia como sensível</string>
<string name="sk_settings_app_version">Moshidon v%1$s (%2$d)</string>
<string name="sk_lists_with_user">Listas com %s</string>
<string name="sk_lists_with_user">Editar listas com %s</string>
<string name="sk_user_post_notifications_on">Ativar as notificações de postagem para %s</string>
<string name="sk_federated_timeline">Federação</string>
<string name="sk_federated_timeline_info_banner">Estas são as postagens mais recentes das pessoas em sua federação.</string>
@@ -44,7 +44,7 @@
<string name="sk_color_palette_brown">Marrom</string>
<string name="sk_color_palette_yellow">Amarelo</string>
<string name="sk_color_palette_pink">Rosa</string>
<string name="sk_notification_type_status">Postagens</string>
<string name="sk_notification_type_status">Publicações</string>
<string name="sk_settings_color_palette">Cor do tema</string>
<string name="sk_translate_post">Traduzir</string>
<string name="sk_translate_show_original">Mostrar original</string>
@@ -54,7 +54,7 @@
<string name="sk_language_name">%s (%s)</string>
<string name="sk_confirm_clear_recent_languages">Você tem certeza que deseja limpar os idiomas usados recentemente\?</string>
<string name="sk_clear_recent_languages">Limpar idiomas usados recentemente</string>
<string name="sk_notify_posts">Notificações de posts</string>
<string name="sk_notify_posts">Notificações de publicações</string>
<string name="sk_poll_allow_multiple">Permitir múltiplas escolhas</string>
<string name="sk_welcome_text">O tubarão te cumprimenta! Para começar, por favor, digite abaixo o nome de domínio de sua instância de origem.</string>
<string name="sk_example_domain">exemplo.social</string>
@@ -63,7 +63,7 @@
<string name="sk_color_palette_red">Vermelho</string>
<string name="sk_settings_donate">Doar</string>
<string name="sk_settings_rules">Regras</string>
<string name="sk_tabs_disable_swipe">Desativar deslizamento entre as abas</string>
<string name="sk_tabs_disable_swipe">Desativar deslizamento entre abas</string>
<string name="sk_settings_profile">Configurar perfil</string>
<string name="sk_settings_posting">Preferências de postagem</string>
<string name="sk_settings_filters">Configurar filtros</string>
@@ -71,7 +71,7 @@
<string name="sk_delete_notification">Excluir notificação</string>
<string name="sk_delete_notification_confirm_action">Excluir notificação</string>
<string name="sk_enable_delete_notifications">Habilitar a exclusão de notificações</string>
<string name="sk_settings_publish_button_text_title">Customizar o texto do botão de publicar</string>
<string name="sk_settings_publish_button_text_title">Customizar texto do botão publicar</string>
<string name="sk_settings_translate_only_opened">Esconder botão de tradução na linha do tempo</string>
<string name="sk_settings_translation_availability_note_available">%s suporta tradução!</string>
<string name="sk_settings_translation_availability_note_unavailable">%s parece não suportar tradução.</string>
@@ -79,14 +79,64 @@
<string name="sk_clear_all_notifications_confirm_action">Excluir tudo</string>
<string name="sk_loading_fediverse_resource_title">Procurando no Fediverso</string>
<string name="sk_undo_reblog">Desfazer reblog</string>
<string name="sk_reblog_with_visibility">Reblog com visibilidade</string>
<string name="sk_reblog_with_visibility">Reblogar com visibilidade</string>
<string name="sk_hashtags_you_follow">Hashtags que você segue</string>
<string name="sk_copy_link_to_post">Copiar link para postagem</string>
<string name="sk_copy_link_to_post">Copiar link da postagem</string>
<string name="sk_loading_resource_on_instance_title">Procurando em %s</string>
<string name="sk_open_with_account">Abrir com outra conta</string>
<string name="sk_resource_not_found">Recurso não pode ser encontrado</string>
<string name="sk_resource_not_found">Recurso não foi encontrado</string>
<string name="sk_settings_about">Sobre o app</string>
<string name="sk_settings_auth">Configurações de segurança</string>
<string name="sk_settings_publish_button_text">Texto do botão de publicar</string>
<string name="sk_clear_all_notifications_confirm">Você tem certeza que deseja excluir todas as notificações\?</string>
<string name="sk_favorite_as">Favoritar com outra conta</string>
<string name="sk_bookmark_as">Salvar com outra conta</string>
<string name="sk_already_bookmarked">Já salvo</string>
<string name="sk_already_favorited">Já favoritado</string>
<string name="sk_reply_as">Responder com outra conta</string>
<string name="sk_already_reblogged">Já reblogado</string>
<string name="sk_reblog_as">Reblogar com outra conta</string>
<string name="sk_schedule">Agendar</string>
<string name="sk_draft">Rascunho</string>
<string name="sk_unsent_posts">Postagens não enviadas</string>
<string name="sk_confirm_delete_draft_title">Excluir rascunho</string>
<string name="sk_confirm_delete_draft">Você tem certeza que deseja excluir este rascunho\?</string>
<string name="sk_confirm_delete_scheduled_post_title">Excluir postagem agendada</string>
<string name="sk_confirm_delete_scheduled_post">Você tem certeza que deseja excluir esta postagem agendada\?</string>
<string name="sk_compose_draft">A postagem será salva como rascunho.</string>
<string name="sk_compose_scheduled">Agendado para</string>
<string name="sk_draft_saved">Rascunho salvo</string>
<string name="sk_post_scheduled">Postagem agendada</string>
<string name="sk_forward_report_to">Encaminhar para %s</string>
<string name="sk_scheduled_too_soon_title">O horário agendado está muito próximo</string>
<string name="sk_scheduled_too_soon">A postagem deve ser agendada com pelo menos 10 minutos de antecedência.</string>
<string name="sk_confirm_save_draft">Salvar rascunho\?</string>
<string name="sk_confirm_save_changes">Salvar alterações\?</string>
<string name="sk_mark_as_draft">Marcar como rascunho</string>
<string name="sk_bookmarked_as">Salvo em %s</string>
<string name="sk_favorited_as">Favoritado em %s</string>
<string name="sk_reblogged_as">Reblogou como %s</string>
<string name="sk_settings_uniform_icon_for_notifications">Padronizar ícone para todas as notificações</string>
<string name="sk_quote_post">Publique sobre isso</string>
<string name="sk_draft_or_schedule">Rascunhar ou agendar</string>
<string name="sk_schedule_post">Agendar publicação</string>
<string name="sk_schedule_or_draft">Agendar ou rascunhar</string>
<string name="sk_compose_no_schedule">Não agendar</string>
<string name="sk_compose_no_draft">Não rascunhar</string>
<string name="sk_mark_as_read">Marcar como lido</string>
<string name="sk_settings_about_instance">Sobre a instância</string>
<string name="sk_create">Criar</string>
<string name="sk_create_list_title">Criar lista</string>
<string name="sk_list_replies_policy">Mostrar respostas para</string>
<string name="sk_list_replies_policy_list">listar membros</string>
<string name="sk_list_replies_policy_none">ninguém</string>
<string name="sk_delete_list">Excluir lista</string>
<string name="sk_delete_list_confirm">Tem certeza que deseja excluir esta lista\?</string>
<string name="sk_edit_list_title">Editar lista</string>
<string name="sk_your_lists">Suas listas</string>
<string name="sk_list_name_hint">Lista de nomes</string>
<string name="sk_settings_reduce_motion">Reduzir movimento nas animações</string>
<string name="sk_announcements">Comunicados</string>
<string name="sk_settings_single_notification">Mostrar apenas uma notificação</string>
<string name="sk_list_replies_policy_followed">usuários seguidos</string>
</resources>

View File

@@ -1,3 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
</resources>
<string name="sk_delete_and_redraft">Izbriši in ponovno izdelaj</string>
<string name="sk_pin_post">Pripni na profil</string>
<string name="sk_confirm_pin_post_title">Pripni objavo na profil</string>
<string name="sk_pinning">Pripenjam objavo…</string>
<string name="sk_unpin_post">Odpni iz profila</string>
<string name="sk_confirm_unpin_post_title">Odpni objavo iz profila</string>
<string name="sk_image_description">Opis slike</string>
<string name="sk_visibility_unlisted">Nenavedeno</string>
<string name="sk_settings_show_replies">Prikaži odgovor</string>
<string name="sk_mark_media_as_sensitive">Označite medij kot občutljiv</string>
<string name="sk_federated_timeline">Federacija</string>
<string name="sk_clear_recent_languages">Izbriši nazadnje uporabljene jezike</string>
<string name="sk_app_name">Moshidon</string>
<string name="sk_pinned_posts">Pripeto</string>
<string name="sk_confirm_delete_and_redraft_title">Izbriši ter ponovno izdelaj objavo</string>
<string name="sk_confirm_delete_and_redraft">Ali ste prepričani, da želite objavo izbrisati in jo ponovno izdelati\?</string>
<string name="sk_confirm_pin_post">Ali želite pripeti to objavo na vaš profil\?</string>
<string name="sk_confirm_unpin_post">Ali ste prepričani, da želite odpeti to objavo\?</string>
<string name="sk_unpinning">Odpenjanje objave…</string>
<string name="sk_settings_load_new_posts">Samodejno naloži nove objave</string>
<string name="sk_settings_app_version">Moshidon v%1$s (%2$d)</string>
</resources>

View File

@@ -41,7 +41,7 @@
<string name="sk_follow_requests">Запити на стеження</string>
<string name="sk_accept_follow_request">Погодити запит на стеження</string>
<string name="sk_reject_follow_request">Відхилити запит на стеження</string>
<string name="sk_lists_with_user">Списки з %s</string>
<string name="sk_lists_with_user">Редагувати списки з %s</string>
<string name="sk_disable_marquee">Вимкнути прокручування тексту у рядках заголовка</string>
<string name="sk_settings_contribute">Допомогти у розробці Moshidon</string>
<string name="sk_mark_media_as_sensitive">Позначити медіа делікатним</string>
@@ -94,11 +94,11 @@
<string name="sk_already_bookmarked">Уже в закладках</string>
<string name="sk_favorited_as">Уподобано як %s</string>
<string name="sk_already_favorited">Уже вподобано</string>
<string name="sk_reblog_as">Поширити з іншого облікового запису</string>
<string name="sk_reblog_as">Поширити в іншому обліковому записі</string>
<string name="sk_already_reblogged">Уже поширено</string>
<string name="sk_settings_uniform_icon_for_notifications">Єдина піктограма для всіх сповіщень</string>
<string name="sk_bookmark_as">Додати до закладок іншого облікового запису</string>
<string name="sk_favorite_as">Уподобане з іншого облікового запису</string>
<string name="sk_favorite_as">Уподобане іншим обліковим записом</string>
<string name="sk_reblogged_as">Поширено як %s</string>
<string name="sk_reply_as">Відповісти з іншого облікового запису</string>
<string name="sk_forward_report_to">Переслати до %s</string>
@@ -120,4 +120,27 @@
<string name="sk_mark_as_draft">Позначити чернеткою</string>
<string name="sk_schedule_post">Запланувати допис</string>
<string name="sk_confirm_save_draft">Зберегти чернетку\?</string>
<string name="sk_schedule_or_draft">Запланувати або перемістити до чернеток</string>
<string name="sk_compose_no_schedule">Не планувати</string>
<string name="sk_compose_no_draft">Не переміщувати до чернеток</string>
<string name="sk_settings_reduce_motion">Зменшити рух в анімації</string>
<string name="sk_mark_as_read">Позначити прочитаним</string>
<string name="sk_settings_about_instance">Про сервер</string>
<string name="sk_create">Створити</string>
<string name="sk_create_list_title">Створити список</string>
<string name="sk_list_name_hint">Назва списку</string>
<string name="sk_list_replies_policy">Показати відповіді для</string>
<string name="sk_list_replies_policy_list">учасники списку</string>
<string name="sk_list_replies_policy_none">ніхто</string>
<string name="sk_delete_list">Видалити список</string>
<string name="sk_delete_list_confirm">Ви впевнені, що хочете видалити список «%s»\?</string>
<string name="sk_edit_list_title">Редагувати список</string>
<string name="sk_your_lists">Ваші списки</string>
<string name="sk_announcements">Оголошення</string>
<string name="sk_settings_single_notification">Показувати лише одне сповіщення</string>
<string name="sk_list_replies_policy_followed">відстежувані користувачі</string>
<string name="sk_timeline_home">Головна</string>
<string name="sk_timeline_local">Локальна</string>
<string name="sk_timeline_federated">Федерація</string>
<string name="sk_recent_searches_placeholder">Введіть щось, щоб почати пошук</string>
</resources>

View File

@@ -32,7 +32,7 @@
<string name="sk_list_timelines">列表</string>
<string name="sk_accept_follow_request">接受关注请求</string>
<string name="sk_reject_follow_request">拒绝关注请求</string>
<string name="sk_lists_with_user">%s 列表</string>
<string name="sk_lists_with_user">使用 %s 编辑列表</string>
<string name="sk_disable_marquee">禁用标题栏的滚动文本</string>
<string name="sk_settings_contribute">向 Moshidon 贡献</string>
<string name="sk_settings_show_federated_timeline">显示联邦时间轴</string>
@@ -90,13 +90,13 @@
<string name="sk_loading_resource_on_instance_title">在 %s 上查找</string>
<string name="sk_resource_not_found">找不到资源</string>
<string name="sk_open_with_account">用另一个帐户打开</string>
<string name="sk_bookmark_as">其他帐户中添加书签</string>
<string name="sk_bookmark_as">其他帐户书签</string>
<string name="sk_bookmarked_as">已标记为 %s</string>
<string name="sk_already_bookmarked">已加入书签</string>
<string name="sk_favorite_as">其他帐户收藏</string>
<string name="sk_favorite_as">其他账号收藏</string>
<string name="sk_favorited_as">收藏为 %s</string>
<string name="sk_already_favorited">已收藏</string>
<string name="sk_reblog_as">其他帐户重新登录</string>
<string name="sk_reblog_as">其他账号转发</string>
<string name="sk_reblogged_as">重新登录为 %s</string>
<string name="sk_already_reblogged">已重新登录</string>
<string name="sk_reply_as">用其他帐号回复</string>
@@ -118,4 +118,33 @@
<string name="sk_scheduled_too_soon">嘟文必须预订在未来至少 10 分钟后。</string>
<string name="sk_save_draft">保存草稿?</string>
<string name="sk_save_changes">保存更改?</string>
<string name="sk_confirm_save_draft">保存草稿?</string>
<string name="sk_confirm_save_changes">保存更改?</string>
<string name="sk_mark_as_draft">标记为草稿</string>
<string name="sk_schedule_post">预订嘟文</string>
<string name="sk_compose_no_schedule">不预订</string>
<string name="sk_compose_no_draft">不要标记为草稿</string>
<string name="sk_settings_reduce_motion">减少动画中的效果</string>
<string name="sk_schedule_or_draft">预订或草稿</string>
<string name="sk_announcements">公告</string>
<string name="sk_mark_as_read">标记为已读</string>
<string name="sk_settings_about_instance">关于实例</string>
<string name="sk_settings_single_notification">只显示一个通知</string>
<string name="sk_create">创建</string>
<string name="sk_create_list_title">创建列表</string>
<string name="sk_list_name_hint">列表名</string>
<string name="sk_list_replies_policy">显示回复</string>
<string name="sk_list_replies_policy_list">列出成员</string>
<string name="sk_list_replies_policy_followed">关注的用户</string>
<string name="sk_list_replies_policy_none">没有人</string>
<string name="sk_delete_list">删除列表</string>
<string name="sk_delete_list_confirm">您确定要删除列表“%s”吗</string>
<string name="sk_edit_list_title">编辑列表</string>
<string name="sk_your_lists">你的列表</string>
<string name="sk_timeline_federated">联邦</string>
<string name="sk_recent_searches_placeholder">输入内容开始搜索</string>
<string name="sk_remove_follower">删除关注者</string>
<string name="sk_do_remove_follower">删除</string>
<string name="sk_remove_follower_success">成功删除关注者</string>
<string name="sk_changelog">变更日志</string>
</resources>

View File

@@ -19,4 +19,6 @@
<item name="notifications_all" type="id"/>
<item name="notifications_mentions" type="id"/>
<item name="notifications_posts" type="id"/>
<item name="timeline_home" type="id" />
</resources>

View File

@@ -34,7 +34,7 @@
<string name="sk_follow_requests">Follow requests</string>
<string name="sk_accept_follow_request">Accept follow request</string>
<string name="sk_reject_follow_request">Reject follow request</string>
<string name="sk_lists_with_user">Lists with %s</string>
<string name="sk_lists_with_user">Edit lists with %s</string>
<string name="sk_settings_always_reveal_content_warnings">Always reveal content warnings</string>
<string name="sk_disable_marquee">Disable scrolling text in title bars</string>
<string name="sk_disable_dividers">Disable post dividers</string>
@@ -68,6 +68,9 @@
<string name="sk_app_username" translatable="false">\@moshidon</string>
<string name="sk_tabs_disable_swipe">Disable swiping between tabs</string>
<string name="sk_settings_profile">Set up profile</string>
<string name="sk_personal_note">Add a note about this profile</string>
<string name="sk_personal_note_confirm">Confirm changes to note</string>
<string name="sk_personal_note_update_failed">Failed to save note</string>
<string name="sk_settings_posting">Posting preferences</string>
<string name="sk_settings_filters">Configure filters</string>
<string name="sk_settings_auth">Security settings</string>
@@ -139,10 +142,32 @@
<string name="sk_keep_only_latest_notification">Keep only latest notification</string>
<string name="sk_announcements">Announcements</string>
<string name="sk_mark_as_read">Mark as read</string>
<string name="sk_settings_about_instance">About instance</string>
<string name="sk_settings_single_notification">Only show one notification</string>
<string name="sk_create">Create</string>
<string name="sk_create_list_title">Create list</string>
<string name="sk_list_name_hint">List name</string>
<string name="sk_list_replies_policy">Show replies to</string>
<string name="sk_list_replies_policy_list">list members</string>
<string name="sk_list_replies_policy_followed">followed users</string>
<string name="sk_list_replies_policy_none">no one</string>
<string name="sk_delete_list">Delete list</string>
<string name="sk_delete_list_confirm">Are you sure you want to delete the list “%s”?</string>
<string name="sk_edit_list_title">Edit list</string>
<string name="sk_your_lists">Your lists</string>
<string name="sk_timeline_home">Home</string>
<string name="sk_timeline_local">Local</string>
<string name="sk_timeline_federated">Federation</string>
<string name="sk_recent_searches_placeholder">Type something to start searching</string>
<string name="sk_remove_follower">Remove as follower</string>
<string name="sk_remove_follower_confirm">Remove %s as a follower by blocking and immediately unblocking them?</string>
<string name="sk_do_remove_follower">Remove</string>
<string name="sk_remove_follower_success">Successfully removed follower</string>
<!-- accessibility labels-->
<string name="sk_poll_option_add">Add new poll option</string>
<string name="sk_fab_compose">Compose</string>
<string name="sk_sending_error">Error publishing</string>
</resources>

View File

@@ -0,0 +1,4 @@
- Corregeix la renderització trencada d'etiquetes HTML i activa la renderització del format Markdown
- Inicia el <a href="https://translate.codeberg.org/projects/megalodon">projecte de traducció a Weblate</a>
- Afegeix un commutador per a la línia de temps federada
- Les versions 52-54 eren xicotets ajustos per a un llançament a Google Play

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