Compare commits

...

69 Commits

Author SHA1 Message Date
sk
3e3ed050ba bump version 2023-01-09 17:18:43 +01:00
sk
84179bc207 implement announcements
closes #127
2023-01-09 17:16:55 +01:00
sk
9dc795ded7 don't connect to fascists 2023-01-09 12:25:48 +01:00
sk
9c733d65b2 tweak header text margin 2023-01-09 11:24:02 +01:00
sk
4d49890b1e hide keyboard when navigating
closes #227
2023-01-09 11:15:14 +01:00
sk
f78c6978cf scale text according to system
closes #244
2023-01-09 11:11:00 +01:00
sk
b58a3d89e8 fix wrong pin icon
closes #230
2023-01-09 10:47:12 +01:00
sk
cd0cfba7c0 click "replying to" to scroll up
closes #241
2023-01-09 10:44:51 +01:00
sk
713c95d597 tweak reply animation
closes #237
2023-01-09 10:38:30 +01:00
sk
15534ad42e don't add subject if blank
closes #240
2023-01-09 10:30:49 +01:00
Thiago 'Jedi' Abreu
32bb3fac69 Filter all status, even if filters are empty (#255) 2023-01-09 10:23:14 +01:00
sk
e604da4ff4 Merge remote-tracking branch 'upstream/master' 2023-01-09 10:22:25 +01:00
Gregory K
60517b00f3 Merge pull request #491 from mishnz/master
Second fix for MIME64 inconsistency in serverKey.
2023-01-02 14:23:23 +03:00
mishnz
faf5e8e82b Merge branch 'master' of https://github.com/mishnz/mastodon-android 2023-01-03 00:16:12 +13:00
mishnz
7264982761 serverKey assignment was missing, corrected. 2023-01-03 00:15:45 +13:00
mishnz
fedf74258f Merge branch 'mastodon:master' into master 2023-01-03 00:06:53 +13:00
mishnz
def4960be6 Second fix for MIME64 inconsistency in serverKey.
The previous fix https://github.com/mastodon/mastodon-android/pull/486 would break any connections to any instances using WEB_SAFE MIME64 encoding on the serverKey, which actually appears to be the usual case.
This update reverts to the previous logic, but also converts standard MIME64 characters ('/' and '+') to their WEB_SAFE equivalents.
This ensures the standard case of WEB_SAFE BASE64 serverKeys and the anomolous case of DEFAULT BASE64 keys both work.
2023-01-02 23:56:52 +13:00
Eugen Rochko
525cc69c70 Merge pull request #486 from mishnz/master
The Mastodon server does not currently use URL_SAFE encoding on its s…
2023-01-01 10:01:17 +01:00
mishnz
7ed1b164b5 The Mastodon server does not currently use URL_SAFE encoding on its serverKey. Using URL_SAFE in this client means the client will crash for any server that uses a key that generates a Mime64 string containing a "+" or "/". This change removes the URL_SAFE logic. See: https://github.com/mastodon/mastodon-android/issues/483 2023-01-01 18:50:09 +13:00
sk
0a9c31fb09 update changelog 2022-12-31 03:13:06 +01:00
sk
5ed6f97846 update changelog 2022-12-31 03:08:08 +01:00
sk
7dc195606c fix empty space when no text 2022-12-31 03:07:14 +01:00
sk
b2377a3353 tweak scroll height/timing 2022-12-31 02:54:33 +01:00
sk
0fdae0c775 Revert "match navigation bar color with toolbar"
This reverts commit 43d334259b.
2022-12-31 02:50:18 +01:00
sk
113bbd960f move settings items 2022-12-31 02:40:49 +01:00
sk
a48e09e77b bump version 2022-12-31 02:02:38 +01:00
sk
3c3f759d9a update readme 2022-12-31 02:02:00 +01:00
sk
5f0986d03b add option to reduce motion 2022-12-31 02:00:40 +01:00
sk
579794d7e0 peek original post before scrolling 2022-12-31 01:52:07 +01:00
sk
4956543eac update changelog 2022-12-31 01:37:39 +01:00
sk
87043f19bc Merge remote-tracking branch 'weblate/main' 2022-12-31 01:35:07 +01:00
sk
375f8ceb27 display original post when replying
closes sk22#193
2022-12-31 01:33:37 +01:00
sk
496ad6a442 change interact with strings 2022-12-30 23:08:04 +01:00
ihor_ck
83a09c4af2 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (12 of 12 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/uk/
2022-12-30 21:54:40 +00:00
gallegonovato
fac6985d01 Translated using Weblate (Spanish)
Currently translated at 100.0% (12 of 12 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/es/
2022-12-30 21:54:40 +00:00
Linerly
43670ba62b Translated using Weblate (Indonesian)
Currently translated at 100.0% (12 of 12 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/id/
2022-12-30 21:54:40 +00:00
Choukajohn
ef511349f8 Translated using Weblate (French)
Currently translated at 100.0% (12 of 12 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/fr/
2022-12-30 21:54:40 +00:00
ihor_ck
eea0199a21 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (121 of 121 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/uk/
2022-12-30 21:54:40 +00:00
Linerly
7e0f02ecc7 Translated using Weblate (Indonesian)
Currently translated at 100.0% (121 of 121 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/id/
2022-12-30 21:54:40 +00:00
Choukajohn
7b26a65ea0 Translated using Weblate (French)
Currently translated at 100.0% (121 of 121 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/fr/
2022-12-30 21:54:40 +00:00
gallegonovato
c5b92d7162 Translated using Weblate (Spanish)
Currently translated at 100.0% (121 of 121 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/es/
2022-12-30 21:54:40 +00:00
bubblineyuri
f8387f0a81 Translated using Weblate (German)
Currently translated at 100.0% (12 of 12 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/de/
2022-12-30 21:54:40 +00:00
bubblineyuri
8486326b00 Translated using Weblate (German)
Currently translated at 100.0% (121 of 121 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/de/
2022-12-30 21:54:40 +00:00
edxkl
8f64747e75 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (11 of 11 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/pt_BR/
2022-12-30 21:54:40 +00:00
ihor_ck
f75efdaa03 Translated using Weblate (Ukrainian)
Currently translated at 96.6% (115 of 119 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/uk/
2022-12-30 21:54:40 +00:00
Linerly
ee8d9d0c07 Translated using Weblate (Indonesian)
Currently translated at 100.0% (119 of 119 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/id/
2022-12-30 21:54:40 +00:00
ling0412
6791adef46 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (119 of 119 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/zh_Hans/
2022-12-30 21:54:40 +00:00
irure
80bcb84acf Translated using Weblate (Basque)
Currently translated at 18.1% (2 of 11 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/eu/
2022-12-30 21:54:40 +00:00
AiOO
7d6b0f9ca8 Translated using Weblate (Korean)
Currently translated at 100.0% (11 of 11 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/ko/
2022-12-30 21:54:39 +00:00
nkufideal
594f6d4fc5 Translated using Weblate (Russian)
Currently translated at 100.0% (11 of 11 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/ru/
2022-12-30 21:54:39 +00:00
nkufideal
e40acb9bf6 Translated using Weblate (Russian)
Currently translated at 100.0% (102 of 102 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/ru/
2022-12-30 21:54:39 +00:00
itslameni
e372871108 Translated using Weblate (Russian)
Currently translated at 100.0% (102 of 102 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/ru/
2022-12-30 21:54:39 +00:00
edxkl
1c01469a3e Translated using Weblate (Portuguese (Brazil))
Currently translated at 80.3% (82 of 102 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/pt_BR/
2022-12-30 21:54:39 +00:00
irure
90c2e45be2 Translated using Weblate (Basque)
Currently translated at 100.0% (102 of 102 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/eu/
2022-12-30 21:54:39 +00:00
AiOO
1a783d4faf Translated using Weblate (Korean)
Currently translated at 100.0% (102 of 102 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/ko/
2022-12-30 21:54:39 +00:00
edxkl
d2944983a4 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (11 of 11 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/pt_BR/
2022-12-30 21:54:39 +00:00
ihor_ck
26459eecb0 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (102 of 102 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/uk/
2022-12-30 21:54:39 +00:00
Linerly
90dea16222 Translated using Weblate (Indonesian)
Currently translated at 100.0% (102 of 102 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/id/
2022-12-30 21:54:39 +00:00
Choukajohn
8897a326b3 Translated using Weblate (French)
Currently translated at 100.0% (102 of 102 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/fr/
2022-12-30 21:54:39 +00:00
gallegonovato
f3e69ddef1 Translated using Weblate (Spanish)
Currently translated at 100.0% (102 of 102 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/es/
2022-12-30 21:54:39 +00:00
ling0412
8ecaa2c4d1 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (102 of 102 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/zh_Hans/
2022-12-30 21:54:39 +00:00
sk
3a607a81f6 add compose fab to drafts list 2022-12-30 22:54:07 +01:00
sk
4b113e4a82 handle recursive compose/drafts list 2022-12-30 22:34:41 +01:00
sk
3e0e0c1484 move and refine scheduling and drafting 2022-12-30 21:48:59 +01:00
sk
676e166459 move compose action to layout file 2022-12-30 19:24:30 +01:00
sk
f0a704b93b schedule/draft in overflow menu 2022-12-29 20:24:37 +01:00
sk
cfc528df9a Merge remote-tracking branch 'origin/main' 2022-12-29 20:12:31 +01:00
sk
9231ea1446 offer to save when scheduledAt changed
closes sk22#218
2022-12-29 20:12:08 +01:00
sk22
f2f9138435 Update README.md 2022-12-29 18:39:32 +01:00
86 changed files with 1440 additions and 439 deletions

View File

@@ -31,7 +31,7 @@ Despite being one of the main features of federated social media, the Federated
Thats one of the reasons why choosing a small, **well-moderated instance is important**. Instance admins and moderators should always make sure to ban abusive users and stop federating with instances who platform them. On well-moderated instances, the Federated timeline can be a welcoming place to meet new people! Thats one of the reasons why choosing a small, **well-moderated instance is important**. Instance admins and moderators should always make sure to ban abusive users and stop federating with instances who platform them. On well-moderated instances, the Federated timeline can be a welcoming place to meet new people!
## Draft and schedule posts ### Draft and schedule posts
**Allows for preparing a post and scheduling it to send it automatically at a specific time.** **Allows for preparing a post and scheduling it to send it automatically at a specific time.**
@@ -141,7 +141,6 @@ There's also a handful of custom strings exclusive to this projects that would n
* [Add notifications tab for posts](https://github.com/mastodon/mastodon-android/compare/master...sk22:megalodon:feature/posts-notifications-tab) * [Add notifications tab for posts](https://github.com/mastodon/mastodon-android/compare/master...sk22:megalodon:feature/posts-notifications-tab)
* [Show visibility of original post when replying](https://github.com/mastodon/mastodon-android/compare/master...sk22:megalodon:feature/display-reply-visibility) * [Show visibility of original post when replying](https://github.com/mastodon/mastodon-android/compare/master...sk22:megalodon:feature/display-reply-visibility)
* [Clickable reply/boost line above posts](https://github.com/mastodon/mastodon-android/compare/master...sk22:megalodon:clickable-boost-reply-line) * [Clickable reply/boost line above posts](https://github.com/mastodon/mastodon-android/compare/master...sk22:megalodon:clickable-boost-reply-line)
* [Clickable reply line while replying to open original post](https://github.com/mastodon/mastodon-android/compare/master...sk22:megalodon:feature/clickable-reply-line-compose)
* [Add push notification setting for post notifications](https://github.com/sk22/megalodon/commit/b190480d7739be47f23543d9e7644660f9b4b4ee) * [Add push notification setting for post notifications](https://github.com/sk22/megalodon/commit/b190480d7739be47f23543d9e7644660f9b4b4ee)
* [Add option to allow voting for multiple options on polls](https://github.com/sk22/megalodon/commit/5b28468efd49387b4f8b83f142f3adf3104ca60c) * [Add option to allow voting for multiple options on polls](https://github.com/sk22/megalodon/commit/5b28468efd49387b4f8b83f142f3adf3104ca60c)
* [Add translate function](https://github.com/mastodon/mastodon-android/compare/master...sk22:megalodon:feature/translate-button) * [Add translate function](https://github.com/mastodon/mastodon-android/compare/master...sk22:megalodon:feature/translate-button)
@@ -149,6 +148,7 @@ There's also a handful of custom strings exclusive to this projects that would n
* [Implement deleting notifications](https://github.com/sk22/megalodon/commit/b0f9ce081f69f29ad59658fc00ca41372cd2677d) (disabled by default) * [Implement deleting notifications](https://github.com/sk22/megalodon/commit/b0f9ce081f69f29ad59658fc00ca41372cd2677d) (disabled by default)
* [Long-click boost button to "quote" a post](https://github.com/sk22/megalodon/commit/b25a237c20c6a924ed4d9b357999867c3a32b32b) * [Long-click boost button to "quote" a post](https://github.com/sk22/megalodon/commit/b25a237c20c6a924ed4d9b357999867c3a32b32b)
* [Draft and schedule posts](https://github.com/sk22/megalodon/pull/217) * [Draft and schedule posts](https://github.com/sk22/megalodon/pull/217)
* [Display original post when replying](https://github.com/sk22/megalodon/commit/375f8ceb2747705fedf43686681cc0e0b812f899)
### Behavior ### Behavior

View File

@@ -9,8 +9,8 @@ android {
applicationId "org.joinmastodon.android.sk" applicationId "org.joinmastodon.android.sk"
minSdk 23 minSdk 23
targetSdk 33 targetSdk 33
versionCode 64 versionCode 66
versionName "1.1.5+fork.64" versionName "1.1.5+fork.66"
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

@@ -0,0 +1,39 @@
# lists.d Mastodon Blocklist (c) 2022 Greyhat Academy LICENSED UNDER: CC-BY-NC-SA 4.0
# https://raw.githubusercontent.com/greyhat-academy/lists.d/main/mastodon.domains.block.list.tsv
# This list contains domains of toxic mastodon instances
# Last-Modified: 1672044500
# gab - a neonazi social network
gab.ai
gab.com
gab.protohype.net
# consequence-free speech
social.unzensiert.to
freeatlantis.com
# reactionary bigotry and hatespeech against magrinalized groups
poa.st
freespeechextremist.com
rdrama.cc
outpoa.st
anime.website
gameliberty.club
social.byoblu.com
yggdrasil.social
smuglo.li
dogeposting.social
unsafe.space
freezepeach.xyz
# + CSAM
rojogato.com
# antivaxxer shitposting & fearmongering
shadowsocial.org
# Kiwifarms
kiwifarms.net
kiwifarms.cc
kiwifarms.is
kiwifarms.pleroma.net
1 # lists.d Mastodon Blocklist (c) 2022 Greyhat Academy LICENSED UNDER: CC-BY-NC-SA 4.0
2 # https://raw.githubusercontent.com/greyhat-academy/lists.d/main/mastodon.domains.block.list.tsv
3 # This list contains domains of toxic mastodon instances
4 # Last-Modified: 1672044500
5 # gab - a neonazi social network
6 gab.ai
7 gab.com
8 gab.protohype.net
9 # consequence-free speech
10 social.unzensiert.to
11 freeatlantis.com
12 # reactionary bigotry and hatespeech against magrinalized groups
13 poa.st
14 freespeechextremist.com
15 rdrama.cc
16 outpoa.st
17 anime.website
18 gameliberty.club
19 social.byoblu.com
20 yggdrasil.social
21 smuglo.li
22 dogeposting.social
23 unsafe.space
24 freezepeach.xyz
25 # + CSAM
26 rojogato.com
27 # antivaxxer shitposting & fearmongering
28 shadowsocial.org
29 # Kiwifarms
30 kiwifarms.net
31 kiwifarms.cc
32 kiwifarms.is
33 kiwifarms.pleroma.net

View File

@@ -49,7 +49,10 @@ public class ExternalShareActivity extends FragmentStackActivity{
Intent intent=getIntent(); Intent intent=getIntent();
StringBuilder builder=new StringBuilder(); StringBuilder builder=new StringBuilder();
String subject = ""; String subject = "";
if (intent.hasExtra(Intent.EXTRA_SUBJECT)) builder.append(subject = intent.getStringExtra(Intent.EXTRA_SUBJECT)).append("\n\n"); if (intent.hasExtra(Intent.EXTRA_SUBJECT)) {
subject = intent.getStringExtra(Intent.EXTRA_SUBJECT);
if (!subject.isBlank()) builder.append(subject).append("\n\n");
}
if (intent.hasExtra(Intent.EXTRA_TEXT)) builder.append(intent.getStringExtra(Intent.EXTRA_TEXT)).append("\n"); if (intent.hasExtra(Intent.EXTRA_TEXT)) builder.append(intent.getStringExtra(Intent.EXTRA_TEXT)).append("\n");
String text=builder.toString(); String text=builder.toString();
List<Uri> mediaUris; List<Uri> mediaUris;

View File

@@ -29,6 +29,7 @@ public class GlobalUserPreferences{
public static boolean enableDeleteNotifications; public static boolean enableDeleteNotifications;
public static boolean translateButtonOpenedOnly; public static boolean translateButtonOpenedOnly;
public static boolean uniformNotificationIcon; public static boolean uniformNotificationIcon;
public static boolean reduceMotion;
public static String publishButtonText; public static String publishButtonText;
public static ThemePreference theme; public static ThemePreference theme;
public static ColorPreference color; public static ColorPreference color;
@@ -62,6 +63,7 @@ public class GlobalUserPreferences{
enableDeleteNotifications=prefs.getBoolean("enableDeleteNotifications", false); enableDeleteNotifications=prefs.getBoolean("enableDeleteNotifications", false);
translateButtonOpenedOnly=prefs.getBoolean("translateButtonOpenedOnly", false); translateButtonOpenedOnly=prefs.getBoolean("translateButtonOpenedOnly", false);
uniformNotificationIcon=prefs.getBoolean("uniformNotificationIcon", false); uniformNotificationIcon=prefs.getBoolean("uniformNotificationIcon", false);
reduceMotion=prefs.getBoolean("reduceMotion", 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<>());
@@ -90,6 +92,7 @@ public class GlobalUserPreferences{
.putBoolean("enableDeleteNotifications", enableDeleteNotifications) .putBoolean("enableDeleteNotifications", enableDeleteNotifications)
.putBoolean("translateButtonOpenedOnly", translateButtonOpenedOnly) .putBoolean("translateButtonOpenedOnly", translateButtonOpenedOnly)
.putBoolean("uniformNotificationIcon", uniformNotificationIcon) .putBoolean("uniformNotificationIcon", uniformNotificationIcon)
.putBoolean("reduceMotion", reduceMotion)
.putString("publishButtonText", publishButtonText) .putString("publishButtonText", publishButtonText)
.putInt("theme", theme.ordinal()) .putInt("theme", theme.ordinal())
.putString("color", color.name()) .putString("color", color.name())

View File

@@ -12,11 +12,14 @@ import com.google.gson.JsonParser;
import com.google.gson.JsonSyntaxException; import com.google.gson.JsonSyntaxException;
import org.joinmastodon.android.BuildConfig; import org.joinmastodon.android.BuildConfig;
import org.joinmastodon.android.MastodonApp;
import org.joinmastodon.android.api.gson.IsoInstantTypeAdapter; import org.joinmastodon.android.api.gson.IsoInstantTypeAdapter;
import org.joinmastodon.android.api.gson.IsoLocalDateTypeAdapter; import org.joinmastodon.android.api.gson.IsoLocalDateTypeAdapter;
import org.joinmastodon.android.api.session.AccountSession; import org.joinmastodon.android.api.session.AccountSession;
import java.io.BufferedReader;
import java.io.IOException; import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader; import java.io.Reader;
import java.time.Instant; import java.time.Instant;
import java.time.LocalDate; import java.time.LocalDate;
@@ -47,9 +50,22 @@ public class MastodonAPIController{
private static OkHttpClient httpClient=new OkHttpClient.Builder().build(); private static OkHttpClient httpClient=new OkHttpClient.Builder().build();
private AccountSession session; private AccountSession session;
private static List<String> badDomains = new ArrayList<>();
static{ static{
thread.start(); thread.start();
try {
final BufferedReader reader = new BufferedReader(new InputStreamReader(
MastodonApp.context.getAssets().open("blocks.tsv")
));
String line;
while ((line = reader.readLine()) != null) {
if (line.isBlank() || line.startsWith("#")) continue;
badDomains.add(line.toLowerCase().trim());
}
} catch (IOException e) {
e.printStackTrace();
}
} }
public MastodonAPIController(@Nullable AccountSession session){ public MastodonAPIController(@Nullable AccountSession session){
@@ -57,8 +73,11 @@ public class MastodonAPIController{
} }
public <T> void submitRequest(final MastodonAPIRequest<T> req){ public <T> void submitRequest(final MastodonAPIRequest<T> req){
final String host = req.getURL().getHost().toLowerCase();
final boolean isBad = badDomains.stream().anyMatch(host::endsWith);
thread.postRunnable(()->{ thread.postRunnable(()->{
try{ try{
if (isBad) throw new IllegalArgumentException();
if(req.canceled) if(req.canceled)
return; return;
Request.Builder builder=new Request.Builder() Request.Builder builder=new Request.Builder()

View File

@@ -162,6 +162,8 @@ public class PushSubscriptionManager{
@Override @Override
public void onSuccess(PushSubscription result){ public void onSuccess(PushSubscription result){
MastodonAPIController.runInBackground(()->{ MastodonAPIController.runInBackground(()->{
result.serverKey=result.serverKey.replace('/','_');
result.serverKey=result.serverKey.replace('+','-');
serverKey=deserializeRawPublicKey(Base64.decode(result.serverKey, Base64.URL_SAFE)); serverKey=deserializeRawPublicKey(Base64.decode(result.serverKey, Base64.URL_SAFE));
AccountSession session=AccountSessionManager.getInstance().tryGetAccount(accountID); AccountSession session=AccountSessionManager.getInstance().tryGetAccount(accountID);

View File

@@ -0,0 +1,10 @@
package org.joinmastodon.android.api.requests.announcements;
import org.joinmastodon.android.api.MastodonAPIRequest;
public class DismissAnnouncement extends MastodonAPIRequest<Object>{
public DismissAnnouncement(String id){
super(HttpMethod.POST, "/announcements/" + id + "/dismiss", Object.class);
setRequestBody(new Object());
}
}

View File

@@ -0,0 +1,15 @@
package org.joinmastodon.android.api.requests.announcements;
import com.google.gson.reflect.TypeToken;
import org.joinmastodon.android.api.MastodonAPIRequest;
import org.joinmastodon.android.model.Announcement;
import java.util.List;
public class GetAnnouncements extends MastodonAPIRequest<List<Announcement>> {
public GetAnnouncements(boolean withDismissed) {
super(MastodonAPIRequest.HttpMethod.GET, "/announcements", new TypeToken<>(){});
addQueryParameter("with_dismissed", withDismissed ? "true" : "false");
}
}

View File

@@ -0,0 +1,107 @@
package org.joinmastodon.android.fragments;
import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.ImageButton;
import com.squareup.otto.Subscribe;
import org.joinmastodon.android.E;
import org.joinmastodon.android.R;
import org.joinmastodon.android.api.requests.announcements.GetAnnouncements;
import org.joinmastodon.android.api.requests.statuses.CreateStatus;
import org.joinmastodon.android.api.requests.statuses.GetScheduledStatuses;
import org.joinmastodon.android.api.session.AccountSession;
import org.joinmastodon.android.api.session.AccountSessionManager;
import org.joinmastodon.android.events.ScheduledStatusCreatedEvent;
import org.joinmastodon.android.events.ScheduledStatusDeletedEvent;
import org.joinmastodon.android.model.Account;
import org.joinmastodon.android.model.Announcement;
import org.joinmastodon.android.model.HeaderPaginationList;
import org.joinmastodon.android.model.Instance;
import org.joinmastodon.android.model.ScheduledStatus;
import org.joinmastodon.android.model.Status;
import org.joinmastodon.android.ui.displayitems.HeaderStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.StatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.TextStatusDisplayItem;
import org.joinmastodon.android.ui.text.HtmlParser;
import org.joinmastodon.android.ui.utils.UiUtils;
import org.parceler.Parcels;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import me.grishka.appkit.Nav;
import me.grishka.appkit.api.PaginatedList;
import me.grishka.appkit.api.SimpleCallback;
public class AnnouncementsFragment extends BaseStatusListFragment<Announcement> {
private Instance instance;
private AccountSession session;
private List<String> unreadIDs = null;
@Override
public void onAttach(Activity activity){
super.onAttach(activity);
setTitle(R.string.sk_announcements);
session = AccountSessionManager.getInstance().getAccount(accountID);
instance = AccountSessionManager.getInstance().getInstanceInfo(session.domain);
loadData();
}
@Override
protected List<StatusDisplayItem> buildDisplayItems(Announcement a) {
if(TextUtils.isEmpty(a.content)) return List.of();
Account instanceUser = new Account();
instanceUser.id = instanceUser.acct = instanceUser.username = session.domain;
instanceUser.displayName = instance.title;
instanceUser.url = "https://"+session.domain+"/about";
instanceUser.avatar = instanceUser.avatarStatic = instance.thumbnail;
instanceUser.emojis = List.of();
Status fakeStatus = a.toStatus();
return List.of(
HeaderStatusDisplayItem.fromAnnouncement(a, fakeStatus, instanceUser, this, accountID, this::onMarkAsRead),
new TextStatusDisplayItem(a.id, HtmlParser.parse(a.content, a.emojis, a.mentions, a.tags, accountID), this, fakeStatus)
);
}
public void onMarkAsRead(String id) {
if (unreadIDs == null) return;
unreadIDs.remove(id);
if (unreadIDs.size() == 0) setResult(true, null);
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
protected void addAccountToKnown(Announcement s) {}
@Override
public void onItemClick(String id) {
}
@Override
protected void onDataLoaded(List<Announcement> d, boolean more) {
unreadIDs = d.stream().filter(a -> !a.read).map(a -> a.id).collect(Collectors.toList());
super.onDataLoaded(d, more);
}
@Override
protected void doLoadData(int offset, int count){
currentRequest=new GetAnnouncements(true)
.setCallback(new SimpleCallback<>(this){
@Override
public void onSuccess(List<Announcement> result){
onDataLoaded(result, false);
}
})
.exec(accountID);
}
}

View File

@@ -33,6 +33,7 @@ import android.provider.OpenableColumns;
import android.text.Editable; import android.text.Editable;
import android.text.InputFilter; import android.text.InputFilter;
import android.text.Layout; import android.text.Layout;
import android.text.SpannableStringBuilder;
import android.text.Spanned; import android.text.Spanned;
import android.text.TextUtils; import android.text.TextUtils;
import android.text.TextWatcher; import android.text.TextWatcher;
@@ -59,6 +60,7 @@ import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.PopupMenu; import android.widget.PopupMenu;
import android.widget.ProgressBar; import android.widget.ProgressBar;
import android.widget.ScrollView;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
@@ -107,6 +109,7 @@ import org.joinmastodon.android.ui.utils.TransferSpeedTracker;
import org.joinmastodon.android.ui.utils.UiUtils; import org.joinmastodon.android.ui.utils.UiUtils;
import org.joinmastodon.android.ui.views.ComposeEditText; import org.joinmastodon.android.ui.views.ComposeEditText;
import org.joinmastodon.android.ui.views.ComposeMediaLayout; import org.joinmastodon.android.ui.views.ComposeMediaLayout;
import org.joinmastodon.android.ui.views.LinkedTextView;
import org.joinmastodon.android.ui.views.ReorderableLinearLayout; import org.joinmastodon.android.ui.views.ReorderableLinearLayout;
import org.joinmastodon.android.ui.views.SizeListenerLinearLayout; import org.joinmastodon.android.ui.views.SizeListenerLinearLayout;
import org.joinmastodon.android.utils.MastodonLanguage; import org.joinmastodon.android.utils.MastodonLanguage;
@@ -144,6 +147,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
private static final int MEDIA_RESULT=717; private static final int MEDIA_RESULT=717;
private static final int IMAGE_DESCRIPTION_RESULT=363; private static final int IMAGE_DESCRIPTION_RESULT=363;
private static final int SCHEDULED_STATUS_OPENED_RESULT=161;
private static final int MAX_ATTACHMENTS=4; private static final int MAX_ATTACHMENTS=4;
private static final String TAG="ComposeFragment"; private static final String TAG="ComposeFragment";
@@ -167,9 +171,9 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
private String accountID; private String accountID;
private int charCount, charLimit, trimmedCharCount; private int charCount, charLimit, trimmedCharCount;
private Button publishButton, languageButton, scheduleTimeBtn; private Button publishButton, languageButton, scheduleTimeBtn, draftsBtn;
private PopupMenu languagePopup, visibilityPopup, scheduleDraftPopup; private PopupMenu languagePopup, visibilityPopup, draftOptionsPopup;
private ImageButton mediaBtn, pollBtn, emojiBtn, spoilerBtn, visibilityBtn, scheduleBtn, scheduleDraftDismiss; private ImageButton mediaBtn, pollBtn, emojiBtn, spoilerBtn, visibilityBtn, scheduleDraftDismiss;
private ImageView sensitiveIcon; private ImageView sensitiveIcon;
private ComposeMediaLayout attachmentsView; private ComposeMediaLayout attachmentsView;
private TextView replyText; private TextView replyText;
@@ -179,9 +183,12 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
private View sensitiveItem; private View sensitiveItem;
private View pollAllowMultipleItem; private View pollAllowMultipleItem;
private View scheduleDraftView; private View scheduleDraftView;
private ScrollView scrollView;
private boolean initiallyScrolled = false;
private TextView scheduleDraftText; private TextView scheduleDraftText;
private CheckBox pollAllowMultipleCheckbox; private CheckBox pollAllowMultipleCheckbox;
private TextView pollDurationView; private TextView pollDurationView;
private MenuItem draftMenuItem, undraftMenuItem, scheduleMenuItem, unscheduleMenuItem;
private ArrayList<DraftPollOption> pollOptions=new ArrayList<>(); private ArrayList<DraftPollOption> pollOptions=new ArrayList<>();
@@ -220,14 +227,10 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
private String language; private String language;
private MastodonLanguage.LanguageResolver languageResolver; private MastodonLanguage.LanguageResolver languageResolver;
private int navigationBarColorBefore;
@Override @Override
public void onCreate(Bundle savedInstanceState){ public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setRetainInstance(true); setRetainInstance(true);
navigationBarColorBefore = getActivity().getWindow().getNavigationBarColor();
getActivity().getWindow().setNavigationBarColor(UiUtils.getThemeColor(getActivity(), R.attr.colorBackgroundLightest));
accountID=getArguments().getString("account"); accountID=getArguments().getString("account");
AccountSession session=AccountSessionManager.getInstance().getAccount(accountID); AccountSession session=AccountSessionManager.getInstance().getAccount(accountID);
@@ -248,7 +251,6 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
AccountSessionManager.getInstance().updateInstanceInfo(instanceDomain); AccountSessionManager.getInstance().updateInstanceInfo(instanceDomain);
} }
// sorry about all this ugly code, but i can't find any consistency in ComposeFragment.java
Bundle bundle = savedInstanceState != null ? savedInstanceState : getArguments(); Bundle bundle = savedInstanceState != null ? savedInstanceState : getArguments();
if (bundle.containsKey("scheduledStatus")) scheduledStatus=Parcels.unwrap(bundle.getParcelable("scheduledStatus")); if (bundle.containsKey("scheduledStatus")) scheduledStatus=Parcels.unwrap(bundle.getParcelable("scheduledStatus"));
if (bundle.containsKey("scheduledAt")) scheduledAt=(Instant) bundle.getSerializable("scheduledAt"); if (bundle.containsKey("scheduledAt")) scheduledAt=(Instant) bundle.getSerializable("scheduledAt");
@@ -272,7 +274,6 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
UiUtils.removeCallbacks(updateUploadEtaRunnable); UiUtils.removeCallbacks(updateUploadEtaRunnable);
updateUploadEtaRunnable=null; updateUploadEtaRunnable=null;
} }
getActivity().getWindow().setNavigationBarColor(navigationBarColorBefore);
} }
@Override @Override
@@ -294,10 +295,11 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
mainEditTextWrap=view.findViewById(R.id.toot_text_wrap); mainEditTextWrap=view.findViewById(R.id.toot_text_wrap);
charCounter=view.findViewById(R.id.char_counter); charCounter=view.findViewById(R.id.char_counter);
charCounter.setText(String.valueOf(charLimit)); charCounter.setText(String.valueOf(charLimit));
scrollView=view.findViewById(R.id.scroll_view);
selfName=view.findViewById(R.id.name); selfName=view.findViewById(R.id.self_name);
selfUsername=view.findViewById(R.id.username); selfUsername=view.findViewById(R.id.self_username);
selfAvatar=view.findViewById(R.id.avatar); selfAvatar=view.findViewById(R.id.self_avatar);
HtmlParser.setTextWithCustomEmoji(selfName, self.displayName, self.emojis); HtmlParser.setTextWithCustomEmoji(selfName, self.displayName, self.emojis);
selfUsername.setText('@'+self.username+'@'+instanceDomain); selfUsername.setText('@'+self.username+'@'+instanceDomain);
ViewImageLoader.load(selfAvatar, null, new UrlImageLoaderRequest(self.avatar)); ViewImageLoader.load(selfAvatar, null, new UrlImageLoaderRequest(self.avatar));
@@ -315,7 +317,6 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
emojiBtn=view.findViewById(R.id.btn_emoji); emojiBtn=view.findViewById(R.id.btn_emoji);
spoilerBtn=view.findViewById(R.id.btn_spoiler); spoilerBtn=view.findViewById(R.id.btn_spoiler);
visibilityBtn=view.findViewById(R.id.btn_visibility); visibilityBtn=view.findViewById(R.id.btn_visibility);
scheduleBtn=view.findViewById(R.id.btn_schedule);
scheduleDraftView=view.findViewById(R.id.schedule_draft_view); scheduleDraftView=view.findViewById(R.id.schedule_draft_view);
scheduleDraftText=view.findViewById(R.id.schedule_draft_text); scheduleDraftText=view.findViewById(R.id.schedule_draft_text);
scheduleDraftDismiss=view.findViewById(R.id.schedule_draft_dismiss); scheduleDraftDismiss=view.findViewById(R.id.schedule_draft_dismiss);
@@ -332,19 +333,6 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
visibilityBtn.setOnClickListener(v->visibilityPopup.show()); visibilityBtn.setOnClickListener(v->visibilityPopup.show());
visibilityBtn.setOnTouchListener(visibilityPopup.getDragToOpenListener()); visibilityBtn.setOnTouchListener(visibilityPopup.getDragToOpenListener());
scheduleDraftPopup=new PopupMenu(getContext(), scheduleBtn);
scheduleDraftPopup.inflate(R.menu.schedule_draft);
scheduleDraftPopup.setOnMenuItemClickListener(item->{
if (item.getItemId() == R.id.draft) updateScheduledAt(getDraftInstant());
else pickScheduledDateTime();
return true;
});
UiUtils.enablePopupMenuIcons(getContext(), scheduleDraftPopup);
scheduleBtn.setOnClickListener(v->{
if (scheduledAt != null) updateScheduledAt(null);
else scheduleDraftPopup.show();
});
scheduleBtn.setOnTouchListener(scheduleDraftPopup.getDragToOpenListener());
scheduleDraftDismiss.setOnClickListener(v->updateScheduledAt(null)); scheduleDraftDismiss.setOnClickListener(v->updateScheduledAt(null));
scheduleTimeBtn.setOnClickListener(v->pickScheduledDateTime()); scheduleTimeBtn.setOnClickListener(v->pickScheduledDateTime());
@@ -572,6 +560,78 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
}); });
spoilerEdit.addTextChangedListener(new SimpleTextWatcher(e->updateCharCounter())); spoilerEdit.addTextChangedListener(new SimpleTextWatcher(e->updateCharCounter()));
if(replyTo!=null){ if(replyTo!=null){
View replyWrap = view.findViewById(R.id.reply_wrap);
scrollView.getViewTreeObserver().addOnGlobalLayoutListener(() -> {
int scrollHeight = scrollView.getHeight();
if (replyWrap.getMinimumHeight() != scrollHeight) {
replyWrap.setMinimumHeight(scrollHeight);
if (!initiallyScrolled) {
initiallyScrolled = true;
scrollView.post(() -> {
int bottom = scrollView.getChildAt(0).getBottom();
int delta = bottom - (scrollView.getScrollY() + scrollView.getHeight());
int space = GlobalUserPreferences.reduceMotion ? 0 : Math.min(V.dp(70), delta);
scrollView.scrollBy(0, delta - space);
if (!GlobalUserPreferences.reduceMotion) {
scrollView.postDelayed(() -> scrollView.smoothScrollBy(0, space), 130);
}
});
}
}
});
View originalPost = view.findViewById(R.id.original_post);
originalPost.setVisibility(View.VISIBLE);
originalPost.setOnClickListener(v->{
Bundle args=new Bundle();
args.putString("account", accountID);
args.putParcelable("status", Parcels.wrap(replyTo));
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
Nav.go(getActivity(), ThreadFragment.class, args);
});
ImageView avatar = view.findViewById(R.id.avatar);
ViewImageLoader.load(avatar, null, new UrlImageLoaderRequest(replyTo.account.avatar));
ViewOutlineProvider roundCornersOutline=new ViewOutlineProvider(){
@Override
public void getOutline(View view, Outline outline){
outline.setRoundRect(0, 0, view.getWidth(), view.getHeight(), V.dp(12));
}
};
avatar.setOutlineProvider(roundCornersOutline);
avatar.setClipToOutline(true);
avatar.setOnClickListener(v->{
Bundle args=new Bundle();
args.putString("account", accountID);
args.putParcelable("profileAccount", Parcels.wrap(replyTo.account));
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
Nav.go(getActivity(), ProfileFragment.class, args);
});
((TextView) view.findViewById(R.id.name)).setText(replyTo.account.displayName);
((TextView) view.findViewById(R.id.username)).setText(replyTo.account.getDisplayUsername());
view.findViewById(R.id.visibility).setVisibility(View.GONE);
Drawable visibilityIcon = getActivity().getDrawable(switch(replyTo.visibility){
case PUBLIC -> R.drawable.ic_fluent_earth_20_regular;
case UNLISTED -> R.drawable.ic_fluent_people_community_20_regular;
case PRIVATE -> R.drawable.ic_fluent_people_checkmark_20_regular;
case DIRECT -> R.drawable.ic_fluent_mention_20_regular;
});
ImageView moreBtn = view.findViewById(R.id.more);
moreBtn.setImageDrawable(visibilityIcon);
moreBtn.setBackground(null);
TextView timestamp = view.findViewById(R.id.timestamp);
if (replyTo.editedAt==null) timestamp.setText(UiUtils.formatRelativeTimestamp(getContext(), replyTo.createdAt));
else timestamp.setText(getString(R.string.edited_timestamp, UiUtils.formatRelativeTimestamp(getContext(), replyTo.editedAt)));
if (replyTo.spoilerText != null && !replyTo.spoilerText.isBlank()) {
view.findViewById(R.id.spoiler_header).setVisibility(View.VISIBLE);
((TextView) view.findViewById(R.id.spoiler_title_inline)).setText(replyTo.spoilerText);
}
SpannableStringBuilder content = HtmlParser.parse(replyTo.content, replyTo.emojis, replyTo.mentions, replyTo.tags, accountID);
LinkedTextView text = view.findViewById(R.id.text);
if (content.length() > 0) text.setText(content);
else view.findViewById(R.id.display_item_text).setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, V.dp(16)));
replyText.setText(getString(R.string.in_reply_to, replyTo.account.displayName)); replyText.setText(getString(R.string.in_reply_to, replyTo.account.displayName));
int visibilityNameRes = switch (replyTo.visibility) { int visibilityNameRes = switch (replyTo.visibility) {
case PUBLIC -> R.string.visibility_public; case PUBLIC -> R.string.visibility_public;
@@ -580,24 +640,10 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
case DIRECT -> R.string.visibility_private; case DIRECT -> R.string.visibility_private;
}; };
replyText.setContentDescription(getString(R.string.in_reply_to, replyTo.account.displayName) + ". " + getString(R.string.post_visibility) + ": " + getString(visibilityNameRes)); replyText.setContentDescription(getString(R.string.in_reply_to, replyTo.account.displayName) + ". " + getString(R.string.post_visibility) + ": " + getString(visibilityNameRes));
Drawable visibilityIcon = getActivity().getDrawable(switch(replyTo.visibility){
case PUBLIC -> R.drawable.ic_fluent_earth_20_regular;
case UNLISTED -> R.drawable.ic_fluent_people_community_20_regular;
case PRIVATE -> R.drawable.ic_fluent_people_checkmark_20_regular;
case DIRECT -> R.drawable.ic_fluent_mention_20_regular;
});
visibilityIcon.setBounds(0, 0, V.dp(20), V.dp(20));
Drawable replyArrow = getActivity().getDrawable(R.drawable.ic_fluent_arrow_reply_20_filled);
replyArrow.setBounds(0, 0, V.dp(20), V.dp(20));
replyText.setCompoundDrawables(replyArrow, null, visibilityIcon, null);
replyText.setOnClickListener(v->{ replyText.setOnClickListener(v->{
Bundle args=new Bundle(); scrollView.smoothScrollTo(0, 0);
args.putString("account", accountID);
args.putParcelable("status", Parcels.wrap(replyTo));
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
Nav.go(getActivity(), ThreadFragment.class, args);
}); });
ArrayList<String> mentions=new ArrayList<>(); ArrayList<String> mentions=new ArrayList<>();
String ownID=AccountSessionManager.getInstance().getAccount(accountID).self.id; String ownID=AccountSessionManager.getInstance().getAccount(accountID).self.id;
if(!replyTo.account.id.equals(ownID)) if(!replyTo.account.id.equals(ownID))
@@ -672,7 +718,6 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
} }
updateSensitive(); updateSensitive();
updateScheduledAt(scheduledAt != null ? scheduledAt : scheduledStatus != null ? scheduledStatus.scheduledAt : null);
if(editingStatus!=null){ if(editingStatus!=null){
updateCharCounter(); updateCharCounter();
@@ -682,40 +727,55 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
@Override @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater){ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater){
publishButton=new Button(getActivity());
resetPublishButtonText();
publishButton.setSingleLine();
publishButton.setEllipsize(TextUtils.TruncateAt.END);
publishButton.setOnClickListener(this::onPublishClick);
LinearLayout wrap=new LinearLayout(getActivity());
wrap.setOrientation(LinearLayout.HORIZONTAL);
sendProgress=new ProgressBar(getActivity());
LinearLayout.LayoutParams progressLP=new LinearLayout.LayoutParams(V.dp(24), V.dp(24));
progressLP.setMarginEnd(V.dp(16));
progressLP.gravity=Gravity.CENTER_VERTICAL;
wrap.addView(sendProgress, progressLP);
sendError=new ImageView(getActivity());
sendError.setImageResource(R.drawable.ic_fluent_error_circle_24_regular);
sendError.setImageTintList(getResources().getColorStateList(R.color.error_600));
sendError.setScaleType(ImageView.ScaleType.CENTER);
wrap.addView(sendError, progressLP);
sendError.setVisibility(View.GONE);
sendProgress.setVisibility(View.GONE);
LinearLayout.LayoutParams langParams=new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
langParams.setMarginEnd(V.dp(8));
wrap.addView(buildLanguageSelector(), langParams);
wrap.addView(publishButton, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
wrap.setPadding(V.dp(16), V.dp(4), V.dp(16), V.dp(8));
wrap.setClipToPadding(false);
MenuItem item=menu.add(editingStatus==null ? R.string.publish : R.string.save); MenuItem item=menu.add(editingStatus==null ? R.string.publish : R.string.save);
LinearLayout wrap=new LinearLayout(getActivity());
getActivity().getLayoutInflater().inflate(R.layout.compose_action, wrap);
item.setActionView(wrap); item.setActionView(wrap);
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
updatePublishButtonState();
draftsBtn = wrap.findViewById(R.id.drafts_btn);
draftOptionsPopup = new PopupMenu(getContext(), draftsBtn);
draftOptionsPopup.inflate(R.menu.compose_more);
draftMenuItem = draftOptionsPopup.getMenu().findItem(R.id.draft);
undraftMenuItem = draftOptionsPopup.getMenu().findItem(R.id.undraft);
scheduleMenuItem = draftOptionsPopup.getMenu().findItem(R.id.schedule);
unscheduleMenuItem = draftOptionsPopup.getMenu().findItem(R.id.unschedule);
draftOptionsPopup.setOnMenuItemClickListener(i->{
int id = i.getItemId();
if (id == R.id.draft) updateScheduledAt(getDraftInstant());
else if (id == R.id.schedule) pickScheduledDateTime();
else if (id == R.id.unschedule || id == R.id.undraft) updateScheduledAt(null);
else navigateToUnsentPosts();
return true;
});
UiUtils.enablePopupMenuIcons(getContext(), draftOptionsPopup);
publishButton = wrap.findViewById(R.id.publish_btn);
languageButton = wrap.findViewById(R.id.language_btn);
sendProgress = wrap.findViewById(R.id.send_progress);
sendError = wrap.findViewById(R.id.send_error);
publishButton.setOnClickListener(this::onPublishClick);
draftsBtn.setOnClickListener(v-> draftOptionsPopup.show());
draftsBtn.setOnTouchListener(draftOptionsPopup.getDragToOpenListener());
updateScheduledAt(scheduledAt != null ? scheduledAt : scheduledStatus != null ? scheduledStatus.scheduledAt : null);
buildLanguageSelector(languageButton);
}
private void navigateToUnsentPosts() {
Bundle args=new Bundle();
args.putString("account", accountID);
args.putBoolean("hide_fab", true);
InputMethodManager imm=getActivity().getSystemService(InputMethodManager.class);
imm.hideSoftInputFromWindow(draftsBtn.getWindowToken(), 0);
if (hasDraft()) {
Nav.go(getActivity(), ScheduledStatusListFragment.class, args);
} else {
// result for the previous ScheduledStatusList
setResult(true, null);
// finishing fragment in "onFragmentResult"
Nav.goForResult(getActivity(), ScheduledStatusListFragment.class, args, SCHEDULED_STATUS_OPENED_RESULT, this);
}
} }
private void updateLanguage(String lang) { private void updateLanguage(String lang) {
@@ -729,18 +789,10 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
} }
@SuppressLint("ClickableViewAccessibility") @SuppressLint("ClickableViewAccessibility")
private Button buildLanguageSelector() { private void buildLanguageSelector(Button btn) {
languageButton=new Button(getActivity());
languageButton.setTextColor(UiUtils.getThemeColor(getActivity(), android.R.attr.textColorSecondary));
languageButton.setBackground(getActivity().getDrawable(R.drawable.bg_text_button));
languageButton.setPadding(V.dp(8), 0, V.dp(8), 0);
languageButton.setCompoundDrawablesRelativeWithIntrinsicBounds(getActivity().getDrawable(R.drawable.ic_fluent_local_language_16_regular), null, null, null);
languageButton.setCompoundDrawableTintList(languageButton.getTextColors());
languageButton.setCompoundDrawablePadding(V.dp(6));
languagePopup=new PopupMenu(getActivity(), languageButton); languagePopup=new PopupMenu(getActivity(), languageButton);
languageButton.setOnTouchListener(languagePopup.getDragToOpenListener()); btn.setOnTouchListener(languagePopup.getDragToOpenListener());
languageButton.setOnClickListener(v->languagePopup.show()); btn.setOnClickListener(v->languagePopup.show());
Preferences prefs = AccountSessionManager.getInstance().getAccount(accountID).preferences; Preferences prefs = AccountSessionManager.getInstance().getAccount(accountID).preferences;
updateLanguage(prefs != null && prefs.postingDefaultLanguage != null && prefs.postingDefaultLanguage.length() > 0 updateLanguage(prefs != null && prefs.postingDefaultLanguage != null && prefs.postingDefaultLanguage.length() > 0
@@ -764,8 +816,6 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
updateLanguage(allLanguages.get(i.getItemId())); updateLanguage(allLanguages.get(i.getItemId()));
return true; return true;
}); });
return languageButton;
} }
@Override @Override
@@ -838,25 +888,6 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
@Override @Override
protected void updateToolbar(){ protected void updateToolbar(){
super.updateToolbar(); super.updateToolbar();
if (replyTo != null || hasDraft()) return;
Button draftsBtn=new Button(getActivity());
draftsBtn.setTextColor(UiUtils.getThemeColor(getActivity(), android.R.attr.textColorSecondary));
draftsBtn.setBackground(getActivity().getDrawable(R.drawable.bg_text_button));
draftsBtn.setPadding(V.dp(8), 0, V.dp(8), 0);
draftsBtn.setCompoundDrawablesRelativeWithIntrinsicBounds(getActivity().getDrawable(R.drawable.ic_fluent_drafts_20_regular), null, null, null);
draftsBtn.setCompoundDrawableTintList(draftsBtn.getTextColors());
draftsBtn.setContentDescription(getString(R.string.sk_unsent_posts));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) draftsBtn.setTooltipText(getString(R.string.sk_unsent_posts));
draftsBtn.setOnClickListener(v->{
Bundle args=new Bundle();
args.putString("account", accountID);
InputMethodManager imm=getActivity().getSystemService(InputMethodManager.class);
imm.hideSoftInputFromWindow(draftsBtn.getWindowToken(), 0);
Nav.go(getActivity(), ScheduledStatusListFragment.class, args);
// TODO: figure out a better way to handle the back stack
// if (!hasDraft()) content.postDelayed(()->Nav.finish(this), 200);
});
getToolbar().addView(draftsBtn);
getToolbar().setNavigationIcon(R.drawable.ic_fluent_dismiss_24_regular); getToolbar().setNavigationIcon(R.drawable.ic_fluent_dismiss_24_regular);
} }
@@ -1029,6 +1060,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
if(!existingMediaIDs.equals(attachments.stream().map(a->a.serverAttachment.id).collect(Collectors.toList()))) if(!existingMediaIDs.equals(attachments.stream().map(a->a.serverAttachment.id).collect(Collectors.toList())))
return true; return true;
if(!statusVisibility.equals(editingStatus.visibility)) return true; if(!statusVisibility.equals(editingStatus.visibility)) return true;
if(scheduledStatus != null && !scheduledStatus.scheduledAt.equals(scheduledAt)) return true;
return pollChanged; return pollChanged;
} }
boolean pollFieldsHaveContent=false; boolean pollFieldsHaveContent=false;
@@ -1073,14 +1105,16 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
break; break;
} }
} }
} else if (reqCode == SCHEDULED_STATUS_OPENED_RESULT && success && getActivity() != null) {
Nav.finish(this);
} }
} }
private void confirmDiscardDraftAndFinish(){ private void confirmDiscardDraftAndFinish(){
new M3AlertDialogBuilder(getActivity()) new M3AlertDialogBuilder(getActivity())
.setTitle(editingStatus != null ? R.string.sk_save_changes : R.string.sk_save_draft) .setTitle(editingStatus != null ? R.string.sk_confirm_save_changes : R.string.sk_confirm_save_draft)
.setPositiveButton(R.string.save, (d, w) -> { .setPositiveButton(R.string.save, (d, w) -> {
updateScheduledAt(getDraftInstant()); updateScheduledAt(scheduledAt == null ? getDraftInstant() : scheduledAt);
publish(); publish();
}) })
.setNegativeButton(R.string.discard, (d, w) -> Nav.finish(this)) .setNegativeButton(R.string.discard, (d, w) -> Nav.finish(this))
@@ -1575,23 +1609,39 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
private void updateScheduledAt(Instant scheduledAt) { private void updateScheduledAt(Instant scheduledAt) {
this.scheduledAt = scheduledAt; this.scheduledAt = scheduledAt;
scheduleDraftView.setVisibility(scheduledAt == null ? View.GONE : View.VISIBLE);
scheduleBtn.setSelected(scheduledAt != null);
updatePublishButtonState(); updatePublishButtonState();
scheduleDraftView.setVisibility(scheduledAt == null ? View.GONE : View.VISIBLE);
draftMenuItem.setVisible(true);
scheduleMenuItem.setVisible(true);
undraftMenuItem.setVisible(false);
unscheduleMenuItem.setVisible(false);
if (scheduledAt != null) { if (scheduledAt != null) {
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM).withLocale(Locale.getDefault()); DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM).withLocale(Locale.getDefault());
if (scheduledAt.isAfter(DRAFTS_AFTER_INSTANT)) { if (scheduledAt.isAfter(DRAFTS_AFTER_INSTANT)) {
draftMenuItem.setVisible(false);
undraftMenuItem.setVisible(true);
scheduleTimeBtn.setVisibility(View.GONE); scheduleTimeBtn.setVisibility(View.GONE);
scheduleDraftText.setText(R.string.sk_compose_draft); scheduleDraftText.setText(R.string.sk_compose_draft);
publishButton.setText(scheduledStatus != null ? R.string.save : R.string.sk_draft); scheduleDraftText.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_fluent_drafts_20_regular, 0, 0, 0);
scheduleDraftDismiss.setContentDescription(getString(R.string.sk_compose_no_draft));
draftsBtn.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_fluent_drafts_20_filled, 0, 0, 0);
publishButton.setText(scheduledStatus != null && scheduledStatus.scheduledAt.isAfter(DRAFTS_AFTER_INSTANT)
? R.string.save : R.string.sk_draft);
} else { } else {
scheduleMenuItem.setVisible(false);
unscheduleMenuItem.setVisible(true);
String at = scheduledAt.atZone(ZoneId.systemDefault()).format(formatter); String at = scheduledAt.atZone(ZoneId.systemDefault()).format(formatter);
scheduleTimeBtn.setVisibility(View.VISIBLE); scheduleTimeBtn.setVisibility(View.VISIBLE);
scheduleTimeBtn.setText(at); scheduleTimeBtn.setText(at);
scheduleDraftText.setText(R.string.sk_compose_scheduled); scheduleDraftText.setText(R.string.sk_compose_scheduled);
publishButton.setText(scheduledStatus != null ? R.string.save : R.string.sk_schedule); scheduleDraftText.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
scheduleDraftDismiss.setContentDescription(getString(R.string.sk_compose_no_schedule));
draftsBtn.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_fluent_clock_20_filled, 0, 0, 0);
publishButton.setText(scheduledStatus != null && scheduledStatus.scheduledAt.equals(scheduledAt)
? R.string.save : R.string.sk_schedule);
} }
} else { } else {
draftsBtn.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_fluent_clock_20_regular, 0, 0, 0);
resetPublishButtonText(); resetPublishButtonText();
} }
} }

View File

@@ -29,10 +29,12 @@ import com.squareup.otto.Subscribe;
import org.joinmastodon.android.E; import org.joinmastodon.android.E;
import org.joinmastodon.android.GlobalUserPreferences; import org.joinmastodon.android.GlobalUserPreferences;
import org.joinmastodon.android.R; import org.joinmastodon.android.R;
import org.joinmastodon.android.api.requests.announcements.GetAnnouncements;
import org.joinmastodon.android.api.requests.timelines.GetHomeTimeline; import org.joinmastodon.android.api.requests.timelines.GetHomeTimeline;
import org.joinmastodon.android.api.session.AccountSessionManager; import org.joinmastodon.android.api.session.AccountSessionManager;
import org.joinmastodon.android.events.SelfUpdateStateChangedEvent; import org.joinmastodon.android.events.SelfUpdateStateChangedEvent;
import org.joinmastodon.android.events.StatusCreatedEvent; import org.joinmastodon.android.events.StatusCreatedEvent;
import org.joinmastodon.android.model.Announcement;
import org.joinmastodon.android.model.CacheablePaginatedResponse; import org.joinmastodon.android.model.CacheablePaginatedResponse;
import org.joinmastodon.android.model.Filter; import org.joinmastodon.android.model.Filter;
import org.joinmastodon.android.model.Status; import org.joinmastodon.android.model.Status;
@@ -56,11 +58,14 @@ import me.grishka.appkit.utils.CubicBezierInterpolator;
import me.grishka.appkit.utils.V; import me.grishka.appkit.utils.V;
public class HomeTimelineFragment extends StatusListFragment{ public class HomeTimelineFragment extends StatusListFragment{
private static final int ANNOUNCEMENTS_RESULT = 654;
private ImageButton fab; private ImageButton fab;
private ImageView toolbarLogo; private ImageView toolbarLogo;
private Button toolbarShowNewPostsBtn; private Button toolbarShowNewPostsBtn;
private boolean newPostsBtnShown; private boolean newPostsBtnShown;
private AnimatorSet currentNewPostsAnim; private AnimatorSet currentNewPostsAnim;
private MenuItem announcements;
private String maxID; private String maxID;
@@ -105,7 +110,7 @@ public class HomeTimelineFragment extends StatusListFragment{
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);
fab=view.findViewById(R.id.fab); fab=view.findViewById(R.id.fab);
fab.setOnClickListener(this::onFabClick); fab.setOnClickListener(this::onFabClick);
fab.setOnLongClickListener(v->UiUtils.pickAccountForCompose(getActivity(), accountID, null)); fab.setOnLongClickListener(v->UiUtils.pickAccountForCompose(getActivity(), accountID));
updateToolbarLogo(); updateToolbarLogo();
list.addOnScrollListener(new RecyclerView.OnScrollListener(){ list.addOnScrollListener(new RecyclerView.OnScrollListener(){
@@ -126,16 +131,40 @@ public class HomeTimelineFragment extends StatusListFragment{
@Override @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater){ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater){
inflater.inflate(R.menu.home, menu); inflater.inflate(R.menu.home, menu);
announcements = menu.findItem(R.id.announcements);
new GetAnnouncements(false).setCallback(new Callback<>() {
@Override
public void onSuccess(List<Announcement> result) {
boolean hasUnread = result.stream().anyMatch(a -> !a.read);
announcements.setIcon(hasUnread ? R.drawable.ic_announcements_24_badged : R.drawable.ic_fluent_megaphone_24_regular);
}
@Override
public void onError(ErrorResponse error) {
error.showToast(getActivity());
}
}).exec(accountID);
} }
@Override @Override
public boolean onOptionsItemSelected(MenuItem item){ public boolean onOptionsItemSelected(MenuItem item){
Bundle args=new Bundle(); Bundle args=new Bundle();
args.putString("account", accountID); args.putString("account", accountID);
Nav.go(getActivity(), SettingsFragment.class, args); if (item.getItemId() == R.id.settings) Nav.go(getActivity(), SettingsFragment.class, args);
if (item.getItemId() == R.id.announcements) {
Nav.goForResult(getActivity(), AnnouncementsFragment.class, args, ANNOUNCEMENTS_RESULT, this);
}
return true; return true;
} }
@Override
public void onFragmentResult(int reqCode, boolean noMoreUnread, Bundle result){
if (reqCode == ANNOUNCEMENTS_RESULT && noMoreUnread) {
announcements.setIcon(R.drawable.ic_fluent_megaphone_24_regular);
}
}
@Override @Override
public void onConfigurationChanged(Configuration newConfig){ public void onConfigurationChanged(Configuration newConfig){
super.onConfigurationChanged(newConfig); super.onConfigurationChanged(newConfig);
@@ -188,10 +217,8 @@ public class HomeTimelineFragment extends StatusListFragment{
result.get(result.size()-1).hasGapAfter=true; result.get(result.size()-1).hasGapAfter=true;
toAdd=result; toAdd=result;
} }
List<Filter> filters=AccountSessionManager.getInstance().getAccount(accountID).wordFilters.stream().filter(f->f.context.contains(Filter.FilterContext.HOME)).collect(Collectors.toList()); StatusFilterPredicate filterPredicate=new StatusFilterPredicate(accountID, Filter.FilterContext.HOME);
if(!filters.isEmpty()){ toAdd=toAdd.stream().filter(filterPredicate).collect(Collectors.toList());
toAdd=toAdd.stream().filter(new StatusFilterPredicate(filters)).collect(Collectors.toList());
}
if(!toAdd.isEmpty()){ if(!toAdd.isEmpty()){
prependItems(toAdd, true); prependItems(toAdd, true);
showNewPostsButton(); showNewPostsButton();

View File

@@ -1,7 +1,6 @@
package org.joinmastodon.android.fragments; package org.joinmastodon.android.fragments;
import android.app.Activity; import android.app.Activity;
import android.media.MediaRouter;
import android.os.Bundle; import android.os.Bundle;
import android.view.Menu; import android.view.Menu;
import android.view.MenuInflater; import android.view.MenuInflater;
@@ -70,7 +69,7 @@ public class ListTimelineFragment extends StatusListFragment {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);
fab=view.findViewById(R.id.fab); fab=view.findViewById(R.id.fab);
fab.setOnClickListener(this::onFabClick); fab.setOnClickListener(this::onFabClick);
fab.setOnLongClickListener(v -> UiUtils.pickAccountForCompose(getActivity(), accountID, null)); fab.setOnLongClickListener(v -> UiUtils.pickAccountForCompose(getActivity(), accountID));
} }
private void onFabClick(View v){ private void onFabClick(View v){

View File

@@ -2,22 +2,22 @@ package org.joinmastodon.android.fragments;
import android.app.Activity; import android.app.Activity;
import android.os.Bundle; import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
import com.squareup.otto.Subscribe; import com.squareup.otto.Subscribe;
import org.joinmastodon.android.E; import org.joinmastodon.android.E;
import org.joinmastodon.android.R; import org.joinmastodon.android.R;
import org.joinmastodon.android.api.requests.statuses.GetBookmarkedStatuses; import org.joinmastodon.android.api.requests.statuses.CreateStatus;
import org.joinmastodon.android.api.requests.statuses.GetScheduledStatuses; import org.joinmastodon.android.api.requests.statuses.GetScheduledStatuses;
import org.joinmastodon.android.api.session.AccountSessionManager;
import org.joinmastodon.android.events.ScheduledStatusCreatedEvent; import org.joinmastodon.android.events.ScheduledStatusCreatedEvent;
import org.joinmastodon.android.events.ScheduledStatusDeletedEvent; import org.joinmastodon.android.events.ScheduledStatusDeletedEvent;
import org.joinmastodon.android.events.StatusCreatedEvent;
import org.joinmastodon.android.events.StatusDeletedEvent;
import org.joinmastodon.android.model.HeaderPaginationList; import org.joinmastodon.android.model.HeaderPaginationList;
import org.joinmastodon.android.model.ScheduledStatus; import org.joinmastodon.android.model.ScheduledStatus;
import org.joinmastodon.android.model.Status; import org.joinmastodon.android.model.Status;
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.Collections; import java.util.Collections;
@@ -28,6 +28,12 @@ import me.grishka.appkit.api.SimpleCallback;
public class ScheduledStatusListFragment extends BaseStatusListFragment<ScheduledStatus> { public class ScheduledStatusListFragment extends BaseStatusListFragment<ScheduledStatus> {
private String nextMaxID; private String nextMaxID;
private ImageButton fab;
private static final int SCHEDULED_STATUS_LIST_OPENED = 161;
public ScheduledStatusListFragment() {
setListLayoutId(R.layout.recycler_fragment_with_fab);
}
@Override @Override
public void onCreate(Bundle savedInstanceState){ public void onCreate(Bundle savedInstanceState){
@@ -49,6 +55,18 @@ public class ScheduledStatusListFragment extends BaseStatusListFragment<Schedule
loadData(); loadData();
} }
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
fab=view.findViewById(R.id.fab);
Bundle args=new Bundle();
args.putString("account", accountID);
args.putSerializable("scheduledAt", CreateStatus.getDraftInstant());
fab.setOnClickListener(v -> Nav.go(getActivity(), ComposeFragment.class, args));
fab.setOnLongClickListener(v -> UiUtils.pickAccountForCompose(getActivity(), accountID, args));
if (getArguments().getBoolean("hide_fab", false)) fab.setVisibility(View.GONE);
}
@Override @Override
protected List<StatusDisplayItem> buildDisplayItems(ScheduledStatus s) { protected List<StatusDisplayItem> buildDisplayItems(ScheduledStatus s) {
return StatusDisplayItem.buildItems(this, s.toStatus(), accountID, s, knownAccounts, false, false, null); return StatusDisplayItem.buildItems(this, s.toStatus(), accountID, s, knownAccounts, false, false, null);
@@ -68,7 +86,17 @@ public class ScheduledStatusListFragment extends BaseStatusListFragment<Schedule
args.putString("sourceText", status.text); args.putString("sourceText", status.text);
args.putString("sourceSpoiler", status.spoilerText); args.putString("sourceSpoiler", status.spoilerText);
args.putBoolean("redraftStatus", true); args.putBoolean("redraftStatus", true);
Nav.go(getActivity(), ComposeFragment.class, args); setResult(true, null);
// closing this scheduled status list if another status list is opened from compose fragment
Nav.goForResult(getActivity(), ComposeFragment.class, args, SCHEDULED_STATUS_LIST_OPENED, this);
}
@Override
public void onFragmentResult(int reqCode, boolean success, Bundle result) {
if (reqCode == SCHEDULED_STATUS_LIST_OPENED && success && getActivity() != null) {
Nav.finish(this);
}
} }
@Override @Override

View File

@@ -108,10 +108,6 @@ public class SettingsFragment extends MastodonToolbarFragment{
items.add(new HeaderItem(R.string.settings_theme)); items.add(new HeaderItem(R.string.settings_theme));
items.add(themeItem=new ThemeItem()); items.add(themeItem=new ThemeItem());
items.add(new SwitchItem(R.string.theme_true_black, R.drawable.ic_fluent_dark_theme_24_regular, GlobalUserPreferences.trueBlackTheme, this::onTrueBlackThemeChanged)); items.add(new SwitchItem(R.string.theme_true_black, R.drawable.ic_fluent_dark_theme_24_regular, GlobalUserPreferences.trueBlackTheme, this::onTrueBlackThemeChanged));
items.add(new SwitchItem(R.string.sk_disable_marquee, R.drawable.ic_fluent_text_more_24_regular, GlobalUserPreferences.disableMarquee, i->{
GlobalUserPreferences.disableMarquee=i.checked;
GlobalUserPreferences.save();
}));
items.add(new ButtonItem(R.string.sk_settings_color_palette, R.drawable.ic_fluent_color_24_regular, b->{ items.add(new ButtonItem(R.string.sk_settings_color_palette, R.drawable.ic_fluent_color_24_regular, b->{
PopupMenu popupMenu=new PopupMenu(getActivity(), b, Gravity.CENTER_HORIZONTAL); PopupMenu popupMenu=new PopupMenu(getActivity(), b, Gravity.CENTER_HORIZONTAL);
popupMenu.inflate(R.menu.color_palettes); popupMenu.inflate(R.menu.color_palettes);
@@ -158,7 +154,15 @@ public class SettingsFragment extends MastodonToolbarFragment{
}); });
})); }));
items.add(new SwitchItem(R.string.sk_settings_uniform_icon_for_notifications, R.drawable.ic_ntf_logo, GlobalUserPreferences.uniformNotificationIcon, i->{ items.add(new SwitchItem(R.string.sk_settings_uniform_icon_for_notifications, R.drawable.ic_ntf_logo, GlobalUserPreferences.uniformNotificationIcon, i->{
GlobalUserPreferences.uniformNotificationIcon =i.checked; GlobalUserPreferences.uniformNotificationIcon=i.checked;
GlobalUserPreferences.save();
}));
items.add(new SwitchItem(R.string.sk_disable_marquee, R.drawable.ic_fluent_text_more_24_regular, GlobalUserPreferences.disableMarquee, i->{
GlobalUserPreferences.disableMarquee=i.checked;
GlobalUserPreferences.save();
}));
items.add(new SwitchItem(R.string.sk_settings_reduce_motion, R.drawable.ic_fluent_star_emphasis_24_regular, GlobalUserPreferences.reduceMotion, i->{
GlobalUserPreferences.reduceMotion=i.checked;
GlobalUserPreferences.save(); GlobalUserPreferences.save();
})); }));

View File

@@ -139,6 +139,7 @@ public class CustomWelcomeFragment extends InstanceCatalogFragment {
headerView.findViewById(R.id.visibility).setVisibility(View.GONE); headerView.findViewById(R.id.visibility).setVisibility(View.GONE);
headerView.findViewById(R.id.separator).setVisibility(View.GONE); headerView.findViewById(R.id.separator).setVisibility(View.GONE);
headerView.findViewById(R.id.timestamp).setVisibility(View.GONE); headerView.findViewById(R.id.timestamp).setVisibility(View.GONE);
headerView.findViewById(R.id.unread_indicator).setVisibility(View.GONE);
((TextView) headerView.findViewById(R.id.username)).setText(R.string.sk_app_username); ((TextView) headerView.findViewById(R.id.username)).setText(R.string.sk_app_username);
((TextView) headerView.findViewById(R.id.name)).setText(R.string.sk_app_name); ((TextView) headerView.findViewById(R.id.name)).setText(R.string.sk_app_name);
((ImageView) headerView.findViewById(R.id.avatar)).setImageDrawable(getActivity().getDrawable(R.mipmap.ic_launcher)); ((ImageView) headerView.findViewById(R.id.avatar)).setImageDrawable(getActivity().getDrawable(R.mipmap.ic_launcher));

View File

@@ -0,0 +1,63 @@
package org.joinmastodon.android.model;
import org.joinmastodon.android.api.RequiredField;
import org.parceler.Parcel;
import java.time.Instant;
import java.util.List;
@Parcel
public class Announcement extends BaseModel implements DisplayItemsParent {
@RequiredField
public String id;
@RequiredField
public String content;
public Instant startsAt;
public Instant endsAt;
public boolean published;
public boolean allDay;
public Instant publishedAt;
public Instant updatedAt;
public boolean read;
public List<Emoji> emojis;
public List<Mention> mentions;
public List<Hashtag> tags;
@Override
public String toString() {
return "Announcement{" +
"id='" + id + '\'' +
", content='" + content + '\'' +
", startsAt=" + startsAt +
", endsAt=" + endsAt +
", published=" + published +
", allDay=" + allDay +
", publishedAt=" + publishedAt +
", updatedAt=" + updatedAt +
", read=" + read +
", emojis=" + emojis +
", mentions=" + mentions +
", tags=" + tags +
'}';
}
public Status toStatus() {
Status s = new Status();
s.id = id;
s.mediaAttachments = List.of();
s.createdAt = startsAt != null ? startsAt : publishedAt;
if (updatedAt != null) s.editedAt = updatedAt;
s.content = s.text = content;
s.spoilerText = "";
s.visibility = StatusPrivacy.PUBLIC;
s.mentions = List.of();
s.tags = List.of();
s.emojis = List.of();
return s;
}
@Override
public String getID() {
return id;
}
}

View File

@@ -23,6 +23,7 @@ import android.widget.Toast;
import org.joinmastodon.android.GlobalUserPreferences; import org.joinmastodon.android.GlobalUserPreferences;
import org.joinmastodon.android.R; import org.joinmastodon.android.R;
import org.joinmastodon.android.api.requests.accounts.GetAccountRelationships; import org.joinmastodon.android.api.requests.accounts.GetAccountRelationships;
import org.joinmastodon.android.api.requests.announcements.DismissAnnouncement;
import org.joinmastodon.android.api.requests.statuses.CreateStatus; import org.joinmastodon.android.api.requests.statuses.CreateStatus;
import org.joinmastodon.android.api.requests.statuses.GetStatusSourceText; import org.joinmastodon.android.api.requests.statuses.GetStatusSourceText;
import org.joinmastodon.android.api.session.AccountSession; import org.joinmastodon.android.api.session.AccountSession;
@@ -34,6 +35,7 @@ import org.joinmastodon.android.fragments.ProfileFragment;
import org.joinmastodon.android.fragments.ThreadFragment; import org.joinmastodon.android.fragments.ThreadFragment;
import org.joinmastodon.android.fragments.report.ReportReasonChoiceFragment; import org.joinmastodon.android.fragments.report.ReportReasonChoiceFragment;
import org.joinmastodon.android.model.Account; import org.joinmastodon.android.model.Account;
import org.joinmastodon.android.model.Announcement;
import org.joinmastodon.android.model.Attachment; import org.joinmastodon.android.model.Attachment;
import org.joinmastodon.android.model.Notification; import org.joinmastodon.android.model.Notification;
import org.joinmastodon.android.model.Relationship; import org.joinmastodon.android.model.Relationship;
@@ -51,6 +53,7 @@ import java.time.format.FormatStyle;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.function.Consumer;
import me.grishka.appkit.Nav; import me.grishka.appkit.Nav;
import me.grishka.appkit.api.APIRequest; import me.grishka.appkit.api.APIRequest;
@@ -74,6 +77,8 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
private String extraText; private String extraText;
private Notification notification; private Notification notification;
private ScheduledStatus scheduledStatus; private ScheduledStatus scheduledStatus;
private Announcement announcement;
private Consumer<String> consumeReadAnnouncement;
public HeaderStatusDisplayItem(String parentID, Account user, Instant createdAt, BaseStatusListFragment parentFragment, String accountID, Status status, String extraText, Notification notification, ScheduledStatus scheduledStatus){ public HeaderStatusDisplayItem(String parentID, Account user, Instant createdAt, BaseStatusListFragment parentFragment, String accountID, Status status, String extraText, Notification notification, ScheduledStatus scheduledStatus){
super(parentID, parentFragment); super(parentID, parentFragment);
@@ -102,6 +107,13 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
this.extraText=extraText; this.extraText=extraText;
} }
public static HeaderStatusDisplayItem fromAnnouncement(Announcement a, Status fakeStatus, Account instanceUser, BaseStatusListFragment parentFragment, String accountID, Consumer<String> consumeReadID) {
HeaderStatusDisplayItem item = new HeaderStatusDisplayItem(a.id, instanceUser, a.startsAt, parentFragment, accountID, fakeStatus, null, null, null);
item.announcement = a;
item.consumeReadAnnouncement = consumeReadID;
return item;
}
@Override @Override
public Type getType(){ public Type getType(){
return Type.HEADER; return Type.HEADER;
@@ -121,8 +133,8 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
} }
public static class Holder extends StatusDisplayItem.Holder<HeaderStatusDisplayItem> implements ImageLoaderViewHolder{ public static class Holder extends StatusDisplayItem.Holder<HeaderStatusDisplayItem> implements ImageLoaderViewHolder{
private final TextView name, username, timestamp, extraText; private final TextView name, username, timestamp, extraText, separator;
private final ImageView avatar, more, visibility, deleteNotification; private final ImageView avatar, more, visibility, deleteNotification, unreadIndicator;
private final PopupMenu optionsMenu; private final PopupMenu optionsMenu;
private Relationship relationship; private Relationship relationship;
private APIRequest<?> currentRelationshipRequest; private APIRequest<?> currentRelationshipRequest;
@@ -138,11 +150,13 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
super(activity, R.layout.display_item_header, parent); super(activity, R.layout.display_item_header, parent);
name=findViewById(R.id.name); name=findViewById(R.id.name);
username=findViewById(R.id.username); username=findViewById(R.id.username);
separator=findViewById(R.id.separator);
timestamp=findViewById(R.id.timestamp); timestamp=findViewById(R.id.timestamp);
avatar=findViewById(R.id.avatar); avatar=findViewById(R.id.avatar);
more=findViewById(R.id.more); more=findViewById(R.id.more);
visibility=findViewById(R.id.visibility); visibility=findViewById(R.id.visibility);
deleteNotification=findViewById(R.id.delete_notification); deleteNotification=findViewById(R.id.delete_notification);
unreadIndicator=findViewById(R.id.unread_indicator);
extraText=findViewById(R.id.extra_text); extraText=findViewById(R.id.extra_text);
avatar.setOnClickListener(this::onAvaClick); avatar.setOnClickListener(this::onAvaClick);
avatar.setOutlineProvider(roundCornersOutline); avatar.setOutlineProvider(roundCornersOutline);
@@ -267,6 +281,8 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
public void onBind(HeaderStatusDisplayItem item){ public void onBind(HeaderStatusDisplayItem item){
name.setText(item.parsedName); name.setText(item.parsedName);
username.setText('@'+item.user.acct); username.setText('@'+item.user.acct);
separator.setVisibility(View.VISIBLE);
if (item.scheduledStatus!=null) if (item.scheduledStatus!=null)
if (item.scheduledStatus.scheduledAt.isAfter(CreateStatus.DRAFTS_AFTER_INSTANT)) { if (item.scheduledStatus.scheduledAt.isAfter(CreateStatus.DRAFTS_AFTER_INSTANT)) {
timestamp.setText(R.string.sk_draft); timestamp.setText(R.string.sk_draft);
@@ -274,10 +290,14 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM).withLocale(Locale.getDefault()); DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM).withLocale(Locale.getDefault());
timestamp.setText(item.scheduledStatus.scheduledAt.atZone(ZoneId.systemDefault()).format(formatter)); timestamp.setText(item.scheduledStatus.scheduledAt.atZone(ZoneId.systemDefault()).format(formatter));
} }
else if(item.status==null || item.status.editedAt==null) else if ((item.status==null || item.status.editedAt==null) && item.createdAt != null)
timestamp.setText(UiUtils.formatRelativeTimestamp(itemView.getContext(), item.createdAt)); timestamp.setText(UiUtils.formatRelativeTimestamp(itemView.getContext(), item.createdAt));
else else if (item.status != null && item.status.editedAt != null)
timestamp.setText(item.parentFragment.getString(R.string.edited_timestamp, UiUtils.formatRelativeTimestamp(itemView.getContext(), item.status.editedAt))); timestamp.setText(item.parentFragment.getString(R.string.edited_timestamp, UiUtils.formatRelativeTimestamp(itemView.getContext(), item.status.editedAt)));
else {
separator.setVisibility(View.GONE);
timestamp.setText("");
}
visibility.setVisibility(item.hasVisibilityToggle && !item.inset ? View.VISIBLE : View.GONE); visibility.setVisibility(item.hasVisibilityToggle && !item.inset ? View.VISIBLE : View.GONE);
deleteNotification.setVisibility(GlobalUserPreferences.enableDeleteNotifications && item.notification!=null && !item.inset ? View.VISIBLE : View.GONE); deleteNotification.setVisibility(GlobalUserPreferences.enableDeleteNotifications && item.notification!=null && !item.inset ? View.VISIBLE : View.GONE);
if(item.hasVisibilityToggle){ if(item.hasVisibilityToggle){
@@ -301,6 +321,42 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
currentRelationshipRequest.cancel(); currentRelationshipRequest.cancel();
} }
relationship=null; relationship=null;
String desc;
if (item.announcement != null) {
if (unreadIndicator.getVisibility() == View.GONE) {
more.setAlpha(0f);
unreadIndicator.setAlpha(0f);
unreadIndicator.setVisibility(View.VISIBLE);
}
float alpha = item.announcement.read ? 0 : 1;
more.setImageResource(R.drawable.ic_fluent_checkmark_20_filled);
desc = item.parentFragment.getString(R.string.sk_mark_as_read);
more.animate().alpha(alpha);
unreadIndicator.animate().alpha(alpha);
more.setOnClickListener(v -> {
new DismissAnnouncement(item.announcement.id).setCallback(new Callback<>() {
@Override
public void onSuccess(Object o) {
item.consumeReadAnnouncement.accept(item.announcement.id);
item.announcement.read = true;
rebind();
}
@Override
public void onError(ErrorResponse error) {
error.showToast(item.parentFragment.getActivity());
}
}).exec(item.accountID);
});
} else {
more.setImageResource(R.drawable.ic_fluent_more_vertical_20_filled);
desc = item.parentFragment.getString(R.string.more_options);
more.setOnClickListener(this::onMoreClick);
}
more.setContentDescription(desc);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) more.setTooltipText(desc);
} }
@Override @Override
@@ -321,6 +377,10 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
} }
private void onAvaClick(View v){ private void onAvaClick(View v){
if (item.announcement != null) {
UiUtils.openURL(item.parentFragment.getActivity(), item.parentFragment.getAccountID(), item.user.url);
return;
}
Bundle args=new Bundle(); Bundle args=new Bundle();
args.putString("account", item.accountID); args.putString("account", item.accountID);
args.putParcelable("profileAccount", Parcels.wrap(item.user)); args.putParcelable("profileAccount", Parcels.wrap(item.user));
@@ -352,6 +412,7 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
} }
private void updateOptionsMenu(){ private void updateOptionsMenu(){
if (item.announcement != null) return;
boolean hasMultipleAccounts = AccountSessionManager.getInstance().getLoggedInAccounts().size() > 1; boolean hasMultipleAccounts = AccountSessionManager.getInstance().getLoggedInAccounts().size() > 1;
Menu menu=optionsMenu.getMenu(); Menu menu=optionsMenu.getMenu();

View File

@@ -498,7 +498,7 @@ public class UiUtils{
pinned ? R.string.sk_confirm_pin_post_title : R.string.sk_confirm_unpin_post_title, pinned ? R.string.sk_confirm_pin_post_title : R.string.sk_confirm_unpin_post_title,
pinned ? R.string.sk_confirm_pin_post : R.string.sk_confirm_unpin_post, pinned ? R.string.sk_confirm_pin_post : R.string.sk_confirm_unpin_post,
pinned ? R.string.sk_pin_post : R.string.sk_unpin_post, pinned ? R.string.sk_pin_post : R.string.sk_unpin_post,
pinned ? R.drawable.ic_fluent_pin_off_28_regular : R.drawable.ic_fluent_pin_28_regular, pinned ? R.drawable.ic_fluent_pin_28_regular : R.drawable.ic_fluent_pin_off_28_regular,
()->{ ()->{
new SetStatusPinned(status.id, pinned) new SetStatusPinned(status.id, pinned)
.setCallback(new Callback<>() { .setCallback(new Callback<>() {
@@ -984,11 +984,19 @@ public class UiUtils{
} }
public static boolean pickAccountForCompose(Activity activity, String accountID, String prefilledText){ public static boolean pickAccountForCompose(Activity activity, String accountID, String prefilledText){
Bundle args = new Bundle();
if (prefilledText != null) args.putString("prefilledText", prefilledText);
return pickAccountForCompose(activity, accountID, args);
}
public static boolean pickAccountForCompose(Activity activity, String accountID){
return pickAccountForCompose(activity, accountID, (String) null);
}
public static boolean pickAccountForCompose(Activity activity, String accountID, Bundle args){
if (AccountSessionManager.getInstance().getLoggedInAccounts().size() > 1) { if (AccountSessionManager.getInstance().getLoggedInAccounts().size() > 1) {
UiUtils.pickAccount(activity, accountID, 0, 0, session -> { UiUtils.pickAccount(activity, accountID, 0, 0, session -> {
Bundle args=new Bundle();
args.putString("account", session.getID()); args.putString("account", session.getID());
if (prefilledText != null) args.putString("prefilledText", prefilledText);
Nav.go(activity, ComposeFragment.class, args); Nav.go(activity, ComposeFragment.class, args);
}, null); }, null);
return true; return true;

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_megaphone_24_regular" 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

@@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp" android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
<path android:pathData="M7.032 13.907l-3.471-3.905C3.285 9.692 2.81 9.664 2.5 9.939 2.193 10.215 2.165 10.69 2.44 11l4 4.5c0.287 0.322 0.786 0.336 1.091 0.031l10.5-10.5c0.293-0.293 0.293-0.767 0-1.06-0.293-0.293-0.767-0.293-1.06 0l-9.938 9.937z" android:fillColor="@color/fluent_default_icon_tint"/>
</vector>

View File

@@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp" android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
<path android:pathData="M13 10c0 1.657-1.343 3-3 3s-3-1.343-3-3 1.343-3 3-3 3 1.343 3 3z" android:fillColor="@color/fluent_default_icon_tint"/>
</vector>

View File

@@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp" android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
<path android:pathData="M10 2c4.418 0 8 3.582 8 8s-3.582 8-8 8-8-3.582-8-8 3.582-8 8-8zM9.5 5C9.224 5 9 5.224 9 5.5v5l0.008 0.09C9.05 10.823 9.255 11 9.5 11h3l0.09-0.008C12.823 10.95 13 10.745 13 10.5c0-0.276-0.224-0.5-0.5-0.5H10V5.5L9.992 5.41C9.95 5.177 9.745 5 9.5 5z" android:fillColor="@color/fluent_default_icon_tint"/>
</vector>

View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--~ Copyright (c) 2022. ~ Microsoft Corporation. All rights reserved.-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_fluent_clock_24_filled" android:state_activated="true"/>
<item android:drawable="@drawable/ic_fluent_clock_24_filled" android:state_checked="true"/>
<item android:drawable="@drawable/ic_fluent_clock_24_filled" android:state_selected="true"/>
<item android:drawable="@drawable/ic_fluent_clock_24_regular"/>
</selector>

View File

@@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp" android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
<path android:pathData="M15.613 8.32l-3.936-3.936-8.038 8.039-0.117 0.128c-0.185 0.22-0.322 0.48-0.398 0.76l-1.106 4.055-0.015 0.08c-0.038 0.34 0.282 0.628 0.63 0.534l4.054-1.106 0.165-0.053c0.271-0.1 0.518-0.257 0.723-0.462l8.038-8.039zm1.568-5.503c-1.087-1.087-2.849-1.087-3.936 0l-0.861 0.86 3.936 3.936 0.86-0.86 0.131-0.14c0.955-1.093 0.911-2.754-0.13-3.796zM11.648 3H2.5C2.224 3 2 3.224 2 3.5S2.224 4 2.5 4h8.148l1-1zm-3 3H2.5C2.224 6 2 6.223 2 6.5 2 6.776 2.224 7 2.5 7h5.148l1-1zm-3 3l-1 1H2.5C2.224 10 2 9.776 2 9.5 2 9.223 2.224 9 2.5 9h3.148z" android:fillColor="@color/fluent_default_icon_tint"/>
</vector>

View File

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

View File

@@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:pathData="M20 9.502V8.75c0-1.243-1.007-2.25-2.25-2.25h-5.725l-2.38-1.98C9.24 4.184 8.73 4 8.204 4H4.25C3.008 4 2 5.007 2 6.25l-0.004 11.5c0 1.242 1.007 2.25 2.25 2.25H18.47c0.803 0 1.503-0.546 1.698-1.325l1.75-6.998c0.276-1.105-0.56-2.175-1.698-2.175H20zM4.25 5.5h3.956c0.175 0 0.344 0.061 0.48 0.173l2.588 2.154C11.41 7.939 11.58 8 11.755 8h5.996c0.415 0 0.75 0.336 0.75 0.75v0.752H6.424c-1.032 0-1.932 0.703-2.183 1.704l-0.744 2.978L3.5 6.25c0-0.414 0.336-0.75 0.75-0.75zm1.447 6.07c0.083-0.334 0.383-0.568 0.727-0.568H20.22c0.162 0 0.282 0.153 0.242 0.31l-1.75 6.999c-0.027 0.111-0.128 0.189-0.242 0.189H4.285c-0.163 0-0.282-0.153-0.243-0.31l1.655-6.62z" android:fillColor="@color/fluent_default_icon_tint"/>
</vector>

View File

@@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:pathData="M21.907 5.622C21.969 5.83 22 6.046 22 6.263V17.74c0 1.242-1.007 2.25-2.25 2.25-0.217 0-0.433-0.032-0.641-0.094l-5.514-1.64C12.938 19.602 11.558 20.5 10 20.5c-2.142 0-3.891-1.683-3.995-3.8L6 16.5 5.999 16l-2.39-0.711C2.655 15.004 2 14.127 2 13.131V10.87c0-0.995 0.655-1.873 1.61-2.156l15.5-4.606c1.19-0.355 2.443 0.324 2.797 1.515zM7.499 16.445L7.5 16.499C7.5 17.88 8.62 19 10 19c0.885 0 1.678-0.464 2.124-1.179l-4.625-1.375zm12.037-10.9l-15.5 4.605C3.718 10.245 3.5 10.537 3.5 10.87v2.261c0 0.332 0.218 0.625 0.536 0.72l15.5 4.607c0.07 0.02 0.142 0.03 0.214 0.03 0.414 0 0.75-0.335 0.75-0.75V6.264c0-0.072-0.01-0.144-0.031-0.213-0.118-0.397-0.536-0.624-0.933-0.506z" android:fillColor="@color/fluent_default_icon_tint"/>
</vector>

View File

@@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp" android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
<path android:pathData="M10 6.5c-0.966 0-1.75-0.784-1.75-1.75S9.034 3 10 3s1.75 0.784 1.75 1.75S10.966 6.5 10 6.5zM10 17c-0.966 0-1.75-0.784-1.75-1.75S9.034 13.5 10 13.5s1.75 0.784 1.75 1.75S10.966 17 10 17zm-1.75-7c0 0.966 0.784 1.75 1.75 1.75s1.75-0.784 1.75-1.75S10.966 8.25 10 8.25 8.25 9.034 8.25 10z" android:fillColor="@color/fluent_default_icon_tint"/>
</vector>

View File

@@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:pathData="M13.209 3.102c-0.495-1.003-1.926-1.003-2.421 0L8.43 7.88 3.157 8.646c-1.107 0.16-1.55 1.522-0.748 2.303l3.815 3.719-0.9 5.25c-0.19 1.104 0.968 1.945 1.958 1.424l4.716-2.48 4.716 2.48c0.99 0.52 2.148-0.32 1.96-1.423l-0.902-5.251 3.816-3.72c0.8-0.78 0.359-2.141-0.748-2.302L15.567 7.88l-2.358-4.778zM9.74 8.614l2.258-4.576 2.259 4.576c0.196 0.399 0.577 0.675 1.016 0.739l5.05 0.734-3.654 3.562c-0.318 0.31-0.463 0.757-0.388 1.195l0.862 5.029-4.516-2.375c-0.394-0.207-0.864-0.207-1.257 0l-4.516 2.375 0.862-5.03c0.075-0.438-0.07-0.884-0.388-1.194l-3.654-3.562 5.05-0.734c0.44-0.064 0.82-0.34 1.016-0.739zM1.164 3.781C0.906 4.104 0.958 4.576 1.282 4.835l2.5 2c0.323 0.259 0.795 0.207 1.054-0.117 0.258-0.323 0.206-0.795-0.117-1.054l-2.5-2C1.895 3.405 1.423 3.458 1.164 3.78zm21.672 14.437c0.259-0.323 0.206-0.795-0.117-1.054l-2.5-2c-0.324-0.259-0.796-0.206-1.055 0.117-0.258 0.323-0.206 0.795 0.117 1.054l2.5 2c0.324 0.259 0.796 0.206 1.055-0.117zM1.282 17.164c-0.324 0.259-0.376 0.73-0.118 1.054 0.26 0.323 0.731 0.376 1.055 0.117l2.5-2c0.323-0.259 0.375-0.73 0.117-1.054-0.26-0.323-0.731-0.376-1.055-0.117l-2.5 2zM22.835 3.78c0.259 0.323 0.206 0.795-0.117 1.054l-2.5 2c-0.324 0.259-0.796 0.207-1.055-0.117-0.258-0.323-0.206-0.795 0.117-1.054l2.5-2c0.324-0.259 0.796-0.206 1.055 0.117z" android:fillColor="@color/fluent_default_icon_tint"/>
</vector>

View File

@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:clipToPadding="false"
android:paddingHorizontal="16dp"
android:paddingTop="4dp"
android:paddingBottom="8dp">
<ProgressBar
android:id="@+id/send_progress"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginEnd="16dp"
android:layout_gravity="center_vertical"
android:visibility="gone" />
<ImageView
android:id="@+id/send_error"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_gravity="center_vertical"
android:src="@drawable/ic_fluent_error_circle_24_regular"
android:tint="@color/error_600"
android:scaleType="center"
android:visibility="gone" />
<Button
android:id="@+id/language_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingHorizontal="8dp"
android:drawableStart="@drawable/ic_fluent_local_language_16_regular"
android:drawablePadding="8dp"
android:drawableTint="?android:textColorSecondary"
android:textColor="?android:textColorSecondary"
android:background="@drawable/bg_text_button" />
<Button
android:id="@+id/drafts_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:paddingHorizontal="8dp"
android:drawableStart="@drawable/ic_fluent_clock_20_regular"
android:drawableTint="?android:textColorSecondary"
android:textColor="?android:textColorSecondary"
android:background="@drawable/bg_text_button"
android:contentDescription="@string/sk_schedule_or_draft"
android:tooltipText="@string/sk_schedule_or_draft" />
<Button
android:id="@+id/publish_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:ellipsize="end" />
</LinearLayout>

View File

@@ -105,7 +105,7 @@
android:layout_below="@id/retry_or_cancel_upload" android:layout_below="@id/retry_or_cancel_upload"
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
android:textColor="?colorGray200" android:textColor="?colorGray200"
android:textSize="14dp" android:textSize="14sp"
android:gravity="center_horizontal" android:gravity="center_horizontal"
android:singleLine="true" android:singleLine="true"
android:ellipsize="end" android:ellipsize="end"

View File

@@ -18,7 +18,7 @@
android:background="?android:selectableItemBackgroundBorderless" android:background="?android:selectableItemBackgroundBorderless"
android:contentDescription="@string/more_options" android:contentDescription="@string/more_options"
android:scaleType="center" android:scaleType="center"
android:src="@drawable/ic_post_more" android:src="@drawable/ic_fluent_more_vertical_20_filled"
android:tint="?android:textColorSecondary" /> android:tint="?android:textColorSecondary" />
<ImageView <ImageView
@@ -47,10 +47,21 @@
android:src="@drawable/ic_visibility" android:src="@drawable/ic_visibility"
android:tint="?android:textColorSecondary" /> android:tint="?android:textColorSecondary" />
<ImageView
android:id="@+id/unread_indicator"
android:layout_width="36dp"
android:layout_height="36dp"
android:layout_marginTop="-6dp"
android:layout_toStartOf="@id/visibility"
android:visibility="gone"
android:tint="?android:colorAccent"
android:scaleType="center"
android:src="@drawable/ic_fluent_circle_small_20_filled" />
<ImageView <ImageView
android:id="@+id/avatar" android:id="@+id/avatar"
android:layout_width="46dp" android:layout_width="46sp"
android:layout_height="46dp" android:layout_height="46sp"
android:layout_alignParentStart="true" android:layout_alignParentStart="true"
android:layout_alignParentTop="true" android:layout_alignParentTop="true"
android:layout_marginEnd="12dp" /> android:layout_marginEnd="12dp" />
@@ -58,15 +69,17 @@
<org.joinmastodon.android.ui.views.HeaderSubtitleLinearLayout <org.joinmastodon.android.ui.views.HeaderSubtitleLinearLayout
android:id="@+id/name_wrap" android:id="@+id/name_wrap"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="24dp" android:layout_height="wrap_content"
android:layout_marginEnd="12dp" android:layout_marginEnd="12dp"
android:layout_toStartOf="@id/visibility" android:layout_marginTop="2sp"
android:layout_toEndOf="@id/avatar"> android:layout_toStartOf="@id/unread_indicator"
android:layout_toEndOf="@id/avatar"
android:minHeight="24sp">
<TextView <TextView
android:id="@+id/name" android:id="@+id/name"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="24dp" android:layout_height="wrap_content"
android:ellipsize="end" android:ellipsize="end"
android:singleLine="true" android:singleLine="true"
android:textAlignment="viewStart" android:textAlignment="viewStart"
@@ -76,7 +89,7 @@
<TextView <TextView
android:id="@+id/extra_text" android:id="@+id/extra_text"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="24dp" android:layout_height="wrap_content"
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
android:ellipsize="end" android:ellipsize="end"
android:fontFamily="sans-serif" android:fontFamily="sans-serif"
@@ -89,18 +102,19 @@
<org.joinmastodon.android.ui.views.HeaderSubtitleLinearLayout <org.joinmastodon.android.ui.views.HeaderSubtitleLinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="20dp" android:layout_height="wrap_content"
android:layout_below="@id/name_wrap" android:layout_below="@id/name_wrap"
android:layout_marginEnd="8dp" android:layout_marginEnd="8dp"
android:layout_toStartOf="@id/visibility" android:layout_toStartOf="@id/unread_indicator"
android:layout_toEndOf="@id/avatar" android:layout_toEndOf="@id/avatar"
android:layoutDirection="locale" android:layoutDirection="locale"
android:minHeight="20sp"
android:orientation="horizontal"> android:orientation="horizontal">
<TextView <TextView
android:id="@+id/username" android:id="@+id/username"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="20dp" android:layout_height="wrap_content"
android:ellipsize="end" android:ellipsize="end"
android:singleLine="true" android:singleLine="true"
android:textAppearance="@style/m3_title_small" android:textAppearance="@style/m3_title_small"
@@ -109,9 +123,9 @@
<TextView <TextView
android:id="@+id/separator" android:id="@+id/separator"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="20dp" android:layout_height="wrap_content"
android:layout_marginLeft="4dp" android:layout_marginLeft="4sp"
android:layout_marginRight="4dp" android:layout_marginRight="4sp"
android:importantForAccessibility="no" android:importantForAccessibility="no"
android:text="·" android:text="·"
android:textAppearance="@style/m3_title_small" /> android:textAppearance="@style/m3_title_small" />
@@ -119,7 +133,7 @@
<TextView <TextView
android:id="@+id/timestamp" android:id="@+id/timestamp"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="20dp" android:layout_height="wrap_content"
android:singleLine="true" android:singleLine="true"
android:textAppearance="@style/m3_title_small" android:textAppearance="@style/m3_title_small"
tools:text="3h" /> tools:text="3h" />

View File

@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/display_item_text"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingTop="10dp" android:paddingTop="10dp"
@@ -56,7 +57,8 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:gravity="center_vertical"> android:gravity="center_vertical"
android:visibility="gone">
<FrameLayout <FrameLayout
android:id="@+id/action_btn_wrap" android:id="@+id/action_btn_wrap"
@@ -72,7 +74,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingHorizontal="8dp" android:paddingHorizontal="8dp"
tools:text="@string/translate_post"/> tools:text="@string/sk_translate_post"/>
<ProgressBar <ProgressBar
android:id="@+id/translate_progress" android:id="@+id/translate_progress"
android:layout_width="wrap_content" android:layout_width="wrap_content"

View File

@@ -6,6 +6,7 @@
android:layout_height="match_parent"> android:layout_height="match_parent">
<ScrollView <ScrollView
android:id="@+id/scroll_view"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_weight="1" android:layout_weight="1"
@@ -16,142 +17,206 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"> android:orientation="vertical">
<EditText
android:id="@+id/content_warning"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:elevation="0dp"
android:hint="@string/content_warning"
android:inputType="textMultiLine|textCapSentences"
android:visibility="gone"
android:textColorHint="?android:textColorSecondary"
android:background="@drawable/bg_cw_edit"
android:padding="16dp"
android:minHeight="56dp"
android:textSize="16sp"
tools:visibility="visible"/>
<TextView
android:id="@+id/reply_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="-12dp"
android:paddingHorizontal="16dp"
android:paddingTop="16dp"
android:paddingBottom="6dp"
android:textAppearance="@style/m3_title_small"
android:drawableStart="@drawable/ic_fluent_arrow_reply_20_filled"
tools:drawableEnd="@drawable/ic_fluent_earth_20_regular"
android:drawableTint="?android:textColorSecondary"
android:drawablePadding="6dp"
android:singleLine="true"
android:ellipsize="end"
android:background="?android:selectableItemBackground"/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="16dp"
android:paddingRight="16dp"
android:paddingLeft="16dp">
<ImageView
android:id="@+id/avatar"
android:layout_width="46dp"
android:layout_height="46dp"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginEnd="12dp" />
<TextView
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="24dp"
android:layout_toEndOf="@id/avatar"
android:ellipsize="end"
android:singleLine="true"
android:textAppearance="@style/m3_title_medium"
tools:text="Eugen" />
<TextView
android:id="@+id/username"
android:layout_width="match_parent"
android:layout_height="20dp"
android:layout_below="@id/name"
android:layout_toEndOf="@id/avatar"
android:ellipsize="end"
android:singleLine="true"
android:textAppearance="@style/m3_title_small"
tools:text="\@Gargron" />
</RelativeLayout>
<FrameLayout
android:id="@+id/toot_text_wrap"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp">
<org.joinmastodon.android.ui.views.ComposeEditText
android:id="@+id/toot_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingBottom="16dp"
android:textAppearance="@style/m3_body_large"
android:textSize="16sp"
android:gravity="top"
android:background="@null"
android:hint="@string/compose_hint"
android:elevation="0dp"
android:inputType="textMultiLine|textCapSentences"/>
</FrameLayout>
<LinearLayout <LinearLayout
android:id="@+id/poll_wrap" android:id="@+id/original_post"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" android:orientation="vertical"
android:visibility="gone" android:visibility="gone"
tools:visibility="visible"> android:background="?android:selectableItemBackground">
<org.joinmastodon.android.ui.views.ReorderableLinearLayout <include layout="@layout/display_item_header" />
android:id="@+id/poll_options" <include layout="@layout/display_item_text" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="?attr/colorPollVoted"/>
</LinearLayout>
<LinearLayout
android:id="@+id/reply_wrap"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/content_warning"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"/> android:elevation="0dp"
<LinearLayout android:hint="@string/content_warning"
android:id="@+id/add_poll_option" android:inputType="textMultiLine|textCapSentences"
android:layout_width="match_parent" android:visibility="gone"
android:layout_height="56dp" android:textColorHint="?android:textColorSecondary"
android:layout_marginStart="16dp" android:background="@drawable/bg_cw_edit"
android:layout_marginEnd="56dp" android:padding="16dp"
android:layout_marginBottom="8dp" android:minHeight="56dp"
android:background="@drawable/bg_poll_option_clickable" android:textSize="16sp"
android:outlineProvider="background" tools:visibility="visible"/>
android:elevation="2dp">
<ImageView
android:id="@+id/add_poll_option_icon"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_margin="16dp"
android:tint="?colorDarkIcon"
android:src="@drawable/ic_fluent_add_circle_24_regular"/>
</LinearLayout>
<TextView <TextView
android:id="@+id/poll_duration" android:id="@+id/reply_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="-12dp"
android:layout_marginStart="16dp"
android:paddingTop="16dp"
android:paddingBottom="6dp"
android:textAppearance="@style/m3_title_small"
android:drawableStart="@drawable/ic_fluent_arrow_reply_20_filled"
tools:drawableEnd="@drawable/ic_fluent_earth_20_regular"
android:drawableTint="?android:textColorSecondary"
android:drawablePadding="6dp"
android:singleLine="true"
android:ellipsize="end"/>
<RelativeLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="16dp" android:paddingTop="16dp"
android:layout_marginRight="16dp" android:paddingRight="16dp"
android:layout_marginBottom="8dp" android:paddingLeft="16dp">
android:textAppearance="@style/m3_label_large"
android:textColor="?android:textColorPrimary" <ImageView
tools:text="Duration: 7 days"/> android:id="@+id/self_avatar"
android:layout_width="46sp"
android:layout_height="46sp"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginEnd="12dp" />
<TextView
android:id="@+id/self_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toEndOf="@id/self_avatar"
android:minHeight="24sp"
android:ellipsize="end"
android:singleLine="true"
android:textAppearance="@style/m3_title_medium"
tools:text="Eugen" />
<TextView
android:id="@+id/self_username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/self_name"
android:layout_toEndOf="@id/self_avatar"
android:minHeight="20sp"
android:ellipsize="end"
android:singleLine="true"
android:textAppearance="@style/m3_title_small"
tools:text="\@Gargron" />
</RelativeLayout>
<FrameLayout
android:id="@+id/toot_text_wrap"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp">
<org.joinmastodon.android.ui.views.ComposeEditText
android:id="@+id/toot_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingBottom="16dp"
android:textAppearance="@style/m3_body_large"
android:textSize="16sp"
android:gravity="top"
android:background="@null"
android:hint="@string/compose_hint"
android:elevation="0dp"
android:inputType="textMultiLine|textCapSentences"/>
</FrameLayout>
<LinearLayout <LinearLayout
android:id="@+id/poll_allow_multiple" android:id="@+id/poll_wrap"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:visibility="gone"
tools:visibility="visible">
<org.joinmastodon.android.ui.views.ReorderableLinearLayout
android:id="@+id/poll_options"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"/>
<LinearLayout
android:id="@+id/add_poll_option"
android:layout_width="match_parent"
android:layout_height="56dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="56dp"
android:layout_marginBottom="8dp"
android:background="@drawable/bg_poll_option_clickable"
android:outlineProvider="background"
android:elevation="2dp">
<ImageView
android:id="@+id/add_poll_option_icon"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_margin="16dp"
android:tint="?colorDarkIcon"
android:src="@drawable/ic_fluent_add_circle_24_regular"/>
</LinearLayout>
<TextView
android:id="@+id/poll_duration"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginBottom="8dp"
android:textAppearance="@style/m3_label_large"
android:textColor="?android:textColorPrimary"
tools:text="Duration: 7 days"/>
<LinearLayout
android:id="@+id/poll_allow_multiple"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:layout_marginTop="8dp"
android:gravity="center_vertical"
android:layoutDirection="locale"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="12dp"
android:paddingBottom="12dp"
android:background="?android:selectableItemBackground">
<CheckBox
android:id="@+id/poll_allow_multiple_checkbox"
android:clickable="false"
android:layout_width="wrap_content"
android:layout_height="24dp"
android:layout_marginEnd="24dp"
android:duplicateParentState="true"
android:importantForAccessibility="no"/>
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="16sp"
android:singleLine="true"
android:text="@string/sk_poll_allow_multiple" />
</LinearLayout>
</LinearLayout>
<org.joinmastodon.android.ui.views.ComposeMediaLayout
android:id="@+id/attachments"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:visibility="gone"/>
<LinearLayout
android:id="@+id/sensitive_item"
android:orientation="horizontal" android:orientation="horizontal"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@@ -163,15 +228,16 @@
android:paddingRight="16dp" android:paddingRight="16dp"
android:paddingTop="12dp" android:paddingTop="12dp"
android:paddingBottom="12dp" android:paddingBottom="12dp"
android:background="?android:selectableItemBackground"> android:background="?android:selectableItemBackground"
android:visibility="gone">
<CheckBox <ImageView
android:id="@+id/poll_allow_multiple_checkbox" android:id="@+id/sensitive_icon"
android:clickable="false" android:layout_width="24dp"
android:layout_width="wrap_content"
android:layout_height="24dp" android:layout_height="24dp"
android:layout_marginEnd="24dp" android:layout_marginEnd="32dp"
android:duplicateParentState="true" android:src="@drawable/ic_fluent_flag_24_selector"
android:tint="?android:textColorPrimary"
android:importantForAccessibility="no"/> android:importantForAccessibility="no"/>
<TextView <TextView
@@ -180,50 +246,9 @@
android:layout_weight="1" android:layout_weight="1"
android:textSize="16sp" android:textSize="16sp"
android:singleLine="true" android:singleLine="true"
android:text="@string/sk_poll_allow_multiple" /> android:text="@string/sk_mark_media_as_sensitive" />
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
<org.joinmastodon.android.ui.views.ComposeMediaLayout
android:id="@+id/attachments"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:visibility="gone"/>
<LinearLayout
android:id="@+id/sensitive_item"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:layout_marginTop="8dp"
android:gravity="center_vertical"
android:layoutDirection="locale"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="12dp"
android:paddingBottom="12dp"
android:background="?android:selectableItemBackground"
android:visibility="gone">
<ImageView
android:id="@+id/sensitive_icon"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginEnd="32dp"
android:src="@drawable/ic_fluent_flag_24_selector"
android:tint="?android:textColorPrimary"
android:importantForAccessibility="no"/>
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="16sp"
android:singleLine="true"
android:text="@string/sk_mark_media_as_sensitive" />
</LinearLayout>
</LinearLayout> </LinearLayout>
</ScrollView> </ScrollView>
@@ -235,7 +260,7 @@
android:elevation="2dp" android:elevation="2dp"
android:outlineProvider="bounds" android:outlineProvider="bounds"
android:paddingLeft="16dp" android:paddingLeft="16dp"
android:paddingRight="16dp" android:paddingRight="12dp"
android:layoutDirection="locale"> android:layoutDirection="locale">
<LinearLayout <LinearLayout
android:id="@+id/schedule_draft_view" android:id="@+id/schedule_draft_view"
@@ -247,10 +272,18 @@
<TextView <TextView
android:id="@+id/schedule_draft_text" android:id="@+id/schedule_draft_text"
android:layout_width="0dp" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:drawableStart="@drawable/ic_fluent_drafts_20_regular"
android:drawableTint="?android:textColorSecondary"
android:drawablePadding="16dp"
android:text="@string/sk_compose_draft" /> android:text="@string/sk_compose_draft" />
<Space
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<Button <Button
android:id="@+id/scheduled_time_btn" android:id="@+id/scheduled_time_btn"
android:layout_width="wrap_content" android:layout_width="wrap_content"
@@ -259,7 +292,7 @@
android:gravity="center" android:gravity="center"
android:padding="8dp" android:padding="8dp"
android:textSize="14sp" android:textSize="14sp"
android:minHeight="48dp" android:minHeight="40dp"
android:textColor="?android:textColorSecondary" android:textColor="?android:textColorSecondary"
android:background="@drawable/bg_text_button" android:background="@drawable/bg_text_button"
android:fontFamily="sans-serif" android:fontFamily="sans-serif"
@@ -272,9 +305,9 @@
android:layout_width="24dp" android:layout_width="24dp"
android:layout_height="24dp" android:layout_height="24dp"
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
android:layout_marginEnd="-4dp"
android:src="@drawable/ic_fluent_dismiss_20_filled" android:src="@drawable/ic_fluent_dismiss_20_filled"
android:background="?android:selectableItemBackgroundBorderless" android:background="?android:selectableItemBackgroundBorderless"
android:contentDescription="@string/sk_compose_no_schedule"
android:padding="4dp"/> android:padding="4dp"/>
</LinearLayout> </LinearLayout>
@@ -349,19 +382,6 @@
android:tooltipText="@string/post_visibility" android:tooltipText="@string/post_visibility"
android:src="@drawable/ic_fluent_earth_24_regular"/> android:src="@drawable/ic_fluent_earth_24_regular"/>
<ImageButton
android:id="@+id/btn_schedule"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginEnd="24dp"
android:background="?android:attr/selectableItemBackgroundBorderless"
android:padding="0px"
android:tint="@color/compose_button"
android:tintMode="src_in"
android:contentDescription="@string/sk_draft_or_schedule"
android:tooltipText="@string/sk_draft_or_schedule"
android:src="@drawable/ic_fluent_clock_24_selector"/>
<Space <Space
android:layout_width="0px" android:layout_width="0px"
android:layout_height="1px" android:layout_height="1px"
@@ -374,7 +394,6 @@
android:textAppearance="@style/m3_body_large" android:textAppearance="@style/m3_body_large"
android:textColor="?android:textColorSecondary" android:textColor="?android:textColorSecondary"
tools:text="500"/> tools:text="500"/>
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>

View File

@@ -36,7 +36,7 @@
android:hint="@string/search_hint" android:hint="@string/search_hint"
android:textColorHint="?colorSearchHint" android:textColorHint="?colorSearchHint"
android:textColor="?android:textColorPrimary" android:textColor="?android:textColorPrimary"
android:textSize="16dp" android:textSize="16sp"
android:singleLine="true" android:singleLine="true"
android:inputType="textFilter" android:inputType="textFilter"
android:imeOptions="actionSearch" android:imeOptions="actionSearch"

View File

@@ -45,7 +45,7 @@
android:textColor="?colorGray50t" android:textColor="?colorGray50t"
android:textAllCaps="true" android:textAllCaps="true"
android:fontFamily="sans-serif-medium" android:fontFamily="sans-serif-medium"
android:textSize="14dp" android:textSize="14sp"
android:gravity="center" android:gravity="center"
android:background="@drawable/bg_profile_follows_you" android:background="@drawable/bg_profile_follows_you"
android:visibility="gone" android:visibility="gone"

View File

@@ -14,8 +14,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp" android:layout_marginHorizontal="16dp"
android:layout_marginVertical="12dp" android:layout_marginVertical="12dp"
android:text="@string/sk_welcome_title" android:text="@string/sk_welcome_title" />
/>
<TextView <TextView
style="@style/m3_body_large" style="@style/m3_body_large"

View File

@@ -19,7 +19,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
android:layout_marginStart="24dp" android:layout_marginStart="24dp"
android:textSize="16dp" android:textSize="16sp"
android:textColor="?android:textColorPrimary" android:textColor="?android:textColorPrimary"
android:singleLine="true" android:singleLine="true"
android:ellipsize="end"/> android:ellipsize="end"/>

View File

@@ -6,7 +6,7 @@
android:singleLine="true" android:singleLine="true"
android:ellipsize="end" android:ellipsize="end"
android:fontFamily="sans-serif-medium" android:fontFamily="sans-serif-medium"
android:textSize="12dp" android:textSize="12sp"
android:textColor="?android:textColorSecondary" android:textColor="?android:textColorSecondary"
android:textAllCaps="true" android:textAllCaps="true"
android:paddingTop="24dp" android:paddingTop="24dp"

View File

@@ -22,7 +22,7 @@
android:textAllCaps="true" android:textAllCaps="true"
android:textColor="?android:textColorPrimary" android:textColor="?android:textColorPrimary"
android:fontFamily="sans-serif-medium" android:fontFamily="sans-serif-medium"
android:textSize="14dp" android:textSize="14sp"
android:gravity="center_vertical" android:gravity="center_vertical"
android:singleLine="true" android:singleLine="true"
android:ellipsize="end" android:ellipsize="end"

View File

@@ -12,13 +12,13 @@
<TextView <TextView
android:id="@+id/number" android:id="@+id/number"
android:layout_width="24dp" android:layout_width="24sp"
android:layout_height="24dp" android:layout_height="wrap_content"
android:layout_marginEnd="16dp" android:layout_marginEnd="16dp"
android:textColor="?android:colorAccent" android:textColor="?android:colorAccent"
android:fontFamily="sans-serif-condensed" android:fontFamily="sans-serif-condensed"
android:textStyle="bold" android:textStyle="bold"
android:textSize="22dp" android:textSize="22sp"
android:gravity="center" android:gravity="center"
android:includeFontPadding="false" android:includeFontPadding="false"
tools:text="1"/> tools:text="1"/>

View File

@@ -14,7 +14,7 @@
android:layout_marginEnd="8dp" android:layout_marginEnd="8dp"
android:gravity="center_vertical" android:gravity="center_vertical"
android:textColor="?android:textColorPrimary" android:textColor="?android:textColorPrimary"
android:textSize="20dp" android:textSize="20sp"
android:fontFamily="sans-serif-medium" android:fontFamily="sans-serif-medium"
android:singleLine="true" android:singleLine="true"
android:ellipsize="end" android:ellipsize="end"
@@ -26,7 +26,7 @@
android:layout_height="32dp" android:layout_height="32dp"
android:background="@drawable/bg_inline_button" android:background="@drawable/bg_inline_button"
android:textColor="?android:textColorPrimary" android:textColor="?android:textColorPrimary"
android:textSize="20dp" android:textSize="20sp"
android:fontFamily="sans-serif-medium" android:fontFamily="sans-serif-medium"
android:paddingLeft="4dp" android:paddingLeft="4dp"
android:paddingRight="4dp" android:paddingRight="4dp"

View File

@@ -37,7 +37,7 @@
android:background="?android:selectableItemBackground" android:background="?android:selectableItemBackground"
android:textColor="?android:textColorPrimary" android:textColor="?android:textColorPrimary"
android:textAllCaps="true" android:textAllCaps="true"
android:textSize="14dp" android:textSize="14sp"
android:paddingLeft="16dp" android:paddingLeft="16dp"
android:paddingRight="16dp" android:paddingRight="16dp"
android:stateListAnimator="@null" android:stateListAnimator="@null"

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/schedule" android:title="@string/sk_schedule_post" android:icon="@drawable/ic_fluent_clock_24_regular" />
<item android:id="@+id/unschedule" android:title="@string/sk_schedule_post" android:icon="@drawable/ic_fluent_clock_24_filled" android:contentDescription="@string/sk_compose_no_schedule" />
<item android:id="@+id/draft" android:title="@string/sk_mark_as_draft" android:icon="@drawable/ic_fluent_drafts_24_regular" />
<item android:id="@+id/undraft" android:title="@string/sk_mark_as_draft" android:icon="@drawable/ic_fluent_drafts_24_filled" android:contentDescription="@string/sk_compose_no_draft" />
<item android:id="@+id/drafts" android:title="@string/sk_unsent_posts" android:icon="@drawable/ic_fluent_folder_open_24_regular" />
</menu>

View File

@@ -1,5 +1,10 @@
<?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/announcements"
android:icon="@drawable/ic_fluent_megaphone_24_regular"
android:showAsAction="always"
android:title="@string/sk_announcements" />
<item <item
android:id="@+id/settings" android:id="@+id/settings"
android:icon="@drawable/ic_fluent_settings_24_regular" android:icon="@drawable/ic_fluent_settings_24_regular"

View File

@@ -3,6 +3,6 @@
<item android:id="@+id/followed_hashtags" android:title="@string/sk_hashtags_you_follow" android:icon="@drawable/ic_fluent_number_symbol_24_regular" android:showAsAction="always"/> <item android:id="@+id/followed_hashtags" android:title="@string/sk_hashtags_you_follow" android:icon="@drawable/ic_fluent_number_symbol_24_regular" android:showAsAction="always"/>
<item android:id="@+id/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/favorites" android:title="@string/your_favorites" android:icon="@drawable/ic_fluent_star_24_regular"/> <item android:id="@+id/favorites" android:title="@string/your_favorites" android:icon="@drawable/ic_fluent_star_24_regular"/>
<item android:id="@+id/scheduled" android:title="@string/sk_unsent_posts" android:icon="@drawable/ic_fluent_drafts_24_regular"/> <item android:id="@+id/scheduled" android:title="@string/sk_unsent_posts" android:icon="@drawable/ic_fluent_folder_open_24_regular"/>
<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"/>
</menu> </menu>

View File

@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/schedule" android:title="@string/sk_schedule" android:icon="@drawable/ic_fluent_clock_24_regular" />
<item android:id="@+id/draft" android:title="@string/sk_draft" android:icon="@drawable/ic_fluent_drafts_24_regular" />
</menu>

View File

@@ -58,13 +58,13 @@
<string name="sk_clear_recent_languages">Zuletzt verwendete Sprachen leeren</string> <string name="sk_clear_recent_languages">Zuletzt verwendete Sprachen leeren</string>
<string name="sk_welcome_title">Willkommen!</string> <string name="sk_welcome_title">Willkommen!</string>
<string name="sk_example_domain">beispiel.social</string> <string name="sk_example_domain">beispiel.social</string>
<string name="sk_welcome_text">Der Hai sagt Hi! Um anzufangen, bitte gib den Domain-Namen deiner Heim-Instanz unten ein.</string> <string name="sk_welcome_text">Der Hai sagt Hi! Um anzufangen, gib den Domain-Namen deiner Heimat-Instanz unten ein.</string>
<string name="sk_color_palette_material3">System</string> <string name="sk_color_palette_material3">System</string>
<string name="sk_color_palette_red">Rot</string> <string name="sk_color_palette_red">Rot</string>
<string name="sk_settings_profile">Profil einrichten</string> <string name="sk_settings_profile">Profil einrichten</string>
<string name="sk_settings_posting">Einstellungen für Beiträge</string> <string name="sk_settings_posting">Einstellungen für Beiträge</string>
<string name="sk_settings_filters">Filter konfigurieren</string> <string name="sk_settings_filters">Filter konfigurieren</string>
<string name="sk_settings_auth">Sicherheits-Einstellungen</string> <string name="sk_settings_auth">Sicherheits-Einstellungen</string>
<string name="sk_settings_rules">Regelwerk</string> <string name="sk_settings_rules">Regelwerk</string>
<string name="sk_settings_about">Über die App</string> <string name="sk_settings_about">Über die App</string>
<string name="sk_settings_donate">Spenden</string> <string name="sk_settings_donate">Spenden</string>
@@ -73,11 +73,11 @@
<string name="sk_delete_notification_confirm">Benachrichtigung wirklich löschen\?</string> <string name="sk_delete_notification_confirm">Benachrichtigung wirklich löschen\?</string>
<string name="sk_clear_all_notifications_confirm_action">Alle löschen</string> <string name="sk_clear_all_notifications_confirm_action">Alle löschen</string>
<string name="sk_enable_delete_notifications">Löschen von Benachrichtigungen aktivieren</string> <string name="sk_enable_delete_notifications">Löschen von Benachrichtigungen aktivieren</string>
<string name="sk_settings_publish_button_text">Veröffentlichen-Button-Text</string> <string name="sk_settings_publish_button_text">Veröffentlichen-Button-Text</string>
<string name="sk_settings_translate_only_opened">Übersetzen-Button in der Timeline ausblenden</string> <string name="sk_settings_translate_only_opened">Nur geöffnete Beiträge übersetzen</string>
<string name="sk_delete_notification">Benachrichtigung löschen</string> <string name="sk_delete_notification">Benachrichtigung löschen</string>
<string name="sk_clear_all_notifications">Alle Benachrichtigungen löschen</string> <string name="sk_clear_all_notifications">Alle Benachrichtigungen löschen</string>
<string name="sk_settings_publish_button_text_title">Veröffentlichen-Button-Text anpassen</string> <string name="sk_settings_publish_button_text_title">Veröffentlichen-Button-Text anpassen</string>
<string name="sk_clear_all_notifications_confirm">Wirklich alle Benachrichtigungen löschen\?</string> <string name="sk_clear_all_notifications_confirm">Wirklich alle Benachrichtigungen löschen\?</string>
<string name="sk_settings_translation_availability_note_available">%s unterstützt Übersetzung!</string> <string name="sk_settings_translation_availability_note_available">%s unterstützt Übersetzung!</string>
<string name="sk_settings_translation_availability_note_unavailable">%s scheint keine Übersetzung zu unterstützen.</string> <string name="sk_settings_translation_availability_note_unavailable">%s scheint keine Übersetzung zu unterstützen.</string>
@@ -90,4 +90,34 @@
<string name="sk_open_with_account">Mit anderem Konto öffnen</string> <string name="sk_open_with_account">Mit anderem Konto öffnen</string>
<string name="sk_resource_not_found">Ressource nicht gefunden</string> <string name="sk_resource_not_found">Ressource nicht gefunden</string>
<string name="sk_loading_resource_on_instance_title">Suche auf %s</string> <string name="sk_loading_resource_on_instance_title">Suche auf %s</string>
<string name="sk_bookmark_as">Lesezeichen in anderem Konto</string>
<string name="sk_bookmarked_as">Lesezeichen gesetzt als %s</string>
<string name="sk_already_bookmarked">Bereits in den Lesezeichen</string>
<string name="sk_favorite_as">Favorit von anderem Konto</string>
<string name="sk_favorited_as">Favorisiert als %s</string>
<string name="sk_already_favorited">Bereits favorisiert</string>
<string name="sk_reblog_as">Von einem anderen Konto boosten</string>
<string name="sk_reblogged_as">Geboostet als %s</string>
<string name="sk_already_reblogged">Bereits geboostet</string>
<string name="sk_reply_as">Antworten mit anderem Konto</string>
<string name="sk_settings_uniform_icon_for_notifications">Einheitliches Icon für alle Benachrichtigungen</string>
<string name="sk_forward_report_to">Weiterleiten zu %s</string>
<string name="sk_unsent_posts">Nicht gesendete Beiträge</string>
<string name="sk_draft">Entwurf</string>
<string name="sk_schedule">Planen</string>
<string name="sk_confirm_delete_draft_title">Entwurf löschen</string>
<string name="sk_confirm_delete_draft">Möchtest du diesen entworfenen Beitrag wirklich löschen\?</string>
<string name="sk_confirm_delete_scheduled_post_title">Geplanten Beitrag löschen</string>
<string name="sk_confirm_delete_scheduled_post">Möchtest du diesen geplanten Beitrag wirklich löschen\?</string>
<string name="sk_draft_or_schedule">Entwurf oder Planen</string>
<string name="sk_compose_draft">Beitrag wird als Entwurf gespeichert.</string>
<string name="sk_compose_scheduled">Geplant für</string>
<string name="sk_draft_saved">Entwurf gespeichert</string>
<string name="sk_post_scheduled">Beitrag geplant</string>
<string name="sk_scheduled_too_soon_title">Geplante Zeit ist zu früh</string>
<string name="sk_scheduled_too_soon">Der Beitrag muss mindestens 10 Minuten in der Zukunft eingeplant werden.</string>
<string name="sk_confirm_save_changes">Änderungen speichern\?</string>
<string name="sk_schedule_post">Beitrag planen</string>
<string name="sk_confirm_save_draft">Entwurf speichern\?</string>
<string name="sk_mark_as_draft">Als Entwurf markieren</string>
</resources> </resources>

View File

@@ -90,4 +90,34 @@
<string name="sk_open_with_account">Abrir con otra cuenta</string> <string name="sk_open_with_account">Abrir con otra cuenta</string>
<string name="sk_resource_not_found">El recurso no se pudo encontrar</string> <string name="sk_resource_not_found">El recurso no se pudo encontrar</string>
<string name="sk_loading_resource_on_instance_title">Buscándolo en %s</string> <string name="sk_loading_resource_on_instance_title">Buscándolo en %s</string>
<string name="sk_bookmarked_as">Añadido a favoritos como %s</string>
<string name="sk_already_bookmarked">Ya marcado</string>
<string name="sk_favorited_as">Favorito como %s</string>
<string name="sk_already_favorited">Ya es un favorito</string>
<string name="sk_reblog_as">Compartir desde otra cuenta</string>
<string name="sk_reblogged_as">Compartido como %s</string>
<string name="sk_already_reblogged">Ya se volvió a publicar</string>
<string name="sk_reply_as">Responder con otra cuenta</string>
<string name="sk_bookmark_as">Marcador de otra cuenta</string>
<string name="sk_favorite_as">Favoritos de otra cuenta</string>
<string name="sk_settings_uniform_icon_for_notifications">Mismo icono para todas las notificaciones</string>
<string name="sk_forward_report_to">Reenviar a %s</string>
<string name="sk_unsent_posts">Mensajes no enviados</string>
<string name="sk_draft">Borrador</string>
<string name="sk_schedule">Programar</string>
<string name="sk_confirm_delete_draft_title">Borrar el borrador</string>
<string name="sk_confirm_delete_draft">¿Seguro que quieres borrar este borrador\?</string>
<string name="sk_confirm_delete_scheduled_post_title">Borrar la entrada programada</string>
<string name="sk_confirm_delete_scheduled_post">¿Está seguro de que desea eliminar esta publicación programada\?</string>
<string name="sk_draft_or_schedule">A borrador o programar el envio</string>
<string name="sk_compose_draft">El mensaje se guardará como borrador.</string>
<string name="sk_compose_scheduled">Programado para</string>
<string name="sk_draft_saved">Borrador guardado</string>
<string name="sk_post_scheduled">Publicación programada</string>
<string name="sk_scheduled_too_soon_title">La hora programada es demasiado pronto</string>
<string name="sk_scheduled_too_soon">El mensaje debe programarse con al menos 10 minutos de antelación.</string>
<string name="sk_confirm_save_draft">¿Guardar el borrador\?</string>
<string name="sk_confirm_save_changes">¿Guardar los cambios\?</string>
<string name="sk_mark_as_draft">Marcar como borrador</string>
<string name="sk_schedule_post">Programar la publicación</string>
</resources> </resources>

View File

@@ -1,3 +1,104 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="sk_app_name">Megalodon</string>
<string name="sk_delete_and_redraft">Ezabatu eta editatu</string>
<string name="sk_confirm_delete_and_redraft_title">Argitalpena ezabatu eta editatu</string>
<string name="sk_pin_post">Profilean finkatu</string>
<string name="sk_confirm_pin_post_title">Argitalpena profilean finkatu</string>
<string name="sk_confirm_pin_post">Ziur al zaude argitalpen hau zure profilean finkatu nahi duzula\?</string>
<string name="sk_pinning">Argitalpena finkatzen…</string>
<string name="sk_unpin_post">Finkapena kendu profiletik</string>
<string name="sk_confirm_unpin_post">Ziur al zaude argitalpena profiletik kendu nahi duzula\?</string>
<string name="sk_unpinning">Argitalpen finkatua kentzen…</string>
<string name="sk_image_description">Irudiaren deskribapena</string>
<string name="sk_visibility_unlisted">Zerrendatu gabea</string>
<string name="sk_settings_show_replies">Erakutsi erantzunak</string>
<string name="sk_settings_show_boosts">Erakutsi bultzadak</string>
<string name="sk_settings_show_interaction_counts">Erakutsi interakzio zenbaketak</string>
<string name="sk_settings_app_version">Megalodon v%1$s (%2$d)</string>
<string name="sk_mark_media_as_sensitive">Markatu multimedia sentikor gisa</string>
<string name="sk_user_post_notifications_on">Gaitu %s-en argitalpen jakinarazpenak</string>
<string name="sk_federated_timeline">Federatua</string>
<string name="sk_federated_timeline_info_banner">Hauek dira zure federazioko pertsonen argitalpen berrienak.</string>
<string name="sk_update_available">Megalodon %s deskargatzeko prest dago.</string>
<string name="sk_check_for_update">Eguneraketak egiaztatu</string>
<string name="sk_no_update_available">Ez dago eguneraketarik eskuragarri</string>
<string name="sk_list_timelines">Zerrendak</string>
<string name="sk_follow_requests">Jarraitzeko eskaerak</string>
<string name="sk_poll_allow_multiple">Onartu aukera anitzak</string>
<string name="sk_clear_recent_languages">Ezabatu berriki erabili diren hizkuntzak</string>
<string name="sk_welcome_title">Ongi etorri!</string>
<string name="sk_example_domain">adibidea.eus</string>
<string name="sk_lists_with_user">%s-ekin zerrendatu</string>
<string name="sk_settings_always_reveal_content_warnings">Erakutsi beti edukiaren abisua</string>
<string name="sk_disable_marquee">Desgaitu izenburu-barretako testuaren desplazamendua</string>
<string name="sk_settings_contribute">Lagundu Megalodon</string>
<string name="sk_translated_using">%s-ekin itzulia</string>
<string name="sk_post_language">Hizkuntza: %s</string>
<string name="sk_language_name">%s (%s)</string>
<string name="sk_bookmark_as">Beste kontu bateko laster-marka</string>
<string name="sk_bookmarked_as">%s bezala laster-markara eramana</string>
<string name="sk_already_bookmarked">Dagoeneko laster-marka da</string>
<string name="sk_favorite_as">Beste kontu bateko gogokoa</string>
<string name="sk_favorited_as">%s bezela dago gogokoetan</string>
<string name="sk_reblog_as">Beste kontu batetik bultzatua</string>
<string name="sk_reblogged_as">%s bezela bultzatua</string>
<string name="sk_already_reblogged">Dagoeneko bultzatua izan da</string>
<string name="sk_reply_as">Erantzun beste kontu batekin</string>
<string name="sk_translate_post">Itzuli</string>
<string name="sk_tabs_disable_swipe">Desgaitu fitxen arteko joan-etorria</string>
<string name="sk_settings_profile">Konfiguratu profila</string>
<string name="sk_settings_posting">Argitalpenen ezarpenak</string>
<string name="sk_settings_filters">Filtroak konfiguratu</string>
<string name="sk_settings_auth">Segurtasun ezarpenak</string>
<string name="sk_settings_rules">Arauak</string>
<string name="sk_settings_about">Aplikazioari buruz</string>
<string name="sk_settings_donate">Lagundu</string>
<string name="sk_settings_color_palette">Kolore paleta</string>
<string name="sk_color_palette_material3">Sistema</string>
<string name="sk_color_palette_pink">Arrosa</string>
<string name="sk_color_palette_purple">Morea</string>
<string name="sk_color_palette_green">Berdea</string>
<string name="sk_color_palette_blue">Urdina</string>
<string name="sk_color_palette_brown">Marroia</string>
<string name="sk_color_palette_red">Gorria</string>
<string name="sk_color_palette_yellow">Horia</string>
<string name="sk_delete_notification">Ezabatu jakinarazpena</string>
<string name="sk_delete_notification_confirm_action">Ezabatu jakinarazpena</string>
<string name="sk_delete_notification_confirm">Ziur al zaude jakinarazpen hau ezabatu nahi duzula\?</string>
<string name="sk_enable_delete_notifications">Gaitu jakinarazpenen ezabatzea</string>
<string name="sk_settings_publish_button_text">Argitaratze botoiaren testua</string>
<string name="sk_settings_publish_button_text_title">Pertsonalizatu argitaratze botoiaren testua</string>
<string name="sk_settings_translation_availability_note_available">%s-k itzulpena onartzen du!</string>
<string name="sk_settings_translation_availability_note_unavailable">%s ez da itzulpena onartzen duten hizkuntzen artean ageri.</string>
<string name="sk_clear_all_notifications">Ezabatu jakinarazpen guztiak</string>
<string name="sk_clear_all_notifications_confirm_action">Ezabatu dena</string>
<string name="sk_clear_all_notifications_confirm">Ziur al zaude jakinarazpen guztiak ezabatu nahi dituzula\?</string>
<string name="sk_loading_fediverse_resource_title">Fedibertsoan bilatzen</string>
<string name="sk_undo_reblog">Bultzada desegin</string>
<string name="sk_quote_post">Honen inguruan argitaratu</string>
<string name="sk_reblog_with_visibility">Bultzada ikusgarria</string>
<string name="sk_hashtags_you_follow">Jarraitzen dituzun Hashtag-ak</string>
<string name="sk_copy_link_to_post">Kopiatu link-a argitaratzeko</string>
<string name="sk_loading_resource_on_instance_title">%s-n bilatzen</string>
<string name="sk_open_with_account">Ireki beste kontu batekin</string>
<string name="sk_resource_not_found">Ezin da errekurtsoa bilatu</string>
<string name="sk_pinned_posts">Finkatua</string>
<string name="sk_confirm_delete_and_redraft">Ziur al zaude argitalpena ezabatu eta editatu nahi duzula\?</string>
<string name="sk_confirm_unpin_post_title">Argitalpen finkatua kendu profiletik</string>
<string name="sk_settings_load_new_posts">Kargatu automatikoki argitalpen berriak</string>
<string name="sk_user_post_notifications_off">Desgaitu %s-en argitalpen jakinarazpenak</string>
<string name="sk_update_ready">Megalodon %s deskargatuta eta instalatzeko prest dago.</string>
<string name="sk_accept_follow_request">Onartu jarraitzeko eskaerak</string>
<string name="sk_reject_follow_request">Alboratu jarraitzeko eskaerak</string>
<string name="sk_settings_show_federated_timeline">Erakutsi federatutako denbora-lerroa</string>
<string name="sk_notification_type_status">Argitalpenak</string>
<string name="sk_notify_posts">Argitalpenen jakinarazpenak</string>
<string name="sk_translate_show_original">Erakutsi jatorrizkoa</string>
<string name="sk_available_languages">Eskuragarri dauden hizkuntzak</string>
<string name="sk_confirm_clear_recent_languages">Ziur al zaude berriki erabilitako hizkuntzak ezabatu nahi dituzula\?</string>
<string name="sk_welcome_text">Marrazoak ongi etorria ematen dizu! Hasteko, sartu jjarraian jatorrizko instantziaren domeinu-izena.</string>
<string name="sk_settings_translate_only_opened">Irekitako argitalpenak soilik itzuli</string>
<string name="sk_already_favorited">Dagoeneko gogokoen artean dago</string>
<string name="sk_settings_uniform_icon_for_notifications">Ikono berdina jakinarazpen guztietarako</string>
</resources> </resources>

View File

@@ -91,4 +91,34 @@
<string name="sk_loading_resource_on_instance_title">Rechercher sur %s</string> <string name="sk_loading_resource_on_instance_title">Rechercher sur %s</string>
<string name="sk_open_with_account">Ouvrir avec un autre compte</string> <string name="sk_open_with_account">Ouvrir avec un autre compte</string>
<string name="sk_resource_not_found">La ressource est introuvable</string> <string name="sk_resource_not_found">La ressource est introuvable</string>
<string name="sk_favorite_as">Favoris d\'un autre compte</string>
<string name="sk_already_bookmarked">Déjà mis en signet</string>
<string name="sk_already_favorited">Déjà mis en favori</string>
<string name="sk_reblogged_as">Reposté en tant que %s</string>
<string name="sk_already_reblogged">Déjà reposté</string>
<string name="sk_bookmarked_as">Ajouté aux signets en tant que %s</string>
<string name="sk_favorited_as">Ajouté aux favoris en tant que %s</string>
<string name="sk_reply_as">Répondre avec un autre compte</string>
<string name="sk_bookmark_as">Mettre en signet sur un autre compte</string>
<string name="sk_reblog_as">Reposter depuis un autre compte</string>
<string name="sk_settings_uniform_icon_for_notifications">Icône uniforme pour toutes les notifications</string>
<string name="sk_forward_report_to">Transférer à %s</string>
<string name="sk_unsent_posts">Messages non envoyés</string>
<string name="sk_draft">Brouillon</string>
<string name="sk_confirm_delete_draft_title">Supprimer le brouillon</string>
<string name="sk_confirm_delete_draft">Êtes-vous sûr de vouloir supprimer ce message brouillon \?</string>
<string name="sk_confirm_delete_scheduled_post">Voulez-vous vraiment supprimer ce message planifié \?</string>
<string name="sk_schedule">Planifier</string>
<string name="sk_confirm_delete_scheduled_post_title">Supprimer le message planifié</string>
<string name="sk_draft_or_schedule">Rédiger ou planifier</string>
<string name="sk_compose_draft">Le message sera enregistré en tant que brouillon.</string>
<string name="sk_compose_scheduled">Planifié pour</string>
<string name="sk_draft_saved">Brouillon enregistré</string>
<string name="sk_post_scheduled">Message planifié</string>
<string name="sk_scheduled_too_soon_title">L\'heure prévue est trop proche</string>
<string name="sk_scheduled_too_soon">Le message doit être planifiée au moins 10 minutes à l\'avance.</string>
<string name="sk_confirm_save_draft">Enregistrer le brouillon \?</string>
<string name="sk_mark_as_draft">Marquer comme brouillon</string>
<string name="sk_schedule_post">Planifier le message</string>
<string name="sk_confirm_save_changes">Sauvegarder les modifications \?</string>
</resources> </resources>

View File

@@ -91,4 +91,36 @@
<string name="sk_open_with_account">Buka dengan akun lain</string> <string name="sk_open_with_account">Buka dengan akun lain</string>
<string name="sk_loading_resource_on_instance_title">Mencari di %s</string> <string name="sk_loading_resource_on_instance_title">Mencari di %s</string>
<string name="sk_resource_not_found">Sumber daya tidak dapat ditemukan</string> <string name="sk_resource_not_found">Sumber daya tidak dapat ditemukan</string>
<string name="sk_bookmarked_as">Dimarkahi sebagai %s</string>
<string name="sk_already_bookmarked">Sudah dimarkahi</string>
<string name="sk_favorited_as">Difavorit sebagai %s</string>
<string name="sk_already_favorited">Sudah difavorit</string>
<string name="sk_reblog_as">Bagikan dari akun lain</string>
<string name="sk_reblogged_as">Dibagikan sebagai %s</string>
<string name="sk_already_reblogged">Sudah dibagikan</string>
<string name="sk_reply_as">Balas dengan akun lain</string>
<string name="sk_bookmark_as">Markahi dalam akun lain</string>
<string name="sk_favorite_as">Favorit dari akun lain</string>
<string name="sk_settings_uniform_icon_for_notifications">Ikon yang sama untuk semua notifikasi</string>
<string name="sk_unsent_posts">Kiriman yang belum dikirim</string>
<string name="sk_draft">Draf</string>
<string name="sk_confirm_delete_draft_title">Hapus draf</string>
<string name="sk_confirm_delete_scheduled_post_title">Hapus kiriman yang dijadwalkan</string>
<string name="sk_confirm_delete_scheduled_post">Apakah Anda yakin untuk menghapus kiriman yang dijadwalkan ini\?</string>
<string name="sk_draft_or_schedule">Draf atau jadwalkan</string>
<string name="sk_schedule">Jadwalkan</string>
<string name="sk_compose_draft">Kiriman akan disimpan sebagai draf.</string>
<string name="sk_compose_scheduled">Dijadwalkan untuk</string>
<string name="sk_post_scheduled">Kiriman dijadwalkan</string>
<string name="sk_scheduled_too_soon_title">Waktu jadwal terlalu dekat</string>
<string name="sk_save_draft">Simpan draf\?</string>
<string name="sk_save_changes">Simpan perubahan\?</string>
<string name="sk_forward_report_to">Teruskan ke %s</string>
<string name="sk_confirm_delete_draft">Apakah Anda yakin ingin menghapus draf kiriman ini\?</string>
<string name="sk_draft_saved">Draf disimpan</string>
<string name="sk_scheduled_too_soon">Kiriman setidaknya harus 10 menit di masa depan.</string>
<string name="sk_confirm_save_changes">Simpan perubahan\?</string>
<string name="sk_mark_as_draft">Tandai sebagai draf</string>
<string name="sk_schedule_post">Jadwalkan kiriman</string>
<string name="sk_confirm_save_draft">Simpan draf\?</string>
</resources> </resources>

View File

@@ -81,5 +81,24 @@
<string name="sk_clear_all_notifications_confirm_action">모두 삭제</string> <string name="sk_clear_all_notifications_confirm_action">모두 삭제</string>
<string name="sk_tabs_disable_swipe">스와이프로 탭간 전환 비활성화</string> <string name="sk_tabs_disable_swipe">스와이프로 탭간 전환 비활성화</string>
<string name="sk_clear_all_notifications">모든 알림 삭제</string> <string name="sk_clear_all_notifications">모든 알림 삭제</string>
<string name="sk_loading_fediverse_resource_title">연합우주에서 찾아보는 중</string> <string name="sk_loading_fediverse_resource_title">연합우주에서 찾아보는 중</string>
<string name="sk_bookmark_as">다른 계정으로 보관</string>
<string name="sk_reblog_as">다른 계정으로 리블로그</string>
<string name="sk_already_reblogged">이미 리블로그했습니다</string>
<string name="sk_reply_as">다른 계정으로 답글 달기</string>
<string name="sk_favorite_as">다른 계정으로 좋아요 표시</string>
<string name="sk_favorited_as">%s 계정으로 좋아요 표시했습니다</string>
<string name="sk_already_favorited">이미 좋아요 표시했습니다</string>
<string name="sk_undo_reblog">리블로그 취소</string>
<string name="sk_reblog_with_visibility">리블로그 및 공개 범위 설정</string>
<string name="sk_bookmarked_as">%s 계정으로 보관했습니다</string>
<string name="sk_already_bookmarked">이미 보관했습니다</string>
<string name="sk_reblogged_as">%s 계정으로 리블로그했습니다</string>
<string name="sk_settings_uniform_icon_for_notifications">모든 알림에 같은 아이콘 사용</string>
<string name="sk_hashtags_you_follow">팔로우한 해시태그</string>
<string name="sk_copy_link_to_post">게시물 링크 복사</string>
<string name="sk_open_with_account">다른 계정으로 열기</string>
<string name="sk_resource_not_found">리소스를 찾을 수 없습니다</string>
<string name="sk_loading_resource_on_instance_title">%s에서 찾아보는 중</string>
<string name="sk_quote_post">언급하여 게시</string>
</resources> </resources>

View File

@@ -52,7 +52,7 @@
<string name="sk_post_language">Idioma: %s</string> <string name="sk_post_language">Idioma: %s</string>
<string name="sk_available_languages">Idiomas disponíveis</string> <string name="sk_available_languages">Idiomas disponíveis</string>
<string name="sk_language_name">%s (%s)</string> <string name="sk_language_name">%s (%s)</string>
<string name="sk_confirm_clear_recent_languages">Tem certeza de que deseja limpar os idiomas usados recentemente\?</string> <string name="sk_confirm_clear_recent_languages">Você tem certeza que deseja limpar os idiomas usados recentemente\?</string>
<string name="sk_clear_recent_languages">Limpar idiomas usados recentemente</string> <string name="sk_clear_recent_languages">Limpar idiomas usados recentemente</string>
<string name="sk_notify_posts">Notificações de posts</string> <string name="sk_notify_posts">Notificações de posts</string>
<string name="sk_poll_allow_multiple">Permitir múltiplas escolhas</string> <string name="sk_poll_allow_multiple">Permitir múltiplas escolhas</string>
@@ -61,30 +61,32 @@
<string name="sk_welcome_title">Bem vindo!</string> <string name="sk_welcome_title">Bem vindo!</string>
<string name="sk_color_palette_material3">Sistema</string> <string name="sk_color_palette_material3">Sistema</string>
<string name="sk_color_palette_red">Vermelho</string> <string name="sk_color_palette_red">Vermelho</string>
<string name="sk_settings_donate">Doe</string> <string name="sk_settings_donate">Doar</string>
<string name="sk_settings_rules">Regras</string> <string name="sk_settings_rules">Regras</string>
<string name="sk_tabs_disable_swipe">Desativar deslizamento entre as abas</string> <string name="sk_tabs_disable_swipe">Desativar deslizamento entre as abas</string>
<string name="sk_settings_profile">Criar um perfil</string> <string name="sk_settings_profile">Configurar perfil</string>
<string name="sk_settings_posting">Preferências de postagem</string> <string name="sk_settings_posting">Preferências de postagem</string>
<string name="sk_settings_filters">Configurar filtros</string> <string name="sk_settings_filters">Configurar filtros</string>
<string name="sk_delete_notification_confirm">Tem certeza que quer deletar esta notificação\?</string> <string name="sk_delete_notification_confirm">Você tem certeza que deseja excluir esta notificação\?</string>
<string name="sk_delete_notification">Deletar notificação</string> <string name="sk_delete_notification">Excluir notificação</string>
<string name="sk_delete_notification_confirm_action">Deletar notificação</string> <string name="sk_delete_notification_confirm_action">Excluir notificação</string>
<string name="sk_enable_delete_notifications">Habilitar deletar notificações</string> <string name="sk_enable_delete_notifications">Habilitar a exclusão de notificações</string>
<string name="sk_settings_publish_button_text_title">Customizar o texto do botão de publicar</string> <string name="sk_settings_publish_button_text_title">Customizar o texto do botão de publicar</string>
<string name="sk_settings_translate_only_opened">Esconder botão de tradução na linha do tempo</string> <string name="sk_settings_translate_only_opened">Esconder botão de tradução na linha do tempo</string>
<string name="sk_settings_translation_availability_note_available">%s possui tradução!</string> <string name="sk_settings_translation_availability_note_available">%s suporta tradução!</string>
<string name="sk_settings_translation_availability_note_unavailable">%s parece que não possui tradução</string> <string name="sk_settings_translation_availability_note_unavailable">%s parece não suportar tradução.</string>
<string name="sk_clear_all_notifications">Limpar todas as notificações</string> <string name="sk_clear_all_notifications">Limpar todas as notificações</string>
<string name="sk_clear_all_notifications_confirm_action">Deletar todas</string> <string name="sk_clear_all_notifications_confirm_action">Excluir tudo</string>
<string name="sk_loading_fediverse_resource_title">Procurando no Fediverso</string> <string name="sk_loading_fediverse_resource_title">Procurando no Fediverso</string>
<string name="sk_undo_reblog">Desfazer reblog</string> <string name="sk_undo_reblog">Desfazer reblog</string>
<string name="sk_reblog_with_visibility">Reblog com visibilidade</string> <string name="sk_reblog_with_visibility">Reblog com visibilidade</string>
<string name="sk_hashtags_you_follow">Hashtags que você segue</string> <string name="sk_hashtags_you_follow">Hashtags que você segue</string>
<string name="sk_copy_link_to_post">Copiar link para postagem</string> <string name="sk_copy_link_to_post">Copiar link para postagem</string>
<string name="sk_loading_resource_on_instance_title">Procurando no %s</string> <string name="sk_loading_resource_on_instance_title">Procurando em %s</string>
<string name="sk_open_with_account">Abrir com outra conta</string> <string name="sk_open_with_account">Abrir com outra conta</string>
<string name="sk_resource_not_found">Recurso não pode ser encontrado</string> <string name="sk_resource_not_found">Recurso não pode ser encontrado</string>
<string name="sk_settings_about">Sobre o app</string> <string name="sk_settings_about">Sobre o app</string>
<string name="sk_settings_auth">Configurações de segurança</string> <string name="sk_settings_auth">Configurações de segurança</string>
<string name="sk_settings_publish_button_text">Texto do botão de publicar</string>
<string name="sk_clear_all_notifications_confirm">Você tem certeza que deseja excluir todas as notificações\?</string>
</resources> </resources>

View File

@@ -16,7 +16,7 @@
<string name="sk_mark_media_as_sensitive">Отметить медиафайл как деликатный</string> <string name="sk_mark_media_as_sensitive">Отметить медиафайл как деликатный</string>
<string name="sk_settings_app_version">Megalodon v%1$s (%2$d)</string> <string name="sk_settings_app_version">Megalodon v%1$s (%2$d)</string>
<string name="sk_notification_type_status">Публикации</string> <string name="sk_notification_type_status">Публикации</string>
<string name="sk_notify_posts">Отправляет публикацию</string> <string name="sk_notify_posts">Уведомдения о</string>
<string name="sk_settings_color_palette">Цветовая схема</string> <string name="sk_settings_color_palette">Цветовая схема</string>
<string name="sk_color_palette_pink">Розовый</string> <string name="sk_color_palette_pink">Розовый</string>
<string name="sk_color_palette_purple">Фиолетовый</string> <string name="sk_color_palette_purple">Фиолетовый</string>
@@ -28,16 +28,16 @@
<string name="sk_language_name">%s (%s)</string> <string name="sk_language_name">%s (%s)</string>
<string name="sk_welcome_title">Добро пожаловать!</string> <string name="sk_welcome_title">Добро пожаловать!</string>
<string name="sk_example_domain">example.social</string> <string name="sk_example_domain">example.social</string>
<string name="sk_settings_load_new_posts">Автоматически загружать новые публикации</string> <string name="sk_settings_load_new_posts">Автоматически загружать новые посты</string>
<string name="sk_settings_show_replies">Показывать ответы на публикации</string> <string name="sk_settings_show_replies">Показать ответы</string>
<string name="sk_federated_timeline">Федерация</string> <string name="sk_federated_timeline">Федерация</string>
<string name="sk_update_available">Megalodon %s готов к скачиванию.</string> <string name="sk_update_available">Megalodon %s готов к скачиванию.</string>
<string name="sk_update_ready">Megalodon %s скачан и готов к установке новой версии.</string> <string name="sk_update_ready">Megalodon %s скачан и готов к установке новой версии.</string>
<string name="sk_check_for_update">Проверить обновления</string> <string name="sk_check_for_update">Проверить обновления</string>
<string name="sk_follow_requests">Запросы на подписку</string> <string name="sk_follow_requests">Запросы на подписку</string>
<string name="sk_lists_with_user">Списки с %s</string> <string name="sk_lists_with_user">Списки с %s</string>
<string name="sk_confirm_unpin_post">Вы точно хотите открепить эту публикацию от профиля\?</string> <string name="sk_confirm_unpin_post">Вы уверены, что хотите открепить этот пост\?</string>
<string name="sk_unpinning">Открепление публикации</string> <string name="sk_unpinning">Открепляем пост</string>
<string name="sk_federated_timeline_info_banner">Это самые последние публикации людей из вашей федерации.</string> <string name="sk_federated_timeline_info_banner">Это самые последние публикации людей из вашей федерации.</string>
<string name="sk_no_update_available">Обновление отсутствует</string> <string name="sk_no_update_available">Обновление отсутствует</string>
<string name="sk_list_timelines">Списки</string> <string name="sk_list_timelines">Списки</string>
@@ -87,4 +87,18 @@
<string name="sk_copy_link_to_post">Скопировать ссылку на публикацию</string> <string name="sk_copy_link_to_post">Скопировать ссылку на публикацию</string>
<string name="sk_open_with_account">Открыть с другого аккаунта</string> <string name="sk_open_with_account">Открыть с другого аккаунта</string>
<string name="sk_resource_not_found">Ресурс не был найден</string> <string name="sk_resource_not_found">Ресурс не был найден</string>
<string name="sk_already_bookmarked">Уже в закладках</string>
<string name="sk_favorite_as">Добавить в избранное на другом аккаунте</string>
<string name="sk_already_favorited">Уже в избранном</string>
<string name="sk_reblog_as">Реблог на другой аккаунт</string>
<string name="sk_reblogged_as">Реблог на %s</string>
<string name="sk_reply_as">Ответить с другого аккаунта</string>
<string name="sk_settings_uniform_icon_for_notifications">Единая иконка для всех уведомлений</string>
<string name="sk_loading_fediverse_resource_title">Ищем это в Fediverse</string>
<string name="sk_bookmark_as">Добавить в закладки на другом аккаунте</string>
<string name="sk_bookmarked_as">В закладки как %s</string>
<string name="sk_favorited_as">В избранное как %s</string>
<string name="sk_already_reblogged">Уже реблогнуто</string>
<string name="sk_hashtags_you_follow">Хештеги, на которые вы подписаны</string>
<string name="sk_loading_resource_on_instance_title">Просматриваем на %s</string>
</resources> </resources>

View File

@@ -90,4 +90,34 @@
<string name="sk_loading_resource_on_instance_title">Пошук на %s</string> <string name="sk_loading_resource_on_instance_title">Пошук на %s</string>
<string name="sk_open_with_account">Відкрити через інший обліковий запис</string> <string name="sk_open_with_account">Відкрити через інший обліковий запис</string>
<string name="sk_resource_not_found">Ресурс не знайдено</string> <string name="sk_resource_not_found">Ресурс не знайдено</string>
<string name="sk_bookmarked_as">Додано до закладок як %s</string>
<string name="sk_already_bookmarked">Уже в закладках</string>
<string name="sk_favorited_as">Уподобано як %s</string>
<string name="sk_already_favorited">Уже вподобано</string>
<string name="sk_reblog_as">Поширити з іншого облікового запису</string>
<string name="sk_already_reblogged">Уже поширено</string>
<string name="sk_settings_uniform_icon_for_notifications">Єдина піктограма для всіх сповіщень</string>
<string name="sk_bookmark_as">Додати до закладок іншого облікового запису</string>
<string name="sk_favorite_as">Уподобане з іншого облікового запису</string>
<string name="sk_reblogged_as">Поширено як %s</string>
<string name="sk_reply_as">Відповісти з іншого облікового запису</string>
<string name="sk_forward_report_to">Переслати до %s</string>
<string name="sk_unsent_posts">Не надіслані дописи</string>
<string name="sk_draft">Чернетка</string>
<string name="sk_schedule">Заплановане</string>
<string name="sk_confirm_delete_draft_title">Видалити чернетку</string>
<string name="sk_confirm_delete_scheduled_post_title">Видалити запланований допис</string>
<string name="sk_confirm_delete_scheduled_post">Ви дійсно хочете видалити цей запланований допис\?</string>
<string name="sk_compose_draft">Допис збережеться до чернеток.</string>
<string name="sk_compose_scheduled">Заплановано на</string>
<string name="sk_draft_saved">Чернетку збережено</string>
<string name="sk_post_scheduled">Допис заплановано</string>
<string name="sk_confirm_delete_draft">Ви дійсно хочете видалити чернетку цього допису\?</string>
<string name="sk_draft_or_schedule">У чернетки чи до запланованих</string>
<string name="sk_scheduled_too_soon_title">Надто скоро заплановано</string>
<string name="sk_scheduled_too_soon">Допис має бути запланований щонайменше на 10 хвилин наперед.</string>
<string name="sk_confirm_save_changes">Зберегти зміни\?</string>
<string name="sk_mark_as_draft">Позначити чернеткою</string>
<string name="sk_schedule_post">Запланувати допис</string>
<string name="sk_confirm_save_draft">Зберегти чернетку\?</string>
</resources> </resources>

View File

@@ -90,4 +90,32 @@
<string name="sk_loading_resource_on_instance_title">在 %s 上查找</string> <string name="sk_loading_resource_on_instance_title">在 %s 上查找</string>
<string name="sk_resource_not_found">找不到资源</string> <string name="sk_resource_not_found">找不到资源</string>
<string name="sk_open_with_account">用另一个帐户打开</string> <string name="sk_open_with_account">用另一个帐户打开</string>
<string name="sk_bookmark_as">在其他帐户中添加书签</string>
<string name="sk_bookmarked_as">已标记为 %s</string>
<string name="sk_already_bookmarked">已加入书签</string>
<string name="sk_favorite_as">从其他帐户收藏</string>
<string name="sk_favorited_as">收藏为 %s</string>
<string name="sk_already_favorited">已收藏</string>
<string name="sk_reblog_as">从其他帐户重新登录</string>
<string name="sk_reblogged_as">重新登录为 %s</string>
<string name="sk_already_reblogged">已重新登录</string>
<string name="sk_reply_as">用其他帐号回复</string>
<string name="sk_settings_uniform_icon_for_notifications">所有通知的统一图标</string>
<string name="sk_unsent_posts">未发送的嘟文</string>
<string name="sk_confirm_delete_draft_title">删除草稿</string>
<string name="sk_draft">草稿</string>
<string name="sk_schedule">预订</string>
<string name="sk_confirm_delete_scheduled_post_title">删除预订嘟文</string>
<string name="sk_confirm_delete_scheduled_post">您确定要删除此预定嘟文吗?</string>
<string name="sk_draft_or_schedule">草稿或预订</string>
<string name="sk_compose_draft">嘟文将保存为草稿。</string>
<string name="sk_compose_scheduled">预定于</string>
<string name="sk_draft_saved">草稿已保存</string>
<string name="sk_post_scheduled">预订嘟文</string>
<string name="sk_forward_report_to">转发给 %s</string>
<string name="sk_confirm_delete_draft">您确定要删除此嘟文草稿吗?</string>
<string name="sk_scheduled_too_soon_title">预定的时间过早</string>
<string name="sk_scheduled_too_soon">嘟文必须预订在未来至少 10 分钟后。</string>
<string name="sk_save_draft">保存草稿?</string>
<string name="sk_save_changes">保存更改?</string>
</resources> </resources>

View File

@@ -91,13 +91,13 @@
<string name="sk_copy_link_to_post">Copy link to post</string> <string name="sk_copy_link_to_post">Copy link to post</string>
<string name="sk_open_with_account">Open with other account</string> <string name="sk_open_with_account">Open with other account</string>
<string name="sk_resource_not_found">Resource could not be found</string> <string name="sk_resource_not_found">Resource could not be found</string>
<string name="sk_bookmark_as">Bookmark in other account</string> <string name="sk_bookmark_as">Bookmark with other account</string>
<string name="sk_bookmarked_as">Bookmarked as %s</string> <string name="sk_bookmarked_as">Bookmarked as %s</string>
<string name="sk_already_bookmarked">Already bookmarked</string> <string name="sk_already_bookmarked">Already bookmarked</string>
<string name="sk_favorite_as">Favorite from other account</string> <string name="sk_favorite_as">Favorite with other account</string>
<string name="sk_favorited_as">Favorited as %s</string> <string name="sk_favorited_as">Favorited as %s</string>
<string name="sk_already_favorited">Already favorited</string> <string name="sk_already_favorited">Already favorited</string>
<string name="sk_reblog_as">Reblog from other account</string> <string name="sk_reblog_as">Reblog with other account</string>
<string name="sk_reblogged_as">Reblogged as %s</string> <string name="sk_reblogged_as">Reblogged as %s</string>
<string name="sk_already_reblogged">Already reblogged</string> <string name="sk_already_reblogged">Already reblogged</string>
<string name="sk_reply_as">Reply with other account</string> <string name="sk_reply_as">Reply with other account</string>
@@ -117,6 +117,14 @@
<string name="sk_post_scheduled">Post scheduled</string> <string name="sk_post_scheduled">Post scheduled</string>
<string name="sk_scheduled_too_soon_title">Scheduled time is too soon</string> <string name="sk_scheduled_too_soon_title">Scheduled time is too soon</string>
<string name="sk_scheduled_too_soon">Post must be scheduled at least 10 minutes in the future.</string> <string name="sk_scheduled_too_soon">Post must be scheduled at least 10 minutes in the future.</string>
<string name="sk_save_draft">Save draft?</string> <string name="sk_confirm_save_draft">Save draft?</string>
<string name="sk_save_changes">Save changes?</string> <string name="sk_confirm_save_changes">Save changes?</string>
<string name="sk_mark_as_draft">Mark as draft</string>
<string name="sk_schedule_post">Schedule post</string>
<string name="sk_schedule_or_draft">Schedule or draft</string>
<string name="sk_compose_no_schedule">Dont schedule</string>
<string name="sk_compose_no_draft">Dont draft</string>
<string name="sk_settings_reduce_motion">Reduce motion in animations</string>
<string name="sk_announcements">Announcements</string>
<string name="sk_mark_as_read">Mark as read</string>
</resources> </resources>

View File

@@ -381,7 +381,7 @@
<style name="Widget.Mastodon.M3.Button" parent="android:Widget.Material.Button"> <style name="Widget.Mastodon.M3.Button" parent="android:Widget.Material.Button">
<item name="android:textAllCaps">false</item> <item name="android:textAllCaps">false</item>
<item name="android:textSize">14dp</item> <item name="android:textSize">14sp</item>
<item name="android:minHeight">40dp</item> <item name="android:minHeight">40dp</item>
<item name="android:fontFamily">sans-serif-medium</item> <item name="android:fontFamily">sans-serif-medium</item>
<item name="android:stateListAnimator">@null</item> <item name="android:stateListAnimator">@null</item>
@@ -403,45 +403,45 @@
<style name="alert_title"> <style name="alert_title">
<item name="android:textColor">?android:textColorPrimary</item> <item name="android:textColor">?android:textColorPrimary</item>
<item name="android:textSize">24dp</item> <item name="android:textSize">24sp</item>
<item name="android:minHeight">38dp</item> <item name="android:minHeight">38dp</item>
<item name="android:gravity">center_vertical</item> <item name="android:gravity">center_vertical</item>
</style> </style>
<style name="m3_body_large"> <style name="m3_body_large">
<item name="android:textSize">16dp</item> <item name="android:textSize">16sp</item>
<item name="android:textColor">?android:textColorPrimary</item> <item name="android:textColor">?android:textColorPrimary</item>
<item name="android:lineSpacingExtra">5dp</item> <item name="android:lineSpacingExtra">5dp</item>
</style> </style>
<style name="m3_body_medium"> <style name="m3_body_medium">
<item name="android:textSize">14dp</item> <item name="android:textSize">14sp</item>
<item name="android:textColor">?android:textColorPrimary</item> <item name="android:textColor">?android:textColorPrimary</item>
<item name="android:lineSpacingExtra">4dp</item> <item name="android:lineSpacingExtra">4dp</item>
</style> </style>
<style name="m3_body_small"> <style name="m3_body_small">
<item name="android:textSize">12dp</item> <item name="android:textSize">12sp</item>
<item name="android:textColor">?android:textColorSecondary</item> <item name="android:textColor">?android:textColorSecondary</item>
<item name="android:lineSpacingExtra">2dp</item> <item name="android:lineSpacingExtra">2dp</item>
</style> </style>
<style name="m3_title_medium"> <style name="m3_title_medium">
<item name="android:fontFamily">sans-serif-medium</item> <item name="android:fontFamily">sans-serif-medium</item>
<item name="android:textSize">16dp</item> <item name="android:textSize">16sp</item>
<item name="android:textColor">?android:textColorPrimary</item> <item name="android:textColor">?android:textColorPrimary</item>
<item name="android:lineSpacingExtra">5dp</item> <item name="android:lineSpacingExtra">5dp</item>
</style> </style>
<style name="m3_title_small"> <style name="m3_title_small">
<item name="android:fontFamily">sans-serif-medium</item> <item name="android:fontFamily">sans-serif-medium</item>
<item name="android:textSize">14dp</item> <item name="android:textSize">14sp</item>
<item name="android:textColor">?android:textColorSecondary</item> <item name="android:textColor">?android:textColorSecondary</item>
</style> </style>
<style name="m3_label_medium"> <style name="m3_label_medium">
<item name="android:fontFamily">sans-serif-medium</item> <item name="android:fontFamily">sans-serif-medium</item>
<item name="android:textSize">12dp</item> <item name="android:textSize">12sp</item>
<item name="android:textColor">?android:textColorPrimary</item> <item name="android:textColor">?android:textColorPrimary</item>
<item name="android:lineSpacingMultiplier">1.14</item> <item name="android:lineSpacingMultiplier">1.14</item>
</style> </style>
@@ -449,12 +449,12 @@
<style name="m3_label_large"> <style name="m3_label_large">
<item name="android:fontFamily">sans-serif-medium</item> <item name="android:fontFamily">sans-serif-medium</item>
<item name="android:textColor">?android:textColorSecondary</item> <item name="android:textColor">?android:textColorSecondary</item>
<item name="android:textSize">14dp</item> <item name="android:textSize">14sp</item>
</style> </style>
<style name="m3_title_large"> <style name="m3_title_large">
<item name="android:fontFamily">sans-serif-medium</item> <item name="android:fontFamily">sans-serif-medium</item>
<item name="android:textSize">22dp</item> <item name="android:textSize">22sp</item>
<item name="android:textColor">?android:textColorPrimary</item> <item name="android:textColor">?android:textColorPrimary</item>
</style> </style>
@@ -465,12 +465,12 @@
</style> </style>
<style name="m3_headline_small"> <style name="m3_headline_small">
<item name="android:textSize">24dp</item> <item name="android:textSize">24sp</item>
<item name="android:textColor">?android:textColorPrimary</item> <item name="android:textColor">?android:textColorPrimary</item>
</style> </style>
<style name="m3_headline_medium"> <style name="m3_headline_medium">
<item name="android:textSize">28dp</item> <item name="android:textSize">28sp</item>
<item name="android:textColor">?android:textColorPrimary</item> <item name="android:textColor">?android:textColorPrimary</item>
<item name="android:lineSpacingExtra">3dp</item> <item name="android:lineSpacingExtra">3dp</item>
</style> </style>

View File

@@ -0,0 +1,10 @@
- Entwürfe und geplante Posts
- Beim Antworten wird nun der Original-Post angezeigt
- Mastodon 4.0-kompatible Filter von @thiagojedi
- Lange Klicken, um mit Posts (Antworten, Boosten, Liken, Lesezeichen) von anderen Konten zu interagieren
- Symbole in allen Menüs
- Schalter, um beim Melden die Weiterleitung einzustellen
- Erwähnung bei Verwendung der Funktion "Darüber schreiben" hinzufügen
- Option zur Verwendung eines einheitlichen Benachrichtigungssymbols anstelle von unterschiedlichen Symbolen
- Option zum Zugriff auf die In-App-Regelliste über die Einstellungen
- Fehlerbehebungen

View File

@@ -4,11 +4,12 @@ Megalodon ist eine modifizierte Version der <a href="https://github.com/mastodon
- <b>Ungelistet posten</b>: Öffentlich posten, ohne dass der Beitrag in Trends, Hashtags oder öffentlichen Timelines angezeigt wird. - <b>Ungelistet posten</b>: Öffentlich posten, ohne dass der Beitrag in Trends, Hashtags oder öffentlichen Timelines angezeigt wird.
- <b>Föderierte Timeline</b>: Alle öffentlichen Beiträge aller anderen Fediverse-Nachbarschaften, mit denen deine Heim-Instanz verbunden ist. - <b>Föderierte Timeline</b>: Alle öffentlichen Beiträge aller anderen Fediverse-Nachbarschaften, mit denen deine Heim-Instanz verbunden ist.
- <b>Entwürfe und geplante Beiträge</b>: Ermöglicht das Vorbereiten eines Posts und das Planen des automatischen Versands zu einem bestimmten Zeitpunkt.
- <b>Bildbeschreibungen anzeigen</b>: Unkompliziert prüfen, ob Bilder und Videos Alternativ-Texte beinhalten. - <b>Bildbeschreibungen anzeigen</b>: Unkompliziert prüfen, ob Bilder und Videos Alternativ-Texte beinhalten.
- <b>Beiträge anpinnen</b>: Pinne deine wichtigsten Beiträge an dein Profil an und sieh im “Angepinnt”-Tab nach, was andere User_innen angepinnt haben. - <b>Beiträge anpinnen</b>: Pinne deine wichtigsten Beiträge an dein Profil an und sieh im “Angepinnt”-Tab nach, was andere User_innen angepinnt haben.
- <b>Hashtags folgen</b>: Bringt neue Beiträge bestimmter Hashtags direkt in deine Home-Timeline. - <b>Hashtags folgen</b>: Bringt neue Beiträge bestimmter Hashtags direkt in deine Home-Timeline.
- <b>Folgeanfragen beantworten</b>: Folgeanfragen lassen sich nun direkt über die Benachrichtigungen-Liste oder über die Folgeanfragen-Liste akzeptieren oder ablehnen. - <b>Folgeanfragen beantworten</b>: Folgeanfragen lassen sich nun direkt über die Benachrichtigungen-Liste oder über die Folgeanfragen-Liste akzeptieren oder ablehnen.
- <b>Beiträge löschen und neu erstellen</b>: Das beliebte Feature, das das Bearbeiten von Beiträgen ohne tatsächliche Bearbeit-Funktion möglich gemacht hat. - <b>Beiträge löschen und neu erstellen</b>: Das beliebte Feature, dass das Bearbeiten von Beiträgen ohne tatsächliche Bearbeit-Funktion möglich gemacht hat.
- <b>Sprachauswahl</b>: Wähle mühelos die Sprache für jeden deiner Beiträge, damit diese richtig gefiltert und übersetzt werden können. - <b>Sprachauswahl</b>: Wähle mühelos die Sprache für jeden deiner Beiträge, damit diese richtig gefiltert und übersetzt werden können.
- <b>Übersetzung</b>: Beiträge können nun direkt in Megalodon übersetzt werden aber nur, wenn deine Instanz dies auch unterstützt. - <b>Übersetzung</b>: Beiträge können nun direkt in Megalodon übersetzt werden aber nur, wenn deine Instanz dies auch unterstützt.
- <b>Sichtbarkeits-Indikator</b>: Beim Öffnen oder Antworten auf einen Beitrag zeigt ein Symbol die Sichtbarkeit des Beitrags an. - <b>Sichtbarkeits-Indikator</b>: Beim Öffnen oder Antworten auf einen Beitrag zeigt ein Symbol die Sichtbarkeit des Beitrags an.

View File

@@ -1,7 +1,9 @@
- Drafts and scheduled posts - Drafts and scheduled posts
- Mastodon 4.0 compatible filters by @thiagojedi - Display original post when replying
- Mastodon 4.0 compatible filters (no "hide with warning" function yet)
- Long-click to interact with posts (reply, boost, like, bookmark) from other logged-in accounts - Long-click to interact with posts (reply, boost, like, bookmark) from other logged-in accounts
- Icons in all menus - Icons in all menus
- Toggle for forwarding reports
- Add mention when using "Post about this" function - Add mention when using "Post about this" function
- Option to use uniform notifications icon instead of distinct icons - Option to use uniform notifications icon instead of distinct icons
- Option to access in-app rules list from settings - Option to access in-app rules list from settings

View File

@@ -0,0 +1,8 @@
- Borradores y publicaciones programadas
- Filtros compatibles con Mastodon 4.0 de @thiagojedi
- Clic largo para interactuar con publicaciones (respuesta, impulso, me gusta, marcador) de otras cuentas registradas
- Iconos en todos los menús
- Agregar mención al usar la función "Escribir sobre"
- Opción para usar un ícono de notificación uniforme en lugar de íconos diferentes
- Opción para acceder a la lista de reglas en la aplicación desde la configuración
- Corrección de errores

View File

@@ -1,15 +1,16 @@
Megalodon es una versión modificada de la <a href="https://github.com/mastodon/mastodon-android">aplicación oficial de Mastodon para Android</a> que añade funcionalidades importantes que le faltan a esta, como la cronología federada, la publicación descatalogada y un visor de descripciones de imágenes. Megalodon es una versión modificada de la <a href="https://github.com/mastodon/mastodon-android">aplicación oficial de Mastodon para Android</a> con muchas características que faltan en la aplicación oficial, como la federada Timeline , publicar publicaciones no listadas y la capacidad de ver descripciones de imágenes.
<b>Funcionalidades importantes</b> <b>Las funciones más importantes</b>
- <b>Publicación descatalogada</b>: haga envíos públicos sin que estos figuren en tendencias, etiquetas o cronologías públicas. - <b>Publicación no listada</b>: publique públicamente sin mostrar la publicación en tendencias, hashtags o cronologías públicas.
- <b>Cronología federada</b>: vea todos los envíos públicos de las personas en las instalaciones del Fediverso que estén conectadas con su instalación hogar. - <b>Línea de tiempo federada</b>: todas las publicaciones públicas de todos los demás vecindarios de Fediverse a los que está conectada su instancia de inicio.
- <b>Visor de descripciones de imágenes</b>: compruebe con rapidez si una imagen o un vídeo tiene texto alternativo. - <b>Borradores y publicaciones programadas</b>: permite preparar una publicación y programarla para que se envíe automáticamente a una hora específica.
- <b>Anclaje de publicaciones</b>: ancle sus envíos más importantes a su perfil y vea lo que otros han anclado mediante la pestaña «Ancladas». - <b>Mostrar descripciones de imágenes</b>: compruebe fácilmente si las imágenes y los vídeos contienen textos alternativos.
- <b>Seguir etiquetas</b>: vea envíos etiquetados directamente en su cronología de inicio siguiéndolas. - <b>Fijar publicaciones</b>: fije sus publicaciones más importantes a su perfil y vea lo que otros usuarios han fijado en la pestaña "Fijado".
- <b>Respuesta a solicitudes de seguimiento</b>: acepte o rechace solicitudes de seguimiento desde sus notificaciones o desde la lista dedicada. - <b>Follow Hashtags</b>: Trae nuevas publicaciones de hashtags específicos directamente a su línea de tiempo de inicio.
- <b>Eliminar y reescribir</b>: la tan querida función que hizo posible editar los envíos ante la falta de una función Editar propiamente dicha. - <b>Responder solicitudes de seguimiento</b>: las solicitudes de seguimiento ahora se pueden aceptar o rechazar directamente a través de la lista de notificaciones o mediante la lista de solicitudes de seguimiento.
- <b>Selector de idioma</b>: seleccione fácilmente el idioma de cada publicación que realice para que los filtros y la traducción funcionen correctamente. - <b>Eliminar publicaciones y crear nuevas</b>: la característica popular que hizo posible editar publicaciones sin editarlas realmente.
- <b>Traducción</b>: ¡Traduce fácilmente las publicaciones dentro de Megalodon! Solo funciona si la función también está disponible en su Mastodon Web. - <b>Selector de idioma</b>: elija fácilmente el idioma de cada una de sus publicaciones para que puedan filtrarse y traducirse correctamente.
- <b>Indicador de visibilidad de publicación</b>: al abrir o responder a una publicación, se mostrará un ícono útil que indica la visibilidad de la publicación. - <b>Traducción</b>: las publicaciones ahora se pueden traducir directamente a Megalodon, pero solo si su instancia lo admite.
- <b>Temas de color</b>: si no te gusta el color rosa predeterminado (el tiburón te está juzgando en silencio), los temas de color de Moshidon te ayudarán. - <b>Indicador de visibilidad</b>: al abrir o responder a una publicación, un ícono indica la visibilidad de la publicación.
- <b>Esquemas de color</b>: si no te gusta el rosa predeterminado (el tiburón te juzga en silencio), los esquemas de color de Moshidon pueden ayudarte.

View File

@@ -0,0 +1 @@
Andoiderako Mastodon, baino hau arrosa da eta ezaugarri gehiago ditu

1
metadata/eu-ES/title.txt Normal file
View File

@@ -0,0 +1 @@
Megalodon

View File

@@ -0,0 +1,8 @@
- Brouillons et messages planifiés
- Filtres compatibles Mastodon 4.0 par @thiagojedi
- Appuis long pour interagir avec les messages (répondre, booster, aimer, signet) d'autres comptes connectés
- Icônes dans tous les menus
- Ajout d'une mention lors de l'utilisation de la fonction "Publier à ce sujet"
- Possibilité d'utiliser une icône de notification uniforme au lieu d'icônes distinctes
- Option pour accéder à la liste des règles de l'application à partir des paramètres
- Corrections de bugs

View File

@@ -4,6 +4,7 @@ Megalodon est une version modifiée de <a href="https://github.com/mastodon/mast
- <b>Publication non répertoriée</b> : Publiez publiquement sans que votre message apparaisse dans les tendances, les hashtags ou les timelines publiques. - <b>Publication non répertoriée</b> : Publiez publiquement sans que votre message apparaisse dans les tendances, les hashtags ou les timelines publiques.
- <b>Timeline fédérée</b> : Affichez tous les messages publics des personnes de tout le voisinage du Fediverse auxquel votre instance est connectée. - <b>Timeline fédérée</b> : Affichez tous les messages publics des personnes de tout le voisinage du Fediverse auxquel votre instance est connectée.
- <b>Brouillons et messages planifiés</b> : permet de préparer un message et de programmer son envoi automatiquement à une heure précise.
- <b>Visionneuse de description d'image</b> : Vérifiez rapidement si une image ou une vidéo est associée à un texte alternatif. - <b>Visionneuse de description d'image</b> : Vérifiez rapidement si une image ou une vidéo est associée à un texte alternatif.
- <b>Épingler des publications</b> : Épinglez vos publications les plus importantes à votre profil et voyez ce que les autres ont épinglé en utilisant l'onglet "Épinglé". - <b>Épingler des publications</b> : Épinglez vos publications les plus importantes à votre profil et voyez ce que les autres ont épinglé en utilisant l'onglet "Épinglé".
- <b>Suivez des hashtags</b> : Voir les nouveaux messages avec des hashtags spécifiques directement dans votre timeline d'accueil en les suivant. - <b>Suivez des hashtags</b> : Voir les nouveaux messages avec des hashtags spécifiques directement dans votre timeline d'accueil en les suivant.

View File

@@ -0,0 +1,8 @@
- Draft dan kiriman terjadwal
- Saringan kompatibel dengan Mastodon 4.0 oleh @thiagojedi
- Klik lama untuk berinteraksi dengan kiriman (balas, bagikan, sukai, markahi) dari akun yang sudah masuk
- Ikon di semua menu
- Tambahkan sebutan ketika menggunakan fungsi "Kirim tentang ini"
- Opsi untuk menggunakan ikon notifikasi yang sama daripada ikon yang berbeda
- Opsi untuk mengakses daftar dalam aplikasi dari pengaturan
- Perbaikan kutu

View File

@@ -3,7 +3,8 @@ Megalodon adalah versi modifikasi <a href="https://github.com/mastodon/mastodon-
<b>Fitur unggulan</b> <b>Fitur unggulan</b>
- <b>Pengiriman tidak terdaftar</b>: Kirim secara publik tanpa memasukkan kiriman Anda dalam tren, tagar, atau lini masa publik. - <b>Pengiriman tidak terdaftar</b>: Kirim secara publik tanpa memasukkan kiriman Anda dalam tren, tagar, atau lini masa publik.
- <b>Lini masa federasi</b>: Lihat semua kiriman publik dari orang-orang di semua tetangga Fediverse lainnya yang instansi rumah Anda terhubung. - <b>Lini masa federasi</b>: Lihat semua kiriman publik dari orang-orang di semua tetangga Fedimesta lainnya yang instansi rumah Anda terhubung.
- <b>Draf dan kiriman terjadwal</b>: Memungkinkan untuk menyiapkan kiriman dan menjadwalkannya untuk dikirim secara otomatis pada waktu yang ditentukan.
- <b>Penampil deskripsi gambar</b>: Periksa secara cepat jika gambar atau video nemiliki deskripsi alternatif. - <b>Penampil deskripsi gambar</b>: Periksa secara cepat jika gambar atau video nemiliki deskripsi alternatif.
- <b>Menyematkan kiriman</b>: Sematkan kiriman penting Anda ke profil Anda dan lihat apa yang telah disematkan oleh orang lain menggunakan tab “Disematkan”. - <b>Menyematkan kiriman</b>: Sematkan kiriman penting Anda ke profil Anda dan lihat apa yang telah disematkan oleh orang lain menggunakan tab “Disematkan”.
- <b>Ikuti tagar</b>: Lihat kiriman baru dari tagar spesifik secara langsung dalam lini masa beranda Anda dengan mengikutinya. - <b>Ikuti tagar</b>: Lihat kiriman baru dari tagar spesifik secara langsung dalam lini masa beranda Anda dengan mengikutinya.

View File

@@ -0,0 +1,6 @@
- 리블로그를 길게 눌러 공개 범위를 설정
- 자신의 리블로그에 대해 공개 범위 표시
- 팔로우한 해시태그 목록 추가
- 길게 눌러 링크 복사
- 다른 계정으로 게시물을 열 수 있는 옵션 제공
- 버그 해결 및 소소한 수정

View File

@@ -2,4 +2,5 @@
- Adicionada a função de tradução - Adicionada a função de tradução
- Melhorada a semântica para votação em enquetes (botões de opção e caixas de seleção) - Melhorada a semântica para votação em enquetes (botões de opção e caixas de seleção)
- Adicionada a opção que permite a votação de várias opções nas enquetes - Adicionada a opção que permite a votação de várias opções nas enquetes
- Nova tela de login
- Correções de bugs - Correções de bugs

View File

@@ -1,5 +1,5 @@
- Botão de Publicar personalizável - Botão de Publicar personalizável
- Links do Fediverso no abertos no aplicativo - Links do Fediverso abertos no aplicativo
- Clique longo em impulsionar para "citar" uma postagem - Clique longo em impulsionar para "citar" uma postagem
- Copie o URL da postagem ao pressionar e segurar o compartilhar - Copie o URL da postagem ao pressionar e segurar o compartilhar
- Exclusão de notificações (desativado por padrão) - Exclusão de notificações (desativado por padrão)

View File

@@ -0,0 +1,4 @@
- Подготовьте файлы для выпуска на F-Droid
- Исправьте автоматическое обновление
- Добавьте однотонные иконки обратно в иконки пусковой установки
- Заменить неправильную иконку без списка в расширенном нижнем колонтитуле

View File

@@ -0,0 +1,6 @@
- Сделать возможным открытие исходного сообщения при ответе (щелчком по строке "В ответ на...")
- Слияние изменений и исправлений
- Удалить неиспользуемый код "App Center"
- Добавить релиз без федеративной временной шкалы для Play Store
- Добавить пользовательский URI перенаправления для упрощения входа
- Изменить ссылку на участие в проекте

View File

@@ -0,0 +1,4 @@
- Исправлен неработающий рендеринг HTML-тегов и включите рендеринг форматирования Markdown
- Инициализирован <a href="https://translate.codeberg.org/projects/megalodon">проект перевода на Weblate</a>
- Добавлен переключатель для федеративной временной шкалы
- Версии 52-54 были небольшими корректировками для выпуска на Google Play

View File

@@ -0,0 +1,6 @@
- Пользовательские цветовые темы от @LucasGGamerM
- Новый текстовый логотип "megalodon" предоставлен @LucasGGamerM
- Улучшен поиск эмодзи при написании текста
- Настроено голосование (отображение собственного голоса, всегда отображать кнопку голосования, не обрывать длинные ответы)
- Добавлена настройка push-уведомлений для уведомлений о сообщениях
- Исправления багов

View File

@@ -0,0 +1,6 @@
- Добавить селектор языков
- Добавить функцию перевода
- Улучшение семантики для голосования в опросах (радиокнопки и чекбоксы)
- Добавить возможность разрешить голосование за несколько вариантов в опросах
- Новый экран входа в систему
- Исправления

View File

@@ -0,0 +1,5 @@
- Новые цветовые темы: Material You и Красный
- Новые темно-серые тона для всех тем
- Более отчетливая иконка повышения наполненности
- Анимация для кнопок взаимодействия
- Исправления (сбой в некоторых сообщениях, "Списки с", язык сообщений по умолчанию)

View File

@@ -0,0 +1,11 @@
- Настраиваемая кнопка "Опубликовать
- Открывать ссылки Fediverse в приложении
- Длительное нажатие кнопки увеличения для "цитирования" сообщения
- Копирование URL-адреса поста при длительном нажатии на кнопку поделиться
- Реализация удаления уведомлений (по умолчанию отключено)
- Выделенные иконки для различных типов уведомлений
- Новые серые цвета
- Добавлена настройка для отключения пролистывания между вкладками
- Добавление различных ссылок на настройки аккаунта
- Переключатель для показа/скрытия кнопки перевода на временной шкале
- Исправления и доработки

View File

@@ -0,0 +1,6 @@
- Возможность делать реблог с определенной видимостью при длительном нажатии
- Показать видимость собственных реблогов
- Добавить список отслеживаемых хэштегов
- Длинный клик для копирования ссылок
- Возможность открывать посты с другого аккаунта
- Исправления и мелкие доработки

View File

@@ -10,6 +10,6 @@ Megalodon - это модифицированная версия <a href="https:
- <b> Ответы на запросы подписчиков</b>: принимайте или отклоняйте запросы подписчиков из ваших уведомлений или специального списка запросов подписчиков. - <b> Ответы на запросы подписчиков</b>: принимайте или отклоняйте запросы подписчиков из ваших уведомлений или специального списка запросов подписчиков.
- <b>"Удалить и исправить"</b>: очень любимая функция, которая сделала возможным редактирование без реальной функции редактирования. - <b>"Удалить и исправить"</b>: очень любимая функция, которая сделала возможным редактирование без реальной функции редактирования.
- <b>Выбор языка</b>: Безболезненно выбирайте язык для каждой публикации, которую вы делаете, чтобы фильтры и перевод работали правильно. - <b>Выбор языка</b>: Безболезненно выбирайте язык для каждой публикации, которую вы делаете, чтобы фильтры и перевод работали правильно.
- <b>Перевод публикации</b>: Легко переводите публикации прямо внутри Megalodon! Работает только в том случае, если администратор вашего домашнего сервера включил эту функцию для Web-клиента Mastodon. - <b>Перевод публикации</b>: Легко переводите публикации прямо внутри Megalodon! Работает только в том случае, если администратор вашего домашнего сервера включил эту функцию для Web-клиента Mastodon.
- <b>Индикатор видимости поста</b>: При открытии поста или ответе на него будет отображаться удобный значок, указывающий на видимость поста. - <b>Индикатор видимости поста</b>: При открытии поста или ответе на него будет отображаться удобный значок, указывающий на видимость поста.
- <b>Цветовая схема</b>: Если вам по умолчанию не устраивает розовый цвет в клиенте (акула молча вас осуждает), цветовые схемы Moshidon помогут вам. - <b>Цветовая схема</b>: Если вам по умолчанию не устраивает розовый цвет в клиенте (акула молча вас осуждает), цветовые схемы Moshidon помогут вам.

View File

@@ -0,0 +1,8 @@
- Чернетки й заплановані дописи
- Фільтри, сумісні з Mastodon 4.0, від @thiagojedi
- Взаємодіяти затисканням з дописами (відповісти, поширити, уподобати, додати до закладок) від інших облікових записів, до яких ви ввійшли.
- Піктограми у всіх меню
- Додавання згадки за користування функцією «Написати про це»
- Можливість використовувати єдину піктограму сповіщень замість різних піктограм
- Можливість доступу до списку правил застосунку з налаштувань
- Виправлення помилок

View File

@@ -4,6 +4,7 @@ Megalodon — це модифікована версія <a href="https://github
- <b>Приховані дописи</b>: Створюйте загальнодоступні дописи, але не показуйте їх у трендах, хештегах чи загальнодоступних стрічках. - <b>Приховані дописи</b>: Створюйте загальнодоступні дописи, але не показуйте їх у трендах, хештегах чи загальнодоступних стрічках.
- <b>Федеративна стрічка</b>: Переглядайте всі загальнодоступні дописи від людей зі всього Федівсесвіту! - <b>Федеративна стрічка</b>: Переглядайте всі загальнодоступні дописи від людей зі всього Федівсесвіту!
- <b>Чернетки й заплановані дописи</b>: Дозволяє підготувати допис і запланувати його автонадсилання у вказаний час.
- <b>Переглядач опису зображення</b>: Швидко перевірте, чи має зображення або відео альтернативний опис. - <b>Переглядач опису зображення</b>: Швидко перевірте, чи має зображення або відео альтернативний опис.
- <b>Закріплення дописів</b>: Закріплюйте ваші найважливіші дописи у своєму профілі та переглядайте, що закріпили люди у вкладці "Закріплене". - <b>Закріплення дописів</b>: Закріплюйте ваші найважливіші дописи у своєму профілі та переглядайте, що закріпили люди у вкладці "Закріплене".
- <b>Слідкуйте за хештегами</b>: Переглядайте нові дописи з певними хештегами безпосередньо у своїй домашній стрічці, підписавшись на них. - <b>Слідкуйте за хештегами</b>: Переглядайте нові дописи з певними хештегами безпосередньо у своїй домашній стрічці, підписавшись на них.