Compare commits
376 Commits
refactor/p
...
2.1.4+fork
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
03cb0b3c47 | ||
|
|
53c454a59b | ||
|
|
d21ae9d94e | ||
|
|
453f082822 | ||
|
|
23843e9002 | ||
|
|
232d2e7e6d | ||
|
|
e9d73cbe32 | ||
|
|
4bb0597edf | ||
|
|
a00afd5d7f | ||
|
|
796bdf2893 | ||
|
|
5b7868b44e | ||
|
|
66e67231c8 | ||
|
|
58be2214a4 | ||
|
|
72a370aa84 | ||
|
|
9a41a2d6fb | ||
|
|
2629e0039c | ||
|
|
2cd98a6620 | ||
|
|
24048a677f | ||
|
|
283b56be5b | ||
|
|
debf8c52a1 | ||
|
|
7fdea9710f | ||
|
|
d2de62ee55 | ||
|
|
d706768112 | ||
|
|
1614213aae | ||
|
|
3045fe0357 | ||
|
|
5a35be0ebd | ||
|
|
22b1cd0d0b | ||
|
|
49f10bacb3 | ||
|
|
2926e5096e | ||
|
|
361f27d5df | ||
|
|
d068093c5a | ||
|
|
3bea1b7f3e | ||
|
|
5a34d9ffce | ||
|
|
240754b70a | ||
|
|
7973ad7042 | ||
|
|
8446dbe05d | ||
|
|
7b0313cc69 | ||
|
|
994ae0242c | ||
|
|
fd34be3c66 | ||
|
|
20785d53fe | ||
|
|
3cc1748231 | ||
|
|
079112b905 | ||
|
|
38aa55b371 | ||
|
|
e07c01018b | ||
|
|
08de4525eb | ||
|
|
062dca6a77 | ||
|
|
d9abb8dfa1 | ||
|
|
5bcbe19435 | ||
|
|
955b985d1a | ||
|
|
6d6ab789a3 | ||
|
|
ad8be2f7a3 | ||
|
|
64be55e406 | ||
|
|
6230f32135 | ||
|
|
30db82fc98 | ||
|
|
921589b9bb | ||
|
|
0b0de7a4e3 | ||
|
|
c790eaf9c0 | ||
|
|
2c7cef488b | ||
|
|
c26603e0ca | ||
|
|
e1e5c9b0bd | ||
|
|
96f0817c20 | ||
|
|
e0165a25f4 | ||
|
|
e465fb944a | ||
|
|
fb159b5a52 | ||
|
|
1a349f0bb8 | ||
|
|
034dfe551c | ||
|
|
1f713dc50e | ||
|
|
258df9546b | ||
|
|
2daabd6a7e | ||
|
|
1e96b76b33 | ||
|
|
6dd944341e | ||
|
|
5dca70c657 | ||
|
|
c6f2e8151f | ||
|
|
99135ebdd6 | ||
|
|
53348be732 | ||
|
|
023c1d1598 | ||
|
|
1d0c591cdb | ||
|
|
a03482fa53 | ||
|
|
bc5fd2530a | ||
|
|
0ca57c3d72 | ||
|
|
5d20697e07 | ||
|
|
2847a1fae0 | ||
|
|
4bd78f31f2 | ||
|
|
e6281f9bb5 | ||
|
|
2c83b5aa02 | ||
|
|
586d48c80e | ||
|
|
fff2c5a3f5 | ||
|
|
3411cf4e56 | ||
|
|
e126858e7a | ||
|
|
9e0b40d409 | ||
|
|
e362efb453 | ||
|
|
8095d3004a | ||
|
|
27f023863b | ||
|
|
af6fae4d86 | ||
|
|
8119049df1 | ||
|
|
b5c09a4398 | ||
|
|
14df6c4e05 | ||
|
|
5c34d38783 | ||
|
|
cfce3595f6 | ||
|
|
411b561a3a | ||
|
|
ff9c211f3c | ||
|
|
c8a650acd4 | ||
|
|
a8cca76392 | ||
|
|
5e2f653d30 | ||
|
|
418f87999c | ||
|
|
c330428c07 | ||
|
|
119537f45f | ||
|
|
9f09b437ab | ||
|
|
1141dd5875 | ||
|
|
a008a0ac9a | ||
|
|
5cf5267e49 | ||
|
|
df2246b71a | ||
|
|
7862fefe94 | ||
|
|
b59957bd90 | ||
|
|
e307f1cca2 | ||
|
|
de185e5a27 | ||
|
|
e1fbe2c96e | ||
|
|
d7babf1e4d | ||
|
|
1203de0015 | ||
|
|
e7148acefb | ||
|
|
88741b0db4 | ||
|
|
12f9a11f03 | ||
|
|
234972352d | ||
|
|
67448f9de5 | ||
|
|
9681256a06 | ||
|
|
7f44c2ca49 | ||
|
|
f355919660 | ||
|
|
928f24b460 | ||
|
|
40e54b165b | ||
|
|
57d6b33b58 | ||
|
|
6b02a2df68 | ||
|
|
6d56771aba | ||
|
|
56a83e66cd | ||
|
|
9f17f1600a | ||
|
|
1724d8a532 | ||
|
|
7b4be83781 | ||
|
|
52030b3b2d | ||
|
|
3b36434dff | ||
|
|
f73be653ce | ||
|
|
808c922637 | ||
|
|
ceef155e03 | ||
|
|
eb5a38d514 | ||
|
|
33d4e05e96 | ||
|
|
968668e38c | ||
|
|
097a18fa92 | ||
|
|
5a85420866 | ||
|
|
50cee02191 | ||
|
|
e7dbb9fdf7 | ||
|
|
e2b2361ad2 | ||
|
|
89fe1dc783 | ||
|
|
eaadd80eeb | ||
|
|
c8063e961e | ||
|
|
3057546c55 | ||
|
|
f90e799caa | ||
|
|
b4cdf35d36 | ||
|
|
cad0ad7a59 | ||
|
|
ca60003c39 | ||
|
|
0f030e0bac | ||
|
|
6d4f212a18 | ||
|
|
183b39bc24 | ||
|
|
27ad0c6fcf | ||
|
|
9944185424 | ||
|
|
72ca3d0204 | ||
|
|
53204a9998 | ||
|
|
c3624eddb3 | ||
|
|
e144d0ac6f | ||
|
|
ac8562aaa2 | ||
|
|
4f8c4c67d2 | ||
|
|
b5f661f1af | ||
|
|
0015f3f0bf | ||
|
|
c5d0fdd645 | ||
|
|
2d09ad44fb | ||
|
|
667fffd124 | ||
|
|
699233d8c7 | ||
|
|
56aabdc4a6 | ||
|
|
443e2c7a6f | ||
|
|
985b0f6e63 | ||
|
|
cc86edf276 | ||
|
|
4071b9342d | ||
|
|
c92ab11dcd | ||
|
|
f3a1e7cf58 | ||
|
|
ebcafbf90d | ||
|
|
b5f7135e38 | ||
|
|
8a3df3657b | ||
|
|
f71d1bc5d3 | ||
|
|
f293619189 | ||
|
|
68ec3499ea | ||
|
|
4b79d35854 | ||
|
|
54ec1d781a | ||
|
|
2b926ffa46 | ||
|
|
6bcdbaba34 | ||
|
|
a2beead3a5 | ||
|
|
e7a25e353d | ||
|
|
af04a01130 | ||
|
|
fe1cfa1d7b | ||
|
|
b248797bb0 | ||
|
|
f24eba08d3 | ||
|
|
0e89559a47 | ||
|
|
d7ab019107 | ||
|
|
858657799f | ||
|
|
d02a72e079 | ||
|
|
3be57d1b0b | ||
|
|
bed550e97c | ||
|
|
7e2619ea75 | ||
|
|
4b22f1d3a7 | ||
|
|
885b3e3c60 | ||
|
|
9dcc7e293f | ||
|
|
6a68cf5e41 | ||
|
|
1edcf847b5 | ||
|
|
f5aff4d262 | ||
|
|
29297be4a3 | ||
|
|
90b87529e0 | ||
|
|
39af05524d | ||
|
|
2c8246341a | ||
|
|
77e19b4d6f | ||
|
|
18857e6233 | ||
|
|
4aee67382b | ||
|
|
3656402277 | ||
|
|
e3fb2cd03c | ||
|
|
56e752c0b3 | ||
|
|
de7bc49f85 | ||
|
|
beeffdff91 | ||
|
|
90f84d628a | ||
|
|
b89e0b5c5a | ||
|
|
2dd983c803 | ||
|
|
bb895c88b2 | ||
|
|
e33d0e692c | ||
|
|
133c941dc8 | ||
|
|
62222cd1d9 | ||
|
|
5d358d79ff | ||
|
|
f724644d84 | ||
|
|
f71c4b1374 | ||
|
|
a921a925b0 | ||
|
|
0f08af8c03 | ||
|
|
d54a59dbee | ||
|
|
c6cd3995b0 | ||
|
|
54d06b7a23 | ||
|
|
1ec0505d52 | ||
|
|
be225f8bb4 | ||
|
|
f5732fd2ae | ||
|
|
17fc14de97 | ||
|
|
7c9d11fab0 | ||
|
|
24abf9d317 | ||
|
|
22bf8840d5 | ||
|
|
a1fbb733ce | ||
|
|
851fa70563 | ||
|
|
6cab15b4c6 | ||
|
|
aac89c354c | ||
|
|
a032f9af10 | ||
|
|
ec3670d562 | ||
|
|
96c3bd890a | ||
|
|
8a0852d1a4 | ||
|
|
77e2c6c09f | ||
|
|
af60c8ba4a | ||
|
|
70a2f1fc0b | ||
|
|
b7d06a47db | ||
|
|
f0a5799eea | ||
|
|
f0b2a25dce | ||
|
|
de1a3fb939 | ||
|
|
823344dfc0 | ||
|
|
a6e6143157 | ||
|
|
b5feab89b4 | ||
|
|
c2c31de433 | ||
|
|
775f799968 | ||
|
|
5cda112129 | ||
|
|
642aaec6da | ||
|
|
ff667d6aed | ||
|
|
5e98496ea6 | ||
|
|
972fe1d15b | ||
|
|
26eaa36faa | ||
|
|
c517f41595 | ||
|
|
56a6d7243f | ||
|
|
18e43dfc22 | ||
|
|
816f6370ef | ||
|
|
30866a5292 | ||
|
|
3e1403d18a | ||
|
|
ebc2b2e59d | ||
|
|
10c2ee9597 | ||
|
|
c9a796dbfe | ||
|
|
1ba185ea9c | ||
|
|
1a50c3ff5f | ||
|
|
35a85c3247 | ||
|
|
6a729fa97f | ||
|
|
923639a329 | ||
|
|
fd99879ffc | ||
|
|
a78be8bc1d | ||
|
|
abfb497577 | ||
|
|
a10b184508 | ||
|
|
f0ea6660e6 | ||
|
|
a829f25d56 | ||
|
|
deff3dd8e0 | ||
|
|
dab596f527 | ||
|
|
0c18ab2319 | ||
|
|
6c5fb5ea09 | ||
|
|
afe0c9e0db | ||
|
|
1f2213042f | ||
|
|
5edd2466f9 | ||
|
|
f3b3a1a577 | ||
|
|
068619b815 | ||
|
|
f121e94979 | ||
|
|
b5b52529d4 | ||
|
|
876bf73454 | ||
|
|
522dbf6e4a | ||
|
|
ae685095ba | ||
|
|
30d5fe2f12 | ||
|
|
2bf27c561c | ||
|
|
bbdc72323d | ||
|
|
6e335930f3 | ||
|
|
9b309939da | ||
|
|
faf2e5115d | ||
|
|
dc5d9412c8 | ||
|
|
fc0680d66f | ||
|
|
56c9a5433f | ||
|
|
60e473ee55 | ||
|
|
ae34ecd5c3 | ||
|
|
fd1caa8729 | ||
|
|
1182e5c60c | ||
|
|
d99d515dfa | ||
|
|
70a15e7d9c | ||
|
|
1691382369 | ||
|
|
b7da9c6d51 | ||
|
|
3426538dca | ||
|
|
63de2b200b | ||
|
|
ff1ee766dc | ||
|
|
f033411adf | ||
|
|
a738eaf8c0 | ||
|
|
5074aadd6e | ||
|
|
0854961470 | ||
|
|
227b077935 | ||
|
|
1e4358290a | ||
|
|
925169eb31 | ||
|
|
e1abeb9252 | ||
|
|
cbe0add211 | ||
|
|
299b524d62 | ||
|
|
31c094e696 | ||
|
|
a8038a2863 | ||
|
|
29933bb916 | ||
|
|
5ec0c078d8 | ||
|
|
e6287f1ff2 | ||
|
|
be9caf8905 | ||
|
|
f375142084 | ||
|
|
fd3668d520 | ||
|
|
d5e03e9d9e | ||
|
|
d62f094919 | ||
|
|
6d84f28600 | ||
|
|
209e603f2c | ||
|
|
1b4dc01c74 | ||
|
|
6aab8f6578 | ||
|
|
645af12c3f | ||
|
|
fadc42d72b | ||
|
|
fc831e7d42 | ||
|
|
2998ee9145 | ||
|
|
971c4e5879 | ||
|
|
48c53ee88b | ||
|
|
acf1fa15da | ||
|
|
1c3b28f9d7 | ||
|
|
e274cf89c0 | ||
|
|
8929482466 | ||
|
|
b570c8d946 | ||
|
|
b396ee7987 | ||
|
|
90856a414a | ||
|
|
ea19925be6 | ||
|
|
03b3775843 | ||
|
|
38b39751ae | ||
|
|
54a4b0fe41 | ||
|
|
3bf591c944 | ||
|
|
584a6bbfa3 | ||
|
|
0f803cd4fa | ||
|
|
167a14b8db | ||
|
|
81cbc2d10c | ||
|
|
9bd8aff99b | ||
|
|
a770828165 | ||
|
|
ab457035ff | ||
|
|
f886e4c1d2 | ||
|
|
464dc93d99 | ||
|
|
dcdfd3e5d3 |
2
.github/workflows/nightly-builds.yml
vendored
2
.github/workflows/nightly-builds.yml
vendored
@@ -13,7 +13,7 @@ jobs:
|
||||
- name: Checkout Appkit Repo
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
repository: grishka/appkit
|
||||
repository: LucasGGamerM/appkit
|
||||
|
||||
- name: set up JDK 17
|
||||
uses: actions/setup-java@v3
|
||||
|
||||
@@ -16,8 +16,8 @@ android {
|
||||
applicationId "org.joinmastodon.android.moshinda"
|
||||
minSdk 23
|
||||
targetSdk 33
|
||||
versionCode 101
|
||||
versionName "1.2.3+fork.101.moshinda"
|
||||
versionCode 102
|
||||
versionName "2.1.4+fork.102.moshinda"
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
resourceConfigurations += ['ar-rSA', 'ar-rDZ', 'be-rBY', 'bn-rBD', 'bs-rBA', 'ca-rES', 'cs-rCZ', 'da-rDK', 'de-rDE', 'el-rGR', 'es-rES', 'eu-rES', 'fa-rIR', 'fi-rFI', 'fil-rPH', 'fr-rFR', 'ga-rIE', 'gd-rGB', 'gl-rES', 'hi-rIN', 'hr-rHR', 'hu-rHU', 'hy-rAM', 'ig-rNG', 'in-rID', 'is-rIS', 'it-rIT', 'iw-rIL', 'ja-rJP', 'kab', 'ko-rKR', 'my-rMM', 'nl-rNL', 'no-rNO', 'oc-rFR', 'pl-rPL', 'pt-rBR', 'pt-rPT', 'ro-rRO', 'ru-rRU', 'si-rLK', 'sl-rSI', 'sv-rSE', 'th-rTH', 'tr-rTR', 'uk-rUA', 'ur-rIN', 'vi-rVN', 'zh-rCN', 'zh-rTW']
|
||||
}
|
||||
@@ -118,7 +118,7 @@ dependencies {
|
||||
implementation 'me.grishka.litex:viewpager:1.0.0'
|
||||
implementation 'me.grishka.litex:viewpager2:1.0.0'
|
||||
implementation 'me.grishka.litex:palette:1.0.0'
|
||||
implementation 'me.grishka.appkit:appkit:1.2.9'
|
||||
implementation 'me.grishka.appkit:appkit:1.2.14'
|
||||
implementation 'com.google.code.gson:gson:2.9.0'
|
||||
implementation 'org.jsoup:jsoup:1.14.3'
|
||||
implementation 'com.squareup:otto:1.3.8'
|
||||
|
||||
@@ -151,7 +151,7 @@ public class MainActivity extends FragmentStackActivity implements ProvidesAssis
|
||||
}
|
||||
|
||||
public void openSearchQuery(String q, String accountID, int progressText, boolean fromSearch){
|
||||
new GetSearchResults(q, null, true)
|
||||
new GetSearchResults(q, null, true, null, 0, 0)
|
||||
.setCallback(new Callback<>(){
|
||||
@Override
|
||||
public void onSuccess(SearchResults result){
|
||||
|
||||
@@ -182,6 +182,8 @@ public class PushNotificationReceiver extends BroadcastReceiver{
|
||||
List<NotificationChannel> channels=Arrays.stream(PushNotification.Type.values())
|
||||
.map(type->{
|
||||
NotificationChannel channel=new NotificationChannel(accountID+"_"+type, context.getString(type.localizedName), NotificationManager.IMPORTANCE_DEFAULT);
|
||||
channel.setLightColor(context.getColor(R.color.primary_700));
|
||||
channel.enableLights(true);
|
||||
channel.setGroup(accountID);
|
||||
return channel;
|
||||
})
|
||||
@@ -211,6 +213,7 @@ public class PushNotificationReceiver extends BroadcastReceiver{
|
||||
.setShowWhen(true)
|
||||
.setCategory(Notification.CATEGORY_SOCIAL)
|
||||
.setAutoCancel(true)
|
||||
.setLights(context.getColor(R.color.primary_700), 500, 1000)
|
||||
.setColor(context.getColor(R.color.shortcut_icon_background));
|
||||
|
||||
if (!GlobalUserPreferences.uniformNotificationIcon) {
|
||||
@@ -336,8 +339,8 @@ public class PushNotificationReceiver extends BroadcastReceiver{
|
||||
|
||||
CreateStatus.Request req=new CreateStatus.Request();
|
||||
req.status = initialText + input.toString();
|
||||
req.language = preferences.postingDefaultLanguage;
|
||||
req.visibility = preferences.postingDefaultVisibility;
|
||||
req.language = notification.status.language;
|
||||
req.visibility = (notification.status.visibility == StatusPrivacy.PUBLIC && GlobalUserPreferences.defaultToUnlistedReplies ? StatusPrivacy.UNLISTED : notification.status.visibility);
|
||||
req.inReplyToId = notification.status.id;
|
||||
|
||||
if (notification.status.hasSpoiler() &&
|
||||
|
||||
@@ -6,6 +6,7 @@ import org.joinmastodon.android.E;
|
||||
import org.joinmastodon.android.MastodonApp;
|
||||
import org.joinmastodon.android.api.requests.statuses.SetStatusBookmarked;
|
||||
import org.joinmastodon.android.api.requests.statuses.SetStatusFavorited;
|
||||
import org.joinmastodon.android.api.requests.statuses.SetStatusMuted;
|
||||
import org.joinmastodon.android.api.requests.statuses.SetStatusReblogged;
|
||||
import org.joinmastodon.android.events.StatusCountersUpdatedEvent;
|
||||
import org.joinmastodon.android.model.Status;
|
||||
@@ -23,6 +24,7 @@ public class StatusInteractionController{
|
||||
private final HashMap<String, SetStatusFavorited> runningFavoriteRequests=new HashMap<>();
|
||||
private final HashMap<String, SetStatusReblogged> runningReblogRequests=new HashMap<>();
|
||||
private final HashMap<String, SetStatusBookmarked> runningBookmarkRequests=new HashMap<>();
|
||||
private final HashMap<String, SetStatusMuted> runningMuteRequests=new HashMap<>();
|
||||
|
||||
public StatusInteractionController(String accountID, boolean updateCounters) {
|
||||
this.accountID=accountID;
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
package org.joinmastodon.android.api.requests.accounts;
|
||||
|
||||
import com.google.gson.reflect.TypeToken;
|
||||
|
||||
import org.joinmastodon.android.api.requests.HeaderPaginationRequest;
|
||||
import org.joinmastodon.android.model.Account;
|
||||
|
||||
public class GetAccountBlocks extends HeaderPaginationRequest<Account>{
|
||||
public GetAccountBlocks(String maxID, int limit){
|
||||
super(HttpMethod.GET, "/blocks", new TypeToken<>(){});
|
||||
if(maxID!=null)
|
||||
addQueryParameter("max_id", maxID);
|
||||
if(limit>0)
|
||||
addQueryParameter("limit", limit+"");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package org.joinmastodon.android.api.requests.accounts;
|
||||
|
||||
import com.google.gson.reflect.TypeToken;
|
||||
|
||||
import org.joinmastodon.android.api.requests.HeaderPaginationRequest;
|
||||
import org.joinmastodon.android.model.Account;
|
||||
|
||||
public class GetAccountMutes extends HeaderPaginationRequest<Account>{
|
||||
public GetAccountMutes(String maxID, int limit){
|
||||
super(HttpMethod.GET, "/mutes/", new TypeToken<>(){});
|
||||
if(maxID!=null)
|
||||
addQueryParameter("max_id", maxID);
|
||||
if(limit>0)
|
||||
addQueryParameter("limit", limit+"");
|
||||
}
|
||||
}
|
||||
@@ -6,18 +6,19 @@ import org.joinmastodon.android.model.Preferences;
|
||||
import org.joinmastodon.android.model.StatusPrivacy;
|
||||
|
||||
public class UpdateAccountCredentialsPreferences extends MastodonAPIRequest<Account>{
|
||||
public UpdateAccountCredentialsPreferences(Preferences preferences, Boolean locked, Boolean discoverable){
|
||||
public UpdateAccountCredentialsPreferences(Preferences preferences, Boolean locked, Boolean discoverable, Boolean indexable){
|
||||
super(HttpMethod.PATCH, "/accounts/update_credentials", Account.class);
|
||||
setRequestBody(new Request(locked, discoverable, new RequestSource(preferences.postingDefaultVisibility, preferences.postingDefaultLanguage)));
|
||||
setRequestBody(new Request(locked, discoverable, indexable, new RequestSource(preferences.postingDefaultVisibility, preferences.postingDefaultLanguage)));
|
||||
}
|
||||
|
||||
private static class Request{
|
||||
public Boolean locked, discoverable;
|
||||
public Boolean locked, discoverable, indexable;
|
||||
public RequestSource source;
|
||||
|
||||
public Request(Boolean locked, Boolean discoverable, RequestSource source){
|
||||
public Request(Boolean locked, Boolean discoverable, Boolean indexable, RequestSource source){
|
||||
this.locked=locked;
|
||||
this.discoverable=discoverable;
|
||||
this.indexable=indexable;
|
||||
this.source=source;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,9 @@ import org.joinmastodon.android.model.FilterContext;
|
||||
import java.util.EnumSet;
|
||||
import java.util.List;
|
||||
|
||||
import androidx.annotation.Keep;
|
||||
|
||||
@Keep
|
||||
class FilterRequest{
|
||||
public String title;
|
||||
public EnumSet<FilterContext> context;
|
||||
|
||||
@@ -4,13 +4,19 @@ import org.joinmastodon.android.api.MastodonAPIRequest;
|
||||
import org.joinmastodon.android.model.SearchResults;
|
||||
|
||||
public class GetSearchResults extends MastodonAPIRequest<SearchResults>{
|
||||
public GetSearchResults(String query, Type type, boolean resolve){
|
||||
public GetSearchResults(String query, Type type, boolean resolve, String maxID, int offset, int count){
|
||||
super(HttpMethod.GET, "/search", SearchResults.class);
|
||||
addQueryParameter("q", query);
|
||||
if(type!=null)
|
||||
addQueryParameter("type", type.name().toLowerCase());
|
||||
if(resolve)
|
||||
addQueryParameter("resolve", "true");
|
||||
if(maxID!=null)
|
||||
addQueryParameter("max_id", maxID);
|
||||
if(offset>0)
|
||||
addQueryParameter("offset", String.valueOf(offset));
|
||||
if(count>0)
|
||||
addQueryParameter("limit", String.valueOf(count));
|
||||
}
|
||||
|
||||
public GetSearchResults limit(int limit){
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
package org.joinmastodon.android.api.requests.statuses;
|
||||
|
||||
import org.joinmastodon.android.api.MastodonAPIRequest;
|
||||
import org.joinmastodon.android.model.Status;
|
||||
|
||||
public class SetStatusMuted extends MastodonAPIRequest<Status>{
|
||||
public SetStatusMuted(String id, boolean muted){
|
||||
super(HttpMethod.POST, "/statuses/"+id+"/"+(muted ? "mute" : "unmute"), Status.class);
|
||||
setRequestBody(new Object());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
package org.joinmastodon.android.api.requests.tags;
|
||||
|
||||
import org.joinmastodon.android.api.MastodonAPIRequest;
|
||||
import org.joinmastodon.android.model.Hashtag;
|
||||
|
||||
public class GetTag extends MastodonAPIRequest<Hashtag>{
|
||||
public GetTag(String tag){
|
||||
super(HttpMethod.GET, "/tags/"+tag, Hashtag.class);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package org.joinmastodon.android.api.requests.tags;
|
||||
|
||||
import org.joinmastodon.android.api.MastodonAPIRequest;
|
||||
import org.joinmastodon.android.model.Hashtag;
|
||||
|
||||
public class SetTagFollowed extends MastodonAPIRequest<Hashtag>{
|
||||
public SetTagFollowed(String tag, boolean followed){
|
||||
super(HttpMethod.POST, "/tags/"+tag+(followed ? "/follow" : "/unfollow"), Hashtag.class);
|
||||
setRequestBody(new Object());
|
||||
}
|
||||
}
|
||||
@@ -219,7 +219,7 @@ public class AccountSession{
|
||||
|
||||
public void savePreferencesIfPending(){
|
||||
if(preferencesNeedSaving){
|
||||
new UpdateAccountCredentialsPreferences(preferences, null, null)
|
||||
new UpdateAccountCredentialsPreferences(preferences, null, self.discoverable, self.source.indexable)
|
||||
.setCallback(new Callback<>(){
|
||||
@Override
|
||||
public void onSuccess(Account result){
|
||||
@@ -319,4 +319,8 @@ public class AccountSession{
|
||||
.map(instance->"https://"+domain+(instance.isAkkoma() ? "/images/avi.png" : "/avatars/original/missing.png"))
|
||||
.orElse("");
|
||||
}
|
||||
|
||||
public void updateAccountInfo(){
|
||||
AccountSessionManager.getInstance().updateSessionLocalInfo(this);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -315,7 +315,7 @@ public class AccountSessionManager{
|
||||
}
|
||||
|
||||
|
||||
private void updateSessionLocalInfo(AccountSession session){
|
||||
public void updateSessionLocalInfo(AccountSession session){
|
||||
new GetOwnAccount()
|
||||
.setCallback(new Callback<>(){
|
||||
@Override
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
package org.joinmastodon.android.events;
|
||||
|
||||
import org.joinmastodon.android.model.Status;
|
||||
|
||||
public class StatusMuteChangedEvent{
|
||||
public String id;
|
||||
public boolean muted;
|
||||
public Status status;
|
||||
|
||||
public StatusMuteChangedEvent(Status s){
|
||||
id=s.id;
|
||||
muted=s.muted;
|
||||
status=s;
|
||||
}
|
||||
}
|
||||
@@ -931,9 +931,9 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
|
||||
private Paint dividerPaint=new Paint();
|
||||
|
||||
{
|
||||
dividerPaint.setColor(UiUtils.getThemeColor(getActivity(), GlobalUserPreferences.showDividers ? R.attr.colorM3Outline : R.attr.colorM3Surface));
|
||||
dividerPaint.setColor(UiUtils.getThemeColor(getActivity(), GlobalUserPreferences.showDividers ? R.attr.colorM3OutlineVariant : R.attr.colorM3Surface));
|
||||
dividerPaint.setStyle(Paint.Style.STROKE);
|
||||
dividerPaint.setStrokeWidth(V.dp(0.5f));
|
||||
dividerPaint.setStrokeWidth(V.dp(1f));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1419,7 +1419,8 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
||||
boolean usePhotoPicker=photoPicker && UiUtils.isPhotoPickerAvailable();
|
||||
if(usePhotoPicker){
|
||||
intent=new Intent(MediaStore.ACTION_PICK_IMAGES);
|
||||
intent.putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, mediaViewController.getMaxAttachments()-mediaViewController.getMediaAttachmentsCount());
|
||||
if(mediaViewController.getMaxAttachments()-mediaViewController.getMediaAttachmentsCount()>1)
|
||||
intent.putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, mediaViewController.getMaxAttachments()-mediaViewController.getMediaAttachmentsCount());
|
||||
}else{
|
||||
intent=new Intent(Intent.ACTION_GET_CONTENT);
|
||||
intent.addCategory(Intent.CATEGORY_OPENABLE);
|
||||
@@ -1598,7 +1599,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
||||
} else {
|
||||
draftsBtn.setImageDrawable(getContext().getDrawable(GlobalUserPreferences.relocatePublishButton ? R.drawable.ic_fluent_clock_24_regular : R.drawable.ic_fluent_clock_20_regular));
|
||||
if(GlobalUserPreferences.relocatePublishButton){
|
||||
publishButtonRelocated.setImageResource(R.drawable.ic_fluent_send_24_selector);
|
||||
publishButtonRelocated.setImageResource(R.drawable.ic_fluent_send_24_regular);
|
||||
}
|
||||
resetPublishButtonText();
|
||||
}
|
||||
|
||||
@@ -274,16 +274,21 @@ public class EditTimelinesFragment extends MastodonRecyclerFragment<TimelineDefi
|
||||
|
||||
private boolean setTagListContent(NachoTextView editText, @Nullable List<String> tags) {
|
||||
if (tags == null || tags.isEmpty()) return false;
|
||||
editText.setText(String.join(",", tags));
|
||||
editText.chipifyAllUnterminatedTokens();
|
||||
editText.setText(tags);
|
||||
editText.chipifyAllUnterminatedTokens();
|
||||
return true;
|
||||
}
|
||||
|
||||
private NachoTextView prepareChipTextView(NachoTextView nacho) {
|
||||
nacho.addChipTerminator(',', BEHAVIOR_CHIPIFY_ALL);
|
||||
nacho.addChipTerminator('\n', BEHAVIOR_CHIPIFY_ALL);
|
||||
nacho.addChipTerminator(' ', BEHAVIOR_CHIPIFY_ALL);
|
||||
nacho.addChipTerminator(';', BEHAVIOR_CHIPIFY_ALL);
|
||||
//I’ll Be Back
|
||||
nacho.setChipTerminators(
|
||||
Map.of(
|
||||
',', BEHAVIOR_CHIPIFY_ALL,
|
||||
'\n', BEHAVIOR_CHIPIFY_ALL,
|
||||
' ', BEHAVIOR_CHIPIFY_ALL,
|
||||
';', BEHAVIOR_CHIPIFY_ALL
|
||||
)
|
||||
);
|
||||
nacho.enableEditChipOnTouch(true, true);
|
||||
nacho.setOnFocusChangeListener((v, hasFocus) -> nacho.chipifyAllUnterminatedTokens());
|
||||
return nacho;
|
||||
|
||||
@@ -13,18 +13,29 @@ import android.widget.Toast;
|
||||
|
||||
import org.joinmastodon.android.E;
|
||||
import org.joinmastodon.android.R;
|
||||
import org.joinmastodon.android.api.requests.filters.CreateFilter;
|
||||
import org.joinmastodon.android.api.requests.filters.DeleteFilter;
|
||||
import org.joinmastodon.android.api.requests.filters.GetFilters;
|
||||
import org.joinmastodon.android.api.requests.tags.GetHashtag;
|
||||
import org.joinmastodon.android.api.requests.tags.SetHashtagFollowed;
|
||||
import org.joinmastodon.android.api.requests.timelines.GetHashtagTimeline;
|
||||
import org.joinmastodon.android.events.HashtagUpdatedEvent;
|
||||
import org.joinmastodon.android.fragments.settings.EditFilterFragment;
|
||||
import org.joinmastodon.android.model.Filter;
|
||||
import org.joinmastodon.android.model.FilterAction;
|
||||
import org.joinmastodon.android.model.FilterContext;
|
||||
import org.joinmastodon.android.model.FilterKeyword;
|
||||
import org.joinmastodon.android.model.Hashtag;
|
||||
import org.joinmastodon.android.model.Status;
|
||||
import org.joinmastodon.android.model.TimelineDefinition;
|
||||
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||
import org.joinmastodon.android.utils.StatusFilterPredicate;
|
||||
import org.parceler.Parcels;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.EnumSet;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import me.grishka.appkit.Nav;
|
||||
@@ -41,6 +52,8 @@ public class HashtagTimelineFragment extends PinnableStatusListFragment {
|
||||
private boolean following;
|
||||
private boolean localOnly;
|
||||
private MenuItem followButton;
|
||||
private MenuItem muteButton;
|
||||
private Optional<Filter> filter = Optional.empty();
|
||||
|
||||
@Override
|
||||
protected boolean wantsComposeButton() {
|
||||
@@ -72,13 +85,19 @@ public class HashtagTimelineFragment extends PinnableStatusListFragment {
|
||||
E.post(new HashtagUpdatedEvent(hashtag, following));
|
||||
}
|
||||
|
||||
private void updateMuteState(boolean newMute) {
|
||||
muteButton.setTitle(getString(newMute ? R.string.unmute_user : R.string.mute_user, "#" + hashtag));
|
||||
muteButton.setIcon(newMute ? R.drawable.ic_fluent_speaker_2_24_regular : R.drawable.ic_fluent_speaker_off_24_regular);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
||||
inflater.inflate(R.menu.hashtag_timeline, menu);
|
||||
super.onCreateOptionsMenu(menu, inflater);
|
||||
followButton = menu.findItem(R.id.follow_hashtag);
|
||||
updateFollowingState(following);
|
||||
|
||||
muteButton = menu.findItem(R.id.mute_hashtag);
|
||||
updateMuteState(filter.isPresent());
|
||||
new GetHashtag(hashtag).setCallback(new Callback<>() {
|
||||
@Override
|
||||
public void onSuccess(Hashtag hashtag) {
|
||||
@@ -92,6 +111,20 @@ public class HashtagTimelineFragment extends PinnableStatusListFragment {
|
||||
error.showToast(getActivity());
|
||||
}
|
||||
}).exec(accountID);
|
||||
|
||||
new GetFilters().setCallback(new Callback<>() {
|
||||
@Override
|
||||
public void onSuccess(List<Filter> filters) {
|
||||
if (getActivity() == null) return;
|
||||
filter=filters.stream().filter(filter->filter.title.equals("#"+hashtag)).findAny();
|
||||
updateMuteState(filter.isPresent());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(ErrorResponse error) {
|
||||
error.showToast(getActivity());
|
||||
}
|
||||
}).exec(accountID);
|
||||
}
|
||||
|
||||
|
||||
@@ -116,10 +149,58 @@ public class HashtagTimelineFragment extends PinnableStatusListFragment {
|
||||
}
|
||||
}).exec(accountID);
|
||||
return true;
|
||||
} else if (item.getItemId() == R.id.mute_hashtag) {
|
||||
showMuteDialog(filter.isPresent());
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private void showMuteDialog(boolean mute) {
|
||||
UiUtils.showConfirmationAlert(getContext(),
|
||||
mute ? R.string.mo_unmute_hashtag : R.string.mo_mute_hashtag,
|
||||
mute ? R.string.mo_confirm_to_unmute_hashtag : R.string.mo_confirm_to_mute_hashtag,
|
||||
mute ? R.string.do_unmute : R.string.do_mute,
|
||||
mute ? R.drawable.ic_fluent_speaker_2_28_regular : R.drawable.ic_fluent_speaker_off_28_regular,
|
||||
mute ? this::unmuteHashtag : this::muteHashtag
|
||||
);
|
||||
}
|
||||
private void unmuteHashtag() {
|
||||
//safe to get, this only called if filter is present
|
||||
new DeleteFilter(filter.get().id).setCallback(new Callback<>(){
|
||||
@Override
|
||||
public void onSuccess(Void result){
|
||||
filter=Optional.empty();
|
||||
updateMuteState(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(ErrorResponse error){
|
||||
error.showToast(getContext());
|
||||
}
|
||||
}).exec(accountID);
|
||||
}
|
||||
|
||||
private void muteHashtag() {
|
||||
FilterKeyword hashtagFilter=new FilterKeyword();
|
||||
hashtagFilter.wholeWord=true;
|
||||
hashtagFilter.keyword="#"+hashtag;
|
||||
new CreateFilter("#"+hashtag, EnumSet.of(FilterContext.HOME), FilterAction.HIDE, 0 , List.of(hashtagFilter)).setCallback(new Callback<>(){
|
||||
@Override
|
||||
public void onSuccess(Filter result){
|
||||
filter=Optional.of(result);
|
||||
updateMuteState(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(ErrorResponse error){
|
||||
error.showToast(getContext());
|
||||
}
|
||||
}).exec(accountID);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
protected TimelineDefinition makeTimelineDefinition() {
|
||||
return TimelineDefinition.ofHashtag(hashtag);
|
||||
|
||||
@@ -189,6 +189,7 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene
|
||||
});
|
||||
}
|
||||
}
|
||||
tabBar.selectTab(currentTab);
|
||||
|
||||
return content;
|
||||
}
|
||||
|
||||
@@ -2,6 +2,8 @@ package org.joinmastodon.android.fragments;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toolbar;
|
||||
|
||||
import org.joinmastodon.android.R;
|
||||
@@ -38,12 +40,11 @@ public abstract class MastodonRecyclerFragment<T> extends BaseRecyclerFragment<T
|
||||
@CallSuper
|
||||
public void onViewCreated(View view, Bundle savedInstanceState){
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
if (getParentFragment() instanceof HasElevationOnScrollListener elevator)
|
||||
list.addOnScrollListener(elevator.getElevationOnScrollListener());
|
||||
else if(wantsElevationOnScrollEffect())
|
||||
if(wantsElevationOnScrollEffect())
|
||||
list.addOnScrollListener(elevationOnScrollListener=new ElevationOnScrollListener((FragmentRootLinearLayout) view, getViewsForElevationEffect()));
|
||||
if(refreshLayout!=null)
|
||||
if(refreshLayout!=null){
|
||||
setRefreshLayoutColors(refreshLayout);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -38,6 +38,7 @@ import org.parceler.Parcels;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
@@ -93,7 +94,7 @@ public class NotificationsListFragment extends BaseStatusListFragment<Notificati
|
||||
}else{
|
||||
titleItem=new NotificationHeaderStatusDisplayItem(n.id, this, n, accountID);
|
||||
}
|
||||
if (n.type == Notification.Type.FOLLOW_REQUEST) {
|
||||
if (n.type == Notification.Type.FOLLOW_REQUEST || n.type == Notification.Type.FOLLOW) {
|
||||
ArrayList<StatusDisplayItem> items = new ArrayList<>();
|
||||
items.add(titleItem);
|
||||
items.add(new AccountCardStatusDisplayItem(n.id, this, accountID, n.account, n));
|
||||
@@ -134,6 +135,13 @@ public class NotificationsListFragment extends BaseStatusListFragment<Notificati
|
||||
public void onSuccess(PaginatedResponse<List<Notification>> result){
|
||||
if(getActivity()==null)
|
||||
return;
|
||||
|
||||
Set<String> needRelationships=result.items.stream()
|
||||
.filter(ntf->ntf.status==null && !relationships.containsKey(ntf.account.id))
|
||||
.map(ntf->ntf.account.id)
|
||||
.collect(Collectors.toSet());
|
||||
loadRelationships(needRelationships);
|
||||
|
||||
maxID=result.maxID;
|
||||
onDataLoaded(result.items.stream().filter(n->n.type!=null).collect(Collectors.toList()), !result.items.isEmpty());
|
||||
reloadingFromCache=false;
|
||||
@@ -143,6 +151,17 @@ public class NotificationsListFragment extends BaseStatusListFragment<Notificati
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onRelationshipsLoaded(){
|
||||
if(getActivity()==null)
|
||||
return;
|
||||
for(int i=0;i<list.getChildCount();i++){
|
||||
RecyclerView.ViewHolder holder=list.getChildViewHolder(list.getChildAt(i));
|
||||
if(holder instanceof AccountCardStatusDisplayItem.Holder accountHolder)
|
||||
accountHolder.rebind();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onShown(){
|
||||
|
||||
@@ -44,7 +44,7 @@ import me.grishka.appkit.utils.V;
|
||||
import me.grishka.appkit.views.UsableRecyclerView;
|
||||
|
||||
public class ProfileAboutFragment extends Fragment implements WindowInsetsAwareFragment{
|
||||
static final int MAX_FIELDS=Integer.MAX_VALUE;
|
||||
static final int MAX_FIELDS=4;
|
||||
|
||||
public UsableRecyclerView list;
|
||||
private List<AccountField> fields=Collections.emptyList();
|
||||
|
||||
@@ -68,8 +68,10 @@ import org.joinmastodon.android.api.requests.accounts.SetPrivateNote;
|
||||
import org.joinmastodon.android.api.requests.accounts.UpdateAccountCredentials;
|
||||
import org.joinmastodon.android.api.requests.instance.GetInstance;
|
||||
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||
import org.joinmastodon.android.fragments.account_list.BlocksListFragment;
|
||||
import org.joinmastodon.android.fragments.account_list.FollowerListFragment;
|
||||
import org.joinmastodon.android.fragments.account_list.FollowingListFragment;
|
||||
import org.joinmastodon.android.fragments.account_list.MutesListFragment;
|
||||
import org.joinmastodon.android.fragments.report.ReportReasonChoiceFragment;
|
||||
import org.joinmastodon.android.fragments.settings.SettingsServerFragment;
|
||||
import org.joinmastodon.android.model.Account;
|
||||
@@ -153,7 +155,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
private TextView followsYouView;
|
||||
private ViewGroup rolesView;
|
||||
private LinearLayout countersLayout;
|
||||
private View nameEditWrap, bioEditWrap;
|
||||
private View nameEditWrap, bioEditWrap, usernameWrap;
|
||||
private View tabsDivider;
|
||||
private View actionButtonWrap;
|
||||
private CustomDrawingOrderLinearLayout scrollableContent;
|
||||
@@ -259,6 +261,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
bioEdit=content.findViewById(R.id.bio_edit);
|
||||
nameEditWrap=content.findViewById(R.id.name_edit_wrap);
|
||||
bioEditWrap=content.findViewById(R.id.bio_edit_wrap);
|
||||
usernameWrap=content.findViewById(R.id.username_wrap);
|
||||
actionProgress=content.findViewById(R.id.action_progress);
|
||||
notifyProgress=content.findViewById(R.id.notify_progress);
|
||||
fab=content.findViewById(R.id.fab);
|
||||
@@ -379,6 +382,19 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
if (position == 4) tab.view.setVisibility(View.GONE);
|
||||
}
|
||||
});
|
||||
tabbar.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener(){
|
||||
@Override
|
||||
public void onTabSelected(TabLayout.Tab tab){}
|
||||
|
||||
@Override
|
||||
public void onTabUnselected(TabLayout.Tab tab){}
|
||||
|
||||
@Override
|
||||
public void onTabReselected(TabLayout.Tab tab){
|
||||
if(getFragmentForPage(tab.getPosition()) instanceof ScrollableToTop stt)
|
||||
stt.scrollToTop();
|
||||
}
|
||||
});
|
||||
|
||||
cover.setOutlineProvider(new ViewOutlineProvider(){
|
||||
@Override
|
||||
@@ -739,7 +755,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
followingCount.setText(UiUtils.abbreviateNumber(account.followingCount));
|
||||
followersLabel.setText(getResources().getQuantityString(R.plurals.followers, (int)Math.min(999, account.followersCount)));
|
||||
followingLabel.setText(getResources().getQuantityString(R.plurals.following, (int)Math.min(999, account.followingCount)));
|
||||
|
||||
|
||||
if (account.followersCount < 0) followersBtn.setVisibility(View.GONE);
|
||||
if (account.followingCount < 0) followingBtn.setVisibility(View.GONE);
|
||||
if (account.followersCount < 0 || account.followingCount < 0)
|
||||
@@ -838,7 +854,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
|
||||
MenuItem mute = menu.findItem(R.id.mute);
|
||||
mute.setTitle(getString(relationship.muting ? R.string.unmute_user : R.string.mute_user, account.getShortUsername()));
|
||||
mute.setIcon(relationship.muting ? R.drawable.ic_fluent_speaker_0_24_regular : R.drawable.ic_fluent_speaker_off_24_regular);
|
||||
mute.setIcon(relationship.muting ? R.drawable.ic_fluent_speaker_2_24_regular : R.drawable.ic_fluent_speaker_off_24_regular);
|
||||
UiUtils.insetPopupMenuIcon(getContext(), mute);
|
||||
menu.findItem(R.id.block).setTitle(getString(relationship.blocking ? R.string.unblock_user : R.string.block_user, account.getShortUsername()));
|
||||
menu.findItem(R.id.report).setTitle(getString(R.string.report_user, account.getShortUsername()));
|
||||
@@ -917,6 +933,16 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
args.putString("profileDisplayUsername", account.getDisplayUsername());
|
||||
}
|
||||
Nav.go(getActivity(), ListsFragment.class, args);
|
||||
}else if(id==R.id.mutes){
|
||||
final Bundle args=new Bundle();
|
||||
args.putString("account", accountID);
|
||||
args.putParcelable("targetAccount", Parcels.wrap(account));
|
||||
Nav.go(getActivity(), MutesListFragment.class, args);
|
||||
}else if(id==R.id.blocks){
|
||||
final Bundle args=new Bundle();
|
||||
args.putString("account", accountID);
|
||||
args.putParcelable("targetAccount", Parcels.wrap(account));
|
||||
Nav.go(getActivity(), BlocksListFragment.class, args);
|
||||
}else if(id==R.id.followed_hashtags){
|
||||
Bundle args=new Bundle();
|
||||
args.putString("account", accountID);
|
||||
@@ -1179,7 +1205,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
|
||||
name.setVisibility(View.GONE);
|
||||
rolesView.setVisibility(View.GONE);
|
||||
username.setVisibility(View.GONE);
|
||||
usernameWrap.setVisibility(View.GONE);
|
||||
bio.setVisibility(View.GONE);
|
||||
countersLayout.setVisibility(View.GONE);
|
||||
|
||||
@@ -1228,7 +1254,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
bioEditWrap.setVisibility(View.GONE);
|
||||
name.setVisibility(View.VISIBLE);
|
||||
rolesView.setVisibility(View.VISIBLE);
|
||||
username.setVisibility(View.VISIBLE);
|
||||
usernameWrap.setVisibility(View.VISIBLE);
|
||||
bio.setVisibility(View.VISIBLE);
|
||||
countersLayout.setVisibility(View.VISIBLE);
|
||||
refreshLayout.setEnabled(true);
|
||||
@@ -1402,9 +1428,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
@NonNull
|
||||
@Override
|
||||
public SimpleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){
|
||||
FrameLayout view=tabViews[viewType];
|
||||
if (view.getParent() != null) ((ViewGroup)view.getParent()).removeView(view);
|
||||
view.setVisibility(View.VISIBLE);
|
||||
FrameLayout view=new FrameLayout(parent.getContext());
|
||||
view.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
|
||||
return new SimpleViewHolder(view);
|
||||
}
|
||||
@@ -1412,8 +1436,13 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull SimpleViewHolder holder, int position){
|
||||
Fragment fragment=getFragmentForPage(position);
|
||||
FrameLayout fragmentView=tabViews[position];
|
||||
fragmentView.setVisibility(View.VISIBLE);
|
||||
if(fragmentView.getParent() instanceof ViewGroup parent)
|
||||
parent.removeView(fragmentView);
|
||||
((FrameLayout)holder.itemView).addView(fragmentView);
|
||||
if(!fragment.isAdded()){
|
||||
getChildFragmentManager().beginTransaction().add(holder.itemView.getId(), fragment).commit();
|
||||
getChildFragmentManager().beginTransaction().add(fragmentView.getId(), fragment).commit();
|
||||
holder.itemView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener(){
|
||||
@Override
|
||||
public boolean onPreDraw(){
|
||||
|
||||
@@ -195,10 +195,7 @@ public class ScheduledStatusListFragment extends BaseStatusListFragment<Schedule
|
||||
public void onApplyWindowInsets(WindowInsets insets){
|
||||
if(contentView!=null){
|
||||
if(Build.VERSION.SDK_INT>=29 && insets.getTappableElementInsets().bottom==0){
|
||||
int insetBottom=insets.getSystemWindowInsetBottom();
|
||||
((ViewGroup.MarginLayoutParams) list.getLayoutParams()).bottomMargin=insetBottom;
|
||||
((ViewGroup.MarginLayoutParams) fab.getLayoutParams()).bottomMargin=V.dp(16)+insetBottom;
|
||||
insets=insets.inset(0, 0, 0, insetBottom);
|
||||
((ViewGroup.MarginLayoutParams) fab.getLayoutParams()).bottomMargin=V.dp(16)+insets.getSystemWindowInsetBottom();
|
||||
}else{
|
||||
((ViewGroup.MarginLayoutParams) fab.getLayoutParams()).bottomMargin=V.dp(16);
|
||||
}
|
||||
|
||||
@@ -11,8 +11,8 @@ import org.joinmastodon.android.E;
|
||||
import org.joinmastodon.android.GlobalUserPreferences;
|
||||
import org.joinmastodon.android.api.session.AccountLocalPreferences;
|
||||
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||
import org.joinmastodon.android.events.StatusMuteChangedEvent;
|
||||
import org.joinmastodon.android.events.EmojiReactionsUpdatedEvent;
|
||||
import org.joinmastodon.android.MainActivity;
|
||||
import org.joinmastodon.android.events.PollUpdatedEvent;
|
||||
import org.joinmastodon.android.events.RemoveAccountPostsEvent;
|
||||
import org.joinmastodon.android.events.StatusCountersUpdatedEvent;
|
||||
@@ -24,6 +24,7 @@ import org.joinmastodon.android.model.Status;
|
||||
import org.joinmastodon.android.ui.displayitems.EmojiReactionsStatusDisplayItem;
|
||||
import org.joinmastodon.android.ui.displayitems.ExtendedFooterStatusDisplayItem;
|
||||
import org.joinmastodon.android.ui.displayitems.FooterStatusDisplayItem;
|
||||
import org.joinmastodon.android.ui.displayitems.HeaderStatusDisplayItem;
|
||||
import org.joinmastodon.android.ui.displayitems.StatusDisplayItem;
|
||||
import org.joinmastodon.android.ui.displayitems.TextStatusDisplayItem;
|
||||
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||
@@ -257,6 +258,28 @@ public abstract class StatusListFragment extends BaseStatusListFragment<Status>
|
||||
}
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void onStatusMuteChaged(StatusMuteChangedEvent ev){
|
||||
for(Status s:data){
|
||||
if(s.getContentStatus().id.equals(ev.id)){
|
||||
s.getContentStatus().update(ev);
|
||||
AccountSessionManager.get(accountID).getCacheController().updateStatus(s);
|
||||
for(int i=0;i<list.getChildCount();i++){
|
||||
RecyclerView.ViewHolder holder=list.getChildViewHolder(list.getChildAt(i));
|
||||
if(holder instanceof HeaderStatusDisplayItem.Holder header && header.getItem().status==s.getContentStatus()){
|
||||
header.rebind();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for(Status s:preloadedData){
|
||||
if(s.getContentStatus().id.equals(ev.id)){
|
||||
s.getContentStatus().update(ev);
|
||||
AccountSessionManager.get(accountID).getCacheController().updateStatus(s);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void onEmojiReactionsChanged(EmojiReactionsUpdatedEvent ev){
|
||||
for(Status s:data){
|
||||
|
||||
@@ -7,14 +7,17 @@ import android.view.View;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.squareup.otto.Subscribe;
|
||||
|
||||
import org.joinmastodon.android.E;
|
||||
import org.joinmastodon.android.GlobalUserPreferences;
|
||||
import org.joinmastodon.android.GlobalUserPreferences.AutoRevealMode;
|
||||
import org.joinmastodon.android.R;
|
||||
import org.joinmastodon.android.api.requests.statuses.GetStatusByID;
|
||||
import org.joinmastodon.android.api.requests.statuses.GetStatusContext;
|
||||
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||
import org.joinmastodon.android.events.StatusCountersUpdatedEvent;
|
||||
import org.joinmastodon.android.events.StatusCreatedEvent;
|
||||
import org.joinmastodon.android.events.StatusMuteChangedEvent;
|
||||
import org.joinmastodon.android.events.StatusUpdatedEvent;
|
||||
import org.joinmastodon.android.model.Account;
|
||||
import org.joinmastodon.android.model.FilterContext;
|
||||
@@ -23,6 +26,7 @@ import org.joinmastodon.android.model.StatusContext;
|
||||
import org.joinmastodon.android.ui.BetterItemAnimator;
|
||||
import org.joinmastodon.android.ui.displayitems.ExtendedFooterStatusDisplayItem;
|
||||
import org.joinmastodon.android.ui.displayitems.FooterStatusDisplayItem;
|
||||
import org.joinmastodon.android.ui.displayitems.HeaderStatusDisplayItem;
|
||||
import org.joinmastodon.android.ui.displayitems.ReblogOrReplyLineStatusDisplayItem;
|
||||
import org.joinmastodon.android.ui.displayitems.StatusDisplayItem;
|
||||
import org.joinmastodon.android.ui.displayitems.TextStatusDisplayItem;
|
||||
@@ -66,6 +70,28 @@ public class ThreadFragment extends StatusListFragment implements ProvidesAssist
|
||||
onAppendItems(Collections.singletonList(mainStatus));
|
||||
setTitle(HtmlParser.parseCustomEmoji(getString(R.string.post_from_user, mainStatus.account.displayName), mainStatus.account.emojis));
|
||||
transitionFinished = getArguments().getBoolean("noTransition", false);
|
||||
|
||||
E.register(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy(){
|
||||
super.onDestroy();
|
||||
E.unregister(this);
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void onStatusMuteChaged(StatusMuteChangedEvent ev){
|
||||
for(Status s:data){
|
||||
s.getContentStatus().update(ev);
|
||||
AccountSessionManager.get(accountID).getCacheController().updateStatus(s);
|
||||
for(int i=0;i<list.getChildCount();i++){
|
||||
RecyclerView.ViewHolder holder=list.getChildViewHolder(list.getChildAt(i));
|
||||
if(holder instanceof HeaderStatusDisplayItem.Holder header && header.getItem().status==s.getContentStatus()){
|
||||
header.rebind();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -321,7 +347,7 @@ public class ThreadFragment extends StatusListFragment implements ProvidesAssist
|
||||
|
||||
private static List<Status> getDirectDescendants(String id, List<Status> statuses){
|
||||
return statuses.stream()
|
||||
.filter(s -> s.inReplyToId.equals(id))
|
||||
.filter(s -> id.equals(s.inReplyToId))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
package org.joinmastodon.android.fragments.account_list;
|
||||
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
|
||||
import org.joinmastodon.android.R;
|
||||
import org.joinmastodon.android.api.requests.HeaderPaginationRequest;
|
||||
import org.joinmastodon.android.api.requests.accounts.GetAccountBlocks;
|
||||
import org.joinmastodon.android.model.Account;
|
||||
import org.joinmastodon.android.ui.viewholders.AccountViewHolder;
|
||||
|
||||
public class BlocksListFragment extends AccountRelatedAccountListFragment{
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState){
|
||||
super.onCreate(savedInstanceState);
|
||||
setTitle(R.string.mo_blocked_accounts);
|
||||
}
|
||||
|
||||
@Override
|
||||
public HeaderPaginationRequest<Account> onCreateRequest(String maxID, int count){
|
||||
return new GetAccountBlocks(maxID, count);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onConfigureViewHolder(AccountViewHolder holder){
|
||||
super.onConfigureViewHolder(holder);
|
||||
holder.setStyle(AccountViewHolder.AccessoryType.NONE, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Uri getWebUri(Uri.Builder base) {
|
||||
return super.getWebUri(base).buildUpon()
|
||||
.appendPath("/blocks").build();
|
||||
}
|
||||
}
|
||||
@@ -48,7 +48,7 @@ public class ComposeAccountSearchFragment extends BaseAccountListFragment{
|
||||
@Override
|
||||
protected void doLoadData(int offset, int count){
|
||||
refreshing=true;
|
||||
currentRequest=new GetSearchResults(currentQuery, GetSearchResults.Type.ACCOUNTS, false)
|
||||
currentRequest=new GetSearchResults(currentQuery, GetSearchResults.Type.ACCOUNTS, false, null, 0, 0)
|
||||
.setCallback(new SimpleCallback<>(this){
|
||||
@Override
|
||||
public void onSuccess(SearchResults result){
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
package org.joinmastodon.android.fragments.account_list;
|
||||
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
|
||||
import org.joinmastodon.android.R;
|
||||
import org.joinmastodon.android.api.requests.HeaderPaginationRequest;
|
||||
import org.joinmastodon.android.api.requests.accounts.GetAccountMutes;
|
||||
import org.joinmastodon.android.model.Account;
|
||||
import org.joinmastodon.android.ui.viewholders.AccountViewHolder;
|
||||
|
||||
public class MutesListFragment extends AccountRelatedAccountListFragment{
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState){
|
||||
super.onCreate(savedInstanceState);
|
||||
setTitle(R.string.mo_muted_accounts);
|
||||
}
|
||||
|
||||
@Override
|
||||
public HeaderPaginationRequest<Account> onCreateRequest(String maxID, int count){
|
||||
return new GetAccountMutes(maxID, count);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onConfigureViewHolder(AccountViewHolder holder){
|
||||
super.onConfigureViewHolder(holder);
|
||||
holder.setStyle(AccountViewHolder.AccessoryType.NONE, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Uri getWebUri(Uri.Builder base) {
|
||||
return super.getWebUri(base).buildUpon()
|
||||
.appendPath("/mutes").build();
|
||||
}
|
||||
}
|
||||
@@ -295,15 +295,19 @@ public class DiscoverFragment extends AppKitFragment implements ScrollableToTop,
|
||||
@NonNull
|
||||
@Override
|
||||
public SimpleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){
|
||||
FrameLayout view=tabViews[viewType];
|
||||
((ViewGroup)view.getParent()).removeView(view);
|
||||
view.setVisibility(View.VISIBLE);
|
||||
FrameLayout view=new FrameLayout(parent.getContext());
|
||||
view.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
|
||||
return new SimpleViewHolder(view);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull SimpleViewHolder holder, int position){}
|
||||
public void onBindViewHolder(@NonNull SimpleViewHolder holder, int position){
|
||||
FrameLayout view=tabViews[position];
|
||||
if(view.getParent() instanceof ViewGroup parent)
|
||||
parent.removeView(view);
|
||||
view.setVisibility(View.VISIBLE);
|
||||
((FrameLayout)holder.itemView).addView(view, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount(){
|
||||
|
||||
@@ -23,7 +23,6 @@ import org.joinmastodon.android.model.Status;
|
||||
import org.joinmastodon.android.ui.displayitems.AccountStatusDisplayItem;
|
||||
import org.joinmastodon.android.ui.displayitems.HashtagStatusDisplayItem;
|
||||
import org.joinmastodon.android.ui.displayitems.StatusDisplayItem;
|
||||
import org.joinmastodon.android.ui.tabs.TabLayout;
|
||||
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||
import org.parceler.Parcels;
|
||||
|
||||
@@ -31,7 +30,7 @@ import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.EnumSet;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import me.grishka.appkit.Nav;
|
||||
@@ -113,7 +112,7 @@ public class SearchFragment extends BaseStatusListFragment<SearchResult>{
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doLoadData(int offset, int count){
|
||||
protected void doLoadData(int _offset, int count){
|
||||
GetSearchResults.Type type;
|
||||
if(currentFilter.size()==1){
|
||||
type=switch(currentFilter.iterator().next()){
|
||||
@@ -128,7 +127,21 @@ public class SearchFragment extends BaseStatusListFragment<SearchResult>{
|
||||
dataLoaded();
|
||||
return;
|
||||
}
|
||||
currentRequest=new GetSearchResults(currentQuery, type, true)
|
||||
String maxID=null;
|
||||
// TODO server-side bug
|
||||
/*int offset=0;
|
||||
if(_offset>0){
|
||||
if(type==GetSearchResults.Type.STATUSES){
|
||||
if(!preloadedData.isEmpty())
|
||||
maxID=preloadedData.get(preloadedData.size()-1).status.id;
|
||||
else if(!data.isEmpty())
|
||||
maxID=data.get(data.size()-1).status.id;
|
||||
}else{
|
||||
offset=_offset;
|
||||
}
|
||||
}*/
|
||||
int offset=_offset;
|
||||
currentRequest=new GetSearchResults(currentQuery, type, type==null, maxID, offset, type==null ? 0 : count)
|
||||
.setCallback(new Callback<>(){
|
||||
@Override
|
||||
public void onSuccess(SearchResults result){
|
||||
@@ -142,12 +155,15 @@ public class SearchFragment extends BaseStatusListFragment<SearchResult>{
|
||||
results.add(new SearchResult(tag));
|
||||
}
|
||||
if(result.statuses!=null){
|
||||
for(Status status:result.statuses)
|
||||
results.add(new SearchResult(status));
|
||||
Set<String> alreadyLoadedStatuses=data.stream().filter(r->r.type==SearchResult.Type.STATUS).map(r->r.status.id).collect(Collectors.toSet());
|
||||
for(Status status:result.statuses){
|
||||
if(!alreadyLoadedStatuses.contains(status.id))
|
||||
results.add(new SearchResult(status));
|
||||
}
|
||||
}
|
||||
prevDisplayItems=new ArrayList<>(displayItems);
|
||||
unfilteredResults=results;
|
||||
onDataLoaded(filterSearchResults(results), false);
|
||||
onDataLoaded(filterSearchResults(results), type!=null && !results.isEmpty());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -122,7 +122,7 @@ public class SearchQueryFragment extends MastodonRecyclerFragment<SearchResultVi
|
||||
recentsHeader.setVisible(!data.isEmpty());
|
||||
});
|
||||
}else{
|
||||
currentRequest=new GetSearchResults(currentQuery, null, false)
|
||||
currentRequest=new GetSearchResults(currentQuery, null, false, null, 0, 0)
|
||||
.limit(2)
|
||||
.setCallback(new SimpleCallback<>(this){
|
||||
@Override
|
||||
@@ -424,6 +424,8 @@ public class SearchQueryFragment extends MastodonRecyclerFragment<SearchResultVi
|
||||
}
|
||||
|
||||
private void onSearchViewEnter(){
|
||||
if(TextUtils.isEmpty(currentQuery) || currentQuery.trim().isEmpty())
|
||||
return;
|
||||
wrapSuicideDialog(()->deliverResult(currentQuery, null));
|
||||
}
|
||||
|
||||
@@ -475,6 +477,8 @@ public class SearchQueryFragment extends MastodonRecyclerFragment<SearchResultVi
|
||||
}
|
||||
|
||||
private void deliverResult(String query, SearchResult.Type typeFilter){
|
||||
if(query.isEmpty())
|
||||
return;
|
||||
Bundle res=new Bundle();
|
||||
res.putString("query", query);
|
||||
if(typeFilter!=null)
|
||||
|
||||
@@ -271,7 +271,7 @@ public class SignupFragment extends ToolbarFragment{
|
||||
@Override
|
||||
public void tail(Node node, int depth){
|
||||
if(node instanceof Element){
|
||||
ssb.setSpan(new LinkSpan("", SignupFragment.this::onGoBackLinkClick, LinkSpan.Type.CUSTOM, null), spanStart, ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
ssb.setSpan(new LinkSpan("", SignupFragment.this::onGoBackLinkClick, LinkSpan.Type.CUSTOM, null, null), spanStart, ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
ssb.setSpan(new TypefaceSpan("sans-serif-medium"), spanStart, ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -68,6 +68,10 @@ public class EditFilterFragment extends BaseSettingsFragment<Void> implements On
|
||||
public void onCreate(Bundle savedInstanceState){
|
||||
super.onCreate(savedInstanceState);
|
||||
filter=Parcels.unwrap(getArguments().getParcelable("filter"));
|
||||
ArrayList<Parcelable> words=getArguments().getParcelableArrayList("words");
|
||||
if (words != null) {
|
||||
words.stream().map(p->(FilterKeyword)Parcels.unwrap(p)).forEach(keywords::add);
|
||||
}
|
||||
setTitle(filter==null ? R.string.settings_add_filter : R.string.settings_edit_filter);
|
||||
onDataLoaded(List.of(
|
||||
durationItem=new ListItem<>(R.string.settings_filter_duration, 0, this::onDurationClick),
|
||||
|
||||
@@ -61,7 +61,7 @@ public class SettingsBehaviorFragment extends BaseSettingsFragment<Void> impleme
|
||||
prefixRepliesItem=new ListItem<>(R.string.sk_settings_prefix_reply_cw_with_re, getPrefixWithRepliesString(), R.drawable.ic_fluent_arrow_reply_24_regular, this::onPrefixRepliesClick),
|
||||
forwardReportsItem=new CheckableListItem<>(R.string.sk_settings_forward_report_default, 0, CheckableListItem.Style.SWITCH, GlobalUserPreferences.forwardReportDefault, R.drawable.ic_fluent_arrow_forward_24_regular, ()->toggleCheckableItem(forwardReportsItem)),
|
||||
loadNewPostsItem=new CheckableListItem<>(R.string.sk_settings_load_new_posts, 0, CheckableListItem.Style.SWITCH, GlobalUserPreferences.loadNewPosts, R.drawable.ic_fluent_arrow_sync_24_regular, this::onLoadNewPostsClick),
|
||||
seeNewPostsBtnItem=new CheckableListItem<>(R.string.sk_settings_show_new_posts_button, 0, CheckableListItem.Style.SWITCH, GlobalUserPreferences.showNewPostsButton, R.drawable.ic_fluent_arrow_up_24_regular, ()->toggleCheckableItem(seeNewPostsBtnItem)),
|
||||
seeNewPostsBtnItem=new CheckableListItem<>(R.string.sk_settings_see_new_posts_button, 0, CheckableListItem.Style.SWITCH, GlobalUserPreferences.showNewPostsButton, R.drawable.ic_fluent_arrow_up_24_regular, ()->toggleCheckableItem(seeNewPostsBtnItem)),
|
||||
remoteLoadingItem=new CheckableListItem<>(R.string.sk_settings_allow_remote_loading, R.string.sk_settings_allow_remote_loading_explanation, CheckableListItem.Style.SWITCH, GlobalUserPreferences.allowRemoteLoading, R.drawable.ic_fluent_communication_24_regular, ()->toggleCheckableItem(remoteLoadingItem)),
|
||||
mentionRebloggerAutomaticallyItem=new CheckableListItem<>(R.string.mo_mention_reblogger_automatically, 0, CheckableListItem.Style.SWITCH, GlobalUserPreferences.mentionRebloggerAutomatically, R.drawable.ic_fluent_comment_mention_24_regular, ()->toggleCheckableItem(mentionRebloggerAutomaticallyItem)),
|
||||
hapticFeedbackItem=new CheckableListItem<>(R.string.mo_haptic_feedback, R.string.mo_setting_haptic_feedback_summary, CheckableListItem.Style.SWITCH, GlobalUserPreferences.hapticFeedback, R.drawable.ic_fluent_phone_vibrate_24_regular,()->toggleCheckableItem(hapticFeedbackItem), true),
|
||||
|
||||
@@ -55,6 +55,7 @@ public class SettingsMainFragment extends BaseSettingsFragment<Void>{
|
||||
onDataLoaded(List.of(
|
||||
new ListItem<>(R.string.settings_behavior, 0, R.drawable.ic_fluent_settings_24_regular, this::onBehaviorClick),
|
||||
new ListItem<>(R.string.settings_display, 0, R.drawable.ic_fluent_color_24_regular, this::onDisplayClick),
|
||||
// new ListItem<>(R.string.settings_privacy, 0, R.drawable.ic_privacy_tip_24px, this::onPrivacyClick),
|
||||
new ListItem<>(R.string.settings_notifications, 0, R.drawable.ic_fluent_alert_24_regular, this::onNotificationsClick),
|
||||
new ListItem<>(R.string.sk_settings_instance, 0, R.drawable.ic_fluent_server_24_regular, this::onInstanceClick),
|
||||
new ListItem<>(getString(R.string.about_app, getString(R.string.mo_app_name)), null, R.drawable.ic_fluent_info_24_regular, this::onAboutClick, null, 0, true),
|
||||
@@ -133,6 +134,10 @@ public class SettingsMainFragment extends BaseSettingsFragment<Void>{
|
||||
Nav.go(getActivity(), SettingsDisplayFragment.class, makeFragmentArgs());
|
||||
}
|
||||
|
||||
// private void onPrivacyClick(){
|
||||
// Nav.go(getActivity(), SettingsPrivacyFragment.class, makeFragmentArgs());
|
||||
// }
|
||||
|
||||
private void onFiltersClick(){
|
||||
Nav.go(getActivity(), SettingsFiltersFragment.class, makeFragmentArgs());
|
||||
}
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
package org.joinmastodon.android.fragments.settings;
|
||||
|
||||
import android.os.Bundle;
|
||||
|
||||
import org.joinmastodon.android.R;
|
||||
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||
import org.joinmastodon.android.model.Account;
|
||||
import org.joinmastodon.android.model.viewmodel.CheckableListItem;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class SettingsPrivacyFragment extends BaseSettingsFragment<Void>{
|
||||
private CheckableListItem<Void> discoverableItem, indexableItem;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState){
|
||||
super.onCreate(savedInstanceState);
|
||||
setTitle(R.string.settings_privacy);
|
||||
Account self=AccountSessionManager.get(accountID).self;
|
||||
onDataLoaded(List.of(
|
||||
discoverableItem=new CheckableListItem<>(R.string.settings_discoverable, 0, CheckableListItem.Style.SWITCH, self.discoverable, R.drawable.ic_thumbs_up_down_24px, ()->toggleCheckableItem(discoverableItem)),
|
||||
indexableItem=new CheckableListItem<>(R.string.settings_indexable, 0, CheckableListItem.Style.SWITCH, self.source.indexable!=null ? self.source.indexable : true, R.drawable.ic_search_24px, ()->toggleCheckableItem(indexableItem))
|
||||
));
|
||||
if(self.source.indexable==null)
|
||||
indexableItem.isEnabled=false;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doLoadData(int offset, int count){}
|
||||
|
||||
@Override
|
||||
public void onPause(){
|
||||
super.onPause();
|
||||
Account self=AccountSessionManager.get(accountID).self;
|
||||
if(self.discoverable!=discoverableItem.checked || (self.source.indexable!=null && self.source.indexable!=indexableItem.checked)){
|
||||
self.discoverable=discoverableItem.checked;
|
||||
self.source.indexable=indexableItem.checked;
|
||||
AccountSessionManager.get(accountID).savePreferencesLater();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -153,18 +153,21 @@ public class SettingsServerFragment extends AppKitFragment{
|
||||
@NonNull
|
||||
@Override
|
||||
public SimpleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){
|
||||
FrameLayout view=tabViews[viewType];
|
||||
((ViewGroup)view.getParent()).removeView(view);
|
||||
view.setVisibility(View.VISIBLE);
|
||||
FrameLayout view=new FrameLayout(parent.getContext());
|
||||
view.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
|
||||
return new SimpleViewHolder(view);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull SimpleViewHolder holder, int position){
|
||||
FrameLayout view=tabViews[position];
|
||||
if(view.getParent() instanceof ViewGroup parent)
|
||||
parent.removeView(view);
|
||||
view.setVisibility(View.VISIBLE);
|
||||
((FrameLayout)holder.itemView).addView(view, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
|
||||
Fragment fragment=getFragmentForPage(position);
|
||||
if(!fragment.isAdded()){
|
||||
getChildFragmentManager().beginTransaction().add(holder.itemView.getId(), fragment).commit();
|
||||
getChildFragmentManager().beginTransaction().add(view.getId(), fragment).commit();
|
||||
holder.itemView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener(){
|
||||
@Override
|
||||
public boolean onPreDraw(){
|
||||
|
||||
@@ -139,6 +139,7 @@ public class Account extends BaseModel implements Searchable{
|
||||
* When a timed mute will expire, if applicable.
|
||||
*/
|
||||
public Instant muteExpiresAt;
|
||||
public boolean noindex;
|
||||
|
||||
public List<Role> roles;
|
||||
|
||||
@@ -238,6 +239,7 @@ public class Account extends BaseModel implements Searchable{
|
||||
", source="+source+
|
||||
", suspended="+suspended+
|
||||
", muteExpiresAt="+muteExpiresAt+
|
||||
", noindex="+noindex+
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,26 +46,26 @@ public class Attachment extends BaseModel{
|
||||
|
||||
public int getWidth(){
|
||||
if(meta==null)
|
||||
return 0;
|
||||
return 1920;
|
||||
if(meta.width>0)
|
||||
return meta.width;
|
||||
if(meta.original!=null && meta.original.width>0)
|
||||
return meta.original.width;
|
||||
if(meta.small!=null && meta.small.width>0)
|
||||
return meta.small.width;
|
||||
return 0;
|
||||
return 1920;
|
||||
}
|
||||
|
||||
public int getHeight(){
|
||||
if(meta==null)
|
||||
return 0;
|
||||
return 1080;
|
||||
if(meta.height>0)
|
||||
return meta.height;
|
||||
if(meta.original!=null && meta.original.height>0)
|
||||
return meta.original.height;
|
||||
if(meta.small!=null && meta.small.height>0)
|
||||
return meta.small.height;
|
||||
return 0;
|
||||
return 1080;
|
||||
}
|
||||
|
||||
public double getDuration(){
|
||||
|
||||
@@ -23,6 +23,7 @@ public class Hashtag extends BaseModel implements DisplayItemsParent{
|
||||
", following="+following+
|
||||
", history="+history+
|
||||
", statusesCount="+statusesCount+
|
||||
", following="+following+
|
||||
'}';
|
||||
}
|
||||
|
||||
@@ -30,4 +31,19 @@ public class Hashtag extends BaseModel implements DisplayItemsParent{
|
||||
public String getID(){
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o){
|
||||
if(this==o) return true;
|
||||
if(o==null || getClass()!=o.getClass()) return false;
|
||||
|
||||
Hashtag hashtag=(Hashtag) o;
|
||||
|
||||
return name.equals(hashtag.name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode(){
|
||||
return name.hashCode();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,4 +20,22 @@ public class Mention extends BaseModel{
|
||||
", url='"+url+'\''+
|
||||
'}';
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o){
|
||||
if(this==o) return true;
|
||||
if(o==null || getClass()!=o.getClass()) return false;
|
||||
|
||||
Mention mention=(Mention) o;
|
||||
|
||||
if(!id.equals(mention.id)) return false;
|
||||
return url.equals(mention.url);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode(){
|
||||
int result=id.hashCode();
|
||||
result=31*result+url.hashCode();
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,6 +37,8 @@ public class Source extends BaseModel{
|
||||
* The number of pending follow requests.
|
||||
*/
|
||||
public int followRequestCount;
|
||||
public Boolean indexable;
|
||||
public boolean hideCollections;
|
||||
|
||||
@Override
|
||||
public void postprocess() throws ObjectValidationException{
|
||||
@@ -54,6 +56,8 @@ public class Source extends BaseModel{
|
||||
", sensitive="+sensitive+
|
||||
", language='"+language+'\''+
|
||||
", followRequestCount="+followRequestCount+
|
||||
", indexable="+indexable+
|
||||
", hideCollections="+hideCollections+
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,6 +20,7 @@ import org.joinmastodon.android.api.RequiredField;
|
||||
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||
import org.joinmastodon.android.events.EmojiReactionsUpdatedEvent;
|
||||
import org.joinmastodon.android.events.StatusCountersUpdatedEvent;
|
||||
import org.joinmastodon.android.events.StatusMuteChangedEvent;
|
||||
import org.joinmastodon.android.ui.text.HtmlParser;
|
||||
import org.parceler.Parcel;
|
||||
|
||||
@@ -28,8 +29,6 @@ import java.time.Instant;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
@Parcel
|
||||
public class Status extends BaseModel implements DisplayItemsParent, Searchable{
|
||||
@RequiredField
|
||||
@@ -183,6 +182,10 @@ public class Status extends BaseModel implements DisplayItemsParent, Searchable{
|
||||
pinned=ev.pinned;
|
||||
}
|
||||
|
||||
public void update(StatusMuteChangedEvent ev) {
|
||||
muted=ev.muted;
|
||||
}
|
||||
|
||||
public void update(EmojiReactionsUpdatedEvent ev){
|
||||
reactions=ev.reactions;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
package org.joinmastodon.android.model;
|
||||
|
||||
import org.joinmastodon.android.api.AllFieldsAreRequired;
|
||||
|
||||
@AllFieldsAreRequired
|
||||
public class Translation extends BaseModel{
|
||||
public String content;
|
||||
public String detectedSourceLanguage;
|
||||
public String provider;
|
||||
}
|
||||
@@ -38,6 +38,7 @@ import org.joinmastodon.android.fragments.ThreadFragment;
|
||||
import org.joinmastodon.android.fragments.report.ReportReasonChoiceFragment;
|
||||
import org.joinmastodon.android.model.Account;
|
||||
import org.joinmastodon.android.model.Announcement;
|
||||
import org.joinmastodon.android.model.Mention;
|
||||
import org.joinmastodon.android.model.Notification;
|
||||
import org.joinmastodon.android.model.Relationship;
|
||||
import org.joinmastodon.android.model.ScheduledStatus;
|
||||
@@ -56,6 +57,7 @@ import java.time.format.FormatStyle;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Objects;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import androidx.annotation.LayoutRes;
|
||||
@@ -248,6 +250,8 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
|
||||
UiUtils.confirmPinPost(item.parentFragment.getActivity(), item.parentFragment.getAccountID(), item.status, !item.status.pinned, s->{});
|
||||
}else if(id==R.id.mute){
|
||||
UiUtils.confirmToggleMuteUser(item.parentFragment.getActivity(), item.parentFragment.getAccountID(), account, relationship!=null && relationship.muting, r->{});
|
||||
}else if (id==R.id.mute_conversation || id==R.id.unmute_conversation) {
|
||||
UiUtils.confirmToggleMuteConversation(item.parentFragment.getActivity(), item.parentFragment.getAccountID(), item.status, ()->{});
|
||||
}else if(id==R.id.block){
|
||||
UiUtils.confirmToggleBlockUser(item.parentFragment.getActivity(), item.parentFragment.getAccountID(), account, relationship!=null && relationship.blocking, r->{});
|
||||
}else if(id==R.id.report){
|
||||
@@ -507,6 +511,14 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
|
||||
menu.findItem(R.id.delete_and_redraft).setVisible(!isPostScheduled && item.status!=null && isOwnPost);
|
||||
menu.findItem(R.id.pin).setVisible(!isPostScheduled && item.status!=null && isOwnPost && !item.status.pinned);
|
||||
menu.findItem(R.id.unpin).setVisible(!isPostScheduled && item.status!=null && isOwnPost && item.status.pinned);
|
||||
menu.findItem(R.id.mute_conversation).setVisible((item.status!=null && !item.status.muted && !isPostScheduled) && (isOwnPost || item.status.mentions.stream().anyMatch(m->{
|
||||
if(m==null)
|
||||
return false;
|
||||
return AccountSessionManager.get(item.parentFragment.getAccountID()).self.id.equals(m.id) ||
|
||||
AccountSessionManager.get(item.parentFragment.getAccountID()).self.getFullyQualifiedName().equals(m.username) ||
|
||||
AccountSessionManager.get(item.parentFragment.getAccountID()).self.acct.equals(m.acct);
|
||||
})));
|
||||
menu.findItem(R.id.unmute_conversation).setVisible(item.status!=null && item.status.muted);
|
||||
menu.findItem(R.id.open_in_browser).setVisible(!isPostScheduled && item.status!=null);
|
||||
menu.findItem(R.id.copy_link).setVisible(!isPostScheduled && item.status!=null);
|
||||
MenuItem blockDomain=menu.findItem(R.id.block_domain);
|
||||
|
||||
@@ -113,7 +113,6 @@ public class NotificationHeaderStatusDisplayItem extends StatusDisplayItem{
|
||||
public static class Holder extends StatusDisplayItem.Holder<NotificationHeaderStatusDisplayItem> implements ImageLoaderViewHolder{
|
||||
private final ImageView icon, avatar;
|
||||
private final TextView text;
|
||||
private final int selectableItemBackground;
|
||||
|
||||
public Holder(Activity activity, ViewGroup parent){
|
||||
super(activity, R.layout.display_item_notification_header, parent);
|
||||
@@ -124,10 +123,8 @@ public class NotificationHeaderStatusDisplayItem extends StatusDisplayItem{
|
||||
avatar.setOutlineProvider(OutlineProviders.roundedRect(8));
|
||||
avatar.setClipToOutline(true);
|
||||
|
||||
itemView.setOnClickListener(this::onItemClick);
|
||||
TypedValue outValue = new TypedValue();
|
||||
context.getTheme().resolveAttribute(android.R.attr.selectableItemBackground, outValue, true);
|
||||
selectableItemBackground = outValue.resourceId;
|
||||
icon.setOnClickListener(this::onItemClick);
|
||||
avatar.setOnClickListener(this::onItemClick);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -170,10 +167,7 @@ public class NotificationHeaderStatusDisplayItem extends StatusDisplayItem{
|
||||
case POLL -> R.attr.colorPoll;
|
||||
default -> android.R.attr.colorAccent;
|
||||
})));
|
||||
itemView.setBackgroundResource(item.notification.type != Notification.Type.POLL
|
||||
&& item.notification.type != Notification.Type.REPORT ?
|
||||
selectableItemBackground : 0);
|
||||
itemView.setClickable(item.notification.type != Notification.Type.POLL);
|
||||
itemView.setBackgroundResource(0);
|
||||
}
|
||||
|
||||
public void onItemClick(View v) {
|
||||
|
||||
@@ -73,10 +73,9 @@ public class PreviewlessMediaGridStatusDisplayItem extends StatusDisplayItem{
|
||||
super(new FrameLayoutThatOnlyMeasuresFirstChild(activity));
|
||||
wrapper=(FrameLayout)itemView;
|
||||
layout= new LinearLayout(activity);
|
||||
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
|
||||
params.setMargins(V.dp(16), 0, V.dp(16), 0);
|
||||
layout.setLayoutParams(params);
|
||||
layout.setOrientation(LinearLayout.VERTICAL);
|
||||
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
|
||||
layout.setLayoutParams(params);
|
||||
wrapper.addView(layout);
|
||||
wrapper.setClipToPadding(false);
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@ import android.widget.TextView;
|
||||
|
||||
import org.joinmastodon.android.GlobalUserPreferences;
|
||||
import org.joinmastodon.android.R;
|
||||
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||
import org.joinmastodon.android.fragments.BaseStatusListFragment;
|
||||
import org.joinmastodon.android.model.Emoji;
|
||||
import org.joinmastodon.android.model.Status;
|
||||
@@ -53,7 +54,8 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{
|
||||
public ReblogOrReplyLineStatusDisplayItem(String parentID, BaseStatusListFragment parentFragment, CharSequence text, List<Emoji> emojis, @DrawableRes int icon, StatusPrivacy visibility, @Nullable View.OnClickListener handleClick, CharSequence fullText, Status status) {
|
||||
super(parentID, parentFragment);
|
||||
SpannableStringBuilder ssb=new SpannableStringBuilder(text);
|
||||
HtmlParser.parseCustomEmoji(ssb, emojis);
|
||||
if(AccountSessionManager.get(parentFragment.getAccountID()).getLocalPreferences().customEmojiInNames)
|
||||
HtmlParser.parseCustomEmoji(ssb, emojis);
|
||||
this.text=ssb;
|
||||
emojiHelper.setText(ssb);
|
||||
this.icon=icon;
|
||||
|
||||
@@ -99,15 +99,11 @@ public class BlurhashCrossfadeDrawable extends Drawable{
|
||||
|
||||
@Override
|
||||
public int getIntrinsicWidth(){
|
||||
if(width==0)
|
||||
return imageDrawable==null ? 1920 : imageDrawable.getIntrinsicWidth();
|
||||
return width;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIntrinsicHeight(){
|
||||
if(height==0)
|
||||
return imageDrawable==null ? 1080 : imageDrawable.getIntrinsicHeight();
|
||||
return height;
|
||||
}
|
||||
|
||||
|
||||
@@ -147,7 +147,7 @@ public class PhotoViewer implements ZoomPanView.Listener{
|
||||
toolbarWrap.setPadding(0, 0, 0, 0);
|
||||
videoControls.setPadding(0, 0, 0, 0);
|
||||
}
|
||||
insets=insets.replaceSystemWindowInsets(tappable.left, tappable.top, tappable.right, tappable.bottom);
|
||||
insets=insets.replaceSystemWindowInsets(tappable.left, tappable.top, tappable.right, insets.getSystemWindowInsetBottom());
|
||||
}
|
||||
uiOverlay.dispatchApplyWindowInsets(insets);
|
||||
int bottomInset=insets.getSystemWindowInsetBottom();
|
||||
@@ -602,7 +602,7 @@ public class PhotoViewer implements ZoomPanView.Listener{
|
||||
|
||||
private void updateVideoPosition(){
|
||||
if(videoPositionNeedsUpdating){
|
||||
int currentPosition=videoInitialPosition+(int)(SystemClock.uptimeMillis()-videoInitialPositionTime);
|
||||
int currentPosition=(videoInitialPosition+(int)(SystemClock.uptimeMillis()-videoInitialPositionTime))%videoDuration;
|
||||
videoSeekBar.setProgress(Math.round((float)currentPosition/videoDuration*10000f));
|
||||
updateVideoTimeText(currentPosition);
|
||||
windowView.postOnAnimation(videoPositionUpdater);
|
||||
@@ -878,6 +878,8 @@ public class PhotoViewer implements ZoomPanView.Listener{
|
||||
|
||||
@Override
|
||||
public void onVideoSizeChanged(MediaPlayer mp, int width, int height){
|
||||
if(width<=0 || height<=0)
|
||||
return;
|
||||
FrameLayout.LayoutParams params=(FrameLayout.LayoutParams) wrap.getLayoutParams();
|
||||
params.width=width;
|
||||
params.height=height;
|
||||
|
||||
@@ -119,6 +119,9 @@ public class ZoomPanView extends FrameLayout implements ScaleGestureDetector.OnS
|
||||
|
||||
int width=right-left;
|
||||
int height=bottom-top;
|
||||
if(width==0 || height==0)
|
||||
return;
|
||||
|
||||
float scale=Math.min(width/(float)child.getWidth(), height/(float)child.getHeight());
|
||||
minScale=scale;
|
||||
maxScale=Math.max(3f, height/(float)child.getHeight());
|
||||
@@ -306,8 +309,6 @@ public class ZoomPanView extends FrameLayout implements ScaleGestureDetector.OnS
|
||||
}, 1f).setMinimumVisibleChange(DynamicAnimation.MIN_VISIBLE_CHANGE_ALPHA));
|
||||
}
|
||||
}else{
|
||||
if(animatingTransition)
|
||||
Log.w(TAG, "updateViewTransform: ", new Throwable().fillInStackTrace());
|
||||
child.setScaleX(matrixValues[Matrix.MSCALE_X]);
|
||||
child.setScaleY(matrixValues[Matrix.MSCALE_Y]);
|
||||
child.setTranslationX(matrixValues[Matrix.MTRANS_X]);
|
||||
|
||||
@@ -71,7 +71,6 @@ import org.joinmastodon.android.R;
|
||||
import org.joinmastodon.android.api.MastodonAPIRequest;
|
||||
import org.joinmastodon.android.api.MastodonErrorResponse;
|
||||
import org.joinmastodon.android.api.StatusInteractionController;
|
||||
import org.joinmastodon.android.api.requests.accounts.GetAccountByHandle;
|
||||
import org.joinmastodon.android.api.requests.accounts.SetAccountBlocked;
|
||||
import org.joinmastodon.android.api.requests.accounts.SetAccountFollowed;
|
||||
import org.joinmastodon.android.api.requests.accounts.SetAccountMuted;
|
||||
@@ -85,9 +84,11 @@ import org.joinmastodon.android.api.requests.search.GetSearchResults;
|
||||
import org.joinmastodon.android.api.requests.statuses.CreateStatus;
|
||||
import org.joinmastodon.android.api.requests.statuses.DeleteStatus;
|
||||
import org.joinmastodon.android.api.requests.statuses.GetStatusByID;
|
||||
import org.joinmastodon.android.api.requests.statuses.SetStatusMuted;
|
||||
import org.joinmastodon.android.api.requests.statuses.SetStatusPinned;
|
||||
import org.joinmastodon.android.api.session.AccountSession;
|
||||
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||
import org.joinmastodon.android.events.StatusMuteChangedEvent;
|
||||
import org.joinmastodon.android.events.ScheduledStatusDeletedEvent;
|
||||
import org.joinmastodon.android.events.StatusCountersUpdatedEvent;
|
||||
import org.joinmastodon.android.events.FollowRequestHandledEvent;
|
||||
@@ -140,7 +141,6 @@ import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
import java.util.function.BiPredicate;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Function;
|
||||
@@ -219,11 +219,20 @@ public class UiUtils {
|
||||
if(diff<1000L){
|
||||
return context.getString(R.string.time_now);
|
||||
}else if(diff<60_000L){
|
||||
return context.getString(ago ? R.string.time_seconds_ago_short : R.string.sk_time_seconds, diff/1000L);
|
||||
long time = diff/1000L;
|
||||
return ago ?
|
||||
context.getString(R.string.time_seconds_ago_short, time) :
|
||||
context.getResources().getQuantityString(R.plurals.sk_time_seconds, (int) time, time);
|
||||
}else if(diff<3600_000L){
|
||||
return context.getString(ago ? R.string.time_minutes_ago_short : R.string.sk_time_minutes, diff/60_000L);
|
||||
long time = diff/60_000L;
|
||||
return ago ?
|
||||
context.getString(R.string.time_minutes_ago_short, time) :
|
||||
context.getResources().getQuantityString(R.plurals.sk_time_minutes, (int) time, time);
|
||||
}else if(diff<3600_000L*24L){
|
||||
return context.getString(ago ? R.string.time_hours_ago_short : R.string.sk_time_hours, diff/3600_000L);
|
||||
long time = diff/3600_000L;
|
||||
return ago ?
|
||||
context.getString(R.string.time_hours_ago_short, time) :
|
||||
context.getResources().getQuantityString(R.plurals.sk_time_hours, (int) time, time);
|
||||
} else {
|
||||
int days = (int) (diff / (3600_000L * 24L));
|
||||
if (ago && days > 30) {
|
||||
@@ -234,7 +243,7 @@ public class UiUtils {
|
||||
return DATE_FORMATTER_SHORT_WITH_YEAR.format(dt);
|
||||
}
|
||||
}
|
||||
return context.getString(ago ? R.string.time_days_ago_short : R.string.sk_time_days, days);
|
||||
return ago ? context.getString(R.string.time_days_ago_short, days) : context.getResources().getQuantityString(R.plurals.sk_time_days, days, days);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -624,7 +633,7 @@ public class UiUtils {
|
||||
.exec(accountID);
|
||||
})
|
||||
.setNegativeButton(R.string.cancel, null)
|
||||
.setIcon(currentlyMuted ? R.drawable.ic_fluent_speaker_0_28_regular : R.drawable.ic_fluent_speaker_off_28_regular)
|
||||
.setIcon(currentlyMuted ? R.drawable.ic_fluent_speaker_2_28_regular : R.drawable.ic_fluent_speaker_off_28_regular)
|
||||
.show();
|
||||
}
|
||||
|
||||
@@ -657,6 +666,32 @@ public class UiUtils {
|
||||
);
|
||||
}
|
||||
|
||||
public static void confirmToggleMuteConversation(Activity activity, String accountID, Status status, Runnable resultCallback) {
|
||||
showConfirmationAlert(activity,
|
||||
status.muted ? R.string.mo_unmute_conversation : R.string.mo_mute_conversation,
|
||||
status.muted ? R.string.mo_confirm_to_unmute_conversation : R.string.mo_confirm_to_mute_conversation,
|
||||
status.muted ? R.string.do_unmute : R.string.do_mute,
|
||||
status.muted ? R.drawable.ic_fluent_alert_28_regular : R.drawable.ic_fluent_alert_off_28_regular,
|
||||
() -> new SetStatusMuted(status.id, !status.muted)
|
||||
.setCallback(new Callback<Status>(){
|
||||
@Override
|
||||
public void onSuccess(Status result){
|
||||
resultCallback.run();
|
||||
Toast.makeText(activity, result.muted ? R.string.mo_muted_conversation_successfully : R.string.mo_unmuted_conversation_successfully, Toast.LENGTH_SHORT).show();
|
||||
E.post(new StatusMuteChangedEvent(result));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(ErrorResponse error){
|
||||
error.showToast(activity);
|
||||
}
|
||||
})
|
||||
.wrapProgress(activity, status.muted ? R.string.mo_unmuting : R.string.mo_muting, false)
|
||||
.exec(accountID)
|
||||
|
||||
);
|
||||
}
|
||||
|
||||
public static void confirmDeleteScheduledPost(Activity activity, String accountID, ScheduledStatus status, Runnable resultCallback) {
|
||||
boolean isDraft = status.scheduledAt.isAfter(CreateStatus.DRAFTS_AFTER_INSTANT);
|
||||
showConfirmationAlert(activity,
|
||||
@@ -1192,7 +1227,7 @@ public class UiUtils {
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
return Optional.of(new GetSearchResults(query.getQuery(), type, true).setCallback(new Callback<>() {
|
||||
return Optional.of(new GetSearchResults(query.getQuery(), type, true, null, 0, 0).setCallback(new Callback<>() {
|
||||
@Override
|
||||
public void onSuccess(SearchResults results) {
|
||||
Optional<T> result = extractResult.apply(results);
|
||||
@@ -1289,7 +1324,7 @@ public class UiUtils {
|
||||
}
|
||||
public static MastodonAPIRequest<SearchResults> lookupAccountHandle(Context context, String accountID, Pair<String, Optional<String>> queryHandle, BiConsumer<Class<? extends Fragment>, Bundle> go) {
|
||||
String fullHandle = ("@" + queryHandle.first) + (queryHandle.second.map(domain -> "@" + domain).orElse(""));
|
||||
return new GetSearchResults(fullHandle, GetSearchResults.Type.ACCOUNTS, true)
|
||||
return new GetSearchResults(fullHandle, GetSearchResults.Type.ACCOUNTS, true, null, 0, 0)
|
||||
.setCallback(new Callback<>() {
|
||||
@Override
|
||||
public void onSuccess(SearchResults results) {
|
||||
@@ -1352,7 +1387,7 @@ public class UiUtils {
|
||||
})
|
||||
.execNoAuth(uri.getHost()));
|
||||
} else if (looksLikeMastodonUrl(url)) {
|
||||
return Optional.of(new GetSearchResults(url, null, true)
|
||||
return Optional.of(new GetSearchResults(url, null, true, null, 0, 0)
|
||||
.setCallback(new Callback<>() {
|
||||
@Override
|
||||
public void onSuccess(SearchResults results) {
|
||||
|
||||
@@ -15,15 +15,12 @@ import android.widget.TextView;
|
||||
import org.joinmastodon.android.R;
|
||||
import org.joinmastodon.android.api.requests.search.GetSearchResults;
|
||||
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||
import org.joinmastodon.android.model.Account;
|
||||
import org.joinmastodon.android.model.Emoji;
|
||||
import org.joinmastodon.android.model.Hashtag;
|
||||
import org.joinmastodon.android.model.SearchResults;
|
||||
import org.joinmastodon.android.model.viewmodel.AccountViewModel;
|
||||
import org.joinmastodon.android.ui.BetterItemAnimator;
|
||||
import org.joinmastodon.android.ui.OutlineProviders;
|
||||
import org.joinmastodon.android.ui.text.HtmlParser;
|
||||
import org.joinmastodon.android.ui.utils.CustomEmojiHelper;
|
||||
import org.joinmastodon.android.ui.utils.HideableSingleViewRecyclerAdapter;
|
||||
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||
import org.joinmastodon.android.ui.views.FilterChipView;
|
||||
@@ -96,6 +93,24 @@ public class ComposeAutocompleteViewController{
|
||||
outRect.right=V.dp(8);
|
||||
}
|
||||
});
|
||||
// Set empty adapter to prevent NPEs
|
||||
list.setAdapter(new RecyclerView.Adapter<>(){
|
||||
@NonNull
|
||||
@Override
|
||||
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position){
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount(){
|
||||
return 0;
|
||||
}
|
||||
});
|
||||
contentView.addView(list, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
|
||||
|
||||
emptyButton=new FilterChipView(activity);
|
||||
@@ -222,11 +237,13 @@ public class ComposeAutocompleteViewController{
|
||||
}
|
||||
|
||||
private void doSearchUsers(){
|
||||
currentRequest=new GetSearchResults(lastText, GetSearchResults.Type.ACCOUNTS, false)
|
||||
currentRequest=new GetSearchResults(lastText, GetSearchResults.Type.ACCOUNTS, false, null, 0, 0)
|
||||
.setCallback(new Callback<>(){
|
||||
@Override
|
||||
public void onSuccess(SearchResults result){
|
||||
currentRequest=null;
|
||||
if(mode!=Mode.USERS)
|
||||
return;
|
||||
List<AccountViewModel> oldList=users;
|
||||
users=result.accounts.stream().map(a->new AccountViewModel(a, accountID)).collect(Collectors.toList());
|
||||
if(isLoading){
|
||||
@@ -256,7 +273,7 @@ public class ComposeAutocompleteViewController{
|
||||
}
|
||||
|
||||
private void doSearchHashtags(){
|
||||
currentRequest=new GetSearchResults(lastText, GetSearchResults.Type.HASHTAGS, false)
|
||||
currentRequest=new GetSearchResults(lastText, GetSearchResults.Type.HASHTAGS, false, null, 0, 0)
|
||||
.setCallback(new Callback<>(){
|
||||
@Override
|
||||
public void onSuccess(SearchResults result){
|
||||
|
||||
@@ -80,10 +80,10 @@ public class ComposePollViewController{
|
||||
if(instance.configuration!=null && instance.configuration.polls!=null && instance.configuration.polls.maxCharactersPerOption>0)
|
||||
maxPollOptionLength=instance.configuration.polls.maxCharactersPerOption;
|
||||
} else {
|
||||
if (instance.pollLimits!=null && instance.pollLimits.maxOptions>0)
|
||||
maxPollOptions=instance.pollLimits.maxOptions;
|
||||
if(instance.pollLimits!=null && instance.pollLimits.maxOptionChars>0)
|
||||
maxPollOptionLength=instance.pollLimits.maxOptionChars;
|
||||
if(instance!=null && instance.configuration!=null && instance.configuration.polls!=null && instance.configuration.polls.maxOptions>0)
|
||||
maxPollOptions=instance.configuration.polls.maxOptions;
|
||||
if(instance!=null && instance.configuration!=null && instance.configuration.polls!=null && instance.configuration.polls.maxCharactersPerOption>0)
|
||||
maxPollOptionLength=instance.configuration.polls.maxCharactersPerOption;
|
||||
}
|
||||
|
||||
pollOptionsView=pollWrap.findViewById(R.id.poll_options);
|
||||
@@ -134,7 +134,8 @@ public class ComposePollViewController{
|
||||
DraftPollOption opt=createDraftPollOption(false);
|
||||
opt.edit.setText(eopt.title);
|
||||
}
|
||||
pollDuration=(int)fragment.editingStatus.poll.expiresAt.minus(fragment.editingStatus.createdAt.toEpochMilli(), ChronoUnit.MILLIS).getEpochSecond();
|
||||
if(fragment.editingStatus.poll.expiresAt!=null)
|
||||
pollDuration=(int)fragment.editingStatus.poll.expiresAt.minus(fragment.editingStatus.createdAt.toEpochMilli(), ChronoUnit.MILLIS).getEpochSecond();
|
||||
updatePollOptionHints();
|
||||
pollDurationValue.setText(UiUtils.formatDuration(fragment.getContext(), pollDuration));
|
||||
pollIsMultipleChoice=fragment.editingStatus.poll.multiple;
|
||||
|
||||
@@ -15,7 +15,7 @@ public class MediaGridLayout extends ViewGroup{
|
||||
|
||||
private static final int GAP=2; // dp
|
||||
private PhotoLayoutHelper.TiledLayoutResult tiledLayout;
|
||||
private int[] columnStarts=new int[10], columnEnds=new int[10], rowStarts=new int[10], rowEnds=new int[10];
|
||||
private int[] columnStarts, columnEnds, rowStarts, rowEnds;
|
||||
|
||||
public MediaGridLayout(Context context){
|
||||
this(context, null);
|
||||
@@ -41,6 +41,14 @@ public class MediaGridLayout extends ViewGroup{
|
||||
width=Math.round(width*(tiledLayout.width/(float)PhotoLayoutHelper.MAX_WIDTH));
|
||||
}
|
||||
|
||||
if(rowStarts==null || rowStarts.length<tiledLayout.rowSizes.length){
|
||||
rowStarts=new int[tiledLayout.rowSizes.length];
|
||||
rowEnds=new int[tiledLayout.rowSizes.length];
|
||||
}
|
||||
if(columnStarts==null || columnStarts.length<tiledLayout.columnSizes.length){
|
||||
columnStarts=new int[tiledLayout.columnSizes.length];
|
||||
columnEnds=new int[tiledLayout.columnSizes.length];
|
||||
}
|
||||
int offset=0;
|
||||
for(int i=0;i<tiledLayout.columnSizes.length;i++){
|
||||
columnStarts[i]=offset;
|
||||
@@ -73,7 +81,7 @@ public class MediaGridLayout extends ViewGroup{
|
||||
|
||||
@Override
|
||||
protected void onLayout(boolean changed, int l, int t, int r, int b){
|
||||
if(tiledLayout==null)
|
||||
if(tiledLayout==null || rowStarts==null)
|
||||
return;
|
||||
|
||||
int maxWidth=UiUtils.MAX_WIDTH;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:color="?colorM3Primary" android:state_selected="true"/>
|
||||
<item android:color="?colorM3OnBackground" android:state_enabled="true"/>
|
||||
<item android:color="?android:textColorSecondary"/>
|
||||
<item android:color="?android:textColorSecondary" android:state_enabled="true"/>
|
||||
<item android:color="@color/m3_on_surface_alpha38"/>
|
||||
</selector>
|
||||
@@ -1,6 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:color="?colorM3OnSurfaceVariant" android:alpha="0.3" android:state_enabled="false"/>
|
||||
<item android:color="?colorM3OnPrimary" android:state_selected="true"/>
|
||||
<item android:color="?colorM3OnSurfaceVariant"/>
|
||||
<item android:color="?colorM3Surface" android:state_enabled="true"/>
|
||||
<item android:color="?colorM3OnSurface"/>
|
||||
</selector>
|
||||
@@ -1,21 +1,25 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:aapt="http://schemas.android.com/aapt"
|
||||
android:width="108dp"
|
||||
android:height="108dp"
|
||||
android:viewportWidth="108"
|
||||
android:viewportHeight="108">
|
||||
<path
|
||||
android:pathData="M63.51,35.47C67.74,36.09 71.31,39.31 71.86,43.39C72.1,45.82 71.98,49.47 71.92,51.24C71.9,51.68 71.89,52.01 71.89,52.17C71.89,52.41 71.86,54.58 71.85,54.81C71.48,60.65 67.83,62.95 64,63.69C63.95,63.7 63.91,63.71 63.86,63.72C63.85,63.72 63.83,63.72 63.82,63.72C61.39,64.2 58.79,64.32 56.32,64.39C55.73,64.41 55.14,64.41 54.55,64.41L54.55,64.41C52.1,64.41 49.65,64.12 47.26,63.54C47.25,63.54 47.24,63.54 47.22,63.54C47.21,63.55 47.2,63.55 47.19,63.56C47.18,63.57 47.17,63.58 47.17,63.59C47.16,63.6 47.16,63.62 47.16,63.63C47.23,64.4 47.39,65.17 47.66,65.9C47.99,66.74 49.15,68.78 53.44,68.78C55.94,68.78 58.42,68.49 60.85,67.91C60.86,67.91 60.88,67.91 60.89,67.91C60.9,67.92 60.91,67.92 60.92,67.93C60.93,67.94 60.94,67.95 60.95,67.96C60.95,67.97 60.95,67.98 60.95,67.99L60.95,70.86C60.95,70.87 60.95,70.89 60.94,70.9C60.94,70.91 60.93,70.92 60.92,70.93C60.16,71.48 59.14,71.8 58.25,72.08C58.21,72.09 58.17,72.11 58.12,72.12C57.72,72.25 57.31,72.36 56.89,72.46C53.1,73.32 49.15,73.11 45.47,71.85C42.04,70.65 38.53,67.71 37.67,64.17C37.2,62.25 36.88,60.3 36.69,58.34C36.5,56.19 36.43,54.04 36.36,51.89C36.34,51.08 36.31,50.27 36.28,49.45C36.2,47.38 36.25,45.13 36.69,43.09C37.6,38.96 41.35,36.07 45.46,35.47C45.55,35.45 45.64,35.44 45.75,35.42C46.56,35.28 48.26,34.98 53.78,34.98L53.83,34.98C60.09,34.98 62.8,35.36 63.51,35.47ZM65.64,58L65.64,47.91C65.64,45.85 65.11,44.21 64.06,43C62.96,41.79 61.54,41.16 59.76,41.16C57.72,41.16 56.16,41.95 55.13,43.52L54.13,45.19L53.13,43.52C52.1,41.95 50.55,41.16 48.5,41.16C46.72,41.16 45.3,41.79 44.21,43C43.15,44.21 42.62,45.85 42.62,47.91L42.62,58L46.63,58L46.63,48.21C46.63,46.15 47.5,45.1 49.24,45.1C51.17,45.1 52.14,46.34 52.14,48.8L52.14,54.16L56.12,54.16L56.12,48.8C56.12,46.34 57.09,45.1 59.01,45.1C60.77,45.1 61.63,46.15 61.63,48.21L61.63,58L65.64,58Z">
|
||||
<aapt:attr name="android:fillColor">
|
||||
<gradient
|
||||
android:startX="54.12"
|
||||
android:startY="34.98"
|
||||
android:endX="54.12"
|
||||
android:endY="72.98"
|
||||
android:type="linear">
|
||||
<item android:offset="0" android:color="#FFF0F3FE"/>
|
||||
<item android:offset="1" android:color="#FFDAE0FB"/>
|
||||
</gradient>
|
||||
</aapt:attr>
|
||||
</path>
|
||||
</vector>
|
||||
xmlns:aapt="http://schemas.android.com/aapt"
|
||||
android:width="108dp"
|
||||
android:height="108dp"
|
||||
android:viewportWidth="43.043"
|
||||
android:viewportHeight="43.043">
|
||||
<group android:scaleX="0.73"
|
||||
android:scaleY="0.73"
|
||||
android:translateX="5.810805"
|
||||
android:translateY="5.810805">
|
||||
<path
|
||||
android:pathData="M0,0h43.043v43.043h-43.043z"
|
||||
android:strokeWidth="1.53886"
|
||||
android:fillColor="#282c37"/>
|
||||
<path
|
||||
android:pathData="m13.779,14.841c-1.097,0 -1.983,0.387 -2.658,1.141 -0.655,0.754 -0.981,1.771 -0.981,3.053l0,6.27L12.622,25.304L12.622,19.219c0,-1.284 0.539,-1.935 1.618,-1.935 1.192,0 1.791,0.773 1.791,2.3l0,3.331l2.468,0l0,-3.331c0,-1.527 0.598,-2.3 1.791,-2.3 1.078,0 1.618,0.651 1.618,1.935l0,6.085l2.482,0l0,-6.27c0,-1.281 -0.326,-2.299 -0.981,-3.053 -0.676,-0.754 -1.56,-1.141 -2.658,-1.141 -1.27,0 -2.232,0.488 -2.868,1.466L17.265,17.345 16.646,16.306C16.01,15.329 15.049,14.841 13.779,14.841Z"
|
||||
android:strokeWidth="0.796"
|
||||
android:fillColor="#eed7f4"/>
|
||||
<path
|
||||
android:pathData="m29.087,25.304q-1.113,0 -1.986,-0.493 -0.873,-0.507 -1.366,-1.366 -0.479,-0.873 -0.479,-1.958 0,-1.07 0.479,-1.944 0.493,-0.873 1.366,-1.366 0.873,-0.507 1.986,-0.507 1.099,0 1.972,0.507 0.873,0.493 1.352,1.366 0.493,0.873 0.493,1.944 0,1.085 -0.493,1.958 -0.479,0.859 -1.352,1.366 -0.873,0.493 -1.972,0.493zM29.087,23.6q0.535,0 0.986,-0.254 0.451,-0.254 0.718,-0.732 0.268,-0.479 0.268,-1.127 0,-0.634 -0.268,-1.113 -0.268,-0.479 -0.718,-0.732 -0.451,-0.254 -0.986,-0.254 -0.535,0 -0.986,0.254 -0.451,0.254 -0.732,0.732 -0.268,0.479 -0.268,1.113 0,0.634 0.268,1.127 0.282,0.479 0.732,0.732 0.451,0.254 0.986,0.254z"
|
||||
android:strokeWidth="0.687"
|
||||
android:fillColor="#eed7f4"
|
||||
android:strokeColor="#00000000"/>
|
||||
</group>
|
||||
</vector>
|
||||
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:pathData="M5.219,6.28L2.22,3.28C1.927,2.987 1.927,2.512 2.22,2.22C2.513,1.927 2.987,1.927 3.28,2.22L21.78,20.72C22.073,21.013 22.073,21.487 21.78,21.78C21.487,22.073 21.012,22.073 20.719,21.78L17.44,18.501L15,18.501C15,20.158 13.657,21.501 12,21.501C10.402,21.501 9.096,20.252 9.005,18.678L9,18.499L4.275,18.5C4.104,18.5 3.934,18.465 3.777,18.396C3.144,18.121 2.853,17.385 3.128,16.752L4.5,13.594V9.496C4.5,8.344 4.758,7.254 5.219,6.28ZM15.939,17L6.365,7.425C6.129,8.07 6,8.767 6,9.496V13.906L4.656,17H15.939ZM13.5,18.499L10.5,18.501C10.5,19.33 11.172,20.001 12,20.001C12.78,20.001 13.421,19.406 13.493,18.646L13.5,18.499ZM18,13.907L18.708,15.527L20.896,17.714C20.953,17.57 20.985,17.414 20.985,17.25C20.985,17.077 20.949,16.907 20.88,16.749L19.5,13.593V9.496L19.496,9.245C19.357,5.191 16.05,1.996 12,1.996C10.098,1.996 8.364,2.699 7.043,3.861L8.107,4.925C9.154,4.033 10.513,3.496 12,3.496C15.242,3.496 17.885,6.05 17.997,9.284L18,9.509L18,13.907Z"
|
||||
android:fillColor="@color/fluent_default_icon_tint"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="28dp"
|
||||
android:height="28dp"
|
||||
android:viewportWidth="28"
|
||||
android:viewportHeight="28">
|
||||
<path
|
||||
android:pathData="M3.28,2.22C2.987,1.927 2.513,1.927 2.22,2.22C1.927,2.513 1.927,2.987 2.22,3.28L6.477,7.538C5.852,8.721 5.499,10.07 5.499,11.501L5.498,16.112L4.082,19.756L4.04,19.88C3.868,20.506 4.193,21.173 4.811,21.413C4.959,21.471 5.116,21.5 5.275,21.5L10.498,21.499L10.504,21.693C10.603,23.538 12.131,25.003 14,25.003C15.934,25.003 17.501,23.435 17.501,21.501L20.44,21.5L24.719,25.781C25.012,26.073 25.487,26.073 25.78,25.781C26.073,25.488 26.073,25.013 25.78,24.72L3.28,2.22ZM18.938,19.999H5.596L6.948,16.525L6.976,16.437C6.991,16.377 6.999,16.315 6.999,16.253V11.501L7.003,11.261C7.034,10.337 7.244,9.459 7.599,8.66L18.938,19.999ZM15.996,21.65C15.92,22.686 15.055,23.503 14,23.503C12.895,23.503 11.998,22.606 11.998,21.501L16,21.499L15.996,21.65ZM8.34,5.158L9.403,6.221C10.632,5.149 12.24,4.5 14,4.5C17.867,4.5 21.001,7.635 21.001,11.501V16.253L21.007,16.346C21.014,16.407 21.03,16.467 21.052,16.525L21.905,18.723L23.901,20.719C23.966,20.566 24.002,20.397 24.002,20.22L23.992,20.062C23.979,19.958 23.953,19.855 23.915,19.757L22.501,16.113L22.501,11.501L22.497,11.246C22.362,6.669 18.61,3 14,3C11.826,3 9.843,3.816 8.34,5.158Z"
|
||||
android:fillColor="@color/fluent_default_icon_tint"/>
|
||||
</vector>
|
||||
@@ -1,3 +0,0 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:pathData="M13.94 5l5.061 5.06L9.063 20c-0.277 0.277-0.621 0.477-1 0.58l-5.115 1.395c-0.56 0.153-1.073-0.361-0.92-0.921l1.394-5.116c0.103-0.377 0.303-0.722 0.58-0.999L13.94 5zm-7.414 6l-1.5 1.5H2.75C2.337 12.5 2 12.165 2 11.75 2 11.336 2.337 11 2.75 11h3.775zm14.352-8.174l0.153 0.144 0.145 0.153c1.25 1.405 1.203 3.56-0.145 4.908L20.061 9 15 3.94l0.97-0.97c1.348-1.348 3.503-1.396 4.908-0.144zM10.526 7l-1.5 1.5H2.75C2.337 8.5 2 8.165 2 7.75 2 7.336 2.337 7 2.75 7h7.775zm4-4l-1.5 1.5H2.75C2.337 4.5 2 4.165 2 3.75 2 3.336 2.337 3 2.75 3h11.775z" android:fillColor="@color/fluent_default_icon_tint"/>
|
||||
</vector>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:drawable="@drawable/ic_fluent_drafts_24_filled_enabled" android:state_enabled="true"/>
|
||||
<item android:drawable="@drawable/ic_fluent_drafts_24_filled" android:state_enabled="true"/>
|
||||
<item android:drawable="@drawable/ic_fluent_drafts_24_regular"/>
|
||||
</selector>
|
||||
@@ -1,9 +0,0 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:pathData="M6.75,3H5.75C4.231,3 3,4.231 3,5.75V18.25C3,19.769 4.231,21 5.75,21H6V15C6,13.757 7.007,12.75 8.25,12.75H15.75C16.993,12.75 18,13.757 18,15V21H18.25C19.769,21 21,19.769 21,18.25V8.286C21,7.424 20.658,6.597 20.048,5.987L18.013,3.952C17.411,3.351 16.599,3.009 15.75,3V7.5C15.75,8.743 14.743,9.75 13.5,9.75H9C7.757,9.75 6.75,8.743 6.75,7.5V3ZM14.25,3V7.5C14.25,7.914 13.914,8.25 13.5,8.25H9C8.586,8.25 8.25,7.914 8.25,7.5V3H14.25ZM16.5,21V15C16.5,14.586 16.164,14.25 15.75,14.25H8.25C7.836,14.25 7.5,14.586 7.5,15V21H16.5Z"
|
||||
android:fillColor="?colorM3Surface"/>
|
||||
</vector>
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:drawable="@drawable/ic_fluent_save_24_filled_enabled" android:state_enabled="true"/>
|
||||
<item android:drawable="@drawable/ic_fluent_save_24_filled" android:state_enabled="true"/>
|
||||
<item android:drawable="@drawable/ic_fluent_save_24_regular"/>
|
||||
</selector>
|
||||
@@ -1,3 +0,0 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:pathData="M5.694 12L2.299 3.27C2.063 2.664 2.655 2.083 3.241 2.29l0.093 0.039 18 9c0.518 0.259 0.55 0.968 0.097 1.284l-0.097 0.058-18 9c-0.583 0.291-1.216-0.245-1.065-0.848l0.03-0.095L5.694 12 2.299 3.27 5.694 12zM4.402 4.54l2.61 6.71h6.627c0.38 0 0.693 0.282 0.743 0.648L14.389 12c0 0.38-0.282 0.693-0.649 0.743l-0.1 0.007H7.01l-2.609 6.71L19.322 12 4.401 4.54z" android:fillColor="?colorM3Surface"/>
|
||||
</vector>
|
||||
@@ -1,8 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:drawable="@drawable/ic_fluent_send_24_enabled" android:state_activated="true"/>
|
||||
<item android:drawable="@drawable/ic_fluent_send_24_enabled" android:state_checked="true"/>
|
||||
<item android:drawable="@drawable/ic_fluent_send_24_enabled" android:state_selected="true"/>
|
||||
<item android:drawable="@drawable/ic_fluent_send_24_enabled" android:state_enabled="true"/>
|
||||
<item android:drawable="@drawable/ic_fluent_send_24_regular"/>
|
||||
</selector>
|
||||
9
mastodon/src/main/res/drawable/ic_privacy_tip_24px.xml
Normal file
9
mastodon/src/main/res/drawable/ic_privacy_tip_24px.xml
Normal file
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:fillColor="@android:color/white"
|
||||
android:pathData="M11,17H13V11H11ZM12,9Q12.425,9 12.713,8.712Q13,8.425 13,8Q13,7.575 12.713,7.287Q12.425,7 12,7Q11.575,7 11.288,7.287Q11,7.575 11,8Q11,8.425 11.288,8.712Q11.575,9 12,9ZM12,22Q8.525,21.125 6.263,18.012Q4,14.9 4,11.1V5L12,2L20,5V11.1Q20,14.9 17.738,18.012Q15.475,21.125 12,22ZM12,19.9Q14.6,19.075 16.3,16.6Q18,14.125 18,11.1V6.375L12,4.125L6,6.375V11.1Q6,14.125 7.7,16.6Q9.4,19.075 12,19.9ZM12,12Q12,12 12,12Q12,12 12,12Q12,12 12,12Q12,12 12,12Z"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:fillColor="@android:color/white"
|
||||
android:pathData="M2,14Q1.175,14 0.588,13.412Q0,12.825 0,12V6Q0,5.7 0.125,5.425Q0.25,5.15 0.45,4.95L5.4,0L6.15,0.75Q6.3,0.9 6.4,1.137Q6.5,1.375 6.5,1.6V1.8L5.8,5H11Q11.425,5 11.713,5.287Q12,5.575 12,6V7.25Q12,7.4 11.975,7.537Q11.95,7.675 11.9,7.8L9.65,13.1Q9.475,13.525 9.088,13.762Q8.7,14 8.25,14ZM7.95,12 L10,7.15V7Q10,7 10,7Q10,7 10,7H3.35L3.95,4.3L2,6.2V12Q2,12 2,12Q2,12 2,12ZM18.6,24 L17.85,23.25Q17.7,23.1 17.6,22.863Q17.5,22.625 17.5,22.4V22.2L18.2,19H13Q12.575,19 12.288,18.712Q12,18.425 12,18V16.75Q12,16.6 12.025,16.462Q12.05,16.325 12.1,16.2L14.35,10.9Q14.55,10.475 14.925,10.238Q15.3,10 15.75,10H22Q22.825,10 23.413,10.587Q24,11.175 24,12V18Q24,18.3 23.888,18.562Q23.775,18.825 23.55,19.05ZM16.05,12 L14,16.85V17Q14,17 14,17Q14,17 14,17H20.65L20.05,19.7L22,17.8V12Q22,12 22,12Q22,12 22,12ZM2,12V6.2V7Q2,7 2,7Q2,7 2,7V7.15V12Q2,12 2,12Q2,12 2,12ZM22,12V17.8V17Q22,17 22,17Q22,17 22,17V16.85V12Q22,12 22,12Q22,12 22,12Z"/>
|
||||
</vector>
|
||||
@@ -2,7 +2,7 @@
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:gravity="center_vertical">
|
||||
<shape>
|
||||
<solid android:color="?colorGray500"/>
|
||||
<solid android:color="?colorM3DisabledBackground"/>
|
||||
<corners android:radius="1dp"/>
|
||||
<size android:height="2dp"/>
|
||||
</shape>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
|
||||
<solid android:color="?colorGray25"/>
|
||||
<solid android:color="?colorGray50t"/>
|
||||
<size android:width="18dp" android:height="18dp"/>
|
||||
</shape>
|
||||
@@ -12,7 +12,7 @@
|
||||
android:id="@+id/language_btn"
|
||||
style="@style/Widget.Mastodon.M3.Button.Text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingStart="12dp"
|
||||
android:paddingEnd="12dp"
|
||||
android:drawableStart="@drawable/ic_fluent_local_language_16_regular"
|
||||
|
||||
@@ -3,12 +3,12 @@
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_marginHorizontal="16dp"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<org.joinmastodon.android.ui.views.MaxWidthFrameLayout
|
||||
android:id="@+id/inner"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:layout_marginHorizontal="16dp"
|
||||
android:background="@drawable/bg_search_field"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
@@ -34,7 +34,7 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:paddingEnd="16dp"
|
||||
android:paddingEnd="32dp"
|
||||
android:orientation="vertical">
|
||||
<TextView
|
||||
android:id="@+id/title"
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
android:minWidth="16dp"
|
||||
android:gravity="center_vertical"
|
||||
android:textAppearance="@style/m3_label_large"
|
||||
android:textColor="?android:textColorSecondary"
|
||||
android:maxLines="1"
|
||||
android:ellipsize="end"
|
||||
tools:text="123"
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
<LinearLayout
|
||||
android:id="@+id/button"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="48dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/bg_poll_option_clickable"
|
||||
android:duplicateParentState="true"
|
||||
android:layoutDirection="locale">
|
||||
@@ -41,7 +41,6 @@
|
||||
android:layout_marginEnd="8dp"
|
||||
android:textAppearance="@style/m3_label_large"
|
||||
android:textColor="?colorM3Primary"
|
||||
android:singleLine="true"
|
||||
android:ellipsize="end"
|
||||
android:paddingEnd="26dp"
|
||||
tools:text="scream into void jsfdklfjdalskfjdsalkfjdsalkfjdsalkfdjsalkfdsajlk"/>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:minHeight="75dp"
|
||||
android:id="@+id/warning_wrap"
|
||||
android:background="@drawable/bg_timeline_gap"
|
||||
android:background="@drawable/bg_m3_surface3"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
|
||||
44
mastodon/src/main/res/layout/footer_text_translation.xml
Normal file
44
mastodon/src/main/res/layout/footer_text_translation.xml
Normal file
@@ -0,0 +1,44 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<FrameLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<ProgressBar
|
||||
android:id="@+id/translation_progress"
|
||||
android:layout_width="24dp"
|
||||
android:layout_height="24dp"
|
||||
android:layout_gravity="center"
|
||||
style="?android:progressBarStyleSmall"/>
|
||||
|
||||
<LinearLayout
|
||||
android:orientation="horizontal"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingHorizontal="16dp"
|
||||
android:paddingVertical="8dp"
|
||||
android:clipToPadding="false"
|
||||
android:baselineAligned="false"
|
||||
android:gravity="center_vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/translation_info_text"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:textAppearance="@style/m3_body_small"
|
||||
android:textColor="?colorM3Secondary"
|
||||
tools:text="Translated from Japanese using DeepL.com"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/translation_show_original"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="16dp"
|
||||
style="@style/Widget.Mastodon.M3.Button.Text"
|
||||
android:paddingHorizontal="8dp"
|
||||
android:layout_marginEnd="-8dp"
|
||||
android:text="@string/translation_show_original"/>
|
||||
</LinearLayout>
|
||||
</FrameLayout>
|
||||
@@ -382,7 +382,7 @@
|
||||
</LinearLayout>
|
||||
</ScrollView>
|
||||
|
||||
<org.joinmastodon.android.ui.views.AutoOrientationLinearLayout
|
||||
<LinearLayout
|
||||
android:id="@+id/schedule_draft_view"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
@@ -397,6 +397,7 @@
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="6dp"
|
||||
android:ellipsize="end"
|
||||
android:drawableStart="@drawable/ic_fluent_drafts_20_regular"
|
||||
android:drawableTint="?android:textColorSecondary"
|
||||
android:drawablePadding="16dp"
|
||||
@@ -431,7 +432,7 @@
|
||||
android:tooltipText="@string/sk_compose_no_schedule"
|
||||
android:contentDescription="@string/sk_compose_no_schedule" />
|
||||
|
||||
</org.joinmastodon.android.ui.views.AutoOrientationLinearLayout>
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/bottom_bar"
|
||||
@@ -467,6 +468,8 @@
|
||||
android:padding="0px"
|
||||
android:contentDescription="@string/add_media"
|
||||
android:tooltipText="@string/add_media"
|
||||
android:tint="@color/action_bar_icons"
|
||||
android:tintMode="src_in"
|
||||
android:src="@drawable/ic_fluent_image_add_24_regular"/>
|
||||
|
||||
<ImageButton
|
||||
@@ -477,6 +480,8 @@
|
||||
android:padding="0px"
|
||||
android:contentDescription="@string/add_poll"
|
||||
android:tooltipText="@string/add_poll"
|
||||
android:tint="@color/action_bar_icons"
|
||||
android:tintMode="src_in"
|
||||
android:src="@drawable/ic_fluent_poll_24_selector"/>
|
||||
|
||||
<ImageButton
|
||||
@@ -487,6 +492,8 @@
|
||||
android:padding="0px"
|
||||
android:contentDescription="@string/emoji"
|
||||
android:tooltipText="@string/emoji"
|
||||
android:tint="@color/action_bar_icons"
|
||||
android:tintMode="src_in"
|
||||
android:src="@drawable/ic_fluent_emoji_24_selector"/>
|
||||
|
||||
<ImageButton
|
||||
@@ -497,6 +504,8 @@
|
||||
android:padding="0px"
|
||||
android:contentDescription="@string/content_warning"
|
||||
android:tooltipText="@string/content_warning"
|
||||
android:tint="@color/action_bar_icons"
|
||||
android:tintMode="src_in"
|
||||
android:src="@drawable/ic_fluent_chat_warning_24_selector"/>
|
||||
|
||||
<ImageButton
|
||||
@@ -507,6 +516,8 @@
|
||||
android:padding="0px"
|
||||
android:contentDescription="@string/sk_content_type"
|
||||
android:tooltipText="@string/sk_content_type"
|
||||
android:tint="@color/action_bar_icons"
|
||||
android:tintMode="src_in"
|
||||
android:src="@drawable/ic_fluent_text_edit_style_24_selector"/>
|
||||
|
||||
<ImageButton
|
||||
@@ -520,6 +531,8 @@
|
||||
android:textColor="?android:textColorSecondary"
|
||||
android:background="@drawable/bg_icon_button"
|
||||
android:visibility="gone"
|
||||
android:tint="@color/action_bar_icons"
|
||||
android:tintMode="src_in"
|
||||
android:contentDescription="@string/sk_schedule_or_draft"
|
||||
android:tooltipText="@string/sk_schedule_or_draft" />
|
||||
|
||||
@@ -535,7 +548,7 @@
|
||||
android:layout_marginEnd="24dp"
|
||||
android:background="?android:attr/selectableItemBackgroundBorderless"
|
||||
android:padding="0px"
|
||||
android:tint="@color/compose_button"
|
||||
android:tint="@color/action_bar_icons"
|
||||
android:tintMode="src_in"
|
||||
android:contentDescription="@string/more_options"
|
||||
android:tooltipText="@string/more_options"
|
||||
@@ -564,7 +577,9 @@
|
||||
android:drawablePadding="0dp"
|
||||
android:tooltipText="@string/publish"
|
||||
android:contentDescription="@string/publish"
|
||||
android:src="@drawable/ic_fluent_send_24_selector"
|
||||
android:tint="@color/compose_button"
|
||||
android:tintMode="src_in"
|
||||
android:src="@drawable/ic_fluent_send_24_regular"
|
||||
android:visibility="gone"
|
||||
android:singleLine="true" />
|
||||
|
||||
|
||||
62
mastodon/src/main/res/layout/header_hashtag_timeline.xml
Normal file
62
mastodon/src/main/res/layout/header_hashtag_timeline.xml
Normal file
@@ -0,0 +1,62 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingHorizontal="16dp"
|
||||
android:paddingBottom="8dp">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_toStartOf="@id/follow_btn_wrap"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:textAppearance="@style/m3_headline_small"
|
||||
android:textColor="?colorM3OnSurface"
|
||||
android:maxLines="4"
|
||||
android:ellipsize="end"
|
||||
android:minHeight="36dp"
|
||||
android:gravity="center_vertical"
|
||||
tools:text="#CatsOfMastodonButLong"/>
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/follow_btn_wrap"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignTop="@id/title"
|
||||
android:layout_alignBottom="@id/title"
|
||||
android:layout_alignParentEnd="true">
|
||||
|
||||
<org.joinmastodon.android.ui.views.ProgressBarButton
|
||||
android:id="@+id/profile_action_btn"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="36dp"
|
||||
android:layout_gravity="center"
|
||||
style="@style/Widget.Mastodon.M3.Button.Filled"
|
||||
android:paddingHorizontal="16dp"
|
||||
tools:text="@string/button_follow" />
|
||||
|
||||
<ProgressBar
|
||||
android:id="@+id/action_progress"
|
||||
style="?android:progressBarStyleSmall"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:elevation="10dp"
|
||||
android:indeterminate="true"
|
||||
android:outlineProvider="none"
|
||||
android:visibility="gone" />
|
||||
</FrameLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/subtitle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@id/title"
|
||||
android:layout_marginTop="8dp"
|
||||
android:textAppearance="@style/m3_label_large"
|
||||
android:textColor="?colorM3OnSurfaceVariant"
|
||||
tools:text="123 posts"/>
|
||||
|
||||
</RelativeLayout>
|
||||
@@ -69,7 +69,7 @@
|
||||
android:layout_marginEnd="16dp"
|
||||
android:gravity="center_vertical"
|
||||
android:textAppearance="@style/m3_body_large"
|
||||
android:textColor="#fff"
|
||||
android:textColor="?colorGray50"
|
||||
tools:text="1:23 / 4:56"/>
|
||||
|
||||
</RelativeLayout>
|
||||
|
||||
@@ -5,6 +5,11 @@
|
||||
android:title="@string/sk_pin_timeline"
|
||||
android:icon="@drawable/ic_fluent_pin_24_regular"
|
||||
android:showAsAction="always" />
|
||||
<item
|
||||
android:id="@+id/mute_hashtag"
|
||||
android:icon="@drawable/ic_fluent_speaker_mute_24_regular"
|
||||
android:showAsAction="always"
|
||||
android:title="@string/mo_mute_hashtag"/>
|
||||
<item
|
||||
android:id="@+id/follow_hashtag"
|
||||
android:icon="@drawable/ic_fluent_person_add_24_regular"
|
||||
|
||||
@@ -16,6 +16,10 @@
|
||||
<item android:id="@+id/report" android:title="@string/report_user" android:icon="@drawable/ic_fluent_warning_24_regular"/>
|
||||
</group>
|
||||
<group android:id="@+id/menu_group3">
|
||||
<item android:id="@+id/mute_conversation" android:title="@string/mo_mute_conversation" android:icon="@drawable/ic_fluent_alert_off_24_regular" />
|
||||
<item android:id="@+id/unmute_conversation" android:title="@string/mo_unmute_conversation" android:icon="@drawable/ic_fluent_alert_24_regular" />
|
||||
</group>
|
||||
<group android:id="@+id/menu_group4">
|
||||
<!-- <item android:id="@+id/share" android:title="@string/button_share" android:icon="@drawable/ic_fluent_share_24_regular"/>-->
|
||||
<item android:id="@+id/copy_link" android:title="@string/sk_copy_link_to_post" android:icon="@drawable/ic_fluent_link_24_regular"/>
|
||||
<item android:id="@+id/open_in_browser" android:title="@string/open_in_browser" android:icon="@drawable/ic_fluent_globe_24_regular"/>
|
||||
|
||||
@@ -8,5 +8,7 @@
|
||||
<item android:id="@+id/manage_user_lists" android:title="@string/sk_your_lists" android:icon="@drawable/ic_fluent_people_24_regular"/>
|
||||
<item android:id="@+id/favorites" android:title="@string/your_favorites" android:icon="@drawable/ic_fluent_star_24_regular" android:showAsAction="always"/>
|
||||
<item android:id="@+id/scheduled" android:title="@string/sk_unsent_posts" android:icon="@drawable/ic_fluent_folder_open_24_regular" android:showAsAction="always"/>
|
||||
<item android:id="@+id/mutes" android:title="@string/mo_muted_accounts" android:icon="@drawable/ic_fluent_speaker_off_24_regular"/>
|
||||
<item android:id="@+id/blocks" android:title="@string/mo_blocked_accounts" android:icon="@drawable/ic_fluent_shield_24_regular"/>
|
||||
<item android:id="@+id/share" android:title="@string/share_user" android:icon="@drawable/ic_fluent_share_24_regular"/>
|
||||
</menu>
|
||||
@@ -7,7 +7,7 @@
|
||||
<string name="mo_download_latest_nightly_release">تنزيل آخر إصدار ليلي</string>
|
||||
<string name="mo_double_tap_to_search">الضغط مرتان لفتح البحث</string>
|
||||
<string name="mo_color_palette_black_and_white">أبيض وأسود</string>
|
||||
<string name="mo_personal_note">إضافة ملاحظة إلى هذا الملف التعريفي</string>
|
||||
<string name="mo_personal_note">إضافة ملاحظة حول الملف التعريفي هذا</string>
|
||||
<string name="mo_personal_note_confirm">تأكيد التغييرات التي طرأت على الملاحظة</string>
|
||||
<string name="mo_personal_note_update_failed">فشل حفظ الملاحظة</string>
|
||||
<string name="mo_settings_contribute">المساهمة على Moshidon</string>
|
||||
@@ -46,4 +46,39 @@
|
||||
<string name="mo_notification_audience_settings">جمهور الإشعارات</string>
|
||||
<string name="mo_welcome_text">للبداية، يرجى إدخال اسم نطاق خادمك هنا.</string>
|
||||
<string name="mo_recent_emoji_cleared">تم مسح وجوه الإيموجي التعبيرية</string>
|
||||
<string name="mo_show_media_preview">إظهار معاينات الوسائط في الخيوط الزمنية</string>
|
||||
<string name="mo_settings_show_posts_without_alt">إظهار الوسائط الخالية مِن نص بديل</string>
|
||||
<string name="mo_setting_interaction_count_summary">إظهار عدد الأشخاص الذين تفاعلوا مع منشور ما في الخيوط الزمنية</string>
|
||||
<string name="mo_confirm_to_mute_conversation">أتريد حقا كتم هذه المحادَثة؟</string>
|
||||
<string name="mo_unmute_conversation">إلغاء كتم المحادَثة</string>
|
||||
<string name="mo_mute_conversation">كتم المحادَثة</string>
|
||||
<string name="mo_confirm_unfollow">تأكيد إلغاء متابَعة %s</string>
|
||||
<string name="mo_setting_marquee_summary">تعطيل تمرير العنوان المُقطع</string>
|
||||
<string name="mo_setting_reduced_motion_summary">تعطيل تأثيرات التفاعل</string>
|
||||
<string name="mo_unmute_hashtag">إلغاء كتم الوسم</string>
|
||||
<string name="mo_camera_not_available">الكاميرا غير متوفرة!</string>
|
||||
<string name="mo_unmuted_conversation_successfully">تم إلغاء كتم المحادثة بنجاح</string>
|
||||
<string name="mo_no_image_desc">الصور المدرجة ليس لديها وصف. يرجى النظر في إضافة وصف للسماح للأشخاص ذوي الإعاقة البصرية بالمشاركة.</string>
|
||||
<string name="mo_confirm_to_unmute_conversation">هل أنت متأكد أنك تريد إلغاء كتم هذه المحادثة؟</string>
|
||||
<string name="mo_confirm_to_unmute_hashtag">هل أنت متأكد أنك تريد إلغاء كتم هذا الوسم؟</string>
|
||||
<string name="mo_change_default_reply_visibility_to_unlisted">الرد كـ ”غير مُدرج“ افتراضيًا</string>
|
||||
<string name="mo_composer_behavior">سلوك المحرر</string>
|
||||
<string name="mo_notification_action_replied">تم الرد بنجاح على منشور %s</string>
|
||||
<string name="mo_disable_relocate_publish_button_to_enable_customization">تعطيل ”نقل زر النشر“ للسماح بالتخصيص</string>
|
||||
<string name="mo_enable_dividers">عرض فواصل المنشورات</string>
|
||||
<string name="mo_color_palette_nord">نورد</string>
|
||||
<string name="mo_setting_true_black_summary">قد يوفر الطاقة على شاشات AMOLED</string>
|
||||
<string name="mo_clear_recent_emoji">مسح الرموز التعبيرية المستخدَمة مؤخرًا</string>
|
||||
<string name="mo_muted_conversation_successfully">تم كتم المحادثة بنجاح</string>
|
||||
<string name="mo_filtered">مُصَفى: %s</string>
|
||||
<string name="mo_setting_play_gif_summary">تحريك الرموز التعبيرية و GIF للصور الرمزية</string>
|
||||
<string name="mo_mute_hashtag">أكتم الوسم</string>
|
||||
<string name="mo_disable_reminder_to_add_alt_text">تعطيل تذكير إضافة نص بديل</string>
|
||||
<string name="mo_muting">الكتم جارٍ…</string>
|
||||
<string name="mo_unmuting">جارٍ إلغاء الكتم…</string>
|
||||
<string name="mo_confirm_to_mute_hashtag">هل أنت متأكد أنك تريد كتم هذا الوسم؟</string>
|
||||
<string name="mo_hide_compose_button_while_scrolling_setting">إخفاء زر النشر أثناء التمرير</string>
|
||||
<string name="mo_fab_compose">تحرير</string>
|
||||
<string name="mo_relocate_publish_button">نقل زر النشر</string>
|
||||
<string name="mo_setting_remote_follower_summary">إظهار المتابِعين مِن الخوادم الأخرى</string>
|
||||
</resources>
|
||||
@@ -8,7 +8,7 @@
|
||||
<string name="ok">حسنًا</string>
|
||||
<string name="preparing_auth">جَارٍ الإعدَادُ لِلمُصادَقَة…</string>
|
||||
<string name="finishing_auth">يُنهي المصادقة…</string>
|
||||
<string name="user_boosted">%s إعادة نشر</string>
|
||||
<string name="user_boosted">قام %s بإعادة نشر</string>
|
||||
<string name="in_reply_to">ردًا على %s</string>
|
||||
<string name="notifications">الإشعارات</string>
|
||||
<string name="user_followed_you">%s بَدَأ بِمُتابَعَتِك</string>
|
||||
@@ -242,7 +242,7 @@
|
||||
<string name="skip">تخطى</string>
|
||||
<string name="notification_type_follow">متابعُون جُدُد</string>
|
||||
<string name="notification_type_favorite">المفضلة</string>
|
||||
<string name="notification_type_reblog">المشاركات</string>
|
||||
<string name="notification_type_reblog">المعاد نشرها</string>
|
||||
<string name="notification_type_mention">الإشارات</string>
|
||||
<string name="notification_type_poll">استطلاع رأي</string>
|
||||
<string name="choose_account">اختر حسابًا</string>
|
||||
@@ -277,7 +277,7 @@
|
||||
<string name="more_options">مزيد من الخيارات</string>
|
||||
<string name="new_post">منشور جديد</string>
|
||||
<string name="button_reply">ردّ</string>
|
||||
<string name="button_reblog">شارك</string>
|
||||
<string name="button_reblog">إعادة النشر</string>
|
||||
<string name="button_favorite">فضّل</string>
|
||||
<string name="button_share">شارك</string>
|
||||
<string name="media_no_description">وسائط بدون وصف</string>
|
||||
@@ -292,8 +292,8 @@
|
||||
<string name="followed_user">أنت تتابع الآن %s</string>
|
||||
<string name="following_user_requested">طَلَبَ %s مُتابَعتك</string>
|
||||
<string name="open_in_browser">افتح في المتصفح</string>
|
||||
<string name="hide_boosts_from_user">اخف مشاركات %s</string>
|
||||
<string name="show_boosts_from_user">أظهر مشاركات %s</string>
|
||||
<string name="hide_boosts_from_user">أخفِ المعاد نشرها مِن %s</string>
|
||||
<string name="show_boosts_from_user">أظهر ما أعاد %s نشرَه</string>
|
||||
<string name="signup_reason">لماذا تريد الانضمام؟</string>
|
||||
<string name="signup_reason_note">هذا سوف يساعدنا في مراجعة تطبيقك.</string>
|
||||
<string name="clear">امسح</string>
|
||||
@@ -346,10 +346,10 @@
|
||||
<item quantity="other">%,d تفضيل</item>
|
||||
</plurals>
|
||||
<plurals name="x_reblogs">
|
||||
<item quantity="zero">%,d إعادة نشر</item>
|
||||
<item quantity="zero">لم يُعد نشره</item>
|
||||
<item quantity="one">إعادة نشر واحدة</item>
|
||||
<item quantity="two">أعيد نشره مرّتان</item>
|
||||
<item quantity="few">أعيد نشره %,d مرة</item>
|
||||
<item quantity="few">أعيد نشره %,d مرات</item>
|
||||
<item quantity="many">أعيد نشره %,d مرات</item>
|
||||
<item quantity="other">أعيد نشره %,d مرات</item>
|
||||
</plurals>
|
||||
@@ -698,4 +698,18 @@
|
||||
<string name="time_minutes_ago_short">مُنذُ %dد</string>
|
||||
<string name="time_hours_ago_short">مُنذُ %dسا</string>
|
||||
<string name="time_days_ago_short">مُنذُ %d أيام</string>
|
||||
<!-- %s is the name of the post language -->
|
||||
<string name="translate_post">تُرجِم مِن %s</string>
|
||||
<!-- %1$s is the language, %2$s is the name of the translation service -->
|
||||
<string name="post_translated">مُترجَم مِن %1$s باستخدام %2$s</string>
|
||||
<string name="translation_show_original">إظهار الأصل</string>
|
||||
<string name="translation_failed">فشِلَت الترجَمة. قد لم يتمكّن مدير الخادم من تفعيل الترجمات على هذا الخادم أو أنّ هذا الخادم يُشغِّل نسخة قديمة من ماستدون حيث الترجمات غير مدعومة بعد.</string>
|
||||
<plurals name="x_participants">
|
||||
<item quantity="zero">لا مُشارِك</item>
|
||||
<item quantity="one">مشارِك واحد</item>
|
||||
<item quantity="two">مشاركَيْنِ</item>
|
||||
<item quantity="few">مشاركين</item>
|
||||
<item quantity="many">مُشارِكًا</item>
|
||||
<item quantity="other">مُشارك</item>
|
||||
</plurals>
|
||||
</resources>
|
||||
|
||||
@@ -249,4 +249,55 @@
|
||||
<string name="sk_notify_poll_results">نتيجة استطلاع الرأي</string>
|
||||
<string name="sk_filtered">تمت تصفيته: %s</string>
|
||||
<string name="sk_search_fediverse">البحث في الفديفرس</string>
|
||||
<string name="sk_suicide_search_terms">انتحار, انتِحار, الانتحار, الإنتحار, أنتحر</string>
|
||||
<string name="sk_search_suicide_title">إن كنت في مِحنة وبحاجة إلى مساعدة…</string>
|
||||
<string name="sk_search_suicide_message">إذا كنت تبحث عن إشارة لعدم الانتحار، فها هي. إذا كنت تعاني من ضائقة و/أو تراودك أفكار انتحارية، وإذا كنت بحاجة إلى مساعدة، فيمكنك الاتصال بخط المساعدة للوقاية من الانتحار إن كنت في مِحنة.</string>
|
||||
<string name="sk_load_missing_posts_above">حمِّل المنشورات الحديثة</string>
|
||||
<string name="sk_load_missing_posts_below">حمِّل المنشورات القديمة</string>
|
||||
<string name="sk_time_seconds">%d ثواني</string>
|
||||
<string name="sk_time_minutes">%d دقائق</string>
|
||||
<string name="sk_time_hours">%d ساعات</string>
|
||||
<string name="sk_time_days">%d أيام</string>
|
||||
<string name="sk_search_suicide_hotlines">للعثور على خط للمساعدة</string>
|
||||
<string name="sk_confirm_delete_scheduled_post_title">احذف المنشور المُبَرمَج</string>
|
||||
<string name="sk_compose_scheduled">مُبَرمَج لـ</string>
|
||||
<string name="sk_do_remove_follower">إزالة</string>
|
||||
<string name="sk_icon_academic_cap">قبعة جامعية</string>
|
||||
<string name="sk_icon_tag">ملصقة</string>
|
||||
<string name="sk_add_timeline_tag_error_empty">لا يجب أن يُترَك الوسم فارغًا</string>
|
||||
<string name="sk_unfinished_attachments">إصلاح المرفقات؟</string>
|
||||
<plurals name="sk_posts_count_label">
|
||||
<item quantity="zero">لا منشور</item>
|
||||
<item quantity="one">منشور واحد</item>
|
||||
<item quantity="two">منشورَيْنِ</item>
|
||||
<item quantity="few">منشورات</item>
|
||||
<item quantity="many">منشورًا</item>
|
||||
<item quantity="other">منشور</item>
|
||||
</plurals>
|
||||
<string name="sk_notification_mention">لقد قام %s بذِكرك</string>
|
||||
<string name="sk_settings_emoji_reactions">تمكين الوجوه التعبيرية للتفاعل</string>
|
||||
<string name="sk_icon_verified">مُتحَقَّق مِنه</string>
|
||||
<string name="sk_switch_timeline">تبديل الخيط الزمني</string>
|
||||
<string name="sk_settings_show_emoji_reactions_always">إظهار زر الإضافة دائما</string>
|
||||
<string name="sk_do_not_show_again">لا تظهر مرة أخرى</string>
|
||||
<string name="sk_settings_display_pronouns_in_user_listings">إظهار الأسماء في قوائم المستخدِمين</string>
|
||||
<string name="sk_post_contains_media">يحتوي المنشور على وسائط</string>
|
||||
<string name="sk_settings_see_new_posts_button">أظهر زِرّ ”إظهار المنشورات الجديدة“</string>
|
||||
<string name="sk_followed_as">مُتابَع عبر %s</string>
|
||||
<string name="sk_settings_allow_remote_loading">تحميل المعلومات مِن الخوادم البعيدة</string>
|
||||
<string name="sk_content_type_html">HTML</string>
|
||||
<string name="sk_reacted">تَفاعَل %s</string>
|
||||
<string name="sk_reacted_with">تَفاعَلَ %1$s مع %2$s</string>
|
||||
<string name="sk_external_share_or_open_title">إعادة نشر أو فتح بحساب آخَر</string>
|
||||
<string name="sk_content_type_plain">نص عادي</string>
|
||||
<string name="sk_settings_prefix_replies_always">ردًّا على أي كان</string>
|
||||
<string name="sk_settings_forward_report_default">إعادة ”تحويل الإبلاغ“ افتراضيا</string>
|
||||
<string name="sk_content_type_mfm">MFM</string>
|
||||
<string name="sk_settings_hide_fab">إخفاء زر التحرير مبدئيا</string>
|
||||
<string name="sk_enter_emoji_hint">اضغط للتفاعل بوجوه تعبيرية</string>
|
||||
<string name="sk_content_type_markdown">Markdown</string>
|
||||
<string name="sk_content_type_bbcode">BBCode</string>
|
||||
<string name="sk_enter_emoji_toast">يُرجى إدخال إيموجي</string>
|
||||
<string name="sk_in_reply">ردّا على</string>
|
||||
<string name="sk_open_in_app_failed">لا يمكن فتحه في التطبيق</string>
|
||||
</resources>
|
||||
@@ -527,4 +527,6 @@
|
||||
<string name="time_minutes_ago_short">%d хв таму</string>
|
||||
<string name="time_hours_ago_short">%d г таму</string>
|
||||
<string name="time_days_ago_short">%d дз таму</string>
|
||||
<!-- %s is the name of the post language -->
|
||||
<!-- %1$s is the language, %2$s is the name of the translation service -->
|
||||
</resources>
|
||||
|
||||
@@ -199,4 +199,6 @@
|
||||
<!-- %s is the timestamp ("tomorrow at 12:34") -->
|
||||
<!-- Shown like a content warning, %s is the name of the filter -->
|
||||
<!-- Shown in the post header. Please keep it short -->
|
||||
<!-- %s is the name of the post language -->
|
||||
<!-- %1$s is the language, %2$s is the name of the translation service -->
|
||||
</resources>
|
||||
|
||||
@@ -182,4 +182,6 @@
|
||||
<!-- %s is the timestamp ("tomorrow at 12:34") -->
|
||||
<!-- Shown like a content warning, %s is the name of the filter -->
|
||||
<!-- Shown in the post header. Please keep it short -->
|
||||
<!-- %s is the name of the post language -->
|
||||
<!-- %1$s is the language, %2$s is the name of the translation service -->
|
||||
</resources>
|
||||
|
||||
@@ -293,4 +293,6 @@
|
||||
<!-- %s is the timestamp ("tomorrow at 12:34") -->
|
||||
<!-- Shown like a content warning, %s is the name of the filter -->
|
||||
<!-- Shown in the post header. Please keep it short -->
|
||||
<!-- %s is the name of the post language -->
|
||||
<!-- %1$s is the language, %2$s is the name of the translation service -->
|
||||
</resources>
|
||||
|
||||
@@ -639,4 +639,6 @@
|
||||
<string name="time_minutes_ago_short">Před %dm</string>
|
||||
<string name="time_hours_ago_short">Před %dh</string>
|
||||
<string name="time_days_ago_short">Před %dd</string>
|
||||
<!-- %s is the name of the post language -->
|
||||
<!-- %1$s is the language, %2$s is the name of the translation service -->
|
||||
</resources>
|
||||
|
||||
@@ -503,4 +503,6 @@
|
||||
<string name="search_open_url">Åbn URL i Mastodon</string>
|
||||
<string name="posts_matching_hashtag">Indlæg med “%s”</string>
|
||||
<!-- Shown in the post header. Please keep it short -->
|
||||
<!-- %s is the name of the post language -->
|
||||
<!-- %1$s is the language, %2$s is the name of the translation service -->
|
||||
</resources>
|
||||
|
||||
@@ -582,4 +582,6 @@
|
||||
<string name="time_minutes_ago_short">vor %d Minuten</string>
|
||||
<string name="time_hours_ago_short">vor %d Stunden</string>
|
||||
<string name="time_days_ago_short">vor %d Tagen</string>
|
||||
<!-- %s is the name of the post language -->
|
||||
<!-- %1$s is the language, %2$s is the name of the translation service -->
|
||||
</resources>
|
||||
|
||||
@@ -81,4 +81,21 @@
|
||||
<string name="mo_haptic_feedback">Haptisches Feedback</string>
|
||||
<string name="mo_setting_haptic_feedback_summary">Vibrieren beim Interagieren mit Posts</string>
|
||||
<string name="mo_camera_not_available">Keine Kamera verfügbar!</string>
|
||||
<string name="mo_show_media_preview">Medienvorschau in Timelines anzeigen</string>
|
||||
<string name="mo_recent_emoji_cleared">Neueste Emoji gelöscht</string>
|
||||
<string name="mo_double_tap_to_search">Doppeltippen zum Öffnen der Suche</string>
|
||||
<string name="mo_unmute_hashtag">Stummschaltung des Hashtags aufheben</string>
|
||||
<string name="mo_muted_accounts">Stummgeschaltete Konten</string>
|
||||
<string name="mo_unmuted_conversation_successfully">Stummschaltung der Konversation erfolgreich aufgehoben</string>
|
||||
<string name="mo_confirm_to_unmute_conversation">Sind Sie sicher, dass Sie die Stummschaltung dieser Konversation aufheben möchten\?</string>
|
||||
<string name="mo_confirm_to_unmute_hashtag">Sind Sie sicher, dass Sie die Stummschaltung dieses Hashtags aufheben möchten\?</string>
|
||||
<string name="mo_blocked_accounts">Gesperrte Konten</string>
|
||||
<string name="mo_confirm_to_mute_conversation">Sind Sie sicher, dass Sie diese Konversation stummschalten möchten\?</string>
|
||||
<string name="mo_muted_conversation_successfully">Konversation erfolgreich stummgeschaltet</string>
|
||||
<string name="mo_unmute_conversation">Stummschaltung für Konversation aufheben</string>
|
||||
<string name="mo_mute_conversation">Konversation stummschalten</string>
|
||||
<string name="mo_mute_hashtag">Hashtag stummschalten</string>
|
||||
<string name="mo_muting">Stummschalten…</string>
|
||||
<string name="mo_unmuting">Stummschaltung aufheben…</string>
|
||||
<string name="mo_confirm_to_mute_hashtag">Sind Sie sicher, dass Sie diesen Hashtag stummschalten möchten\?</string>
|
||||
</resources>
|
||||
@@ -382,10 +382,6 @@
|
||||
<item quantity="other">Beiträge</item>
|
||||
</plurals>
|
||||
<string name="sk_settings_show_labels_in_navigation_bar">Tab-Bezeichnungen in der Navigationsleiste anzeigen</string>
|
||||
<string name="sk_time_seconds">%d Sekunden</string>
|
||||
<string name="sk_time_minutes">%d Minuten</string>
|
||||
<string name="sk_time_hours">%d Stunden</string>
|
||||
<string name="sk_time_days">%d Tage</string>
|
||||
<string name="sk_suicide_helplines_url">https://findahelpline.com</string>
|
||||
<string name="sk_load_missing_posts_below">Ältere Beiträge laden</string>
|
||||
<string name="sk_load_missing_posts_above">Neuere Beiträge laden</string>
|
||||
|
||||
@@ -387,6 +387,7 @@
|
||||
<string name="welcome_to_mastodon">Καλώς ήρθες στο Mastodon</string>
|
||||
<string name="welcome_paragraph1">Το Mastodon είναι ένα αποκεντρωμένο κοινωνικό δίκτυο που σημαίνει ότι καμία εταιρεία δεν το ελέγχει. Αποτελείται από πολλούς ανεξάρτητους διακομιστές, όλοι συνδεδεμένοι μαζί.</string>
|
||||
<string name="what_are_servers">Τι είναι οι διακομιστές;</string>
|
||||
<string name="welcome_paragraph2">Κάθε λογαριασμός Mastodon φιλοξενείται σε ένα διακομιστή - ο καθένας με τις δικές του αξίες, κανόνες & διαχειριστές. Ανεξάρτητα από το ποιον μπορεί να επιλέξεις, μπορείς να ακολουθήσεις και να αλληλεπιδράσεις με άτομα από οποιονδήποτε διακομιστή.</string>
|
||||
<string name="opening_link">Άνοιγμα συνδέσμου…</string>
|
||||
<string name="link_not_supported">Αυτός ο σύνδεσμος δεν υποστηρίζεται στην εφαρμογή</string>
|
||||
<string name="log_out_all_accounts">Αποσύνδεση από όλους τους λογαριασμούς</string>
|
||||
@@ -581,4 +582,21 @@
|
||||
<string name="time_minutes_ago_short">%dλ πριν</string>
|
||||
<string name="time_hours_ago_short">%dώ πριν</string>
|
||||
<string name="time_days_ago_short">%dημ πριν</string>
|
||||
<!-- %s is the name of the post language -->
|
||||
<string name="translate_post">Μετάφραση από %s</string>
|
||||
<!-- %1$s is the language, %2$s is the name of the translation service -->
|
||||
<string name="post_translated">Μεταφράστηκε από %1$s χρησιμοποιώντας %2$s</string>
|
||||
<string name="translation_show_original">Εμφάνιση αρχικού</string>
|
||||
<string name="translation_failed">Η μετάφραση απέτυχε. Ίσως ο διαχειριστής δεν έχει ενεργοποιήσει μεταφράσεις σε αυτόν τον διακομιστή ή αυτός ο διακομιστής εκτελεί μια παλαιότερη έκδοση του Mastodon όπου οι μεταφράσεις δεν υποστηρίζονται ακόμα.</string>
|
||||
<string name="settings_privacy">Ιδιωτικότητα και προσιτότητα</string>
|
||||
<string name="settings_discoverable">Παροχή προφίλ και δημοσιεύσεων σε αλγορίθμους ανακάλυψης</string>
|
||||
<string name="settings_indexable">Συμπερίληψη δημόσιων αναρτήσεων στα αποτελέσματα αναζήτησης</string>
|
||||
<plurals name="x_participants">
|
||||
<item quantity="one">%,d συμμετέχων</item>
|
||||
<item quantity="other">%,d συμμετέχοντες</item>
|
||||
</plurals>
|
||||
<plurals name="x_posts_today">
|
||||
<item quantity="one">%,d ανάρτηση σήμερα</item>
|
||||
<item quantity="other">%,d αναρτήσεις σήμερα</item>
|
||||
</plurals>
|
||||
</resources>
|
||||
|
||||
@@ -573,4 +573,6 @@
|
||||
<string name="time_minutes_ago_short">hace %dm</string>
|
||||
<string name="time_hours_ago_short">hace %dh</string>
|
||||
<string name="time_days_ago_short">hace %dd</string>
|
||||
<!-- %s is the name of the post language -->
|
||||
<!-- %1$s is the language, %2$s is the name of the translation service -->
|
||||
</resources>
|
||||
|
||||
@@ -44,9 +44,9 @@
|
||||
<string name="mo_confirm_unfollow_title">Dejar de seguir</string>
|
||||
<string name="mo_confirm_unfollow">Confirmar para dejar de seguir a %s</string>
|
||||
<string name="mo_instance_contact">Contacto</string>
|
||||
<string name="mo_instance_users">Usuarixs</string>
|
||||
<string name="mo_instance_users">Cuentas</string>
|
||||
<string name="mo_instance_status">Publicaciones</string>
|
||||
<string name="mo_instance_registration_open">Abrir</string>
|
||||
<string name="mo_instance_registration_open">Abierto</string>
|
||||
<string name="mo_instance_registration_approval">Requiere aprobación</string>
|
||||
<string name="mo_instance_info_open_timeline">Cronología Local</string>
|
||||
<string name="mo_instance_info_moderated_servers">Servidores moderados</string>
|
||||
@@ -75,10 +75,24 @@
|
||||
<string name="mo_haptic_feedback">Vibración</string>
|
||||
<string name="mo_color_palette_black_and_white">Blanco y Negro</string>
|
||||
<string name="mo_donate_url">https://github.com/sponsors/LucasGGamerM</string>
|
||||
<string name="mo_settings_show_posts_without_alt">Mostrar las publicaciones de los medios a las que les falta un texto alternativo</string>
|
||||
<string name="mo_settings_show_posts_without_alt">Mostrar las publicaciones con multimedia que carece de un texto alternativo</string>
|
||||
<string name="mo_repo_url">https://github.com/LucasGGamerM/moshidon</string>
|
||||
<string name="mo_settings_show_posts_without_alt_summary">Las publicaciones estarán ocultas en todas las líneas de tiempo, pero se pueden revelar en los hilos y las notificaciones</string>
|
||||
<string name="mo_settings_show_posts_without_alt_summary">Las publicaciones estarán ocultas en todas las cronologías, pero se pueden mostrar en los hilos y las notificaciones</string>
|
||||
<string name="mo_show_media_preview">Mostrar previsualización de multimedia en la cronología</string>
|
||||
<string name="mo_recent_emoji_cleared">Emojis recientes eliminados</string>
|
||||
<string name="mo_double_tap_to_search">Doble toque para abrir la búsqueda</string>
|
||||
<string name="mo_unmuted_conversation_successfully">Conversación sin silencio</string>
|
||||
<string name="mo_confirm_to_unmute_conversation">¿Quieres dejar de silenciar esta conversación\?</string>
|
||||
<string name="mo_confirm_to_mute_conversation">¿Quieres silenciar esta conversación\?</string>
|
||||
<string name="mo_muted_conversation_successfully">Conversación silenciada</string>
|
||||
<string name="mo_unmute_conversation">No silenciar conversación</string>
|
||||
<string name="mo_mute_conversation">Silenciar conversación</string>
|
||||
<string name="mo_muting">Silenciando…</string>
|
||||
<string name="mo_unmuting">Quitando silencio…</string>
|
||||
<string name="mo_unmute_hashtag">No silenciar etiqueta</string>
|
||||
<string name="mo_muted_accounts">Cuentas silenciadas</string>
|
||||
<string name="mo_confirm_to_unmute_hashtag">¿Seguro que quieres dejar de silenciar esta etiqueta\?</string>
|
||||
<string name="mo_blocked_accounts">Cuentas bloqueadas</string>
|
||||
<string name="mo_mute_hashtag">Silenciar etiqueta</string>
|
||||
<string name="mo_confirm_to_mute_hashtag">¿Seguro que quieres silenciar esta etiqueta\?</string>
|
||||
</resources>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user