Compare commits

...

189 Commits
v1.0 ... v1.0.1

Author SHA1 Message Date
Grishka
ed8128fb72 Bump version 2022-04-21 17:32:15 +03:00
Grishka
b71e57a07e Fix layout 2022-04-21 17:06:56 +03:00
Grishka
51405b2bae Merge remote-tracking branch 'origin/l10n_master'
# Conflicts:
#	mastodon/src/main/res/values-de-rDE/strings.xml
#	mastodon/src/main/res/values-tr-rTR/strings.xml
2022-04-21 17:03:15 +03:00
Grishka
3bb4f80dc6 Crash fix 2022-04-21 16:52:25 +03:00
Eugen Rochko
daac3c5b52 New translations short_description.txt (Vietnamese) 2022-04-21 15:25:12 +02:00
Eugen Rochko
47f449000a New translations full_description.txt (Vietnamese) 2022-04-21 15:25:11 +02:00
Eugen Rochko
65d1491df3 New translations strings.xml (Vietnamese) 2022-04-21 15:25:10 +02:00
Eugen Rochko
14b9d91645 New translations strings.xml (Vietnamese) 2022-04-21 14:11:39 +02:00
Eugen Rochko
9367eca556 New translations title.txt (Vietnamese) 2022-04-21 12:30:18 +02:00
Eugen Rochko
2dee95b688 New translations short_description.txt (Vietnamese) 2022-04-21 12:30:17 +02:00
Eugen Rochko
303c729a27 New translations full_description.txt (Vietnamese) 2022-04-21 12:30:16 +02:00
Eugen Rochko
657761f432 New translations strings.xml (Vietnamese) 2022-04-21 12:30:15 +02:00
Eugen Rochko
60ac581838 New translations strings.xml (Galician) 2022-04-21 12:30:14 +02:00
Eugen Rochko
55e704ca15 New translations strings.xml (Galician) 2022-04-21 11:24:25 +02:00
Eugen Rochko
57dcab65f1 New translations short_description.txt (Italian) 2022-04-21 10:22:19 +02:00
Eugen Rochko
753dec4445 New translations full_description.txt (Italian) 2022-04-21 10:22:18 +02:00
Eugen Rochko
d0e6646cca New translations strings.xml (Italian) 2022-04-21 10:22:16 +02:00
Eugen Rochko
59b5bbb60e New translations short_description.txt (Galician) 2022-04-21 09:00:43 +02:00
Eugen Rochko
3c19b5754b New translations full_description.txt (Galician) 2022-04-21 09:00:42 +02:00
Eugen Rochko
8cddeef1fe New translations strings.xml (Galician) 2022-04-21 09:00:41 +02:00
Eugen Rochko
53b3943f10 New translations strings.xml (Italian) 2022-04-21 09:00:39 +02:00
Eugen Rochko
f63c71dd8f New translations title.txt (Galician) 2022-04-21 07:51:59 +02:00
Eugen Rochko
2274ac642d New translations short_description.txt (Galician) 2022-04-21 07:51:58 +02:00
Eugen Rochko
e56cecd267 New translations full_description.txt (Galician) 2022-04-21 07:51:57 +02:00
Eugen Rochko
590f6ac797 New translations strings.xml (Galician) 2022-04-21 07:51:56 +02:00
Eugen Rochko
24f8a1014c New translations title.txt (Italian) 2022-04-21 07:51:55 +02:00
Eugen Rochko
a9f2f49876 New translations short_description.txt (Italian) 2022-04-21 07:51:54 +02:00
Eugen Rochko
4602b77d43 New translations full_description.txt (Italian) 2022-04-21 07:51:54 +02:00
Eugen Rochko
65b6022a1e New translations strings.xml (Italian) 2022-04-21 07:51:53 +02:00
Eugen Rochko
3fa77ad412 New translations strings.xml (German) 2022-04-21 07:51:50 +02:00
Eugen Rochko
6b0a17ef2c New translations strings.xml (Ukrainian) 2022-04-21 04:15:57 +02:00
Eugen Rochko
e5a72b9699 New translations title.txt (Ukrainian) 2022-04-21 03:15:13 +02:00
Eugen Rochko
50e32862be New translations short_description.txt (Ukrainian) 2022-04-21 03:15:12 +02:00
Eugen Rochko
d58d07fd01 New translations full_description.txt (Ukrainian) 2022-04-21 03:15:11 +02:00
Eugen Rochko
7fabb924b9 New translations strings.xml (Ukrainian) 2022-04-21 03:15:10 +02:00
Eugen Rochko
02d9f743c1 New translations title.txt (Croatian) 2022-04-21 01:06:06 +02:00
Eugen Rochko
8af8214d4c New translations short_description.txt (Croatian) 2022-04-21 01:06:05 +02:00
Eugen Rochko
70abeddcc6 New translations full_description.txt (Croatian) 2022-04-21 01:06:04 +02:00
Eugen Rochko
c023f46172 New translations strings.xml (Croatian) 2022-04-21 01:06:03 +02:00
Eugen Rochko
142c6be4eb New translations short_description.txt (Basque) 2022-04-21 01:06:02 +02:00
Eugen Rochko
da3cb055c6 New translations full_description.txt (Basque) 2022-04-21 01:06:01 +02:00
Eugen Rochko
1fa2fbd9ba New translations strings.xml (Basque) 2022-04-21 01:06:00 +02:00
Eugen Rochko
c79e85eda5 New translations strings.xml (French) 2022-04-21 01:05:59 +02:00
Eugen Rochko
ea2474e5f8 New translations short_description.txt (Polish) 2022-04-20 23:42:16 +02:00
Eugen Rochko
c0b2e3a9fc New translations full_description.txt (Polish) 2022-04-20 23:42:15 +02:00
Eugen Rochko
82c6d99bb5 New translations strings.xml (Bosnian) 2022-04-20 23:42:14 +02:00
Eugen Rochko
1412432d32 New translations strings.xml (Polish) 2022-04-20 23:42:13 +02:00
Eugen Rochko
8e314146f2 New translations short_description.txt (Bosnian) 2022-04-20 22:46:11 +02:00
Eugen Rochko
9695a5a4de New translations short_description.txt (German) 2022-04-20 22:46:10 +02:00
Eugen Rochko
31d4ab18e2 New translations full_description.txt (Bosnian) 2022-04-20 22:46:09 +02:00
Eugen Rochko
005c07875d New translations full_description.txt (German) 2022-04-20 22:46:08 +02:00
Eugen Rochko
eb167bd217 New translations strings.xml (Bosnian) 2022-04-20 22:46:07 +02:00
Eugen Rochko
fc86407eac New translations strings.xml (French) 2022-04-20 22:46:05 +02:00
Eugen Rochko
1ec97650b0 New translations full_description.txt (German) 2022-04-20 21:50:25 +02:00
Eugen Rochko
dffbdfccc2 New translations full_description.txt (Catalan) 2022-04-20 21:50:24 +02:00
Eugen Rochko
111b499b04 New translations full_description.txt (Spanish) 2022-04-20 21:50:23 +02:00
Eugen Rochko
b71bbddf35 New translations strings.xml (Bosnian) 2022-04-20 21:50:21 +02:00
Eugen Rochko
d4cb5f82e1 New translations strings.xml (Russian) 2022-04-20 21:50:19 +02:00
Eugen Rochko
ab66dcaafb New translations strings.xml (Catalan) 2022-04-20 21:50:17 +02:00
Eugen Rochko
5e7bf73851 New translations short_description.txt (Catalan) 2022-04-20 21:50:15 +02:00
Eugen Rochko
066b131d95 New translations short_description.txt (Spanish) 2022-04-20 21:50:09 +02:00
Eugen Rochko
1caa17305e New translations short_description.txt (Russian) 2022-04-20 21:50:08 +02:00
Eugen Rochko
04f5f89cca New translations strings.xml (French) 2022-04-20 21:50:03 +02:00
Grishka
1ee55a643e Crash fixes 2022-04-20 22:38:20 +03:00
Eugen Rochko
1fa726178f New translations title.txt (Occitan) 2022-04-20 20:39:47 +02:00
Eugen Rochko
32f240188c New translations short_description.txt (Chinese Simplified) 2022-04-20 20:39:46 +02:00
Eugen Rochko
a6af059671 New translations short_description.txt (Chinese Traditional) 2022-04-20 20:39:45 +02:00
Eugen Rochko
007881f358 New translations short_description.txt (Portuguese, Brazilian) 2022-04-20 20:39:44 +02:00
Eugen Rochko
485f2821f2 New translations short_description.txt (Bosnian) 2022-04-20 20:39:43 +02:00
Eugen Rochko
2dcc622def New translations short_description.txt (Occitan) 2022-04-20 20:39:41 +02:00
Eugen Rochko
1bbfe4507e New translations title.txt (French) 2022-04-20 20:39:41 +02:00
Eugen Rochko
6d43dfd255 New translations title.txt (Spanish) 2022-04-20 20:39:40 +02:00
Eugen Rochko
c4f3b9f54d New translations title.txt (Catalan) 2022-04-20 20:39:39 +02:00
Eugen Rochko
0064e4d6f4 New translations title.txt (German) 2022-04-20 20:39:38 +02:00
Eugen Rochko
fe1e6d0c46 New translations title.txt (Greek) 2022-04-20 20:39:37 +02:00
Eugen Rochko
40bb3777d4 New translations title.txt (Basque) 2022-04-20 20:39:36 +02:00
Eugen Rochko
162343bee8 New translations short_description.txt (Turkish) 2022-04-20 20:39:35 +02:00
Eugen Rochko
733c18f6e2 New translations title.txt (Hebrew) 2022-04-20 20:39:34 +02:00
Eugen Rochko
10663b0a6f New translations title.txt (Korean) 2022-04-20 20:39:33 +02:00
Eugen Rochko
e8dca89de6 New translations title.txt (Polish) 2022-04-20 20:39:32 +02:00
Eugen Rochko
2923cf452f New translations title.txt (Portuguese) 2022-04-20 20:39:31 +02:00
Eugen Rochko
56b388700a New translations title.txt (Russian) 2022-04-20 20:39:30 +02:00
Eugen Rochko
0ec9632606 New translations title.txt (Swedish) 2022-04-20 20:39:29 +02:00
Eugen Rochko
680e729541 New translations title.txt (Turkish) 2022-04-20 20:39:28 +02:00
Eugen Rochko
f8ba72c242 New translations title.txt (Chinese Simplified) 2022-04-20 20:39:27 +02:00
Eugen Rochko
fcfad690de New translations title.txt (Chinese Traditional) 2022-04-20 20:39:26 +02:00
Eugen Rochko
1734501144 New translations title.txt (Portuguese, Brazilian) 2022-04-20 20:39:25 +02:00
Eugen Rochko
0904b82f4d New translations title.txt (Bosnian) 2022-04-20 20:39:25 +02:00
Eugen Rochko
8058a1fa56 New translations title.txt (Japanese) 2022-04-20 20:39:23 +02:00
Eugen Rochko
1eafdc9ed1 New translations short_description.txt (Swedish) 2022-04-20 20:39:23 +02:00
Eugen Rochko
65077dc7cc New translations short_description.txt (Russian) 2022-04-20 20:39:22 +02:00
Eugen Rochko
2764de76a5 New translations full_description.txt (Greek) 2022-04-20 20:39:21 +02:00
Eugen Rochko
4545c7ae0b New translations full_description.txt (German) 2022-04-20 20:39:20 +02:00
Eugen Rochko
1d458168e9 New translations full_description.txt (Catalan) 2022-04-20 20:39:19 +02:00
Eugen Rochko
7c6fbe45fd New translations full_description.txt (Spanish) 2022-04-20 20:39:18 +02:00
Eugen Rochko
4b408612fc New translations full_description.txt (French) 2022-04-20 20:39:17 +02:00
Eugen Rochko
f017ab078f New translations strings.xml (Bosnian) 2022-04-20 20:39:16 +02:00
Eugen Rochko
6cb4292feb New translations full_description.txt (Basque) 2022-04-20 20:39:13 +02:00
Eugen Rochko
f509f1009f New translations strings.xml (Turkish) 2022-04-20 20:39:12 +02:00
Eugen Rochko
3d795a3474 New translations strings.xml (Russian) 2022-04-20 20:39:11 +02:00
Eugen Rochko
b4fce77971 New translations strings.xml (German) 2022-04-20 20:39:07 +02:00
Eugen Rochko
9f01164d18 New translations strings.xml (Catalan) 2022-04-20 20:39:06 +02:00
Eugen Rochko
85fd234f15 New translations strings.xml (Spanish) 2022-04-20 20:39:04 +02:00
Eugen Rochko
630e925c4c New translations full_description.txt (Hebrew) 2022-04-20 20:39:03 +02:00
Eugen Rochko
9063049d73 New translations full_description.txt (Korean) 2022-04-20 20:39:02 +02:00
Eugen Rochko
3d81084ef2 New translations short_description.txt (Portuguese) 2022-04-20 20:39:01 +02:00
Eugen Rochko
002efcf02f New translations short_description.txt (Polish) 2022-04-20 20:39:00 +02:00
Eugen Rochko
315955243a New translations short_description.txt (Korean) 2022-04-20 20:38:59 +02:00
Eugen Rochko
a191b38592 New translations short_description.txt (Japanese) 2022-04-20 20:38:58 +02:00
Eugen Rochko
1b1eeb76e1 New translations short_description.txt (Hebrew) 2022-04-20 20:38:57 +02:00
Eugen Rochko
c6740f8a7e New translations short_description.txt (Basque) 2022-04-20 20:38:56 +02:00
Eugen Rochko
4b475b3680 New translations short_description.txt (Greek) 2022-04-20 20:38:55 +02:00
Eugen Rochko
3027a18c69 New translations short_description.txt (German) 2022-04-20 20:38:54 +02:00
Eugen Rochko
862cf42827 New translations short_description.txt (Catalan) 2022-04-20 20:38:53 +02:00
Eugen Rochko
b795f2a3f5 New translations short_description.txt (Spanish) 2022-04-20 20:38:53 +02:00
Eugen Rochko
429c543fd3 New translations full_description.txt (Japanese) 2022-04-20 20:38:52 +02:00
Eugen Rochko
0eeeb7a4c8 New translations short_description.txt (French) 2022-04-20 20:38:51 +02:00
Eugen Rochko
09872ab1a9 New translations full_description.txt (Bosnian) 2022-04-20 20:38:50 +02:00
Eugen Rochko
9b02b8aa6a New translations full_description.txt (Portuguese, Brazilian) 2022-04-20 20:38:49 +02:00
Eugen Rochko
d1807b886b New translations full_description.txt (Chinese Traditional) 2022-04-20 20:38:48 +02:00
Eugen Rochko
b5b4c1a760 New translations full_description.txt (Chinese Simplified) 2022-04-20 20:38:47 +02:00
Eugen Rochko
e692caac0c New translations full_description.txt (Turkish) 2022-04-20 20:38:46 +02:00
Eugen Rochko
d93cdec7a5 New translations full_description.txt (Swedish) 2022-04-20 20:38:45 +02:00
Eugen Rochko
a487eeb235 New translations full_description.txt (Russian) 2022-04-20 20:38:44 +02:00
Eugen Rochko
4b0c13c64d New translations full_description.txt (Portuguese) 2022-04-20 20:38:43 +02:00
Eugen Rochko
1f65236c11 New translations full_description.txt (Polish) 2022-04-20 20:38:42 +02:00
Eugen Rochko
ca4a6f83fb New translations full_description.txt (Occitan) 2022-04-20 20:38:41 +02:00
Grishka
5eb5a42465 Update crowdin.yml (please work this time) 2022-04-20 21:26:11 +03:00
Eugen Rochko
17474d63f7 New translations strings.xml (Occitan) 2022-04-20 20:18:54 +02:00
Eugen Rochko
5c5e0feb75 New translations strings.xml (German) 2022-04-20 20:18:53 +02:00
Eugen Rochko
b76783dc75 New translations strings.xml (Japanese) 2022-04-20 20:18:52 +02:00
Eugen Rochko
2f4568f59e New translations strings.xml (Portuguese) 2022-04-20 20:18:51 +02:00
Eugen Rochko
4862ad8584 New translations strings.xml (Russian) 2022-04-20 20:18:50 +02:00
Eugen Rochko
5caeb951b7 New translations strings.xml (Swedish) 2022-04-20 20:18:49 +02:00
Eugen Rochko
6fae00811e New translations strings.xml (Turkish) 2022-04-20 20:18:48 +02:00
Eugen Rochko
6e132ab8fb New translations strings.xml (Portuguese, Brazilian) 2022-04-20 20:18:47 +02:00
Eugen Rochko
95b5020e06 New translations strings.xml (Spanish) 2022-04-20 20:18:46 +02:00
Eugen Rochko
a4cd77b1df New translations strings.xml (Catalan) 2022-04-20 20:18:45 +02:00
Eugen Rochko
345a051fdd New translations strings.xml (Basque) 2022-04-20 20:18:44 +02:00
Eugen Rochko
840eea1980 New translations strings.xml (Hebrew) 2022-04-20 20:18:43 +02:00
Eugen Rochko
abb6d4bcc4 New translations strings.xml (Korean) 2022-04-20 20:18:42 +02:00
Eugen Rochko
b4329442b9 New translations strings.xml (Polish) 2022-04-20 20:18:41 +02:00
Eugen Rochko
293f3766c6 New translations strings.xml (Chinese Simplified) 2022-04-20 20:18:39 +02:00
Eugen Rochko
f6bd184a90 New translations strings.xml (Chinese Traditional) 2022-04-20 20:18:38 +02:00
Eugen Rochko
d9e89e58a0 New translations strings.xml (Bosnian) 2022-04-20 20:18:37 +02:00
Eugen Rochko
38d9483f06 New translations strings.xml (Greek) 2022-04-20 20:18:36 +02:00
Eugen Rochko
525c8fa8d6 New translations strings.xml (French) 2022-04-20 20:18:35 +02:00
Grishka
c9f54fb6cf Fix string 2022-04-20 21:18:04 +03:00
Grishka
6d2b391ba6 Remove string 2022-04-20 19:40:17 +03:00
Gregory K
6785885ebb Merge pull request #61 from mastodon/chore-crowdin-fastlane
Add fastlane metadata to Crowdin configuration
2022-04-20 19:30:11 +03:00
Grishka
f399f33a41 Fix Turkish and German strings 2022-04-20 19:29:47 +03:00
Eugen Rochko
9017cb42da Add fastlane metadata to Crowdin configuration 2022-04-20 18:20:58 +02:00
Gregory K
c274864419 Merge pull request #17 from EmirLogas/master
Add Turkish language
2022-04-20 19:12:42 +03:00
Gregory K
5c06b75a4d Merge pull request #13 from koyuawsmbrtn/master
Add German translation
2022-04-20 19:12:30 +03:00
Eugen Rochko
37f10f4db9 New translations strings.xml (Portuguese, Brazilian) 2022-04-20 18:01:59 +02:00
Eugen Rochko
77c2e8d6ac New translations strings.xml (Turkish) 2022-04-20 18:01:57 +02:00
Eugen Rochko
54476fabdc New translations strings.xml (Swedish) 2022-04-20 18:01:57 +02:00
Eugen Rochko
43ae3aa090 New translations strings.xml (Russian) 2022-04-20 18:01:54 +02:00
Eugen Rochko
fb050c5c20 New translations strings.xml (Portuguese) 2022-04-20 18:01:53 +02:00
Eugen Rochko
90fd49dbf7 New translations strings.xml (Japanese) 2022-04-20 18:01:51 +02:00
Eugen Rochko
2331710263 New translations strings.xml (German) 2022-04-20 18:01:50 +02:00
Eugen Rochko
287ddc388d New translations strings.xml (Spanish) 2022-04-20 18:01:49 +02:00
Eugen Rochko
ac8cbcdf39 New translations strings.xml (French) 2022-04-20 18:01:48 +02:00
Grishka
a294ad43d3 Add crowdin.yml 2022-04-20 18:57:48 +03:00
Grishka
07fe859e35 Fix compose autocomplete for emojis 2022-04-20 18:37:04 +03:00
Grishka
ad825d6803 Fix #43 2022-04-20 15:43:25 +03:00
Grishka
94c864c8ac Photo viewer & video player UI 2022-04-20 15:23:52 +03:00
Grishka
2e1f08a096 Accessibility improvements, close #39 2022-04-19 17:03:32 +03:00
Grishka
9276214433 Improve instance sorting 2022-04-19 15:51:23 +03:00
Grishka
957f3a2afd I'm dumb again 2022-04-19 07:58:38 +03:00
Grishka
b57df8e175 Use pattern-matching instanceof 2022-04-19 07:32:33 +03:00
Grishka
94b6189f36 Fix #34 2022-04-19 07:07:03 +03:00
Grishka
f267f68245 Crash fix 2022-04-19 07:03:35 +03:00
Grishka
5fff86a0c2 Update readme 2022-04-18 12:54:05 +03:00
Grishka
c6ff84ce10 Update gradle plugin, remove build tools version, set source to 17 2022-04-18 12:14:55 +03:00
Grishka
34ebd35fc0 Make instance catalog work if joinmastodon.org is unavailable 2022-04-15 17:12:12 +03:00
Grishka
19d0af01fd Show invite-only instances for login 2022-04-15 15:23:52 +03:00
Grishka
3928eee1df Onboarding/signup improvements, also fixes #14 2022-04-15 08:19:59 +03:00
Grishka
3a9be88ce6 Fix #18 2022-04-15 06:20:39 +03:00
Grishka
ced762e420 Open local statuses from links
Closes #10
2022-04-15 04:04:53 +03:00
Grishka
25a3135de8 Fixes 2022-04-15 03:53:30 +03:00
Grishka
886ae789f4 Renew FCM token on app update (#12) 2022-04-15 03:50:40 +03:00
Grishka
4566edcc4e Keep screen on during video playback (#7) 2022-04-15 02:14:03 +03:00
Emir
782ccf2633 Add Turkish language
Add Turkish language
2022-04-15 02:03:18 +03:00
Grishka
91ed70f8ba Fix #16 2022-04-15 01:24:28 +03:00
koyu
3715a400c3 Add German translation 2022-04-14 17:48:51 +02:00
Gregory K
801dc9c842 Merge pull request #6 from kyori19/fix-notification
Fix notification crashes caused by unknown notification type
2022-04-14 03:47:44 +03:00
kyori19
7f62470b9e Fix notification crashes caused by unknown notification type 2022-04-14 09:39:32 +09:00
Grishka
beb11bfb70 Add fastlane metadata (closes #2) 2022-04-13 23:23:22 +03:00
164 changed files with 5066 additions and 176 deletions

View File

@@ -8,7 +8,7 @@ Learn more about this app in the [blog post](https://blog.joinmastodon.org/2022/
## Building
As this app is using Java 15 features, you need JDK 15 or newer to build it. Other than that, everything is pretty standard. You can either import the project into Android Studio and build it from there, or run the following command in the project directory:
As this app is using Java 17 features, you need JDK 17 or newer to build it. Other than that, everything is pretty standard. You can either import the project into Android Studio and build it from there, or run the following command in the project directory:
```
./gradlew assembleRelease

View File

@@ -5,7 +5,7 @@ buildscript {
mavenCentral()
}
dependencies {
classpath "com.android.tools.build:gradle:7.0.4"
classpath "com.android.tools.build:gradle:7.1.3"
classpath "com.google.android.libraries.mapsplatform.secrets-gradle-plugin:secrets-gradle-plugin:2.0.1"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files

5
crowdin.yml Normal file
View File

@@ -0,0 +1,5 @@
files:
- source: /mastodon/src/main/res/values/strings.xml
translation: /mastodon/src/main/res/values-%android_code%/strings.xml
- source: /fastlane/metadata/android/en-US/*.txt
translation: /fastlane/metadata/android/%locale%/%original_file_name%

View File

@@ -0,0 +1,16 @@
Mastodon je največa decentralizovana socijalna mreža na internetu. Umjesto jednog websajta, ovo je netvork od nekoliko miliona korisnika na zasebnim platformama / zajednicama koje komuniciraju medjusobno i prenose podatke. Bez obzira čime se bavite, uvijek možete naći osobe sa slićnim interesima na Mastodonu!
Učlani se i napravi svoj profil. Potraži i prati osobe koje te zanimaju i gledaj njihove objave bez reklama. Izrazi svoja osjećanja odadtno koristeći smajlije, slike, GIF-ove, videa ili audio snimke. Limit je 500 znakova. Komentiraj ili prenesi objave na svoj profil od bilo koga ako vam se dopada sadrzaj. Potraži nove osobe ili popularne haštagove da obogatiš svoj netvork.
Mastodon je gradjen sa ciljem za bolju sigurnost i privatnost. Odluči da li objavljuješ nešto javno, samo prijateljima, samo osobama koje spomeneš ili cijelom svijetu. Napomene o osjetljivom sadrzaju vas obavjestavaju i pitaju za odobrenje ako zelite da ih vidite. Svaka platforma / zajednica ima svoja zasebna pravila koristenja i moderatore koji cuvaju platformu sigurnom,. Uz to imate opcije za blokadu bilo koga ili bilo cega sto vam se ne svidja.
Vise opcija:
Tamna pozadina: Citajte objave u svijetloj, tamnoj ili crnoj varijanti
Ankete: Pitajte pratioce za njihova misljenja i ocijene glasanjem
Izvidi: Hastagovi i korisnici su vam samo jedan klik udaljeni
Obavijesti: Primajte obavijesti o novim pratiocima, komentarima ili re-objavama
Dijeljenje: Objavljujte na Mastodonu sa bilo koje kompatibilne aplikacije
Ljepota: Nasa maskota je slon i vidjet cete ga s vremena na vrijeme
Mastodon je registrovan kao neprofitabilan i dalje finansiranje razvijanja direkntno zavisi od donacija. Nema reklamnog sadrzaja, nema monetizacije. Sve je besplatno i tako treba i da ostane.

View File

@@ -0,0 +1 @@
Decentralizovana socijalna mreža

View File

@@ -0,0 +1 @@
Mastodon

View File

@@ -0,0 +1,16 @@
Mastodon és la xarxa social descentralitzada més gran d'Internet. En lloc d'un únic lloc web, és una xarxa de milions d'usuaris en comunitats independents que poden interactuar entre ells sense problemes. No importa quines siguin la teva afició, pots conèixer gent apassionada que publica sobre ella a Mastodon!
Uneix-te a una comunitat i crea el teu perfil. Troba i segueix gent fascinant i llegeix les seves publicacions en una línia de temps cronològica sense anuncis. Expressa't amb emojis, imatges, GIF, vídeos i àudio personalitzats en publicacions de 500 caràcters. Respon als fils i impulsa les publicacions de qualsevol persona per compartir coses fantàstiques. Troba nous comptes per seguir i etiquetes en tendència per ampliar la teva xarxa.
Mastodon està construït amb un enfocament en la privadesa i la seguretat. Decideix si les teves publicacions es comparteixen amb els teus seguidors, només amb les persones que esmentes o amb tot el món. Els advertiments de contingut et permeten amagar publicacions que continguin material sensible o amagar-les fins que estiguis llest per consultar-les. Cada comunitat té les seves pròpies directrius i moderadors per mantenir els seus membres segurs, i les eines de bloqueig i informació robustes ajuden a prevenir l'abús.
Més funcionalitats:
• Mode fosc: Llegir entrades en mode clar, fosc o veritablement negre
• Enquestes: Pregunta als teus seguidors la seva opinió i compta els vots
• Explora: Etiquetes en tendència i comptes són a un sol toc
• Notificacions: Rep notificacions sobre nous seguidors, respostes i impulsos
• Compartir: Publica directament a Mastodon des de qualsevol full compartit de qualsevol aplicació
• Tendresa: La nostra mascota és un elefant adorable i veuràs que apareix de tant en tant
Mastodon és una organització sense ànim de lucre registrada i el desenvolupament se sosté directament amb les teves donacions. No hi ha publicitat, cap monetització i cap capital de risc, i planegem mantenir-ho així.

View File

@@ -0,0 +1 @@
Xarxa social descentralitzada

View File

@@ -0,0 +1 @@
Mastodon

View File

@@ -0,0 +1,16 @@
Mastodon ist das größte dezentralisierte soziale Netzwerk im Internet. Statt einer einzigen Website ist es ein Netzwerk von Millionen von Benutzer*innen in unabhängigen Gemeinschaften, die alle miteinander interagieren können. Egal was dich interessiert, auf Mastodon kannst du interessierte Leute treffen, die darüber schreiben!
Trete einer Gemeinschaft bei und erstelle dein Profil. Finde und verfolge faszinierende Leute und lese ihre Beiträge in einer werbefreien, chronologischen Zeitachse. Drücke dich mit benutzerdefinierten Emojis, Bilderns, GIFs, Videos und Audio in 500-Zeichen Beiträgen aus. Antworte auf Threads und teile Beiträge von anderen um großartige Sachen zu verbreiten. Finde neue Accounts zum Folgen und angesagte Hashtags, um dein Netzwerk zu erweitern.
Mastodon wurde mit einem Schwerpunkt auf Privatsphäre und Sicherheit gebaut. Entscheide, ob du deine Beiträge mit deinen Followern, nur mit den Menschen, die du erwähnst, oder mit der ganzen Welt teilen möchtest. Mit Inhaltswarnungen kannst du Beiträge mit sensiblem oder triggerndem Inhalt ausblenden, bis du bereit bist, dich damit auseinanderzusetzen. Jede Gemeinschaft hat ihre eigenen Regeln und Moderator*innen, um die Sicherheit ihrer Mitglieder zu gewährleisten, sowie robuste Sperr- und Meldewerkzeuge um Missbrauch vorzubeugen.
Weitere Funktionen:
• Dunkler Modus: Beiträge im hellen, dunklen oder schwarzen Modus lesen
• Umfragen: Frage deine Follower nach ihrer Meinung und zähle die Stimmen
• Entdecken: Trending Hashtags und Accounts sind nur einen Fingertipp entfernt
• Benachrichtigungen: Erhalte Benachrichtigungen über neue Follower, Antworten und geteilte Beiträge
• Teilen: Veröffentliche auf Mastodon aus jeder beliebigen anderen App
• Niedlichkeit: Unser Maskottchen ist ein entzückender Elefant und du wirst ihn von Zeit zu Zeit auftauchen sehen
Mastodon ist eine eingetragene gemeinnützige Organisation und die Entwicklung wird direkt durch deine Spenden unterstützt. Es gibt keine Werbung, keine Monetisierung und kein Venture-Capital, und wir planen es so zu erhalten.

View File

@@ -0,0 +1 @@
Dezentrales soziales Netzwerk

View File

@@ -0,0 +1 @@
Mastodon

View File

@@ -0,0 +1,16 @@
Mastodon is the largest decentralized social network on the internet. Instead of a single website, its a network of millions of users in independent communities that can all interact with one another, seamlessly. No matter what youre into, you can meet passionate people posting about it on Mastodon!
Join a community and create your profile. Find and and follow fascinating folks and read their posts in an ad-free, chronological timeline. Express yourself with custom emoji, images, GIFs, videos, and audio in 500-character posts. Reply to threads and reblog posts from anyone to share great stuff. Find new accounts to follow and trending hashtags to expand your network.
Mastodon is built with a focus on privacy and safety. Decide whether your posts are shared with your followers, just the people you mention, or the whole world. Content warnings let you hide posts containing sensitive or triggering material until you're ready to engage with them. Each community has its own guidelines and moderators to keep its members safe, and robust blocking and reporting tools help prevent abuse.
More features:
• Dark Mode: Read posts in light, dark, or true black mode
• Polls: Ask followers for their opinion and tally the votes
• Explore: Trending hashtags and accounts are a tap away
• Notifications: Get notified about new follows, replies, and reblogs
• Sharing: Post directly to Mastodon from any share sheet in any app
• Cuteness: Our mascot is an adorable elephant, and you'll see them pop up from time to time
Mastodon is a registered nonprofit and development is supported directly by your donations. Theres no advertising, no monetization, and no venture capital, and we plan to keep it that way.

View File

@@ -0,0 +1 @@
Decentralized social network

View File

@@ -0,0 +1 @@
Mastodon

View File

@@ -0,0 +1,16 @@
Mastodon is the largest decentralized social network on the internet. Instead of a single website, its a network of millions of users in independent communities that can all interact with one another, seamlessly. No matter what youre into, you can meet passionate people posting about it on Mastodon!
Join a community and create your profile. Find and and follow fascinating folks and read their posts in an ad-free, chronological timeline. Express yourself with custom emoji, images, GIFs, videos, and audio in 500-character posts. Reply to threads and reblog posts from anyone to share great stuff. Find new accounts to follow and trending hashtags to expand your network.
Mastodon is built with a focus on privacy and safety. Decide whether your posts are shared with your followers, just the people you mention, or the whole world. Content warnings let you hide posts containing sensitive or triggering material until you're ready to engage with them. Each community has its own guidelines and moderators to keep its members safe, and robust blocking and reporting tools help prevent abuse.
More features:
• Dark Mode: Read posts in light, dark, or true black mode
• Polls: Ask followers for their opinion and tally the votes
• Explore: Trending hashtags and accounts are a tap away
• Notifications: Get notified about new follows, replies, and reblogs
• Sharing: Post directly to Mastodon from any share sheet in any app
• Cuteness: Our mascot is an adorable elephant, and you'll see them pop up from time to time
Mastodon is a registered nonprofit and development is supported directly by your donations. Theres no advertising, no monetization, and no venture capital, and we plan to keep it that way.

Binary file not shown.

After

Width:  |  Height:  |  Size: 377 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 213 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 844 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 776 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 790 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

View File

@@ -0,0 +1 @@
Decentralized social network

View File

@@ -0,0 +1 @@
Mastodon

View File

@@ -0,0 +1,16 @@
Mastodon es la red social descentralizada más grande de internet. En lugar de ser una sola web, es una red de millones de usuarios en comunidades independientes que pueden interactuar entre ellas de forma transparente. No importa qué es lo que hagas, podrás encontrar gente apasionada escribiendo sobre ello en Mastodon!
Únete a una comunidad y crea tu perfil. Encuentra y sigue a gente fascinante y lee sus publicaciones sin anuncios y de forma cronológica. Exprésate con emoticonos personalizados, imágenes, GIFs, vídeos y audio en publicaciónes de 500 caracteres. Responde a hilos e impulsa publicaciones de cualquiera para compartir contenido genial. Encuentra nuevas cuentas para seguir y los hashtags de actualidad para expandir tu red.
Mastodon está construída con un enfoque en la privacidad y la seguridad. Decide si tus publicaciones se comparten con tus seguidores, solo a la gente que menciones, o a todo el mundo. Las advertencias de contenido te permiten esconder publicaciones con contenido sensible o limitarlas de tu visión hasta que estés listo para interactuar con ellas. Cada comunidad tiene sus propias reglas y moderadores para mantener a salvo a sus miembros, además de herramientas robustas para bloquear y reportar contenido para prevenir el abuso.
Más características:
• Modo oscuro: Lee las publicaciones en modo claro, oscuro o negro real
• Encuestas: Pide opinión a tus seguidores y cuenta los votos
• Explora: Hashtags y cuentas en tendencia a un solo toque
• Notificaciones: Recibe notificaciones sobre nuevos seguidores, respuestas e impulsos
• Compartir: Publica directamente a Mastodon desde cualquier hoja de acción en cualquier aplicación
• Preciosidad: Nuestra mascota es un elefante adorable, y verás que aparece de vez en cuando
Mastodon es una organización sin ánimo de lucro registrada y su desarrollo se financia directamente con tus donaciones. No hay publicidad, ni monetización, ni capital de riesgo, y tenemos previsto mantenerlo así.

View File

@@ -0,0 +1 @@
Red social descentralizada

View File

@@ -0,0 +1 @@
Mastodon

View File

@@ -0,0 +1,16 @@
Mastodon Interneteko sare sozial deszentralizatu handiena da. Webgune bakar bat izan ordez, beren artean elkarreragin dezaketen komunitate independenteetako milioika erabiltzailek osatutako sarea da. Zure interesak direnak direla ere, jende interesgarria aurkituko duzu Mastodonen!
Batu komunitate batera eta sortu zure profila. Bilatu eta jarraitu jende zoragarria eta irakurri beren bidalketak, publizitaterik gabeko denbora-lerro kronologikoan. Adierazi nahi duzuna 500 karaktereko bidalketetan emoji pertsonalizatuak, irudiak, GIFak, bideoak eta audioak erabiliz. Erantzun edozeinen hariak eta eman bultzada bidalketei edukiak partekatzeko. Bilatu jarraitzeko kontu berriak eta traolen joerak zure sarea zabaltzeko.
Mastodon pribatutasunean eta segurtasunean arreta jarriz eraikia dago. Erabaki zure bidalketak norekin partekatu: zure jarraitzaileekin, aipatzen dituzunekin edo mundu osoarekin. Edukiaren abisuek aukera ematen dute eduki sentibera edo zuregan eragina izan dezaketen bidalketak zuk erabaki arte ezkutatzeko. Komunitate bakoitzak bere gidalerro eta moderatzaileak ditu, bertako kideak seguru mantentzeko. Baita blokeatzeko eta salatzeko tresna sendoak ere abusuak galarazteko.
Ezaugarri gehiago:
• Modu iluna: Irakurri bidalketak modu argi, ilun edo benetako beltzean
• Inkestak: Galdetu jarraitzaileei beren iritzia eta zenbatu botoak
• Esploratu: Traolen joerak eta kontuak erraz aurkitu
• Jakinarazpenak: Jarraitzaile berrien, erantzunen edo bultzaden berri jaso
• Partekatzea: Argitaratu zuzenean Mastodonen edozein aplikaziotako partekatze-orritik
• Edertasuna: Gure maskota elefante maitagarri bat da eta tarteka agertuko zaizu
Mastodon erregistratutako irabazi asmorik gabeko elkartea da eta zure dohaintzen bidez babesten da garapena. Ez dago iragarkirik, irabazi asmorik eta inbertsio kapitalik, eta horrela jarraitzeko asmoa dugu.

View File

@@ -0,0 +1 @@
Sare sozial deszentralizatua

View File

@@ -0,0 +1 @@
Mastodon

View File

@@ -0,0 +1,16 @@
Mastodon is the largest decentralized social network on the internet. Instead of a single website, its a network of millions of users in independent communities that can all interact with one another, seamlessly. No matter what youre into, you can meet passionate people posting about it on Mastodon!
Join a community and create your profile. Find and and follow fascinating folks and read their posts in an ad-free, chronological timeline. Express yourself with custom emoji, images, GIFs, videos, and audio in 500-character posts. Reply to threads and reblog posts from anyone to share great stuff. Find new accounts to follow and trending hashtags to expand your network.
Mastodon is built with a focus on privacy and safety. Decide whether your posts are shared with your followers, just the people you mention, or the whole world. Content warnings let you hide posts containing sensitive or triggering material until you're ready to engage with them. Each community has its own guidelines and moderators to keep its members safe, and robust blocking and reporting tools help prevent abuse.
More features:
• Dark Mode: Read posts in light, dark, or true black mode
• Polls: Ask followers for their opinion and tally the votes
• Explore: Trending hashtags and accounts are a tap away
• Notifications: Get notified about new follows, replies, and reblogs
• Sharing: Post directly to Mastodon from any share sheet in any app
• Cuteness: Our mascot is an adorable elephant, and you'll see them pop up from time to time
Mastodon is a registered nonprofit and development is supported directly by your donations. Theres no advertising, no monetization, and no venture capital, and we plan to keep it that way.

View File

@@ -0,0 +1 @@
Decentralized social network

View File

@@ -0,0 +1 @@
Mastodon

View File

@@ -0,0 +1,16 @@
Mastodon é a rede social descentralizada máis grande de internet. Non é unha soa web, é unha rede de millóns de persoas en comunidades independentes que poden interactuar entre elas, sen problema. Sexan cales fosen os teus intereses, podes atopar persoas comentando ese tema en Mastodon!
Únete a unha comunidade e crea un perfil. Atopa e segue a persoas interesantes e lé o que publican, nunha cronoloxía limpa de publicidade e ordenada. Exprésate usando emojis personalizados, imaxes, GIFs, vídeos e audio con publicacións de 500 caracteres. Responde aos fíos e promove publicacións doutras persoas que creas relevantes. Atopa novas contas e segue os cancelos en voga para facer medrar a túa rede.
Mastodon está creado pensando na privacidade e seguridade. Decide con quen compartes as túas publicacións, só coas seguidoras ou persoas que mencionas, ou con todo o mundo. Os avisos sobre o contido permiten agochar contido sensible ou material que podería crear ansiedade ata que estás preparada para velo. Cada comunidade ten as súas normas e a moderación coida da seguridade das persoas da instancia, con ferramentas para denunciar e bloquear e así evitar abusos.
Máis características:
• Modo Escuro: ler publicacións en modo claro, escuro ou negro total
• Enquisas: pregúntalle ás seguidoras a súa opinión e recolle os votos
• Explorar: Cancelos e contas en voga fácilmente accesibles
• Notificacións: recibe notificacións sobre seguimentos, respostas e promocións
• Compartir: publica directamente en Mastodon desde o menú de calquera app
• Fermosiña: A nosa mascota é un elefante moi feitiño, que verás a miúdo por aquí
Mastodon é unha organización rexistrada sen ánimo de lucro cuxo desenvolvemento está financiado por doazóns. Non hai publicidade, nen monetización, sen inversións de capital risco, e pretendemos seguir así.

View File

@@ -0,0 +1 @@
Rede social descentralizada

View File

@@ -0,0 +1 @@
Mastodon

View File

@@ -0,0 +1,16 @@
Mastodon is the largest decentralized social network on the internet. Instead of a single website, its a network of millions of users in independent communities that can all interact with one another, seamlessly. No matter what youre into, you can meet passionate people posting about it on Mastodon!
Join a community and create your profile. Find and and follow fascinating folks and read their posts in an ad-free, chronological timeline. Express yourself with custom emoji, images, GIFs, videos, and audio in 500-character posts. Reply to threads and reblog posts from anyone to share great stuff. Find new accounts to follow and trending hashtags to expand your network.
Mastodon is built with a focus on privacy and safety. Decide whether your posts are shared with your followers, just the people you mention, or the whole world. Content warnings let you hide posts containing sensitive or triggering material until you're ready to engage with them. Each community has its own guidelines and moderators to keep its members safe, and robust blocking and reporting tools help prevent abuse.
More features:
• Dark Mode: Read posts in light, dark, or true black mode
• Polls: Ask followers for their opinion and tally the votes
• Explore: Trending hashtags and accounts are a tap away
• Notifications: Get notified about new follows, replies, and reblogs
• Sharing: Post directly to Mastodon from any share sheet in any app
• Cuteness: Our mascot is an adorable elephant, and you'll see them pop up from time to time
Mastodon is a registered nonprofit and development is supported directly by your donations. Theres no advertising, no monetization, and no venture capital, and we plan to keep it that way.

View File

@@ -0,0 +1 @@
Decentralized social network

View File

@@ -0,0 +1 @@
Mastodon

View File

@@ -0,0 +1,16 @@
Mastodon is the largest decentralized social network on the internet. Instead of a single website, its a network of millions of users in independent communities that can all interact with one another, seamlessly. No matter what youre into, you can meet passionate people posting about it on Mastodon!
Join a community and create your profile. Find and and follow fascinating folks and read their posts in an ad-free, chronological timeline. Express yourself with custom emoji, images, GIFs, videos, and audio in 500-character posts. Reply to threads and reblog posts from anyone to share great stuff. Find new accounts to follow and trending hashtags to expand your network.
Mastodon is built with a focus on privacy and safety. Decide whether your posts are shared with your followers, just the people you mention, or the whole world. Content warnings let you hide posts containing sensitive or triggering material until you're ready to engage with them. Each community has its own guidelines and moderators to keep its members safe, and robust blocking and reporting tools help prevent abuse.
More features:
• Dark Mode: Read posts in light, dark, or true black mode
• Polls: Ask followers for their opinion and tally the votes
• Explore: Trending hashtags and accounts are a tap away
• Notifications: Get notified about new follows, replies, and reblogs
• Sharing: Post directly to Mastodon from any share sheet in any app
• Cuteness: Our mascot is an adorable elephant, and you'll see them pop up from time to time
Mastodon is a registered nonprofit and development is supported directly by your donations. Theres no advertising, no monetization, and no venture capital, and we plan to keep it that way.

View File

@@ -0,0 +1 @@
Decentralized social network

View File

@@ -0,0 +1 @@
Mastodon

View File

@@ -0,0 +1,16 @@
Mastodon è il più grande social network decentralizzato su Internet. Invece di un singolo sito web, è una rete di milioni di utenti in comunità indipendenti che possono interagire tra loro, senza soluzione di continuità. Non importa cosa ti piaccia, puoi incontrare persone appassionate pubblicando a riguardo su Mastodon!
Unisciti a una comunità e crea il tuo profilo. Trova e segui persone affascinanti e leggi i loro messaggi in una timeline cronologica senza pubblicità. Esprimiti con emoji personalizzate, immagini, GIF, filmati e audio in 500 caratteri. Rispondi a thread e post condivisi da chiunque per condividere grandi cose. Trova nuovi account da seguire e hashtags in tendenza per espandere la tua rete.
Mastodon è costruito con attenzione sulla privacy e sulla sicurezza. Decidi se i tuoi post saranno visibili solo ai tuoi seguaci, alle persone che menzioni o al mondo intero. Gli avvertimenti sul contenuto ti permettono di nascondere i post contenenti materiale sensibile o provocatorio fino a quando non sarai pronto a interagire con loro. Ogni comunità ha le proprie linee guida e moderatori per mantenere i propri membri sicuri. Robusti strumenti di blocco e segnalazione aiutano a prevenire gli abusi.
Altre caratteristiche:
• Modalità Scura: Leggi i post in modo chiaro, scuro o in nero
• Sondaggi: Chiedi ai seguaci il loro parere e conteggia i voti
• Esplora: hashtags di tendenza e account sono a portata di tocco
• Notifiche: Ricevi una notifica su nuovi seguaci, risposte e condivisioni
• Condivisione: Pubblica direttamente su Mastodon da qualsiasi foglio di condivisione in qualsiasi app
• Bellezza: La nostra mascotte è un elefante adorabile, e lo vedrete apparire di tanto in tanto
Mastodon è una no-profit registrata e lo sviluppo è supportato direttamente dalle vostre donazioni. Non c'è pubblicità, monetizzazione e capitale di rischio, e abbiamo intenzione di mantenerlo in quel modo.

View File

@@ -0,0 +1 @@
Social network decentralizzato

View File

@@ -0,0 +1 @@
Mastodon

View File

@@ -0,0 +1,16 @@
Mastodon is the largest decentralized social network on the internet. Instead of a single website, its a network of millions of users in independent communities that can all interact with one another, seamlessly. No matter what youre into, you can meet passionate people posting about it on Mastodon!
Join a community and create your profile. Find and and follow fascinating folks and read their posts in an ad-free, chronological timeline. Express yourself with custom emoji, images, GIFs, videos, and audio in 500-character posts. Reply to threads and reblog posts from anyone to share great stuff. Find new accounts to follow and trending hashtags to expand your network.
Mastodon is built with a focus on privacy and safety. Decide whether your posts are shared with your followers, just the people you mention, or the whole world. Content warnings let you hide posts containing sensitive or triggering material until you're ready to engage with them. Each community has its own guidelines and moderators to keep its members safe, and robust blocking and reporting tools help prevent abuse.
More features:
• Dark Mode: Read posts in light, dark, or true black mode
• Polls: Ask followers for their opinion and tally the votes
• Explore: Trending hashtags and accounts are a tap away
• Notifications: Get notified about new follows, replies, and reblogs
• Sharing: Post directly to Mastodon from any share sheet in any app
• Cuteness: Our mascot is an adorable elephant, and you'll see them pop up from time to time
Mastodon is a registered nonprofit and development is supported directly by your donations. Theres no advertising, no monetization, and no venture capital, and we plan to keep it that way.

View File

@@ -0,0 +1 @@
Decentralized social network

View File

@@ -0,0 +1 @@
Mastodon

View File

@@ -0,0 +1,16 @@
Mastodon is the largest decentralized social network on the internet. Instead of a single website, its a network of millions of users in independent communities that can all interact with one another, seamlessly. No matter what youre into, you can meet passionate people posting about it on Mastodon!
Join a community and create your profile. Find and and follow fascinating folks and read their posts in an ad-free, chronological timeline. Express yourself with custom emoji, images, GIFs, videos, and audio in 500-character posts. Reply to threads and reblog posts from anyone to share great stuff. Find new accounts to follow and trending hashtags to expand your network.
Mastodon is built with a focus on privacy and safety. Decide whether your posts are shared with your followers, just the people you mention, or the whole world. Content warnings let you hide posts containing sensitive or triggering material until you're ready to engage with them. Each community has its own guidelines and moderators to keep its members safe, and robust blocking and reporting tools help prevent abuse.
More features:
• Dark Mode: Read posts in light, dark, or true black mode
• Polls: Ask followers for their opinion and tally the votes
• Explore: Trending hashtags and accounts are a tap away
• Notifications: Get notified about new follows, replies, and reblogs
• Sharing: Post directly to Mastodon from any share sheet in any app
• Cuteness: Our mascot is an adorable elephant, and you'll see them pop up from time to time
Mastodon is a registered nonprofit and development is supported directly by your donations. Theres no advertising, no monetization, and no venture capital, and we plan to keep it that way.

View File

@@ -0,0 +1 @@
Decentralized social network

View File

@@ -0,0 +1 @@
Mastodon

View File

@@ -0,0 +1,16 @@
Mastodon is the largest decentralized social network on the internet. Instead of a single website, its a network of millions of users in independent communities that can all interact with one another, seamlessly. No matter what youre into, you can meet passionate people posting about it on Mastodon!
Join a community and create your profile. Find and and follow fascinating folks and read their posts in an ad-free, chronological timeline. Express yourself with custom emoji, images, GIFs, videos, and audio in 500-character posts. Reply to threads and reblog posts from anyone to share great stuff. Find new accounts to follow and trending hashtags to expand your network.
Mastodon is built with a focus on privacy and safety. Decide whether your posts are shared with your followers, just the people you mention, or the whole world. Content warnings let you hide posts containing sensitive or triggering material until you're ready to engage with them. Each community has its own guidelines and moderators to keep its members safe, and robust blocking and reporting tools help prevent abuse.
More features:
• Dark Mode: Read posts in light, dark, or true black mode
• Polls: Ask followers for their opinion and tally the votes
• Explore: Trending hashtags and accounts are a tap away
• Notifications: Get notified about new follows, replies, and reblogs
• Sharing: Post directly to Mastodon from any share sheet in any app
• Cuteness: Our mascot is an adorable elephant, and you'll see them pop up from time to time
Mastodon is a registered nonprofit and development is supported directly by your donations. Theres no advertising, no monetization, and no venture capital, and we plan to keep it that way.

View File

@@ -0,0 +1 @@
Decentralized social network

View File

@@ -0,0 +1 @@
Mastodon

View File

@@ -0,0 +1,16 @@
Mastodon to największa zdecentralizowana sieć społecznościowa w Internecie. Zamiast jednej strony internetowej, jest to sieć milionów użytkowników w niezależnych społecznościach, które mogą ze sobą wchodzić w interakcje. Niezależnie od swoich zainteresowań, momżesz poznać interesujących ludzi piszących o nich na Mastodonie!
Dołącz do społeczności i utwórz swój profil. Poznaj i obserwuj fascynujących ludzi i czytaj ich wpisy w chronologicznym osi czasu. Wyrażaj siebie za pomocą niestandardowych emoji, obrazów, GIFów, filmów i audio w 500-znakowych wpisach. Reply to threads and reblog posts from anyone to share great stuff. Find new accounts to follow and trending hashtags to expand your network.
Mastodon is built with a focus on privacy and safety. Decide whether your posts are shared with your followers, just the people you mention, or the whole world. Content warnings let you hide posts containing sensitive or triggering material until you're ready to engage with them. Each community has its own guidelines and moderators to keep its members safe, and robust blocking and reporting tools help prevent abuse.
Więcej funkcji:
• Tryb ciemny: Czytaj wpisy w jasnym, ciemnym lub czarnym trybie
• Ankiety: Poproś obserwujących o ich opinię i poznaj ich głosy
• Explore: Trending hashtags and accounts are a tap away
• Powiadomienia: Otrzymuj powiadomienia o nowych obserwacjach, odpowiedziach i udostępnieniach
• Sharing: Post directly to Mastodon from any share sheet in any app
• Cuteness: Our mascot is an adorable elephant, and you'll see them pop up from time to time
Mastodon is a registered nonprofit and development is supported directly by your donations. Theres no advertising, no monetization, and no venture capital, and we plan to keep it that way.

View File

@@ -0,0 +1 @@
Zdecentralizowana sieć społecznościowa

View File

@@ -0,0 +1 @@
Mastodon

View File

@@ -0,0 +1,16 @@
Mastodon is the largest decentralized social network on the internet. Instead of a single website, its a network of millions of users in independent communities that can all interact with one another, seamlessly. No matter what youre into, you can meet passionate people posting about it on Mastodon!
Join a community and create your profile. Find and and follow fascinating folks and read their posts in an ad-free, chronological timeline. Express yourself with custom emoji, images, GIFs, videos, and audio in 500-character posts. Reply to threads and reblog posts from anyone to share great stuff. Find new accounts to follow and trending hashtags to expand your network.
Mastodon is built with a focus on privacy and safety. Decide whether your posts are shared with your followers, just the people you mention, or the whole world. Content warnings let you hide posts containing sensitive or triggering material until you're ready to engage with them. Each community has its own guidelines and moderators to keep its members safe, and robust blocking and reporting tools help prevent abuse.
More features:
• Dark Mode: Read posts in light, dark, or true black mode
• Polls: Ask followers for their opinion and tally the votes
• Explore: Trending hashtags and accounts are a tap away
• Notifications: Get notified about new follows, replies, and reblogs
• Sharing: Post directly to Mastodon from any share sheet in any app
• Cuteness: Our mascot is an adorable elephant, and you'll see them pop up from time to time
Mastodon is a registered nonprofit and development is supported directly by your donations. Theres no advertising, no monetization, and no venture capital, and we plan to keep it that way.

View File

@@ -0,0 +1 @@
Decentralized social network

View File

@@ -0,0 +1 @@
Mastodon

View File

@@ -0,0 +1,16 @@
Mastodon is the largest decentralized social network on the internet. Instead of a single website, its a network of millions of users in independent communities that can all interact with one another, seamlessly. No matter what youre into, you can meet passionate people posting about it on Mastodon!
Join a community and create your profile. Find and and follow fascinating folks and read their posts in an ad-free, chronological timeline. Express yourself with custom emoji, images, GIFs, videos, and audio in 500-character posts. Reply to threads and reblog posts from anyone to share great stuff. Find new accounts to follow and trending hashtags to expand your network.
Mastodon is built with a focus on privacy and safety. Decide whether your posts are shared with your followers, just the people you mention, or the whole world. Content warnings let you hide posts containing sensitive or triggering material until you're ready to engage with them. Each community has its own guidelines and moderators to keep its members safe, and robust blocking and reporting tools help prevent abuse.
More features:
• Dark Mode: Read posts in light, dark, or true black mode
• Polls: Ask followers for their opinion and tally the votes
• Explore: Trending hashtags and accounts are a tap away
• Notifications: Get notified about new follows, replies, and reblogs
• Sharing: Post directly to Mastodon from any share sheet in any app
• Cuteness: Our mascot is an adorable elephant, and you'll see them pop up from time to time
Mastodon is a registered nonprofit and development is supported directly by your donations. Theres no advertising, no monetization, and no venture capital, and we plan to keep it that way.

View File

@@ -0,0 +1 @@
Decentralized social network

View File

@@ -0,0 +1 @@
Mastodon

View File

@@ -0,0 +1,16 @@
Mastodon is the largest decentralized social network on the internet. Instead of a single website, its a network of millions of users in independent communities that can all interact with one another, seamlessly. No matter what youre into, you can meet passionate people posting about it on Mastodon!
Join a community and create your profile. Find and and follow fascinating folks and read their posts in an ad-free, chronological timeline. Express yourself with custom emoji, images, GIFs, videos, and audio in 500-character posts. Reply to threads and reblog posts from anyone to share great stuff. Find new accounts to follow and trending hashtags to expand your network.
Mastodon is built with a focus on privacy and safety. Decide whether your posts are shared with your followers, just the people you mention, or the whole world. Content warnings let you hide posts containing sensitive or triggering material until you're ready to engage with them. Each community has its own guidelines and moderators to keep its members safe, and robust blocking and reporting tools help prevent abuse.
More features:
• Dark Mode: Read posts in light, dark, or true black mode
• Polls: Ask followers for their opinion and tally the votes
• Explore: Trending hashtags and accounts are a tap away
• Notifications: Get notified about new follows, replies, and reblogs
• Sharing: Post directly to Mastodon from any share sheet in any app
• Cuteness: Our mascot is an adorable elephant, and you'll see them pop up from time to time
Mastodon is a registered nonprofit and development is supported directly by your donations. Theres no advertising, no monetization, and no venture capital, and we plan to keep it that way.

View File

@@ -0,0 +1 @@
Распределённая социальная сеть

View File

@@ -0,0 +1 @@
Mastodon

View File

@@ -0,0 +1,16 @@
Mastodon is the largest decentralized social network on the internet. Instead of a single website, its a network of millions of users in independent communities that can all interact with one another, seamlessly. No matter what youre into, you can meet passionate people posting about it on Mastodon!
Join a community and create your profile. Find and and follow fascinating folks and read their posts in an ad-free, chronological timeline. Express yourself with custom emoji, images, GIFs, videos, and audio in 500-character posts. Reply to threads and reblog posts from anyone to share great stuff. Find new accounts to follow and trending hashtags to expand your network.
Mastodon is built with a focus on privacy and safety. Decide whether your posts are shared with your followers, just the people you mention, or the whole world. Content warnings let you hide posts containing sensitive or triggering material until you're ready to engage with them. Each community has its own guidelines and moderators to keep its members safe, and robust blocking and reporting tools help prevent abuse.
More features:
• Dark Mode: Read posts in light, dark, or true black mode
• Polls: Ask followers for their opinion and tally the votes
• Explore: Trending hashtags and accounts are a tap away
• Notifications: Get notified about new follows, replies, and reblogs
• Sharing: Post directly to Mastodon from any share sheet in any app
• Cuteness: Our mascot is an adorable elephant, and you'll see them pop up from time to time
Mastodon is a registered nonprofit and development is supported directly by your donations. Theres no advertising, no monetization, and no venture capital, and we plan to keep it that way.

View File

@@ -0,0 +1 @@
Decentralized social network

View File

@@ -0,0 +1 @@
Mastodon

View File

@@ -0,0 +1,16 @@
Mastodon is the largest decentralized social network on the internet. Instead of a single website, its a network of millions of users in independent communities that can all interact with one another, seamlessly. No matter what youre into, you can meet passionate people posting about it on Mastodon!
Join a community and create your profile. Find and and follow fascinating folks and read their posts in an ad-free, chronological timeline. Express yourself with custom emoji, images, GIFs, videos, and audio in 500-character posts. Reply to threads and reblog posts from anyone to share great stuff. Find new accounts to follow and trending hashtags to expand your network.
Mastodon is built with a focus on privacy and safety. Decide whether your posts are shared with your followers, just the people you mention, or the whole world. Content warnings let you hide posts containing sensitive or triggering material until you're ready to engage with them. Each community has its own guidelines and moderators to keep its members safe, and robust blocking and reporting tools help prevent abuse.
More features:
• Dark Mode: Read posts in light, dark, or true black mode
• Polls: Ask followers for their opinion and tally the votes
• Explore: Trending hashtags and accounts are a tap away
• Notifications: Get notified about new follows, replies, and reblogs
• Sharing: Post directly to Mastodon from any share sheet in any app
• Cuteness: Our mascot is an adorable elephant, and you'll see them pop up from time to time
Mastodon is a registered nonprofit and development is supported directly by your donations. Theres no advertising, no monetization, and no venture capital, and we plan to keep it that way.

View File

@@ -0,0 +1 @@
Decentralized social network

View File

@@ -0,0 +1 @@
Mastodon

View File

@@ -0,0 +1,16 @@
Mastodon is the largest decentralized social network on the internet. Instead of a single website, its a network of millions of users in independent communities that can all interact with one another, seamlessly. No matter what youre into, you can meet passionate people posting about it on Mastodon!
Join a community and create your profile. Find and and follow fascinating folks and read their posts in an ad-free, chronological timeline. Express yourself with custom emoji, images, GIFs, videos, and audio in 500-character posts. Reply to threads and reblog posts from anyone to share great stuff. Find new accounts to follow and trending hashtags to expand your network.
Mastodon is built with a focus on privacy and safety. Decide whether your posts are shared with your followers, just the people you mention, or the whole world. Content warnings let you hide posts containing sensitive or triggering material until you're ready to engage with them. Each community has its own guidelines and moderators to keep its members safe, and robust blocking and reporting tools help prevent abuse.
More features:
• Dark Mode: Read posts in light, dark, or true black mode
• Polls: Ask followers for their opinion and tally the votes
• Explore: Trending hashtags and accounts are a tap away
• Notifications: Get notified about new follows, replies, and reblogs
• Sharing: Post directly to Mastodon from any share sheet in any app
• Cuteness: Our mascot is an adorable elephant, and you'll see them pop up from time to time
Mastodon is a registered nonprofit and development is supported directly by your donations. Theres no advertising, no monetization, and no venture capital, and we plan to keep it that way.

View File

@@ -0,0 +1 @@
Decentralized social network

View File

@@ -0,0 +1 @@
Mastodon

View File

@@ -0,0 +1,16 @@
Mastodon là mạng xã hội liên hợp lớn nhất trên internet. Thay vì một trang web duy nhất, nó là một mạng lưới hàng triệu người dùng trong các cộng đồng độc lập, tất cả đều có thể tương tác với nhau một cách liền mạch. Bất kể bạn thích gì, bạn đều có thể gặp gỡ những người đăng tút về nó trên Mastodon!
Tham gia một cộng đồng và tạo trang hồ sơ của bạn. Tìm, theo dõi những người thú vị và đọc tút của họ theo trình tự thời gian, không có quảng cáo. Thể hiện bản thân bằng emoji, hình ảnh, GIF, video và âm thanh trong tút tối đa 500 ký tự. Trả lời tút và đăng lại tút từ bất kỳ ai để chia sẻ những điều tuyệt vời. Tìm những người dùng mới để theo dõi và các hashtag xu hướng để mở rộng mạng lưới của bạn.
Mastodon được xây dựng tập trung vào sự riêng tư và an toàn. Quyết định xem tút của bạn được chia sẻ với những người theo dõi, chỉ những người bạn nhắc đến hay cả thế giới. Nội dung ẩn cho phép bạn ẩn các tút chứa nội dung nhạy cảm hoặc chơi chữ cho đến khi bạn sẵn sàng tương tác với chúng. Mỗi cộng đồng có các nguyên tắc riêng và kiểm duyệt viên riêng để giữ an toàn cho các thành viên, song song với các công cụ chặn và báo cáo mạnh mẽ giúp ngăn chặn hành vi bậy.
Tính năng khác:
• Chế độ Tối: Đọc tút ở chế độ sáng, tối hoặc đen
• Bình chọn: Hỏi cộng đồng về ý kiến của họ và đếm lượt bình chọn
• Khám phá: Xem hashtag xu hướng và tài khoản chỉ bằng một nhấn
• Thông báo: Nhận thông báo về người theo dõi, lượt trả lời và đăng lại mới
• Chia sẻ: Đăng trực tiếp lên Mastodon từ bất kỳ ứng dụng nào
• Đáng yêu: Linh vật của chúng tôi là một chú voi ma mút và bạn sẽ thấy anh ấy thỉnh thoảng xuất hiện
Mastodon là một tổ chức phi lợi nhuận đã đăng ký và được hỗ trợ trực tiếp bởi các khoản đóng góp của bạn. Không có quảng cáo, không kiếm tiền và không có vốn đầu tư mạo hiểm và chúng tôi dự định sẽ giữ nguyên như vậy.

View File

@@ -0,0 +1 @@
Mạng xã hội liên hợp

View File

@@ -0,0 +1 @@
Mastodon

View File

@@ -0,0 +1,16 @@
Mastodon is the largest decentralized social network on the internet. Instead of a single website, its a network of millions of users in independent communities that can all interact with one another, seamlessly. No matter what youre into, you can meet passionate people posting about it on Mastodon!
Join a community and create your profile. Find and and follow fascinating folks and read their posts in an ad-free, chronological timeline. Express yourself with custom emoji, images, GIFs, videos, and audio in 500-character posts. Reply to threads and reblog posts from anyone to share great stuff. Find new accounts to follow and trending hashtags to expand your network.
Mastodon is built with a focus on privacy and safety. Decide whether your posts are shared with your followers, just the people you mention, or the whole world. Content warnings let you hide posts containing sensitive or triggering material until you're ready to engage with them. Each community has its own guidelines and moderators to keep its members safe, and robust blocking and reporting tools help prevent abuse.
More features:
• Dark Mode: Read posts in light, dark, or true black mode
• Polls: Ask followers for their opinion and tally the votes
• Explore: Trending hashtags and accounts are a tap away
• Notifications: Get notified about new follows, replies, and reblogs
• Sharing: Post directly to Mastodon from any share sheet in any app
• Cuteness: Our mascot is an adorable elephant, and you'll see them pop up from time to time
Mastodon is a registered nonprofit and development is supported directly by your donations. Theres no advertising, no monetization, and no venture capital, and we plan to keep it that way.

View File

@@ -0,0 +1 @@
Decentralized social network

View File

@@ -0,0 +1 @@
Mastodon

View File

@@ -0,0 +1,16 @@
Mastodon is the largest decentralized social network on the internet. Instead of a single website, its a network of millions of users in independent communities that can all interact with one another, seamlessly. No matter what youre into, you can meet passionate people posting about it on Mastodon!
Join a community and create your profile. Find and and follow fascinating folks and read their posts in an ad-free, chronological timeline. Express yourself with custom emoji, images, GIFs, videos, and audio in 500-character posts. Reply to threads and reblog posts from anyone to share great stuff. Find new accounts to follow and trending hashtags to expand your network.
Mastodon is built with a focus on privacy and safety. Decide whether your posts are shared with your followers, just the people you mention, or the whole world. Content warnings let you hide posts containing sensitive or triggering material until you're ready to engage with them. Each community has its own guidelines and moderators to keep its members safe, and robust blocking and reporting tools help prevent abuse.
More features:
• Dark Mode: Read posts in light, dark, or true black mode
• Polls: Ask followers for their opinion and tally the votes
• Explore: Trending hashtags and accounts are a tap away
• Notifications: Get notified about new follows, replies, and reblogs
• Sharing: Post directly to Mastodon from any share sheet in any app
• Cuteness: Our mascot is an adorable elephant, and you'll see them pop up from time to time
Mastodon is a registered nonprofit and development is supported directly by your donations. Theres no advertising, no monetization, and no venture capital, and we plan to keep it that way.

View File

@@ -0,0 +1 @@
Decentralized social network

View File

@@ -0,0 +1 @@
Mastodon

View File

@@ -5,13 +5,12 @@ plugins {
android {
compileSdk 31
buildToolsVersion "33.0.0-rc1"
defaultConfig {
applicationId "org.joinmastodon.android"
minSdk 23
targetSdk 31
versionCode 27
versionName "1.0"
versionCode 30
versionName "1.0.1"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
@@ -36,8 +35,8 @@ android {
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_15
targetCompatibility JavaVersion.VERSION_15
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
coreLibraryDesugaringEnabled true
}
sourceSets{
@@ -59,7 +58,7 @@ dependencies {
implementation 'me.grishka.litex:dynamicanimation:1.1.0-alpha03'
implementation 'me.grishka.litex:viewpager:1.0.0'
implementation 'me.grishka.litex:viewpager2:1.0.0'
implementation 'me.grishka.appkit:appkit:1.2'
implementation 'me.grishka.appkit:appkit:1.2.2'
implementation 'com.google.code.gson:gson:2.8.9'
implementation 'org.jsoup:jsoup:1.14.3'
implementation 'com.squareup:otto:1.3.8'

View File

@@ -4,6 +4,7 @@
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28"/>
<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE"/>
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>

View File

@@ -124,7 +124,7 @@ public class PushNotificationReceiver extends BroadcastReceiver{
.setContentText(pn.body)
.setStyle(new Notification.BigTextStyle().bigText(pn.body))
.setSmallIcon(R.drawable.ic_ntf_logo)
.setContentIntent(PendingIntent.getActivity(context, accountID.hashCode() & 0xFFFF, contentIntent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_CANCEL_CURRENT))
.setContentIntent(PendingIntent.getActivity(context, accountID.hashCode() & 0xFFFF, contentIntent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT))
.setWhen(notification==null ? System.currentTimeMillis() : notification.createdAt.toEpochMilli())
.setShowWhen(true)
.setCategory(Notification.CATEGORY_SOCIAL)

View File

@@ -195,6 +195,9 @@ public class CacheController{
db.delete(table, null, null);
ContentValues values=new ContentValues(3);
for(Notification n:notifications){
if(n.type==null){
continue;
}
values.put("id", n.id);
values.put("json", MastodonAPIController.gson.toJson(n));
values.put("type", n.type.ordinal());

View File

@@ -96,10 +96,12 @@ public class PushSubscriptionManager{
public static void tryRegisterFCM(){
deviceToken=getPrefs().getString("deviceToken", null);
if(!TextUtils.isEmpty(deviceToken)){
registerAllAccountsForPush();
int tokenVersion=getPrefs().getInt("version", 0);
if(!TextUtils.isEmpty(deviceToken) && tokenVersion==BuildConfig.VERSION_CODE){
registerAllAccountsForPush(false);
return;
}
Log.i(TAG, "tryRegisterFCM: no token found or app was updated. Trying to get push token...");
Intent intent = new Intent("com.google.iid.TOKEN_REQUEST");
intent.setPackage(GSF_PACKAGE);
intent.putExtra(EXTRA_APPLICATION_PENDING_INTENT,
@@ -354,9 +356,9 @@ public class PushSubscriptionManager{
return info.toByteArray();
}
private static void registerAllAccountsForPush(){
private static void registerAllAccountsForPush(boolean forceReRegister){
for(AccountSession session:AccountSessionManager.getInstance().getLoggedInAccounts()){
if(session.pushSubscription==null)
if(session.pushSubscription==null || forceReRegister)
session.getPushSubscriptionManager().registerAccountForPush();
else if(session.needUpdatePushSettings)
session.getPushSubscriptionManager().updatePushSettings(session.pushSubscription);
@@ -371,9 +373,9 @@ public class PushSubscriptionManager{
deviceToken=intent.getStringExtra("registration_id");
if(deviceToken.startsWith(KID_VALUE))
deviceToken=deviceToken.substring(KID_VALUE.length()+1);
getPrefs().edit().putString("deviceToken", deviceToken).apply();
getPrefs().edit().putString("deviceToken", deviceToken).putInt("version", BuildConfig.VERSION_CODE).apply();
Log.i(TAG, "Successfully registered for FCM");
registerAllAccountsForPush();
registerAllAccountsForPush(true);
}else{
Log.e(TAG, "FCM registration intent did not contain registration_id: "+intent);
Bundle extras=intent.getExtras();

View File

@@ -51,6 +51,8 @@ public class AccountTimelineFragment extends StatusListFragment{
.setCallback(new SimpleCallback<>(this){
@Override
public void onSuccess(List<Status> result){
if(getActivity()==null)
return;
onDataLoaded(result, !result.isEmpty());
}
})

View File

@@ -150,9 +150,12 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
UsableRecyclerView list=(UsableRecyclerView) this.list;
for(int i=0; i<list.getChildCount(); i++){
RecyclerView.ViewHolder holder=list.getChildViewHolder(list.getChildAt(i));
if(holder instanceof ImageLoaderViewHolder){
for(int j=0; j<list.getImageCountForItem(holder.getAbsoluteAdapterPosition()); j++){
((ImageLoaderViewHolder) holder).clearImage(j);
if(holder instanceof ImageLoaderViewHolder ivh){
int pos=holder.getAbsoluteAdapterPosition();
if(pos<0)
continue;
for(int j=0;j<list.getImageCountForItem(pos);j++){
ivh.clearImage(j);
}
}
}
@@ -169,18 +172,18 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
public void openPhotoViewer(String parentID, Status _status, int attachmentIndex){
final Status status=_status.reblog!=null ? _status.reblog : _status;
currentPhotoViewer=new PhotoViewer(getActivity(), status.mediaAttachments, attachmentIndex, new PhotoViewer.Listener(){
private ImageStatusDisplayItem.Holder transitioningHolder;
private ImageStatusDisplayItem.Holder<?> transitioningHolder;
@Override
public void setPhotoViewVisibility(int index, boolean visible){
ImageStatusDisplayItem.Holder holder=findPhotoViewHolder(index);
ImageStatusDisplayItem.Holder<?> holder=findPhotoViewHolder(index);
if(holder!=null)
holder.photo.setAlpha(visible ? 1f : 0f);
}
@Override
public boolean startPhotoViewTransition(int index, @NonNull Rect outRect, @NonNull int[] outCornerRadius){
ImageStatusDisplayItem.Holder holder=findPhotoViewHolder(index);
ImageStatusDisplayItem.Holder<?> holder=findPhotoViewHolder(index);
if(holder!=null){
transitioningHolder=holder;
View view=transitioningHolder.photo;
@@ -223,7 +226,7 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
@Override
public Drawable getPhotoViewCurrentDrawable(int index){
ImageStatusDisplayItem.Holder holder=findPhotoViewHolder(index);
ImageStatusDisplayItem.Holder<?> holder=findPhotoViewHolder(index);
if(holder!=null)
return holder.photo.getDrawable();
return null;
@@ -234,14 +237,19 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
currentPhotoViewer=null;
}
private ImageStatusDisplayItem.Holder findPhotoViewHolder(int index){
@Override
public void onRequestPermissions(String[] permissions){
requestPermissions(permissions, PhotoViewer.PERMISSION_REQUEST);
}
private ImageStatusDisplayItem.Holder<?> findPhotoViewHolder(int index){
int offset=0;
for(StatusDisplayItem item:displayItems){
if(item.parentID.equals(parentID)){
if(item instanceof ImageStatusDisplayItem){
RecyclerView.ViewHolder holder=list.findViewHolderForAdapterPosition(getMainAdapterOffset()+offset+index);
if(holder instanceof ImageStatusDisplayItem.Holder){
return (ImageStatusDisplayItem.Holder) holder;
if(holder instanceof ImageStatusDisplayItem.Holder<?> imgHolder){
return imgHolder;
}
return null;
}
@@ -303,9 +311,9 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
position-=getMainAdapterOffset();
if(position>=0 && position<displayItems.size()){
StatusDisplayItem item=displayItems.get(position);
if(item instanceof ImageStatusDisplayItem){
PhotoLayoutHelper.TiledLayoutResult layout=((ImageStatusDisplayItem) item).tiledLayout;
PhotoLayoutHelper.TiledLayoutResult.Tile tile=((ImageStatusDisplayItem) item).thisTile;
if(item instanceof ImageStatusDisplayItem imgItem){
PhotoLayoutHelper.TiledLayoutResult layout=imgItem.tiledLayout;
PhotoLayoutHelper.TiledLayoutResult.Tile tile=imgItem.thisTile;
int spans=0;
for(int i=0;i<tile.colSpan;i++){
spans+=layout.columnSizes[tile.startCol+i];
@@ -323,7 +331,6 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
public void onConfigurationChanged(Configuration newConfig){
super.onConfigurationChanged(newConfig);
updateToolbar();
list.invalidateItemDecorations();
}
private void updateToolbar(){
@@ -331,6 +338,7 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
if(toolbar==null)
return;
toolbar.setOnClickListener(v->scrollToTop());
toolbar.setNavigationContentDescription(R.string.back);
}
protected int getMainAdapterOffset(){
@@ -390,8 +398,7 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
}
for(int i=0;i<list.getChildCount();i++){
RecyclerView.ViewHolder vh=list.getChildViewHolder(list.getChildAt(i));
if(vh instanceof PollFooterStatusDisplayItem.Holder){
PollFooterStatusDisplayItem.Holder footer=(PollFooterStatusDisplayItem.Holder) vh;
if(vh instanceof PollFooterStatusDisplayItem.Holder footer){
if(footer.getItemID().equals(holder.getItemID())){
footer.rebind();
break;
@@ -513,7 +520,7 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
protected <I extends StatusDisplayItem, H extends StatusDisplayItem.Holder<I>> H findHolderOfType(String id, Class<H> type){
for(int i=0;i<list.getChildCount();i++){
RecyclerView.ViewHolder holder=list.getChildViewHolder(list.getChildAt(i));
if(holder instanceof StatusDisplayItem.Holder && ((StatusDisplayItem.Holder<?>) holder).getItemID().equals(id) && type.isInstance(holder))
if(holder instanceof StatusDisplayItem.Holder<?> itemHolder && itemHolder.getItemID().equals(id) && type.isInstance(holder))
return type.cast(holder);
}
return null;
@@ -523,7 +530,7 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
ArrayList<H> holders=new ArrayList<>();
for(int i=0;i<list.getChildCount();i++){
RecyclerView.ViewHolder holder=list.getChildViewHolder(list.getChildAt(i));
if(holder instanceof StatusDisplayItem.Holder && ((StatusDisplayItem.Holder<?>) holder).getItemID().equals(id) && type.isInstance(holder))
if(holder instanceof StatusDisplayItem.Holder<?> itemHolder && itemHolder.getItemID().equals(id) && type.isInstance(holder))
holders.add(type.cast(holder));
}
return holders;
@@ -562,6 +569,20 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
super.onApplyWindowInsets(insets);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults){
if(requestCode==PhotoViewer.PERMISSION_REQUEST && currentPhotoViewer!=null){
currentPhotoViewer.onRequestPermissionsResult(permissions, grantResults);
}
}
@Override
public void onPause(){
super.onPause();
if(currentPhotoViewer!=null)
currentPhotoViewer.onPause();
}
protected class DisplayItemsAdapter extends UsableRecyclerView.Adapter<BindableViewHolder<StatusDisplayItem>> implements ImageLoaderRecyclerAdapter{
public DisplayItemsAdapter(){
@@ -597,8 +618,6 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
@Override
public ImageLoaderRequest getImageRequest(int position, int image){
if(position>=displayItems.size()) // TODO fix this in the image loader, these crashes are driving me crazy
return null;
return displayItems.get(position).getImageRequest(image);
}
@@ -644,8 +663,7 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
for(int i=0;i<parent.getChildCount();i++){
View child=parent.getChildAt(i);
RecyclerView.ViewHolder holder=parent.getChildViewHolder(child);
if(holder instanceof ImageStatusDisplayItem.Holder){
ImageStatusDisplayItem.Holder<?> imgHolder=(ImageStatusDisplayItem.Holder<?>) holder;
if(holder instanceof ImageStatusDisplayItem.Holder<?> imgHolder){
if(!imgHolder.getItem().status.spoilerRevealed && TextUtils.isEmpty(imgHolder.getItem().status.spoilerText)){
hiddenMediaPaint.setColor(0x80000000);
PhotoLayoutHelper.TiledLayoutResult.Tile tile=imgHolder.getItem().thisTile;
@@ -658,8 +676,7 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
for(int i=0;i<parent.getChildCount();i++){
View child=parent.getChildAt(i);
RecyclerView.ViewHolder holder=parent.getChildViewHolder(child);
if(holder instanceof ImageStatusDisplayItem.Holder){
ImageStatusDisplayItem.Holder<?> imgHolder=(ImageStatusDisplayItem.Holder<?>) holder;
if(holder instanceof ImageStatusDisplayItem.Holder<?> imgHolder){
if(!imgHolder.getItem().status.spoilerRevealed){
PhotoLayoutHelper.TiledLayoutResult.Tile tile=imgHolder.getItem().thisTile;
if(tile.startCol==0 && tile.startRow==0 && TextUtils.isEmpty(imgHolder.getItem().status.spoilerText)){
@@ -731,6 +748,7 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
}
private void rebuildMediaHiddenLayouts(int width){
currentMediaHiddenLayoutsWidth=width;
String title=getString(R.string.sensitive_content);
TextPaint titlePaint=new TextPaint(Paint.ANTI_ALIAS_FLAG);
titlePaint.setColor(getResources().getColor(R.color.gray_50));

View File

@@ -76,9 +76,9 @@ import org.joinmastodon.android.ui.text.ComposeHashtagOrMentionSpan;
import org.joinmastodon.android.ui.text.HtmlParser;
import org.joinmastodon.android.ui.utils.SimpleTextWatcher;
import org.joinmastodon.android.ui.utils.UiUtils;
import org.joinmastodon.android.ui.views.ComposeEditText;
import org.joinmastodon.android.ui.views.ComposeMediaLayout;
import org.joinmastodon.android.ui.views.ReorderableLinearLayout;
import org.joinmastodon.android.ui.views.ComposeEditText;
import org.joinmastodon.android.ui.views.SizeListenerLinearLayout;
import org.parceler.Parcel;
import org.parceler.Parcels;
@@ -91,17 +91,15 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import androidx.annotation.DrawableRes;
import me.grishka.appkit.Nav;
import me.grishka.appkit.api.Callback;
import me.grishka.appkit.api.ErrorResponse;
import me.grishka.appkit.fragments.OnBackPressedListener;
import me.grishka.appkit.fragments.ToolbarFragment;
import me.grishka.appkit.imageloader.ViewImageLoader;
import me.grishka.appkit.imageloader.requests.UrlImageLoaderRequest;
import me.grishka.appkit.utils.V;
public class ComposeFragment extends ToolbarFragment implements OnBackPressedListener, ComposeEditText.SelectionListener{
public class ComposeFragment extends MastodonToolbarFragment implements OnBackPressedListener, ComposeEditText.SelectionListener{
private static final int MEDIA_RESULT=717;
private static final int IMAGE_DESCRIPTION_RESULT=363;
@@ -211,6 +209,13 @@ public class ComposeFragment extends ToolbarFragment implements OnBackPressedLis
}
}
@Override
public void onDestroy(){
super.onDestroy();
if(uploadingAttachment!=null && uploadingAttachment.uploadRequest!=null)
uploadingAttachment.uploadRequest.cancel();
}
@Override
public void onAttach(Activity activity){
super.onAttach(activity);
@@ -409,14 +414,17 @@ public class ComposeFragment extends ToolbarFragment implements OnBackPressedLis
}
char firstChar=editable.charAt(spanStart);
String spanText=s.subSequence(spanStart, spanEnd).toString();
if(firstChar=='@' || firstChar=='#'){
Matcher matcher=HIGHLIGHT_PATTERN.matcher(spanText);
if(!matcher.find()){ // invalid mention, remove
if(firstChar=='@' || firstChar=='#' || firstChar==':'){
Matcher matcher=AUTO_COMPLETE_PATTERN.matcher(spanText);
char prevChar=spanStart>0 ? editable.charAt(spanStart-1) : ' ';
if(!matcher.find() || !Character.isWhitespace(prevChar)){ // invalid mention, remove
editable.removeSpan(span);
continue;
}else if(matcher.end()+spanStart<spanEnd){ // mention with something at the end, move the end offset
editable.setSpan(span, spanStart, spanStart+matcher.end(), Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
}
}else{
editable.removeSpan(span);
}
}
}
@@ -426,7 +434,6 @@ public class ComposeFragment extends ToolbarFragment implements OnBackPressedLis
updateCharCounter(s);
}
});
updateToolbar();
if(replyTo!=null){
replyText.setText(getString(R.string.in_reply_to, replyTo.account.displayName));
ArrayList<String> mentions=new ArrayList<>();
@@ -511,7 +518,6 @@ public class ComposeFragment extends ToolbarFragment implements OnBackPressedLis
public void onConfigurationChanged(Configuration newConfig){
super.onConfigurationChanged(newConfig);
emojiKeyboard.onConfigurationChanged();
updateToolbar();
}
@SuppressLint("NewApi")
@@ -549,7 +555,9 @@ public class ComposeFragment extends ToolbarFragment implements OnBackPressedLis
mainEditText.getText().replace(start, mainEditText.getSelectionEnd(), prefix+emoji.shortcode+':');
}
private void updateToolbar(){
@Override
protected void updateToolbar(){
super.updateToolbar();
getToolbar().setNavigationIcon(R.drawable.ic_fluent_dismiss_24_regular);
}

View File

@@ -30,7 +30,7 @@ import me.grishka.appkit.imageloader.ViewImageLoader;
import me.grishka.appkit.imageloader.requests.UrlImageLoaderRequest;
import me.grishka.appkit.utils.V;
public class ComposeImageDescriptionFragment extends ToolbarFragment{
public class ComposeImageDescriptionFragment extends MastodonToolbarFragment{
private String accountID, attachmentID;
private EditText edit;
private Button saveButton;

View File

@@ -212,8 +212,8 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene
private void onTabSelected(@IdRes int tab){
Fragment newFragment=fragmentForTab(tab);
if(tab==currentTab){
if(newFragment instanceof ScrollableToTop)
((ScrollableToTop) newFragment).scrollToTop();
if(newFragment instanceof ScrollableToTop scrollable)
scrollable.scrollToTop();
return;
}
getChildFragmentManager().beginTransaction().hide(fragmentForTab(currentTab)).show(newFragment).commit();
@@ -223,8 +223,7 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene
}
private void maybeTriggerLoading(Fragment newFragment){
if(newFragment instanceof LoaderFragment){
LoaderFragment lf=(LoaderFragment) newFragment;
if(newFragment instanceof LoaderFragment lf){
if(!lf.loaded && !lf.dataLoading)
lf.loadData();
}else if(newFragment instanceof DiscoverFragment){

View File

@@ -0,0 +1,33 @@
package org.joinmastodon.android.fragments;
import android.content.res.Configuration;
import android.os.Bundle;
import android.view.View;
import android.widget.Toolbar;
import org.joinmastodon.android.R;
import androidx.annotation.CallSuper;
import me.grishka.appkit.fragments.ToolbarFragment;
public abstract class MastodonToolbarFragment extends ToolbarFragment{
@Override
public void onViewCreated(View view, Bundle savedInstanceState){
super.onViewCreated(view, savedInstanceState);
updateToolbar();
}
@Override
public void onConfigurationChanged(Configuration newConfig){
super.onConfigurationChanged(newConfig);
updateToolbar();
}
@CallSuper
protected void updateToolbar(){
Toolbar toolbar=getToolbar();
if(toolbar!=null && toolbar.getNavigationIcon()!=null){
toolbar.setNavigationContentDescription(R.string.back);
}
}
}

View File

@@ -24,7 +24,7 @@ import me.grishka.appkit.fragments.BaseRecyclerFragment;
import me.grishka.appkit.fragments.ToolbarFragment;
import me.grishka.appkit.utils.V;
public class NotificationsFragment extends ToolbarFragment implements ScrollableToTop{
public class NotificationsFragment extends MastodonToolbarFragment implements ScrollableToTop{
private TabLayout tabLayout;
private ViewPager2 pager;
@@ -81,8 +81,7 @@ public class NotificationsFragment extends ToolbarFragment implements Scrollable
if(position==0)
return;
Fragment _page=getFragmentForPage(position);
if(_page instanceof BaseRecyclerFragment){
BaseRecyclerFragment page=(BaseRecyclerFragment) _page;
if(_page instanceof BaseRecyclerFragment<?> page){
if(!page.loaded && !page.isDataLoading())
page.loadData();
}
@@ -124,18 +123,6 @@ public class NotificationsFragment extends ToolbarFragment implements Scrollable
return view;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState){
super.onViewCreated(view, savedInstanceState);
updateToolbar();
}
@Override
public void onConfigurationChanged(Configuration newConfig){
super.onConfigurationChanged(newConfig);
updateToolbar();
}
@Override
public void scrollToTop(){
getFragmentForPage(pager.getCurrentItem()).scrollToTop();
@@ -146,7 +133,9 @@ public class NotificationsFragment extends ToolbarFragment implements Scrollable
allNotificationsFragment.loadData();
}
private void updateToolbar(){
@Override
protected void updateToolbar(){
super.updateToolbar();
getToolbar().setOutlineProvider(null);
}

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