Compare commits

..

169 Commits

Author SHA1 Message Date
LucasGGamerM
d95b395cfc docs: add changelog 2023-03-07 15:20:40 -03:00
LucasGGamerM
b41b2c8f3c build: bump version 2023-03-07 15:17:34 -03:00
LucasGGamerM
289dc4bf86 Merge remote-tracking branch 'weblate/master'
# Conflicts:
#	mastodon/src/main/res/values-de-rDE/strings_mo.xml
#	mastodon/src/main/res/values-pt-rBR/strings_mo.xml
#	mastodon/src/main/res/values-zh-rCN/strings_mo.xml
2023-03-07 14:52:54 -03:00
CDN18
c34e1e5f32 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (32 of 32 strings)

Translation: Moshidon/metadata
Translate-URL: https://translate.codeberg.org/projects/moshidon/metadata/zh_Hans/
2023-03-07 17:52:01 +00:00
CDN18
729680df8c Translated using Weblate (Chinese (Simplified))
Currently translated at 97.3% (37 of 38 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/zh_Hans/
2023-03-07 17:52:01 +00:00
LucasGGamerM
b85b578ddd Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (38 of 38 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/pt_BR/
2023-03-07 17:52:01 +00:00
dontobi
8a7d2df7b8 Translated using Weblate (German)
Currently translated at 100.0% (38 of 38 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/de/
2023-03-07 17:52:01 +00:00
LucasGGamerM
3ff3eb819a Translated using Weblate (Portuguese (Brazil))
Currently translated at 9.3% (3 of 32 strings)

Translation: Moshidon/metadata
Translate-URL: https://translate.codeberg.org/projects/moshidon/metadata/pt_BR/
2023-03-07 17:52:01 +00:00
gallegonovato
1ea24b5ff6 Translated using Weblate (Spanish)
Currently translated at 68.7% (22 of 32 strings)

Translation: Moshidon/metadata
Translate-URL: https://translate.codeberg.org/projects/moshidon/metadata/es/
2023-03-07 17:52:01 +00:00
poesty
79d0ab311b Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (26 of 26 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/zh_Hans/
2023-03-07 17:52:01 +00:00
LucasGGamerM
79f7df089e Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (26 of 26 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/pt_BR/
2023-03-07 17:52:01 +00:00
gallegonovato
32464f8552 Translated using Weblate (Spanish)
Currently translated at 100.0% (26 of 26 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/es/
2023-03-07 17:52:01 +00:00
dontobi
7ce96a2311 Translated using Weblate (German)
Currently translated at 100.0% (26 of 26 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/de/
2023-03-07 17:52:01 +00:00
dontobi
a009ea212f Translated using Weblate (German)
Currently translated at 100.0% (32 of 32 strings)

Translation: Moshidon/metadata
Translate-URL: https://translate.codeberg.org/projects/moshidon/metadata/de/
2023-03-07 17:52:01 +00:00
LucasGGamerM
8848b75325 Merge remote-tracking branch 'weblate/master' 2023-03-07 14:51:16 -03:00
LucasGGamerM
2eb04a3835 Merge remote-tracking branch 'megalodon_weblate/main' 2023-03-07 14:51:06 -03:00
LucasGGamerM
b61ce8399e docs: add translation widget to READMe 2023-03-07 14:49:07 -03:00
LucasGGamerM
52392c9ed9 feat: add toggle for defaulting to unlisted replies 2023-03-07 14:29:48 -03:00
LucasGGamerM
4b35ac6ad8 refactor(settings-page): move Disable Swipe setting between tabs to behavior section 2023-03-07 14:03:02 -03:00
LucasGGamerM
a56b603c5c refactor(settings-page): change the order of the sections 2023-03-07 14:00:38 -03:00
LucasGGamerM
48bd277769 refactor(mute-user-timer): add bottom padding for design consistency 2023-03-06 21:07:48 -03:00
LucasGGamerM
04101eb31b refactor(settings-page): adding new sections and reorganizing settings 2023-03-06 20:52:58 -03:00
LucasGGamerM
34c6a76a53 Translated using Weblate (Portuguese (Brazil))
Currently translated at 9.3% (3 of 32 strings)

Translation: Moshidon/metadata
Translate-URL: https://translate.codeberg.org/projects/moshidon/metadata/pt_BR/
2023-03-06 23:39:04 +00:00
gallegonovato
3f20c6104a Translated using Weblate (Spanish)
Currently translated at 68.7% (22 of 32 strings)

Translation: Moshidon/metadata
Translate-URL: https://translate.codeberg.org/projects/moshidon/metadata/es/
2023-03-06 23:39:04 +00:00
poesty
b5f82261b0 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (26 of 26 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/zh_Hans/
2023-03-06 23:39:04 +00:00
LucasGGamerM
b9a5db7ea4 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (26 of 26 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/pt_BR/
2023-03-06 23:39:04 +00:00
gallegonovato
64cb6e52a8 Translated using Weblate (Spanish)
Currently translated at 100.0% (26 of 26 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/es/
2023-03-06 23:39:04 +00:00
dontobi
6e96e8929f Translated using Weblate (German)
Currently translated at 100.0% (26 of 26 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/de/
2023-03-06 23:39:04 +00:00
dontobi
bdd48f0001 Translated using Weblate (German)
Currently translated at 100.0% (32 of 32 strings)

Translation: Moshidon/metadata
Translate-URL: https://translate.codeberg.org/projects/moshidon/metadata/de/
2023-03-06 23:39:04 +00:00
LucasGGamerM
4bf19adc8e chore: add new strings 2023-03-06 20:38:51 -03:00
LucasGGamerM
bb9ff3c33f feat(unlisted-replies-by-default-toggle): add relevant string 2023-03-06 20:24:05 -03:00
LucasGGamerM
ae11e78d78 refactor: increase border radius of inline buttons 2023-03-06 20:20:52 -03:00
LucasGGamerM
222c3a2526 refactor(add-mute-timer): change of the mute timer popup layout 2023-03-06 20:19:21 -03:00
LucasGGamerM
08aa64a666 fix(strings): fix typo in "day" 2023-03-06 20:00:51 -03:00
LucasGGamerM
f10c157598 Merge branch 'master' of https://github.com/LucasGGamerM/moshidon 2023-03-06 19:54:08 -03:00
LucasGGamerM
5059d8fc4f Merge pull request #111 from FineFindus/feat/mute-timer
feat: add mute timer
2023-03-06 19:53:45 -03:00
FineFindus
4152179dea fix(request/mute): add correct body on unmute 2023-03-06 22:00:49 +01:00
FineFindus
3619be71ab feat: add mute timer 2023-03-06 21:55:32 +01:00
AiOO
810e9eeb11 Translated using Weblate (Korean)
Currently translated at 100.0% (16 of 16 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/ko/
2023-03-05 15:08:20 +00:00
AiOO
25cff94665 Translated using Weblate (Korean)
Currently translated at 100.0% (262 of 262 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/ko/
2023-03-05 15:08:20 +00:00
LucasGGamerM
0e08209f4c style: remove unused imports on CustomLocalTimelineFragment.java 2023-03-04 10:33:07 -03:00
LucasGGamerM
db0b4fb615 refactor(README): swappping "this app" to Moshidon in FAQ 2023-03-04 10:21:02 -03:00
LucasGGamerM
672cfe58d6 fix(notification-actions): replies done within the notification actions now respect the status language and visibility, and also automatically add a mention to the replied account at the end of the reply status. 2023-03-04 10:13:03 -03:00
LucasGGamerM
338e164143 refactor: moving "notification_action_replied" string to strings_mo.xml 2023-03-04 10:07:28 -03:00
LucasGGamerM
e964b76302 refactor: re-using strings in the notification actions instead of new ones 2023-03-04 10:03:53 -03:00
LucasGGamerM
8dedc77ff8 Merge pull request #108
feat(notification): add reply action
2023-03-04 09:44:14 -03:00
LucasGGamerM
3b762c14a1 docs: Add faq section to README 2023-03-04 08:25:43 -03:00
FineFindus
59941fc867 style(notifications-actions/reply): clean-up 2023-03-03 23:49:45 +01:00
FineFindus
50601853f5 feat(notifications/actions): add reply action
Closes https://github.com/LucasGGamerM/moshidon/issues/104
2023-03-03 23:45:07 +01:00
LucasGGamerM
3137f3c1e4 docs: Adding link to Google Play Store 2023-03-03 17:21:49 -03:00
LucasGGamerM
bfaa732544 refactor: Increasing the corner radius of statuses and accounts in the notification section 2023-03-03 16:30:19 -03:00
LucasGGamerM
1b7a257a48 Merge pull request #106 from FineFindus/feat/notification-badge
Feat(tabs): add unread badge to notification tab
2023-03-01 18:12:40 -03:00
LucasGGamerM
4d40fad10d fix: Notifcations not refreshing without manually doing so. Fixes #105 2023-03-01 18:11:07 -03:00
FineFindus
49015f3e3e style: remove unnecessary imports 2023-03-01 22:06:31 +01:00
LucasGGamerM
77b5819c65 Merge pull request #102 from FineFindus/feat/notification-actions
Feat: Add actions to notifications
2023-03-01 18:01:43 -03:00
FineFindus
ac5615497b refactor(notifications-tab/badge): use improved implementation
Removes the now unecessary network call, by hooking into the notification reciever instead.
2023-03-01 22:00:49 +01:00
FineFindus
4ecd525f13 feat(tabs/notifications): add unread badge 2023-03-01 21:44:11 +01:00
LucasGGamerM
e7cd1cfda2 docs: update screenshot for play store 2023-02-27 21:31:39 -03:00
LucasGGamerM
17afa8e6f5 docs: changelog 98 2023-02-27 20:36:32 -03:00
LucasGGamerM
8385fb9586 chore: wiping duplicate stuff 2023-02-27 20:35:36 -03:00
LucasGGamerM
ba44aa57d7 build: bump version number 2023-02-27 20:34:43 -03:00
LucasGGamerM
a70647da44 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (25 of 25 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/pt_BR/
2023-02-27 23:33:29 +00:00
LucasGGamerM
f97aafe374 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (25 of 25 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/pt_BR/
2023-02-27 23:28:58 +00:00
FineFindus
b38a460a02 style(notifications/action): fix whitespaces 2023-02-27 21:20:02 +01:00
FineFindus
bddf024ba0 fix(notifications/action): remove unused string 2023-02-27 21:18:51 +01:00
FineFindus
be7a7acadd fix(notifications/action): remove notification after tapping action 2023-02-27 21:15:28 +01:00
FineFindus
d05c90ca7f fix(notifications/action): use radom request code
Fixes the issue with pendingIntents overwriting each other. Probability of equal same request code should be near 0 with 2^32 ints available
2023-02-27 20:24:09 +01:00
FineFindus
4187da9168 feat(notifications/action): remove notfication after action 2023-02-26 21:56:18 +01:00
FineFindus
a051e636e6 feat(notifications/action): add unboost action 2023-02-26 20:50:03 +01:00
FineFindus
360cd7b5df feat(notifications/action): only show actions if necessary 2023-02-26 19:15:31 +01:00
FineFindus
55d2ca4a93 feat(notifications/action): use string titles 2023-02-26 15:23:38 +01:00
FineFindus
c7f61291ed feat(notifications/action): add boost action 2023-02-26 15:21:52 +01:00
LucasGGamerM
f836361644 fix: NPE in HeaderStatusDisplayItem when clicking on a "User followed you" avatar header in notifications fragment 2023-02-25 20:58:10 -03:00
FineFindus
f404895b5c feat(notification): add actions 2023-02-25 23:19:41 +01:00
FineFindus
94ed0c3f49 Merge branch 'master' 2023-02-25 21:00:09 +01:00
FineFindus
00ffe9c41e Merge branch 'master' 2023-02-25 21:00:04 +01:00
LucasGGamerM
529c1e2b07 Merge remote-tracking branch 'weblate/master' 2023-02-25 15:49:24 -03:00
LucasGGamerM
f2e04e6769 Merge remote-tracking branch 'megalodon_weblate/main'
# Conflicts:
#	metadata/it-IT/full_description.txt
2023-02-25 15:49:07 -03:00
LucasGGamerM
f1a7603bdf Adding 97 changelog 2023-02-25 15:48:22 -03:00
LucasGGamerM
280434b01f Bump version number 2023-02-25 15:46:46 -03:00
LucasGGamerM
023a6c3a49 fix(custom-local-timelines): Loading threads on custom local timelines now works! 2023-02-25 15:39:56 -03:00
LucasGGamerM
ed301cafe0 fix(custom-local-timelines): Profile lookup now is more robust and doesn't call the the user's instance unless a click happens 2023-02-25 14:27:21 -03:00
LucasGGamerM
5e97adcd3b fix(custom-local-timelines): Removing the get account by handle function for each status, and interactions now are fully working. 2023-02-25 14:18:27 -03:00
ewm
487deae044 Translated using Weblate (Polish)
Currently translated at 13.3% (4 of 30 strings)

Translation: Moshidon/metadata
Translate-URL: https://translate.codeberg.org/projects/moshidon/metadata/pl/
2023-02-25 16:08:21 +00:00
ewm
a28daa3d75 Translated using Weblate (Polish)
Currently translated at 100.0% (25 of 25 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/pl/
2023-02-25 16:08:21 +00:00
LucasGGamerM
75f311b8a7 Merge pull request #100 from FineFindus/feat/custom-welcome-inputtype
feat(custom-welcome): use URI InputType
2023-02-25 11:17:26 -03:00
LucasGGamerM
5d11bee59d refactor(perf): initial optimizations for concurrent requests. Profile now loads faster 2023-02-24 15:55:49 -03:00
FineFindus
cd027f1220 feat(custom-welcome): use URI InputType 2023-02-24 08:43:20 +00:00
LucasGGamerM
1d55354be2 fix(custom-local-timelines): interactions now work! 2023-02-23 20:14:52 -03:00
nitrogenez47ab3e44720c4675
3143f28e04 Translated using Weblate (Ukrainian)
Currently translated at 13.3% (4 of 30 strings)

Translation: Moshidon/metadata
Translate-URL: https://translate.codeberg.org/projects/moshidon/metadata/uk/
2023-02-23 04:08:21 +00:00
poesty
d381205bbf Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (25 of 25 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/zh_Hans/
2023-02-23 04:08:21 +00:00
nitrogenez47ab3e44720c4675
6b6852e134 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (25 of 25 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/uk/
2023-02-23 04:08:21 +00:00
Andrewblasco
f7a41906e4 Translated using Weblate (Spanish)
Currently translated at 100.0% (25 of 25 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/es/
2023-02-23 04:08:21 +00:00
dontobi
70ddea2e81 Translated using Weblate (German)
Currently translated at 100.0% (25 of 25 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/de/
2023-02-23 04:08:21 +00:00
dontobi
92a806462d Translated using Weblate (German)
Currently translated at 100.0% (30 of 30 strings)

Translation: Moshidon/metadata
Translate-URL: https://translate.codeberg.org/projects/moshidon/metadata/de/
2023-02-23 04:08:20 +00:00
LucasGGamerM
8111ea04b9 fix: Profile lookups on custom local timelines now work 2023-02-22 17:21:33 -03:00
Espasant3
371f97fa5a Translated using Weblate (Galician)
Currently translated at 100.0% (16 of 16 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/gl/
2023-02-22 15:08:21 +00:00
gicorada
f7def3ab01 Translated using Weblate (Italian)
Currently translated at 100.0% (16 of 16 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/it/
2023-02-22 15:08:20 +00:00
gicorada
1cefc8aaf2 Translated using Weblate (Italian)
Currently translated at 100.0% (262 of 262 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/it/
2023-02-22 15:08:20 +00:00
LucasGGamerM
a72849bae1 Merge pull request #96 from FineFindus/feat/custom-timelines-input-type
feat(custom-timelines): use URI InputType
2023-02-20 18:29:14 -03:00
FineFindus
5e6b56a738 feat(custom-timelines): use URI InputType 2023-02-20 22:11:39 +01:00
LucasGGamerM
58c754ea2d Fixing typo 2023-02-20 17:21:20 -03:00
LucasGGamerM
c22374b712 96 changelog 2023-02-20 17:18:21 -03:00
LucasGGamerM
7820926e1a Bump version nummber 2023-02-20 17:15:33 -03:00
LucasGGamerM
fcf5887359 Changing the icon of the add timelines button 2023-02-20 17:01:01 -03:00
LucasGGamerM
aade898681 Merge pull request #95 from FineFindus/fix/typos
Fix/typos
2023-02-20 16:42:58 -03:00
FineFindus
d6653b5f78 style(readme): hability -> ability 2023-02-20 20:37:28 +01:00
FineFindus
89514dbf14 style(basestatuslist): THRESHHOLD -> THRESHOLD 2023-02-20 20:36:18 +01:00
LucasGGamerM
456fbb6fc9 Maybe fixing the broken custom timelines when there is a poll 2023-02-20 16:32:01 -03:00
LucasGGamerM
f2d29366bd Merge pull request #94 from FineFindus/fix/timeline-hint
fix(custom-timelines): remove default text
2023-02-20 14:46:46 -03:00
FineFindus
ea7c366981 fix(custom-timelines): remove default text 2023-02-20 18:30:31 +01:00
LucasGGamerM
fe7362bb28 Update README.md 2023-02-20 14:25:39 -03:00
LucasGGamerM
a4d739a9a9 Add 95 changelog 2023-02-20 14:08:32 -03:00
LucasGGamerM
d4cf12a0d9 Bump version number 2023-02-20 14:07:24 -03:00
LucasGGamerM
69af790e22 Merge remote-tracking branch 'megalodon_weblate/main' 2023-02-20 14:04:46 -03:00
ewm
2936ec81af Translated using Weblate (Polish)
Currently translated at 100.0% (24 of 24 strings)

Translation: Moshidon/values
Translate-URL: https://translate.codeberg.org/projects/moshidon/values/pl/
2023-02-20 17:03:27 +00:00
LucasGGamerM
d8cd151c7e Adding the local timelines feature and some polishes 2023-02-20 14:00:55 -03:00
LucasGGamerM
1ada4c9f46 Still in the need to Frankenstein the add menu 2023-02-20 13:33:04 -03:00
LucasGGamerM
b5844a5f8c Rewriting the custom local timelines 2023-02-20 11:49:48 -03:00
LucasGGamerM
6f37eb9625 Revert "Initial try to integrate the custom local timelines into the custom tabs system"
This reverts commit 68f88c29d3.
2023-02-20 11:20:01 -03:00
LucasGGamerM
6404d9cf9a Revert "Hardcoding fosstodon and having a half working thing"
This reverts commit 08a3ec99ce.
2023-02-20 11:20:01 -03:00
LucasGGamerM
1837e5204b Revert "Its half working"
This reverts commit a445baf3f0.
2023-02-20 11:20:01 -03:00
LucasGGamerM
9ae0f49bff Revert "Changing hardcoded fosstodon to domain"
This reverts commit 269794bfc3.
2023-02-20 11:20:01 -03:00
LucasGGamerM
269794bfc3 Changing hardcoded fosstodon to domain 2023-02-20 11:14:33 -03:00
a_mento
ef1965a41b Translated using Weblate (Basque)
Currently translated at 100.0% (262 of 262 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/eu/
2023-02-19 23:08:20 +00:00
LucasGGamerM
a445baf3f0 Its half working 2023-02-18 19:40:49 -03:00
LucasGGamerM
08a3ec99ce Hardcoding fosstodon and having a half working thing 2023-02-18 19:27:43 -03:00
LucasGGamerM
68f88c29d3 Initial try to integrate the custom local timelines into the custom tabs system 2023-02-18 17:49:04 -03:00
Espasant3
c2d14c64cb Translated using Weblate (Galician)
Currently translated at 93.7% (15 of 16 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/gl/
2023-02-18 20:08:21 +00:00
ihor_ck
aa554d91f7 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (16 of 16 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/uk/
2023-02-18 20:08:21 +00:00
McKris
cc3845d6f4 Translated using Weblate (Polish)
Currently translated at 100.0% (16 of 16 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/pl/
2023-02-18 20:08:21 +00:00
gallegonovato
2571b2d4f7 Translated using Weblate (Spanish)
Currently translated at 100.0% (16 of 16 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/es/
2023-02-18 20:08:21 +00:00
Linerly
ac7cdb885d Translated using Weblate (Indonesian)
Currently translated at 100.0% (16 of 16 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/id/
2023-02-18 20:08:21 +00:00
ihor_ck
7b5d95f7ee Translated using Weblate (Ukrainian)
Currently translated at 100.0% (262 of 262 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/uk/
2023-02-18 20:08:21 +00:00
McKris
ccf311312e Translated using Weblate (Polish)
Currently translated at 100.0% (262 of 262 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/pl/
2023-02-18 20:08:20 +00:00
Linerly
42222cd327 Translated using Weblate (Indonesian)
Currently translated at 100.0% (262 of 262 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/id/
2023-02-18 20:08:20 +00:00
Espasant3
60961020c8 Translated using Weblate (Galician)
Currently translated at 99.6% (261 of 262 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/gl/
2023-02-18 20:08:20 +00:00
Choukajohn
2a7bba24de Translated using Weblate (French)
Currently translated at 100.0% (262 of 262 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/fr/
2023-02-18 20:08:20 +00:00
gallegonovato
fdbe3fcb13 Translated using Weblate (Spanish)
Currently translated at 100.0% (262 of 262 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/es/
2023-02-18 20:08:20 +00:00
LucasGGamerM
9e9ff07eaf Fixing indentation because why not 2023-02-17 19:46:55 -03:00
LucasGGamerM
f377dca63c Merge pull request #92
fix(star-animation): re-enable star animation
2023-02-17 19:40:57 -03:00
FineFindus
3074100432 fix(favourite): re-enable star animation 2023-02-17 22:36:34 +01:00
FineFindus
ce67fb30bf fix(favourite): set correct gravity for animation 2023-02-17 22:35:46 +01:00
LucasGGamerM
da5f3a9094 Fixing merge conflicts 2023-02-17 18:35:29 -03:00
LucasGGamerM
e12d19d0d6 Merge pull request #91
fix(fab): completly hide in profile page
2023-02-17 18:30:07 -03:00
FineFindus
f6a35e92c7 fix(fab): completly hide in profile page 2023-02-17 22:28:18 +01:00
LucasGGamerM
1e2dd3dec6 Merge remote-tracking branch 'megalodon_main/main'
# Conflicts:
#	mastodon/build.gradle
#	mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java
#	mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java
#	mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java
#	mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java
2023-02-17 17:40:06 -03:00
sk22
7ea42c8403 Translated using Weblate (German)
Currently translated at 100.0% (16 of 16 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/de/
2023-02-17 12:30:41 +00:00
sk22
af9b527f35 Translated using Weblate (German)
Currently translated at 100.0% (262 of 262 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/de/
2023-02-17 12:30:40 +00:00
Espasant3
df58cdd86e Translated using Weblate (Galician)
Currently translated at 100.0% (15 of 15 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/gl/
2023-02-17 12:27:57 +00:00
ihor_ck
507fcea646 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (15 of 15 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/uk/
2023-02-17 12:27:57 +00:00
McKris
5cd1e88da9 Translated using Weblate (Polish)
Currently translated at 100.0% (15 of 15 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/pl/
2023-02-17 12:27:57 +00:00
AiOO
e2293899f0 Translated using Weblate (Korean)
Currently translated at 100.0% (15 of 15 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/ko/
2023-02-17 12:27:57 +00:00
gallegonovato
1c743ee3a6 Translated using Weblate (Spanish)
Currently translated at 100.0% (15 of 15 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/es/
2023-02-17 12:27:57 +00:00
ihor_ck
daf4c69df4 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (259 of 259 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/uk/
2023-02-17 12:27:57 +00:00
McKris
14d3add7b3 Translated using Weblate (Polish)
Currently translated at 100.0% (259 of 259 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/pl/
2023-02-17 12:27:57 +00:00
Espasant3
7e3193a708 Translated using Weblate (Galician)
Currently translated at 100.0% (259 of 259 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/gl/
2023-02-17 12:27:57 +00:00
gallegonovato
545aa16cd3 Translated using Weblate (Spanish)
Currently translated at 100.0% (259 of 259 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/es/
2023-02-17 12:27:57 +00:00
poesty
4dcf32d13a Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (259 of 259 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/zh_Hans/
2023-02-17 12:27:57 +00:00
AiOO
e0aba23e80 Translated using Weblate (Korean)
Currently translated at 100.0% (259 of 259 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/ko/
2023-02-17 12:27:57 +00:00
sk
b19ae9bb10 bump version 2023-02-17 13:27:41 +01:00
sk22
d20f8669e8 Auto-hide FAB on scroll (#435)
* feat(composeButton): hide fab on scroll
* feat(composeButton): hide when scrolling in profile fragment
* refactor(compose-fab): show fab after small scroll distance
* refactor(compose-fab): code cleanup
* feat(composeButton): hide when scrolling in profile
* fix: duplicate fab var
* feat(fab): show when scrolled to top
* add option to turn it off

---------

Co-authored-by: FineFindus <63370021+FineFindus@users.noreply.github.com>
2023-02-17 13:20:22 +01:00
sk
1567e5aba4 Merge remote-tracking branch 'upstream/master' 2023-02-17 12:45:36 +01:00
sk
6b9b6710cf enable remote-following accounts
closes sk22#431
2023-02-16 19:44:39 +01:00
sk
b07858a66d don't crash when language array empty 2023-02-16 17:04:56 +01:00
sk
c05d0b600e default role color if not provided
fixes sk22#430
2023-02-16 16:42:47 +01:00
Grishka
dd582c4bee Update locales & bump version 2023-02-14 03:57:49 +03:00
Grishka
3a0d314af0 Merge branch 'l10n_master' 2023-02-14 03:49:36 +03:00
sk
a00ca599c1 add newline 2023-02-13 17:58:27 +01:00
112 changed files with 1167 additions and 152 deletions

View File

@@ -5,16 +5,29 @@
> A fork of [megalodon](https://github.com/sk22/megalodon) which is a fork of [official Mastodon Android app](https://github.com/mastodon/mastodon-android) adding important features that are missing in the official app and possibly wont ever be implemented, such as the federated timeline, unlisted posting, bookmarks and an image description viewer. > A fork of [megalodon](https://github.com/sk22/megalodon) which is a fork of [official Mastodon Android app](https://github.com/mastodon/mastodon-android) adding important features that are missing in the official app and possibly wont ever be implemented, such as the federated timeline, unlisted posting, bookmarks and an image description viewer.
[![Download latest release](https://img.shields.io/badge/dynamic/json?color=282C37&label=download%20apk&query=%24.tag_name&url=https%3A%2F%2Fapi.github.com%2Frepos%2FLucasGGamerM%2Fmoshidon%2Freleases%2Flatest&style=for-the-badge)](https://github.com/LucasGGamerM/moshidon/releases/latest/download/moshidon.apk) [![Download latest release](https://img.shields.io/badge/dynamic/json?color=282C37&label=Download%20APK&query=%24.tag_name&url=https%3A%2F%2Fapi.github.com%2Frepos%2FLucasGGamerM%2Fmoshidon%2Freleases%2Flatest&style=for-the-badge)](https://github.com/LucasGGamerM/moshidon/releases/latest/download/moshidon.apk)
[![Translation status](https://translate.codeberg.org/widgets/moshidon/-/svg-badge.svg)](https://translate.codeberg.org/engage/moshidon/)
&nbsp;
<a href="https://play.google.com/store/apps/details?id=org.joinmastodon.android.moshinda"><img height="50" alt="Get it on Google Play" src="img/google-play-badge.png"></a>
&nbsp;
<a href="https://apt.izzysoft.de/fdroid/index/apk/org.joinmastodon.android.moshinda"><img height="50" alt="Get it on IzzyOnDroid" src="img/izzy-badge.png"></a>
---
## F.A.Q
### Q: What are the main differences between Moshidon and Megalodon?
### A: There are many, but the most outstanding differences are: the ability to have other server's local timeline inside the app. It can be acessed in the "Add community" option in the top right corner of the Edit timelines screen. Most other features are pretty minor, such as profile notes directly available in the person's profile. Other features are quite minor usability and visibility improvements. All of which can be found in the settings page.
[<img src="https://gitlab.com/IzzyOnDroid/repo/-/raw/master/assets/IzzyOnDroid.png"
alt="Get it on IzzyOnDroid"
height="80">](https://apt.izzysoft.de/fdroid/index/apk/org.joinmastodon.android.moshinda)
--- ---
## Key features ## Key features
### **The ability to add new custom local timelines!**
### **Material you theme support on Android 12+ devices!** ### **Material you theme support on Android 12+ devices!**
### **Show posts filtered with a warning!** ### **Show posts filtered with a warning!**
@@ -94,7 +107,7 @@ Variant with an integrated updater. If you download Moshidon from here (and not
([Pull request](https://github.com/mastodon/mastodon-android/pull/103)) ([Pull request](https://github.com/mastodon/mastodon-android/pull/103))
* Adding a useful private profile note box!* * Adding a useful private profile note box!*
* Auto hiding the compose button on scroll!* * Auto hiding the compose button on scroll!*
* Adding the hability to remind yourself to add alt text to images!* * Adding the ability to remind yourself to add alt text to images!*
* An indicator for if an image has alt text or not* * An indicator for if an image has alt text or not*
* Adding the ability to have drafts!* * Adding the ability to have drafts!*
* Also adding the ability to view announcements from your instance!* * Also adding the ability to view announcements from your instance!*

View File

@@ -9,8 +9,8 @@ android {
applicationId "org.joinmastodon.android.moshinda" applicationId "org.joinmastodon.android.moshinda"
minSdk 23 minSdk 23
targetSdk 33 targetSdk 33
versionCode 94 versionCode 99
versionName "1.2.0+fork.94.moshinda" versionName "1.2.0+fork.99.moshinda"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 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" 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

@@ -46,6 +46,9 @@ public class GlobalUserPreferences{
public static boolean bottomEncoding; public static boolean bottomEncoding;
public static boolean collapseLongPosts; public static boolean collapseLongPosts;
public static boolean spectatorMode; public static boolean spectatorMode;
public static boolean autoHideFab;
public static boolean unreadNotifications;
public static boolean defaultToUnlistedReplies;
public static String publishButtonText; public static String publishButtonText;
public static ThemePreference theme; public static ThemePreference theme;
public static ColorPreference color; public static ColorPreference color;
@@ -99,6 +102,9 @@ public class GlobalUserPreferences{
bottomEncoding=prefs.getBoolean("bottomEncoding", false); bottomEncoding=prefs.getBoolean("bottomEncoding", false);
collapseLongPosts=prefs.getBoolean("collapseLongPosts", true); collapseLongPosts=prefs.getBoolean("collapseLongPosts", true);
spectatorMode=prefs.getBoolean("spectatorMode", false); spectatorMode=prefs.getBoolean("spectatorMode", false);
autoHideFab=prefs.getBoolean("autoHideFab", true);
unreadNotifications=prefs.getBoolean("unreadNotifications", false);
defaultToUnlistedReplies=prefs.getBoolean("defaultToUnlistedReplies", false);
publishButtonText=prefs.getString("publishButtonText", ""); publishButtonText=prefs.getString("publishButtonText", "");
theme=ThemePreference.values()[prefs.getInt("theme", 0)]; theme=ThemePreference.values()[prefs.getInt("theme", 0)];
recentLanguages=fromJson(prefs.getString("recentLanguages", "{}"), recentLanguagesType, new HashMap<>()); recentLanguages=fromJson(prefs.getString("recentLanguages", "{}"), recentLanguagesType, new HashMap<>());
@@ -147,8 +153,11 @@ public class GlobalUserPreferences{
.putBoolean("prefixRepliesWithRe", prefixRepliesWithRe) .putBoolean("prefixRepliesWithRe", prefixRepliesWithRe)
.putBoolean("collapseLongPosts", collapseLongPosts) .putBoolean("collapseLongPosts", collapseLongPosts)
.putBoolean("spectatorMode", spectatorMode) .putBoolean("spectatorMode", spectatorMode)
.putBoolean("autoHideFab", autoHideFab)
.putBoolean("unreadNotifications", unreadNotifications)
.putString("publishButtonText", publishButtonText) .putString("publishButtonText", publishButtonText)
.putBoolean("bottomEncoding", bottomEncoding) .putBoolean("bottomEncoding", bottomEncoding)
.putBoolean("defaultToUnlistedReplies", defaultToUnlistedReplies)
.putInt("theme", theme.ordinal()) .putInt("theme", theme.ordinal())
.putString("color", color.name()) .putString("color", color.name())
.putString("recentLanguages", gson.toJson(recentLanguages)) .putString("recentLanguages", gson.toJson(recentLanguages))

View File

@@ -7,10 +7,14 @@ import android.content.pm.PackageManager;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log; import android.util.Log;
import android.widget.Toast;
import org.joinmastodon.android.api.ObjectValidationException; import org.joinmastodon.android.api.ObjectValidationException;
import org.joinmastodon.android.api.requests.accounts.SetPrivateNote;
import org.joinmastodon.android.api.requests.statuses.SetStatusFavorited;
import org.joinmastodon.android.api.session.AccountSession; import org.joinmastodon.android.api.session.AccountSession;
import org.joinmastodon.android.api.session.AccountSessionManager; import org.joinmastodon.android.api.session.AccountSessionManager;
import org.joinmastodon.android.events.StatusCountersUpdatedEvent;
import org.joinmastodon.android.fragments.ComposeFragment; import org.joinmastodon.android.fragments.ComposeFragment;
import org.joinmastodon.android.fragments.HomeFragment; import org.joinmastodon.android.fragments.HomeFragment;
import org.joinmastodon.android.fragments.ProfileFragment; import org.joinmastodon.android.fragments.ProfileFragment;
@@ -19,12 +23,17 @@ import org.joinmastodon.android.fragments.onboarding.AccountActivationFragment;
import org.joinmastodon.android.fragments.onboarding.CustomWelcomeFragment; import org.joinmastodon.android.fragments.onboarding.CustomWelcomeFragment;
import org.joinmastodon.android.fragments.onboarding.CustomWelcomeFragment; import org.joinmastodon.android.fragments.onboarding.CustomWelcomeFragment;
import org.joinmastodon.android.model.Notification; import org.joinmastodon.android.model.Notification;
import org.joinmastodon.android.model.NotificationAction;
import org.joinmastodon.android.model.Relationship;
import org.joinmastodon.android.model.Status;
import org.joinmastodon.android.ui.utils.UiUtils; import org.joinmastodon.android.ui.utils.UiUtils;
import org.joinmastodon.android.updater.GithubSelfUpdater; import org.joinmastodon.android.updater.GithubSelfUpdater;
import org.parceler.Parcels; import org.parceler.Parcels;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import me.grishka.appkit.FragmentStackActivity; import me.grishka.appkit.FragmentStackActivity;
import me.grishka.appkit.api.Callback;
import me.grishka.appkit.api.ErrorResponse;
public class MainActivity extends FragmentStackActivity{ public class MainActivity extends FragmentStackActivity{
@Override @Override

View File

@@ -5,6 +5,7 @@ import android.app.NotificationChannel;
import android.app.NotificationChannelGroup; import android.app.NotificationChannelGroup;
import android.app.NotificationManager; import android.app.NotificationManager;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.app.RemoteInput;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
@@ -16,15 +17,24 @@ import android.util.Log;
import org.joinmastodon.android.api.MastodonAPIController; import org.joinmastodon.android.api.MastodonAPIController;
import org.joinmastodon.android.api.requests.notifications.GetNotificationByID; import org.joinmastodon.android.api.requests.notifications.GetNotificationByID;
import org.joinmastodon.android.api.requests.statuses.CreateStatus;
import org.joinmastodon.android.api.requests.statuses.SetStatusBookmarked;
import org.joinmastodon.android.api.requests.statuses.SetStatusFavorited;
import org.joinmastodon.android.api.requests.statuses.SetStatusReblogged;
import org.joinmastodon.android.api.session.AccountSession; import org.joinmastodon.android.api.session.AccountSession;
import org.joinmastodon.android.api.session.AccountSessionManager; import org.joinmastodon.android.api.session.AccountSessionManager;
import org.joinmastodon.android.model.Account; import org.joinmastodon.android.model.Account;
import org.joinmastodon.android.model.NotificationAction;
import org.joinmastodon.android.model.Preferences;
import org.joinmastodon.android.model.PushNotification; import org.joinmastodon.android.model.PushNotification;
import org.joinmastodon.android.model.StatusPrivacy;
import org.joinmastodon.android.ui.utils.UiUtils; import org.joinmastodon.android.ui.utils.UiUtils;
import org.parceler.Parcels; import org.parceler.Parcels;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Random;
import java.util.UUID;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import me.grishka.appkit.api.Callback; import me.grishka.appkit.api.Callback;
@@ -37,6 +47,8 @@ public class PushNotificationReceiver extends BroadcastReceiver{
private static final String TAG="PushNotificationReceive"; private static final String TAG="PushNotificationReceive";
public static final int NOTIFICATION_ID=178; public static final int NOTIFICATION_ID=178;
private static final String ACTION_KEY_TEXT_REPLY = "ACTION_KEY_TEXT_REPLY";
private static final int SUMMARY_ID = 791; private static final int SUMMARY_ID = 791;
private static int notificationId = 0; private static int notificationId = 0;
@@ -76,6 +88,8 @@ public class PushNotificationReceiver extends BroadcastReceiver{
@Override @Override
public void onSuccess(org.joinmastodon.android.model.Notification result){ public void onSuccess(org.joinmastodon.android.model.Notification result){
MastodonAPIController.runInBackground(()->PushNotificationReceiver.this.notify(context, pn, accountID, result)); MastodonAPIController.runInBackground(()->PushNotificationReceiver.this.notify(context, pn, accountID, result));
GlobalUserPreferences.unreadNotifications = true;
GlobalUserPreferences.save();
} }
@Override @Override
@@ -92,6 +106,35 @@ public class PushNotificationReceiver extends BroadcastReceiver{
Log.w(TAG, "onReceive: invalid push notification format"); Log.w(TAG, "onReceive: invalid push notification format");
} }
} }
if(intent.getBooleanExtra("fromNotificationAction", false)){
String accountID=intent.getStringExtra("accountID");
int notificationId=intent.getIntExtra("notificationId", -1);
if (notificationId >= 0){
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancel(accountID, notificationId);
}
if(intent.hasExtra("notification")){
org.joinmastodon.android.model.Notification notification=Parcels.unwrap(intent.getParcelableExtra("notification"));
String statusID=notification.status.id;
if (statusID != null) {
AccountSessionManager accountSessionManager = AccountSessionManager.getInstance();
Preferences preferences = accountSessionManager.getAccount(accountID).preferences;
switch (NotificationAction.values()[intent.getIntExtra("notificationAction", 0)]) {
case FAVORITE -> new SetStatusFavorited(statusID, true).exec(accountID);
case BOOKMARK -> new SetStatusBookmarked(statusID, true).exec(accountID);
case BOOST -> new SetStatusReblogged(notification.status.id, true, preferences.postingDefaultVisibility).exec(accountID);
case UNBOOST -> new SetStatusReblogged(notification.status.id, false, preferences.postingDefaultVisibility).exec(accountID);
case REPLY -> handleReplyAction(context, accountID, intent, notification, notificationId, preferences);
default -> Log.w(TAG, "onReceive: Failed to get NotificationAction");
}
}
}else{
Log.e(TAG, "onReceive: Failed to load notification");
}
}
} }
private void notify(Context context, PushNotification pn, String accountID, org.joinmastodon.android.model.Notification notification){ private void notify(Context context, PushNotification pn, String accountID, org.joinmastodon.android.model.Notification notification){
@@ -165,6 +208,90 @@ public class PushNotificationReceiver extends BroadcastReceiver{
if(AccountSessionManager.getInstance().getLoggedInAccounts().size()>1){ if(AccountSessionManager.getInstance().getLoggedInAccounts().size()>1){
builder.setSubText(accountName); builder.setSubText(accountName);
} }
nm.notify(accountID, GlobalUserPreferences.keepOnlyLatestNotification ? NOTIFICATION_ID : notificationId++, builder.build());
int id = GlobalUserPreferences.keepOnlyLatestNotification ? NOTIFICATION_ID : notificationId++;
if (notification != null){
switch (pn.notificationType){
case MENTION, STATUS -> {
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.N){
builder.addAction(buildReplyAction(context, id, accountID, notification));
}
builder.addAction(buildNotificationAction(context, id, accountID, notification, context.getString(R.string.button_favorite), NotificationAction.FAVORITE));
builder.addAction(buildNotificationAction(context, id, accountID, notification, context.getString(R.string.add_bookmark), NotificationAction.BOOKMARK));
if(notification.status.visibility != StatusPrivacy.DIRECT) {
builder.addAction(buildNotificationAction(context, id, accountID, notification, context.getString(R.string.button_reblog), NotificationAction.BOOST));
}
}
case UPDATE -> {
if(notification.status.reblogged)
builder.addAction(buildNotificationAction(context, id, accountID, notification, context.getString(R.string.sk_undo_reblog), NotificationAction.UNBOOST));
}
}
}
nm.notify(accountID, id, builder.build());
} }
}
private Notification.Action buildNotificationAction(Context context, int notificationId, String accountID, org.joinmastodon.android.model.Notification notification, String title, NotificationAction action){
Intent notificationIntent=new Intent(context, PushNotificationReceiver.class);
notificationIntent.putExtra("notificationId", notificationId);
notificationIntent.putExtra("fromNotificationAction", true);
notificationIntent.putExtra("accountID", accountID);
notificationIntent.putExtra("notificationAction", action.ordinal());
notificationIntent.putExtra("notification", Parcels.wrap(notification));
PendingIntent actionPendingIntent = PendingIntent.getBroadcast(context, new Random().nextInt(), notificationIntent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_ONE_SHOT);
return new Notification.Action.Builder(null, title, actionPendingIntent).build();
}
private Notification.Action buildReplyAction(Context context, int notificationId, String accountID, org.joinmastodon.android.model.Notification notification){
String replyLabel = context.getResources().getString(R.string.button_reply);
RemoteInput remoteInput = new RemoteInput.Builder(ACTION_KEY_TEXT_REPLY)
.setLabel(replyLabel)
.build();
Intent notificationIntent=new Intent(context, PushNotificationReceiver.class);
notificationIntent.putExtra("notificationId", notificationId);
notificationIntent.putExtra("fromNotificationAction", true);
notificationIntent.putExtra("accountID", accountID);
notificationIntent.putExtra("notificationAction", NotificationAction.REPLY.ordinal());
notificationIntent.putExtra("notification", Parcels.wrap(notification));
int flags = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S ? PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT : PendingIntent.FLAG_UPDATE_CURRENT;
PendingIntent replyPendingIntent = PendingIntent.getBroadcast(context, new Random().nextInt(), notificationIntent,flags);
return new Notification.Action.Builder(null, replyLabel, replyPendingIntent).addRemoteInput(remoteInput).build();
}
private void handleReplyAction(Context context, String accountID, Intent intent, org.joinmastodon.android.model.Notification notification, int notificationId, Preferences preferences) {
Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
if (remoteInput == null) {
Log.e(TAG, "handleReplyAction: Could not get reply input");
return;
}
CharSequence input = remoteInput.getCharSequence(ACTION_KEY_TEXT_REPLY);
CreateStatus.Request req=new CreateStatus.Request();
req.status = input.toString() + "\n\n" + "@" + notification.status.account.acct;
req.language = notification.status.language;
req.visibility = notification.status.visibility;
req.inReplyToId = notification.status.id;
if(!notification.status.spoilerText.isEmpty() && GlobalUserPreferences.prefixRepliesWithRe && !notification.status.spoilerText.startsWith("re: ")){
req.spoilerText = "re: " + notification.status.spoilerText;
}
new CreateStatus(req, UUID.randomUUID().toString()).exec(accountID);
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification.Builder builder = android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O ?
new Notification.Builder(context, accountID+"_"+notification.type) :
new Notification.Builder(context)
.setPriority(Notification.PRIORITY_DEFAULT)
.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE);
Notification repliedNotification = builder.setSmallIcon(R.drawable.ic_ntf_logo)
.setContentText(context.getString(R.string.mo_notification_action_replied, notification.status.account.getDisplayUsername()))
.build();
notificationManager.notify(accountID, notificationId, repliedNotification);
}
}

View File

@@ -0,0 +1,11 @@
package org.joinmastodon.android.api.requests.accounts;
import org.joinmastodon.android.api.MastodonAPIRequest;
import org.joinmastodon.android.model.Account;
public class GetAccountByHandle extends MastodonAPIRequest<Account>{
public GetAccountByHandle(String acct){
super(HttpMethod.GET, "/accounts/lookup", Account.class);
addQueryParameter("acct", acct);
}
}

View File

@@ -4,8 +4,15 @@ import org.joinmastodon.android.api.MastodonAPIRequest;
import org.joinmastodon.android.model.Relationship; import org.joinmastodon.android.model.Relationship;
public class SetAccountMuted extends MastodonAPIRequest<Relationship>{ public class SetAccountMuted extends MastodonAPIRequest<Relationship>{
public SetAccountMuted(String id, boolean muted){ public SetAccountMuted(String id, boolean muted, long duration){
super(HttpMethod.POST, "/accounts/"+id+"/"+(muted ? "mute" : "unmute"), Relationship.class); super(HttpMethod.POST, "/accounts/"+id+"/"+(muted ? "mute" : "unmute"), Relationship.class);
setRequestBody(new Object()); setRequestBody(muted ? new Request(duration): new Object());
}
private static class Request{
public long duration;
public Request(long duration){
this.duration=duration;
}
} }
} }

View File

@@ -13,13 +13,11 @@ import android.text.Layout;
import android.text.StaticLayout; import android.text.StaticLayout;
import android.text.TextPaint; import android.text.TextPaint;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.WindowInsets; import android.view.WindowInsets;
import android.view.animation.TranslateAnimation; import android.view.animation.TranslateAnimation;
import android.widget.ImageButton; import android.widget.ImageButton;
import android.widget.ImageButton;
import android.widget.Toolbar; import android.widget.Toolbar;
import org.joinmastodon.android.E; import org.joinmastodon.android.E;
@@ -34,7 +32,6 @@ import org.joinmastodon.android.model.Poll;
import org.joinmastodon.android.model.Relationship; import org.joinmastodon.android.model.Relationship;
import org.joinmastodon.android.model.Status; import org.joinmastodon.android.model.Status;
import org.joinmastodon.android.ui.BetterItemAnimator; import org.joinmastodon.android.ui.BetterItemAnimator;
import org.joinmastodon.android.model.DisplayItemsParent;
import org.joinmastodon.android.ui.PhotoLayoutHelper; import org.joinmastodon.android.ui.PhotoLayoutHelper;
import org.joinmastodon.android.ui.TileGridLayoutManager; import org.joinmastodon.android.ui.TileGridLayoutManager;
import org.joinmastodon.android.ui.displayitems.ExtendedFooterStatusDisplayItem; import org.joinmastodon.android.ui.displayitems.ExtendedFooterStatusDisplayItem;
@@ -85,7 +82,7 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
protected HashMap<String, Relationship> relationships=new HashMap<>(); protected HashMap<String, Relationship> relationships=new HashMap<>();
protected Rect tmpRect=new Rect(); protected Rect tmpRect=new Rect();
private final int THRESHHOLD = 800; private final int THRESHOLD = 800;
public BaseStatusListFragment(){ public BaseStatusListFragment(){
super(20); super(20);
@@ -303,7 +300,7 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
if (fab!=null && GlobalUserPreferences.enableFabAutoHide) { if (fab!=null && GlobalUserPreferences.enableFabAutoHide) {
// This piece of code should make it so that the fab is always visible if the status list scroll view is at the item at the top // This piece of code should make it so that the fab is always visible if the status list scroll view is at the item at the top
if(list.getChildAt(0).getTop() == 0){ if(list.getChildAt(0).getTop() == 0){
scrollDiff=THRESHHOLD+1; scrollDiff= THRESHOLD +1;
}else{ }else{
if(dy > 0){ if(dy > 0){
scrollDiff=0; scrollDiff=0;
@@ -323,7 +320,7 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
fab.setVisibility(View.INVISIBLE); fab.setVisibility(View.INVISIBLE);
scrollDiff = 0; scrollDiff = 0;
} else if (dy < 0 && fab.getVisibility() != View.VISIBLE) { } else if (dy < 0 && fab.getVisibility() != View.VISIBLE) {
if (scrollDiff > THRESHHOLD) { if (scrollDiff > THRESHOLD) {
TranslateAnimation animate = new TranslateAnimation( TranslateAnimation animate = new TranslateAnimation(
0, 0,
0, 0,

View File

@@ -29,6 +29,7 @@ import android.graphics.drawable.LayerDrawable;
import android.icu.text.BreakIterator; import android.icu.text.BreakIterator;
import android.media.MediaMetadataRetriever; import android.media.MediaMetadataRetriever;
import android.net.Uri; import android.net.Uri;
import android.opengl.Visibility;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Parcelable; import android.os.Parcelable;
@@ -1945,7 +1946,9 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
} }
private void loadDefaultStatusVisibility(Bundle savedInstanceState) { private void loadDefaultStatusVisibility(Bundle savedInstanceState) {
if(replyTo != null) statusVisibility = replyTo.visibility; if(replyTo != null) {
statusVisibility = (replyTo.visibility == StatusPrivacy.PUBLIC && GlobalUserPreferences.defaultToUnlistedReplies ? StatusPrivacy.UNLISTED : replyTo.visibility);
}
// A saved privacy setting from a previous compose session wins over the reply visibility // A saved privacy setting from a previous compose session wins over the reply visibility
if(savedInstanceState !=null){ if(savedInstanceState !=null){

View File

@@ -0,0 +1,65 @@
package org.joinmastodon.android.fragments;
import android.app.Activity;
import org.joinmastodon.android.api.requests.timelines.GetPublicTimeline;
import org.joinmastodon.android.model.Filter;
import org.joinmastodon.android.model.Status;
import org.joinmastodon.android.utils.StatusFilterPredicate;
import java.util.List;
import java.util.stream.Collectors;
import me.grishka.appkit.api.SimpleCallback;
public class CustomLocalTimelineFragment extends StatusListFragment {
// private String name;
private String domain;
private String maxID;
@Override
protected boolean withComposeButton() {
return false;
}
@Override
public void onAttach(Activity activity){
super.onAttach(activity);
domain=getArguments().getString("domain");
updateTitle(domain);
setHasOptionsMenu(true);
}
private void updateTitle(String domain) {
this.domain = domain;
setTitle(this.domain);
}
@Override
protected void doLoadData(int offset, int count){
currentRequest=new GetPublicTimeline(true, false, refreshing ? null : maxID, count)
.setCallback(new SimpleCallback<>(this){
@Override
public void onSuccess(List<Status> result){
if(!result.isEmpty())
maxID=result.get(result.size()-1).id;
if (getActivity() == null) return;
result=result.stream().filter(new StatusFilterPredicate(accountID, Filter.FilterContext.PUBLIC)).collect(Collectors.toList());
result.stream().forEach(status -> {
status.account.acct += "@"+domain;
status.reloadWhenClicked = true;
});
onDataLoaded(result, !result.isEmpty());
}
})
.execNoAuth(domain);
}
@Override
protected void onShown(){
super.onShown();
if(!getArguments().getBoolean("noAutoLoad") && !loaded && !dataLoading)
loadData();
}
}

View File

@@ -7,6 +7,7 @@ import static org.joinmastodon.android.ui.utils.UiUtils.makeBackItem;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.text.InputType;
import android.view.Menu; import android.view.Menu;
import android.view.MenuInflater; import android.view.MenuInflater;
import android.view.MenuItem; import android.view.MenuItem;
@@ -15,6 +16,7 @@ import android.view.SubMenu;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.EditText; import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.ImageButton; import android.widget.ImageButton;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
@@ -30,6 +32,7 @@ import org.joinmastodon.android.GlobalUserPreferences;
import org.joinmastodon.android.R; import org.joinmastodon.android.R;
import org.joinmastodon.android.api.requests.lists.GetLists; import org.joinmastodon.android.api.requests.lists.GetLists;
import org.joinmastodon.android.api.requests.tags.GetFollowedHashtags; import org.joinmastodon.android.api.requests.tags.GetFollowedHashtags;
import org.joinmastodon.android.model.CustomLocalTimeline;
import org.joinmastodon.android.model.Hashtag; import org.joinmastodon.android.model.Hashtag;
import org.joinmastodon.android.model.HeaderPaginationList; import org.joinmastodon.android.model.HeaderPaginationList;
import org.joinmastodon.android.model.ListTimeline; import org.joinmastodon.android.model.ListTimeline;
@@ -49,6 +52,7 @@ import me.grishka.appkit.api.Callback;
import me.grishka.appkit.api.ErrorResponse; import me.grishka.appkit.api.ErrorResponse;
import me.grishka.appkit.fragments.BaseRecyclerFragment; import me.grishka.appkit.fragments.BaseRecyclerFragment;
import me.grishka.appkit.utils.BindableViewHolder; import me.grishka.appkit.utils.BindableViewHolder;
import me.grishka.appkit.utils.V;
import me.grishka.appkit.views.UsableRecyclerView; import me.grishka.appkit.views.UsableRecyclerView;
public class EditTimelinesFragment extends BaseRecyclerFragment<TimelineDefinition> implements ScrollableToTop { public class EditTimelinesFragment extends BaseRecyclerFragment<TimelineDefinition> implements ScrollableToTop {
@@ -60,6 +64,7 @@ public class EditTimelinesFragment extends BaseRecyclerFragment<TimelineDefiniti
private final Map<MenuItem, TimelineDefinition> timelineByMenuItem = new HashMap<>(); private final Map<MenuItem, TimelineDefinition> timelineByMenuItem = new HashMap<>();
private final List<ListTimeline> listTimelines = new ArrayList<>(); private final List<ListTimeline> listTimelines = new ArrayList<>();
private final List<Hashtag> hashtags = new ArrayList<>(); private final List<Hashtag> hashtags = new ArrayList<>();
private final List<CustomLocalTimeline> localTimelines = new ArrayList<>();
public EditTimelinesFragment() { public EditTimelinesFragment() {
super(10); super(10);
@@ -128,6 +133,10 @@ public class EditTimelinesFragment extends BaseRecyclerFragment<TimelineDefiniti
optionsMenu.performIdentifierAction(R.id.menu_add_timeline, 0); optionsMenu.performIdentifierAction(R.id.menu_add_timeline, 0);
return true; return true;
} }
if (item.getItemId() == R.id.menu_add_local_timelines) {
addNewLocalTimeline();
return true;
}
TimelineDefinition tl = timelineByMenuItem.get(item); TimelineDefinition tl = timelineByMenuItem.get(item);
if (tl != null) { if (tl != null) {
data.add(tl.copy()); data.add(tl.copy());
@@ -138,6 +147,26 @@ public class EditTimelinesFragment extends BaseRecyclerFragment<TimelineDefiniti
return true; return true;
} }
private void addNewLocalTimeline() {
FrameLayout inputWrap = new FrameLayout(getContext());
EditText input = new EditText(getContext());
input.setHint(R.string.sk_example_domain);
input.setInputType(InputType.TYPE_TEXT_VARIATION_URI);
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.mo_add_custom_server_local_timeline).setView(inputWrap)
.setPositiveButton(R.string.save, (d, which) -> {
TimelineDefinition tl = TimelineDefinition.ofCustomLocalTimeline(input.getText().toString().trim());
data.add(tl);
saveTimelines();
})
.setNegativeButton(R.string.cancel, (d, which) -> {
})
.show();
}
private void addTimelineToOptions(TimelineDefinition tl, Menu menu) { private void addTimelineToOptions(TimelineDefinition tl, Menu menu) {
if (data.contains(tl)) return; if (data.contains(tl)) return;
MenuItem item = menu.add(0, View.generateViewId(), Menu.NONE, tl.getTitle(getContext())); MenuItem item = menu.add(0, View.generateViewId(), Menu.NONE, tl.getTitle(getContext()));
@@ -161,6 +190,9 @@ public class EditTimelinesFragment extends BaseRecyclerFragment<TimelineDefiniti
SubMenu hashtagsMenu = menu.addSubMenu(R.string.sk_hashtag); SubMenu hashtagsMenu = menu.addSubMenu(R.string.sk_hashtag);
hashtagsMenu.getItem().setIcon(R.drawable.ic_fluent_number_symbol_24_regular); hashtagsMenu.getItem().setIcon(R.drawable.ic_fluent_number_symbol_24_regular);
MenuItem addLocalTimelines = menu.add(0, R.id.menu_add_local_timelines, NONE, R.string.local_timeline);
addLocalTimelines.setIcon(R.drawable.ic_fluent_add_24_regular);
makeBackItem(timelinesMenu); makeBackItem(timelinesMenu);
makeBackItem(listsMenu); makeBackItem(listsMenu);
makeBackItem(hashtagsMenu); makeBackItem(hashtagsMenu);

View File

@@ -16,6 +16,10 @@ import android.widget.FrameLayout;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import androidx.annotation.IdRes;
import androidx.annotation.Nullable;
import org.joinmastodon.android.GlobalUserPreferences;
import org.joinmastodon.android.R; import org.joinmastodon.android.R;
import org.joinmastodon.android.api.session.AccountSession; import org.joinmastodon.android.api.session.AccountSession;
import org.joinmastodon.android.api.session.AccountSessionManager; import org.joinmastodon.android.api.session.AccountSessionManager;
@@ -28,8 +32,6 @@ import org.parceler.Parcels;
import java.util.ArrayList; import java.util.ArrayList;
import androidx.annotation.IdRes;
import androidx.annotation.Nullable;
import me.grishka.appkit.FragmentStackActivity; import me.grishka.appkit.FragmentStackActivity;
import me.grishka.appkit.fragments.AppKitFragment; import me.grishka.appkit.fragments.AppKitFragment;
import me.grishka.appkit.fragments.LoaderFragment; import me.grishka.appkit.fragments.LoaderFragment;
@@ -52,6 +54,7 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene
private TabBar tabBar; private TabBar tabBar;
private View tabBarWrap; private View tabBarWrap;
private ImageView tabBarAvatar; private ImageView tabBarAvatar;
private ImageView notificationTabIcon;
@IdRes @IdRes
private int currentTab=R.id.tab_home; private int currentTab=R.id.tab_home;
@@ -117,6 +120,9 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene
Account self=AccountSessionManager.getInstance().getAccount(accountID).self; Account self=AccountSessionManager.getInstance().getAccount(accountID).self;
ViewImageLoader.load(tabBarAvatar, null, new UrlImageLoaderRequest(self.avatar, V.dp(28), V.dp(28))); ViewImageLoader.load(tabBarAvatar, null, new UrlImageLoaderRequest(self.avatar, V.dp(28), V.dp(28)));
notificationTabIcon=content.findViewById(R.id.tab_notifications);
setNotificationBadge();
if(savedInstanceState==null){ if(savedInstanceState==null){
getChildFragmentManager().beginTransaction() getChildFragmentManager().beginTransaction()
.add(R.id.fragment_wrap, homeTabFragment) .add(R.id.fragment_wrap, homeTabFragment)
@@ -255,6 +261,13 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene
scrollable.scrollToTop(); scrollable.scrollToTop();
return; return;
} }
if(tab == R.id.tab_notifications){
GlobalUserPreferences.unreadNotifications = false;
GlobalUserPreferences.save();
setNotificationBadge();
}
getChildFragmentManager().beginTransaction().hide(fragmentForTab(currentTab)).show(newFragment).commit(); getChildFragmentManager().beginTransaction().hide(fragmentForTab(currentTab)).show(newFragment).commit();
maybeTriggerLoading(newFragment); maybeTriggerLoading(newFragment);
currentTab=tab; currentTab=tab;
@@ -327,4 +340,8 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene
// getChildFragmentManager().putFragment(outState, "notificationsFragment", notificationsFragment); // getChildFragmentManager().putFragment(outState, "notificationsFragment", notificationsFragment);
// getChildFragmentManager().putFragment(outState, "profileFragment", profileFragment); // getChildFragmentManager().putFragment(outState, "profileFragment", profileFragment);
} }
private void setNotificationBadge() {
notificationTabIcon.setImageDrawable(getContext().getDrawable(GlobalUserPreferences.unreadNotifications ? R.drawable.ic_notifications_tab_badged : R.drawable.ic_fluent_alert_28_selector));
}
} }

View File

@@ -166,8 +166,11 @@ public class NotificationsListFragment extends BaseStatusListFragment<Notificati
@Override @Override
protected void onShown(){ protected void onShown(){
super.onShown(); super.onShown();
// if(!getArguments().getBoolean("noAutoLoad") && !loaded && !dataLoading) if(!getArguments().getBoolean("noAutoLoad") && !loaded && !dataLoading){
// loadData(); refreshing=true;
loadData();
}
} }
@Override @Override

View File

@@ -26,6 +26,7 @@ import android.view.Menu;
import android.view.MenuInflater; import android.view.MenuInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.SubMenu;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.ViewOutlineProvider; import android.view.ViewOutlineProvider;
@@ -361,6 +362,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
}); });
actionButton.setOnClickListener(this::onActionButtonClick); actionButton.setOnClickListener(this::onActionButtonClick);
actionButton.setOnLongClickListener(this::onActionButtonLongClick);
notifyButton.setOnClickListener(this::onNotifyButtonClick); notifyButton.setOnClickListener(this::onNotifyButtonClick);
avatar.setOnClickListener(this::onAvatarClick); avatar.setOnClickListener(this::onAvatarClick);
cover.setOnClickListener(this::onCoverClick); cover.setOnClickListener(this::onCoverClick);
@@ -576,8 +578,10 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
for (Account.Role role : account.roles) { for (Account.Role role : account.roles) {
TextView roleText = new TextView(getActivity(), null, 0, R.style.role_label); TextView roleText = new TextView(getActivity(), null, 0, R.style.role_label);
roleText.setText(role.name); roleText.setText(role.name);
GradientDrawable bg = (GradientDrawable) roleText.getBackground().mutate(); if (!TextUtils.isEmpty(role.color) && role.color.startsWith("#")) try {
bg.setStroke(V.dp(2), Color.parseColor(role.color)); GradientDrawable bg = (GradientDrawable) roleText.getBackground().mutate();
bg.setStroke(V.dp(2), Color.parseColor(role.color));
} catch (Exception ignored) {}
rolesView.addView(roleText); rolesView.addView(roleText);
} }
} }
@@ -706,6 +710,16 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
}else{ }else{
UiUtils.enableOptionsMenuIcons(getActivity(), menu, R.id.bookmarks, R.id.followed_hashtags, R.id.favorites, R.id.scheduled); UiUtils.enableOptionsMenuIcons(getActivity(), menu, R.id.bookmarks, R.id.followed_hashtags, R.id.favorites, R.id.scheduled);
} }
boolean hasMultipleAccounts = AccountSessionManager.getInstance().getLoggedInAccounts().size() > 1;
MenuItem openWithAccounts = menu.findItem(R.id.open_with_account);
openWithAccounts.setVisible(hasMultipleAccounts);
SubMenu accountsMenu = openWithAccounts.getSubMenu();
if (hasMultipleAccounts) {
accountsMenu.clear();
UiUtils.populateAccountsMenu(accountID, accountsMenu, s-> UiUtils.openURL(
getActivity(), s.getID(), account.url, false
));
}
menu.findItem(R.id.share).setTitle(getString(R.string.share_user, account.getShortUsername())); menu.findItem(R.id.share).setTitle(getString(R.string.share_user, account.getShortUsername()));
if(isOwnProfile) if(isOwnProfile)
return; return;
@@ -880,33 +894,33 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
currentPhotoViewer.offsetView(0, oldScrollY-scrollY); currentPhotoViewer.offsetView(0, oldScrollY-scrollY);
} }
int dy = scrollY - oldScrollY; if(GlobalUserPreferences.enableFabAutoHide){
int dy = scrollY - oldScrollY;
if (dy > 0 && fab.getVisibility() == View.VISIBLE) { if (dy > 0 && fab.getVisibility() == View.VISIBLE) {
TranslateAnimation animate = new TranslateAnimation(
0,
0,
0,
fab.getHeight() * 2);
animate.setDuration(300);
animate.setFillAfter(true);
fab.startAnimation(animate);
fab.setVisibility(View.INVISIBLE);
scrollDiff = 0;
} else if (dy < 0 && fab.getVisibility() != View.VISIBLE) {
if (scrollDiff > 400) {
fab.setVisibility(View.VISIBLE);
TranslateAnimation animate = new TranslateAnimation( TranslateAnimation animate = new TranslateAnimation(
0, 0,
0, 0,
fab.getHeight() * 2, 0,
0); fab.getHeight() * 2);
animate.setDuration(300); animate.setDuration(300);
animate.setFillAfter(true);
fab.startAnimation(animate); fab.startAnimation(animate);
fab.setVisibility(View.INVISIBLE);
scrollDiff = 0; scrollDiff = 0;
} else { } else if (dy < 0 && fab.getVisibility() != View.VISIBLE) {
scrollDiff += Math.abs(dy); if (scrollDiff > 400) {
fab.setVisibility(View.VISIBLE);
TranslateAnimation animate = new TranslateAnimation(
0,
0,
fab.getHeight() * 2,
0);
animate.setDuration(300);
fab.startAnimation(animate);
scrollDiff = 0;
} else {
scrollDiff += Math.abs(dy);
}
} }
} }
} }
@@ -937,6 +951,31 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
} }
} }
private boolean onActionButtonLongClick(View v) {
if (isOwnProfile || AccountSessionManager.getInstance().getLoggedInAccounts().size() < 2) return false;
UiUtils.pickAccount(getActivity(), accountID, R.string.sk_follow_as, R.drawable.ic_fluent_person_add_28_regular, session -> {
UiUtils.lookupAccount(getActivity(), account, session.getID(), accountID, acc -> {
if (acc == null) return;
new SetAccountFollowed(acc.id, true, true).setCallback(new Callback<>() {
@Override
public void onSuccess(Relationship relationship) {
Toast.makeText(
getActivity(),
getString(R.string.sk_followed_as, session.self.getShortUsername()),
Toast.LENGTH_SHORT
).show();
}
@Override
public void onError(ErrorResponse error) {
error.showToast(getActivity());
}
}).exec(session.getID());
});
}, null);
return true;
}
private void setActionProgressVisible(boolean visible){ private void setActionProgressVisible(boolean visible){
actionButton.setTextVisible(!visible); actionButton.setTextVisible(!visible);
actionProgress.setVisibility(visible ? View.VISIBLE : View.GONE); actionProgress.setVisibility(visible ? View.VISIBLE : View.GONE);

View File

@@ -199,46 +199,38 @@ public class SettingsFragment extends MastodonToolbarFragment{
GlobalUserPreferences.alwaysExpandContentWarnings=i.checked; GlobalUserPreferences.alwaysExpandContentWarnings=i.checked;
GlobalUserPreferences.save(); GlobalUserPreferences.save();
})); }));
items.add(new SwitchItem(R.string.sk_tabs_disable_swipe, R.drawable.ic_fluent_swipe_right_24_regular, GlobalUserPreferences.disableSwipe, i->{
GlobalUserPreferences.disableSwipe=i.checked;
GlobalUserPreferences.save();
needAppRestart=true;
}));
items.add(new SwitchItem(R.string.sk_enable_delete_notifications, R.drawable.ic_fluent_mail_inbox_dismiss_24_regular, GlobalUserPreferences.enableDeleteNotifications, i->{
GlobalUserPreferences.enableDeleteNotifications=i.checked;
GlobalUserPreferences.save();
needAppRestart=true;
}));
// items.add(new SwitchItem(R.string.sk_settings_show_differentiated_notification_icons, R.drawable.ic_ntf_logo, GlobalUserPreferences.showUniformPushNoticationIcons, this::onNotificationStyleChanged)); // items.add(new SwitchItem(R.string.sk_settings_show_differentiated_notification_icons, R.drawable.ic_ntf_logo, GlobalUserPreferences.showUniformPushNoticationIcons, this::onNotificationStyleChanged));
items.add(new SwitchItem(R.string.mo_disable_dividers, R.drawable.ic_fluent_timeline_24_regular, GlobalUserPreferences.disableDividers, i->{
GlobalUserPreferences.disableDividers=i.checked;
GlobalUserPreferences.save();
needAppRestart=true;
}));
items.add(new SwitchItem(R.string.mo_hide_compose_button_while_scrolling_setting, R.drawable.ic_fluent_edit_24_regular, GlobalUserPreferences.enableFabAutoHide, i->{ items.add(new SwitchItem(R.string.mo_hide_compose_button_while_scrolling_setting, R.drawable.ic_fluent_edit_24_regular, GlobalUserPreferences.enableFabAutoHide, i->{
GlobalUserPreferences.enableFabAutoHide =i.checked; GlobalUserPreferences.enableFabAutoHide =i.checked;
GlobalUserPreferences.save(); GlobalUserPreferences.save();
needAppRestart=true; needAppRestart=true;
})); }));
items.add(new SwitchItem(R.string.sk_tabs_disable_swipe, R.drawable.ic_fluent_swipe_right_24_regular, GlobalUserPreferences.disableSwipe, i->{
GlobalUserPreferences.disableSwipe=i.checked;
GlobalUserPreferences.save();
needAppRestart=true;
}));
items.add(new HeaderItem(R.string.mo_composer_behavior));
items.add(new SwitchItem(R.string.mo_change_default_reply_visibility_to_unlisted, R.drawable.ic_fluent_lock_closed_24_regular, GlobalUserPreferences.defaultToUnlistedReplies, i->{
GlobalUserPreferences.defaultToUnlistedReplies=i.checked;
GlobalUserPreferences.save();
}));
items.add(new SwitchItem(R.string.mo_relocate_publish_button, R.drawable.ic_fluent_arrow_autofit_down_24_regular, GlobalUserPreferences.relocatePublishButton, i->{ items.add(new SwitchItem(R.string.mo_relocate_publish_button, R.drawable.ic_fluent_arrow_autofit_down_24_regular, GlobalUserPreferences.relocatePublishButton, i->{
GlobalUserPreferences.relocatePublishButton=i.checked; GlobalUserPreferences.relocatePublishButton=i.checked;
GlobalUserPreferences.save(); GlobalUserPreferences.save();
})); }));
items.add(new SwitchItem(R.string.sk_settings_single_notification, R.drawable.ic_fluent_convert_range_24_regular, GlobalUserPreferences.keepOnlyLatestNotification, i->{
GlobalUserPreferences.keepOnlyLatestNotification=i.checked;
GlobalUserPreferences.save();
}));
items.add(new SwitchItem(R.string.sk_settings_prefix_reply_cw_with_re, R.drawable.ic_fluent_arrow_reply_24_regular, GlobalUserPreferences.prefixRepliesWithRe, i->{
GlobalUserPreferences.prefixRepliesWithRe=i.checked;
GlobalUserPreferences.save();
}));
items.add(new SwitchItem(R.string.mo_disable_reminder_to_add_alt_text, R.drawable.ic_fluent_image_alt_text_24_regular, GlobalUserPreferences.disableAltTextReminder, i->{ items.add(new SwitchItem(R.string.mo_disable_reminder_to_add_alt_text, R.drawable.ic_fluent_image_alt_text_24_regular, GlobalUserPreferences.disableAltTextReminder, i->{
GlobalUserPreferences.showNoAltIndicator=i.checked; GlobalUserPreferences.showNoAltIndicator=i.checked;
GlobalUserPreferences.save(); GlobalUserPreferences.save();
needAppRestart=true; needAppRestart=true;
})); }));
items.add(new SwitchItem(R.string.sk_settings_prefix_reply_cw_with_re, R.drawable.ic_fluent_arrow_reply_24_regular, GlobalUserPreferences.prefixRepliesWithRe, i->{
GlobalUserPreferences.prefixRepliesWithRe=i.checked;
GlobalUserPreferences.save();
}));
items.add(new HeaderItem(R.string.sk_timelines)); items.add(new HeaderItem(R.string.sk_timelines));
items.add(new SwitchItem(R.string.sk_settings_show_replies, R.drawable.ic_fluent_chat_multiple_24_regular, GlobalUserPreferences.showReplies, i->{ items.add(new SwitchItem(R.string.sk_settings_show_replies, R.drawable.ic_fluent_chat_multiple_24_regular, GlobalUserPreferences.showReplies, i->{
@@ -303,6 +295,24 @@ public class SettingsFragment extends MastodonToolbarFragment{
items.add(new SwitchItem(R.string.sk_notify_update, R.drawable.ic_fluent_history_24_regular, pushSubscription.alerts.update, i->onNotificationsChanged(PushNotification.Type.UPDATE, i.checked), switchEnabled)); items.add(new SwitchItem(R.string.sk_notify_update, R.drawable.ic_fluent_history_24_regular, pushSubscription.alerts.update, i->onNotificationsChanged(PushNotification.Type.UPDATE, i.checked), switchEnabled));
items.add(new SwitchItem(R.string.sk_notify_poll_results, R.drawable.ic_fluent_poll_24_regular, pushSubscription.alerts.poll, i->onNotificationsChanged(PushNotification.Type.POLL, i.checked), switchEnabled)); items.add(new SwitchItem(R.string.sk_notify_poll_results, R.drawable.ic_fluent_poll_24_regular, pushSubscription.alerts.poll, i->onNotificationsChanged(PushNotification.Type.POLL, i.checked), switchEnabled));
items.add(new HeaderItem(R.string.mo_miscellaneous_settings));
items.add(new SwitchItem(R.string.mo_disable_dividers, R.drawable.ic_fluent_timeline_24_regular, GlobalUserPreferences.disableDividers, i->{
GlobalUserPreferences.disableDividers=i.checked;
GlobalUserPreferences.save();
needAppRestart=true;
}));
items.add(new SwitchItem(R.string.sk_enable_delete_notifications, R.drawable.ic_fluent_mail_inbox_dismiss_24_regular, GlobalUserPreferences.enableDeleteNotifications, i->{
GlobalUserPreferences.enableDeleteNotifications=i.checked;
GlobalUserPreferences.save();
needAppRestart=true;
}));
items.add(new SwitchItem(R.string.sk_settings_single_notification, R.drawable.ic_fluent_convert_range_24_regular, GlobalUserPreferences.keepOnlyLatestNotification, i->{
GlobalUserPreferences.keepOnlyLatestNotification=i.checked;
GlobalUserPreferences.save();
}));
items.add(new HeaderItem(R.string.settings_account)); items.add(new HeaderItem(R.string.settings_account));
items.add(new TextItem(R.string.sk_settings_profile, ()->UiUtils.launchWebBrowser(getActivity(), "https://"+session.domain+"/settings/profile"), R.drawable.ic_fluent_open_24_regular)); items.add(new TextItem(R.string.sk_settings_profile, ()->UiUtils.launchWebBrowser(getActivity(), "https://"+session.domain+"/settings/profile"), R.drawable.ic_fluent_open_24_regular));
items.add(new TextItem(R.string.sk_settings_posting, ()->UiUtils.launchWebBrowser(getActivity(), "https://"+session.domain+"/settings/preferences/other"), R.drawable.ic_fluent_open_24_regular)); items.add(new TextItem(R.string.sk_settings_posting, ()->UiUtils.launchWebBrowser(getActivity(), "https://"+session.domain+"/settings/preferences/other"), R.drawable.ic_fluent_open_24_regular));

View File

@@ -18,6 +18,7 @@ import org.joinmastodon.android.model.Status;
import org.joinmastodon.android.ui.displayitems.ExtendedFooterStatusDisplayItem; import org.joinmastodon.android.ui.displayitems.ExtendedFooterStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.FooterStatusDisplayItem; import org.joinmastodon.android.ui.displayitems.FooterStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.StatusDisplayItem; import org.joinmastodon.android.ui.displayitems.StatusDisplayItem;
import org.joinmastodon.android.ui.utils.UiUtils;
import org.parceler.Parcels; import org.parceler.Parcels;
import java.util.ArrayList; import java.util.ArrayList;
@@ -60,6 +61,18 @@ public abstract class StatusListFragment extends BaseStatusListFragment<Status>{
Status status=getContentStatusByID(id); Status status=getContentStatusByID(id);
if(status==null) if(status==null)
return; return;
if(status.reloadWhenClicked){
UiUtils.lookupStatus(getContext(), status, accountID, null, status1 -> {
status1.filterRevealed = true;
Bundle args=new Bundle();
args.putString("account", accountID);
args.putParcelable("status", Parcels.wrap(status1));
if(status1.inReplyToAccountId!=null && knownAccounts.containsKey(status1.inReplyToAccountId))
args.putParcelable("inReplyToAccount", Parcels.wrap(knownAccounts.get(status1.inReplyToAccountId)));
Nav.go(getActivity(), ThreadFragment.class, args);
});
return;
}
status.filterRevealed = true; status.filterRevealed = true;
Bundle args=new Bundle(); Bundle args=new Bundle();
args.putString("account", accountID); args.putString("account", accountID);

View File

@@ -14,7 +14,7 @@ import java.util.List;
* Represents a user of Mastodon and their associated profile. * Represents a user of Mastodon and their associated profile.
*/ */
@Parcel @Parcel
public class Account extends BaseModel{ public class Account extends BaseModel implements Searchable{
// Base attributes // Base attributes
/** /**
@@ -135,6 +135,11 @@ public class Account extends BaseModel{
public List<Role> roles; public List<Role> roles;
@Override
public String getQuery() {
return url;
}
@Parcel @Parcel
public static class Role { public static class Role {
public String name; public String name;

View File

@@ -0,0 +1,19 @@
package org.joinmastodon.android.model;
import org.joinmastodon.android.api.RequiredField;
import org.parceler.Parcel;
import java.util.List;
@Parcel
public class CustomLocalTimeline extends BaseModel{
@RequiredField
public String domain;
@Override
public String toString(){
return "Hashtag{"+
", url='"+domain+'\''+
'}';
}
}

View File

@@ -121,7 +121,7 @@ public class Instance extends BaseModel{
ci.domain=uri; ci.domain=uri;
ci.normalizedDomain=IDN.toUnicode(uri); ci.normalizedDomain=IDN.toUnicode(uri);
ci.description=Html.fromHtml(shortDescription).toString().trim(); ci.description=Html.fromHtml(shortDescription).toString().trim();
if(languages!=null){ if(languages!=null && languages.size() > 0){
ci.language=languages.get(0); ci.language=languages.get(0);
ci.languages=languages; ci.languages=languages;
}else{ }else{

View File

@@ -0,0 +1,9 @@
package org.joinmastodon.android.model;
public enum NotificationAction {
FAVORITE,
BOOST,
UNBOOST,
BOOKMARK,
REPLY,
}

View File

@@ -17,7 +17,7 @@ public class Poll extends BaseModel{
public boolean multiple; public boolean multiple;
public int votersCount; public int votersCount;
public boolean voted; public boolean voted;
@RequiredField // @RequiredField
public List<Integer> ownVotes; public List<Integer> ownVotes;
@RequiredField @RequiredField
public List<Option> options; public List<Option> options;

View File

@@ -0,0 +1,5 @@
package org.joinmastodon.android.model;
public interface Searchable {
String getQuery();
}

View File

@@ -11,7 +11,7 @@ import java.time.Instant;
import java.util.List; import java.util.List;
@Parcel @Parcel
public class Status extends BaseModel implements DisplayItemsParent{ public class Status extends BaseModel implements DisplayItemsParent, Searchable{
@RequiredField @RequiredField
public String id; public String id;
@RequiredField @RequiredField
@@ -62,6 +62,7 @@ public class Status extends BaseModel implements DisplayItemsParent{
public transient boolean spoilerRevealed; public transient boolean spoilerRevealed;
public transient boolean textExpanded, textExpandable; public transient boolean textExpanded, textExpandable;
public transient boolean hasGapAfter; public transient boolean hasGapAfter;
public boolean reloadWhenClicked;
private transient String strippedText; private transient String strippedText;
@Override @Override
@@ -163,4 +164,9 @@ public class Status extends BaseModel implements DisplayItemsParent{
s.filtered = List.of(); s.filtered = List.of();
return s; return s;
} }
@Override
public String getQuery() {
return url;
}
} }

View File

@@ -10,6 +10,7 @@ import androidx.annotation.StringRes;
import org.joinmastodon.android.BuildConfig; import org.joinmastodon.android.BuildConfig;
import org.joinmastodon.android.R; import org.joinmastodon.android.R;
import org.joinmastodon.android.fragments.CustomLocalTimelineFragment;
import org.joinmastodon.android.fragments.HashtagTimelineFragment; import org.joinmastodon.android.fragments.HashtagTimelineFragment;
import org.joinmastodon.android.fragments.HomeTimelineFragment; import org.joinmastodon.android.fragments.HomeTimelineFragment;
import org.joinmastodon.android.fragments.ListTimelineFragment; import org.joinmastodon.android.fragments.ListTimelineFragment;
@@ -27,7 +28,7 @@ public class TimelineDefinition {
private @Nullable String listId; private @Nullable String listId;
private @Nullable String listTitle; private @Nullable String listTitle;
private @Nullable String domain;
private @Nullable String hashtagName; private @Nullable String hashtagName;
public static TimelineDefinition ofList(String listId, String listTitle) { public static TimelineDefinition ofList(String listId, String listTitle) {
@@ -47,6 +48,12 @@ public class TimelineDefinition {
return def; return def;
} }
public static TimelineDefinition ofCustomLocalTimeline(String domain) {
TimelineDefinition def = new TimelineDefinition(TimelineType.CUSTOM_LOCAL_TIMELINE);
def.domain = domain;
return def;
}
public static TimelineDefinition ofHashtag(Hashtag hashtag) { public static TimelineDefinition ofHashtag(Hashtag hashtag) {
return ofHashtag(hashtag.name); return ofHashtag(hashtag.name);
} }
@@ -78,6 +85,7 @@ public class TimelineDefinition {
case POST_NOTIFICATIONS -> ctx.getString(R.string.sk_timeline_posts); case POST_NOTIFICATIONS -> ctx.getString(R.string.sk_timeline_posts);
case LIST -> listTitle; case LIST -> listTitle;
case HASHTAG -> hashtagName; case HASHTAG -> hashtagName;
case CUSTOM_LOCAL_TIMELINE -> domain;
}; };
} }
@@ -89,6 +97,7 @@ public class TimelineDefinition {
case POST_NOTIFICATIONS -> Icon.POST_NOTIFICATIONS; case POST_NOTIFICATIONS -> Icon.POST_NOTIFICATIONS;
case LIST -> Icon.LIST; case LIST -> Icon.LIST;
case HASHTAG -> Icon.HASHTAG; case HASHTAG -> Icon.HASHTAG;
case CUSTOM_LOCAL_TIMELINE -> Icon.CUSTOM_LOCAL_TIMELINE;
}; };
} }
@@ -100,6 +109,7 @@ public class TimelineDefinition {
case LIST -> new ListTimelineFragment(); case LIST -> new ListTimelineFragment();
case HASHTAG -> new HashtagTimelineFragment(); case HASHTAG -> new HashtagTimelineFragment();
case POST_NOTIFICATIONS -> new NotificationsListFragment(); case POST_NOTIFICATIONS -> new NotificationsListFragment();
case CUSTOM_LOCAL_TIMELINE -> new CustomLocalTimelineFragment();
}; };
} }
@@ -125,6 +135,7 @@ public class TimelineDefinition {
if (type != that.type) return false; if (type != that.type) return false;
if (type == TimelineType.LIST) return Objects.equals(listId, that.listId); if (type == TimelineType.LIST) return Objects.equals(listId, that.listId);
if (type == TimelineType.HASHTAG) return Objects.equals(hashtagName.toLowerCase(), that.hashtagName.toLowerCase()); if (type == TimelineType.HASHTAG) return Objects.equals(hashtagName.toLowerCase(), that.hashtagName.toLowerCase());
if (type == TimelineType.CUSTOM_LOCAL_TIMELINE) return Objects.equals(domain.toLowerCase(), that.domain.toLowerCase());
return true; return true;
} }
@@ -133,6 +144,8 @@ public class TimelineDefinition {
int result = type.ordinal(); int result = type.ordinal();
result = 31 * result + (listId != null ? listId.hashCode() : 0); result = 31 * result + (listId != null ? listId.hashCode() : 0);
result = 31 * result + (hashtagName.toLowerCase() != null ? hashtagName.toLowerCase().hashCode() : 0); result = 31 * result + (hashtagName.toLowerCase() != null ? hashtagName.toLowerCase().hashCode() : 0);
result = 31 * result + (domain.toLowerCase() != null ? domain.toLowerCase().hashCode() : 0);
return result; return result;
} }
@@ -142,6 +155,7 @@ public class TimelineDefinition {
def.listId = listId; def.listId = listId;
def.listTitle = listTitle; def.listTitle = listTitle;
def.hashtagName = hashtagName; def.hashtagName = hashtagName;
def.domain = domain;
def.icon = icon == null ? null : Icon.values()[icon.ordinal()]; def.icon = icon == null ? null : Icon.values()[icon.ordinal()];
return def; return def;
} }
@@ -152,11 +166,13 @@ public class TimelineDefinition {
args.putString("listID", listId); args.putString("listID", listId);
} else if (type == TimelineType.HASHTAG) { } else if (type == TimelineType.HASHTAG) {
args.putString("hashtag", hashtagName); args.putString("hashtag", hashtagName);
} else if (type == TimelineType.CUSTOM_LOCAL_TIMELINE) {
args.putString("domain", domain);
} }
return args; return args;
} }
public enum TimelineType { HOME, LOCAL, FEDERATED, POST_NOTIFICATIONS, LIST, HASHTAG } public enum TimelineType { HOME, LOCAL, FEDERATED, POST_NOTIFICATIONS, LIST, HASHTAG, CUSTOM_LOCAL_TIMELINE }
public enum Icon { public enum Icon {
HEART(R.drawable.ic_fluent_heart_24_regular, R.string.sk_icon_heart), HEART(R.drawable.ic_fluent_heart_24_regular, R.string.sk_icon_heart),
@@ -219,7 +235,8 @@ public class TimelineDefinition {
FEDERATED(R.drawable.ic_fluent_earth_24_regular, R.string.sk_timeline_federated, true), FEDERATED(R.drawable.ic_fluent_earth_24_regular, R.string.sk_timeline_federated, true),
POST_NOTIFICATIONS(R.drawable.ic_fluent_chat_24_regular, R.string.sk_timeline_posts, true), POST_NOTIFICATIONS(R.drawable.ic_fluent_chat_24_regular, R.string.sk_timeline_posts, true),
LIST(R.drawable.ic_fluent_people_24_regular, R.string.sk_list, true), LIST(R.drawable.ic_fluent_people_24_regular, R.string.sk_list, true),
HASHTAG(R.drawable.ic_fluent_number_symbol_24_regular, R.string.sk_hashtag, true); HASHTAG(R.drawable.ic_fluent_number_symbol_24_regular, R.string.sk_hashtag, true),
CUSTOM_LOCAL_TIMELINE(R.drawable.ic_fluent_people_community_24_regular, R.string.sk_timeline_local, true);
public final int iconRes, nameRes; public final int iconRes, nameRes;
public final boolean hidden; public final boolean hidden;

View File

@@ -111,11 +111,11 @@ public class AccountCardStatusDisplayItem extends StatusDisplayItem{
rejectWrap=findViewById(R.id.reject_btn_wrap); rejectWrap=findViewById(R.id.reject_btn_wrap);
View card=findViewById(R.id.card); View card=findViewById(R.id.card);
card.setOutlineProvider(OutlineProviders.roundedRect(6)); card.setOutlineProvider(OutlineProviders.roundedRect(12));
card.setClipToOutline(true); card.setClipToOutline(true);
avatar.setOutlineProvider(OutlineProviders.roundedRect(12)); avatar.setOutlineProvider(OutlineProviders.roundedRect(12));
avatar.setClipToOutline(true); avatar.setClipToOutline(true);
cover.setOutlineProvider(OutlineProviders.roundedRect(3)); cover.setOutlineProvider(OutlineProviders.roundedRect(12));
cover.setClipToOutline(true); cover.setClipToOutline(true);
actionButton.setOnClickListener(this::onActionButtonClick); actionButton.setOnClickListener(this::onActionButtonClick);
acceptButton.setOnClickListener(this::onFollowRequestButtonClick); acceptButton.setOnClickListener(this::onFollowRequestButtonClick);

View File

@@ -191,6 +191,19 @@ public class FooterStatusDisplayItem extends StatusDisplayItem{
} }
private void onReplyClick(View v){ private void onReplyClick(View v){
if(item.status.reloadWhenClicked){
UiUtils.lookupStatus(v.getContext(),
item.status, item.accountID, null,
status -> {
v.startAnimation(opacityIn);
Bundle args=new Bundle();
args.putString("account", item.accountID);
args.putParcelable("replyTo", Parcels.wrap(status));
Nav.go(item.parentFragment.getActivity(), ComposeFragment.class, args);
}
);
return;
}
v.startAnimation(opacityIn); v.startAnimation(opacityIn);
Bundle args=new Bundle(); Bundle args=new Bundle();
args.putString("account", item.accountID); args.putString("account", item.accountID);
@@ -205,6 +218,7 @@ public class FooterStatusDisplayItem extends StatusDisplayItem{
String accountID = session.getID(); String accountID = session.getID();
args.putString("account", accountID); args.putString("account", accountID);
UiUtils.lookupStatus(v.getContext(), item.status, accountID, item.accountID, status -> { UiUtils.lookupStatus(v.getContext(), item.status, accountID, item.accountID, status -> {
if (status == null) return;
args.putParcelable("replyTo", Parcels.wrap(status)); args.putParcelable("replyTo", Parcels.wrap(status));
Nav.go(item.parentFragment.getActivity(), ComposeFragment.class, args); Nav.go(item.parentFragment.getActivity(), ComposeFragment.class, args);
}); });
@@ -213,6 +227,16 @@ public class FooterStatusDisplayItem extends StatusDisplayItem{
} }
private void onBoostClick(View v){ private void onBoostClick(View v){
if(item.status.reloadWhenClicked){
UiUtils.lookupStatus(v.getContext(),
item.status, item.accountID, null,
status -> {
boost.setSelected(!status.reblogged);
AccountSessionManager.getInstance().getAccount(item.accountID).getStatusInteractionController().setReblogged(status, !status.reblogged, null, r->boostConsumer(v, r));
}
);
return;
}
boost.setSelected(!item.status.reblogged); boost.setSelected(!item.status.reblogged);
AccountSessionManager.getInstance().getAccount(item.accountID).getStatusInteractionController().setReblogged(item.status, !item.status.reblogged, null, r->boostConsumer(v, r)); AccountSessionManager.getInstance().getAccount(item.accountID).getStatusInteractionController().setReblogged(item.status, !item.status.reblogged, null, r->boostConsumer(v, r));
} }
@@ -309,14 +333,27 @@ public class FooterStatusDisplayItem extends StatusDisplayItem{
} }
private void onFavoriteClick(View v){ private void onFavoriteClick(View v){
if(item.status.reloadWhenClicked){
UiUtils.lookupStatus(v.getContext(),
item.status, item.accountID, null,
status -> {
favorite.setSelected(!status.favourited);
AccountSessionManager.getInstance().getAccount(item.accountID).getStatusInteractionController().setFavorited(status, !status.favourited, r->{
if (status.favourited) {
v.startAnimation(GlobalUserPreferences.reduceMotion ? opacityIn : animSet);
} else {
v.startAnimation(opacityIn);
}
bindButton(favorite, r.favouritesCount);
});
}
);
return;
}
favorite.setSelected(!item.status.favourited); favorite.setSelected(!item.status.favourited);
AccountSessionManager.getInstance().getAccount(item.accountID).getStatusInteractionController().setFavorited(item.status, !item.status.favourited, r->{ AccountSessionManager.getInstance().getAccount(item.accountID).getStatusInteractionController().setFavorited(item.status, !item.status.favourited, r->{
if (item.status.favourited) { if (item.status.favourited) {
// if(GlobalUserPreferences.reduceMotion){ v.startAnimation(GlobalUserPreferences.reduceMotion ? opacityIn : animSet);
v.startAnimation(opacityIn);
// }else{
// v.startAnimation(animSet);
// }
} else { } else {
v.startAnimation(opacityIn); v.startAnimation(opacityIn);
} }
@@ -339,6 +376,18 @@ public class FooterStatusDisplayItem extends StatusDisplayItem{
} }
private void onBookmarkClick(View v){ private void onBookmarkClick(View v){
if(item.status.reloadWhenClicked){
UiUtils.lookupStatus(v.getContext(),
item.status, item.accountID, null,
status -> {
bookmark.setSelected(!status.bookmarked);
AccountSessionManager.getInstance().getAccount(item.accountID).getStatusInteractionController().setBookmarked(status, !status.bookmarked, r->{
v.startAnimation(opacityIn);
});
}
);
return;
}
bookmark.setSelected(!item.status.bookmarked); bookmark.setSelected(!item.status.bookmarked);
AccountSessionManager.getInstance().getAccount(item.accountID).getStatusInteractionController().setBookmarked(item.status, !item.status.bookmarked, r->{ AccountSessionManager.getInstance().getAccount(item.accountID).getStatusInteractionController().setBookmarked(item.status, !item.status.bookmarked, r->{
v.startAnimation(opacityIn); v.startAnimation(opacityIn);

View File

@@ -441,6 +441,14 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
return; return;
} }
Bundle args=new Bundle(); Bundle args=new Bundle();
if(item.status != null && item.status.reloadWhenClicked){
UiUtils.lookupAccount(v.getContext(), item.status.account, item.accountID, null, account -> {
args.putString("account", item.accountID);
args.putParcelable("profileAccount", Parcels.wrap(account));
Nav.go(item.parentFragment.getActivity(), ProfileFragment.class, args);
});
return;
}
args.putString("account", item.accountID); args.putString("account", item.accountID);
args.putParcelable("profileAccount", Parcels.wrap(item.user)); args.putParcelable("profileAccount", Parcels.wrap(item.user));
Nav.go(item.parentFragment.getActivity(), ProfileFragment.class, args); Nav.go(item.parentFragment.getActivity(), ProfileFragment.class, args);
@@ -481,7 +489,9 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
if (hasMultipleAccounts && accountsMenu != null) { if (hasMultipleAccounts && accountsMenu != null) {
openWithAccounts.setVisible(true); openWithAccounts.setVisible(true);
accountsMenu.clear(); accountsMenu.clear();
populateAccountsMenu(accountsMenu); UiUtils.populateAccountsMenu(item.accountID, accountsMenu, s-> UiUtils.openURL(
item.parentFragment.getActivity(), s.getID(), item.status.url, false
));
} else if (openWithAccounts != null) { } else if (openWithAccounts != null) {
openWithAccounts.setVisible(false); openWithAccounts.setVisible(false);
} }

View File

@@ -67,13 +67,13 @@ public class InsetStatusItemDecoration extends RecyclerView.ItemDecoration{
paint.setColor(bgColor); paint.setColor(bgColor);
rect.left=V.dp(12); rect.left=V.dp(12);
rect.right=list.getWidth()-V.dp(12); rect.right=list.getWidth()-V.dp(12);
rect.inset(V.dp(4), V.dp(4)); rect.intersect(V.dp(4), V.dp(4), V.dp(4), V.dp(-4));
c.drawRoundRect(rect, V.dp(4), V.dp(4), paint); c.drawRoundRect(rect, V.dp(12), V.dp(12), paint);
paint.setStyle(Paint.Style.STROKE); paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(V.dp(1)); paint.setStrokeWidth(V.dp(1));
paint.setColor(borderColor); paint.setColor(borderColor);
rect.inset(paint.getStrokeWidth()/2f, paint.getStrokeWidth()/2f); rect.inset(paint.getStrokeWidth()/2f, paint.getStrokeWidth()/2f);
c.drawRoundRect(rect, V.dp(4), V.dp(4), paint); c.drawRoundRect(rect, V.dp(12), V.dp(12), paint);
} }
@Override @Override

View File

@@ -36,7 +36,9 @@ import android.text.SpannableStringBuilder;
import android.text.Spanned; import android.text.Spanned;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import android.view.Gravity;
import android.view.HapticFeedbackConstants; import android.view.HapticFeedbackConstants;
import android.view.LayoutInflater;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.SubMenu; import android.view.SubMenu;
@@ -87,6 +89,7 @@ import org.joinmastodon.android.model.Notification;
import org.joinmastodon.android.model.Relationship; import org.joinmastodon.android.model.Relationship;
import org.joinmastodon.android.model.ScheduledStatus; import org.joinmastodon.android.model.ScheduledStatus;
import org.joinmastodon.android.model.SearchResults; import org.joinmastodon.android.model.SearchResults;
import org.joinmastodon.android.model.Searchable;
import org.joinmastodon.android.model.Status; import org.joinmastodon.android.model.Status;
import org.joinmastodon.android.model.StatusPrivacy; import org.joinmastodon.android.model.StatusPrivacy;
import org.joinmastodon.android.ui.M3AlertDialogBuilder; import org.joinmastodon.android.ui.M3AlertDialogBuilder;
@@ -98,6 +101,7 @@ import java.lang.reflect.Field;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.net.URI; import java.net.URI;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.time.Duration;
import java.time.Instant; import java.time.Instant;
import java.time.ZoneId; import java.time.ZoneId;
import java.time.ZonedDateTime; import java.time.ZonedDateTime;
@@ -107,8 +111,11 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.BiPredicate; import java.util.function.BiPredicate;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -461,12 +468,45 @@ public class UiUtils{
} }
public static void confirmToggleMuteUser(Activity activity, String accountID, Account account, boolean currentlyMuted, Consumer<Relationship> resultCallback){ public static void confirmToggleMuteUser(Activity activity, String accountID, Account account, boolean currentlyMuted, Consumer<Relationship> resultCallback){
showConfirmationAlert(activity, activity.getString(currentlyMuted ? R.string.confirm_unmute_title : R.string.confirm_mute_title), View menu = LayoutInflater.from(activity).inflate(R.layout.item_mute_duration, null);
activity.getString(currentlyMuted ? R.string.confirm_unmute : R.string.confirm_mute, account.displayName), Button button = menu.findViewById(R.id.button);
activity.getString(currentlyMuted ? R.string.do_unmute : R.string.do_mute),
currentlyMuted ? R.drawable.ic_fluent_speaker_0_28_regular : R.drawable.ic_fluent_speaker_off_28_regular, AtomicReference<Duration> muteDuration = new AtomicReference<>(Duration.ZERO);
()->{
new SetAccountMuted(account.id, !currentlyMuted) PopupMenu popupMenu=new PopupMenu(activity, button, Gravity.CENTER_HORIZONTAL);
popupMenu.inflate(R.menu.mute_duration);
popupMenu.setOnMenuItemClickListener(item -> {
int id = item.getItemId();
if (id == R.id.duration_indefinite)
muteDuration.set(Duration.ZERO);
else if (id == R.id.duration_minutes_5) {
muteDuration.set(Duration.ofMinutes(5));
}else if (id == R.id.duration_minutes_30) {
muteDuration.set(Duration.ofMinutes(30));
}else if (id == R.id.duration_hours_1) {
muteDuration.set(Duration.ofHours(1));
}else if (id == R.id.duration_hours_6) {
muteDuration.set(Duration.ofHours(6));
}else if (id == R.id.duration_days_1) {
muteDuration.set(Duration.ofDays(1));
}else if (id == R.id.duration_days_3) {
muteDuration.set(Duration.ofDays(3));
}else if (id == R.id.duration_days_7) {
muteDuration.set(Duration.ofDays(7));
}
button.setText(item.getTitle());
return true;
});
button.setOnTouchListener(popupMenu.getDragToOpenListener());
button.setOnClickListener(v->popupMenu.show());
button.setText(popupMenu.getMenu().getItem(0).getTitle());
new M3AlertDialogBuilder(activity)
.setTitle(activity.getString(currentlyMuted ? R.string.confirm_unmute_title : R.string.confirm_mute_title))
.setMessage(activity.getString(currentlyMuted ? R.string.confirm_unmute : R.string.confirm_mute, account.displayName))
.setView(currentlyMuted ? null : menu)
.setPositiveButton(activity.getString(currentlyMuted ? R.string.do_unmute : R.string.do_mute), (dlg, i)-> {
new SetAccountMuted(account.id, !currentlyMuted, muteDuration.get().getSeconds())
.setCallback(new Callback<>(){ .setCallback(new Callback<>(){
@Override @Override
public void onSuccess(Relationship result){ public void onSuccess(Relationship result){
@@ -483,7 +523,10 @@ public class UiUtils{
}) })
.wrapProgress(activity, R.string.loading, false) .wrapProgress(activity, R.string.loading, false)
.exec(accountID); .exec(accountID);
}); })
.setNegativeButton(R.string.cancel, null)
.setIcon(currentlyMuted ? R.drawable.ic_fluent_speaker_0_28_regular : R.drawable.ic_fluent_speaker_off_28_regular)
.show();
} }
public static void confirmDeletePost(Activity activity, String accountID, Status status, Consumer<Status> resultCallback){ public static void confirmDeletePost(Activity activity, String accountID, Status status, Consumer<Status> resultCallback){
confirmDeletePost(activity, accountID, status, resultCallback, false); confirmDeletePost(activity, accountID, status, resultCallback, false);
@@ -978,6 +1021,8 @@ public class UiUtils{
public static void pickInteractAs(Context context, String accountID, Status sourceStatus, Predicate<Status> checkInteracted, InteractionPerformer interactionPerformer, @StringRes int interactAsRes, @StringRes int interactedAsAccountRes, @StringRes int alreadyInteractedRes, @DrawableRes int iconRes) { public static void pickInteractAs(Context context, String accountID, Status sourceStatus, Predicate<Status> checkInteracted, InteractionPerformer interactionPerformer, @StringRes int interactAsRes, @StringRes int interactedAsAccountRes, @StringRes int alreadyInteractedRes, @DrawableRes int iconRes) {
pickAccount(context, accountID, interactAsRes, iconRes, session -> { pickAccount(context, accountID, interactAsRes, iconRes, session -> {
lookupStatus(context, sourceStatus, session.getID(), accountID, status -> { lookupStatus(context, sourceStatus, session.getID(), accountID, status -> {
if (status == null) return;
if (checkInteracted.test(status)) { if (checkInteracted.test(status)) {
Toast.makeText(context, alreadyInteractedRes, Toast.LENGTH_SHORT).show(); Toast.makeText(context, alreadyInteractedRes, Toast.LENGTH_SHORT).show();
return; return;
@@ -993,17 +1038,33 @@ public class UiUtils{
}, null); }, null);
} }
public static void lookupStatus(Context context, Status queryStatus, String targetAccountID, @Nullable String sourceAccountID, Consumer<Status> statusConsumer) { public static void lookupStatus(Context context, Status queryStatus, String targetAccountID, @Nullable String sourceAccountID, Consumer<Status> resultConsumer) {
lookup(context, queryStatus, targetAccountID, sourceAccountID, GetSearchResults.Type.STATUSES, resultConsumer, results ->
!results.statuses.isEmpty() ? Optional.of(results.statuses.get(0)) : Optional.empty()
);
}
public static void lookupAccount(Context context, Account queryAccount, String targetAccountID, @Nullable String sourceAccountID, Consumer<Account> resultConsumer) {
lookup(context, queryAccount, targetAccountID, sourceAccountID, GetSearchResults.Type.ACCOUNTS, resultConsumer, results ->
!results.accounts.isEmpty() ? Optional.of(results.accounts.get(0)) : Optional.empty()
);
}
public static <T extends Searchable> void lookup(Context context, T query, String targetAccountID, @Nullable String sourceAccountID, @Nullable GetSearchResults.Type type, Consumer<T> resultConsumer, Function<SearchResults, Optional<T>> extractResult) {
if (sourceAccountID != null && targetAccountID.startsWith(sourceAccountID.substring(0, sourceAccountID.indexOf('_')))) { if (sourceAccountID != null && targetAccountID.startsWith(sourceAccountID.substring(0, sourceAccountID.indexOf('_')))) {
statusConsumer.accept(queryStatus); resultConsumer.accept(query);
return; return;
} }
new GetSearchResults(queryStatus.url, GetSearchResults.Type.STATUSES, true).setCallback(new Callback<>() { new GetSearchResults(query.getQuery(), type, true).setCallback(new Callback<>() {
@Override @Override
public void onSuccess(SearchResults results) { public void onSuccess(SearchResults results) {
if (!results.statuses.isEmpty()) statusConsumer.accept(results.statuses.get(0)); Optional<T> result = extractResult.apply(results);
else Toast.makeText(context, R.string.sk_resource_not_found, Toast.LENGTH_SHORT).show(); if (result.isPresent()) resultConsumer.accept(result.get());
else {
Toast.makeText(context, R.string.sk_resource_not_found, Toast.LENGTH_SHORT).show();
resultConsumer.accept(null);
}
} }
@Override @Override
@@ -1239,6 +1300,17 @@ public class UiUtils{
return intent; return intent;
} }
public static void populateAccountsMenu(String excludeAccountID, Menu menu, Consumer<AccountSession> onClick) {
List<AccountSession> sessions=AccountSessionManager.getInstance().getLoggedInAccounts();
sessions.stream().filter(s -> !s.getID().equals(excludeAccountID)).forEach(s -> {
String username = "@"+s.self.username+"@"+s.domain;
menu.add(username).setOnMenuItemClickListener((c) -> {
onClick.accept(s);
return true;
});
});
}
/** /**
* Wraps a View.OnClickListener to filter multiple clicks in succession. * Wraps a View.OnClickListener to filter multiple clicks in succession.
* Useful for buttons that perform some action that changes their state asynchronously. * Useful for buttons that perform some action that changes their state asynchronously.

View File

@@ -3,7 +3,7 @@
<item> <item>
<shape> <shape>
<solid android:color="?colorPollVoted"/> <solid android:color="?colorPollVoted"/>
<corners android:radius="4dp"/> <corners android:radius="8dp"/>
</shape> </shape>
</item> </item>
</ripple> </ripple>

View File

@@ -4,5 +4,5 @@
android:shape="rectangle"> android:shape="rectangle">
<corners android:radius="4sp" /> <corners android:radius="4sp" />
<solid android:color="?colorBackgroundLight" /> <solid android:color="?colorBackgroundLight" />
<stroke android:width="2dp" android:color="#00ff00" /> <stroke android:width="2dp" android:color="?android:colorAccent" />
</shape> </shape>

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="M15.114 25.719c-0.396-0.408-0.746-0.861-1.04-1.35C13.418 24.453 12.725 24.5 12 24.5c-5.111 0-8.5-2.111-8.5-4.785V19l0.007-0.145C3.58 18.095 4.22 17.5 5 17.5h8.624c0.234-0.535 0.529-1.038 0.875-1.5H5c-1.657 0-3 1.343-3 3v0.715C2 23.433 6.21 26 12 26c1.101 0 2.145-0.098 3.114-0.281zM18 8c0-3.314-2.686-6-6-6S6 4.686 6 8s2.686 6 6 6 6-2.686 6-6zM7.5 8c0-2.485 2.015-4.5 4.5-4.5s4.5 2.015 4.5 4.5-2.015 4.5-4.5 4.5S7.5 10.485 7.5 8zm13 19c3.59 0 6.5-2.91 6.5-6.5S24.09 14 20.5 14 14 16.91 14 20.5s2.91 6.5 6.5 6.5zm0-11c0.276 0 0.5 0.224 0.5 0.5V20h3.5c0.276 0 0.5 0.224 0.5 0.5S24.776 21 24.5 21H21v3.5c0 0.276-0.224 0.5-0.5 0.5S20 24.776 20 24.5V21h-3.5c-0.276 0-0.5-0.224-0.5-0.5s0.224-0.5 0.5-0.5H20v-3.5c0-0.276 0.224-0.5 0.5-0.5z" android:fillColor="@color/fluent_default_icon_tint"/>
</vector>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_fluent_alert_28_selector" android:left="2dp" android:right="2dp" android:top="2dp" android:bottom="2dp"/>
<item android:width="14dp" android:height="14dp" android:gravity="top|right">
<shape android:shape="oval">
<stroke android:color="?android:colorPrimary" android:width="2dp"/>
<solid android:color="?android:colorAccent"/>
</shape>
</item>
</layer-list>

View File

@@ -64,7 +64,7 @@
android:id="@+id/favorite" android:id="@+id/favorite"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_gravity="center_vertical" android:layout_gravity="center"
android:drawableStart="@drawable/ic_fluent_star_24_selector" android:drawableStart="@drawable/ic_fluent_star_24_selector"
android:drawablePadding="8dp" android:drawablePadding="8dp"
android:paddingHorizontal="8dp" android:paddingHorizontal="8dp"

View File

@@ -36,7 +36,7 @@
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
android:layout_marginBottom="8dp" android:layout_marginBottom="8dp"
android:layout_marginHorizontal="16dp" android:layout_marginHorizontal="16dp"
android:inputType="textFilter|textNoSuggestions" android:inputType="textFilter|textNoSuggestions|textUri"
android:singleLine="true" android:singleLine="true"
android:imeOptions="actionGo" android:imeOptions="actionGo"
android:drawableStart="@drawable/ic_fluent_globe_20_regular" android:drawableStart="@drawable/ic_fluent_globe_20_regular"

View File

@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="48dp"
android:paddingBottom="16dp"
android:gravity="center_vertical"
android:layoutDirection="locale">
<TextView
android:id="@+id/text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:layout_weight="1"
android:layout_marginEnd="8dp"
android:paddingVertical="8dp"
android:gravity="center_vertical"
android:textColor="?android:textColorPrimary"
android:text="@string/mo_mute_label"
android:textSize="16sp" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="32dp"
android:layout_weight="0"
android:layout_marginEnd="24dp"
android:maxWidth="140dp"
android:background="@drawable/bg_inline_button"
android:elevation="0dp"
android:ellipsize="middle"
android:fontFamily="sans-serif-medium"
android:singleLine="true"
android:stateListAnimator="@null"
android:textColor="?android:textColorPrimary"
android:textSize="16sp"
tools:text="@string/mute_user" />
</LinearLayout>

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/duration_indefinite" android:title="@string/mo_duration_indefinite" />
<item android:id="@+id/duration_minutes_5" android:title="@string/mo_duration_minutes_5"/>
<item android:id="@+id/duration_minutes_30" android:title="@string/mo_duration_minutes_30"/>
<item android:id="@+id/duration_hours_1" android:title="@string/mo_duration_hours_1"/>
<item android:id="@+id/duration_hours_6" android:title="@string/mo_duration_hours_6"/>
<item android:id="@+id/duration_days_1" android:title="@string/mo_duration_days_1"/>
<item android:id="@+id/duration_days_3" android:title="@string/mo_duration_days_3"/>
<item android:id="@+id/duration_days_7" android:title="@string/mo_duration_days_7"/>
</menu>

View File

@@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/open_with_account" android:title="@string/sk_open_with_account" android:icon="@drawable/ic_fluent_person_swap_24_regular">
<menu android:id="@+id/accounts" />
</item>
<item android:id="@+id/share" android:title="@string/share_user" android:icon="@drawable/ic_fluent_share_24_regular"/> <item android:id="@+id/share" android:title="@string/share_user" android:icon="@drawable/ic_fluent_share_24_regular"/>
<item android:id="@+id/mute" android:title="@string/mute_user" android:icon="@drawable/ic_fluent_speaker_mute_24_regular"/> <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/block" android:title="@string/block_user" android:icon="@drawable/ic_fluent_person_prohibited_24_regular"/>

View File

@@ -2,6 +2,9 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <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"/> <item android:id="@+id/followed_hashtags" android:title="@string/sk_hashtags_you_follow" android:icon="@drawable/ic_fluent_number_symbol_24_regular"/>
<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/bookmarks" android:title="@string/bookmarks" android:icon="@drawable/ic_fluent_bookmark_multiple_24_regular" android:showAsAction="always"/>
<item android:id="@+id/open_with_account" android:title="@string/sk_open_with_account" android:icon="@drawable/ic_fluent_person_swap_24_regular">
<menu android:id="@+id/accounts" />
</item>
<item android:id="@+id/manage_user_lists" android:title="@string/sk_your_lists" android:icon="@drawable/ic_fluent_people_24_regular"/> <item android:id="@+id/manage_user_lists" android:title="@string/sk_your_lists" android:icon="@drawable/ic_fluent_people_24_regular"/>
<item android:id="@+id/favorites" android:title="@string/your_favorites" android:icon="@drawable/ic_fluent_star_24_regular" android:showAsAction="always"/> <item android:id="@+id/favorites" android:title="@string/your_favorites" android:icon="@drawable/ic_fluent_star_24_regular" android:showAsAction="always"/>
<item android:id="@+id/scheduled" android:title="@string/sk_unsent_posts" android:icon="@drawable/ic_fluent_folder_open_24_regular" android:showAsAction="always"/> <item android:id="@+id/scheduled" android:title="@string/sk_unsent_posts" android:icon="@drawable/ic_fluent_folder_open_24_regular" android:showAsAction="always"/>

View File

@@ -26,4 +26,18 @@
<string name="mo_sending_error">Fehler beim Veröffentlichen</string> <string name="mo_sending_error">Fehler beim Veröffentlichen</string>
<string name="mo_filtered">Gefiltert: %s</string> <string name="mo_filtered">Gefiltert: %s</string>
<string name="mo_disable_reminder_to_add_alt_text">Erinnerung zum Hinzufügen einer Bildbeschreibung deaktivieren</string> <string name="mo_disable_reminder_to_add_alt_text">Erinnerung zum Hinzufügen einer Bildbeschreibung deaktivieren</string>
<string name="mo_add_custom_server_local_timeline">Füge eine lokale Timeline eines benutzerdefinierten Servers hinzu</string>
<string name="mo_notification_action_replied">Erfolgreich auf den Beitrag von %s geantwortet</string>
<string name="mo_duration_hours_1">1 Stunde</string>
<string name="mo_duration_hours_6">6 Stunden</string>
<string name="mo_duration_days_1">1 Tag</string>
<string name="mo_duration_days_3">3 Tage</string>
<string name="mo_mute_label">Dauer:</string>
<string name="mo_duration_indefinite">Unbestimmt</string>
<string name="mo_duration_minutes_5">5 Minuten</string>
<string name="mo_duration_minutes_30">30 Minuten</string>
<string name="mo_change_default_reply_visibility_to_unlisted">Standard Antwortsichtbarkeit auf nicht aufgelistet ändern</string>
<string name="mo_duration_days_7">7 Tage</string>
<string name="mo_composer_behavior">Verhalten des Verfassers</string>
<string name="mo_miscellaneous_settings">Sonstige Einstellungen</string>
</resources> </resources>

View File

@@ -258,4 +258,7 @@
<string name="sk_unfinished_attachments">Anhänge richtig stellen\?</string> <string name="sk_unfinished_attachments">Anhänge richtig stellen\?</string>
<string name="sk_settings_hide_interaction">Interaktions-Buttons verstecken</string> <string name="sk_settings_hide_interaction">Interaktions-Buttons verstecken</string>
<string name="sk_unfinished_attachments_message">Einige Anhänge sind nicht fertig hochgeladen.</string> <string name="sk_unfinished_attachments_message">Einige Anhänge sind nicht fertig hochgeladen.</string>
<string name="sk_followed_as">Mit %s gefolgt</string>
<string name="sk_settings_hide_fab">Verfassen-Button automatisch ausblenden</string>
<string name="sk_follow_as">Mit anderem Account folgen</string>
</resources> </resources>

View File

@@ -20,4 +20,7 @@
<string name="mo_settings_contribute">Contribuir en Moshidon</string> <string name="mo_settings_contribute">Contribuir en Moshidon</string>
<string name="mo_no_image_desc">Las imágenes incluidas no tienen descripción. Por favor, piénsate añadir una para permitir a las personas con discapacidad participar.</string> <string name="mo_no_image_desc">Las imágenes incluidas no tienen descripción. Por favor, piénsate añadir una para permitir a las personas con discapacidad participar.</string>
<string name="mo_filtered">Filtrado: %s</string> <string name="mo_filtered">Filtrado: %s</string>
<string name="mo_disable_reminder_to_add_alt_text">Desactivar recordatorio para añadir descripción</string>
<string name="mo_add_custom_server_local_timeline">Añadir una cronología de un servidor</string>
<string name="mo_notification_action_replied">Respondió correctamente a la publicación de %s</string>
</resources> </resources>

View File

@@ -259,4 +259,7 @@
<string name="sk_settings_prefix_reply_cw_with_re">Añadir \"re:\" a respuestas a Advertencias de Contenido</string> <string name="sk_settings_prefix_reply_cw_with_re">Añadir \"re:\" a respuestas a Advertencias de Contenido</string>
<string name="sk_spectator_mode">Modo espectador</string> <string name="sk_spectator_mode">Modo espectador</string>
<string name="sk_settings_hide_interaction">Ocultar los botones interactivos</string> <string name="sk_settings_hide_interaction">Ocultar los botones interactivos</string>
<string name="sk_follow_as">Seguir desde otra cuenta</string>
<string name="sk_followed_as">Seguido de %s</string>
<string name="sk_settings_hide_fab">Ocultar automáticamente el botón Redactar</string>
</resources> </resources>

View File

@@ -72,7 +72,7 @@
<string name="sk_settings_translation_availability_note_available">%s-k itzulpena onartzen du!</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 instantzien 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">Ezabatu jakinarazpen guztiak</string>
<string name="sk_clear_all_notifications_confirm_action">Ezabatu dena</string> <string name="sk_clear_all_notifications_confirm_action">Ezabatu denak</string>
<string name="sk_clear_all_notifications_confirm">Ziur al zaude jakinarazpen guztiak ezabatu nahi dituzula\?</string> <string name="sk_clear_all_notifications_confirm">Ziur al zaude jakinarazpen guztiak ezabatu nahi dituzula\?</string>
<string name="sk_loading_fediverse_resource_title">Fedibertsoan bilatzen</string> <string name="sk_loading_fediverse_resource_title">Fedibertsoan bilatzen</string>
<string name="sk_undo_reblog">Bultzada desegin</string> <string name="sk_undo_reblog">Bultzada desegin</string>
@@ -146,7 +146,7 @@
<string name="sk_changelog">Aldaketen zerrenda</string> <string name="sk_changelog">Aldaketen zerrenda</string>
<string name="sk_alt_text_missing">Eranskin batek gutxienez ez du deskribapenik.</string> <string name="sk_alt_text_missing">Eranskin batek gutxienez ez du deskribapenik.</string>
<string name="sk_publish_anyway">Argitaratu hala ere</string> <string name="sk_publish_anyway">Argitaratu hala ere</string>
<string name="sk_settings_disable_alt_text_reminder">Desgaitu testu alternatiboaren jakinarazpena</string> <string name="sk_settings_disable_alt_text_reminder">Desgaitu gogorarazlea testu alternatiboa gehitzeko</string>
<string name="sk_timelines">Denbora-lerroak</string> <string name="sk_timelines">Denbora-lerroak</string>
<string name="sk_timeline_posts">Bidalketak</string> <string name="sk_timeline_posts">Bidalketak</string>
<string name="sk_timelines_add">Gehitu</string> <string name="sk_timelines_add">Gehitu</string>
@@ -218,7 +218,7 @@
<string name="sk_edit_timelines">Denbora-lerroak editatu</string> <string name="sk_edit_timelines">Denbora-lerroak editatu</string>
<string name="sk_alt_button">ALT</string> <string name="sk_alt_button">ALT</string>
<string name="sk_post_edited">Editatua</string> <string name="sk_post_edited">Editatua</string>
<string name="sk_notification_type_update">Bidalketa editatua</string> <string name="sk_notification_type_update">Editatutako argitalpenak</string>
<string name="sk_notify_update">Bultzatutako bidalketa editatu</string> <string name="sk_notify_update">Bultzatutako bidalketa editatu</string>
<string name="sk_no_results">Emaitzarik ez</string> <string name="sk_no_results">Emaitzarik ez</string>
<string name="sk_save_draft">Zirriborroa gorde\?</string> <string name="sk_save_draft">Zirriborroa gorde\?</string>
@@ -232,4 +232,33 @@
<string name="sk_alt_text_missing_title">Testu alternatiboa falta da</string> <string name="sk_alt_text_missing_title">Testu alternatiboa falta da</string>
<string name="sk_searching">Bilatzen…</string> <string name="sk_searching">Bilatzen…</string>
<string name="sk_save_draft_message">Zirriborro honetako aldaketak gorde edo argitaratu nahi dituzu\?</string> <string name="sk_save_draft_message">Zirriborro honetako aldaketak gorde edo argitaratu nahi dituzu\?</string>
<string name="sk_settings_prefix_reply_cw_with_re">Gehitu \"re:\" hasieran edukiaren abisuen erantzunetan</string>
<string name="sk_filtered">Iragazita: %s</string>
<string name="sk_expand">Zabaldu</string>
<string name="sk_collapse">Itxi</string>
<string name="sk_settings_collapse_long_posts">Itxi argitalpen oso luzeak</string>
<string name="sk_unfinished_attachments">Finkatu eranskinak\?</string>
<string name="sk_unfinished_attachments_message">Eranskin batzuk ez dira igo oraindik.</string>
<string name="sk_notify_posts_info_banner">Pertsona batzuen argitalpenen jakinarazpenak gaitzen badituzu, beraien argitalpen berriak hemen ageriko dira.</string>
<string name="sk_updater_enable_pre_releases">Gaitu beta bertsioak</string>
<string name="sk_inline_direct">aipamenak soilik</string>
<string name="sk_separator">·</string>
<string name="sk_instance_features">Instantziaren ezaugarriak</string>
<string name="sk_settings_local_only_explanation">Zure jatorriko instantziak bertan soilik argitaratzea baimendu behar du hau ibili dadin. Aldatutako Mastodon bertsio askok darabilte, baina Mastodonek ez.</string>
<string name="sk_inline_local_only">bertan soilik</string>
<string name="sk_settings_support_local_only">Zerbitzariak bertan soilik argitaratzea baimentzen du</string>
<string name="sk_settings_glitch_instance">Glitch bertan soilik modua</string>
<string name="sk_settings_glitch_mode_explanation">Gaitu hau zure jatorrizko instantziak Glitch badarabil. Ez da beharrezkoa Hometown edo Akkomarako.</string>
<string name="sk_signed_up">izena emanda</string>
<string name="sk_reported">salatuta</string>
<string name="sk_sign_ups">Erabiltzaileen izen-ematea</string>
<string name="sk_new_reports">Salaketa berriak</string>
<string name="sk_local_only">Bertako instantzia soilik</string>
<string name="sk_settings_see_new_posts_button">\"Ikusi argitalpen berriak\" botoia</string>
<string name="sk_settings_server_version">Zerbitzariaren bertsioa: %s</string>
<string name="sk_notify_poll_results">Bozketaren emaitzak</string>
<string name="sk_settings_hide_interaction">Ezkutatu interakzio-botoiak</string>
<string name="sk_follow_as">Jarraitu beste kontu batetik</string>
<string name="sk_followed_as">%s-(d/t)ik jarraitua</string>
<string name="sk_settings_hide_fab">Automatikoki ezkutatu Idatzi botoia</string>
</resources> </resources>

View File

@@ -260,4 +260,7 @@
<string name="sk_unfinished_attachments_message">Certaines pièces jointes n\'ont pas fini de se télécharger.</string> <string name="sk_unfinished_attachments_message">Certaines pièces jointes n\'ont pas fini de se télécharger.</string>
<string name="sk_spectator_mode">Mode spectateur</string> <string name="sk_spectator_mode">Mode spectateur</string>
<string name="sk_settings_hide_interaction">Masquer les boutons d\'interaction</string> <string name="sk_settings_hide_interaction">Masquer les boutons d\'interaction</string>
<string name="sk_follow_as">Suivre depuis un autre compte</string>
<string name="sk_followed_as">Suivi depuis %s</string>
<string name="sk_settings_hide_fab">Masquer automatiquement le bouton Composer</string>
</resources> </resources>

View File

@@ -259,4 +259,7 @@
<string name="sk_unfinished_attachments">Arranxar arquivos adxuntos\?</string> <string name="sk_unfinished_attachments">Arranxar arquivos adxuntos\?</string>
<string name="sk_spectator_mode">Modo espectador</string> <string name="sk_spectator_mode">Modo espectador</string>
<string name="sk_settings_hide_interaction">Ocultar botóns de interacción</string> <string name="sk_settings_hide_interaction">Ocultar botóns de interacción</string>
<string name="sk_follow_as">Seguir dende outra conta</string>
<string name="sk_followed_as">Seguida dende %s</string>
<string name="sk_settings_hide_fab">Auto-ocultar botón de redacción</string>
</resources> </resources>

View File

@@ -252,4 +252,15 @@
<string name="sk_settings_support_local_only">Server hanya mendukung pengiriman hanya lokal</string> <string name="sk_settings_support_local_only">Server hanya mendukung pengiriman hanya lokal</string>
<string name="sk_settings_server_version">Versi server: %s</string> <string name="sk_settings_server_version">Versi server: %s</string>
<string name="sk_notify_poll_results">Hasil japat</string> <string name="sk_notify_poll_results">Hasil japat</string>
<string name="sk_filtered">Disaring: %s</string>
<string name="sk_expand">Buka</string>
<string name="sk_collapse">Tutup</string>
<string name="sk_settings_hide_interaction">Sembunyikan tombol interaksi</string>
<string name="sk_follow_as">Ikuti dari akun lain</string>
<string name="sk_followed_as">Diikuti dari %s</string>
<string name="sk_settings_prefix_reply_cw_with_re">Awali peringatan konten balasan dengan “re:”</string>
<string name="sk_settings_collapse_long_posts">Tutup kiriman yang sangat panjang</string>
<string name="sk_unfinished_attachments">Perbaiki lampiran\?</string>
<string name="sk_unfinished_attachments_message">Beberapa lampiran belum selesai diunggah.</string>
<string name="sk_settings_hide_fab">Sembunyikan tombol Komposer</string>
</resources> </resources>

View File

@@ -53,58 +53,58 @@
<string name="sk_post_language">Lingua: %s</string> <string name="sk_post_language">Lingua: %s</string>
<string name="sk_language_name">%s (%s)</string> <string name="sk_language_name">%s (%s)</string>
<string name="sk_confirm_clear_recent_languages">Sei sicuro di voler cancellare le lingue usate di recente\?</string> <string name="sk_confirm_clear_recent_languages">Sei sicuro di voler cancellare le lingue usate di recente\?</string>
<string name="sk_clear_recent_languages">Cancella lingue usate di recente</string> <string name="sk_clear_recent_languages">Cancella le lingue usate di recente</string>
<string name="sk_welcome_title">Benvenuto!</string> <string name="sk_welcome_title">Benvenuto!</string>
<string name="sk_example_domain">example.social</string> <string name="sk_example_domain">example.social</string>
<string name="sk_poll_allow_multiple">Consenti scelte multiple</string> <string name="sk_poll_allow_multiple">Consenti scelte multiple</string>
<string name="sk_available_languages">Lingue disponibili</string> <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_welcome_text">Lo squalo ti saluta! Per iniziare inserisci qui sotto l\'indirizzo dell\'istanza a cui sei iscritto.</string>
<string name="sk_color_palette_material3">Sistema</string> <string name="sk_color_palette_material3">Sistema</string>
<string name="sk_timeline_local">Locale</string> <string name="sk_timeline_local">Locale</string>
<string name="sk_timeline_federated">Federata</string> <string name="sk_timeline_federated">Federata</string>
<string name="sk_bookmark_as">Salva con un altro account</string> <string name="sk_bookmark_as">Aggiungi ai segnalibri con un altro account</string>
<string name="sk_bookmarked_as">Salvato come %s</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_favorite_as">Aggiungi ai preferiti con un altro account</string>
<string name="sk_favorited_as">Inserito tra i preferiti come %s</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_already_favorited">Già aggiunto ai preferiti</string>
<string name="sk_reblog_as">Condividi con un altro account</string> <string name="sk_reblog_as">Condividi con un altro account</string>
<string name="sk_already_reblogged">Condivisione già eseguita</string> <string name="sk_already_reblogged">Già condiviso</string>
<string name="sk_settings_profile">Imposta il profilo</string> <string name="sk_settings_profile">Impostazioni del profilo</string>
<string name="sk_settings_posting">Preferenze dei post</string> <string name="sk_settings_posting">Preferenze di pubblicazione</string>
<string name="sk_settings_filters">Configura filtri</string> <string name="sk_settings_filters">Configura i filtri</string>
<string name="sk_settings_rules">Regole</string> <string name="sk_settings_rules">Regole</string>
<string name="sk_settings_about">Riguardo all\'app</string> <string name="sk_settings_about">Informazioni sull\'app</string>
<string name="sk_settings_donate">Dona</string> <string name="sk_settings_donate">Dona</string>
<string name="sk_delete_notification_confirm_action">Elimina notifica</string> <string name="sk_delete_notification_confirm_action">Elimina la notifica</string>
<string name="sk_enable_delete_notifications">Abilita l\'eliminazione delle notifiche</string> <string name="sk_enable_delete_notifications">Abilita la cancellazione delle notifiche</string>
<string name="sk_settings_publish_button_text">Testo del pulsante Pubblica</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_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_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_settings_translation_availability_note_unavailable">%s non sembra supportare la traduzione.</string>
<string name="sk_clear_all_notifications">Elimina tutte le notifiche</string> <string name="sk_clear_all_notifications">Cancella tutte le notifiche</string>
<string name="sk_clear_all_notifications_confirm_action">Elimina tutto</string> <string name="sk_clear_all_notifications_confirm_action">Cancella tutto</string>
<string name="sk_clear_all_notifications_confirm">Sei sicuro di volere eliminare tutte le notifiche\?</string> <string name="sk_clear_all_notifications_confirm">Sei sicuro di voler eliminare tutte le notifiche\?</string>
<string name="sk_loading_fediverse_resource_title">Cercando nel Fediverso</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_quote_post">Crea un post riguardo a questo</string>
<string name="sk_undo_reblog">Annulla la condivisione</string> <string name="sk_undo_reblog">Annulla la condivisione</string>
<string name="sk_reblog_with_visibility">Condividi con visibilità</string> <string name="sk_reblog_with_visibility">Reblog con visibilità</string>
<string name="sk_copy_link_to_post">Copia il link del post</string> <string name="sk_copy_link_to_post">Copia il link al post</string>
<string name="sk_open_with_account">Apri con un altro account</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_resource_not_found">Non è stato possibile trovare la risorsa</string>
<string name="sk_draft">Bozza</string> <string name="sk_draft">Bozza</string>
<string name="sk_schedule">Programma</string> <string name="sk_schedule">Programma</string>
<string name="sk_confirm_delete_draft_title">Elimina bozza</string> <string name="sk_confirm_delete_draft_title">Elimina bozza</string>
<string name="sk_draft_or_schedule">Bozza o programma</string> <string name="sk_draft_or_schedule">Salva nelle bozze o programma</string>
<string name="sk_compose_scheduled">Programmato per</string> <string name="sk_compose_scheduled">Programmato per</string>
<string name="sk_draft_saved">Bozza salvata</string> <string name="sk_draft_saved">Bozza salvata</string>
<string name="sk_forward_report_to">Inoltra a %s</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_title">Elimina post programmato</string>
<string name="sk_confirm_delete_scheduled_post">Sei sicuro di volere eliminare questo post programmato\?</string> <string name="sk_confirm_delete_scheduled_post">Sei sicuro di voler eliminare questo post programmato\?</string>
<string name="sk_compose_draft">Il post verrà salvato come bozza.</string> <string name="sk_compose_draft">Il post verrà salvato come bozza.</string>
<string name="sk_post_scheduled">Post programmato</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_scheduled_too_soon_title">L\'orario programmato è troppo presto</string>
<string name="sk_mark_as_draft">Segna come bozza</string> <string name="sk_mark_as_draft">Segna come bozza</string>
<string name="sk_schedule_post">Programma post</string> <string name="sk_schedule_post">Programma il post</string>
<string name="sk_compose_no_schedule">Non programmare</string> <string name="sk_compose_no_schedule">Non programmare</string>
<string name="sk_compose_no_draft">Non tenere in bozza</string> <string name="sk_compose_no_draft">Non tenere in bozza</string>
<string name="sk_announcements">Annunci</string> <string name="sk_announcements">Annunci</string>
@@ -123,25 +123,25 @@
<string name="sk_reply_as">Rispondi con un altro account</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_settings_uniform_icon_for_notifications">Icona uniforme per tutte le notifiche</string>
<string name="sk_color_palette_red">Rosso</string> <string name="sk_color_palette_red">Rosso</string>
<string name="sk_tabs_disable_swipe">Disabilita lo scorrimento tra schede</string> <string name="sk_tabs_disable_swipe">Disabilita lo scorrimento tra le schede</string>
<string name="sk_settings_auth">Impostazioni della sicurezza</string> <string name="sk_settings_auth">Impostazioni di sicurezza</string>
<string name="sk_delete_notification">Elimina notifica</string> <string name="sk_delete_notification">Elimina la notifica</string>
<string name="sk_delete_notification_confirm">Sei sicuro di volere eliminare questa notifica\?</string> <string name="sk_delete_notification_confirm">Sei sicuro di voler eliminare questa notifica\?</string>
<string name="sk_settings_translate_only_opened">Traduci solamente i post aperti</string> <string name="sk_settings_translate_only_opened">Traduci solo i post aperti</string>
<string name="sk_loading_resource_on_instance_title">Cercando in %s</string> <string name="sk_loading_resource_on_instance_title">Cercando su %s</string>
<string name="sk_hashtags_you_follow">Hashtags che segui</string> <string name="sk_hashtags_you_follow">Hashtag che segui</string>
<string name="sk_already_bookmarked">Già salvato</string> <string name="sk_already_bookmarked">Già aggiunto ai segnalibri</string>
<string name="sk_reblogged_as">Condivisione eseguita come %s</string> <string name="sk_reblogged_as">Condivisione eseguita come %s</string>
<string name="sk_unsent_posts">Post annullati</string> <string name="sk_unsent_posts">Post non pubblicati</string>
<string name="sk_confirm_save_draft">Salva bozza\?</string> <string name="sk_confirm_save_draft">Salvare la bozza\?</string>
<string name="sk_confirm_save_changes">Salva le modifiche\?</string> <string name="sk_confirm_save_changes">Salvare le modifiche\?</string>
<string name="sk_schedule_or_draft">Programma o bozza</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_reduce_motion">Riduci il movimento delle animazioni</string>
<string name="sk_settings_about_instance">Riguardo all\'istanza</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_delete_list_confirm">Sei sicuro di volere eliminare la lista \"%s\"\?</string>
<string name="sk_timeline_home">Home</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_confirm_delete_draft">Sei sicuro di voler cancellare questa bozza\?</string>
<string name="sk_scheduled_too_soon">I post devono essere programmati almeno tra 10 minuti.</string> <string name="sk_scheduled_too_soon">Il post deve essere programmato almeno 10 minuti prima.</string>
<string name="sk_recent_searches_placeholder">Scrivi per iniziare a cercare</string> <string name="sk_recent_searches_placeholder">Scrivi per iniziare a cercare</string>
<string name="sk_remove_follower">Rimuovi come follower</string> <string name="sk_remove_follower">Rimuovi come follower</string>
<string name="sk_remove_follower_confirm">Rimuovi %s come follower bloccandolo e sboccandolo immediatamente\?</string> <string name="sk_remove_follower_confirm">Rimuovi %s come follower bloccandolo e sboccandolo immediatamente\?</string>
@@ -250,4 +250,15 @@
<string name="sk_settings_see_new_posts_button">Pulsante \"Mostra nuovi post\"</string> <string name="sk_settings_see_new_posts_button">Pulsante \"Mostra nuovi post\"</string>
<string name="sk_settings_server_version">Versione server:%s</string> <string name="sk_settings_server_version">Versione server:%s</string>
<string name="sk_notify_poll_results">Risultati del sondaggio</string> <string name="sk_notify_poll_results">Risultati del sondaggio</string>
<string name="sk_settings_prefix_reply_cw_with_re">Aggiungi \"re:\" prima dei CW</string>
<string name="sk_filtered">Filtrato: %s</string>
<string name="sk_expand">Espandi</string>
<string name="sk_collapse">Chiudi</string>
<string name="sk_settings_collapse_long_posts">Comprimi post molto lunghi</string>
<string name="sk_unfinished_attachments">Correggi gli allegati\?</string>
<string name="sk_unfinished_attachments_message">Alcuni allegati non hanno finito l\'upload.</string>
<string name="sk_settings_hide_interaction">Nascondi i pulsanti di interazione</string>
<string name="sk_follow_as">Segui con un altro account</string>
<string name="sk_followed_as">Seguito con %s</string>
<string name="sk_settings_hide_fab">Nascondi automaticamente il pulsante Pubblica</string>
</resources> </resources>

View File

@@ -259,4 +259,7 @@
<string name="sk_settings_collapse_long_posts">아주 긴 게시물 접기</string> <string name="sk_settings_collapse_long_posts">아주 긴 게시물 접기</string>
<string name="sk_spectator_mode">관객 모드</string> <string name="sk_spectator_mode">관객 모드</string>
<string name="sk_settings_hide_interaction">상호작용 버튼 가리기</string> <string name="sk_settings_hide_interaction">상호작용 버튼 가리기</string>
<string name="sk_follow_as">다른 계정으로 팔로우</string>
<string name="sk_followed_as">%s 계정으로 팔로우함</string>
<string name="sk_settings_hide_fab">게시 버튼 자동으로 가리기</string>
</resources> </resources>

View File

@@ -20,4 +20,6 @@
<string name="mo_disable_dividers">Wyłącz dzielenie postów</string> <string name="mo_disable_dividers">Wyłącz dzielenie postów</string>
<string name="mo_disable_relocate_publish_button_to_enable_customization">Wyłącz opcję Przenoszenia przycisku publikacji aby umożliwić dostosowywanie</string> <string name="mo_disable_relocate_publish_button_to_enable_customization">Wyłącz opcję Przenoszenia przycisku publikacji aby umożliwić dostosowywanie</string>
<string name="mo_filtered">Wyfiltrowano: %s</string> <string name="mo_filtered">Wyfiltrowano: %s</string>
<string name="mo_disable_reminder_to_add_alt_text">Wyłącz przypomnienie o dodaniu opisu</string>
<string name="mo_add_custom_server_local_timeline">Dodaj lokalną oś czasu innej instancji</string>
</resources> </resources>

View File

@@ -258,4 +258,7 @@
<string name="sk_settings_prefix_reply_cw_with_re">Zaczynaj CW odpowiedzi od “re:”</string> <string name="sk_settings_prefix_reply_cw_with_re">Zaczynaj CW odpowiedzi od “re:”</string>
<string name="sk_settings_collapse_long_posts">Zwijaj bardzo długie posty</string> <string name="sk_settings_collapse_long_posts">Zwijaj bardzo długie posty</string>
<string name="sk_settings_hide_interaction">Ukryj przyciski interakcji</string> <string name="sk_settings_hide_interaction">Ukryj przyciski interakcji</string>
<string name="sk_followed_as">Obserwowane z %s</string>
<string name="sk_follow_as">Obserwuj z innego konta</string>
<string name="sk_settings_hide_fab">Automatycznie ukrywaj przycisk tworzenia nowego wpisu</string>
</resources> </resources>

View File

@@ -21,4 +21,18 @@
<string name="mo_poll_option_add">Adicionar nova opção de enquete</string> <string name="mo_poll_option_add">Adicionar nova opção de enquete</string>
<string name="mo_filtered">Filtrado: %s</string> <string name="mo_filtered">Filtrado: %s</string>
<string name="mo_disable_reminder_to_add_alt_text">Desabilitar lembrete de adicionar textos descritivos</string> <string name="mo_disable_reminder_to_add_alt_text">Desabilitar lembrete de adicionar textos descritivos</string>
<string name="mo_add_custom_server_local_timeline">Adicionar a linha local de um servidor customizado</string>
<string name="mo_notification_action_replied">Respondeu com sucesso ao post de %s</string>
<string name="mo_composer_behavior">Comportamento do Compositor</string>
<string name="mo_duration_hours_1">1 hora</string>
<string name="mo_duration_hours_6">6 horas</string>
<string name="mo_duration_days_1">1 dia</string>
<string name="mo_duration_days_3">3 dias</string>
<string name="mo_duration_days_7">7 dias</string>
<string name="mo_mute_label">Duração:</string>
<string name="mo_duration_indefinite">Indefinido</string>
<string name="mo_duration_minutes_5">5 minutos</string>
<string name="mo_duration_minutes_30">30 minutos</string>
<string name="mo_change_default_reply_visibility_to_unlisted">Mudar visibilidade padrão das respostas para não listado</string>
<string name="mo_miscellaneous_settings">Configurações Diversas</string>
</resources> </resources>

View File

@@ -1,4 +1,25 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="mo_welcome_text">Щоб розпочати, будь ласка, введіть адресу вашого екземпляру нижче.</string>
</resources> <string name="mo_no_image_desc">Зображення не мають опису. Ви можете додати його, щоб люди із вадами зору могли зрозуміти, яке забарвлення в котика.</string>
<string name="mo_disable_relocate_publish_button_to_enable_customization">Вимкніть переміщення кнопки \"Опублікувати\" для кастомізації</string>
<string name="mo_color_palette_nord">Nord</string>
<string name="mo_disable_dividers">Вимкнути роздільники публікацій</string>
<string name="mo_relocate_publish_button">Перемістити кнопку \"Опублікувати\"</string>
<string name="mo_hide_compose_button_while_scrolling_setting">Сховати кнопку \"Нова публікація\" під час прокручування</string>
<string name="mo_personal_note">Додати нотатку до цього профілю</string>
<string name="mo_personal_note_confirm">Підтвердити зміни</string>
<string name="mo_personal_note_update_failed">Не вдалося зберегти нотатку</string>
<string name="mo_settings_contribute">Допомогти у розробці Moshidon</string>
<string name="mo_update_available">Moshidon %s готовий до завантаження.</string>
<string name="mo_update_ready">Moshidon %s готовий до встановлення.</string>
<string name="mo_no_image_desc_title">Немає опису зображення</string>
<string name="mo_emoji_recent">Нещодавні</string>
<string name="mo_clear_recent_emoji">Очистити нещодавні емоджи</string>
<string name="mo_disable_reminder_to_add_alt_text">Вимкнути повідомлення про додавання опису зображення</string>
<string name="mo_poll_option_add">Опція \"додати нове опитування\"</string>
<string name="mo_fab_compose">Новий допис</string>
<string name="mo_sending_error">Помилка при публікації</string>
<string name="mo_filtered">Відфільтровано: %s</string>
<string name="mo_add_custom_server_local_timeline">Додати місцеву стрічку іншого серверу</string>
</resources>

View File

@@ -259,4 +259,7 @@
<string name="sk_unfinished_attachments_message">Деякі вкладення не повністю завантажилися.</string> <string name="sk_unfinished_attachments_message">Деякі вкладення не повністю завантажилися.</string>
<string name="sk_spectator_mode">Режим глядача</string> <string name="sk_spectator_mode">Режим глядача</string>
<string name="sk_settings_hide_interaction">Сховати кнопки взаємодії</string> <string name="sk_settings_hide_interaction">Сховати кнопки взаємодії</string>
<string name="sk_follow_as">Підписатися з іншого облікового запису</string>
<string name="sk_followed_as">Відстежується з %s</string>
<string name="sk_settings_hide_fab">Автоматично ховати кнопку компонування</string>
</resources> </resources>

View File

@@ -21,4 +21,18 @@
<string name="mo_sending_error">发布帖文时出错</string> <string name="mo_sending_error">发布帖文时出错</string>
<string name="mo_filtered">已过滤:%s</string> <string name="mo_filtered">已过滤:%s</string>
<string name="mo_disable_reminder_to_add_alt_text">禁用添加ALT文本的提醒</string> <string name="mo_disable_reminder_to_add_alt_text">禁用添加ALT文本的提醒</string>
<string name="mo_add_custom_server_local_timeline">添加自定义实例的本地时间线</string>
<string name="mo_notification_action_replied">成功回复了 %s 的帖文</string>
<string name="mo_duration_minutes_5">5分钟</string>
<string name="mo_duration_hours_6">6小时</string>
<string name="mo_duration_days_1">1天</string>
<string name="mo_duration_days_3">3天</string>
<string name="mo_mute_label">持续时间:</string>
<string name="mo_duration_indefinite">无限</string>
<string name="mo_duration_minutes_30">30分钟</string>
<string name="mo_duration_hours_1">1小时</string>
<string name="mo_change_default_reply_visibility_to_unlisted">将回复的默认可见性改为“不公开列出”</string>
<string name="mo_duration_days_7">7天</string>
<string name="mo_composer_behavior">作者的行为</string>
<string name="mo_miscellaneous_settings">杂项设置</string>
</resources> </resources>

View File

@@ -22,4 +22,5 @@
<item name="menu_add_timeline" type="id" /> <item name="menu_add_timeline" type="id" />
<item name="menu_back" type="id" /> <item name="menu_back" type="id" />
<item name="menu_add_local_timelines" type="id" />
</resources> </resources>

View File

@@ -25,10 +25,27 @@
<string name="mo_filtered">Filtered: %s</string> <string name="mo_filtered">Filtered: %s</string>
<string name="mo_disable_relocate_publish_button_to_enable_customization">Disable "Relocate publish button" to allow customization</string> <string name="mo_disable_relocate_publish_button_to_enable_customization">Disable "Relocate publish button" to allow customization</string>
<string name="mo_disable_reminder_to_add_alt_text">Disable reminder to add alt text</string> <string name="mo_disable_reminder_to_add_alt_text">Disable reminder to add alt text</string>
<string name="mo_add_custom_server_local_timeline">Add a custom server\'s local timeline</string>
<string name="mo_notification_action_replied">Successfully replied to the post by %s</string>
<string name="mo_change_default_reply_visibility_to_unlisted">Change default reply visibility to unlisted</string>
<string name="mo_composer_behavior">Composer\'s Behavior</string>
<string name="mo_miscellaneous_settings">Miscellaneous Settings</string>
<!-- accessibility labels--> <!-- accessibility labels-->
<string name="mo_poll_option_add">Add new poll option</string> <string name="mo_poll_option_add">Add new poll option</string>
<string name="mo_fab_compose">Compose</string> <string name="mo_fab_compose">Compose</string>
<string name="mo_sending_error">Error publishing</string> <string name="mo_sending_error">Error publishing</string>
<!-- duration labels-->
<string name="mo_mute_label">Duration:</string>
<string name="mo_duration_indefinite">Indefinite</string>
<string name="mo_duration_minutes_5">5 minutes</string>
<string name="mo_duration_minutes_30">30 minutes</string>
<string name="mo_duration_hours_1">1 hour</string>
<string name="mo_duration_hours_6">6 hours</string>
<string name="mo_duration_days_1">1 day</string>
<string name="mo_duration_days_3">3 days</string>
<string name="mo_duration_days_7">7 days</string>
</resources> </resources>

View File

@@ -259,4 +259,7 @@
<string name="sk_unfinished_attachments">Fix attachments?</string> <string name="sk_unfinished_attachments">Fix attachments?</string>
<string name="sk_unfinished_attachments_message">Some attachments havent finished uploading.</string> <string name="sk_unfinished_attachments_message">Some attachments havent finished uploading.</string>
<string name="sk_settings_hide_interaction">Hide interaction buttons</string> <string name="sk_settings_hide_interaction">Hide interaction buttons</string>
<string name="sk_follow_as">Follow from other account</string>
<string name="sk_followed_as">Followed from %s</string>
<string name="sk_settings_hide_fab">Auto-hide Compose button</string>
</resources> </resources>

View File

@@ -6,11 +6,13 @@
<locale android:name="bs-BA"/> <locale android:name="bs-BA"/>
<locale android:name="ca-ES"/> <locale android:name="ca-ES"/>
<locale android:name="cs-CZ"/> <locale android:name="cs-CZ"/>
<locale android:name="da-DK"/>
<locale android:name="de-DE"/> <locale android:name="de-DE"/>
<locale android:name="el-GR"/> <locale android:name="el-GR"/>
<locale android:name="en"/> <locale android:name="en"/>
<locale android:name="es-ES"/> <locale android:name="es-ES"/>
<locale android:name="eu-ES"/> <locale android:name="eu-ES"/>
<locale android:name="fa-IR"/>
<locale android:name="fi-FI"/> <locale android:name="fi-FI"/>
<locale android:name="fil-PH"/> <locale android:name="fil-PH"/>
<locale android:name="fr-FR"/> <locale android:name="fr-FR"/>
@@ -21,6 +23,7 @@
<locale android:name="hr-HR"/> <locale android:name="hr-HR"/>
<locale android:name="hu-HU"/> <locale android:name="hu-HU"/>
<locale android:name="hy-AM"/> <locale android:name="hy-AM"/>
<locale android:name="ig-NG"/>
<locale android:name="in-ID"/> <locale android:name="in-ID"/>
<locale android:name="is-IS"/> <locale android:name="is-IS"/>
<locale android:name="it-IT"/> <locale android:name="it-IT"/>
@@ -28,7 +31,9 @@
<locale android:name="ja-JP"/> <locale android:name="ja-JP"/>
<locale android:name="kab"/> <locale android:name="kab"/>
<locale android:name="ko-KR"/> <locale android:name="ko-KR"/>
<locale android:name="my-MM"/>
<locale android:name="nl-NL"/> <locale android:name="nl-NL"/>
<locale android:name="no-NO"/>
<locale android:name="oc-FR"/> <locale android:name="oc-FR"/>
<locale android:name="pl-PL"/> <locale android:name="pl-PL"/>
<locale android:name="pt-BR"/> <locale android:name="pt-BR"/>

View File

@@ -0,0 +1,4 @@
- Folgen-Button lange drücken, um Profil von anderem Account zu folgen
- Option, um Profile mit anderem Account zu öffnen
- Verfassen-Button wird beim Scrollen automatisch ausgeblendet
- Crash beim Öffnen von Admin-Accounts behoben

View File

@@ -0,0 +1,5 @@
Neue Dinge für 94:
- Verbesserungen am Verhalten des Fabs
- Geringfügige Änderungen am Launchersymbol
- Verbesserungen des Benachrichtigungsverhaltens
- Kleinere Fehlerbehebungen und Verbesserungen

View File

@@ -0,0 +1,3 @@
Neue Dinge für 95:
- Hinzufügen der Möglichkeit, die lokalen Timelines anderer Server in den Timelines anzuzeigen
- Kleinere Korrekturen und Verbesserungen

View File

@@ -0,0 +1,3 @@
Neue Dinge für 96:
- Verbesserung der Möglichkeit, die lokalen Timelines anderer Server in den Timelines anzuzeigen
- Kleinere Korrekturen und Verbesserungen

View File

@@ -0,0 +1,3 @@
Version 97 fügt hinzu:
- Die neue Funktion "Benutzerdefinierte lokale Zeitleisten". Sie kann über das Menü "Zeitleisten hinzufügen" aufgerufen werden.
- Kleinere Korrekturen und Verbesserungen

View File

@@ -0,0 +1 @@
Erste Veröffentlichung im Play Store

View File

@@ -3,4 +3,4 @@
- Collapse/expand function for very long posts - Collapse/expand function for very long posts
- Option to automatically prefix replys CWs with “re:” - Option to automatically prefix replys CWs with “re:”
- Option to hide interaction buttons in the timeline - Option to hide interaction buttons in the timeline
- Various bugfixes, tweaks and improvements - Various bugfixes, tweaks and improvements

View File

@@ -0,0 +1,4 @@
- Long-press follow button to follow profiles from other account
- Option to open profiles in other account
- Auto-hide compose button when scrolling down the timeline
- Fix crash when opening server admin's profiles

View File

@@ -0,0 +1,3 @@
New things for 95:
- Adding the ability to have other server's local timelines in the timelines
- Minor fixes and improvements

View File

@@ -0,0 +1,3 @@
New things for 96:
- Improving the ability to have other server's local timelines in the timelines
- Minor fixes and improvements

View File

@@ -0,0 +1,3 @@
Release 97 adds:
- New Custom Local Timelines feature. It can be accessed on the add timelines menu
- Minor fixes and improvements

View File

@@ -0,0 +1 @@
Initial play store release

View File

@@ -0,0 +1,6 @@
New things for release 99:
- Add notification actions
- Add option to enable unlisted replies by default
- Add mute timer
- Add notification badge if there are unread notifications
- Minor bugfixes and usability improvements

Binary file not shown.

Before

Width:  |  Height:  |  Size: 167 KiB

After

Width:  |  Height:  |  Size: 170 KiB

View File

@@ -0,0 +1,6 @@
- Añadir selector de idioma
- Añadir función de traducción
- Mejorar la semántica para votar en las encuestas (botones de radio y casillas de verificación)
- Añadir la opción de permitir la votación de múltiples opciones en las encuestas
- Nueva pantalla de inicio de sesión
- Corrección de errores

View File

@@ -0,0 +1,5 @@
- Nuevos esquemas de color: Material You y Rojo
- Nuevos tonos gris oscuro para todos los esquemas
- Icono de impulso ahora más distinguible
- Animaciones para botones de interacción.
- Corrección de errores (bloqueo en algunas publicaciones, "listas de", idioma predeterminado para nuevas publicaciones)

View File

@@ -0,0 +1,11 @@
- Botón de publicación personalizable
- Abrir enlaces de Fediverse en la aplicación
- Botón boost de pulsación larga para "citar" un post
- Copiar la URL de la publicación al pulsar prolongadamente el botón de compartir
- Implementar la eliminación de notificaciones (desactivada por defecto)
- Iconos específicos para los distintos tipos de notificaciones
- Nuevos colores grises
- Añadir la opción de desactivar el deslizamiento entre pestañas.
- Añadir varios enlaces a la configuración de la cuenta
- Mostrar/ocultar el botón de traducción en la línea de tiempo
- Corrección de errores y ajustes

View File

@@ -0,0 +1,6 @@
- Opción para seleccionar la visibilidad manteniendo presionado el botón de reblog
- Ahora se muestra la visibilidad de los reblogs propios.
- Lista agregada de hashtags seguidos
- Mantenga presionado a la izquierda para copiarlos
- Opción de abrir publicaciones con otra cuenta
- Corrección de errores y ajustes menores

View File

@@ -1,6 +0,0 @@
- Filtros mejorados, incluida la compatibilidad con la opción "Ocultar con advertencia"
- Página de perfil rediseñada con los metadatos directamente debajo de la biografía.
- Función de contraer/expandir para mensajes muy largos.
- Opción de anteponer automáticamente el prefijo "re:" a los mensajes de respuesta.
- Opción de ocultar los botones de interacción en la línea de tiempo
- Varias correcciones de errores, ajustes y mejoras

View File

@@ -0,0 +1,4 @@
- Manter pulsado o botón de seguir para seguir perfís de outra conta
- Opción de abrir perfís de outra conta
- Auto-ocultar o botón de redacción cando deslizas cara abaixo na cronoloxía
- Arranxado o bloqueo ao abrir os perfís dos administradores do servidor

View File

@@ -0,0 +1,6 @@
- Saringan ditingkatkan, termasuk kompatibilitas “Sembunyikan dengan peringatan”
- Rancang ulang halaman profil dengan metadata langsung di bawah bio
- Fungsi buka/tutup untuk kiriman yang sangat panjang
- Opsi untuk menambahkan peringatan konten pada balasan dengan “re:”
- Opsi untuk menyembunyikan tombol interaksi di lini masa
- Banyak perbaikan kutu, perubahan, dan peningkatan

View File

@@ -0,0 +1,4 @@
- Tekan lama pada tombol ikuti untuk mengikuti profil dari akun lain
- Opsi untuk membuka profil di akun yang lain
- Sembunyikan tombol komposer secara otomatia ketika menggulir lini masa ke bawah
- Perbaiki kemogokan ketika membuka profil admin server

View File

@@ -0,0 +1,10 @@
- Nuova home con timeline pubbliche
- Mostra annunci del server
- Testo scalato in base alle impostazioni di sistema
- Filtro migliorato (no, "Nascondi con avvertimento" non funziona ancora) da @thiagojedi
- Funzionalità di gestione delle liste
- Rimozione di follower con blocco morbido
- Respinte le connessioni con fascisti
- Risolto il non caricamento delle immagini se connessi all'istanza di Akkoma
- Risoluzioni di bug e miglioramenti UI
- Aggiunto il registro delle modiifche da @LucasGGamerM

View File

@@ -0,0 +1,9 @@
- Le timelines possono essere fissate e riorganizzate
- Supporto per post solo locali
- Aggiunti indicatori per testi alternativi mancanti
- Migliorato l'editor del testo alternativo
- Aggiunta intestazione nella home per gli hashtag seguiti
- Più categorie di notifiche
- Aggiunta nuovamente la possibilità di aprire file
- Aggiunto avviso quando si salvano le bozze
- Aggiunta opzione per disabilitare il tasto "Visualizza nuovi post"

View File

@@ -0,0 +1,6 @@
- Migliorati i filtri, compresa la compatibilità con "Nascondi con avvertimento"
- Ripensata la pagina del profilo con metadati sotto la bio
- Funzione mostra/nascondi per post molto lunghi
- Possibilità di iniziare le risposte a dei Content Warning con "re:"
- Possiblità di nascondere i pulsanti di interazione nello scorrimento della timeline
- Numerose correzioni di bug e miglioramenti

View File

@@ -0,0 +1,4 @@
- Possibilità di seguire con un altro account con tocco prolungato
- Possibilità di aprire profili con un altro account
- Aggiunta la possibilità di nascondere il pulsante per pubblicare quando si scorre nella timeline
- Corretti crash nell'apertura di profili degli amministratori del server

View File

@@ -0,0 +1,4 @@
- 팔로우 버튼을 길게 눌러 다른 계정으로 프로필 팔로우
- 다른 계정으로 프로필을 열 수 있는 옵션
- 타임라인을 아래로 스크롤할 때 게시 버튼 자동으로 가리기
- 서버 관리자 프로필로 앱을 열 때 발생하는 오류 수정

View File

@@ -0,0 +1,4 @@
- Długie naciśnięcie przycisku "obserwacji" teraz pozwoli ci obserwować profile z innego konta
- Opcja otwierania profili innym kontem
- Automatyczne ukrywanie przycisku pisania nowego posta podczas przewijania w dół osi czasu
- Naprawiono crash podczas otwierania profili administratora serwera

View File

@@ -0,0 +1 @@
Mastodon na Android ale ma motyw Material You i ma więcej funkcji

1
metadata/pl/title.txt Normal file
View File

@@ -0,0 +1 @@
Moshidon

View File

@@ -0,0 +1,16 @@
Moshidon é uma versão modificada do aplicativo Mastodon oficial para Android adicionando recursos importantes que estão faltando no aplicativo oficial, como o federado linha do tempo, postagem não listada e um visualizador de descrição de imagem.
<b>Principais recursos<b>
- <b>Muitas cores<b>: Traz material do seu tema e muitas opções coloridas de temas!
- <b>Postagens filtradas!<b>: A capacidade de exibir postagens filtradas com um aviso!
- <b>Botão Traduzir<b>: Traz um botão traduzir!
- <b>Seletor de idioma do toot<b>: Traz um seletor de idioma do toot!
- <b>Postagem não listada<b>: Poste publicamente sem que sua postagem apareça em tendências, hashtags ou cronogramas públicos.
- <b>Linha do tempo federada<b>: Veja todas as postagens públicas de pessoas em todos os outros bairros do Fediverse aos quais sua instância inicial está conectada.
- <b>Visualizador de descrição de imagem<b>: Verifique rapidamente se uma imagem ou vídeo tem um texto alternativo anexado a ele.
- <b>Pinagem de postagens<b>: Fixe suas postagens mais importantes em seu perfil e veja o que outras pessoas fixaram usando a guia "Fixadas".
- <b>Seguir hashtags<b>: veja novas postagens de hashtags específicas diretamente em sua linha do tempo inicial, seguindo-as.
- <b>Responder a solicitações de acompanhamento<b>: Aceite ou recuse solicitações de acompanhamento de suas notificações ou da lista dedicada de solicitações de acompanhamento.
- <b>Excluir e rediscutir<b>: O recurso muito apreciado que tornou a edição possível sem uma função de edição real.
- <b>Extras<b>: Traz muitos recursos extras de UI, como ícones de interação nas Notificações e remove muitos incômodos com a UI original!<b>

View File

@@ -0,0 +1 @@
Mastodon para Android mas é Material You e tem mais recursos

1
metadata/pt-BR/title.txt Normal file
View File

@@ -0,0 +1 @@
Moshidon

View File

@@ -0,0 +1,4 @@
- Затискання кнопки підписатися, щоб підписатися на профілі з іншого облікового запису
- Можливість відкривати профілі в іншому обліковому записі
- Автоприховування кнопки компонування під час гортання стрічки вниз
- Виправлено збій під час відкриття профілів адміністратора сервера

View File

@@ -0,0 +1 @@
Mastodon для Android, але має більше функцій й дизайн Material You

1
metadata/uk/title.txt Normal file
View File

@@ -0,0 +1 @@
Moshidon

View File

@@ -0,0 +1,6 @@
新增语言选择器
- 新增翻译功能
- 改进投票贴文语义 (单选/多选)
- 新增允许在投票中设置多选的功能
- 新登录界面
- 修复部分bug

View File

@@ -0,0 +1,5 @@
- 新增颜色主题Material You和红色主题
- 为全部主题新增深灰色调
- 转发图标改为更醒目的填充式图标
- 为互动按钮添加了动画
- 修复部分bug发布部分贴文时崩溃“特定列表”贴文默认语言

View File

@@ -0,0 +1,11 @@
- 可自定义发布按钮
- 在应用中打开Fedivese链接
- 长按转发按钮可引用一篇帖子
- 长按分享按钮可复制贴文URL
- 实现了删除通知功能(默认禁用)
- 为不同类型通知提供了专门的图标
- 新增灰色色调
- 添加禁用滑动切换选项卡的设置
- 添加各种链接到账户设置
- 添加在时间轴上显示/隐藏翻译按钮的开关
- 修复bug与程序微调

View File

@@ -0,0 +1,6 @@
- 长按可选选择特定转发的可见性
- 显示自己转发的可见性
- 添加已关注的标签列表
- 长按复制链接
- 添加使用其它账户打开帖子的选项
- 修复bug与程序微调

View File

@@ -0,0 +1,10 @@
- 草稿和定时发布功能
- 回复时显示原帖
- 与Mastodon 4.0兼容的过滤器(目前还没有“隐藏并警告功能”)
- 长按可通过其它已登录账户与贴文交互
- 在所有菜单中添加图标
- 新增转发举报的开关
- 添加使用“发布关于此事的贴文”功能时的提及(@)功能
- 添加使用统一通知图标而非不同图标的设置项
- 添加从设置中访问应用内规则列表的选项
- 修复bug

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