Compare commits
206 Commits
bugfix/but
...
1.1.4+fork
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c3e5f4d254 | ||
|
|
2e5ff452fd | ||
|
|
c397c08e40 | ||
|
|
a4d2101f54 | ||
|
|
f956a17797 | ||
|
|
1c1d1772a3 | ||
|
|
4db87feec4 | ||
|
|
bef3c72513 | ||
|
|
4fa641b482 | ||
|
|
885b5d781a | ||
|
|
2f3bfb3e74 | ||
|
|
2be625fd76 | ||
|
|
134a371263 | ||
|
|
8b0eddb8e1 | ||
|
|
bd2d56b953 | ||
|
|
38e429f738 | ||
|
|
de8b15d447 | ||
|
|
0df1bcce31 | ||
|
|
4e17256cfa | ||
|
|
e12c3e2d68 | ||
|
|
aec2704f15 | ||
|
|
31f9173126 | ||
|
|
90196df65d | ||
|
|
6b9fa71806 | ||
|
|
130085f804 | ||
|
|
f4356e74a4 | ||
|
|
9c8a4b7a8e | ||
|
|
b7ccf1144c | ||
|
|
87d5b92a99 | ||
|
|
29f8260852 | ||
|
|
060745869b | ||
|
|
1aff3eacd8 | ||
|
|
0207ddb774 | ||
|
|
78d0add808 | ||
|
|
2fa042490a | ||
|
|
885f559092 | ||
|
|
77af7ceae3 | ||
|
|
09d4188d54 | ||
|
|
1ad03828e3 | ||
|
|
870ac2b946 | ||
|
|
394a3eebb1 | ||
|
|
95c10a9fea | ||
|
|
f0e14c5a13 | ||
|
|
616049bff2 | ||
|
|
1a79bc0b61 | ||
|
|
d43cbe642f | ||
|
|
77cee4c46a | ||
|
|
0949ad1ce6 | ||
|
|
1e411c0c23 | ||
|
|
76d306aef7 | ||
|
|
7ff19ef481 | ||
|
|
6650bb946f | ||
|
|
bbbf1683aa | ||
|
|
5cdea99eb0 | ||
|
|
356426b5fc | ||
|
|
7577d60f42 | ||
|
|
8c7364d57d | ||
|
|
c0a2945378 | ||
|
|
1af9a71210 | ||
|
|
dc859fe91c | ||
|
|
d50c37af23 | ||
|
|
00c8a03b80 | ||
|
|
d15d222b72 | ||
|
|
34d134cb57 | ||
|
|
40eb3e2400 | ||
|
|
0af45e5f56 | ||
|
|
82e3250623 | ||
|
|
533a51fc77 | ||
|
|
6fc82cf26b | ||
|
|
6dcfdb9735 | ||
|
|
217d8348d4 | ||
|
|
9bce934944 | ||
|
|
a1ef3e1cae | ||
|
|
978c1cfdc4 | ||
|
|
9fb9ffc269 | ||
|
|
4f357637de | ||
|
|
1acd177e81 | ||
|
|
e4b1bf452f | ||
|
|
ce22cb4678 | ||
|
|
3c45215fca | ||
|
|
b17e63acae | ||
|
|
859ba5ebb9 | ||
|
|
164579cbb5 | ||
|
|
990f8189e4 | ||
|
|
4d0a642fd9 | ||
|
|
84b2994b99 | ||
|
|
efbca327c1 | ||
|
|
aa4b007d25 | ||
|
|
23dccef4b4 | ||
|
|
1ef96ed5e6 | ||
|
|
31e2a32233 | ||
|
|
168ae80743 | ||
|
|
8acf23ddac | ||
|
|
eb40211582 | ||
|
|
bf35161c9f | ||
|
|
456c50f69e | ||
|
|
587212cf46 | ||
|
|
fe800a259d | ||
|
|
c193741013 | ||
|
|
a7b752264f | ||
|
|
9075027f69 | ||
|
|
28faf4277a | ||
|
|
120ab8ca54 | ||
|
|
a3fc1a6a74 | ||
|
|
ec1fe07fea | ||
|
|
e3d054ae3e | ||
|
|
795d4b0801 | ||
|
|
0cf0f07f2d | ||
|
|
2cc5872ec7 | ||
|
|
6a151e00ac | ||
|
|
1e99862d40 | ||
|
|
3a1b12306b | ||
|
|
e31db6d506 | ||
|
|
b22c0a5d3d | ||
|
|
e7d856acf4 | ||
|
|
ee8b087b61 | ||
|
|
4e86314df5 | ||
|
|
cf5fbe3b55 | ||
|
|
952416fefc | ||
|
|
1645ce4486 | ||
|
|
2bde95b4d2 | ||
|
|
2de003c5bb | ||
|
|
a04e16c572 | ||
|
|
eb41d77d54 | ||
|
|
9325590319 | ||
|
|
d32a57a18d | ||
|
|
13b5462f63 | ||
|
|
480d4ad904 | ||
|
|
7fa52247e8 | ||
|
|
5a547015e6 | ||
|
|
513736f765 | ||
|
|
c6164b1bcd | ||
|
|
87342782d7 | ||
|
|
a4b18de72c | ||
|
|
3064b549cd | ||
|
|
6666f82329 | ||
|
|
ad87efa7e2 | ||
|
|
d06cf1bb1e | ||
|
|
096aa23f69 | ||
|
|
2464042329 | ||
|
|
928b04eda6 | ||
|
|
a31e33415e | ||
|
|
87ce6b8bb1 | ||
|
|
bb08d6585c | ||
|
|
94fa1133fd | ||
|
|
83822b8f69 | ||
|
|
9f3bd186ba | ||
|
|
58cb338cb2 | ||
|
|
6f447909eb | ||
|
|
af953e294d | ||
|
|
7504a1b9cb | ||
|
|
60ee781004 | ||
|
|
4b88ce5115 | ||
|
|
3842ecb0d1 | ||
|
|
3713063ce3 | ||
|
|
83b089457e | ||
|
|
ed9813f093 | ||
|
|
e45f3f30f3 | ||
|
|
df44d4cc4f | ||
|
|
b666048603 | ||
|
|
153542e1b4 | ||
|
|
57e0b96f36 | ||
|
|
ff65d150e3 | ||
|
|
88474ba826 | ||
|
|
dd92f1b66f | ||
|
|
7c7f3cc42a | ||
|
|
734a8049a5 | ||
|
|
417faa66f9 | ||
|
|
7223a13d08 | ||
|
|
a55002da0c | ||
|
|
ce89733f2d | ||
|
|
18811ec32a | ||
|
|
e65e6163ba | ||
|
|
9c3db24d2f | ||
|
|
19abbe199b | ||
|
|
b33003f7b0 | ||
|
|
9a5747efc8 | ||
|
|
980503ed57 | ||
|
|
c2dd858de8 | ||
|
|
d2ef6fb567 | ||
|
|
9c996b3568 | ||
|
|
2387d84bc0 | ||
|
|
3bd69b5447 | ||
|
|
71f6311598 | ||
|
|
e808977717 | ||
|
|
8594e34bb5 | ||
|
|
4591f06d63 | ||
|
|
b9c3143c6f | ||
|
|
adefb0e567 | ||
|
|
5a8fed3c06 | ||
|
|
2c1b8da475 | ||
|
|
707c51e4d6 | ||
|
|
26297fbb5b | ||
|
|
cd342d1034 | ||
|
|
029650ef2d | ||
|
|
ac24f636df | ||
|
|
1688168bc1 | ||
|
|
46b842afc4 | ||
|
|
3f773a52cc | ||
|
|
48664bb580 | ||
|
|
094cd67728 | ||
|
|
9d800106cc | ||
|
|
68bb23e3b4 | ||
|
|
68397bd487 | ||
|
|
3104ddb4b6 | ||
|
|
9bddd6b274 |
@@ -9,8 +9,8 @@ android {
|
||||
applicationId "org.joinmastodon.android.moshinda"
|
||||
minSdk 23
|
||||
targetSdk 33
|
||||
versionCode 86
|
||||
versionName "1.1.4+fork.86.moshinda"
|
||||
versionCode 87
|
||||
versionName "1.1.4+fork.87.moshinda"
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
resConfigs "ar-rSA", "be-rBY", "bn-rBD", "bs-rBA", "ca-rES", "cs-rCZ", "de-rDE", "el-rGR", "es-rES", "eu-rES", "fi-rFI", "fil-rPH", "fr-rFR", "ga-rIE", "gd-rGB", "gl-rES", "hi-rIN", "hr-rHR", "hu-rHU", "hy-rAM", "in-rID", "is-rIS", "it-rIT", "iw-rIL", "ja-rJP", "kab", "ko-rKR", "nl-rNL", "oc-rFR", "pl-rPL", "pt-rBR", "pt-rPT", "ro-rRO", "ru-rRU", "si-rLK", "sl-rSI", "sv-rSE", "th-rTH", "tr-rTR", "uk-rUA", "vi-rVN", "zh-rCN", "zh-rTW"
|
||||
}
|
||||
|
||||
@@ -36,4 +36,50 @@ shadowsocial.org
|
||||
kiwifarms.net
|
||||
kiwifarms.cc
|
||||
kiwifarms.is
|
||||
kiwifarms.pleroma.net
|
||||
kiwifarms.pleroma.net
|
||||
|
||||
|
||||
# https://mastodon.art/@Curator/109649354849593592
|
||||
|
||||
poa.st antisemitic racist homophobic
|
||||
nicecrew.digital antisemitic
|
||||
beefyboys.win antisemitic racist homophobic harassment
|
||||
cawfee.club antisemitic racist homophobic
|
||||
comfyboy.club antisemitic racist homophobic
|
||||
freespeechextremist.com racist homophobic
|
||||
cum.salon racist misogynist
|
||||
bae.st racist
|
||||
natehiggers.online racist
|
||||
rapemeat.solutions misogynist
|
||||
rapist.town misogynist
|
||||
rapefeminists.network misogynist
|
||||
kiwifarms.cc harassment
|
||||
noagendasocial.com noagenda
|
||||
posting.lolicon.rocks underage
|
||||
urchan.org harassment homophobic racist
|
||||
ryona.agency harassment
|
||||
yggdrasil.social antisemitic homophobic racist
|
||||
genderheretics.xyz transphobic
|
||||
baraag.net underage
|
||||
lolison.top underage
|
||||
shota.house underage
|
||||
shota.social underage
|
||||
aethy.com underage
|
||||
taullo.social underage
|
||||
childpawn.shop underage
|
||||
posting.lolicon.rocks underage
|
||||
loli.best underage
|
||||
gothloli.club underage
|
||||
smuglo.li underage
|
||||
youjo.love underage
|
||||
pedo.school underage
|
||||
lolison.network underage
|
||||
freak.university underage
|
||||
mirr0r.city underage
|
||||
xhais.love underage
|
||||
refusal.biz underage
|
||||
refusal.llc underage
|
||||
mirr0r.city underage
|
||||
nnia.space underage
|
||||
ignorelist.com malicious
|
||||
repl.co malicious
|
||||
|
||||
|
@@ -37,8 +37,8 @@ public class PushNotificationReceiver extends BroadcastReceiver{
|
||||
private static final String TAG="PushNotificationReceive";
|
||||
|
||||
public static final int NOTIFICATION_ID=178;
|
||||
|
||||
private static int notificationID;
|
||||
private static final int SUMMARY_ID = 791;
|
||||
private static int notificationId = 0;
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent){
|
||||
@@ -99,6 +99,7 @@ public class PushNotificationReceiver extends BroadcastReceiver{
|
||||
Account self=AccountSessionManager.getInstance().getAccount(accountID).self;
|
||||
String accountName="@"+self.username+"@"+AccountSessionManager.getInstance().getAccount(accountID).domain;
|
||||
Notification.Builder builder;
|
||||
Notification.Builder summaryNotification;
|
||||
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
|
||||
boolean hasGroup=false;
|
||||
List<NotificationChannelGroup> channelGroups=nm.getNotificationChannelGroups();
|
||||
@@ -121,31 +122,36 @@ public class PushNotificationReceiver extends BroadcastReceiver{
|
||||
nm.createNotificationChannels(channels);
|
||||
}
|
||||
builder=new Notification.Builder(context, accountID+"_"+pn.notificationType);
|
||||
// summaryNotification=new Notification.Builder(context, accountID);
|
||||
}else{
|
||||
builder=new Notification.Builder(context)
|
||||
.setPriority(Notification.PRIORITY_DEFAULT)
|
||||
.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE);
|
||||
summaryNotification=new Notification.Builder(context)
|
||||
.setPriority(Notification.PRIORITY_DEFAULT)
|
||||
.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE);
|
||||
}
|
||||
Drawable avatar=ImageCache.getInstance(context).get(new UrlImageLoaderRequest(pn.icon, V.dp(50), V.dp(50)));
|
||||
|
||||
notificationID = GlobalUserPreferences.keepOnlyLatestNotification ? NOTIFICATION_ID : (int)System.currentTimeMillis();
|
||||
|
||||
Intent contentIntent=new Intent(context, MainActivity.class);
|
||||
contentIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
contentIntent.putExtra("fromNotification", true);
|
||||
contentIntent.putExtra("accountID", accountID);
|
||||
contentIntent.putExtra("notificationID", notificationID);
|
||||
contentIntent.putExtra("notificationID", notificationId);
|
||||
if(notification!=null){
|
||||
contentIntent.putExtra("notification", Parcels.wrap(notification));
|
||||
}
|
||||
|
||||
builder.setContentTitle(pn.title)
|
||||
.setContentText(pn.body)
|
||||
.setStyle(new Notification.BigTextStyle().bigText(pn.body))
|
||||
.setContentIntent(PendingIntent.getActivity(context, notificationID, contentIntent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT))
|
||||
.setContentTitle(pn.title)
|
||||
.setStyle(new Notification.InboxStyle()
|
||||
.addLine(pn.body))
|
||||
.setContentIntent(PendingIntent.getActivity(context, notificationId, contentIntent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT))
|
||||
.setWhen(notification==null ? System.currentTimeMillis() : notification.createdAt.toEpochMilli())
|
||||
.setShowWhen(true)
|
||||
.setCategory(Notification.CATEGORY_SOCIAL)
|
||||
.setAutoCancel(true)
|
||||
.setGroup(accountID)
|
||||
.setColor(context.getColor(R.color.shortcut_icon_background));
|
||||
if(!GlobalUserPreferences.uniformNotificationIcon){
|
||||
switch (pn.notificationType) {
|
||||
@@ -166,6 +172,9 @@ public class PushNotificationReceiver extends BroadcastReceiver{
|
||||
if(AccountSessionManager.getInstance().getLoggedInAccounts().size()>1){
|
||||
builder.setSubText(accountName);
|
||||
}
|
||||
nm.notify(accountID, notificationID, builder.build());
|
||||
|
||||
notificationId++;
|
||||
nm.notify(accountID, GlobalUserPreferences.keepOnlyLatestNotification ? NOTIFICATION_ID : notificationId, builder.build());
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -61,7 +61,11 @@ public class MastodonAPIController{
|
||||
String line;
|
||||
while ((line = reader.readLine()) != null) {
|
||||
if (line.isBlank() || line.startsWith("#")) continue;
|
||||
badDomains.add(line.toLowerCase().trim());
|
||||
String[] parts = line.replaceAll("\"", "").split("[\s,;]");
|
||||
if (parts.length == 0) continue;
|
||||
String domain = parts[0].toLowerCase().trim();
|
||||
if (domain.isBlank()) continue;
|
||||
badDomains.add(domain);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
@@ -73,8 +77,8 @@ public class MastodonAPIController{
|
||||
}
|
||||
|
||||
public <T> void submitRequest(final MastodonAPIRequest<T> req){
|
||||
final String host = req.getURL().getHost().toLowerCase();
|
||||
final boolean isBad = badDomains.stream().anyMatch(host::endsWith);
|
||||
final String host = req.getURL().getHost();
|
||||
final boolean isBad = host == null || badDomains.stream().anyMatch(h -> h.equalsIgnoreCase(host) || host.toLowerCase().endsWith("." + h));
|
||||
thread.postRunnable(()->{
|
||||
try{
|
||||
if (isBad) throw new IllegalArgumentException();
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
package org.joinmastodon.android.api.requests.accounts;
|
||||
|
||||
import org.joinmastodon.android.api.MastodonAPIRequest;
|
||||
import org.joinmastodon.android.model.Relationship;
|
||||
|
||||
public class SetPrivateNote extends MastodonAPIRequest<Relationship>{
|
||||
public SetPrivateNote(String id, String comment){
|
||||
super(MastodonAPIRequest.HttpMethod.POST, "/accounts/"+id+"/note", Relationship.class);
|
||||
Request req = new Request(comment);
|
||||
setRequestBody(req);
|
||||
}
|
||||
|
||||
private static class Request{
|
||||
public String comment;
|
||||
public Request(String comment){
|
||||
this.comment=comment;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package org.joinmastodon.android.api.requests.lists;
|
||||
|
||||
import org.joinmastodon.android.api.MastodonAPIRequest;
|
||||
import org.joinmastodon.android.model.ListTimeline;
|
||||
|
||||
public class CreateList extends MastodonAPIRequest<ListTimeline> {
|
||||
public CreateList(String title, ListTimeline.RepliesPolicy repliesPolicy) {
|
||||
super(HttpMethod.POST, "/lists", ListTimeline.class);
|
||||
Request req = new Request();
|
||||
req.title = title;
|
||||
req.repliesPolicy = repliesPolicy;
|
||||
setRequestBody(req);
|
||||
}
|
||||
|
||||
public static class Request {
|
||||
public String title;
|
||||
public ListTimeline.RepliesPolicy repliesPolicy;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
package org.joinmastodon.android.api.requests.lists;
|
||||
|
||||
import org.joinmastodon.android.api.MastodonAPIRequest;
|
||||
import org.joinmastodon.android.model.ListTimeline;
|
||||
|
||||
public class DeleteList extends MastodonAPIRequest<Object> {
|
||||
public DeleteList(String id) {
|
||||
super(HttpMethod.DELETE, "/lists/" + id, Object.class);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package org.joinmastodon.android.api.requests.lists;
|
||||
|
||||
import org.joinmastodon.android.api.MastodonAPIRequest;
|
||||
import org.joinmastodon.android.model.ListTimeline;
|
||||
|
||||
public class UpdateList extends MastodonAPIRequest<ListTimeline> {
|
||||
public UpdateList(String id, String title, ListTimeline.RepliesPolicy repliesPolicy) {
|
||||
super(HttpMethod.PUT, "/lists/" + id, ListTimeline.class);
|
||||
CreateList.Request req = new CreateList.Request();
|
||||
req.title = title;
|
||||
req.repliesPolicy = repliesPolicy;
|
||||
setRequestBody(req);
|
||||
}
|
||||
}
|
||||
@@ -9,6 +9,10 @@ import org.joinmastodon.android.model.Hashtag;
|
||||
import java.util.List;
|
||||
|
||||
public class GetFollowedHashtags extends HeaderPaginationRequest<Hashtag> {
|
||||
public GetFollowedHashtags() {
|
||||
this(null, null, -1, null);
|
||||
}
|
||||
|
||||
public GetFollowedHashtags(String maxID, String minID, int limit, String sinceID){
|
||||
super(HttpMethod.GET, "/followed_tags", new TypeToken<>(){});
|
||||
if(maxID!=null)
|
||||
|
||||
@@ -8,9 +8,11 @@ import org.joinmastodon.android.model.Status;
|
||||
import java.util.List;
|
||||
|
||||
public class GetTrendingStatuses extends MastodonAPIRequest<List<Status>>{
|
||||
public GetTrendingStatuses(int limit){
|
||||
public GetTrendingStatuses(int offset, int limit){
|
||||
super(HttpMethod.GET, "/trends/statuses", new TypeToken<>(){});
|
||||
if(limit>0)
|
||||
addQueryParameter("limit", ""+limit);
|
||||
if(offset>0)
|
||||
addQueryParameter("offset", ""+offset);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,10 @@ package org.joinmastodon.android.fragments;
|
||||
import android.app.Activity;
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
import android.view.animation.TranslateAnimation;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import org.joinmastodon.android.R;
|
||||
import org.joinmastodon.android.api.requests.accounts.GetAccountStatuses;
|
||||
@@ -67,6 +71,7 @@ public class AccountTimelineFragment extends StatusListFragment{
|
||||
@Override
|
||||
public void onViewCreated(View view, Bundle savedInstanceState){
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
fab = ((ProfileFragment) getParentFragment()).getFab();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package org.joinmastodon.android.fragments;
|
||||
|
||||
import static java.util.stream.Collectors.toList;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.os.Bundle;
|
||||
import android.text.TextUtils;
|
||||
@@ -34,6 +36,7 @@ import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import me.grishka.appkit.Nav;
|
||||
import me.grishka.appkit.api.PaginatedList;
|
||||
@@ -63,9 +66,11 @@ public class AnnouncementsFragment extends BaseStatusListFragment<Announcement>
|
||||
instanceUser.avatar = instanceUser.avatarStatic = instance.thumbnail;
|
||||
instanceUser.emojis = List.of();
|
||||
Status fakeStatus = a.toStatus();
|
||||
TextStatusDisplayItem textItem = new TextStatusDisplayItem(a.id, HtmlParser.parse(a.content, a.emojis, a.mentions, a.tags, accountID), this, fakeStatus, true);
|
||||
textItem.textSelectable = true;
|
||||
return List.of(
|
||||
HeaderStatusDisplayItem.fromAnnouncement(a, fakeStatus, instanceUser, this, accountID, this::onMarkAsRead),
|
||||
new TextStatusDisplayItem(a.id, HtmlParser.parse(a.content, a.emojis, a.mentions, a.tags, accountID), this, fakeStatus)
|
||||
textItem
|
||||
);
|
||||
}
|
||||
|
||||
@@ -84,14 +89,7 @@ public class AnnouncementsFragment extends BaseStatusListFragment<Announcement>
|
||||
protected void addAccountToKnown(Announcement s) {}
|
||||
|
||||
@Override
|
||||
public void onItemClick(String id) {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDataLoaded(List<Announcement> d, boolean more) {
|
||||
unreadIDs = d.stream().filter(a -> !a.read).map(a -> a.id).collect(Collectors.toList());
|
||||
super.onDataLoaded(d, more);
|
||||
}
|
||||
public void onItemClick(String id) {}
|
||||
|
||||
@Override
|
||||
protected void doLoadData(int offset, int count){
|
||||
@@ -99,7 +97,11 @@ public class AnnouncementsFragment extends BaseStatusListFragment<Announcement>
|
||||
.setCallback(new SimpleCallback<>(this){
|
||||
@Override
|
||||
public void onSuccess(List<Announcement> result){
|
||||
onDataLoaded(result, false);
|
||||
List<Announcement> unread = result.stream().filter(a -> !a.read).collect(toList());
|
||||
List<Announcement> read = result.stream().filter(a -> a.read).collect(toList());
|
||||
onDataLoaded(unread, true);
|
||||
onDataLoaded(read, false);
|
||||
unreadIDs = unread.stream().map(a -> a.id).collect(toList());
|
||||
}
|
||||
})
|
||||
.exec(accountID);
|
||||
|
||||
@@ -13,9 +13,12 @@ import android.text.Layout;
|
||||
import android.text.StaticLayout;
|
||||
import android.text.TextPaint;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.WindowInsets;
|
||||
import android.view.animation.TranslateAnimation;
|
||||
import android.widget.ImageButton;
|
||||
import android.widget.Toolbar;
|
||||
|
||||
import org.joinmastodon.android.E;
|
||||
@@ -71,6 +74,8 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
|
||||
protected DisplayItemsAdapter adapter;
|
||||
protected String accountID;
|
||||
protected PhotoViewer currentPhotoViewer;
|
||||
protected ImageButton fab;
|
||||
protected boolean isScrollingUp = false;
|
||||
protected HashMap<String, Account> knownAccounts=new HashMap<>();
|
||||
protected HashMap<String, Relationship> relationships=new HashMap<>();
|
||||
protected Rect tmpRect=new Rect();
|
||||
@@ -273,11 +278,42 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
|
||||
@Override
|
||||
public void onViewCreated(View view, Bundle savedInstanceState){
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
fab=view.findViewById(R.id.fab);
|
||||
list.addOnScrollListener(new RecyclerView.OnScrollListener(){
|
||||
@Override
|
||||
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy){
|
||||
if(currentPhotoViewer!=null)
|
||||
currentPhotoViewer.offsetView(-dx, -dy);
|
||||
|
||||
if (fab!=null) {
|
||||
if (dy >= 0 ) {
|
||||
if (isScrollingUp) {
|
||||
fab.setVisibility(View.INVISIBLE);
|
||||
TranslateAnimation animate = new TranslateAnimation(
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
fab.getHeight() * 2);
|
||||
animate.setDuration(300);
|
||||
animate.setFillAfter(true);
|
||||
fab.startAnimation(animate);
|
||||
isScrollingUp = false;
|
||||
}
|
||||
} else {
|
||||
if (!isScrollingUp) {
|
||||
fab.setVisibility(View.VISIBLE);
|
||||
TranslateAnimation animate = new TranslateAnimation(
|
||||
0,
|
||||
0,
|
||||
fab.getHeight() * 2,
|
||||
0);
|
||||
animate.setDuration(300);
|
||||
animate.setFillAfter(true);
|
||||
fab.startAnimation(animate);
|
||||
isScrollingUp = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
list.addItemDecoration(new StatusListItemDecoration());
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package org.joinmastodon.android.fragments;
|
||||
|
||||
import static android.os.ext.SdkExtensions.getExtensionVersion;
|
||||
|
||||
import static org.joinmastodon.android.GlobalUserPreferences.recentLanguages;
|
||||
import static org.joinmastodon.android.api.requests.statuses.CreateStatus.DRAFTS_AFTER_INSTANT;
|
||||
import static org.joinmastodon.android.api.requests.statuses.CreateStatus.getDraftInstant;
|
||||
@@ -29,6 +31,7 @@ import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.Parcelable;
|
||||
import android.provider.MediaStore;
|
||||
import android.provider.OpenableColumns;
|
||||
import android.text.Editable;
|
||||
import android.text.InputFilter;
|
||||
@@ -432,6 +435,13 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
||||
spoilerBtn.setSelected(true);
|
||||
}
|
||||
|
||||
sensitive = savedInstanceState==null && editingStatus != null ? editingStatus.sensitive
|
||||
: savedInstanceState!=null && savedInstanceState.getBoolean("sensitive", false);
|
||||
if (sensitive) {
|
||||
sensitiveItem.setVisibility(View.VISIBLE);
|
||||
sensitiveIcon.setSelected(true);
|
||||
}
|
||||
|
||||
if(savedInstanceState!=null && savedInstanceState.containsKey("attachments")){
|
||||
ArrayList<Parcelable> serializedAttachments=savedInstanceState.getParcelableArrayList("attachments");
|
||||
for(Parcelable a:serializedAttachments){
|
||||
@@ -517,6 +527,8 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
||||
|
||||
mainEditText.setSelectionListener(this);
|
||||
mainEditText.addTextChangedListener(new TextWatcher(){
|
||||
private int lastChangeStart, lastChangeCount;
|
||||
|
||||
@Override
|
||||
public void beforeTextChanged(CharSequence s, int start, int count, int after){
|
||||
|
||||
@@ -526,6 +538,16 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
||||
public void onTextChanged(CharSequence s, int start, int before, int count){
|
||||
if(s.length()==0)
|
||||
return;
|
||||
lastChangeStart=start;
|
||||
lastChangeCount=count;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterTextChanged(Editable s){
|
||||
if(s.length()==0)
|
||||
return;
|
||||
int start=lastChangeStart;
|
||||
int count=lastChangeCount;
|
||||
// offset one char back to catch an already typed '@' or '#' or ':'
|
||||
int realStart=start;
|
||||
start=Math.max(0, start-1);
|
||||
@@ -571,10 +593,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
||||
editable.removeSpan(span);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterTextChanged(Editable s){
|
||||
updateCharCounter();
|
||||
}
|
||||
});
|
||||
@@ -657,6 +676,10 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
||||
replyText.setOnClickListener(v->{
|
||||
scrollView.smoothScrollTo(0, 0);
|
||||
});
|
||||
replyText.setOnClickListener(v->{
|
||||
scrollView.smoothScrollTo(0, 0);
|
||||
});
|
||||
|
||||
|
||||
ArrayList<String> mentions=new ArrayList<>();
|
||||
String ownID=AccountSessionManager.getInstance().getAccount(accountID).self.id;
|
||||
@@ -701,7 +724,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
||||
DraftMediaAttachment da=new DraftMediaAttachment();
|
||||
da.serverAttachment=att;
|
||||
da.description=att.description;
|
||||
da.uri=Uri.parse(att.previewUrl);
|
||||
da.uri=att.previewUrl!=null ? Uri.parse(att.previewUrl) : null;
|
||||
da.state=AttachmentUploadState.DONE;
|
||||
attachmentsView.addView(createMediaAttachmentView(da));
|
||||
attachments.add(da);
|
||||
@@ -1162,14 +1185,50 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
||||
.show();
|
||||
}
|
||||
|
||||
/**
|
||||
* Check to see if Android platform photopicker is available on the device\
|
||||
* @return whether the device supports photopicker intents.
|
||||
*/
|
||||
private boolean isPhotoPickerAvailable() {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
||||
return true;
|
||||
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
||||
return getExtensionVersion(Build.VERSION_CODES.R) >= 2;
|
||||
} else
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds the correct intent for the device version to select media.
|
||||
*
|
||||
* <p>For Device version > T or R_SDK_v2, use the android platform photopicker via
|
||||
* {@link MediaStore#ACTION_PICK_IMAGES}
|
||||
*
|
||||
* <p>For earlier versions use the built in docs ui via {@link Intent#ACTION_GET_CONTENT}
|
||||
*/
|
||||
private void openFilePicker(){
|
||||
Intent intent=new Intent(Intent.ACTION_GET_CONTENT);
|
||||
intent.addCategory(Intent.CATEGORY_OPENABLE);
|
||||
intent.setType("*/*");
|
||||
if(instance.configuration!=null && instance.configuration.mediaAttachments!=null && instance.configuration.mediaAttachments.supportedMimeTypes!=null && !instance.configuration.mediaAttachments.supportedMimeTypes.isEmpty()){
|
||||
intent.putExtra(Intent.EXTRA_MIME_TYPES, instance.configuration.mediaAttachments.supportedMimeTypes.toArray(new String[0]));
|
||||
}else{
|
||||
intent.putExtra(Intent.EXTRA_MIME_TYPES, new String[]{"image/*", "video/*"});
|
||||
Intent intent;
|
||||
boolean usePhotoPicker = isPhotoPickerAvailable();
|
||||
if (usePhotoPicker) {
|
||||
intent = new Intent(MediaStore.ACTION_PICK_IMAGES);
|
||||
intent.putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, MediaStore.getPickImagesMaxLimit());
|
||||
} else {
|
||||
intent = new Intent(Intent.ACTION_GET_CONTENT);
|
||||
intent.addCategory(Intent.CATEGORY_OPENABLE);
|
||||
intent.setType("*/*");
|
||||
}
|
||||
if (!usePhotoPicker && instance.configuration != null &&
|
||||
instance.configuration.mediaAttachments != null &&
|
||||
instance.configuration.mediaAttachments.supportedMimeTypes != null &&
|
||||
!instance.configuration.mediaAttachments.supportedMimeTypes.isEmpty()) {
|
||||
intent.putExtra(Intent.EXTRA_MIME_TYPES,
|
||||
instance.configuration.mediaAttachments.supportedMimeTypes.toArray(
|
||||
new String[0]));
|
||||
} else {
|
||||
if (!usePhotoPicker) {
|
||||
// If photo picker is being used these are the default mimetypes.
|
||||
intent.putExtra(Intent.EXTRA_MIME_TYPES, new String[]{"image/*", "video/*"});
|
||||
}
|
||||
}
|
||||
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
|
||||
startActivityForResult(intent, MEDIA_RESULT);
|
||||
@@ -1252,7 +1311,8 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
||||
View thumb=getActivity().getLayoutInflater().inflate(R.layout.compose_media_thumb, attachmentsView, false);
|
||||
ImageView img=thumb.findViewById(R.id.thumb);
|
||||
if(draft.serverAttachment!=null){
|
||||
ViewImageLoader.load(img, draft.serverAttachment.blurhashPlaceholder, new UrlImageLoaderRequest(draft.serverAttachment.previewUrl, V.dp(250), V.dp(250)));
|
||||
if(draft.serverAttachment.previewUrl!=null)
|
||||
ViewImageLoader.load(img, draft.serverAttachment.blurhashPlaceholder, new UrlImageLoaderRequest(draft.serverAttachment.previewUrl, V.dp(250), V.dp(250)));
|
||||
}else{
|
||||
if(draft.mimeType.startsWith("image/")){
|
||||
ViewImageLoader.load(img, null, new UrlImageLoaderRequest(draft.uri, V.dp(250), V.dp(250)));
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
package org.joinmastodon.android.fragments;
|
||||
|
||||
import android.content.res.Configuration;
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
import android.widget.ImageButton;
|
||||
|
||||
import org.joinmastodon.android.R;
|
||||
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||
|
||||
import me.grishka.appkit.Nav;
|
||||
|
||||
public abstract class FabStatusListFragment extends StatusListFragment {
|
||||
protected ImageButton fab;
|
||||
|
||||
public FabStatusListFragment() {
|
||||
setListLayoutId(R.layout.recycler_fragment_with_fab);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onViewCreated(View view, Bundle savedInstanceState) {
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
fab = view.findViewById(R.id.fab);
|
||||
fab.setOnClickListener(this::onFabClick);
|
||||
fab.setOnLongClickListener(this::onFabLongClick);
|
||||
}
|
||||
|
||||
protected void onFabClick(View v){
|
||||
Bundle args=new Bundle();
|
||||
args.putString("account", accountID);
|
||||
Nav.go(getActivity(), ComposeFragment.class, args);
|
||||
}
|
||||
|
||||
protected boolean onFabLongClick(View v) {
|
||||
return UiUtils.pickAccountForCompose(getActivity(), accountID);
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
package org.joinmastodon.android.fragments;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
@@ -11,6 +12,7 @@ import org.joinmastodon.android.R;
|
||||
import org.joinmastodon.android.api.requests.tags.GetFollowedHashtags;
|
||||
import org.joinmastodon.android.model.Hashtag;
|
||||
import org.joinmastodon.android.model.HeaderPaginationList;
|
||||
import org.joinmastodon.android.ui.DividerItemDecoration;
|
||||
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||
|
||||
import me.grishka.appkit.api.SimpleCallback;
|
||||
@@ -41,6 +43,12 @@ public class FollowedHashtagsFragment extends BaseRecyclerFragment<Hashtag> impl
|
||||
loadData();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onViewCreated(View view, Bundle savedInstanceState) {
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
list.addItemDecoration(new DividerItemDecoration(getActivity(), R.attr.colorPollVoted, 0.5f, 56, 16));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doLoadData(int offset, int count){
|
||||
currentRequest=new GetFollowedHashtags(offset==0 ? null : nextMaxID, null, count, null)
|
||||
|
||||
@@ -5,6 +5,7 @@ import android.app.NotificationManager;
|
||||
import android.graphics.Outline;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.service.notification.StatusBarNotification;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
@@ -41,7 +42,11 @@ import me.grishka.appkit.views.FragmentRootLinearLayout;
|
||||
|
||||
public class HomeFragment extends AppKitFragment implements OnBackPressedListener{
|
||||
private FragmentRootLinearLayout content;
|
||||
private HomeTimelineFragment homeTimelineFragment;
|
||||
|
||||
private HomeTabFragment homeTabFragment;
|
||||
|
||||
// private HomeTimelineFragment homeTimelineFragment;
|
||||
|
||||
private NotificationsFragment notificationsFragment;
|
||||
private DiscoverFragment searchFragment;
|
||||
private ProfileFragment profileFragment;
|
||||
@@ -65,8 +70,13 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene
|
||||
if(savedInstanceState==null){
|
||||
Bundle args=new Bundle();
|
||||
args.putString("account", accountID);
|
||||
homeTimelineFragment=new HomeTimelineFragment();
|
||||
homeTimelineFragment.setArguments(args);
|
||||
|
||||
homeTabFragment=new HomeTabFragment();
|
||||
homeTabFragment.setArguments(args);
|
||||
|
||||
// homeTimelineFragment=new HomeTimelineFragment();
|
||||
// homeTimelineFragment.setArguments(args);
|
||||
|
||||
args=new Bundle(args);
|
||||
args.putBoolean("noAutoLoad", true);
|
||||
searchFragment=new DiscoverFragment();
|
||||
@@ -110,12 +120,19 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene
|
||||
|
||||
if(savedInstanceState==null){
|
||||
getChildFragmentManager().beginTransaction()
|
||||
.add(R.id.fragment_wrap, homeTimelineFragment)
|
||||
.add(R.id.fragment_wrap, homeTabFragment)
|
||||
.add(R.id.fragment_wrap, searchFragment).hide(searchFragment)
|
||||
.add(R.id.fragment_wrap, notificationsFragment).hide(notificationsFragment)
|
||||
.add(R.id.fragment_wrap, profileFragment).hide(profileFragment)
|
||||
.commit();
|
||||
|
||||
// getChildFragmentManager().beginTransaction()
|
||||
// .add(R.id.fragment_wrap, homeTimelineFragment)
|
||||
// .add(R.id.fragment_wrap, searchFragment).hide(searchFragment)
|
||||
// .add(R.id.fragment_wrap, notificationsFragment).hide(notificationsFragment)
|
||||
// .add(R.id.fragment_wrap, profileFragment).hide(profileFragment)
|
||||
// .commit();
|
||||
|
||||
String defaultTab=getArguments().getString("tab");
|
||||
if("notifications".equals(defaultTab)){
|
||||
tabBar.selectTab(R.id.tab_notifications);
|
||||
@@ -136,21 +153,36 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene
|
||||
@Override
|
||||
public void onViewStateRestored(Bundle savedInstanceState){
|
||||
super.onViewStateRestored(savedInstanceState);
|
||||
if(savedInstanceState==null || homeTimelineFragment!=null)
|
||||
return;
|
||||
homeTimelineFragment=(HomeTimelineFragment) getChildFragmentManager().getFragment(savedInstanceState, "homeTimelineFragment");
|
||||
|
||||
if(savedInstanceState==null) return;
|
||||
|
||||
// if(savedInstanceState==null || homeTimelineFragment!=null)
|
||||
// return;
|
||||
|
||||
homeTabFragment=(HomeTabFragment) getChildFragmentManager().getFragment(savedInstanceState, "homeTabFragment");
|
||||
|
||||
// homeTimelineFragment=(HomeTimelineFragment) getChildFragmentManager().getFragment(savedInstanceState, "homeTimelineFragment");
|
||||
searchFragment=(DiscoverFragment) getChildFragmentManager().getFragment(savedInstanceState, "searchFragment");
|
||||
notificationsFragment=(NotificationsFragment) getChildFragmentManager().getFragment(savedInstanceState, "notificationsFragment");
|
||||
profileFragment=(ProfileFragment) getChildFragmentManager().getFragment(savedInstanceState, "profileFragment");
|
||||
currentTab=savedInstanceState.getInt("selectedTab");
|
||||
Fragment current=fragmentForTab(currentTab);
|
||||
|
||||
getChildFragmentManager().beginTransaction()
|
||||
.hide(homeTimelineFragment)
|
||||
.hide(homeTabFragment)
|
||||
.hide(searchFragment)
|
||||
.hide(notificationsFragment)
|
||||
.hide(profileFragment)
|
||||
.show(current)
|
||||
.commit();
|
||||
|
||||
// getChildFragmentManager().beginTransaction()
|
||||
// .hide(homeTimelineFragment)
|
||||
// .hide(searchFragment)
|
||||
// .hide(notificationsFragment)
|
||||
// .hide(profileFragment)
|
||||
// .show(current)
|
||||
// .commit();
|
||||
maybeTriggerLoading(current);
|
||||
}
|
||||
|
||||
@@ -180,7 +212,11 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene
|
||||
super.onApplyWindowInsets(insets.replaceSystemWindowInsets(insets.getSystemWindowInsetLeft(), 0, insets.getSystemWindowInsetRight(), insets.getSystemWindowInsetBottom()));
|
||||
}
|
||||
WindowInsets topOnlyInsets=insets.replaceSystemWindowInsets(0, insets.getSystemWindowInsetTop(), 0, 0);
|
||||
homeTimelineFragment.onApplyWindowInsets(topOnlyInsets);
|
||||
|
||||
homeTabFragment.onApplyWindowInsets(topOnlyInsets);
|
||||
|
||||
// homeTimelineFragment.onApplyWindowInsets(topOnlyInsets);
|
||||
|
||||
searchFragment.onApplyWindowInsets(topOnlyInsets);
|
||||
notificationsFragment.onApplyWindowInsets(topOnlyInsets);
|
||||
profileFragment.onApplyWindowInsets(topOnlyInsets);
|
||||
@@ -188,7 +224,10 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene
|
||||
|
||||
private Fragment fragmentForTab(@IdRes int tab){
|
||||
if(tab==R.id.tab_home){
|
||||
return homeTimelineFragment;
|
||||
return homeTabFragment;
|
||||
|
||||
// if(tab==R.id.tab_home){
|
||||
// return homeTimelineFragment;
|
||||
}else if(tab==R.id.tab_search){
|
||||
return searchFragment;
|
||||
}else if(tab==R.id.tab_notifications){
|
||||
@@ -233,7 +272,11 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene
|
||||
((NotificationsFragment) newFragment).loadData();
|
||||
// TODO make an interface?
|
||||
NotificationManager nm=getActivity().getSystemService(NotificationManager.class);
|
||||
nm.cancel(accountID, PushNotificationReceiver.NOTIFICATION_ID);
|
||||
for (StatusBarNotification notification : nm.getActiveNotifications()) {
|
||||
if (accountID.equals(notification.getTag())) {
|
||||
nm.cancel(accountID, notification.getId());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -265,17 +308,24 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene
|
||||
tabBar.selectTab(R.id.tab_home);
|
||||
onTabSelected(R.id.tab_home);
|
||||
return true;
|
||||
} else {
|
||||
return homeTabFragment.onBackPressed();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSaveInstanceState(Bundle outState){
|
||||
super.onSaveInstanceState(outState);
|
||||
outState.putInt("selectedTab", currentTab);
|
||||
getChildFragmentManager().putFragment(outState, "homeTimelineFragment", homeTimelineFragment);
|
||||
getChildFragmentManager().putFragment(outState, "searchFragment", searchFragment);
|
||||
getChildFragmentManager().putFragment(outState, "notificationsFragment", notificationsFragment);
|
||||
getChildFragmentManager().putFragment(outState, "profileFragment", profileFragment);
|
||||
|
||||
if (homeTabFragment.isAdded()) getChildFragmentManager().putFragment(outState, "homeTabFragment", homeTabFragment);
|
||||
if (searchFragment.isAdded()) getChildFragmentManager().putFragment(outState, "searchFragment", searchFragment);
|
||||
if (notificationsFragment.isAdded()) getChildFragmentManager().putFragment(outState, "notificationsFragment", notificationsFragment);
|
||||
if (profileFragment.isAdded()) getChildFragmentManager().putFragment(outState, "profileFragment", profileFragment);
|
||||
|
||||
// getChildFragmentManager().putFragment(outState, "homeTimelineFragment", homeTimelineFragment);
|
||||
// getChildFragmentManager().putFragment(outState, "searchFragment", searchFragment);
|
||||
// getChildFragmentManager().putFragment(outState, "notificationsFragment", notificationsFragment);
|
||||
// getChildFragmentManager().putFragment(outState, "profileFragment", profileFragment);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,556 @@
|
||||
package org.joinmastodon.android.fragments;
|
||||
|
||||
import static org.joinmastodon.android.GlobalUserPreferences.showFederatedTimeline;
|
||||
|
||||
import android.animation.Animator;
|
||||
import android.animation.AnimatorListenerAdapter;
|
||||
import android.animation.AnimatorSet;
|
||||
import android.animation.ObjectAnimator;
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.Activity;
|
||||
import android.app.Fragment;
|
||||
import android.app.FragmentTransaction;
|
||||
import android.content.Context;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.SubMenu;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.ViewParent;
|
||||
import android.view.ViewTreeObserver;
|
||||
import android.widget.Button;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.PopupMenu;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toolbar;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import androidx.viewpager2.widget.ViewPager2;
|
||||
|
||||
import com.squareup.otto.Subscribe;
|
||||
|
||||
import org.joinmastodon.android.E;
|
||||
import org.joinmastodon.android.GlobalUserPreferences;
|
||||
import org.joinmastodon.android.R;
|
||||
import org.joinmastodon.android.api.requests.announcements.GetAnnouncements;
|
||||
import org.joinmastodon.android.api.requests.lists.GetLists;
|
||||
import org.joinmastodon.android.api.requests.tags.GetFollowedHashtags;
|
||||
import org.joinmastodon.android.events.SelfUpdateStateChangedEvent;
|
||||
import org.joinmastodon.android.fragments.discover.FederatedTimelineFragment;
|
||||
import org.joinmastodon.android.fragments.discover.LocalTimelineFragment;
|
||||
import org.joinmastodon.android.model.Announcement;
|
||||
import org.joinmastodon.android.model.Hashtag;
|
||||
import org.joinmastodon.android.model.HeaderPaginationList;
|
||||
import org.joinmastodon.android.model.ListTimeline;
|
||||
import org.joinmastodon.android.ui.SimpleViewHolder;
|
||||
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||
import org.joinmastodon.android.updater.GithubSelfUpdater;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import me.grishka.appkit.Nav;
|
||||
import me.grishka.appkit.api.Callback;
|
||||
import me.grishka.appkit.api.ErrorResponse;
|
||||
import me.grishka.appkit.fragments.BaseRecyclerFragment;
|
||||
import me.grishka.appkit.fragments.OnBackPressedListener;
|
||||
import me.grishka.appkit.utils.CubicBezierInterpolator;
|
||||
import me.grishka.appkit.utils.V;
|
||||
|
||||
public class HomeTabFragment extends MastodonToolbarFragment implements ScrollableToTop, OnBackPressedListener {
|
||||
private static final int ANNOUNCEMENTS_RESULT = 654;
|
||||
|
||||
private String accountID;
|
||||
private MenuItem announcements;
|
||||
// private ImageView toolbarLogo;
|
||||
private Button toolbarShowNewPostsBtn;
|
||||
private boolean newPostsBtnShown;
|
||||
private AnimatorSet currentNewPostsAnim;
|
||||
private ViewPager2 pager;
|
||||
private final List<Fragment> fragments = new ArrayList<>();
|
||||
private final List<FrameLayout> tabViews = new ArrayList<>();
|
||||
private View switcher;
|
||||
private FrameLayout toolbarFrame;
|
||||
private ImageView timelineIcon;
|
||||
private ImageView collapsedChevron;
|
||||
private TextView timelineTitle;
|
||||
private PopupMenu switcherPopup;
|
||||
private final Map<Integer, ListTimeline> listItems = new HashMap<>();
|
||||
private final Map<Integer, Hashtag> hashtagsItems = new HashMap<>();
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
accountID = getArguments().getString("account");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAttach(Activity activity) {
|
||||
super.onAttach(activity);
|
||||
setHasOptionsMenu(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public View onCreateContentView(LayoutInflater inflater, ViewGroup container, Bundle bundle) {
|
||||
FrameLayout view = new FrameLayout(getContext());
|
||||
pager = new ViewPager2(getContext());
|
||||
toolbarFrame = (FrameLayout) LayoutInflater.from(getContext()).inflate(R.layout.home_toolbar, getToolbar(), false);
|
||||
|
||||
if (fragments.size() == 0) {
|
||||
Bundle args = new Bundle();
|
||||
args.putString("account", accountID);
|
||||
args.putBoolean("__is_tab", true);
|
||||
|
||||
fragments.add(new HomeTimelineFragment());
|
||||
fragments.add(new LocalTimelineFragment());
|
||||
if (showFederatedTimeline) fragments.add(new FederatedTimelineFragment());
|
||||
args=new Bundle(args);
|
||||
args.putBoolean("onlyPosts", true);
|
||||
NotificationsListFragment postsFragment=new NotificationsListFragment();
|
||||
postsFragment.setArguments(args);
|
||||
fragments.add(postsFragment);
|
||||
|
||||
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
|
||||
for (int i = 0; i < fragments.size(); i++) {
|
||||
fragments.get(i).setArguments(args);
|
||||
FrameLayout tabView = new FrameLayout(getActivity());
|
||||
tabView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
|
||||
tabView.setVisibility(View.GONE);
|
||||
tabView.setId(i + 1);
|
||||
transaction.add(i + 1, fragments.get(i));
|
||||
view.addView(tabView);
|
||||
tabViews.add(tabView);
|
||||
}
|
||||
transaction.commit();
|
||||
}
|
||||
|
||||
view.addView(pager, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
@SuppressLint("ClickableViewAccessibility")
|
||||
@Override
|
||||
public void onViewCreated(View view, Bundle savedInstanceState){
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
|
||||
timelineIcon = toolbarFrame.findViewById(R.id.timeline_icon);
|
||||
timelineTitle = toolbarFrame.findViewById(R.id.timeline_title);
|
||||
collapsedChevron = toolbarFrame.findViewById(R.id.collapsed_chevron);
|
||||
switcher = toolbarFrame.findViewById(R.id.switcher_btn);
|
||||
switcherPopup = new PopupMenu(getContext(), switcher);
|
||||
switcherPopup.inflate(R.menu.home_switcher);
|
||||
switcherPopup.setOnMenuItemClickListener(this::onSwitcherItemSelected);
|
||||
UiUtils.enablePopupMenuIcons(getContext(), switcherPopup);
|
||||
switcher.setOnClickListener(v->{
|
||||
updateSwitcherMenu();
|
||||
switcherPopup.show();
|
||||
});
|
||||
View.OnTouchListener listener = switcherPopup.getDragToOpenListener();
|
||||
switcher.setOnTouchListener((v, m)-> {
|
||||
updateSwitcherMenu();
|
||||
return listener.onTouch(v, m);
|
||||
});
|
||||
|
||||
UiUtils.reduceSwipeSensitivity(pager);
|
||||
pager.setUserInputEnabled(!GlobalUserPreferences.disableSwipe);
|
||||
pager.setAdapter(new HomePagerAdapter());
|
||||
pager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback(){
|
||||
@Override
|
||||
public void onPageSelected(int position){
|
||||
updateSwitcherIcon(position);
|
||||
if (position==0) return;
|
||||
hideNewPostsButton();
|
||||
if (fragments.get(position) instanceof BaseRecyclerFragment<?> page){
|
||||
if(!page.loaded && !page.isDataLoading()) page.loadData();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if (!GlobalUserPreferences.reduceMotion) {
|
||||
pager.setPageTransformer((v, pos) -> {
|
||||
if (tabViews.get(pager.getCurrentItem()) != v) return;
|
||||
float scaleFactor = Math.max(0.85f, 1 - Math.abs(pos) * 0.06f);
|
||||
switcher.setScaleY(scaleFactor);
|
||||
switcher.setScaleX(scaleFactor);
|
||||
switcher.setAlpha(Math.max(0.65f, 1 - Math.abs(pos)));
|
||||
});
|
||||
}
|
||||
|
||||
updateToolbarLogo();
|
||||
|
||||
if(GithubSelfUpdater.needSelfUpdating()){
|
||||
E.register(this);
|
||||
updateUpdateState(GithubSelfUpdater.getInstance().getState());
|
||||
}
|
||||
|
||||
new GetLists().setCallback(new Callback<>() {
|
||||
@Override
|
||||
public void onSuccess(List<ListTimeline> lists) {
|
||||
addItemsToMap(lists, listItems);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(ErrorResponse error) {
|
||||
error.showToast(getContext());
|
||||
}
|
||||
}).exec(accountID);
|
||||
|
||||
new GetFollowedHashtags().setCallback(new Callback<>() {
|
||||
@Override
|
||||
public void onSuccess(HeaderPaginationList<Hashtag> hashtags) {
|
||||
addItemsToMap(hashtags, hashtagsItems);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(ErrorResponse error) {
|
||||
error.showToast(getContext());
|
||||
}
|
||||
}).exec(accountID);
|
||||
}
|
||||
|
||||
public void updateToolbarLogo(){
|
||||
Toolbar toolbar = getToolbar();
|
||||
ViewParent parentView = toolbarFrame.getParent();
|
||||
if (parentView == toolbar) return;
|
||||
if (parentView instanceof Toolbar parentToolbar) parentToolbar.removeView(toolbarFrame);
|
||||
toolbar.addView(toolbarFrame, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
|
||||
toolbar.setOnClickListener(v->scrollToTop());
|
||||
toolbar.setNavigationContentDescription(R.string.back);
|
||||
toolbar.setContentInsetsAbsolute(0, toolbar.getContentInsetRight());
|
||||
|
||||
updateSwitcherIcon(pager.getCurrentItem());
|
||||
|
||||
// toolbarLogo=new ImageView(getActivity());
|
||||
// toolbarLogo.setScaleType(ImageView.ScaleType.CENTER);
|
||||
// toolbarLogo.setImageResource(R.drawable.logo);
|
||||
// toolbarLogo.setImageTintList(ColorStateList.valueOf(UiUtils.getThemeColor(getActivity(), android.R.attr.textColorPrimary)));
|
||||
|
||||
toolbarShowNewPostsBtn=toolbarFrame.findViewById(R.id.show_new_posts_btn);
|
||||
toolbarShowNewPostsBtn.setCompoundDrawableTintList(toolbarShowNewPostsBtn.getTextColors());
|
||||
if(Build.VERSION.SDK_INT<Build.VERSION_CODES.N) UiUtils.fixCompoundDrawableTintOnAndroid6(toolbarShowNewPostsBtn);
|
||||
toolbarShowNewPostsBtn.setOnClickListener(this::onNewPostsBtnClick);
|
||||
|
||||
if(newPostsBtnShown){
|
||||
toolbarShowNewPostsBtn.setVisibility(View.VISIBLE);
|
||||
collapsedChevron.setVisibility(View.VISIBLE);
|
||||
collapsedChevron.setAlpha(1f);
|
||||
timelineTitle.setVisibility(View.GONE);
|
||||
timelineTitle.setAlpha(0f);
|
||||
}else{
|
||||
toolbarShowNewPostsBtn.setVisibility(View.INVISIBLE);
|
||||
toolbarShowNewPostsBtn.setAlpha(0f);
|
||||
collapsedChevron.setVisibility(View.GONE);
|
||||
collapsedChevron.setAlpha(0f);
|
||||
toolbarShowNewPostsBtn.setScaleX(.8f);
|
||||
toolbarShowNewPostsBtn.setScaleY(.8f);
|
||||
timelineTitle.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
ViewTreeObserver vto = toolbar.getViewTreeObserver();
|
||||
if (vto.isAlive()) {
|
||||
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
|
||||
@Override
|
||||
public void onGlobalLayout() {
|
||||
Toolbar t = getToolbar();
|
||||
if (t == null) return;
|
||||
int toolbarWidth = t.getWidth();
|
||||
if (toolbarWidth == 0) return;
|
||||
t.getViewTreeObserver().removeOnGlobalLayoutListener(this);
|
||||
|
||||
int toolbarFrameWidth = toolbarFrame.getWidth();
|
||||
int padding = toolbarWidth - toolbarFrameWidth;
|
||||
// toolbar frame goes from screen edge to beginning of right-aligned option buttons.
|
||||
// centering button by applying the same space on the left
|
||||
((FrameLayout) toolbarShowNewPostsBtn.getParent()).setPaddingRelative(padding, 0, 0, 0);
|
||||
toolbarShowNewPostsBtn.setMaxWidth(toolbarWidth - padding * 2);
|
||||
|
||||
switcher.setPivotX(V.dp(28)); // padding + half of icon
|
||||
switcher.setPivotY(switcher.getHeight() / 2f);
|
||||
timelineTitle.setPivotX(timelineTitle.getWidth() - V.dp(8));
|
||||
timelineTitle.setPivotY(timelineTitle.getHeight() / 2f);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater){
|
||||
inflater.inflate(R.menu.home, menu);
|
||||
announcements = menu.findItem(R.id.announcements);
|
||||
|
||||
new GetAnnouncements(false).setCallback(new Callback<>() {
|
||||
@Override
|
||||
public void onSuccess(List<Announcement> result) {
|
||||
boolean hasUnread = result.stream().anyMatch(a -> !a.read);
|
||||
announcements.setIcon(hasUnread ? R.drawable.ic_announcements_24_badged : R.drawable.ic_fluent_megaphone_24_regular);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(ErrorResponse error) {
|
||||
error.showToast(getActivity());
|
||||
}
|
||||
}).exec(accountID);
|
||||
}
|
||||
|
||||
private <T> void addItemsToMap(List<T> addItems, Map<Integer, T> items) {
|
||||
if (addItems.size() == 0) return;
|
||||
for (int i = 0; i < addItems.size(); i++) items.put(View.generateViewId(), addItems.get(i));
|
||||
updateSwitcherMenu();
|
||||
}
|
||||
|
||||
private void updateSwitcherMenu() {
|
||||
Context context = getContext();
|
||||
switcherPopup.getMenu().findItem(R.id.federated).setVisible(showFederatedTimeline);
|
||||
|
||||
if (!listItems.isEmpty()) {
|
||||
MenuItem listsItem = switcherPopup.getMenu().findItem(R.id.lists);
|
||||
listsItem.setVisible(true);
|
||||
SubMenu listsMenu = listsItem.getSubMenu();
|
||||
listsMenu.clear();
|
||||
listItems.forEach((id, list) -> {
|
||||
MenuItem item = listsMenu.add(Menu.NONE, id, Menu.NONE, list.title);
|
||||
item.setIcon(R.drawable.ic_fluent_people_list_24_regular);
|
||||
UiUtils.insetPopupMenuIcon(context, item);
|
||||
});
|
||||
}
|
||||
|
||||
if (!hashtagsItems.isEmpty()) {
|
||||
MenuItem hashtagsItem = switcherPopup.getMenu().findItem(R.id.followed_hashtags);
|
||||
hashtagsItem.setVisible(true);
|
||||
SubMenu hashtagsMenu = hashtagsItem.getSubMenu();
|
||||
hashtagsMenu.clear();
|
||||
hashtagsItems.forEach((id, hashtag) -> {
|
||||
MenuItem item = hashtagsMenu.add(Menu.NONE, id, Menu.NONE, hashtag.name);
|
||||
item.setIcon(R.drawable.ic_fluent_number_symbol_24_regular);
|
||||
UiUtils.insetPopupMenuIcon(context, item);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private boolean onSwitcherItemSelected(MenuItem item) {
|
||||
int id = item.getItemId();
|
||||
ListTimeline list;
|
||||
Hashtag hashtag;
|
||||
if (id == R.id.home) {
|
||||
navigateTo(0);
|
||||
return true;
|
||||
} else if (id == R.id.local) {
|
||||
navigateTo(1);
|
||||
return true;
|
||||
} else if (id == R.id.federated) {
|
||||
navigateTo(2);
|
||||
return true;
|
||||
} else if (id == R.id.post_notifications) {
|
||||
navigateTo(showFederatedTimeline ? 3 : 2);
|
||||
} else if ((list = listItems.get(id)) != null) {
|
||||
Bundle args = new Bundle();
|
||||
args.putString("account", accountID);
|
||||
args.putString("listID", list.id);
|
||||
args.putString("listTitle", list.title);
|
||||
args.putInt("repliesPolicy", list.repliesPolicy.ordinal());
|
||||
Nav.go(getActivity(), ListTimelineFragment.class, args);
|
||||
} else if ((hashtag = hashtagsItems.get(id)) != null) {
|
||||
UiUtils.openHashtagTimeline(getActivity(), accountID, hashtag.name, hashtag.following);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private void navigateTo(int i) {
|
||||
navigateTo(i, !GlobalUserPreferences.reduceMotion);
|
||||
}
|
||||
|
||||
private void navigateTo(int i, boolean smooth) {
|
||||
pager.setCurrentItem(i, smooth);
|
||||
updateSwitcherIcon(i);
|
||||
}
|
||||
|
||||
private void updateSwitcherIcon(int i) {
|
||||
// todo: refactor when implementing pinned tabs
|
||||
if (i == (showFederatedTimeline ? 3 : 2)) {
|
||||
timelineIcon.setImageResource(R.drawable.ic_fluent_alert_24_regular);
|
||||
timelineTitle.setText(R.string.sk_notify_posts);
|
||||
} else {
|
||||
timelineIcon.setImageResource(switch (i) {
|
||||
default -> R.drawable.ic_fluent_home_24_regular;
|
||||
case 1 -> R.drawable.ic_fluent_people_community_24_regular;
|
||||
case 2 -> R.drawable.ic_fluent_earth_24_regular;
|
||||
});
|
||||
timelineTitle.setText(switch (i) {
|
||||
default -> R.string.sk_timeline_home;
|
||||
case 1 -> R.string.sk_timeline_local;
|
||||
case 2 -> R.string.sk_timeline_federated;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item){
|
||||
Bundle args=new Bundle();
|
||||
args.putString("account", accountID);
|
||||
if (item.getItemId() == R.id.settings) Nav.go(getActivity(), SettingsFragment.class, args);
|
||||
if (item.getItemId() == R.id.announcements) {
|
||||
Nav.goForResult(getActivity(), AnnouncementsFragment.class, args, ANNOUNCEMENTS_RESULT, this);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void scrollToTop(){
|
||||
((ScrollableToTop) fragments.get(pager.getCurrentItem())).scrollToTop();
|
||||
}
|
||||
|
||||
public void hideNewPostsButton(){
|
||||
if(!newPostsBtnShown)
|
||||
return;
|
||||
newPostsBtnShown=false;
|
||||
if(currentNewPostsAnim!=null){
|
||||
currentNewPostsAnim.cancel();
|
||||
}
|
||||
timelineTitle.setVisibility(View.VISIBLE);
|
||||
AnimatorSet set=new AnimatorSet();
|
||||
set.playTogether(
|
||||
ObjectAnimator.ofFloat(timelineTitle, View.ALPHA, 1f),
|
||||
ObjectAnimator.ofFloat(timelineTitle, View.SCALE_X, 1f),
|
||||
ObjectAnimator.ofFloat(timelineTitle, View.SCALE_Y, 1f),
|
||||
ObjectAnimator.ofFloat(toolbarShowNewPostsBtn, View.ALPHA, 0f),
|
||||
ObjectAnimator.ofFloat(toolbarShowNewPostsBtn, View.SCALE_X, .8f),
|
||||
ObjectAnimator.ofFloat(toolbarShowNewPostsBtn, View.SCALE_Y, .8f),
|
||||
ObjectAnimator.ofFloat(collapsedChevron, View.ALPHA, 0f)
|
||||
);
|
||||
set.setDuration(GlobalUserPreferences.reduceMotion ? 0 : 300);
|
||||
set.setInterpolator(CubicBezierInterpolator.DEFAULT);
|
||||
set.addListener(new AnimatorListenerAdapter(){
|
||||
@Override
|
||||
public void onAnimationEnd(Animator animation){
|
||||
toolbarShowNewPostsBtn.setVisibility(View.INVISIBLE);
|
||||
collapsedChevron.setVisibility(View.GONE);
|
||||
currentNewPostsAnim=null;
|
||||
}
|
||||
});
|
||||
currentNewPostsAnim=set;
|
||||
set.start();
|
||||
}
|
||||
|
||||
public void showNewPostsButton(){
|
||||
if(newPostsBtnShown || pager == null || pager.getCurrentItem() != 0)
|
||||
return;
|
||||
newPostsBtnShown=true;
|
||||
if(currentNewPostsAnim!=null){
|
||||
currentNewPostsAnim.cancel();
|
||||
}
|
||||
toolbarShowNewPostsBtn.setVisibility(View.VISIBLE);
|
||||
collapsedChevron.setVisibility(View.VISIBLE);
|
||||
AnimatorSet set=new AnimatorSet();
|
||||
set.playTogether(
|
||||
ObjectAnimator.ofFloat(timelineTitle, View.ALPHA, 0f),
|
||||
ObjectAnimator.ofFloat(timelineTitle, View.SCALE_X, .8f),
|
||||
ObjectAnimator.ofFloat(timelineTitle, View.SCALE_Y, .8f),
|
||||
ObjectAnimator.ofFloat(toolbarShowNewPostsBtn, View.ALPHA, 1f),
|
||||
ObjectAnimator.ofFloat(toolbarShowNewPostsBtn, View.SCALE_X, 1f),
|
||||
ObjectAnimator.ofFloat(toolbarShowNewPostsBtn, View.SCALE_Y, 1f),
|
||||
ObjectAnimator.ofFloat(collapsedChevron, View.ALPHA, 1f)
|
||||
);
|
||||
set.setDuration(GlobalUserPreferences.reduceMotion ? 0 : 300);
|
||||
set.setInterpolator(CubicBezierInterpolator.DEFAULT);
|
||||
set.addListener(new AnimatorListenerAdapter(){
|
||||
@Override
|
||||
public void onAnimationEnd(Animator animation){
|
||||
timelineTitle.setVisibility(View.GONE);
|
||||
currentNewPostsAnim=null;
|
||||
}
|
||||
});
|
||||
currentNewPostsAnim=set;
|
||||
set.start();
|
||||
}
|
||||
|
||||
public boolean isNewPostsBtnShown() {
|
||||
return newPostsBtnShown;
|
||||
}
|
||||
|
||||
private void onNewPostsBtnClick(View view) {
|
||||
if(newPostsBtnShown){
|
||||
hideNewPostsButton();
|
||||
scrollToTop();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFragmentResult(int reqCode, boolean noMoreUnread, Bundle result){
|
||||
if (reqCode == ANNOUNCEMENTS_RESULT && noMoreUnread) {
|
||||
announcements.setIcon(R.drawable.ic_fluent_megaphone_24_regular);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateUpdateState(GithubSelfUpdater.UpdateState state){
|
||||
if(state!=GithubSelfUpdater.UpdateState.NO_UPDATE && state!=GithubSelfUpdater.UpdateState.CHECKING)
|
||||
getToolbar().getMenu().findItem(R.id.settings).setIcon(R.drawable.ic_settings_24_badged);
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void onSelfUpdateStateChanged(SelfUpdateStateChangedEvent ev){
|
||||
updateUpdateState(ev.state);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onBackPressed(){
|
||||
if(pager.getCurrentItem() > 0){
|
||||
navigateTo(0);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroyView(){
|
||||
super.onDestroyView();
|
||||
if(GithubSelfUpdater.needSelfUpdating()){
|
||||
E.unregister(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onViewStateRestored(Bundle savedInstanceState) {
|
||||
super.onViewStateRestored(savedInstanceState);
|
||||
if (savedInstanceState == null) return;
|
||||
navigateTo(savedInstanceState.getInt("selectedTab"), false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSaveInstanceState(Bundle outState) {
|
||||
super.onSaveInstanceState(outState);
|
||||
outState.putInt("selectedTab", pager.getCurrentItem());
|
||||
}
|
||||
|
||||
private class HomePagerAdapter extends RecyclerView.Adapter<SimpleViewHolder> {
|
||||
@NonNull
|
||||
@Override
|
||||
public SimpleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||
FrameLayout tabView = tabViews.get(viewType % getItemCount());
|
||||
((ViewGroup)tabView.getParent()).removeView(tabView);
|
||||
tabView.setVisibility(View.VISIBLE);
|
||||
return new SimpleViewHolder(tabView);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull SimpleViewHolder holder, int position){}
|
||||
|
||||
@Override
|
||||
public int getItemCount(){
|
||||
return fragments.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemViewType(int position){
|
||||
return position;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,47 +1,21 @@
|
||||
package org.joinmastodon.android.fragments;
|
||||
|
||||
import android.animation.Animator;
|
||||
import android.animation.AnimatorListenerAdapter;
|
||||
import android.animation.AnimatorSet;
|
||||
import android.animation.ObjectAnimator;
|
||||
import android.app.Activity;
|
||||
import android.content.res.ColorStateList;
|
||||
import android.content.res.Configuration;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.view.Gravity;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Button;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.ImageButton;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.Toolbar;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.squareup.otto.Subscribe;
|
||||
|
||||
import org.joinmastodon.android.E;
|
||||
import org.joinmastodon.android.GlobalUserPreferences;
|
||||
import org.joinmastodon.android.R;
|
||||
import org.joinmastodon.android.api.requests.announcements.GetAnnouncements;
|
||||
import org.joinmastodon.android.api.requests.timelines.GetHomeTimeline;
|
||||
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||
import org.joinmastodon.android.events.SelfUpdateStateChangedEvent;
|
||||
import org.joinmastodon.android.events.StatusCreatedEvent;
|
||||
import org.joinmastodon.android.model.Announcement;
|
||||
import org.joinmastodon.android.model.CacheablePaginatedResponse;
|
||||
import org.joinmastodon.android.model.Filter;
|
||||
import org.joinmastodon.android.model.Status;
|
||||
import org.joinmastodon.android.ui.displayitems.GapStatusDisplayItem;
|
||||
import org.joinmastodon.android.ui.displayitems.StatusDisplayItem;
|
||||
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||
import org.joinmastodon.android.updater.GithubSelfUpdater;
|
||||
import org.joinmastodon.android.utils.StatusFilterPredicate;
|
||||
|
||||
import java.util.Collections;
|
||||
@@ -50,33 +24,19 @@ import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import me.grishka.appkit.Nav;
|
||||
import me.grishka.appkit.api.Callback;
|
||||
import me.grishka.appkit.api.ErrorResponse;
|
||||
import me.grishka.appkit.api.SimpleCallback;
|
||||
import me.grishka.appkit.utils.CubicBezierInterpolator;
|
||||
import me.grishka.appkit.utils.V;
|
||||
|
||||
public class HomeTimelineFragment extends StatusListFragment{
|
||||
private static final int ANNOUNCEMENTS_RESULT = 654;
|
||||
|
||||
private ImageButton fab;
|
||||
private ImageView toolbarLogo;
|
||||
private Button toolbarShowNewPostsBtn;
|
||||
private boolean newPostsBtnShown;
|
||||
private AnimatorSet currentNewPostsAnim;
|
||||
private MenuItem announcements;
|
||||
|
||||
public class HomeTimelineFragment extends FabStatusListFragment {
|
||||
private HomeTabFragment parent;
|
||||
private String maxID;
|
||||
|
||||
public HomeTimelineFragment(){
|
||||
setListLayoutId(R.layout.recycler_fragment_with_fab);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAttach(Activity activity){
|
||||
super.onAttach(activity);
|
||||
setHasOptionsMenu(true);
|
||||
if (getParentFragment() instanceof HomeTabFragment home) parent = home;
|
||||
loadData();
|
||||
}
|
||||
|
||||
@@ -108,67 +68,15 @@ public class HomeTimelineFragment extends StatusListFragment{
|
||||
@Override
|
||||
public void onViewCreated(View view, Bundle savedInstanceState){
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
fab=view.findViewById(R.id.fab);
|
||||
fab.setOnClickListener(this::onFabClick);
|
||||
fab.setOnLongClickListener(v->UiUtils.pickAccountForCompose(getActivity(), accountID));
|
||||
|
||||
updateToolbarLogo();
|
||||
list.addOnScrollListener(new RecyclerView.OnScrollListener(){
|
||||
@Override
|
||||
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy){
|
||||
if(newPostsBtnShown && list.getChildAdapterPosition(list.getChildAt(0))<=getMainAdapterOffset()){
|
||||
hideNewPostsButton();
|
||||
if(parent != null && parent.isNewPostsBtnShown() && list.getChildAdapterPosition(list.getChildAt(0))<=getMainAdapterOffset()){
|
||||
parent.hideNewPostsButton();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if(GithubSelfUpdater.needSelfUpdating()){
|
||||
E.register(this);
|
||||
updateUpdateState(GithubSelfUpdater.getInstance().getState());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater){
|
||||
inflater.inflate(R.menu.home, menu);
|
||||
announcements = menu.findItem(R.id.announcements);
|
||||
|
||||
new GetAnnouncements(false).setCallback(new Callback<>() {
|
||||
@Override
|
||||
public void onSuccess(List<Announcement> result) {
|
||||
boolean hasUnread = result.stream().anyMatch(a -> !a.read);
|
||||
announcements.setIcon(hasUnread ? R.drawable.ic_announcements_24_badged : R.drawable.ic_fluent_megaphone_24_regular);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(ErrorResponse error) {
|
||||
error.showToast(getActivity());
|
||||
}
|
||||
}).exec(accountID);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item){
|
||||
Bundle args=new Bundle();
|
||||
args.putString("account", accountID);
|
||||
if (item.getItemId() == R.id.settings) Nav.go(getActivity(), SettingsFragment.class, args);
|
||||
if (item.getItemId() == R.id.announcements) {
|
||||
Nav.goForResult(getActivity(), AnnouncementsFragment.class, args, ANNOUNCEMENTS_RESULT, this);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFragmentResult(int reqCode, boolean noMoreUnread, Bundle result){
|
||||
if (reqCode == ANNOUNCEMENTS_RESULT && noMoreUnread) {
|
||||
announcements.setIcon(R.drawable.ic_fluent_megaphone_24_regular);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfigurationChanged(Configuration newConfig){
|
||||
super.onConfigurationChanged(newConfig);
|
||||
updateToolbarLogo();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -187,12 +95,6 @@ public class HomeTimelineFragment extends StatusListFragment{
|
||||
prependItems(Collections.singletonList(ev.status), true);
|
||||
}
|
||||
|
||||
private void onFabClick(View v){
|
||||
Bundle args=new Bundle();
|
||||
args.putString("account", accountID);
|
||||
Nav.go(getActivity(), ComposeFragment.class, args);
|
||||
}
|
||||
|
||||
private void loadNewPosts(){
|
||||
if (!GlobalUserPreferences.loadNewPosts) return;
|
||||
dataLoading=true;
|
||||
@@ -221,7 +123,7 @@ public class HomeTimelineFragment extends StatusListFragment{
|
||||
toAdd=toAdd.stream().filter(filterPredicate).collect(Collectors.toList());
|
||||
if(!toAdd.isEmpty()){
|
||||
prependItems(toAdd, true);
|
||||
showNewPostsButton();
|
||||
if (parent != null) parent.showNewPostsButton();
|
||||
AccountSessionManager.getInstance().getAccount(accountID).getCacheController().putHomeTimeline(toAdd, false);
|
||||
}
|
||||
}
|
||||
@@ -337,132 +239,10 @@ public class HomeTimelineFragment extends StatusListFragment{
|
||||
currentRequest=null;
|
||||
dataLoading=false;
|
||||
}
|
||||
if (parent != null) parent.hideNewPostsButton();
|
||||
super.onRefresh();
|
||||
}
|
||||
|
||||
private void updateToolbarLogo(){
|
||||
toolbarLogo=new ImageView(getActivity());
|
||||
toolbarLogo.setScaleType(ImageView.ScaleType.CENTER);
|
||||
toolbarLogo.setImageResource(R.drawable.logo);
|
||||
toolbarLogo.setImageTintList(ColorStateList.valueOf(UiUtils.getThemeColor(getActivity(), android.R.attr.textColorPrimary)));
|
||||
// toolbarLogo =new TextView(getActivity());
|
||||
// toolbarLogo.setText(getString(R.string.app_name).toLowerCase(Locale.getDefault()));
|
||||
// toolbarLogo.setTextAppearance(R.style.app_title);
|
||||
|
||||
toolbarShowNewPostsBtn=new Button(getActivity());
|
||||
toolbarShowNewPostsBtn.setTextAppearance(R.style.m3_title_medium);
|
||||
toolbarShowNewPostsBtn.setTextColor(0xffffffff);
|
||||
toolbarShowNewPostsBtn.setStateListAnimator(null);
|
||||
toolbarShowNewPostsBtn.setBackgroundResource(R.drawable.bg_button_new_posts);
|
||||
toolbarShowNewPostsBtn.setText(R.string.see_new_posts);
|
||||
toolbarShowNewPostsBtn.setCompoundDrawablesRelativeWithIntrinsicBounds(R.drawable.ic_fluent_arrow_up_16_filled, 0, 0, 0);
|
||||
toolbarShowNewPostsBtn.setCompoundDrawableTintList(toolbarShowNewPostsBtn.getTextColors());
|
||||
toolbarShowNewPostsBtn.setCompoundDrawablePadding(V.dp(8));
|
||||
if(Build.VERSION.SDK_INT<Build.VERSION_CODES.N)
|
||||
UiUtils.fixCompoundDrawableTintOnAndroid6(toolbarShowNewPostsBtn);
|
||||
toolbarShowNewPostsBtn.setOnClickListener(this::onNewPostsBtnClick);
|
||||
|
||||
if(newPostsBtnShown){
|
||||
toolbarShowNewPostsBtn.setVisibility(View.VISIBLE);
|
||||
toolbarLogo.setVisibility(View.INVISIBLE);
|
||||
toolbarLogo.setAlpha(0f);
|
||||
}else{
|
||||
toolbarShowNewPostsBtn.setVisibility(View.INVISIBLE);
|
||||
toolbarShowNewPostsBtn.setAlpha(0f);
|
||||
toolbarShowNewPostsBtn.setScaleX(.8f);
|
||||
toolbarShowNewPostsBtn.setScaleY(.8f);
|
||||
toolbarLogo.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
FrameLayout logoWrap=new FrameLayout(getActivity());
|
||||
logoWrap.addView(toolbarLogo, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.CENTER));
|
||||
logoWrap.addView(toolbarShowNewPostsBtn, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, V.dp(32), Gravity.CENTER));
|
||||
|
||||
Toolbar toolbar=getToolbar();
|
||||
toolbar.addView(logoWrap, new Toolbar.LayoutParams(Gravity.CENTER));
|
||||
}
|
||||
|
||||
private void showNewPostsButton(){
|
||||
if(newPostsBtnShown)
|
||||
return;
|
||||
newPostsBtnShown=true;
|
||||
if(currentNewPostsAnim!=null){
|
||||
currentNewPostsAnim.cancel();
|
||||
}
|
||||
toolbarShowNewPostsBtn.setVisibility(View.VISIBLE);
|
||||
AnimatorSet set=new AnimatorSet();
|
||||
set.playTogether(
|
||||
ObjectAnimator.ofFloat(toolbarLogo, View.ALPHA, 0f),
|
||||
ObjectAnimator.ofFloat(toolbarShowNewPostsBtn, View.ALPHA, 1f),
|
||||
ObjectAnimator.ofFloat(toolbarShowNewPostsBtn, View.SCALE_X, 1f),
|
||||
ObjectAnimator.ofFloat(toolbarShowNewPostsBtn, View.SCALE_Y, 1f)
|
||||
);
|
||||
set.setDuration(300);
|
||||
set.setInterpolator(CubicBezierInterpolator.DEFAULT);
|
||||
set.addListener(new AnimatorListenerAdapter(){
|
||||
@Override
|
||||
public void onAnimationEnd(Animator animation){
|
||||
toolbarLogo.setVisibility(View.INVISIBLE);
|
||||
currentNewPostsAnim=null;
|
||||
}
|
||||
});
|
||||
currentNewPostsAnim=set;
|
||||
set.start();
|
||||
}
|
||||
|
||||
private void hideNewPostsButton(){
|
||||
if(!newPostsBtnShown)
|
||||
return;
|
||||
newPostsBtnShown=false;
|
||||
if(currentNewPostsAnim!=null){
|
||||
currentNewPostsAnim.cancel();
|
||||
}
|
||||
toolbarLogo.setVisibility(View.VISIBLE);
|
||||
AnimatorSet set=new AnimatorSet();
|
||||
set.playTogether(
|
||||
ObjectAnimator.ofFloat(toolbarLogo, View.ALPHA, 1f),
|
||||
ObjectAnimator.ofFloat(toolbarShowNewPostsBtn, View.ALPHA, 0f),
|
||||
ObjectAnimator.ofFloat(toolbarShowNewPostsBtn, View.SCALE_X, .8f),
|
||||
ObjectAnimator.ofFloat(toolbarShowNewPostsBtn, View.SCALE_Y, .8f)
|
||||
);
|
||||
set.setDuration(300);
|
||||
set.setInterpolator(CubicBezierInterpolator.DEFAULT);
|
||||
set.addListener(new AnimatorListenerAdapter(){
|
||||
@Override
|
||||
public void onAnimationEnd(Animator animation){
|
||||
toolbarShowNewPostsBtn.setVisibility(View.INVISIBLE);
|
||||
currentNewPostsAnim=null;
|
||||
}
|
||||
});
|
||||
currentNewPostsAnim=set;
|
||||
set.start();
|
||||
}
|
||||
|
||||
private void onNewPostsBtnClick(View v){
|
||||
if(newPostsBtnShown){
|
||||
hideNewPostsButton();
|
||||
scrollToTop();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroyView(){
|
||||
super.onDestroyView();
|
||||
if(GithubSelfUpdater.needSelfUpdating()){
|
||||
E.unregister(this);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateUpdateState(GithubSelfUpdater.UpdateState state){
|
||||
if(state!=GithubSelfUpdater.UpdateState.NO_UPDATE && state!=GithubSelfUpdater.UpdateState.CHECKING)
|
||||
getToolbar().getMenu().findItem(R.id.settings).setIcon(R.drawable.ic_settings_24_badged);
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void onSelfUpdateStateChanged(SelfUpdateStateChangedEvent ev){
|
||||
updateUpdateState(ev.state);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean shouldRemoveAccountPostsWhenUnfollowing(){
|
||||
return true;
|
||||
|
||||
@@ -4,18 +4,26 @@ import android.app.Activity;
|
||||
import android.os.Bundle;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageButton;
|
||||
|
||||
import org.joinmastodon.android.R;
|
||||
import org.joinmastodon.android.api.requests.lists.CreateList;
|
||||
import org.joinmastodon.android.api.requests.lists.UpdateList;
|
||||
import org.joinmastodon.android.api.requests.timelines.GetListTimeline;
|
||||
import org.joinmastodon.android.model.ListTimeline;
|
||||
import org.joinmastodon.android.model.Status;
|
||||
import org.joinmastodon.android.ui.M3AlertDialogBuilder;
|
||||
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||
import org.joinmastodon.android.ui.views.ListTimelineEditor;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import me.grishka.appkit.Nav;
|
||||
import me.grishka.appkit.api.Callback;
|
||||
import me.grishka.appkit.api.ErrorResponse;
|
||||
import me.grishka.appkit.api.SimpleCallback;
|
||||
import me.grishka.appkit.utils.V;
|
||||
|
||||
@@ -23,6 +31,7 @@ import me.grishka.appkit.utils.V;
|
||||
public class ListTimelineFragment extends StatusListFragment {
|
||||
private String listID;
|
||||
private String listTitle;
|
||||
private ListTimeline.RepliesPolicy repliesPolicy;
|
||||
private ImageButton fab;
|
||||
|
||||
public ListTimelineFragment() {
|
||||
@@ -32,8 +41,11 @@ public class ListTimelineFragment extends StatusListFragment {
|
||||
@Override
|
||||
public void onAttach(Activity activity){
|
||||
super.onAttach(activity);
|
||||
listID=getArguments().getString("listID");
|
||||
listTitle=getArguments().getString("listTitle");
|
||||
Bundle args = getArguments();
|
||||
listID = args.getString("listID");
|
||||
listTitle = args.getString("listTitle");
|
||||
repliesPolicy = ListTimeline.RepliesPolicy.values()[args.getInt("repliesPolicy", 0)];
|
||||
|
||||
setTitle(listTitle);
|
||||
setHasOptionsMenu(true);
|
||||
}
|
||||
@@ -41,8 +53,48 @@ public class ListTimelineFragment extends StatusListFragment {
|
||||
@Override
|
||||
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
||||
super.onCreateOptionsMenu(menu, inflater);
|
||||
// TODO: implement edit, delete
|
||||
// inflater.inflate(R.menu.list, menu);
|
||||
inflater.inflate(R.menu.list, menu);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
Bundle args = new Bundle();
|
||||
args.putString("listID", listID);
|
||||
if (item.getItemId() == R.id.edit) {
|
||||
ListTimelineEditor editor = new ListTimelineEditor(getContext());
|
||||
editor.applyList(listTitle, repliesPolicy);
|
||||
new M3AlertDialogBuilder(getActivity())
|
||||
.setTitle(R.string.sk_edit_list_title)
|
||||
.setIcon(R.drawable.ic_fluent_people_list_28_regular)
|
||||
.setView(editor)
|
||||
.setPositiveButton(R.string.save, (d, which) -> {
|
||||
new UpdateList(listID, editor.getTitle(), editor.getRepliesPolicy()).setCallback(new Callback<>() {
|
||||
@Override
|
||||
public void onSuccess(ListTimeline list) {
|
||||
setTitle(list.title);
|
||||
listTitle = list.title;
|
||||
repliesPolicy = list.repliesPolicy;
|
||||
args.putString("listTitle", listTitle);
|
||||
args.putInt("repliesPolicy", repliesPolicy.ordinal());
|
||||
setResult(true, args);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(ErrorResponse error) {
|
||||
error.showToast(getContext());
|
||||
}
|
||||
}).exec(accountID);
|
||||
})
|
||||
.setNegativeButton(R.string.cancel, (d, which) -> {})
|
||||
.show();
|
||||
} else if (item.getItemId() == R.id.delete) {
|
||||
UiUtils.confirmDeleteList(getActivity(), accountID, listID, listTitle, () -> {
|
||||
args.putBoolean("deleted", true);
|
||||
setResult(true, args);
|
||||
Nav.finish(this);
|
||||
});
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
package org.joinmastodon.android.fragments;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.CheckBox;
|
||||
@@ -12,28 +15,37 @@ import androidx.recyclerview.widget.RecyclerView;
|
||||
import org.joinmastodon.android.R;
|
||||
import org.joinmastodon.android.api.MastodonAPIRequest;
|
||||
import org.joinmastodon.android.api.requests.lists.AddAccountsToList;
|
||||
import org.joinmastodon.android.api.requests.lists.CreateList;
|
||||
import org.joinmastodon.android.api.requests.lists.GetLists;
|
||||
import org.joinmastodon.android.api.requests.lists.RemoveAccountsFromList;
|
||||
import org.joinmastodon.android.model.ListTimeline;
|
||||
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||
import org.joinmastodon.android.ui.DividerItemDecoration;
|
||||
import org.joinmastodon.android.ui.M3AlertDialogBuilder;
|
||||
import org.joinmastodon.android.ui.views.ListTimelineEditor;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
import me.grishka.appkit.Nav;
|
||||
import me.grishka.appkit.api.Callback;
|
||||
import me.grishka.appkit.api.ErrorResponse;
|
||||
import me.grishka.appkit.api.SimpleCallback;
|
||||
import me.grishka.appkit.fragments.BaseRecyclerFragment;
|
||||
import me.grishka.appkit.utils.BindableViewHolder;
|
||||
import me.grishka.appkit.views.UsableRecyclerView;
|
||||
|
||||
public class ListTimelinesFragment extends BaseRecyclerFragment<ListTimeline> implements ScrollableToTop {
|
||||
private static final int LIST_CHANGED_RESULT = 987;
|
||||
|
||||
private String accountId;
|
||||
private String profileAccountId;
|
||||
private String profileDisplayUsername;
|
||||
private HashMap<String, Boolean> userInListBefore = new HashMap<>();
|
||||
private HashMap<String, Boolean> userInList = new HashMap<>();
|
||||
private int inProgress = 0;
|
||||
private ListsAdapter adapter;
|
||||
|
||||
public ListTimelinesFragment() {
|
||||
super(10);
|
||||
@@ -44,12 +56,14 @@ public class ListTimelinesFragment extends BaseRecyclerFragment<ListTimeline> im
|
||||
super.onCreate(savedInstanceState);
|
||||
Bundle args=getArguments();
|
||||
accountId=args.getString("account");
|
||||
setHasOptionsMenu(true);
|
||||
|
||||
if(args.containsKey("profileAccount")){
|
||||
profileAccountId=args.getString("profileAccount");
|
||||
profileDisplayUsername=args.getString("profileDisplayUsername");
|
||||
setTitle(getString(R.string.sk_lists_with_user, profileDisplayUsername));
|
||||
// setHasOptionsMenu(true);
|
||||
} else {
|
||||
setTitle(R.string.sk_your_lists);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -60,20 +74,45 @@ public class ListTimelinesFragment extends BaseRecyclerFragment<ListTimeline> im
|
||||
loadData();
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
||||
// Button saveButton=new Button(getActivity());
|
||||
// saveButton.setText(R.string.save);
|
||||
// saveButton.setOnClickListener(this::onSaveClick);
|
||||
// LinearLayout wrap=new LinearLayout(getActivity());
|
||||
// wrap.setOrientation(LinearLayout.HORIZONTAL);
|
||||
// wrap.addView(saveButton, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
|
||||
// wrap.setPadding(V.dp(16), V.dp(4), V.dp(16), V.dp(8));
|
||||
// wrap.setClipToPadding(false);
|
||||
// MenuItem item=menu.add(R.string.save);
|
||||
// item.setActionView(wrap);
|
||||
// item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
|
||||
// }
|
||||
@Override
|
||||
public void onViewCreated(View view, Bundle savedInstanceState) {
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
list.addItemDecoration(new DividerItemDecoration(getActivity(), R.attr.colorPollVoted, 0.5f, 56, 16));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
||||
inflater.inflate(R.menu.menu_list, menu);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
if (item.getItemId() == R.id.create) {
|
||||
ListTimelineEditor editor = new ListTimelineEditor(getContext());
|
||||
new M3AlertDialogBuilder(getActivity())
|
||||
.setTitle(R.string.sk_create_list_title)
|
||||
.setIcon(R.drawable.ic_fluent_people_add_28_regular)
|
||||
.setView(editor)
|
||||
.setPositiveButton(R.string.sk_create, (d, which) -> {
|
||||
new CreateList(editor.getTitle(), editor.getRepliesPolicy()).setCallback(new Callback<>() {
|
||||
@Override
|
||||
public void onSuccess(ListTimeline list) {
|
||||
saveListMembership(list.id, true);
|
||||
data.add(0, list);
|
||||
adapter.notifyItemRangeInserted(0, 1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(ErrorResponse error) {
|
||||
error.showToast(getContext());
|
||||
}
|
||||
}).exec(accountId);
|
||||
})
|
||||
.setNegativeButton(R.string.cancel, (d, which) -> {})
|
||||
.show();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private void saveListMembership(String listId, boolean isMember) {
|
||||
userInList.put(listId, isMember);
|
||||
@@ -118,8 +157,29 @@ public class ListTimelinesFragment extends BaseRecyclerFragment<ListTimeline> im
|
||||
}
|
||||
|
||||
@Override
|
||||
protected RecyclerView.Adapter getAdapter() {
|
||||
return new ListsAdapter();
|
||||
public void onFragmentResult(int reqCode, boolean listChanged, Bundle result){
|
||||
if (reqCode == LIST_CHANGED_RESULT && listChanged) {
|
||||
String listID = result.getString("listID");
|
||||
for (int i = 0; i < data.size(); i++) {
|
||||
ListTimeline item = data.get(i);
|
||||
if (item.id.equals(listID)) {
|
||||
if (result.getBoolean("deleted")) {
|
||||
data.remove(i);
|
||||
adapter.notifyItemRemoved(i);
|
||||
} else {
|
||||
item.title = result.getString("listTitle", item.title);
|
||||
item.repliesPolicy = ListTimeline.RepliesPolicy.values()[result.getInt("repliesPolicy")];
|
||||
adapter.notifyItemChanged(i);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected RecyclerView.Adapter<ListViewHolder> getAdapter() {
|
||||
return adapter = new ListsAdapter();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -158,7 +218,7 @@ public class ListTimelinesFragment extends BaseRecyclerFragment<ListTimeline> im
|
||||
@Override
|
||||
public void onBind(ListTimeline item) {
|
||||
title.setText(item.title);
|
||||
title.setCompoundDrawablesRelativeWithIntrinsicBounds(itemView.getContext().getDrawable(R.drawable.ic_fluent_people_community_24_regular), null, null, null);
|
||||
title.setCompoundDrawablesRelativeWithIntrinsicBounds(itemView.getContext().getDrawable(R.drawable.ic_fluent_people_list_24_regular), null, null, null);
|
||||
if (profileAccountId != null) {
|
||||
Boolean checked = userInList.get(item.id);
|
||||
listToggle.setVisibility(View.VISIBLE);
|
||||
@@ -175,7 +235,12 @@ public class ListTimelinesFragment extends BaseRecyclerFragment<ListTimeline> im
|
||||
|
||||
@Override
|
||||
public void onClick() {
|
||||
UiUtils.openListTimeline(getActivity(), accountId, item);
|
||||
Bundle args=new Bundle();
|
||||
args.putString("account", accountId);
|
||||
args.putString("listID", item.id);
|
||||
args.putString("listTitle", item.title);
|
||||
args.putInt("repliesPolicy", item.repliesPolicy.ordinal());
|
||||
Nav.goForResult(getActivity(), ListTimelineFragment.class, args, LIST_CHANGED_RESULT, ListTimelinesFragment.this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -102,6 +102,7 @@ public class NotificationsFragment extends MastodonToolbarFragment implements Sc
|
||||
|
||||
tabLayout=view.findViewById(R.id.tabbar);
|
||||
pager=view.findViewById(R.id.pager);
|
||||
UiUtils.reduceSwipeSensitivity(pager);
|
||||
|
||||
tabViews=new FrameLayout[3];
|
||||
for(int i=0;i<tabViews.length;i++){
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package org.joinmastodon.android.fragments;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.Fragment;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Paint;
|
||||
@@ -12,11 +13,23 @@ import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.WindowInsets;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
import android.widget.EditText;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.ImageButton;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.recyclerview.widget.ItemTouchHelper;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import org.joinmastodon.android.R;
|
||||
import org.joinmastodon.android.api.requests.accounts.SetPrivateNote;
|
||||
import org.joinmastodon.android.model.AccountField;
|
||||
import org.joinmastodon.android.model.Relationship;
|
||||
import org.joinmastodon.android.ui.BetterItemAnimator;
|
||||
import org.joinmastodon.android.ui.text.CustomEmojiSpan;
|
||||
import org.joinmastodon.android.ui.utils.SimpleTextWatcher;
|
||||
@@ -26,11 +39,8 @@ import org.joinmastodon.android.ui.views.LinkedTextView;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.recyclerview.widget.ItemTouchHelper;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import me.grishka.appkit.api.Callback;
|
||||
import me.grishka.appkit.api.ErrorResponse;
|
||||
import me.grishka.appkit.fragments.WindowInsetsAwareFragment;
|
||||
import me.grishka.appkit.imageloader.ImageLoaderRecyclerAdapter;
|
||||
import me.grishka.appkit.imageloader.ImageLoaderViewHolder;
|
||||
@@ -46,6 +56,11 @@ public class ProfileAboutFragment extends Fragment implements WindowInsetsAwareF
|
||||
private static final int MAX_FIELDS=4;
|
||||
|
||||
public UsableRecyclerView list;
|
||||
public FrameLayout noteWrap;
|
||||
public EditText noteEdit;
|
||||
private String accountID;
|
||||
private String profileAccountID;
|
||||
private String note;
|
||||
private List<AccountField> fields=Collections.emptyList();
|
||||
private AboutAdapter adapter;
|
||||
private Paint dividerPaint=new Paint();
|
||||
@@ -64,11 +79,49 @@ public class ProfileAboutFragment extends Fragment implements WindowInsetsAwareF
|
||||
adapter.notifyDataSetChanged();
|
||||
}
|
||||
|
||||
public void setNote(String note, String accountID, String profileAccountID){
|
||||
this.note=note;
|
||||
this.accountID=accountID;
|
||||
this.profileAccountID=profileAccountID;
|
||||
// noteWrap.setVisibility(View.VISIBLE);
|
||||
// noteEdit.setVisibility(View.VISIBLE);
|
||||
// noteEdit.setText(note);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState){
|
||||
list=new UsableRecyclerView(getActivity());
|
||||
list.setId(R.id.list);
|
||||
View view = inflater.inflate(R.layout.fragment_profile_about, null);
|
||||
|
||||
noteEdit = view.findViewById(R.id.note_edit);
|
||||
noteWrap = view.findViewById(R.id.note_edit_wrap);
|
||||
ImageButton noteEditConfirm = view.findViewById(R.id.note_edit_confirm);
|
||||
|
||||
|
||||
noteEdit.setOnFocusChangeListener((v, hasFocus) -> {
|
||||
if (hasFocus) {
|
||||
noteEditConfirm.setVisibility(View.VISIBLE);
|
||||
noteEditConfirm.animate()
|
||||
.alpha(1.0f)
|
||||
.setDuration(700);
|
||||
} else {
|
||||
noteEditConfirm.animate()
|
||||
.alpha(0.0f)
|
||||
.setDuration(700);
|
||||
noteEditConfirm.setVisibility(View.INVISIBLE);
|
||||
}
|
||||
});
|
||||
|
||||
noteEditConfirm.setOnClickListener((v -> {
|
||||
if (!noteEdit.getText().toString().trim().equals(note)) {
|
||||
savePrivateNote();
|
||||
}
|
||||
InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Activity.INPUT_METHOD_SERVICE);
|
||||
imm.hideSoftInputFromWindow(this.getView().getRootView().getWindowToken(), 0);
|
||||
noteEdit.clearFocus();
|
||||
}));
|
||||
|
||||
list = view.findViewById(R.id.list);
|
||||
list.setItemAnimator(new BetterItemAnimator());
|
||||
list.setDrawSelectorOnTop(true);
|
||||
list.setLayoutManager(new LinearLayoutManager(getActivity()));
|
||||
@@ -95,8 +148,20 @@ public class ProfileAboutFragment extends Fragment implements WindowInsetsAwareF
|
||||
}
|
||||
}
|
||||
});
|
||||
return list;
|
||||
return view;
|
||||
}
|
||||
private void savePrivateNote(){
|
||||
new SetPrivateNote(profileAccountID, noteEdit.getText().toString()).setCallback(new Callback<>() {
|
||||
@Override
|
||||
public void onSuccess(Relationship result) {}
|
||||
|
||||
@Override
|
||||
public void onError(ErrorResponse result) {
|
||||
Toast.makeText(getActivity(), getString(R.string.sk_personal_note_update_failed), Toast.LENGTH_LONG).show();
|
||||
}
|
||||
}).exec(accountID);
|
||||
}
|
||||
|
||||
|
||||
public void enterEditMode(List<AccountField> editableFields){
|
||||
isInEditMode=true;
|
||||
|
||||
@@ -17,23 +17,29 @@ import android.os.Bundle;
|
||||
import android.text.SpannableStringBuilder;
|
||||
import android.text.TextUtils;
|
||||
import android.text.style.ImageSpan;
|
||||
import android.util.Log;
|
||||
import android.view.Gravity;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.ViewOutlineProvider;
|
||||
import android.view.ViewTreeObserver;
|
||||
import android.view.WindowInsets;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
import android.view.animation.TranslateAnimation;
|
||||
import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.ImageButton;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.ProgressBar;
|
||||
import android.widget.RelativeLayout;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
import android.widget.Toolbar;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
@@ -48,6 +54,7 @@ import org.joinmastodon.android.api.requests.accounts.GetAccountRelationships;
|
||||
import org.joinmastodon.android.api.requests.accounts.GetAccountStatuses;
|
||||
import org.joinmastodon.android.api.requests.accounts.GetOwnAccount;
|
||||
import org.joinmastodon.android.api.requests.accounts.SetAccountFollowed;
|
||||
import org.joinmastodon.android.api.requests.accounts.SetPrivateNote;
|
||||
import org.joinmastodon.android.api.requests.accounts.UpdateAccountCredentials;
|
||||
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||
import org.joinmastodon.android.fragments.account_list.FollowerListFragment;
|
||||
@@ -115,6 +122,9 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
private TabLayoutMediator tabLayoutMediator;
|
||||
private TextView followsYouView;
|
||||
|
||||
public FrameLayout noteWrap;
|
||||
public EditText noteEdit;
|
||||
private String note;
|
||||
private Account account;
|
||||
private String accountID;
|
||||
private Relationship relationship;
|
||||
@@ -126,10 +136,11 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
private Uri editNewAvatar, editNewCover;
|
||||
private String profileAccountID;
|
||||
private boolean refreshing;
|
||||
private View fab;
|
||||
private ImageButton fab;
|
||||
private WindowInsets childInsets;
|
||||
private PhotoViewer currentPhotoViewer;
|
||||
private boolean editModeLoading;
|
||||
private boolean isScrollingUp = false;
|
||||
|
||||
public ProfileFragment(){
|
||||
super(R.layout.loader_fragment_overlay_toolbar);
|
||||
@@ -200,6 +211,10 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
fab=content.findViewById(R.id.fab);
|
||||
followsYouView=content.findViewById(R.id.follows_you);
|
||||
|
||||
noteEdit = content.findViewById(R.id.note_edit);
|
||||
noteWrap = content.findViewById(R.id.note_edit_wrap);
|
||||
Button noteEditConfirm = content.findViewById(R.id.note_edit_confirm);
|
||||
|
||||
avatar.setOutlineProvider(new ViewOutlineProvider(){
|
||||
@Override
|
||||
public void getOutline(View view, Outline outline){
|
||||
@@ -208,6 +223,31 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
});
|
||||
avatar.setClipToOutline(true);
|
||||
|
||||
noteEdit.setOnFocusChangeListener((v, hasFocus) -> {
|
||||
if (hasFocus) {
|
||||
fab.setVisibility(View.GONE);
|
||||
noteEditConfirm.setVisibility(View.VISIBLE);
|
||||
noteEditConfirm.animate()
|
||||
.alpha(1.0f)
|
||||
.setDuration(700);
|
||||
} else {
|
||||
fab.setVisibility(View.VISIBLE);
|
||||
noteEditConfirm.animate()
|
||||
.alpha(0.0f)
|
||||
.setDuration(700);
|
||||
noteEditConfirm.setVisibility(View.INVISIBLE);
|
||||
}
|
||||
});
|
||||
|
||||
noteEditConfirm.setOnClickListener((v -> {
|
||||
if (!noteEdit.getText().toString().trim().equals(note)) {
|
||||
savePrivateNote();
|
||||
}
|
||||
InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Activity.INPUT_METHOD_SERVICE);
|
||||
imm.hideSoftInputFromWindow(this.getView().getRootView().getWindowToken(), 0);
|
||||
noteEdit.clearFocus();
|
||||
}));
|
||||
|
||||
FrameLayout sizeWrapper=new FrameLayout(getActivity()){
|
||||
@Override
|
||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
|
||||
@@ -234,6 +274,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
tabViews[i]=tabView;
|
||||
}
|
||||
|
||||
UiUtils.reduceSwipeSensitivity(pager);
|
||||
pager.setOffscreenPageLimit(5);
|
||||
pager.setUserInputEnabled(!GlobalUserPreferences.disableSwipe);
|
||||
pager.setAdapter(new ProfilePagerAdapter());
|
||||
@@ -286,10 +327,6 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
followersBtn.setOnClickListener(this::onFollowersOrFollowingClick);
|
||||
followingBtn.setOnClickListener(this::onFollowersOrFollowingClick);
|
||||
|
||||
if (account != null && account.bot) {
|
||||
username.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_fluent_bot_24_filled, 0, 0, 0);
|
||||
}
|
||||
|
||||
username.setOnLongClickListener(v->{
|
||||
String usernameString=account.acct;
|
||||
if(!usernameString.contains("@")){
|
||||
@@ -302,6 +339,25 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
return sizeWrapper;
|
||||
}
|
||||
|
||||
public void setNote(String note){
|
||||
this.note=note;
|
||||
noteWrap.setVisibility(View.VISIBLE);
|
||||
noteEdit.setVisibility(View.VISIBLE);
|
||||
noteEdit.setText(note);
|
||||
}
|
||||
|
||||
private void savePrivateNote(){
|
||||
new SetPrivateNote(profileAccountID, noteEdit.getText().toString()).setCallback(new Callback<>() {
|
||||
@Override
|
||||
public void onSuccess(Relationship result) {}
|
||||
|
||||
@Override
|
||||
public void onError(ErrorResponse result) {
|
||||
Toast.makeText(getActivity(), getString(R.string.sk_personal_note_update_failed), Toast.LENGTH_LONG).show();
|
||||
}
|
||||
}).exec(accountID);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doLoadData(){
|
||||
currentRequest=new GetAccountByID(profileAccountID)
|
||||
@@ -330,7 +386,11 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
if(mediaFragment.loaded)
|
||||
mediaFragment.onRefresh();
|
||||
}
|
||||
V.setVisibilityAnimated(fab, View.VISIBLE);
|
||||
// if(noteEdit.hasFocus()){
|
||||
// V.setVisibilityAnimated(fab, View.GONE);
|
||||
// }else{
|
||||
// V.setVisibilityAnimated(fab, View.VISIBLE);
|
||||
// }
|
||||
}
|
||||
})
|
||||
.exec(accountID);
|
||||
@@ -449,6 +509,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
|
||||
boolean isSelf=AccountSessionManager.getInstance().isSelf(accountID, account);
|
||||
|
||||
|
||||
if(account.locked){
|
||||
ssb=new SpannableStringBuilder("@");
|
||||
ssb.append(account.acct);
|
||||
@@ -462,6 +523,19 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
lock.setTint(username.getCurrentTextColor());
|
||||
ssb.append(getString(R.string.manually_approves_followers), new ImageSpan(lock, ImageSpan.ALIGN_BASELINE), 0);
|
||||
username.setText(ssb);
|
||||
}else if(account.bot){
|
||||
ssb=new SpannableStringBuilder("@");
|
||||
ssb.append(account.acct);
|
||||
if(isSelf){
|
||||
ssb.append('@');
|
||||
ssb.append(AccountSessionManager.getInstance().getAccount(accountID).domain);
|
||||
}
|
||||
ssb.append(" ");
|
||||
Drawable botIcon=username.getResources().getDrawable(R.drawable.ic_bot, getActivity().getTheme()).mutate();
|
||||
botIcon.setBounds(0, 0, botIcon.getIntrinsicWidth(), botIcon.getIntrinsicHeight());
|
||||
botIcon.setTint(username.getCurrentTextColor());
|
||||
ssb.append(getString(R.string.manually_approves_followers), new ImageSpan(botIcon, ImageSpan.ALIGN_BASELINE), 0);
|
||||
username.setText(ssb);
|
||||
}else{
|
||||
// noinspection SetTextI18n
|
||||
username.setText('@'+account.acct+(isSelf ? ('@'+AccountSessionManager.getInstance().getAccount(accountID).domain) : ""));
|
||||
@@ -473,6 +547,8 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
bio.setVisibility(View.VISIBLE);
|
||||
bio.setText(parsedBio);
|
||||
}
|
||||
|
||||
|
||||
followersCount.setText(UiUtils.abbreviateNumber(account.followersCount));
|
||||
followingCount.setText(UiUtils.abbreviateNumber(account.followingCount));
|
||||
postsCount.setText(UiUtils.abbreviateNumber(account.statusesCount));
|
||||
@@ -553,7 +629,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
return;
|
||||
inflater.inflate(isOwnProfile ? R.menu.profile_own : R.menu.profile, menu);
|
||||
if(isOwnProfile){
|
||||
UiUtils.enableOptionsMenuIcons(getActivity(), menu, R.id.bookmarks, R.id.followed_hashtags, R.id.favorites, R.id.scheduled, R.id.share);
|
||||
UiUtils.enableOptionsMenuIcons(getActivity(), menu, R.id.manage_user_lists, R.id.bookmarks, R.id.followed_hashtags, R.id.favorites, R.id.scheduled, R.id.share);
|
||||
}else{
|
||||
UiUtils.enableOptionsMenuIcons(getActivity(), menu, R.id.bookmarks, R.id.followed_hashtags, R.id.favorites, R.id.scheduled);
|
||||
}
|
||||
@@ -568,17 +644,16 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
|
||||
menu.findItem(R.id.block).setTitle(getString(relationship.blocking ? R.string.unblock_user : R.string.block_user, account.getShortUsername()));
|
||||
menu.findItem(R.id.report).setTitle(getString(R.string.report_user, account.getShortUsername()));
|
||||
MenuItem manageUserLists=menu.findItem(R.id.manage_user_lists);
|
||||
menu.findItem(R.id.manage_user_lists).setVisible(relationship.following);
|
||||
menu.findItem(R.id.soft_block).setVisible(relationship.followedBy && !relationship.following);
|
||||
if(relationship.following) {
|
||||
MenuItem hideBoosts = menu.findItem(R.id.hide_boosts);
|
||||
hideBoosts.setTitle(getString(relationship.showingReblogs ? R.string.hide_boosts_from_user : R.string.show_boosts_from_user, account.getShortUsername()));
|
||||
hideBoosts.setIcon(relationship.showingReblogs ? R.drawable.ic_fluent_arrow_repeat_all_off_24_regular : R.drawable.ic_fluent_arrow_repeat_all_24_regular);
|
||||
UiUtils.insetPopupMenuIcon(getContext(), hideBoosts);
|
||||
manageUserLists.setTitle(getString(R.string.sk_lists_with_user, account.getShortUsername()));
|
||||
manageUserLists.setVisible(true);
|
||||
menu.findItem(R.id.manage_user_lists).setTitle(getString(R.string.sk_lists_with_user, account.getShortUsername()));
|
||||
}else {
|
||||
menu.findItem(R.id.hide_boosts).setVisible(false);
|
||||
manageUserLists.setVisible(false);
|
||||
}
|
||||
if(!account.isLocal())
|
||||
menu.findItem(R.id.block_domain).setTitle(getString(relationship.domainBlocking ? R.string.unblock_domain : R.string.block_domain, account.getDomain()));
|
||||
@@ -598,6 +673,8 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
confirmToggleMuted();
|
||||
}else if(id==R.id.block){
|
||||
confirmToggleBlocked();
|
||||
}else if(id==R.id.soft_block){
|
||||
confirmSoftBlockUser();
|
||||
}else if(id==R.id.report){
|
||||
Bundle args=new Bundle();
|
||||
args.putString("account", accountID);
|
||||
@@ -636,8 +713,10 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
}else if(id==R.id.manage_user_lists){
|
||||
final Bundle args=new Bundle();
|
||||
args.putString("account", accountID);
|
||||
args.putString("profileAccount", profileAccountID);
|
||||
args.putString("profileDisplayUsername", account.getDisplayUsername());
|
||||
if (!isOwnProfile) {
|
||||
args.putString("profileAccount", profileAccountID);
|
||||
args.putString("profileDisplayUsername", account.getDisplayUsername());
|
||||
}
|
||||
Nav.go(getActivity(), ListTimelinesFragment.class, args);
|
||||
}else if(id==R.id.followed_hashtags){
|
||||
Bundle args=new Bundle();
|
||||
@@ -685,9 +764,17 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
notifyProgress.setIndeterminateTintList(notifyButton.getTextColors());
|
||||
followsYouView.setVisibility(relationship.followedBy ? View.VISIBLE : View.GONE);
|
||||
notifyButton.setSelected(relationship.notifying);
|
||||
if (!isOwnProfile) {
|
||||
setNote(relationship.note);
|
||||
aboutFragment.setNote(relationship.note, accountID, profileAccountID);
|
||||
}
|
||||
if (getActivity() != null) notifyButton.setContentDescription(getString(relationship.notifying ? R.string.sk_user_post_notifications_on : R.string.sk_user_post_notifications_off, '@'+account.username));
|
||||
}
|
||||
|
||||
public ImageButton getFab() {
|
||||
return fab;
|
||||
}
|
||||
|
||||
private void onScrollChanged(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY){
|
||||
int topBarsH=getToolbar().getHeight()+statusBarHeight;
|
||||
if(scrollY>avatarBorder.getTop()-topBarsH){
|
||||
@@ -902,6 +989,10 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
UiUtils.confirmToggleBlockUser(getActivity(), accountID, account, relationship.blocking, this::updateRelationship);
|
||||
}
|
||||
|
||||
private void confirmSoftBlockUser(){
|
||||
UiUtils.confirmSoftBlockUser(getActivity(), accountID, account, this::updateRelationship);
|
||||
}
|
||||
|
||||
private void updateRelationship(Relationship r){
|
||||
relationship=r;
|
||||
updateRelationship();
|
||||
@@ -909,6 +1000,9 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
|
||||
@Override
|
||||
public boolean onBackPressed(){
|
||||
if(noteEdit.hasFocus()) {
|
||||
savePrivateNote();
|
||||
}
|
||||
if(isInEditMode){
|
||||
exitEditMode();
|
||||
return true;
|
||||
|
||||
@@ -69,7 +69,7 @@ public class ScheduledStatusListFragment extends BaseStatusListFragment<Schedule
|
||||
|
||||
@Override
|
||||
protected List<StatusDisplayItem> buildDisplayItems(ScheduledStatus s) {
|
||||
return StatusDisplayItem.buildItems(this, s.toStatus(), accountID, s, knownAccounts, false, false, null);
|
||||
return StatusDisplayItem.buildItems(this, s.toStatus(), accountID, s, knownAccounts, false, false, null, true);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -53,6 +53,7 @@ import org.joinmastodon.android.model.PushSubscription;
|
||||
import org.joinmastodon.android.ui.M3AlertDialogBuilder;
|
||||
import org.joinmastodon.android.ui.OutlineProviders;
|
||||
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||
import org.joinmastodon.android.ui.views.TextInputFrameLayout;
|
||||
import org.joinmastodon.android.updater.GithubSelfUpdater;
|
||||
import org.parceler.Parcels;
|
||||
|
||||
@@ -84,7 +85,8 @@ public class SettingsFragment extends MastodonToolbarFragment{
|
||||
private PushSubscription pushSubscription;
|
||||
|
||||
private ImageView themeTransitionWindowView;
|
||||
private TextItem checkForUpdateItem;
|
||||
private TextItem checkForUpdateItem, clearImageCacheItem;
|
||||
private ImageCache imageCache;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState){
|
||||
@@ -92,6 +94,7 @@ public class SettingsFragment extends MastodonToolbarFragment{
|
||||
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.N)
|
||||
setRetainInstance(true);
|
||||
setTitle(R.string.settings);
|
||||
imageCache = ImageCache.getInstance(getActivity());
|
||||
accountID=getArguments().getString("account");
|
||||
AccountSession session=AccountSessionManager.getInstance().getAccount(accountID);
|
||||
Instance instance = AccountSessionManager.getInstance().getInstanceInfo(session.domain);
|
||||
@@ -112,6 +115,15 @@ public class SettingsFragment extends MastodonToolbarFragment{
|
||||
GlobalUserPreferences.disableMarquee=i.checked;
|
||||
GlobalUserPreferences.save();
|
||||
}));
|
||||
items.add(new SwitchItem(R.string.sk_settings_uniform_icon_for_notifications, R.drawable.ic_ntf_logo, GlobalUserPreferences.uniformNotificationIcon, i->{
|
||||
GlobalUserPreferences.uniformNotificationIcon=i.checked;
|
||||
GlobalUserPreferences.save();
|
||||
}));
|
||||
items.add(new SwitchItem(R.string.sk_settings_reduce_motion, R.drawable.ic_fluent_star_emphasis_24_regular, GlobalUserPreferences.reduceMotion, i->{
|
||||
GlobalUserPreferences.reduceMotion=i.checked;
|
||||
GlobalUserPreferences.save();
|
||||
needAppRestart=true;
|
||||
}));
|
||||
items.add(new ButtonItem(R.string.sk_settings_color_palette, R.drawable.ic_fluent_color_24_regular, b->{
|
||||
PopupMenu popupMenu=new PopupMenu(getActivity(), b, Gravity.CENTER_HORIZONTAL);
|
||||
popupMenu.inflate(R.menu.color_palettes);
|
||||
@@ -139,40 +151,33 @@ public class SettingsFragment extends MastodonToolbarFragment{
|
||||
Toast.LENGTH_LONG).show();
|
||||
});
|
||||
} else {
|
||||
b.setOnClickListener(l -> {
|
||||
FrameLayout inputWrap = new FrameLayout(getContext());
|
||||
EditText input = new EditText(getContext());
|
||||
input.setHint(R.string.publish);
|
||||
input.setText(GlobalUserPreferences.publishButtonText.trim());
|
||||
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
|
||||
params.setMargins(V.dp(16), V.dp(4), V.dp(16), V.dp(16));
|
||||
input.setLayoutParams(params);
|
||||
inputWrap.addView(input);
|
||||
new M3AlertDialogBuilder(getContext()).setTitle(R.string.sk_settings_publish_button_text_title).setView(inputWrap)
|
||||
.setPositiveButton(R.string.save, (d, which) -> {
|
||||
GlobalUserPreferences.publishButtonText = input.getText().toString().trim();
|
||||
GlobalUserPreferences.save();
|
||||
updatePublishText(b);
|
||||
})
|
||||
.setNeutralButton(R.string.clear, (d, which) -> {
|
||||
GlobalUserPreferences.publishButtonText = "";
|
||||
GlobalUserPreferences.save();
|
||||
updatePublishText(b);
|
||||
})
|
||||
.setNegativeButton(R.string.cancel, (d, which) -> {
|
||||
})
|
||||
.show();
|
||||
});}
|
||||
}));
|
||||
items.add(new SwitchItem(R.string.sk_settings_uniform_icon_for_notifications, R.drawable.ic_ntf_logo, GlobalUserPreferences.uniformNotificationIcon, i->{
|
||||
GlobalUserPreferences.uniformNotificationIcon=i.checked;
|
||||
GlobalUserPreferences.save();
|
||||
}));
|
||||
items.add(new SwitchItem(R.string.sk_settings_reduce_motion, R.drawable.ic_fluent_star_emphasis_24_regular, GlobalUserPreferences.reduceMotion, i->{
|
||||
GlobalUserPreferences.reduceMotion=i.checked;
|
||||
GlobalUserPreferences.save();
|
||||
b.setOnClickListener(l -> {
|
||||
FrameLayout inputWrap = new FrameLayout(getContext());
|
||||
EditText input = new EditText(getContext());
|
||||
input.setHint(R.string.publish);
|
||||
input.setText(GlobalUserPreferences.publishButtonText.trim());
|
||||
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
|
||||
params.setMargins(V.dp(16), V.dp(4), V.dp(16), V.dp(16));
|
||||
input.setLayoutParams(params);
|
||||
inputWrap.addView(input);
|
||||
new M3AlertDialogBuilder(getContext()).setTitle(R.string.sk_settings_publish_button_text_title).setView(inputWrap)
|
||||
.setPositiveButton(R.string.save, (d, which) -> {
|
||||
GlobalUserPreferences.publishButtonText = input.getText().toString().trim();
|
||||
GlobalUserPreferences.save();
|
||||
updatePublishText(b);
|
||||
})
|
||||
.setNeutralButton(R.string.clear, (d, which) -> {
|
||||
GlobalUserPreferences.publishButtonText = "";
|
||||
GlobalUserPreferences.save();
|
||||
updatePublishText(b);
|
||||
})
|
||||
.setNegativeButton(R.string.cancel, (d, which) -> {
|
||||
})
|
||||
.show();
|
||||
});}
|
||||
}));
|
||||
|
||||
|
||||
items.add(new HeaderItem(R.string.settings_behavior));
|
||||
items.add(new SwitchItem(R.string.sk_settings_show_federated_timeline, R.drawable.ic_fluent_earth_24_regular, GlobalUserPreferences.showFederatedTimeline, i->{
|
||||
GlobalUserPreferences.showFederatedTimeline=i.checked;
|
||||
@@ -243,7 +248,7 @@ public class SettingsFragment extends MastodonToolbarFragment{
|
||||
items.add(new SwitchItem(R.string.notify_reblog, R.drawable.ic_fluent_arrow_repeat_all_24_regular, pushSubscription.alerts.reblog, i->onNotificationsChanged(PushNotification.Type.REBLOG, i.checked)));
|
||||
items.add(new SwitchItem(R.string.notify_mention, R.drawable.ic_fluent_mention_24_regular, pushSubscription.alerts.mention, i->onNotificationsChanged(PushNotification.Type.MENTION, i.checked)));
|
||||
items.add(new SwitchItem(R.string.sk_notify_posts, R.drawable.ic_fluent_alert_24_regular, pushSubscription.alerts.status, i->onNotificationsChanged(PushNotification.Type.STATUS, i.checked)));
|
||||
items.add(new SwitchItem(R.string.sk_keep_only_latest_notification, R.drawable.ic_fluent_custom_alert_latest_24_regular, GlobalUserPreferences.keepOnlyLatestNotification, i->{
|
||||
items.add(new SwitchItem(R.string.sk_settings_single_notification, R.drawable.ic_fluent_convert_range_24_regular, GlobalUserPreferences.keepOnlyLatestNotification, i->{
|
||||
GlobalUserPreferences.keepOnlyLatestNotification=i.checked;
|
||||
GlobalUserPreferences.save();
|
||||
}));
|
||||
@@ -260,6 +265,7 @@ public class SettingsFragment extends MastodonToolbarFragment{
|
||||
args.putParcelable("instance", Parcels.wrap(instance));
|
||||
Nav.go(getActivity(), InstanceRulesFragment.class, args);
|
||||
}, R.drawable.ic_fluent_task_list_ltr_24_regular));
|
||||
items.add(new TextItem(R.string.sk_settings_about_instance , ()->UiUtils.launchWebBrowser(getActivity(), "https://"+session.domain+"/about"), R.drawable.ic_fluent_info_24_regular));
|
||||
items.add(new TextItem(R.string.settings_tos, ()->UiUtils.launchWebBrowser(getActivity(), "https://"+session.domain+"/terms"), R.drawable.ic_fluent_open_24_regular));
|
||||
items.add(new TextItem(R.string.settings_privacy_policy, ()->UiUtils.launchWebBrowser(getActivity(), "https://"+session.domain+"/terms"), R.drawable.ic_fluent_open_24_regular));
|
||||
items.add(new TextItem(R.string.log_out, this::confirmLogOut, R.drawable.ic_fluent_sign_out_24_regular));
|
||||
@@ -278,7 +284,9 @@ public class SettingsFragment extends MastodonToolbarFragment{
|
||||
}
|
||||
items.add(new TextItem(R.string.sk_settings_contribute, ()->UiUtils.launchWebBrowser(getActivity(), "https://github.com/LucasGGamerM/moshidon"), R.drawable.ic_fluent_open_24_regular));
|
||||
items.add(new TextItem(R.string.sk_settings_donate, ()->UiUtils.launchWebBrowser(getActivity(), "https://github.com/sponsors/LucasGGamerM"), R.drawable.ic_fluent_heart_24_regular));
|
||||
items.add(new TextItem(R.string.settings_clear_cache, this::clearImageCache));
|
||||
// items.add(new TextItem(R.string.settings_clear_cache, this::clearImageCache));
|
||||
clearImageCacheItem = new TextItem(R.string.settings_clear_cache, UiUtils.formatFileSize(getContext(), imageCache.getDiskCache().size(), true), this::clearImageCache, 0);
|
||||
items.add(clearImageCacheItem);
|
||||
items.add(new TextItem(R.string.sk_clear_recent_languages, ()->UiUtils.showConfirmationAlert(getActivity(), R.string.sk_clear_recent_languages, R.string.sk_confirm_clear_recent_languages, R.string.clear, ()->{
|
||||
GlobalUserPreferences.recentLanguages.remove(accountID);
|
||||
GlobalUserPreferences.save();
|
||||
@@ -527,9 +535,13 @@ public class SettingsFragment extends MastodonToolbarFragment{
|
||||
private void clearImageCache(){
|
||||
MastodonAPIController.runInBackground(()->{
|
||||
Activity activity=getActivity();
|
||||
ImageCache.getInstance(getActivity()).clear();
|
||||
imageCache.clear();
|
||||
Toast.makeText(activity, R.string.media_cache_cleared, Toast.LENGTH_SHORT).show();
|
||||
});
|
||||
if (list.findViewHolderForAdapterPosition(items.indexOf(clearImageCacheItem)) instanceof TextViewHolder tvh) {
|
||||
clearImageCacheItem.secondaryText = UiUtils.formatFileSize(getContext(), 0, true);
|
||||
tvh.rebind();
|
||||
}
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
@@ -660,27 +672,29 @@ public class SettingsFragment extends MastodonToolbarFragment{
|
||||
|
||||
private class TextItem extends Item{
|
||||
private String text;
|
||||
private String secondaryText;
|
||||
private Runnable onClick;
|
||||
private boolean loading;
|
||||
private int icon;
|
||||
|
||||
public TextItem(@StringRes int text, Runnable onClick) {
|
||||
this(text, onClick, false, 0);
|
||||
}
|
||||
|
||||
public TextItem(@StringRes int text, Runnable onClick, boolean loading) {
|
||||
this(text, onClick, loading, 0);
|
||||
this(text, null, onClick, false, 0);
|
||||
}
|
||||
|
||||
public TextItem(@StringRes int text, Runnable onClick, @DrawableRes int icon) {
|
||||
this(text, onClick, false, icon);
|
||||
this(text, null, onClick, false, icon);
|
||||
}
|
||||
|
||||
public TextItem(@StringRes int text, Runnable onClick, boolean loading, @DrawableRes int icon){
|
||||
public TextItem(@StringRes int text, String secondaryText, Runnable onClick, @DrawableRes int icon) {
|
||||
this(text, secondaryText, onClick, false, icon);
|
||||
}
|
||||
|
||||
public TextItem(@StringRes int text, String secondaryText, Runnable onClick, boolean loading, @DrawableRes int icon){
|
||||
this.text=getString(text);
|
||||
this.onClick=onClick;
|
||||
this.loading=loading;
|
||||
this.icon=icon;
|
||||
this.secondaryText = secondaryText;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -932,22 +946,27 @@ public class SettingsFragment extends MastodonToolbarFragment{
|
||||
}
|
||||
|
||||
private class TextViewHolder extends BindableViewHolder<TextItem> implements UsableRecyclerView.Clickable{
|
||||
private final TextView text;
|
||||
private final TextView text, secondaryText;
|
||||
private final ProgressBar progress;
|
||||
private final ImageView icon;
|
||||
|
||||
public TextViewHolder(){
|
||||
super(getActivity(), R.layout.item_settings_text, list);
|
||||
text = itemView.findViewById(R.id.text);
|
||||
secondaryText = itemView.findViewById(R.id.secondary_text);
|
||||
progress = itemView.findViewById(R.id.progress);
|
||||
icon = itemView.findViewById(R.id.icon);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBind(TextItem item){
|
||||
icon.setVisibility(item.icon != 0 ? View.VISIBLE : View.GONE);
|
||||
secondaryText.setVisibility(item.secondaryText != null ? View.VISIBLE : View.GONE);
|
||||
|
||||
text.setText(item.text);
|
||||
progress.animate().alpha(item.loading ? 1 : 0);
|
||||
if (item.icon != 0) icon.setImageDrawable(getActivity().getTheme().getDrawable(item.icon));
|
||||
icon.setImageResource(item.icon);
|
||||
secondaryText.setText(item.secondaryText);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package org.joinmastodon.android.fragments;
|
||||
|
||||
import android.content.res.Configuration;
|
||||
import android.os.Bundle;
|
||||
|
||||
import com.squareup.otto.Subscribe;
|
||||
@@ -171,6 +172,12 @@ public abstract class StatusListFragment extends BaseStatusListFragment<Status>{
|
||||
adapter.notifyItemRangeRemoved(index, lastIndex-index);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfigurationChanged(Configuration newConfig){
|
||||
super.onConfigurationChanged(newConfig);
|
||||
if (getParentFragment() instanceof HomeTabFragment home) home.updateToolbarLogo();
|
||||
}
|
||||
|
||||
public class EventListener{
|
||||
|
||||
@Subscribe
|
||||
|
||||
@@ -225,6 +225,7 @@ public abstract class BaseAccountListFragment extends BaseRecyclerFragment<BaseA
|
||||
contextMenu=new PopupMenu(getActivity(), menuAnchor);
|
||||
contextMenu.inflate(R.menu.profile);
|
||||
contextMenu.setOnMenuItemClickListener(this::onContextMenuItemSelected);
|
||||
UiUtils.enablePopupMenuIcons(getActivity(), contextMenu);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -283,29 +284,32 @@ public abstract class BaseAccountListFragment extends BaseRecyclerFragment<BaseA
|
||||
Menu menu=contextMenu.getMenu();
|
||||
Account account=item.account;
|
||||
|
||||
menu.findItem(R.id.share).setTitle(getString(R.string.share_user, account.getDisplayUsername()));
|
||||
menu.findItem(R.id.mute).setTitle(getString(relationship.muting ? R.string.unmute_user : R.string.mute_user, account.getDisplayUsername()));
|
||||
menu.findItem(R.id.block).setTitle(getString(relationship.blocking ? R.string.unblock_user : R.string.block_user, account.getDisplayUsername()));
|
||||
menu.findItem(R.id.report).setTitle(getString(R.string.report_user, account.getDisplayUsername()));
|
||||
menu.findItem(R.id.manage_user_lists).setTitle(getString(R.string.sk_lists_with_user, account.getDisplayUsername())).setVisible(relationship.following);
|
||||
menu.findItem(R.id.share).setTitle(getString(R.string.share_user, account.getShortUsername()));
|
||||
|
||||
MenuItem mute = menu.findItem(R.id.mute);
|
||||
mute.setTitle(getString(relationship.muting ? R.string.unmute_user : R.string.mute_user, account.getShortUsername()));
|
||||
mute.setIcon(relationship.muting ? R.drawable.ic_fluent_speaker_0_24_regular : R.drawable.ic_fluent_speaker_off_24_regular);
|
||||
UiUtils.insetPopupMenuIcon(getContext(), mute);
|
||||
|
||||
menu.findItem(R.id.block).setTitle(getString(relationship.blocking ? R.string.unblock_user : R.string.block_user, account.getShortUsername()));
|
||||
menu.findItem(R.id.report).setTitle(getString(R.string.report_user, account.getShortUsername()));
|
||||
menu.findItem(R.id.manage_user_lists).setTitle(getString(R.string.sk_lists_with_user, account.getShortUsername())).setVisible(relationship.following);
|
||||
menu.findItem(R.id.soft_block).setVisible(relationship.followedBy && !relationship.following);
|
||||
MenuItem hideBoosts=menu.findItem(R.id.hide_boosts);
|
||||
MenuItem manageUserLists=menu.findItem(R.id.manage_user_lists);
|
||||
if(relationship.following){
|
||||
hideBoosts.setTitle(getString(relationship.showingReblogs ? R.string.hide_boosts_from_user : R.string.show_boosts_from_user, account.getDisplayUsername()));
|
||||
hideBoosts.setTitle(getString(relationship.showingReblogs ? R.string.hide_boosts_from_user : R.string.show_boosts_from_user, account.getShortUsername()));
|
||||
hideBoosts.setIcon(relationship.showingReblogs ? R.drawable.ic_fluent_arrow_repeat_all_off_24_regular : R.drawable.ic_fluent_arrow_repeat_all_24_regular);
|
||||
hideBoosts.setVisible(true);
|
||||
manageUserLists.setTitle(getString(R.string.sk_lists_with_user, account.getDisplayUsername()));
|
||||
UiUtils.insetPopupMenuIcon(getContext(), hideBoosts);
|
||||
|
||||
manageUserLists.setTitle(getString(R.string.sk_lists_with_user, account.getShortUsername()));
|
||||
manageUserLists.setVisible(true);
|
||||
}else{
|
||||
hideBoosts.setVisible(false);
|
||||
manageUserLists.setVisible(true);
|
||||
}
|
||||
MenuItem blockDomain=menu.findItem(R.id.block_domain);
|
||||
if(!account.isLocal()){
|
||||
blockDomain.setTitle(getString(relationship.domainBlocking ? R.string.unblock_domain : R.string.block_domain, account.getDomain()));
|
||||
blockDomain.setVisible(true);
|
||||
}else{
|
||||
blockDomain.setVisible(false);
|
||||
}
|
||||
menu.findItem(R.id.block_domain).setVisible(false);
|
||||
|
||||
menuAnchor.setTranslationX(x);
|
||||
menuAnchor.setTranslationY(y);
|
||||
@@ -346,6 +350,8 @@ public abstract class BaseAccountListFragment extends BaseRecyclerFragment<BaseA
|
||||
UiUtils.confirmToggleMuteUser(getActivity(), accountID, account, relationship.muting, this::updateRelationship);
|
||||
}else if(id==R.id.block){
|
||||
UiUtils.confirmToggleBlockUser(getActivity(), accountID, account, relationship.blocking, this::updateRelationship);
|
||||
}else if(id==R.id.soft_block){
|
||||
UiUtils.confirmSoftBlockUser(getActivity(), accountID, account, this::updateRelationship);
|
||||
}else if(id==R.id.report){
|
||||
Bundle args=new Bundle();
|
||||
args.putString("account", accountID);
|
||||
|
||||
@@ -81,20 +81,30 @@ public class DiscoverFragment extends AppKitFragment implements ScrollableToTop,
|
||||
tabLayout=view.findViewById(R.id.tabbar);
|
||||
pager=view.findViewById(R.id.pager);
|
||||
|
||||
tabViews=new FrameLayout[noFederated ? 6 : 7];
|
||||
// tabViews=new FrameLayout[noFederated ? 5 : 6];
|
||||
tabViews=new FrameLayout[4];
|
||||
for(int i=0;i<tabViews.length;i++){
|
||||
FrameLayout tabView=new FrameLayout(getActivity());
|
||||
int switchIndex = noFederated && i > 0 ? i + 1 : i;
|
||||
tabView.setId(switch(switchIndex){
|
||||
case 0 -> R.id.discover_local_timeline;
|
||||
case 1 -> R.id.discover_federated_timeline;
|
||||
case 2 -> R.id.discover_lists;
|
||||
case 3 -> R.id.discover_hashtags;
|
||||
case 4 -> R.id.discover_posts;
|
||||
case 5 -> R.id.discover_news;
|
||||
case 6 -> R.id.discover_users;
|
||||
default -> throw new IllegalStateException("Unexpected value: "+switchIndex);
|
||||
|
||||
/// int switchIndex = noFederated && i > 0 ? i + 1 : i;
|
||||
// tabView.setId(switch(switchIndex){
|
||||
// case 0 -> R.id.discover_local_timeline;
|
||||
// case 1 -> R.id.discover_federated_timeline;
|
||||
// case 2 -> R.id.discover_hashtags;
|
||||
// case 3 -> R.id.discover_posts;
|
||||
// case 4 -> R.id.discover_news;
|
||||
// case 5 -> R.id.discover_users;
|
||||
// default -> throw new IllegalStateException("Unexpected value: "+switchIndex);
|
||||
// });
|
||||
|
||||
tabView.setId(switch(i){
|
||||
case 0 -> R.id.discover_hashtags;
|
||||
case 1 -> R.id.discover_posts;
|
||||
case 2 -> R.id.discover_news;
|
||||
case 3 -> R.id.discover_users;
|
||||
default -> throw new IllegalStateException("Unexpected value: "+i);
|
||||
});
|
||||
|
||||
tabView.setVisibility(View.GONE);
|
||||
view.addView(tabView); // needed so the fragment manager will have somewhere to restore the tab fragment
|
||||
tabViews[i]=tabView;
|
||||
@@ -103,6 +113,7 @@ public class DiscoverFragment extends AppKitFragment implements ScrollableToTop,
|
||||
tabLayout.setTabTextSize(V.dp(16));
|
||||
tabLayout.setTabTextColors(UiUtils.getThemeColor(getActivity(), R.attr.colorTabInactive), UiUtils.getThemeColor(getActivity(), android.R.attr.textColorPrimary));
|
||||
|
||||
UiUtils.reduceSwipeSensitivity(pager);
|
||||
pager.setOffscreenPageLimit(4);
|
||||
pager.setUserInputEnabled(!GlobalUserPreferences.disableSwipe);
|
||||
pager.setAdapter(new DiscoverPagerAdapter());
|
||||
@@ -119,7 +130,7 @@ public class DiscoverFragment extends AppKitFragment implements ScrollableToTop,
|
||||
}
|
||||
});
|
||||
|
||||
if(localTimelineFragment==null){
|
||||
if(localTimelineFragment==null || hashtagsFragment==null){
|
||||
Bundle args=new Bundle();
|
||||
args.putString("account", accountID);
|
||||
args.putBoolean("__is_tab", true);
|
||||
@@ -139,39 +150,56 @@ public class DiscoverFragment extends AppKitFragment implements ScrollableToTop,
|
||||
localTimelineFragment=new LocalTimelineFragment();
|
||||
localTimelineFragment.setArguments(args);
|
||||
|
||||
listTimelinesFragment=new ListTimelinesFragment();
|
||||
listTimelinesFragment.setArguments(args);
|
||||
// listTimelinesFragment=new ListTimelinesFragment();
|
||||
// listTimelinesFragment.setArguments(args);
|
||||
//
|
||||
// FragmentTransaction transaction = getChildFragmentManager().beginTransaction()
|
||||
// .add(R.id.discover_posts, postsFragment)
|
||||
// .add(R.id.discover_local_timeline, localTimelineFragment)
|
||||
// .add(R.id.discover_hashtags, hashtagsFragment)
|
||||
// .add(R.id.discover_news, newsFragment)
|
||||
// .add(R.id.discover_users, accountsFragment)
|
||||
// .add(R.id.discover_lists, listTimelinesFragment);
|
||||
//
|
||||
// if (!noFederated) {
|
||||
// federatedTimelineFragment=new FederatedTimelineFragment();
|
||||
// federatedTimelineFragment.setArguments(args);
|
||||
// transaction.add(R.id.discover_federated_timeline, federatedTimelineFragment);
|
||||
// }
|
||||
//
|
||||
// transaction.commit();
|
||||
|
||||
FragmentTransaction transaction = getChildFragmentManager().beginTransaction()
|
||||
getChildFragmentManager().beginTransaction()
|
||||
.add(R.id.discover_posts, postsFragment)
|
||||
.add(R.id.discover_local_timeline, localTimelineFragment)
|
||||
.add(R.id.discover_hashtags, hashtagsFragment)
|
||||
.add(R.id.discover_news, newsFragment)
|
||||
.add(R.id.discover_users, accountsFragment)
|
||||
.add(R.id.discover_lists, listTimelinesFragment);
|
||||
|
||||
if (!noFederated) {
|
||||
federatedTimelineFragment=new FederatedTimelineFragment();
|
||||
federatedTimelineFragment.setArguments(args);
|
||||
transaction.add(R.id.discover_federated_timeline, federatedTimelineFragment);
|
||||
}
|
||||
|
||||
transaction.commit();
|
||||
.commit();
|
||||
}
|
||||
|
||||
tabLayoutMediator=new TabLayoutMediator(tabLayout, pager, new TabLayoutMediator.TabConfigurationStrategy(){
|
||||
@Override
|
||||
public void onConfigureTab(@NonNull TabLayout.Tab tab, int position){
|
||||
if (noFederated && position > 0) position++;
|
||||
tab.setText(switch(position){
|
||||
case 0 -> R.string.local_timeline;
|
||||
case 1 -> R.string.sk_federated_timeline;
|
||||
case 2 -> R.string.sk_list_timelines;
|
||||
case 3 -> R.string.hashtags;
|
||||
case 4 -> R.string.posts;
|
||||
case 5 -> R.string.news;
|
||||
case 6 -> R.string.for_you;
|
||||
|
||||
// if (noFederated && position > 0) position++;
|
||||
|
||||
// tab.setText(switch(position){
|
||||
// case 0 -> R.string.local_timeline;
|
||||
// case 1 -> R.string.sk_federated_timeline;
|
||||
// case 2 -> R.string.sk_list_timelines;
|
||||
// case 3 -> R.string.hashtags;
|
||||
// case 4 -> R.string.posts;
|
||||
// case 5 -> R.string.news;
|
||||
// case 6 -> R.string.for_you;
|
||||
//
|
||||
// default -> throw new IllegalStateException("Unexpected value: "+position);
|
||||
// });
|
||||
|
||||
tab.setText(switch(position){
|
||||
case 0 -> R.string.hashtags;
|
||||
case 1 -> R.string.posts;
|
||||
case 2 -> R.string.news;
|
||||
case 3 -> R.string.for_you;
|
||||
default -> throw new IllegalStateException("Unexpected value: "+position);
|
||||
});
|
||||
tab.view.textView.setAllCaps(true);
|
||||
@@ -257,8 +285,11 @@ public class DiscoverFragment extends AppKitFragment implements ScrollableToTop,
|
||||
}
|
||||
|
||||
public void loadData(){
|
||||
if(localTimelineFragment!=null && !localTimelineFragment.loaded && !localTimelineFragment.dataLoading)
|
||||
localTimelineFragment.loadData();
|
||||
if(hashtagsFragment!=null && !hashtagsFragment.loaded && !hashtagsFragment.dataLoading)
|
||||
hashtagsFragment.loadData();
|
||||
|
||||
// if(localTimelineFragment!=null && !localTimelineFragment.loaded && !localTimelineFragment.dataLoading)
|
||||
// localTimelineFragment.loadData();
|
||||
}
|
||||
|
||||
private void onSearchEditFocusChanged(View v, boolean hasFocus){
|
||||
@@ -294,14 +325,23 @@ public class DiscoverFragment extends AppKitFragment implements ScrollableToTop,
|
||||
|
||||
private Fragment getFragmentForPage(int page){
|
||||
if (noFederated && page > 0) page++;
|
||||
|
||||
// return switch(page){
|
||||
// case 0 -> localTimelineFragment;
|
||||
// case 1 -> federatedTimelineFragment;
|
||||
// case 2 -> hashtagsFragment;
|
||||
// case 3 -> postsFragment;
|
||||
// case 4 -> newsFragment;
|
||||
// case 5 -> accountsFragment;
|
||||
// case 6 -> listTimelinesFragment;
|
||||
// default -> throw new IllegalStateException("Unexpected value: "+page);
|
||||
// };
|
||||
|
||||
return switch(page){
|
||||
case 0 -> localTimelineFragment;
|
||||
case 1 -> federatedTimelineFragment;
|
||||
case 2 -> hashtagsFragment;
|
||||
case 3 -> postsFragment;
|
||||
case 4 -> newsFragment;
|
||||
case 5 -> accountsFragment;
|
||||
case 6 -> listTimelinesFragment;
|
||||
case 0 -> hashtagsFragment;
|
||||
case 1 -> postsFragment;
|
||||
case 2 -> newsFragment;
|
||||
case 3 -> accountsFragment;
|
||||
default -> throw new IllegalStateException("Unexpected value: "+page);
|
||||
};
|
||||
}
|
||||
|
||||
@@ -17,11 +17,11 @@ public class DiscoverPostsFragment extends StatusListFragment{
|
||||
|
||||
@Override
|
||||
protected void doLoadData(int offset, int count){
|
||||
currentRequest=new GetTrendingStatuses(count)
|
||||
currentRequest=new GetTrendingStatuses(offset, count)
|
||||
.setCallback(new SimpleCallback<>(this){
|
||||
@Override
|
||||
public void onSuccess(List<Status> result){
|
||||
onDataLoaded(result, false);
|
||||
onDataLoaded(result, !result.isEmpty());
|
||||
}
|
||||
}).exec(accountID);
|
||||
}
|
||||
|
||||
@@ -3,7 +3,9 @@ package org.joinmastodon.android.fragments.discover;
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
|
||||
import org.joinmastodon.android.R;
|
||||
import org.joinmastodon.android.api.requests.timelines.GetPublicTimeline;
|
||||
import org.joinmastodon.android.fragments.FabStatusListFragment;
|
||||
import org.joinmastodon.android.fragments.StatusListFragment;
|
||||
import org.joinmastodon.android.model.Filter;
|
||||
import org.joinmastodon.android.model.Status;
|
||||
@@ -15,7 +17,7 @@ import java.util.stream.Collectors;
|
||||
|
||||
import me.grishka.appkit.api.SimpleCallback;
|
||||
|
||||
public class FederatedTimelineFragment extends StatusListFragment{
|
||||
public class FederatedTimelineFragment extends FabStatusListFragment {
|
||||
private DiscoverInfoBannerHelper bannerHelper=new DiscoverInfoBannerHelper(DiscoverInfoBannerHelper.BannerType.FEDERATED_TIMELINE);
|
||||
private String maxID;
|
||||
|
||||
|
||||
@@ -3,7 +3,9 @@ package org.joinmastodon.android.fragments.discover;
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
|
||||
import org.joinmastodon.android.R;
|
||||
import org.joinmastodon.android.api.requests.timelines.GetPublicTimeline;
|
||||
import org.joinmastodon.android.fragments.FabStatusListFragment;
|
||||
import org.joinmastodon.android.fragments.StatusListFragment;
|
||||
import org.joinmastodon.android.model.Filter;
|
||||
import org.joinmastodon.android.model.Status;
|
||||
@@ -15,7 +17,7 @@ import java.util.stream.Collectors;
|
||||
|
||||
import me.grishka.appkit.api.SimpleCallback;
|
||||
|
||||
public class LocalTimelineFragment extends StatusListFragment{
|
||||
public class LocalTimelineFragment extends FabStatusListFragment {
|
||||
private DiscoverInfoBannerHelper bannerHelper=new DiscoverInfoBannerHelper(DiscoverInfoBannerHelper.BannerType.LOCAL_TIMELINE);
|
||||
private String maxID;
|
||||
|
||||
|
||||
@@ -14,9 +14,11 @@ import org.parceler.Parcel;
|
||||
import org.parceler.ParcelConstructor;
|
||||
import org.parceler.ParcelProperty;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
@Parcel
|
||||
public class Attachment extends BaseModel{
|
||||
@RequiredField
|
||||
// @RequiredField
|
||||
public String id;
|
||||
@RequiredField
|
||||
public Type type;
|
||||
@@ -85,6 +87,12 @@ public class Attachment extends BaseModel{
|
||||
if(placeholder!=null)
|
||||
blurhashPlaceholder=new BlurHashDrawable(placeholder, getWidth(), getHeight());
|
||||
}
|
||||
|
||||
if (id == null) {
|
||||
// akkoma servers doesn't provide IDs for attachments,
|
||||
// but IDs are needed by the AudioPlayerService
|
||||
id = "" + this.hashCode();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -27,7 +27,7 @@ public class Instance extends BaseModel{
|
||||
/**
|
||||
* Admin-defined description of the Mastodon site.
|
||||
*/
|
||||
@RequiredField
|
||||
// @RequiredField
|
||||
public String description;
|
||||
/**
|
||||
* A shorter description defined by the admin.
|
||||
@@ -37,7 +37,7 @@ public class Instance extends BaseModel{
|
||||
/**
|
||||
* An email that may be contacted for any inquiries.
|
||||
*/
|
||||
@RequiredField
|
||||
// @RequiredField
|
||||
public String email;
|
||||
/**
|
||||
* The version of Mastodon installed on the instance.
|
||||
|
||||
@@ -66,10 +66,12 @@ public class ScheduledStatus extends BaseModel implements DisplayItemsParent{
|
||||
s.id = id;
|
||||
s.mediaAttachments = mediaAttachments;
|
||||
s.createdAt = scheduledAt;
|
||||
s.inReplyToId = params.inReplyToId > 0 ? "" + params.inReplyToId : null;
|
||||
s.content = s.text = params.text;
|
||||
s.spoilerText = params.spoilerText;
|
||||
s.visibility = params.visibility;
|
||||
s.language = params.language;
|
||||
s.sensitive = params.sensitive;
|
||||
s.mentions = List.of();
|
||||
s.tags = List.of();
|
||||
s.emojis = List.of();
|
||||
|
||||
@@ -9,7 +9,9 @@ import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.text.SpannableStringBuilder;
|
||||
import android.text.TextUtils;
|
||||
import android.text.style.ImageSpan;
|
||||
import android.util.Log;
|
||||
import android.util.TypedValue;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.SubMenu;
|
||||
@@ -135,7 +137,7 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
|
||||
|
||||
public static class Holder extends StatusDisplayItem.Holder<HeaderStatusDisplayItem> implements ImageLoaderViewHolder{
|
||||
private final TextView name, username, timestamp, extraText, separator;
|
||||
private final ImageView avatar, more, visibility, deleteNotification, unreadIndicator;
|
||||
private final ImageView avatar, more, visibility, deleteNotification, unreadIndicator, botIcon;
|
||||
private final PopupMenu optionsMenu;
|
||||
private Relationship relationship;
|
||||
private APIRequest<?> currentRelationshipRequest;
|
||||
@@ -158,6 +160,7 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
|
||||
visibility=findViewById(R.id.visibility);
|
||||
deleteNotification=findViewById(R.id.delete_notification);
|
||||
unreadIndicator=findViewById(R.id.unread_indicator);
|
||||
botIcon=findViewById(R.id.bot_icon);
|
||||
extraText=findViewById(R.id.extra_text);
|
||||
avatar.setOnClickListener(this::onAvaClick);
|
||||
avatar.setOutlineProvider(roundCornersOutline);
|
||||
@@ -282,10 +285,23 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
|
||||
public void onBind(HeaderStatusDisplayItem item){
|
||||
name.setText(item.parsedName);
|
||||
username.setText('@'+item.user.acct);
|
||||
botIcon.setVisibility(item.user.bot ? View.VISIBLE : View.GONE);
|
||||
botIcon.setColorFilter(username.getCurrentTextColor());
|
||||
separator.setVisibility(View.VISIBLE);
|
||||
|
||||
// if(item.user.bot){
|
||||
// SpannableStringBuilder ssb = new SpannableStringBuilder();
|
||||
// ssb.append('@'+item.user.acct);
|
||||
// ssb.append(" ");
|
||||
// Drawable botIcon=username.getResources().getDrawable(R.drawable.ic_bot, itemView.getContext().getTheme()).mutate();
|
||||
// botIcon.setBounds(0, 0, botIcon.getIntrinsicWidth(), botIcon.getIntrinsicHeight());
|
||||
// botIcon.setTint(username.getCurrentTextColor());
|
||||
// ssb.append(itemView.getContext().getString(R.string.manually_approves_followers), new ImageSpan(botIcon, ImageSpan.ALIGN_BASELINE), 0);
|
||||
// username.setPaddingRelative(0,0,16,0);
|
||||
// username.setText(ssb);
|
||||
// }
|
||||
|
||||
username.setCompoundDrawablesWithIntrinsicBounds(item.user.bot ? R.drawable.ic_fluent_bot_24_filled : 0, 0, 0, 0);
|
||||
// username.setCompoundDrawablesWithIntrinsicBounds(item.user.bot ? R.drawable.ic_fluent_bot_24_filled : 0, 0, 0, 0);
|
||||
|
||||
if (item.scheduledStatus!=null)
|
||||
if (item.scheduledStatus.scheduledAt.isAfter(CreateStatus.DRAFTS_AFTER_INSTANT)) {
|
||||
@@ -338,7 +354,9 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
|
||||
desc = item.parentFragment.getString(R.string.sk_mark_as_read);
|
||||
more.animate().alpha(alpha);
|
||||
unreadIndicator.animate().alpha(alpha);
|
||||
more.setEnabled(!item.announcement.read);
|
||||
more.setOnClickListener(v -> {
|
||||
if (item.announcement.read) return;
|
||||
new DismissAnnouncement(item.announcement.id).setCallback(new Callback<>() {
|
||||
@Override
|
||||
public void onSuccess(Object o) {
|
||||
|
||||
@@ -73,7 +73,12 @@ public class LinkCardStatusDisplayItem extends StatusDisplayItem{
|
||||
|
||||
photo.setImageDrawable(null);
|
||||
if(item.imgRequest!=null){
|
||||
crossfadeDrawable.setSize(card.width, card.height);
|
||||
if (card.width > 0) {
|
||||
// akkoma servers don't provide width and height
|
||||
crossfadeDrawable.setSize(card.width, card.height);
|
||||
} else {
|
||||
crossfadeDrawable.setSize(itemView.getWidth(), itemView.getHeight());
|
||||
}
|
||||
crossfadeDrawable.setBlurhashDrawable(card.blurhashPlaceholder);
|
||||
crossfadeDrawable.setCrossfadeAlpha(item.status.spoilerRevealed ? 0f : 1f);
|
||||
photo.setImageDrawable(crossfadeDrawable);
|
||||
|
||||
@@ -77,6 +77,10 @@ public abstract class StatusDisplayItem{
|
||||
}
|
||||
|
||||
public static ArrayList<StatusDisplayItem> buildItems(BaseStatusListFragment fragment, Status status, String accountID, DisplayItemsParent parentObject, Map<String, Account> knownAccounts, boolean inset, boolean addFooter, Notification notification){
|
||||
return buildItems(fragment, status, accountID, parentObject, knownAccounts, inset, addFooter, notification, false);
|
||||
}
|
||||
|
||||
public static ArrayList<StatusDisplayItem> buildItems(BaseStatusListFragment fragment, Status status, String accountID, DisplayItemsParent parentObject, Map<String, Account> knownAccounts, boolean inset, boolean addFooter, Notification notification, boolean disableTranslate){
|
||||
String parentID=parentObject.getID();
|
||||
ArrayList<StatusDisplayItem> items=new ArrayList<>();
|
||||
Status statusForContent=status.getContentStatus();
|
||||
@@ -100,7 +104,7 @@ public abstract class StatusDisplayItem{
|
||||
HeaderStatusDisplayItem header;
|
||||
items.add(header=new HeaderStatusDisplayItem(parentID, statusForContent.account, statusForContent.createdAt, fragment, accountID, statusForContent, null, notification, scheduledStatus));
|
||||
if(!TextUtils.isEmpty(statusForContent.content))
|
||||
items.add(new TextStatusDisplayItem(parentID, HtmlParser.parse(statusForContent.content, statusForContent.emojis, statusForContent.mentions, statusForContent.tags, accountID), fragment, statusForContent));
|
||||
items.add(new TextStatusDisplayItem(parentID, HtmlParser.parse(statusForContent.content, statusForContent.emojis, statusForContent.mentions, statusForContent.tags, accountID), fragment, statusForContent, disableTranslate));
|
||||
else
|
||||
header.needBottomPadding=true;
|
||||
List<Attachment> imageAttachments=statusForContent.mediaAttachments.stream().filter(att->att.type.isImage()).collect(Collectors.toList());
|
||||
|
||||
@@ -40,14 +40,16 @@ public class TextStatusDisplayItem extends StatusDisplayItem{
|
||||
private CharSequence parsedSpoilerText;
|
||||
public boolean textSelectable;
|
||||
public final Status status;
|
||||
public boolean disableTranslate;
|
||||
public boolean translated = false;
|
||||
public TranslatedStatus translation = null;
|
||||
private AccountSession session;
|
||||
|
||||
public TextStatusDisplayItem(String parentID, CharSequence text, BaseStatusListFragment parentFragment, Status status){
|
||||
public TextStatusDisplayItem(String parentID, CharSequence text, BaseStatusListFragment parentFragment, Status status, boolean disableTranslate){
|
||||
super(parentID, parentFragment);
|
||||
this.text=text;
|
||||
this.status=status;
|
||||
this.disableTranslate=disableTranslate;
|
||||
emojiHelper.setText(text);
|
||||
if(!TextUtils.isEmpty(status.spoilerText)){
|
||||
parsedSpoilerText=HtmlParser.parseCustomEmoji(status.spoilerText, status.emojis);
|
||||
@@ -143,7 +145,8 @@ public class TextStatusDisplayItem extends StatusDisplayItem{
|
||||
}
|
||||
|
||||
Instance instanceInfo = AccountSessionManager.getInstance().getInstanceInfo(item.session.domain);
|
||||
boolean translateEnabled = instanceInfo.v2 != null && instanceInfo.v2.configuration.translation != null && instanceInfo.v2.configuration.translation.enabled;
|
||||
boolean translateEnabled = !item.disableTranslate && instanceInfo.v2 != null &&
|
||||
instanceInfo.v2.configuration.translation != null && instanceInfo.v2.configuration.translation.enabled;
|
||||
|
||||
translateWrap.setVisibility(translateEnabled &&
|
||||
!item.status.visibility.isLessVisibleThan(StatusPrivacy.UNLISTED) &&
|
||||
|
||||
@@ -31,6 +31,7 @@ import android.provider.OpenableColumns;
|
||||
import android.text.SpannableStringBuilder;
|
||||
import android.text.Spanned;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.HapticFeedbackConstants;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
@@ -52,6 +53,7 @@ import org.joinmastodon.android.api.requests.accounts.SetAccountMuted;
|
||||
import org.joinmastodon.android.api.requests.accounts.SetDomainBlocked;
|
||||
import org.joinmastodon.android.api.requests.accounts.AuthorizeFollowRequest;
|
||||
import org.joinmastodon.android.api.requests.accounts.RejectFollowRequest;
|
||||
import org.joinmastodon.android.api.requests.lists.DeleteList;
|
||||
import org.joinmastodon.android.api.requests.notifications.DismissNotification;
|
||||
import org.joinmastodon.android.api.requests.search.GetSearchResults;
|
||||
import org.joinmastodon.android.api.requests.statuses.CreateStatus;
|
||||
@@ -86,6 +88,7 @@ import org.joinmastodon.android.ui.text.CustomEmojiSpan;
|
||||
import org.parceler.Parcels;
|
||||
|
||||
import java.io.File;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
@@ -110,6 +113,8 @@ import androidx.annotation.StringRes;
|
||||
import androidx.browser.customtabs.CustomTabsIntent;
|
||||
import androidx.recyclerview.widget.DiffUtil;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import androidx.viewpager2.widget.ViewPager2;
|
||||
|
||||
import me.grishka.appkit.Nav;
|
||||
import me.grishka.appkit.api.Callback;
|
||||
import me.grishka.appkit.api.ErrorResponse;
|
||||
@@ -339,14 +344,6 @@ public class UiUtils{
|
||||
Nav.go((Activity)context, HashtagTimelineFragment.class, args);
|
||||
}
|
||||
|
||||
public static void openListTimeline(Context context, String accountID, ListTimeline list){
|
||||
Bundle args=new Bundle();
|
||||
args.putString("account", accountID);
|
||||
args.putString("listID", list.id);
|
||||
args.putString("listTitle", list.title);
|
||||
Nav.go((Activity)context, ListTimelineFragment.class, args);
|
||||
}
|
||||
|
||||
public static void showConfirmationAlert(Context context, @StringRes int title, @StringRes int message, @StringRes int confirmButton, Runnable onConfirmed){
|
||||
showConfirmationAlert(context, title, message, confirmButton, 0, onConfirmed);
|
||||
}
|
||||
@@ -369,7 +366,7 @@ public class UiUtils{
|
||||
showConfirmationAlert(activity, activity.getString(currentlyBlocked ? R.string.confirm_unblock_title : R.string.confirm_block_title),
|
||||
activity.getString(currentlyBlocked ? R.string.confirm_unblock : R.string.confirm_block, account.displayName),
|
||||
activity.getString(currentlyBlocked ? R.string.do_unblock : R.string.do_block),
|
||||
currentlyBlocked ? R.drawable.ic_fluent_person_28_regular : R.drawable.ic_fluent_person_prohibited_28_regular,
|
||||
R.drawable.ic_fluent_person_prohibited_28_regular,
|
||||
()->{
|
||||
new SetAccountBlocked(account.id, !currentlyBlocked)
|
||||
.setCallback(new Callback<>(){
|
||||
@@ -391,6 +388,38 @@ public class UiUtils{
|
||||
});
|
||||
}
|
||||
|
||||
public static void confirmSoftBlockUser(Activity activity, String accountID, Account account, Consumer<Relationship> resultCallback){
|
||||
showConfirmationAlert(activity,
|
||||
activity.getString(R.string.sk_remove_follower),
|
||||
activity.getString(R.string.sk_remove_follower_confirm, account.displayName),
|
||||
activity.getString(R.string.sk_do_remove_follower),
|
||||
R.drawable.ic_fluent_person_delete_24_regular,
|
||||
() -> new SetAccountBlocked(account.id, true).setCallback(new Callback<>() {
|
||||
@Override
|
||||
public void onSuccess(Relationship relationship) {
|
||||
new SetAccountBlocked(account.id, false).setCallback(new Callback<>() {
|
||||
@Override
|
||||
public void onSuccess(Relationship relationship) {
|
||||
Toast.makeText(activity, R.string.sk_remove_follower_success, Toast.LENGTH_SHORT).show();
|
||||
resultCallback.accept(relationship);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(ErrorResponse error) {
|
||||
error.showToast(activity);
|
||||
resultCallback.accept(relationship);
|
||||
}
|
||||
}).exec(accountID);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(ErrorResponse error) {
|
||||
error.showToast(activity);
|
||||
}
|
||||
}).exec(accountID)
|
||||
);
|
||||
}
|
||||
|
||||
public static void confirmToggleBlockDomain(Activity activity, String accountID, String domain, boolean currentlyBlocked, Runnable resultCallback){
|
||||
showConfirmationAlert(activity, activity.getString(currentlyBlocked ? R.string.confirm_unblock_domain_title : R.string.confirm_block_domain_title),
|
||||
activity.getString(currentlyBlocked ? R.string.confirm_unblock : R.string.confirm_block, domain),
|
||||
@@ -541,6 +570,27 @@ public class UiUtils{
|
||||
);
|
||||
}
|
||||
|
||||
public static void confirmDeleteList(Activity activity, String accountID, String listID, String listTitle, Runnable callback) {
|
||||
showConfirmationAlert(activity,
|
||||
activity.getString(R.string.sk_delete_list),
|
||||
activity.getString(R.string.sk_delete_list_confirm, listTitle),
|
||||
activity.getString(R.string.delete),
|
||||
R.drawable.ic_fluent_delete_28_regular,
|
||||
() -> new DeleteList(listID).setCallback(new Callback<>() {
|
||||
@Override
|
||||
public void onSuccess(Object o) {
|
||||
callback.run();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(ErrorResponse error) {
|
||||
error.showToast(activity);
|
||||
}
|
||||
})
|
||||
.wrapProgress(activity, R.string.deleting, false)
|
||||
.exec(accountID));
|
||||
}
|
||||
|
||||
public static void setRelationshipToActionButton(Relationship relationship, Button button){
|
||||
setRelationshipToActionButton(relationship, button, false);
|
||||
}
|
||||
@@ -1013,4 +1063,19 @@ public class UiUtils{
|
||||
case DIRECT -> R.string.visibility_private;
|
||||
});
|
||||
}
|
||||
|
||||
// https://github.com/tuskyapp/Tusky/pull/3148
|
||||
public static void reduceSwipeSensitivity(ViewPager2 pager) {
|
||||
try {
|
||||
Field recyclerViewField = ViewPager2.class.getDeclaredField("mRecyclerView");
|
||||
recyclerViewField.setAccessible(true);
|
||||
RecyclerView recyclerView = (RecyclerView) recyclerViewField.get(pager);
|
||||
Field touchSlopField = RecyclerView.class.getDeclaredField("mTouchSlop");
|
||||
touchSlopField.setAccessible(true);
|
||||
int touchSlop = touchSlopField.getInt(recyclerView);
|
||||
touchSlopField.set(recyclerView, touchSlop * 3);
|
||||
} catch (Exception ex) {
|
||||
Log.e("reduceSwipeSensitivity", Log.getStackTraceString(ex));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,84 @@
|
||||
package org.joinmastodon.android.ui.views;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.Gravity;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.widget.Button;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.PopupMenu;
|
||||
|
||||
import org.joinmastodon.android.R;
|
||||
import org.joinmastodon.android.model.ListTimeline;
|
||||
|
||||
public class ListTimelineEditor extends LinearLayout {
|
||||
private ListTimeline.RepliesPolicy policy = null;
|
||||
private final TextInputFrameLayout input;
|
||||
private final Button button;
|
||||
|
||||
@SuppressLint("ClickableViewAccessibility")
|
||||
public ListTimelineEditor(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
|
||||
super(context, attrs, defStyleAttr, defStyleRes);
|
||||
LayoutInflater.from(context).inflate(R.layout.list_timeline_editor, this);
|
||||
|
||||
button = findViewById(R.id.button);
|
||||
input = findViewById(R.id.input);
|
||||
|
||||
PopupMenu popupMenu = new PopupMenu(context, button, Gravity.CENTER_HORIZONTAL);
|
||||
popupMenu.inflate(R.menu.list_reply_policies);
|
||||
popupMenu.setOnMenuItemClickListener(this::onMenuItemClick);
|
||||
|
||||
button.setOnTouchListener(popupMenu.getDragToOpenListener());
|
||||
button.setOnClickListener(v->popupMenu.show());
|
||||
input.getEditText().setHint(context.getString(R.string.sk_list_name_hint));
|
||||
|
||||
setRepliesPolicy(ListTimeline.RepliesPolicy.LIST);
|
||||
}
|
||||
|
||||
public void applyList(String title, ListTimeline.RepliesPolicy policy) {
|
||||
input.getEditText().setText(title);
|
||||
setRepliesPolicy(policy);
|
||||
}
|
||||
|
||||
public String getTitle() {
|
||||
return input.getEditText().getText().toString();
|
||||
}
|
||||
|
||||
public ListTimeline.RepliesPolicy getRepliesPolicy() {
|
||||
return policy;
|
||||
}
|
||||
|
||||
public void setRepliesPolicy(ListTimeline.RepliesPolicy policy) {
|
||||
this.policy = policy;
|
||||
switch (policy) {
|
||||
case FOLLOWED -> button.setText(R.string.sk_list_replies_policy_followed);
|
||||
case LIST -> button.setText(R.string.sk_list_replies_policy_list);
|
||||
case NONE -> button.setText(R.string.sk_list_replies_policy_none);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean onMenuItemClick(MenuItem i) {
|
||||
if (i.getItemId() == R.id.reply_policy_none) {
|
||||
setRepliesPolicy(ListTimeline.RepliesPolicy.NONE);
|
||||
} else if (i.getItemId() == R.id.reply_policy_followed) {
|
||||
setRepliesPolicy(ListTimeline.RepliesPolicy.FOLLOWED);
|
||||
} else if (i.getItemId() == R.id.reply_policy_list) {
|
||||
setRepliesPolicy(ListTimeline.RepliesPolicy.LIST);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public ListTimelineEditor(Context context, AttributeSet attrs, int defStyleAttr) {
|
||||
this(context, attrs, defStyleAttr, 0);
|
||||
}
|
||||
|
||||
public ListTimelineEditor(Context context, AttributeSet attrs) {
|
||||
this(context, attrs, 0);
|
||||
}
|
||||
|
||||
public ListTimelineEditor(Context context) {
|
||||
this(context, null);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package org.joinmastodon.android.ui.views;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.EditText;
|
||||
import android.widget.FrameLayout;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import me.grishka.appkit.utils.V;
|
||||
|
||||
public class TextInputFrameLayout extends FrameLayout {
|
||||
private final EditText editText;
|
||||
|
||||
public TextInputFrameLayout(@NonNull Context context, CharSequence hint, CharSequence text) {
|
||||
this(context, null, 0, 0, hint, text);
|
||||
}
|
||||
|
||||
public TextInputFrameLayout(@NonNull Context context) {
|
||||
this(context, null);
|
||||
}
|
||||
|
||||
public TextInputFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
|
||||
this(context, attrs, 0);
|
||||
}
|
||||
|
||||
public TextInputFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
|
||||
this(context, attrs, defStyleAttr, 0);
|
||||
}
|
||||
|
||||
public TextInputFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
|
||||
this(context, attrs, defStyleAttr, defStyleRes, null, null);
|
||||
}
|
||||
|
||||
public TextInputFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes, CharSequence hint, CharSequence text) {
|
||||
super(context, attrs, defStyleAttr, defStyleRes);
|
||||
editText = new EditText(context);
|
||||
editText.setHint(hint);
|
||||
editText.setText(text);
|
||||
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
|
||||
params.setMargins(V.dp(24), V.dp(4), V.dp(24), V.dp(16));
|
||||
editText.setLayoutParams(params);
|
||||
addView(editText);
|
||||
}
|
||||
|
||||
public EditText getEditText() {
|
||||
return editText;
|
||||
}
|
||||
}
|
||||
@@ -2,9 +2,9 @@
|
||||
<ripple xmlns:android="http://schemas.android.com/apk/res/android" android:color="@color/highlight_over_dark">
|
||||
<item>
|
||||
<shape>
|
||||
<solid android:color="?android:colorAccent"/>
|
||||
<corners android:radius="16dp"/>
|
||||
<padding android:left="16dp" android:right="16dp"/>
|
||||
<solid android:color="?colorPrimary800"/>
|
||||
<corners android:radius="16sp"/>
|
||||
<padding android:left="16sp" android:right="16sp"/>
|
||||
</shape>
|
||||
</item>
|
||||
</ripple>
|
||||
5
mastodon/src/main/res/drawable/bg_note_edit.xml
Normal file
5
mastodon/src/main/res/drawable/bg_note_edit.xml
Normal file
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<solid android:color="?colorBackgroundLightest"/>
|
||||
<corners android:radius="10dp"/>
|
||||
</shape>
|
||||
6
mastodon/src/main/res/drawable/ic_bot.xml
Normal file
6
mastodon/src/main/res/drawable/ic_bot.xml
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="16dp" android:height="16dp" android:viewportWidth="16" android:viewportHeight="16">
|
||||
<group android:translateX="-2" android:translateY="-1">
|
||||
<path android:pathData="M14.69 11.503c1 0 1.81 0.81 1.81 1.81v0.689h-0.005c-0.034 0.78-0.248 1.757-1.123 2.555C14.416 17.43 12.765 18 10 18c-2.766 0-4.416-0.57-5.372-1.443-0.875-0.798-1.089-1.776-1.123-2.555H3.5v-0.69c0-0.999 0.81-1.809 1.81-1.809h9.38zM6.5 3C5.672 3 5 3.672 5 4.5v4C5 9.328 5.672 10 6.5 10h7c0.828 0 1.5-0.672 1.5-1.5v-4C15 3.672 14.328 3 13.5 3h-3V2.5C10.5 2.191 10.276 2 10 2S9.5 2.23 9.5 2.5V3h-3zM7 6.5c0-0.552 0.448-1 1-1s1 0.448 1 1-0.448 1-1 1-1-0.448-1-1zm4 0c0-0.552 0.448-1 1-1s1 0.448 1 1-0.448 1-1 1-1-0.448-1-1z" android:fillColor="@color/fluent_default_icon_tint"/>
|
||||
</group>
|
||||
</vector>
|
||||
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="16dp"
|
||||
android:height="16dp"
|
||||
android:viewportWidth="16"
|
||||
android:viewportHeight="16">
|
||||
<path
|
||||
android:pathData="M11.754,9.203C12.551,9.203 13.199,9.852 13.199,10.648L13.199,11.203L13.195,11.203C13.168,11.824 12.996,12.605 12.297,13.246C11.531,13.945 10.211,14.398 8,14.398C5.789,14.398 4.469,13.945 3.703,13.246C3.004,12.605 2.832,11.824 2.805,11.203L2.801,11.203L2.801,10.648C2.801,9.852 3.449,9.203 4.246,9.203ZM5.199,2.398C4.539,2.398 4,2.938 4,3.602L4,6.801C4,7.461 4.539,8 5.199,8L10.801,8C11.461,8 12,7.461 12,6.801L12,3.602C12,2.938 11.461,2.398 10.801,2.398L8.398,2.398C8.398,2.398 8.398,2.246 8.398,2C8.398,1.754 8.223,1.602 8,1.602C7.777,1.602 7.602,1.785 7.602,2C7.602,2.215 7.602,2.398 7.602,2.398ZM5.602,5.199C5.602,4.758 5.957,4.398 6.398,4.398C6.844,4.398 7.199,4.758 7.199,5.199C7.199,5.641 6.844,6 6.398,6C5.957,6 5.602,5.641 5.602,5.199ZM8.801,5.199C8.801,4.758 9.156,4.398 9.602,4.398C10.043,4.398 10.398,4.758 10.398,5.199C10.398,5.641 10.043,6 9.602,6C9.156,6 8.801,5.641 8.801,5.199ZM8.801,5.199"
|
||||
android:fillColor="?android:textColorPrimary" />
|
||||
</vector>
|
||||
@@ -0,0 +1,3 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:pathData="M17.75 3c1.733 0 3.15 1.356 3.245 3.066L21 6.25v5.772c-0.463-0.297-0.966-0.536-1.5-0.709V6.25c0-0.918-0.707-1.671-1.606-1.744L17.75 4.5H6.25c-0.6 0-1.13 0.302-1.445 0.763C4.491 5.095 4.132 5 3.75 5 3.57 5 3.393 5.021 3.224 5.062 3.677 3.909 4.77 3.078 6.066 3.005L6.25 3h11.5zm-6.437 16.5c0.173 0.534 0.412 1.037 0.709 1.5H6.25c-1.733 0-3.15-1.357-3.245-3.066L3 17.75V9.372C3.235 9.455 3.487 9.5 3.75 9.5S4.266 9.455 4.5 9.372v8.378c0 0.918 0.707 1.671 1.607 1.744L6.25 19.5h5.063zm0.418-4.997c0.286-0.55 0.65-1.056 1.076-1.5h-4.06l-0.1 0.007c-0.367 0.05-0.65 0.363-0.65 0.743 0 0.414 0.337 0.75 0.75 0.75h2.984zm3.521-5.007c0.415 0 0.75 0.336 0.75 0.75 0 0.38-0.282 0.694-0.648 0.743l-0.102 0.007H8.748c-0.414 0-0.75-0.336-0.75-0.75 0-0.38 0.282-0.693 0.648-0.743l0.102-0.007h6.504zM3.75 6C4.44 6 5 6.56 5 7.25S4.44 8.5 3.75 8.5 2.5 7.94 2.5 7.25 3.06 6 3.75 6zM23 17.5c0-3.038-2.462-5.5-5.5-5.5S12 14.462 12 17.5s2.462 5.5 5.5 5.5 5.5-2.462 5.5-5.5zM18 18l0.001 2.503c0 0.277-0.224 0.5-0.5 0.5s-0.5-0.223-0.5-0.5V18h-2.505c-0.276 0-0.5-0.224-0.5-0.5s0.224-0.5 0.5-0.5H17v-2.5c0-0.277 0.224-0.5 0.5-0.5s0.5 0.223 0.5 0.5V17h2.497c0.276 0 0.5 0.224 0.5 0.5s-0.224 0.5-0.5 0.5H18z" android:fillColor="@color/fluent_default_icon_tint"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,3 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="16dp" android:height="16dp" android:viewportWidth="16" android:viewportHeight="16">
|
||||
<path android:pathData="M3.2 5.74C3.482 5.436 3.957 5.419 4.26 5.7L8 9.226 11.74 5.7c0.303-0.281 0.778-0.264 1.06 0.04 0.281 0.303 0.264 0.778-0.04 1.06l-4.25 4c-0.287 0.267-0.733 0.267-1.02 0l-4.25-4C2.936 6.518 2.919 6.043 3.2 5.74z" android:fillColor="@color/fluent_default_icon_tint"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,3 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:pathData="M6.25 3C5.007 3 4 4.007 4 5.25v2.5C4 8.993 5.007 10 6.25 10h9.5C16.993 10 18 8.993 18 7.75v-2.5C18 4.007 16.993 3 15.75 3h-9.5zM5.5 5.25c0-0.414 0.336-0.75 0.75-0.75h9.5c0.414 0 0.75 0.336 0.75 0.75v2.5c0 0.414-0.336 0.75-0.75 0.75h-9.5C5.836 8.5 5.5 8.164 5.5 7.75v-2.5zM8.7 16C8.313 16 8 16.336 8 16.75s0.313 0.75 0.7 0.75h4.6c0.387 0 0.7-0.336 0.7-0.75S13.687 16 13.3 16H8.7zm8.653 0.445L17.28 16.53c-0.266 0.267-0.683 0.29-0.976 0.073L16.22 16.53l-2-2c-0.267-0.266-0.29-0.682-0.073-0.976l0.073-0.084 2-2c0.293-0.293 0.767-0.293 1.06 0 0.267 0.266 0.29 0.683 0.073 0.976L17.28 12.53l-0.719 0.721h1.5c0.647 0 1.18-0.492 1.243-1.122L19.311 12V9.75c0-0.415 0.335-0.75 0.75-0.75 0.38 0 0.693 0.282 0.743 0.648L20.81 9.75V12c0 1.462-1.142 2.658-2.583 2.745L18.06 14.75h-1.499l0.718 0.719c0.267 0.266 0.29 0.683 0.073 0.976zM18 19.25v-2.026l-0.013 0.012c-0.405 0.406-0.96 0.57-1.487 0.495v1.519c0 0.414-0.336 0.75-0.75 0.75h-9.5c-0.414 0-0.75-0.336-0.75-0.75v-5c0-0.414 0.336-0.75 0.75-0.75h6.822c0.058-0.192 0.148-0.376 0.272-0.543l0.022-0.03 0.12-0.14L14.275 12H6.25C5.007 12 4 13.007 4 14.25v5c0 1.243 1.007 2.25 2.25 2.25h9.5c1.243 0 2.25-1.007 2.25-2.25z" android:fillColor="@color/fluent_default_icon_tint"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,3 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:pathData="M10.946 2.047l0.005 0.007C11.296 2.02 11.646 2 12 2c5.522 0 10 4.477 10 10s-4.478 10-10 10c-3.21 0-6.066-1.512-7.896-3.862H4.102v-0.003C2.786 16.441 2 14.312 2 12c0-5.162 3.911-9.41 8.932-9.944l0.014-0.009zM12 3.5c-0.053 0-0.106 0-0.16 0.002 0.123 0.244 0.255 0.532 0.374 0.85 0.347 0.921 0.666 2.28 0.1 3.486-0.522 1.113-1.424 1.4-2.09 1.573L10.14 9.432c-0.657 0.17-0.91 0.235-1.093 0.514-0.17 0.257-0.144 0.582 0.061 1.25l0.046 0.148c0.082 0.258 0.18 0.57 0.23 0.863 0.064 0.364 0.082 0.827-0.152 1.275-0.231 0.444-0.538 0.747-0.9 0.945-0.341 0.185-0.694 0.256-0.958 0.302l-0.093 0.017c-0.515 0.09-0.761 0.134-1 0.39-0.187 0.2-0.307 0.553-0.377 1.079-0.029 0.214-0.046 0.427-0.064 0.646l-0.01 0.117c-0.02 0.242-0.044 0.521-0.099 0.76v0.002c1.554 1.696 3.787 2.76 6.27 2.76 1.576 0 3.053-0.43 4.319-1.178-0.099-0.1-0.205-0.218-0.31-0.35-0.34-0.428-0.786-1.164-0.631-2.033 0.074-0.418 0.298-0.768 0.515-1.036 0.22-0.274 0.486-0.526 0.72-0.74l0.158-0.146c0.179-0.163 0.33-0.301 0.46-0.437 0.172-0.18 0.21-0.262 0.212-0.267 0.068-0.224-0.015-0.384-0.106-0.454-0.046-0.035-0.107-0.06-0.19-0.061-0.084 0-0.22 0.024-0.401 0.14-0.21 0.132-0.515 0.214-0.836 0.085-0.267-0.108-0.415-0.314-0.486-0.432-0.144-0.237-0.225-0.546-0.278-0.772-0.04-0.174-0.08-0.372-0.115-0.553l-0.04-0.206c-0.05-0.25-0.094-0.428-0.134-0.54l-0.02-0.037c-0.014-0.027-0.035-0.062-0.064-0.105-0.058-0.089-0.133-0.192-0.227-0.317l-0.11-0.143c-0.16-0.212-0.353-0.463-0.516-0.712-0.196-0.298-0.417-0.688-0.487-1.104-0.037-0.22-0.036-0.475 0.055-0.734 0.094-0.264 0.265-0.482 0.487-0.649 0.483-0.362 1.193-1.172 1.823-1.959 0.288-0.359 0.544-0.695 0.736-0.95C15.222 3.98 13.667 3.5 12 3.5z" android:fillColor="@color/fluent_default_icon_tint"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,3 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:pathData="M10.55 2.534c0.837-0.707 2.063-0.707 2.9 0L20.2 8.23C20.708 8.657 21 9.286 21 9.95v9.802c0 0.967-0.784 1.75-1.75 1.75h-3c-0.966 0-1.75-0.783-1.75-1.75v-5c0-0.414-0.336-0.75-0.75-0.75h-3.5c-0.414 0-0.75 0.336-0.75 0.75v5c0 0.967-0.784 1.75-1.75 1.75h-3c-0.966 0-1.75-0.783-1.75-1.75V9.948c0-0.663 0.292-1.292 0.8-1.72l6.75-5.694z" android:fillColor="@color/fluent_default_icon_tint"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,3 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:pathData="M10.55 2.532c0.837-0.707 2.063-0.707 2.9 0l6.75 5.692c0.507 0.428 0.8 1.057 0.8 1.72v9.803c0 0.966-0.784 1.75-1.75 1.75h-3.5c-0.966 0-1.75-0.784-1.75-1.75v-5.5c0-0.138-0.112-0.25-0.25-0.25h-3.5c-0.138 0-0.25 0.112-0.25 0.25v5.5c0 0.966-0.784 1.75-1.75 1.75h-3.5c-0.966 0-1.75-0.784-1.75-1.75V9.944c0-0.663 0.293-1.293 0.8-1.72l6.75-5.692zm1.933 1.147c-0.279-0.236-0.687-0.236-0.966 0L4.767 9.37C4.596 9.513 4.5 9.723 4.5 9.944v9.803c0 0.138 0.112 0.25 0.25 0.25h3.5c0.138 0 0.25-0.112 0.25-0.25v-5.5c0-0.967 0.784-1.75 1.75-1.75h3.5c0.966 0 1.75 0.783 1.75 1.75v5.5c0 0.138 0.112 0.25 0.25 0.25h3.5c0.138 0 0.25-0.112 0.25-0.25V9.944c0-0.221-0.098-0.43-0.267-0.573l-6.75-5.692z" android:fillColor="@color/fluent_default_icon_tint"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,3 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:pathData="M12 1.999c5.524 0 10.002 4.478 10.002 10.002 0 5.523-4.478 10.001-10.002 10.001-5.524 0-10.002-4.478-10.002-10.001C1.998 6.477 6.476 1.999 12 1.999zm0 1.5c-4.695 0-8.502 3.806-8.502 8.502 0 4.695 3.807 8.501 8.502 8.501s8.502-3.806 8.502-8.501c0-4.696-3.807-8.502-8.502-8.502zm-0.004 7c0.38 0 0.694 0.282 0.744 0.648l0.007 0.102 0.004 5.502c0 0.414-0.336 0.75-0.75 0.75-0.38 0-0.694-0.282-0.744-0.648l-0.006-0.101-0.004-5.502c0-0.414 0.335-0.75 0.75-0.75zm0.005-3.497c0.551 0 0.998 0.447 0.998 0.999 0 0.551-0.447 0.998-0.998 0.998-0.552 0-1-0.447-1-0.998 0-0.552 0.448-1 1-1z" android:fillColor="@color/fluent_default_icon_tint"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="20dp"
|
||||
android:height="20dp"
|
||||
android:viewportWidth="20"
|
||||
android:viewportHeight="20">
|
||||
<path
|
||||
android:pathData="M7.5,7C7.224,7 7,7.224 7,7.5C7,7.776 7.224,8 7.5,8H12.5C12.776,8 13,7.776 13,7.5C13,7.224 12.776,7 12.5,7H7.5ZM7,10.5C7,10.224 7.224,10 7.5,10H12.5C12.776,10 13,10.224 13,10.5C13,10.776 12.776,11 12.5,11H7.5C7.224,11 7,10.776 7,10.5ZM7.5,13C7.224,13 7,13.224 7,13.5C7,13.776 7.224,14 7.5,14H9.5C9.776,14 10,13.776 10,13.5C10,13.224 9.776,13 9.5,13H7.5ZM6.5,2C6.224,2 6,2.224 6,2.5V3H5.5C4.672,3 4,3.672 4,4.5V16.5C4,17.328 4.672,18 5.5,18H11.5C11.633,18 11.76,17.947 11.854,17.854L15.854,13.854C15.947,13.76 16,13.633 16,13.5V4.5C16,3.672 15.328,3 14.5,3H14V2.5C14,2.224 13.776,2 13.5,2C13.224,2 13,2.224 13,2.5V3H10.5V2.5C10.5,2.224 10.276,2 10,2C9.724,2 9.5,2.224 9.5,2.5V3H7V2.5C7,2.224 6.776,2 6.5,2ZM14.5,4C14.776,4 15,4.224 15,4.5V13H12.5C11.672,13 11,13.672 11,14.5V17H5.5C5.224,17 5,16.776 5,16.5V4.5C5,4.224 5.224,4 5.5,4H14.5ZM14.293,14L12,16.293V14.5C12,14.224 12.224,14 12.5,14H14.293Z"
|
||||
android:fillColor="#212121"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,3 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:pathData="M5.5 8c0-1.38 1.12-2.5 2.5-2.5s2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5S5.5 9.38 5.5 8zM8 4C5.79 4 4 5.79 4 8s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm7.5 5c0-0.828 0.672-1.5 1.5-1.5s1.5 0.672 1.5 1.5-0.672 1.5-1.5 1.5-1.5-0.672-1.5-1.5zM17 6c-1.657 0-3 1.343-3 3s1.343 3 3 3 3-1.343 3-3-1.343-3-3-3zm-2.752 13.038c0.703 0.285 1.604 0.462 2.753 0.462 2.282 0 3.586-0.697 4.297-1.558 0.345-0.418 0.52-0.84 0.61-1.163 0.044-0.16 0.067-0.299 0.08-0.402 0.006-0.052 0.009-0.095 0.01-0.128l0.003-0.043v-0.027c0-1.204-0.975-2.179-2.179-2.179H14.18c-0.028 0-0.055 0-0.082 0.002 0.394 0.41 0.68 0.925 0.816 1.498h4.908c0.372 0 0.674 0.299 0.679 0.669L20.498 16.2c-0.005 0.038-0.015 0.1-0.037 0.18-0.043 0.16-0.133 0.38-0.32 0.605C19.792 17.412 18.97 18 17.002 18c-0.98 0-1.676-0.146-2.17-0.345-0.108 0.4-0.286 0.883-0.583 1.383zM4.25 14C3.007 14 2 15.007 2 16.25v0.278l0.002 0.05c0.002 0.039 0.006 0.093 0.012 0.158 0.013 0.13 0.038 0.309 0.088 0.52 0.098 0.422 0.295 0.984 0.69 1.55C3.61 19.974 5.172 21 8 21c2.828 0 4.39-1.025 5.208-2.195 0.396-0.565 0.592-1.127 0.69-1.549 0.05-0.211 0.075-0.39 0.088-0.52 0.007-0.066 0.01-0.12 0.012-0.159L14 16.527V16.25c0-1.243-1.007-2.25-2.25-2.25h-7.5zM3.5 16.507V16.25c0-0.414 0.336-0.75 0.75-0.75h7.5c0.414 0 0.75 0.336 0.75 0.75v0.257l-0.007 0.08c-0.007 0.074-0.023 0.188-0.055 0.329-0.066 0.281-0.198 0.656-0.459 1.029C11.486 18.65 10.422 19.5 8 19.5s-3.486-0.85-3.98-1.555c-0.26-0.373-0.392-0.748-0.458-1.03-0.032-0.14-0.048-0.254-0.055-0.328-0.004-0.038-0.006-0.065-0.006-0.08z" android:fillColor="@color/fluent_default_icon_tint"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,3 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:pathData="M5.5 7c0-1.38 1.12-2.5 2.5-2.5s2.5 1.12 2.5 2.5S9.38 9.5 8 9.5 5.5 8.38 5.5 7zM8 3C5.79 3 4 4.79 4 7s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm7.5 5c0-0.828 0.672-1.5 1.5-1.5s1.5 0.672 1.5 1.5-0.672 1.5-1.5 1.5-1.5-0.672-1.5-1.5zM17 5c-1.657 0-3 1.343-3 3s1.343 3 3 3 3-1.343 3-3-1.343-3-3-3zM4.25 13C3.007 13 2 14.007 2 15.25v0.278l0.002 0.05c0.002 0.039 0.006 0.093 0.012 0.158 0.013 0.13 0.038 0.309 0.088 0.52 0.098 0.422 0.295 0.984 0.69 1.55C3.61 18.974 5.172 20 8 20c1.369 0 2.441-0.24 3.276-0.62-0.15-0.495-0.241-1.014-0.268-1.55C10.363 18.21 9.413 18.5 8 18.5c-2.422 0-3.486-0.85-3.98-1.555-0.26-0.373-0.392-0.748-0.458-1.03-0.032-0.14-0.048-0.254-0.055-0.329C3.502 15.55 3.5 15.522 3.5 15.507V15.25c0-0.414 0.336-0.75 0.75-0.75h7.482c0.249-0.477 0.555-0.919 0.909-1.317C12.366 13.065 12.066 13 11.75 13h-7.5zM23 17.5c0-3.038-2.462-5.5-5.5-5.5S12 14.462 12 17.5s2.462 5.5 5.5 5.5 5.5-2.462 5.5-5.5zM18 18l0.001 2.503c0 0.277-0.224 0.5-0.5 0.5s-0.5-0.223-0.5-0.5V18h-2.505c-0.276 0-0.5-0.224-0.5-0.5s0.224-0.5 0.5-0.5H17v-2.5c0-0.277 0.224-0.5 0.5-0.5s0.5 0.223 0.5 0.5V17h2.497c0.276 0 0.5 0.224 0.5 0.5s-0.224 0.5-0.5 0.5H18z" android:fillColor="@color/fluent_default_icon_tint"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,3 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="28dp" android:height="28dp" android:viewportWidth="28" android:viewportHeight="28">
|
||||
<path android:pathData="M9.5 4C7.015 4 5 6.015 5 8.5S7.015 13 9.5 13 14 10.985 14 8.5 11.985 4 9.5 4zm-3 4.5c0-1.657 1.343-3 3-3s3 1.343 3 3-1.343 3-3 3-3-1.343-3-3zM20 6c-1.933 0-3.5 1.567-3.5 3.5S18.067 13 20 13s3.5-1.567 3.5-3.5S21.933 6 20 6zm-2 3.5c0-1.105 0.895-2 2-2s2 0.895 2 2-0.895 2-2 2-2-0.895-2-2zM4.25 15C3.007 15 2 16.007 2 17.25v0.531l0.003 0.057c0.002 0.046 0.006 0.109 0.014 0.185 0.017 0.153 0.049 0.363 0.11 0.612 0.125 0.497 0.373 1.156 0.867 1.815C4.008 21.803 5.942 23 9.5 23c1.531 0 2.762-0.222 3.747-0.582-0.128-0.489-0.21-0.996-0.236-1.518-0.836 0.355-1.97 0.6-3.511 0.6-3.192 0-4.633-1.053-5.306-1.95-0.35-0.466-0.524-0.932-0.61-1.279-0.044-0.173-0.065-0.314-0.075-0.408-0.005-0.046-0.007-0.08-0.008-0.1L3.5 17.745V17.25c0-0.414 0.336-0.75 0.75-0.75h9.905c0.33-0.523 0.723-1.002 1.168-1.426C15.14 15.026 14.948 15 14.75 15H4.25zM27 20.5c0 3.59-2.91 6.5-6.5 6.5S14 24.09 14 20.5s2.91-6.5 6.5-6.5 6.5 2.91 6.5 6.5zm-6-4c0-0.276-0.224-0.5-0.5-0.5S20 16.224 20 16.5V20h-3.5c-0.276 0-0.5 0.224-0.5 0.5s0.224 0.5 0.5 0.5H20v3.5c0 0.276 0.224 0.5 0.5 0.5s0.5-0.224 0.5-0.5V21h3.5c0.276 0 0.5-0.224 0.5-0.5S24.776 20 24.5 20H21v-3.5z" android:fillColor="@color/fluent_default_icon_tint"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,3 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:pathData="M14.75 15c0.966 0 1.75 0.784 1.75 1.75l-0.001 0.962c0.117 2.19-1.511 3.297-4.432 3.297-2.91 0-4.567-1.09-4.567-3.259v-1C7.5 15.784 8.284 15 9.25 15h5.5zm-11-5h4.376C8.044 10.32 8 10.655 8 11c0 1.116 0.457 2.124 1.193 2.85L9.355 14H9.25c-0.301 0-0.591 0.049-0.863 0.138-0.864 0.286-1.54 0.988-1.786 1.87L6.567 16.01C3.657 16.009 2 14.919 2 12.75v-1C2 10.784 2.784 10 3.75 10zm16.5 0c0.966 0 1.75 0.784 1.75 1.75l-0.001 0.962c0.117 2.19-1.511 3.297-4.432 3.297l-0.169-0.002c-0.238-0.854-0.88-1.54-1.705-1.841-0.235-0.086-0.486-0.14-0.746-0.16L14.75 14l-0.105 0.001C15.475 13.268 16 12.195 16 11c0-0.345-0.044-0.68-0.126-1h4.376zM12 8c1.657 0 3 1.343 3 3s-1.343 3-3 3-3-1.343-3-3 1.343-3 3-3zM6.5 3c1.657 0 3 1.343 3 3s-1.343 3-3 3-3-1.343-3-3 1.343-3 3-3zm11 0c1.657 0 3 1.343 3 3s-1.343 3-3 3-3-1.343-3-3 1.343-3 3-3z" android:fillColor="@color/fluent_default_icon_tint"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,3 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:pathData="M8 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm9 0c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zM4.25 14C3.007 14 2 15.007 2 16.25v0.25S2 21 8 21c1.855 0 3.136-0.43 4.021-1.024 0.06-0.38 0.242-0.719 0.504-0.976C12.201 18.682 12 18.24 12 17.75s0.201-0.932 0.525-1.25C12.201 16.182 12 15.74 12 15.25c0-0.438 0.161-0.84 0.428-1.146C12.214 14.036 11.986 14 11.75 14h-7.5zm9.5 0.5c-0.414 0-0.75 0.336-0.75 0.75S13.336 16 13.75 16h7.5c0.414 0 0.75-0.336 0.75-0.75s-0.336-0.75-0.75-0.75h-7.5zm0 2.5C13.336 17 13 17.336 13 17.75s0.336 0.75 0.75 0.75h7.5c0.414 0 0.75-0.336 0.75-0.75S21.664 17 21.25 17h-7.5zm0 2.5c-0.414 0-0.75 0.336-0.75 0.75S13.336 21 13.75 21h7.5c0.414 0 0.75-0.336 0.75-0.75s-0.336-0.75-0.75-0.75h-7.5z" android:fillColor="@color/fluent_default_icon_tint"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,3 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||
<path android:pathData="M5.5 8c0-1.38 1.12-2.5 2.5-2.5s2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5S5.5 9.38 5.5 8zM8 4C5.79 4 4 5.79 4 8s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm7.5 5c0-0.828 0.672-1.5 1.5-1.5s1.5 0.672 1.5 1.5-0.672 1.5-1.5 1.5-1.5-0.672-1.5-1.5zM17 6c-1.657 0-3 1.343-3 3s1.343 3 3 3 3-1.343 3-3-1.343-3-3-3zM4.25 14C3.007 14 2 15.007 2 16.25v0.278l0.002 0.05c0.002 0.039 0.006 0.093 0.012 0.158 0.013 0.13 0.038 0.309 0.088 0.52 0.098 0.422 0.295 0.984 0.69 1.55C3.61 19.974 5.172 21 8 21c1.819 0 3.113-0.424 4.024-1.037 0.061-0.375 0.242-0.709 0.501-0.963-0.29-0.284-0.48-0.667-0.518-1.095l-0.028 0.04C11.486 18.65 10.422 19.5 8 19.5s-3.486-0.85-3.98-1.555c-0.26-0.373-0.392-0.748-0.458-1.03-0.032-0.14-0.048-0.254-0.055-0.328-0.004-0.038-0.006-0.065-0.006-0.08L3.5 16.495V16.25c0-0.414 0.336-0.75 0.75-0.75h7.5c0.098 0 0.19 0.019 0.276 0.052C12.009 15.454 12 15.353 12 15.25c0-0.438 0.161-0.84 0.428-1.146C12.214 14.036 11.986 14 11.75 14h-7.5zm8.275 2.5l-0.027 0.027 0.002-0.02v-0.032l0.025 0.025zm1.225-2c-0.414 0-0.75 0.336-0.75 0.75S13.336 16 13.75 16h7.5c0.414 0 0.75-0.336 0.75-0.75s-0.336-0.75-0.75-0.75h-7.5zm0 2.5C13.336 17 13 17.336 13 17.75s0.336 0.75 0.75 0.75h7.5c0.414 0 0.75-0.336 0.75-0.75S21.664 17 21.25 17h-7.5zm0 2.5c-0.414 0-0.75 0.336-0.75 0.75S13.336 21 13.75 21h7.5c0.414 0 0.75-0.336 0.75-0.75s-0.336-0.75-0.75-0.75h-7.5z" android:fillColor="@color/fluent_default_icon_tint"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,3 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="28dp" android:height="28dp" android:viewportWidth="28" android:viewportHeight="28">
|
||||
<path android:pathData="M5 9.5C5 7.015 7.015 5 9.5 5S14 7.015 14 9.5 11.985 14 9.5 14 5 11.985 5 9.5zm4.5-3c-1.657 0-3 1.343-3 3s1.343 3 3 3 3-1.343 3-3-1.343-3-3-3zm7 4C16.5 8.567 18.067 7 20 7s3.5 1.567 3.5 3.5S21.933 14 20 14s-3.5-1.567-3.5-3.5zm3.5-2c-1.105 0-2 0.895-2 2s0.895 2 2 2 2-0.895 2-2-0.895-2-2-2zM2 18.25C2 17.007 3.007 16 4.25 16h10.5c0.236 0 0.464 0.036 0.678 0.104C15.16 16.41 15 16.812 15 17.25c0 0.103 0.009 0.204 0.026 0.302-0.085-0.033-0.178-0.052-0.276-0.052H4.25c-0.414 0-0.75 0.336-0.75 0.75v0.513l0.009 0.1c0.01 0.094 0.03 0.235 0.074 0.408 0.087 0.347 0.261 0.813 0.61 1.279 0.674 0.897 2.115 1.95 5.307 1.95s4.633-1.053 5.306-1.95c0.072-0.096 0.136-0.191 0.194-0.286 0.005 0.608 0.32 1.141 0.793 1.451-0.066 0.078-0.135 0.154-0.208 0.229-0.049 0.044-0.095 0.09-0.139 0.139C14.332 23.155 12.489 24 9.5 24c-3.558 0-5.492-1.197-6.506-2.55-0.495-0.659-0.742-1.318-0.866-1.815-0.062-0.249-0.094-0.459-0.11-0.612-0.009-0.076-0.013-0.139-0.015-0.185L2 18.781V18.25zm14.75-1.75c-0.414 0-0.75 0.336-0.75 0.75S16.336 18 16.75 18h8.5c0.414 0 0.75-0.336 0.75-0.75s-0.336-0.75-0.75-0.75h-8.5zm0 3c-0.414 0-0.75 0.336-0.75 0.75S16.336 21 16.75 21h8.5c0.414 0 0.75-0.336 0.75-0.75s-0.336-0.75-0.75-0.75h-8.5zm0 3c-0.414 0-0.75 0.336-0.75 0.75S16.336 24 16.75 24h8.5c0.414 0 0.75-0.336 0.75-0.75s-0.336-0.75-0.75-0.75h-8.5z" android:fillColor="@color/fluent_default_icon_tint"/>
|
||||
</vector>
|
||||
@@ -103,7 +103,7 @@
|
||||
<TextView
|
||||
android:id="@+id/state_title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="16dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@id/retry_or_cancel_upload"
|
||||
android:layout_marginTop="16dp"
|
||||
android:textColor="?colorGray200"
|
||||
@@ -118,7 +118,7 @@
|
||||
<TextView
|
||||
android:id="@+id/state_text"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="32dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@id/state_title"
|
||||
android:includeFontPadding="false"
|
||||
android:textColor="?colorGray200"
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
android:layout_gravity="top"
|
||||
android:elevation="1dp"
|
||||
android:outlineProvider="background"
|
||||
android:background="?colorWindowBackground">
|
||||
android:background="?colorBackgroundLight">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/banner_text"
|
||||
|
||||
@@ -120,6 +120,14 @@
|
||||
android:textAppearance="@style/m3_title_small"
|
||||
tools:text="\@Gargron" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/bot_icon"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:importantForAccessibility="no"
|
||||
android:layout_marginTop="2dp"
|
||||
android:src="@drawable/ic_fluent_bot_16_filled" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/separator"
|
||||
android:layout_width="wrap_content"
|
||||
|
||||
@@ -90,6 +90,7 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_toEndOf="@id/self_avatar"
|
||||
android:layout_marginTop="2sp"
|
||||
android:minHeight="24sp"
|
||||
android:ellipsize="end"
|
||||
android:singleLine="true"
|
||||
|
||||
@@ -253,11 +253,53 @@
|
||||
android:textColor="?android:textColorSecondary"
|
||||
tools:text="\@Gargron" />
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@id/username"
|
||||
android:id="@+id/note_edit_wrap"
|
||||
android:layout_marginTop="4dp"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:layout_marginHorizontal="16dp"
|
||||
android:visibility="gone">
|
||||
|
||||
<EditText
|
||||
android:id="@+id/note_edit"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingVertical="16dp"
|
||||
android:inputType="textMultiLine|textCapSentences"
|
||||
android:singleLine="false"
|
||||
android:drawableStart="@drawable/ic_fluent_notepad_20_regular"
|
||||
android:drawablePadding="12dp"
|
||||
android:drawableTint="?android:textColorSecondary"
|
||||
android:background="@drawable/bg_note_edit"
|
||||
android:paddingEnd="48dp"
|
||||
android:paddingHorizontal="16dp"
|
||||
android:elevation="0dp"
|
||||
android:visibility="gone"
|
||||
android:hint="@string/sk_personal_note"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/note_edit_confirm"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:paddingHorizontal="8dp"
|
||||
android:visibility="invisible"
|
||||
android:backgroundTint="?colorBackgroundLightest"
|
||||
android:layout_gravity="right|center_vertical"
|
||||
android:tooltipText="@string/sk_personal_note_confirm"
|
||||
android:contentDescription="@string/sk_personal_note_confirm"
|
||||
android:drawableStart="@drawable/ic_fluent_checkmark_24_regular"
|
||||
/>
|
||||
</FrameLayout>
|
||||
|
||||
<org.joinmastodon.android.ui.views.LinkedTextView
|
||||
android:id="@+id/bio"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@id/username"
|
||||
android:layout_below="@id/note_edit_wrap"
|
||||
android:layout_marginLeft="16dp"
|
||||
android:layout_marginRight="16dp"
|
||||
android:textAppearance="@style/m3_body_large"
|
||||
|
||||
54
mastodon/src/main/res/layout/fragment_profile_about.xml
Normal file
54
mastodon/src/main/res/layout/fragment_profile_about.xml
Normal file
@@ -0,0 +1,54 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/note_edit_wrap"
|
||||
android:visibility="gone">
|
||||
|
||||
<EditText
|
||||
android:id="@+id/note_edit"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingVertical="16dp"
|
||||
android:layout_marginTop="16dp"
|
||||
android:layout_marginBottom="4dp"
|
||||
android:layout_marginHorizontal="16dp"
|
||||
android:inputType="textMultiLine|textCapSentences"
|
||||
android:singleLine="false"
|
||||
android:drawableStart="@drawable/ic_fluent_notepad_20_regular"
|
||||
android:drawablePadding="12dp"
|
||||
android:drawableTint="?android:textColorSecondary"
|
||||
android:background="@drawable/bg_note_edit"
|
||||
android:paddingHorizontal="16dp"
|
||||
android:elevation="0dp"
|
||||
android:visibility="gone"
|
||||
android:hint="@string/sk_personal_note"/>
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/note_edit_confirm"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@drawable/ic_fluent_checkmark_24_filled"
|
||||
android:backgroundTint="#00000000"
|
||||
android:layout_marginTop="2dp"
|
||||
android:visibility="invisible"
|
||||
android:layout_marginEnd="20dp"
|
||||
android:layout_gravity="right|center_vertical"
|
||||
android:tooltipText="@string/sk_personal_note_confirm"
|
||||
android:contentDescription="@string/sk_personal_note_confirm" />
|
||||
|
||||
</FrameLayout>
|
||||
|
||||
<me.grishka.appkit.views.UsableRecyclerView
|
||||
android:id="@+id/list"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:scrollbars="vertical"
|
||||
android:clipToPadding="false"/>
|
||||
|
||||
</LinearLayout>
|
||||
59
mastodon/src/main/res/layout/home_toolbar.xml
Normal file
59
mastodon/src/main/res/layout/home_toolbar.xml
Normal file
@@ -0,0 +1,59 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
<LinearLayout
|
||||
android:id="@+id/switcher_btn"
|
||||
android:background="?android:selectableItemBackgroundBorderless"
|
||||
android:orientation="horizontal"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center_vertical|start"
|
||||
android:paddingHorizontal="16dp">
|
||||
<ImageView
|
||||
android:id="@+id/timeline_icon"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:src="@drawable/ic_fluent_home_24_regular" />
|
||||
<FrameLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical">
|
||||
<ImageView
|
||||
android:id="@+id/collapsed_chevron"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="8dp"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:src="@drawable/ic_fluent_chevron_down_16_filled"
|
||||
android:visibility="gone" />
|
||||
<TextView
|
||||
android:id="@+id/timeline_title"
|
||||
style="?android:attr/titleTextAppearance"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="16dp"
|
||||
android:drawablePadding="8dp"
|
||||
android:drawableEnd="@drawable/ic_fluent_chevron_down_16_filled" />
|
||||
</FrameLayout>
|
||||
</LinearLayout>
|
||||
<FrameLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
<Button
|
||||
android:id="@+id/show_new_posts_btn"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingVertical="2dp"
|
||||
android:minHeight="32sp"
|
||||
android:lineSpacingMultiplier="0.8"
|
||||
android:textAppearance="@style/m3_title_medium"
|
||||
android:text="@string/see_new_posts"
|
||||
android:textColor="@color/gray_25"
|
||||
android:background="@drawable/bg_button_new_posts"
|
||||
android:drawableStart="@drawable/ic_fluent_arrow_up_16_filled"
|
||||
android:drawablePadding="8dp"
|
||||
android:layout_gravity="center" />
|
||||
</FrameLayout>
|
||||
</FrameLayout>
|
||||
@@ -91,7 +91,6 @@
|
||||
android:layout_marginStart="16dp"
|
||||
android:layout_marginTop="16dp"
|
||||
android:gravity="center_horizontal"
|
||||
android:layout_weight="1"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
@@ -116,7 +115,6 @@
|
||||
android:layout_marginTop="16dp"
|
||||
android:layout_marginStart="12dp"
|
||||
android:orientation="vertical"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center_horizontal">
|
||||
<TextView
|
||||
android:id="@+id/followers_count"
|
||||
@@ -140,7 +138,6 @@
|
||||
android:layout_marginTop="16dp"
|
||||
android:layout_marginStart="12dp"
|
||||
android:orientation="vertical"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center_horizontal">
|
||||
<TextView
|
||||
android:id="@+id/following_count"
|
||||
@@ -228,9 +225,7 @@
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="8dp"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:padding="8dp"
|
||||
android:layout_weight="1"
|
||||
android:clipToPadding="false">
|
||||
|
||||
<org.joinmastodon.android.ui.views.ProgressBarButton
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
<TextView
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="28dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:layout_marginTop="12dp"
|
||||
android:layout_marginStart="16dp"
|
||||
@@ -22,6 +22,7 @@
|
||||
android:layout_height="44dp"
|
||||
android:layout_marginTop="4dp"
|
||||
android:layout_marginEnd="6dp"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:tint="?android:textColorSecondary"
|
||||
android:background="?android:selectableItemBackgroundBorderless"
|
||||
android:contentDescription="@string/clear"
|
||||
|
||||
@@ -24,8 +24,13 @@
|
||||
android:layout_width="24dp"
|
||||
android:layout_height="24dp"
|
||||
android:layout_gravity="center"
|
||||
android:alpha="0"
|
||||
/>
|
||||
android:alpha="0" />
|
||||
<TextView
|
||||
android:id="@+id/secondary_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:textColor="?android:textColorSecondary" />
|
||||
<ImageView
|
||||
android:id="@+id/icon"
|
||||
android:importantForAccessibility="no"
|
||||
|
||||
42
mastodon/src/main/res/layout/list_timeline_editor.xml
Normal file
42
mastodon/src/main/res/layout/list_timeline_editor.xml
Normal file
@@ -0,0 +1,42 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
<org.joinmastodon.android.ui.views.AutoOrientationLinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:layout_marginHorizontal="24dp">
|
||||
<TextView
|
||||
android:id="@+id/text"
|
||||
android:text="@string/sk_list_replies_policy"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:paddingVertical="8dp"
|
||||
android:singleLine="true"
|
||||
android:ellipsize="none"
|
||||
android:gravity="center_vertical"
|
||||
android:textColor="?android:textColorPrimary"
|
||||
android:textSize="16sp" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="32dp"
|
||||
android:background="@drawable/bg_inline_button"
|
||||
android:elevation="0dp"
|
||||
android:ellipsize="none"
|
||||
android:fontFamily="sans-serif-medium"
|
||||
android:singleLine="true"
|
||||
android:stateListAnimator="@null"
|
||||
android:textColor="?android:textColorPrimary"
|
||||
android:textSize="16sp" />
|
||||
</org.joinmastodon.android.ui.views.AutoOrientationLinearLayout>
|
||||
|
||||
<org.joinmastodon.android.ui.views.TextInputFrameLayout
|
||||
android:id="@+id/input"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content" />
|
||||
</LinearLayout>
|
||||
13
mastodon/src/main/res/menu/home_switcher.xml
Normal file
13
mastodon/src/main/res/menu/home_switcher.xml
Normal file
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:id="@+id/home" android:icon="@drawable/ic_fluent_home_24_regular" android:title="@string/sk_timeline_home" />
|
||||
<item android:id="@+id/local" android:icon="@drawable/ic_fluent_people_community_24_regular" android:title="@string/sk_timeline_local" />
|
||||
<item android:id="@+id/federated" android:icon="@drawable/ic_fluent_earth_24_regular" android:title="@string/sk_timeline_federated" />
|
||||
<item android:id="@+id/post_notifications" android:icon="@drawable/ic_fluent_alert_24_regular" android:title="@string/sk_notify_posts" />
|
||||
<item android:id="@+id/lists" android:icon="@drawable/ic_fluent_people_list_24_regular" android:title="@string/sk_list_timelines" android:visible="false">
|
||||
<menu />
|
||||
</item>
|
||||
<item android:id="@+id/followed_hashtags" android:icon="@drawable/ic_fluent_number_symbol_24_regular" android:title="@string/sk_hashtags_you_follow" android:visible="false">
|
||||
<menu />
|
||||
</item>
|
||||
</menu>
|
||||
6
mastodon/src/main/res/menu/list_reply_policies.xml
Normal file
6
mastodon/src/main/res/menu/list_reply_policies.xml
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:id="@+id/reply_policy_list" android:title="@string/sk_list_replies_policy_list" />
|
||||
<item android:id="@+id/reply_policy_followed" android:title="@string/sk_list_replies_policy_followed" />
|
||||
<item android:id="@+id/reply_policy_none" android:title="@string/sk_list_replies_policy_none" />
|
||||
</menu>
|
||||
8
mastodon/src/main/res/menu/menu_list.xml
Normal file
8
mastodon/src/main/res/menu/menu_list.xml
Normal file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item
|
||||
android:id="@+id/create"
|
||||
android:title="@string/sk_create"
|
||||
android:icon="@drawable/ic_fluent_people_add_24_regular"
|
||||
android:showAsAction="always" />
|
||||
</menu>
|
||||
@@ -4,8 +4,9 @@
|
||||
<item android:id="@+id/mute" android:title="@string/mute_user" android:icon="@drawable/ic_fluent_speaker_mute_24_regular"/>
|
||||
<item android:id="@+id/block" android:title="@string/block_user" android:icon="@drawable/ic_fluent_person_prohibited_24_regular"/>
|
||||
<item android:id="@+id/report" android:title="@string/report_user" android:icon="@drawable/ic_fluent_warning_24_regular"/>
|
||||
<item android:id="@+id/soft_block" android:title="@string/sk_remove_follower" android:icon="@drawable/ic_fluent_person_delete_24_regular"/>
|
||||
<item android:id="@+id/block_domain" android:title="@string/block_domain" android:icon="@drawable/ic_fluent_shield_prohibited_24_regular"/>
|
||||
<item android:id="@+id/hide_boosts" android:title="@string/hide_boosts_from_user" android:icon="@drawable/ic_fluent_arrow_repeat_all_off_24_regular"/>
|
||||
<item android:id="@+id/manage_user_lists" android:title="@string/sk_lists_with_user" android:icon="@drawable/ic_fluent_people_community_24_regular"/>
|
||||
<item android:id="@+id/manage_user_lists" android:title="@string/sk_lists_with_user" android:icon="@drawable/ic_fluent_people_list_24_regular"/>
|
||||
<item android:id="@+id/open_in_browser" android:title="@string/open_in_browser" android:icon="@drawable/ic_fluent_globe_24_regular"/>
|
||||
</menu>
|
||||
@@ -1,6 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:id="@+id/followed_hashtags" android:title="@string/sk_hashtags_you_follow" android:icon="@drawable/ic_fluent_number_symbol_24_regular" android:showAsAction="always"/>
|
||||
<item android:id="@+id/manage_user_lists" android:title="@string/sk_your_lists" android:icon="@drawable/ic_fluent_people_list_24_regular" android:showAsAction="always"/>
|
||||
<item android:id="@+id/bookmarks" android:title="@string/bookmarks" android:icon="@drawable/ic_fluent_bookmark_multiple_24_regular" android:showAsAction="always"/>
|
||||
<item android:id="@+id/favorites" android:title="@string/your_favorites" android:icon="@drawable/ic_fluent_star_24_regular" android:showAsAction="always"/>
|
||||
<item android:id="@+id/scheduled" android:title="@string/sk_unsent_posts" android:icon="@drawable/ic_fluent_drafts_24_regular" android:showAsAction="always"/>
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
<string name="sk_list_timelines">Llistes</string>
|
||||
<string name="sk_follow_requests">Sol·licituds de seguiment</string>
|
||||
<string name="sk_reject_follow_request">Rebutja la sol·licitud</string>
|
||||
<string name="sk_lists_with_user">Llistes amb %s</string>
|
||||
<string name="sk_lists_with_user">Edita les llistes amb %s</string>
|
||||
<string name="sk_settings_always_reveal_content_warnings">Mostra sempre els avisos de contingut</string>
|
||||
<string name="sk_settings_contribute">Contribueix a Moshidon</string>
|
||||
<string name="sk_settings_show_federated_timeline">Mostra la línia de temps federada</string>
|
||||
@@ -47,4 +47,99 @@
|
||||
<string name="sk_color_palette_blue">Blau</string>
|
||||
<string name="sk_color_palette_brown">Marró</string>
|
||||
<string name="sk_color_palette_yellow">Groc</string>
|
||||
<string name="sk_timeline_local">Local</string>
|
||||
<string name="sk_timeline_federated">Federació</string>
|
||||
<string name="sk_poll_allow_multiple">Permet resposta múltiple</string>
|
||||
<string name="sk_translate_post">Tradueix</string>
|
||||
<string name="sk_example_domain">exemple.social</string>
|
||||
<string name="sk_welcome_title">Et donem la benvinguda!</string>
|
||||
<string name="sk_clear_recent_languages">Esborra les llengües recents</string>
|
||||
<string name="sk_settings_translate_only_opened">Tradueix només les publicacions obertes</string>
|
||||
<string name="sk_bookmark_as">Afig als marcadors amb un altre compte</string>
|
||||
<string name="sk_bookmarked_as">Afegit marcador com a %s</string>
|
||||
<string name="sk_already_bookmarked">Ja està als marcadors</string>
|
||||
<string name="sk_favorite_as">Marca com a preferit amb un altre compte</string>
|
||||
<string name="sk_favorited_as">Marcat com a preferit com a %s</string>
|
||||
<string name="sk_already_favorited">Ja està marcat com a preferit</string>
|
||||
<string name="sk_reblog_as">Impulsa amb un altre compte</string>
|
||||
<string name="sk_already_reblogged">Ja s\'ha impulsat</string>
|
||||
<string name="sk_reply_as">Respon amb un altre compte</string>
|
||||
<string name="sk_settings_uniform_icon_for_notifications">Unifica la icona per a totes les notificacions</string>
|
||||
<string name="sk_translate_show_original">Mostra l\'original</string>
|
||||
<string name="sk_translated_using">Traduït amb %s</string>
|
||||
<string name="sk_post_language">Llengua: %s</string>
|
||||
<string name="sk_available_languages">Llengües disponibles</string>
|
||||
<string name="sk_language_name">%s (%s)</string>
|
||||
<string name="sk_confirm_clear_recent_languages">Segur que vols esborrar les llengües recents\?</string>
|
||||
<string name="sk_welcome_text">El tauró et saluda! Per a començar, introdueix el domini de la instància a continuació.</string>
|
||||
<string name="sk_tabs_disable_swipe">Desactiva el desplaçament entre pestanyes</string>
|
||||
<string name="sk_settings_auth">Configuració de seguretat</string>
|
||||
<string name="sk_reblogged_as">Impulsat com a %s</string>
|
||||
<string name="sk_announcements">Anuncis</string>
|
||||
<string name="sk_list_name_hint">Nom de la llista</string>
|
||||
<string name="sk_delete_list_confirm">Segur que vols eliminar la llista «%s»\?</string>
|
||||
<string name="sk_timeline_home">Inici</string>
|
||||
<string name="sk_settings_profile">Configura el perfil</string>
|
||||
<string name="sk_settings_posting">Preferències de publicació</string>
|
||||
<string name="sk_settings_filters">Configura filtres</string>
|
||||
<string name="sk_settings_rules">Normes</string>
|
||||
<string name="sk_settings_about">Quant a l\'aplicació</string>
|
||||
<string name="sk_settings_donate">Dona</string>
|
||||
<string name="sk_color_palette_material3">Sistema</string>
|
||||
<string name="sk_color_palette_red">Vermell</string>
|
||||
<string name="sk_delete_notification">Elimina la notificació</string>
|
||||
<string name="sk_delete_notification_confirm_action">Elimina la notificació</string>
|
||||
<string name="sk_delete_notification_confirm">Segur que vols eliminar la notificació\?</string>
|
||||
<string name="sk_settings_publish_button_text">Text del botó de publicació</string>
|
||||
<string name="sk_settings_publish_button_text_title">Personalitza el text del botó de publicació</string>
|
||||
<string name="sk_enable_delete_notifications">Activa l\'eliminació de notificacions</string>
|
||||
<string name="sk_settings_translation_availability_note_available">%s admet la traducció!</string>
|
||||
<string name="sk_settings_translation_availability_note_unavailable">Sembla que %s no admet la traducció.</string>
|
||||
<string name="sk_clear_all_notifications">Esborr totes les notificacions</string>
|
||||
<string name="sk_clear_all_notifications_confirm_action">Elimina-ho tot</string>
|
||||
<string name="sk_clear_all_notifications_confirm">Segur que vols esborrar totes les notificacions\?</string>
|
||||
<string name="sk_undo_reblog">Desfés l\'impuls</string>
|
||||
<string name="sk_reblog_with_visibility">Impulsa amb visibilitat</string>
|
||||
<string name="sk_quote_post">Publica sobre açò</string>
|
||||
<string name="sk_hashtags_you_follow">Etiquetes que segueixes</string>
|
||||
<string name="sk_copy_link_to_post">Copia l\'enllaç a la publicació</string>
|
||||
<string name="sk_open_with_account">Obri amb un altre compte</string>
|
||||
<string name="sk_resource_not_found">No s\'ha trobat el recurs</string>
|
||||
<string name="sk_forward_report_to">Reenvia a %s</string>
|
||||
<string name="sk_unsent_posts">Publicacions sense enviar</string>
|
||||
<string name="sk_draft">Esborrany</string>
|
||||
<string name="sk_schedule">Programa</string>
|
||||
<string name="sk_confirm_delete_draft_title">Elimina l\'esborrany</string>
|
||||
<string name="sk_confirm_delete_draft">Segur que vols eliminar l\'esborrany\?</string>
|
||||
<string name="sk_confirm_delete_scheduled_post_title">Elimina la publicació programada</string>
|
||||
<string name="sk_confirm_delete_scheduled_post">Segur que vols eliminar la publicació programada\?</string>
|
||||
<string name="sk_compose_draft">La publicació es desarà com a esborrany.</string>
|
||||
<string name="sk_draft_or_schedule">Com a esborrany o programa</string>
|
||||
<string name="sk_compose_scheduled">Programada per a</string>
|
||||
<string name="sk_post_scheduled">S\'ha programat la publicació</string>
|
||||
<string name="sk_draft_saved">S\'ha desat l\'esborrany</string>
|
||||
<string name="sk_scheduled_too_soon_title">L\'hora de programació és massa prompte</string>
|
||||
<string name="sk_scheduled_too_soon">La programació s\'ha de fer amb almenys 10 minuts d\'antelació.</string>
|
||||
<string name="sk_confirm_save_draft">Vols desar com a esborrany\?</string>
|
||||
<string name="sk_confirm_save_changes">Vols desar els canvis\?</string>
|
||||
<string name="sk_mark_as_draft">Desa com a esborrany</string>
|
||||
<string name="sk_schedule_post">Programa la publicació</string>
|
||||
<string name="sk_schedule_or_draft">Programa o com a esborrany</string>
|
||||
<string name="sk_compose_no_schedule">No la programes</string>
|
||||
<string name="sk_compose_no_draft">No deses com a esborrany</string>
|
||||
<string name="sk_settings_reduce_motion">Redueix el moviment de les animacions</string>
|
||||
<string name="sk_mark_as_read">Marca com a llegit</string>
|
||||
<string name="sk_settings_about_instance">Quant a la instància</string>
|
||||
<string name="sk_settings_single_notification">Mostra només una notificació</string>
|
||||
<string name="sk_create">Crea</string>
|
||||
<string name="sk_create_list_title">Crea una llista</string>
|
||||
<string name="sk_list_replies_policy">Mostra les respostes a</string>
|
||||
<string name="sk_list_replies_policy_list">membres de la llista</string>
|
||||
<string name="sk_list_replies_policy_followed">usuaris seguits</string>
|
||||
<string name="sk_list_replies_policy_none">ningú</string>
|
||||
<string name="sk_delete_list">Elimina la llista</string>
|
||||
<string name="sk_edit_list_title">Edita la llista</string>
|
||||
<string name="sk_your_lists">Llistes</string>
|
||||
<string name="sk_loading_fediverse_resource_title">Buscant-ho al Fedivers</string>
|
||||
<string name="sk_loading_resource_on_instance_title">Buscant-ho a %s</string>
|
||||
</resources>
|
||||
@@ -1,3 +1,24 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
</resources>
|
||||
<string name="sk_confirm_delete_and_redraft">Jste si jisti, že chcete tento příspěvek smazat a přepsat\?</string>
|
||||
<string name="sk_confirm_unpin_post">Jste si jisti, že chcete tento příspěvek odepnout\?</string>
|
||||
<string name="sk_confirm_pin_post">Chcete si tento příspěvek připnout na svůj profil\?</string>
|
||||
<string name="sk_federated_timeline_info_banner">Toto jsou nejnovější příspěvky lidí z vaší federace.</string>
|
||||
<string name="sk_disable_marquee">Zakázat posouvání textu v titulkových lištách</string>
|
||||
<string name="sk_welcome_text">Žralok tě zdraví! Chcete-li začít, zadejte níže název domény své domovské instance.</string>
|
||||
<string name="sk_clear_recent_languages">Vymazat nedávno použité jazyky</string>
|
||||
<string name="sk_confirm_clear_recent_languages">Jste si jisti, že chcete vymazat nedávno použité jazyky\?</string>
|
||||
<string name="sk_delete_notification_confirm">Opravdu chcete toto oznámení odstranit\?</string>
|
||||
<string name="sk_settings_translation_availability_note_unavailable">%s zřejmě nepodporuje překlad.</string>
|
||||
<string name="sk_clear_all_notifications_confirm">Opravdu chcete vymazat všechna oznámení\?</string>
|
||||
<string name="sk_loading_fediverse_resource_title">Podívejte se na Fediverse</string>
|
||||
<string name="sk_loading_resource_on_instance_title">Vyhledávání na %s</string>
|
||||
<string name="sk_resource_not_found">Zdroj se nepodařilo najít</string>
|
||||
<string name="sk_scheduled_too_soon">Příspěvek musí být naplánován alespoň 10 minut dopředu.</string>
|
||||
<string name="sk_confirm_delete_draft">Jste si jistý, že chcete tento navržený příspěvek smazat\?</string>
|
||||
<string name="sk_confirm_delete_scheduled_post">Určitě chcete tento naplánovaný příspěvek smazat\?</string>
|
||||
<string name="sk_delete_list_confirm">Opravdu chcete tento seznam odstranit\?</string>
|
||||
<string name="sk_app_name">Moshidon</string>
|
||||
<string name="sk_pinned_posts">Připnutý</string>
|
||||
<string name="sk_delete_and_redraft">vymazat a přepracovat</string>
|
||||
</resources>
|
||||
71
mastodon/src/main/res/values-cy/strings_sk.xml
Normal file
71
mastodon/src/main/res/values-cy/strings_sk.xml
Normal file
@@ -0,0 +1,71 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="sk_delete_and_redraft">Dileu ac ailddrafftio</string>
|
||||
<string name="sk_confirm_delete_and_redraft_title">Dileu ac ailddrafftio\'r neges</string>
|
||||
<string name="sk_confirm_pin_post_title">Pinio i\'ch proffil</string>
|
||||
<string name="sk_pinning">Wrthi\'n pinio\'r neges…</string>
|
||||
<string name="sk_unpin_post">Dadbinio o\'ch proffil</string>
|
||||
<string name="sk_confirm_unpin_post_title">Dadbinio neges o\'ch proffil</string>
|
||||
<string name="sk_unpinning">Wrthi\'n dadbinio\'r neges…</string>
|
||||
<string name="sk_settings_show_replies">Dangos ymatebion</string>
|
||||
<string name="sk_list_timelines">Rhestri</string>
|
||||
<string name="sk_settings_always_reveal_content_warnings">Datguddio rhybuddion cynnwys bob tro</string>
|
||||
<string name="sk_settings_contribute">Cyfrannu at Moshidon</string>
|
||||
<string name="sk_notification_type_status">Negeseuon</string>
|
||||
<string name="sk_color_palette_material3">System</string>
|
||||
<string name="sk_color_palette_pink">Pinc</string>
|
||||
<string name="sk_color_palette_purple">Porffor</string>
|
||||
<string name="sk_color_palette_green">Gwyrdd</string>
|
||||
<string name="sk_color_palette_blue">Glas</string>
|
||||
<string name="sk_color_palette_brown">Brown</string>
|
||||
<string name="sk_color_palette_red">Coch</string>
|
||||
<string name="sk_app_name">Moshidon</string>
|
||||
<string name="sk_confirm_pin_post">Hoffech chi binio\'r neges hon i\'ch proffil\?</string>
|
||||
<string name="sk_visibility_unlisted">Heb ei restru</string>
|
||||
<string name="sk_settings_load_new_posts">Llwytho negeseuon newydd yn ddiofyn</string>
|
||||
<string name="sk_settings_app_version">Moshidon v%1$s (%2$d)</string>
|
||||
<string name="sk_update_available">Mae Moshidon %s yn barod i\'w lawrlwytho.</string>
|
||||
<string name="sk_update_ready">Mae Moshidon %s wedi ei lawrlwytho ac yn barod i\'w osod.</string>
|
||||
<string name="sk_color_palette_yellow">Melyn</string>
|
||||
<string name="sk_translate_post">Cyfieithu</string>
|
||||
<string name="sk_translate_show_original">Dangos y gwreiddiol</string>
|
||||
<string name="sk_post_language">Iaith: %s</string>
|
||||
<string name="sk_welcome_title">Croeso!</string>
|
||||
<string name="sk_settings_auth">Gosodiadau diogelwch</string>
|
||||
<string name="sk_pin_post">Pinio i\'ch proffil</string>
|
||||
<string name="sk_confirm_delete_and_redraft">Ydych chi\'n siŵr eich bod am ddileu ac ailddrafftio\'r neges hon\?</string>
|
||||
<string name="sk_confirm_unpin_post">Ydych chi\'n siŵr eich bod am ddadbinio\'r neges hon\?</string>
|
||||
<string name="sk_notify_posts">Hysbysiadau negeseuon</string>
|
||||
<string name="sk_settings_color_palette">Palet lliwiau</string>
|
||||
<string name="sk_no_update_available">Dim diweddariad ar gael</string>
|
||||
<string name="sk_check_for_update">Gwirio am ddiweddariad</string>
|
||||
<string name="sk_poll_allow_multiple">Caniatáu mwy nag un dewis</string>
|
||||
<string name="sk_language_name">%s (%s)</string>
|
||||
<string name="sk_tabs_disable_swipe">Analluogi llusgo rhwng tabiau</string>
|
||||
<string name="sk_settings_posting">Dewisiadau postio</string>
|
||||
<string name="sk_settings_rules">Rheolau</string>
|
||||
<string name="sk_settings_donate">Rhoddi</string>
|
||||
<string name="sk_settings_publish_button_text">Testun y botwm cyhoeddi</string>
|
||||
<string name="sk_settings_translation_availability_note_unavailable">Nid yw\'n ymddangos bod %s yn cefnogi cyfieithu.</string>
|
||||
<string name="sk_hashtags_you_follow">Hashnodau rydych chi\'n eu dilyn</string>
|
||||
<string name="sk_copy_link_to_post">Copïo dolen i\'r neges</string>
|
||||
<string name="sk_draft">Drafft</string>
|
||||
<string name="sk_confirm_delete_draft_title">Dileu\'r drafft</string>
|
||||
<string name="sk_draft_saved">Drafft wedi\'i gadw</string>
|
||||
<string name="sk_timeline_home">Hafan</string>
|
||||
<string name="sk_mark_media_as_sensitive">Nodi fel cynnwys sensitif</string>
|
||||
<string name="sk_available_languages">Pob iaith</string>
|
||||
<string name="sk_clear_recent_languages">Clirio\'r ieithoedd a ddefnyddiwyd yn ddiweddar</string>
|
||||
<string name="sk_settings_about">Ynghylch yr ap</string>
|
||||
<string name="sk_clear_all_notifications">Dileu pob hysbysiad</string>
|
||||
<string name="sk_clear_all_notifications_confirm_action">Dileu\'r cwbl</string>
|
||||
<string name="sk_clear_all_notifications_confirm">Ydych chi\'n siŵr eich bod am ddileu pob hysbysiad\?</string>
|
||||
<string name="sk_enable_delete_notifications">Galluogi dileu hysbysiadau</string>
|
||||
<string name="sk_settings_publish_button_text_title">Addasu testun y botwm cyhoeddi</string>
|
||||
<string name="sk_settings_translation_availability_note_available">Mae %s yn cefnogi cyfieithu!</string>
|
||||
<string name="sk_unsent_posts">Negeseuon heb eu hanfon</string>
|
||||
<string name="sk_confirm_delete_draft">Ydych chi\'n siŵr eich bod am ddileu\'r neges ddrafft hon\?</string>
|
||||
<string name="sk_compose_draft">Caiff y neges ei chadw fel drafft.</string>
|
||||
<string name="sk_confirm_save_changes">Cadw newidiadau\?</string>
|
||||
<string name="sk_announcements">Cyhoeddiadau</string>
|
||||
</resources>
|
||||
@@ -13,21 +13,25 @@
|
||||
<string name="user_boosted">%s hat diesen Beitrag geteilt</string>
|
||||
<string name="in_reply_to">Als Antwort auf %s</string>
|
||||
<string name="notifications">Benachrichtigungen</string>
|
||||
|
||||
<string name="user_followed_you">folgt dir jetzt</string>
|
||||
<string name="user_sent_follow_request">hat dir eine Follower-Anfrage gesendet</string>
|
||||
<string name="user_favorited">favorisierte</string>
|
||||
<string name="notification_boosted">teilte</string>
|
||||
<string name="poll_ended">Abstimmung beendet</string>
|
||||
|
||||
<string name="time_seconds">vor %d Sekunden</string>
|
||||
<string name="time_minutes">vor %d Minuten</string>
|
||||
<string name="time_hours">vor %d Stunden</string>
|
||||
<string name="time_days">vor %d Tagen</string>
|
||||
|
||||
<string name="share_toot_title">Teilen</string>
|
||||
<string name="settings">Einstellungen</string>
|
||||
<string name="publish">Veröffentlichen</string>
|
||||
<string name="discard_draft">Entwurf verwerfen?</string>
|
||||
<string name="discard">Verwerfen</string>
|
||||
<string name="cancel">Abbrechen</string>
|
||||
|
||||
<plurals name="followers">
|
||||
<item quantity="one">Follower</item>
|
||||
<item quantity="other">Follower</item>
|
||||
@@ -198,6 +202,7 @@
|
||||
<string name="category_regional">Regional</string>
|
||||
<string name="category_tech">Technik</string>
|
||||
<string name="confirm_email_title">Eine letzte Sache noch</string>
|
||||
<!-- %s is the email address -->
|
||||
<string name="confirm_email_subtitle">Tippe auf den Link, den wir dir per E-Mail geschickt haben, um dein Konto zu verifizieren.</string>
|
||||
<string name="confirm_email_didnt_get">Keinen Link bekommen?</string>
|
||||
<string name="resend">Erneut abschicken</string>
|
||||
@@ -315,6 +320,7 @@
|
||||
<string name="manually_approves_followers">Manuelles Genehmigen von Followern</string>
|
||||
<string name="current_account">Aktuelles Konto</string>
|
||||
<string name="log_out_account">%s abmelden</string>
|
||||
|
||||
<!-- translators: %,d is a valid placeholder, it formats the number with locale-dependent grouping separators -->
|
||||
<plurals name="x_followers">
|
||||
<item quantity="one">%,d Follower</item>
|
||||
@@ -393,6 +399,7 @@
|
||||
<string name="login_title">Willkommen zurück</string>
|
||||
<string name="login_subtitle">Melde dich mit dem Server an, auf dem du dein Konto erstellt hast.</string>
|
||||
<string name="server_url">Serveradresse</string>
|
||||
<!-- {logo} is a placeholder that is replaced with the Mastodon logo image at runtime. Please copy it into your translation as is. -->
|
||||
<string name="welcome_page1_title">Was ist {logo}?</string>
|
||||
<string name="welcome_page1_text">Stellen Sie sich vor, Sie haben eine E-Mail-Adresse mit der Endung @example.com.\n\nSie können weiterhin E-Mails von jeder Person senden und empfangen, auch wenn deren E-Mail-Adresse auf @gmail.com oder @icloud.com oder @example.com endet.</string>
|
||||
<string name="welcome_page2_title">Mastodon ist genau so.</string>
|
||||
@@ -414,4 +421,4 @@
|
||||
<string name="category_special_interests">Besondere Interessen</string>
|
||||
<string name="signup_passwords_dont_match">Passwörter stimmen nicht überein</string>
|
||||
<string name="loading_fediverse_resource_title">Ich habe im Fediverse nachgeschaut...</string>
|
||||
</resources>
|
||||
</resources>
|
||||
@@ -11,7 +11,7 @@
|
||||
<string name="sk_pinning">Wird angeheftet…</string>
|
||||
<string name="sk_unpin_post">Von Profil lösen</string>
|
||||
<string name="sk_confirm_unpin_post_title">Angehefteten Beitrag von Profil lösen</string>
|
||||
<string name="sk_confirm_unpin_post">Bist du dir sicher, dass du den angehefteten Beitrag von deinem Profil lösen möchtest\?</string>
|
||||
<string name="sk_confirm_unpin_post">Diesen angehefteten Beitrag wirklich von deinem Profil lösen\?</string>
|
||||
<string name="sk_unpinning">Wird vom Profil gelöst…</string>
|
||||
<string name="sk_image_description">Bildbeschreibung</string>
|
||||
<string name="sk_visibility_unlisted">Nicht gelistet</string>
|
||||
@@ -27,14 +27,14 @@
|
||||
<string name="sk_federated_timeline_info_banner">Das sind die neuesten Beiträge von Personen, die in der Föderation deines Servers sind.</string>
|
||||
<string name="sk_update_available">Moshidon %s ist zum Herunterladen bereit.</string>
|
||||
<string name="sk_update_ready">Moshidon %s wurde heruntergeladen und kann jetzt installiert werden.</string>
|
||||
<string name="sk_changelog">Changelog:</string>
|
||||
<string name="sk_changelog">Änderungsverlauf:</string>
|
||||
<string name="sk_check_for_update">Auf Update prüfen</string>
|
||||
<string name="sk_no_update_available">Kein Update verfügbar</string>
|
||||
<string name="sk_list_timelines">Listen</string>
|
||||
<string name="sk_follow_requests">Folgeanfragen</string>
|
||||
<string name="sk_accept_follow_request">Folgeanfrage akzeptieren</string>
|
||||
<string name="sk_reject_follow_request">Folgeanfrage ablehnen</string>
|
||||
<string name="sk_lists_with_user">Listen mit %s</string>
|
||||
<string name="sk_lists_with_user">Listen mit %s bearbeiten</string>
|
||||
<string name="sk_settings_always_reveal_content_warnings">Inhaltswarnungen immer ausklappen</string>
|
||||
<string name="sk_disable_marquee">Laufschrift in Titelleisten deaktivieren</string>
|
||||
<string name="sk_disable_dividers">Beitrags Trennung deaktivieren</string>
|
||||
@@ -67,6 +67,9 @@
|
||||
<string name="sk_example_domain">beispiel.social</string>
|
||||
<string name="sk_tabs_disable_swipe">Wischen zwischen Tabs deaktivieren</string>
|
||||
<string name="sk_settings_profile">Profil einrichten</string>
|
||||
<string name="sk_personal_note">Notiz zu diesem Profil hinzufügen</string>
|
||||
<string name="sk_personal_note_confirm">Änderungen der Notiz bestätigen</string>
|
||||
<string name="sk_personal_note_update_failed">Speichern der Notiz fehlgeschlagen</string>
|
||||
<string name="sk_settings_posting">Einstellungen für Beiträge</string>
|
||||
<string name="sk_settings_filters">Filter konfigurieren</string>
|
||||
<string name="sk_settings_auth">Sicherheits-Einstellungen</string>
|
||||
@@ -95,13 +98,13 @@
|
||||
<string name="sk_open_in_account">In anderem Konto öffnen</string>
|
||||
<string name="sk_open_with_account">Mit anderem Konto öffnen</string>
|
||||
<string name="sk_resource_not_found">Ressource nicht gefunden</string>
|
||||
<string name="sk_bookmark_as">Lesezeichen in anderem Konto</string>
|
||||
<string name="sk_bookmark_as">Lesezeichen mit anderem Konto</string>
|
||||
<string name="sk_bookmarked_as">Lesezeichen gesetzt als %s</string>
|
||||
<string name="sk_already_bookmarked">Bereits in den Lesezeichen</string>
|
||||
<string name="sk_favorite_as">Favorit von anderem Konto</string>
|
||||
<string name="sk_favorite_as">Favorit mit anderem Konto</string>
|
||||
<string name="sk_favorited_as">Favorisiert als %s</string>
|
||||
<string name="sk_already_favorited">Bereits favorisiert</string>
|
||||
<string name="sk_reblog_as">Von einem anderen Konto boosten</string>
|
||||
<string name="sk_reblog_as">Mit einem anderen Konto boosten</string>
|
||||
<string name="sk_reblogged_as">Geboostet als %s</string>
|
||||
<string name="sk_already_reblogged">Bereits geboostet</string>
|
||||
<string name="sk_reply_as">Antworten mit anderem Konto</string>
|
||||
@@ -121,14 +124,14 @@
|
||||
<string name="sk_post_scheduled">Beitrag geplant</string>
|
||||
<string name="sk_scheduled_too_soon_title">Geplante Zeit ist zu früh</string>
|
||||
<string name="sk_scheduled_too_soon">Der Beitrag muss mindestens 10 Minuten in der Zukunft eingeplant werden.</string>
|
||||
<string name="sk_confirm_save_draft">Entwurf speichern?</string>
|
||||
<string name="sk_confirm_save_changes">Änderungen speichern?</string>
|
||||
<string name="sk_confirm_save_draft">Entwurf speichern\?</string>
|
||||
<string name="sk_confirm_save_changes">Änderungen speichern\?</string>
|
||||
<string name="sk_mark_as_draft">Als Entwurf markieren</string>
|
||||
<string name="sk_schedule_post">Beitrag planen</string>
|
||||
<string name="sk_schedule_or_draft">Planen oder Entwurf</string>
|
||||
<string name="sk_schedule_or_draft">Planen oder Vorlage</string>
|
||||
<string name="sk_compose_no_schedule">Nicht planen</string>
|
||||
<string name="sk_compose_no_draft">Nicht entwerfen</string>
|
||||
<string name="sk_settings_reduce_motion">Bewegungen in Animationen reduzieren</string>
|
||||
<string name="sk_settings_reduce_motion">Bewegung in Animationen reduzieren</string>
|
||||
<string name="sk_bot_account">Dies ist ein Bot-Konto</string>
|
||||
<string name="sk_no_image_desc_title">Keine Bildbeschreibung</string>
|
||||
<string name="sk_no_image_desc">Die enthaltenen Bilder haben keine Beschreibung. Bitte füge eine Beschreibung hinzu, damit auch sehbehinderte Personen teilnehmen können.</string>
|
||||
@@ -138,7 +141,30 @@
|
||||
<string name="sk_keep_only_latest_notification">Nur neueste Benachrichtigung behalten</string>
|
||||
<string name="sk_announcements">Ankündigungen</string>
|
||||
<string name="sk_mark_as_read">Als gelesen markieren</string>
|
||||
<string name="sk_settings_about_instance">Über die Instanz</string>
|
||||
<string name="sk_settings_single_notification">Nur eine Benachrichtigung anzeigen</string>
|
||||
<string name="sk_create">Erstellen</string>
|
||||
<string name="sk_create_list_title">Liste erstellen</string>
|
||||
<string name="sk_list_name_hint">Name der Liste</string>
|
||||
<string name="sk_list_replies_policy">Mit Antworten von</string>
|
||||
<string name="sk_list_replies_policy_list">Listen-Mitgliedern</string>
|
||||
<string name="sk_list_replies_policy_followed">gefolgten User_innen</string>
|
||||
<string name="sk_list_replies_policy_none">niemandem</string>
|
||||
<string name="sk_delete_list">Liste löschen</string>
|
||||
<string name="sk_delete_list_confirm">Liste “%s” wirklich löschen\?</string>
|
||||
<string name="sk_edit_list_title">Liste bearbeiten</string>
|
||||
<string name="sk_your_lists">Deine Listen</string>
|
||||
<string name="sk_timeline_home">Start</string>
|
||||
<string name="sk_timeline_local">Lokal</string>
|
||||
<string name="sk_timeline_federated">Föderiert</string>
|
||||
<string name="sk_recent_searches_placeholder">Tippe, um die Suche zu starten</string>
|
||||
<string name="sk_remove_follower">Nicht mehr folgen lassen</string>
|
||||
<string name="sk_remove_follower_confirm">%s als Follower_in entfernen\? Die Person wird dabei blockiert und gleich wieder freigegeben.</string>
|
||||
<string name="sk_do_remove_follower">Entfernen</string>
|
||||
<string name="sk_remove_follower_success">Follower_in erfolgreich entfernt</string>
|
||||
|
||||
<!-- accessibility labels-->
|
||||
<string name="sk_poll_option_add">Neue Umfrageoption hinzufügen</string>
|
||||
<string name="sk_fab_compose">Verfassen</string>
|
||||
<string name="sk_sending_error">Fehler beim Veröffentlichen</string>
|
||||
</resources>
|
||||
</resources>
|
||||
@@ -32,7 +32,7 @@
|
||||
<string name="sk_follow_requests">Solicitudes de seguimiento</string>
|
||||
<string name="sk_accept_follow_request">Aceptar solicitud de seguimiento</string>
|
||||
<string name="sk_reject_follow_request">Rechazar solicitud de seguimiento</string>
|
||||
<string name="sk_lists_with_user">Listas con %s</string>
|
||||
<string name="sk_lists_with_user">Editar listas con %s</string>
|
||||
<string name="sk_settings_always_reveal_content_warnings">Mostrar siempre advertencias de contenido</string>
|
||||
<string name="sk_disable_marquee">Desactivar desplazamiento de texto en barras del título</string>
|
||||
<string name="sk_settings_contribute">Contribuir a Moshidon</string>
|
||||
@@ -94,12 +94,12 @@
|
||||
<string name="sk_already_bookmarked">Ya marcado</string>
|
||||
<string name="sk_favorited_as">Favorito como %s</string>
|
||||
<string name="sk_already_favorited">Ya es un favorito</string>
|
||||
<string name="sk_reblog_as">Compartir desde otra cuenta</string>
|
||||
<string name="sk_reblog_as">Compartir con otra cuenta</string>
|
||||
<string name="sk_reblogged_as">Compartido como %s</string>
|
||||
<string name="sk_already_reblogged">Ya se volvió a publicar</string>
|
||||
<string name="sk_reply_as">Responder con otra cuenta</string>
|
||||
<string name="sk_bookmark_as">Marcador de otra cuenta</string>
|
||||
<string name="sk_favorite_as">Favoritos de otra cuenta</string>
|
||||
<string name="sk_bookmark_as">Marcar con otra cuenta</string>
|
||||
<string name="sk_favorite_as">Favoritos con otra cuenta</string>
|
||||
<string name="sk_settings_uniform_icon_for_notifications">Mismo icono para todas las notificaciones</string>
|
||||
<string name="sk_forward_report_to">Reenviar a %s</string>
|
||||
<string name="sk_unsent_posts">Mensajes no enviados</string>
|
||||
@@ -120,4 +120,26 @@
|
||||
<string name="sk_confirm_save_changes">¿Guardar los cambios\?</string>
|
||||
<string name="sk_mark_as_draft">Marcar como borrador</string>
|
||||
<string name="sk_schedule_post">Programar la publicación</string>
|
||||
<string name="sk_schedule_or_draft">Calendario o proyecto</string>
|
||||
<string name="sk_compose_no_schedule">No programar</string>
|
||||
<string name="sk_compose_no_draft">No hagas borradores</string>
|
||||
<string name="sk_settings_reduce_motion">Reducir el movimiento en las animaciones</string>
|
||||
<string name="sk_announcements">Anuncios</string>
|
||||
<string name="sk_mark_as_read">Marcar como leído</string>
|
||||
<string name="sk_settings_about_instance">Sobre la instancia</string>
|
||||
<string name="sk_settings_single_notification">Mostrar solo una notificación</string>
|
||||
<string name="sk_create">Crear</string>
|
||||
<string name="sk_create_list_title">Crear una lista</string>
|
||||
<string name="sk_list_name_hint">Lista de nombres</string>
|
||||
<string name="sk_list_replies_policy">Mostrar respuestas a</string>
|
||||
<string name="sk_list_replies_policy_followed">Usuarios a los que sigues</string>
|
||||
<string name="sk_list_replies_policy_none">Ninguno</string>
|
||||
<string name="sk_delete_list">Eliminar la lista</string>
|
||||
<string name="sk_delete_list_confirm">¿Está seguro de que desea eliminar esta lista\?</string>
|
||||
<string name="sk_edit_list_title">Editar la lista</string>
|
||||
<string name="sk_your_lists">Tus listas</string>
|
||||
<string name="sk_list_replies_policy_list">Lista de miembros</string>
|
||||
<string name="sk_timeline_home">Inicio</string>
|
||||
<string name="sk_timeline_federated">Federación</string>
|
||||
<string name="sk_timeline_local">Local</string>
|
||||
</resources>
|
||||
@@ -36,12 +36,12 @@
|
||||
<string name="sk_translated_using">%s-ekin itzulia</string>
|
||||
<string name="sk_post_language">Hizkuntza: %s</string>
|
||||
<string name="sk_language_name">%s (%s)</string>
|
||||
<string name="sk_bookmark_as">Beste kontu bateko laster-marka</string>
|
||||
<string name="sk_bookmark_as">Beste kontu baten laster-marka</string>
|
||||
<string name="sk_bookmarked_as">%s bezala laster-markara eramana</string>
|
||||
<string name="sk_already_bookmarked">Dagoeneko laster-marka da</string>
|
||||
<string name="sk_favorite_as">Beste kontu bateko gogokoa</string>
|
||||
<string name="sk_favorite_as">Beste kontu baten gogokoa</string>
|
||||
<string name="sk_favorited_as">%s bezela dago gogokoetan</string>
|
||||
<string name="sk_reblog_as">Beste kontu batetik bultzatua</string>
|
||||
<string name="sk_reblog_as">Beste kontu batekin bultzatua</string>
|
||||
<string name="sk_reblogged_as">%s bezela bultzatua</string>
|
||||
<string name="sk_already_reblogged">Dagoeneko bultzatua izan da</string>
|
||||
<string name="sk_reply_as">Erantzun beste kontu batekin</string>
|
||||
@@ -70,7 +70,7 @@
|
||||
<string name="sk_settings_publish_button_text">Argitaratze botoiaren testua</string>
|
||||
<string name="sk_settings_publish_button_text_title">Pertsonalizatu argitaratze botoiaren testua</string>
|
||||
<string name="sk_settings_translation_availability_note_available">%s-k itzulpena onartzen du!</string>
|
||||
<string name="sk_settings_translation_availability_note_unavailable">%s ez da itzulpena onartzen duten hizkuntzen artean ageri.</string>
|
||||
<string name="sk_settings_translation_availability_note_unavailable">%s ez da itzulpena onartzen duten instantzien artean ageri.</string>
|
||||
<string name="sk_clear_all_notifications">Ezabatu jakinarazpen guztiak</string>
|
||||
<string name="sk_clear_all_notifications_confirm_action">Ezabatu dena</string>
|
||||
<string name="sk_clear_all_notifications_confirm">Ziur al zaude jakinarazpen guztiak ezabatu nahi dituzula\?</string>
|
||||
@@ -101,4 +101,27 @@
|
||||
<string name="sk_settings_translate_only_opened">Irekitako argitalpenak soilik itzuli</string>
|
||||
<string name="sk_already_favorited">Dagoeneko gogokoen artean dago</string>
|
||||
<string name="sk_settings_uniform_icon_for_notifications">Ikono berdina jakinarazpen guztietarako</string>
|
||||
<string name="sk_forward_report_to">%s-(e)ri birbidali</string>
|
||||
<string name="sk_unsent_posts">Bidali gabeko argitalpenak</string>
|
||||
<string name="sk_draft">Zirriborroa</string>
|
||||
<string name="sk_schedule">Programatu</string>
|
||||
<string name="sk_confirm_delete_draft_title">Ezabatu zirriborroa</string>
|
||||
<string name="sk_confirm_delete_draft">Ziur al zaude zirriborro hau ezabatu nahi duzula\?</string>
|
||||
<string name="sk_confirm_delete_scheduled_post_title">Ezabatu programatutako argitalpena</string>
|
||||
<string name="sk_confirm_delete_scheduled_post">Ziur al zaude programatutako argitalpena ezabatu nahi duzula\?</string>
|
||||
<string name="sk_draft_or_schedule">Zirriborrotara bidali edo programatu</string>
|
||||
<string name="sk_compose_draft">Argitalpena zirriborro bezala gordeko da.</string>
|
||||
<string name="sk_compose_scheduled">Honentzako programatu</string>
|
||||
<string name="sk_draft_saved">Zirriborroa gorde da</string>
|
||||
<string name="sk_post_scheduled">Argitalpena programatu da</string>
|
||||
<string name="sk_scheduled_too_soon_title">Programatze denbora murritzegia da</string>
|
||||
<string name="sk_scheduled_too_soon">Argitalpena gutxienez 10 minutu lehenago programatu behar da.</string>
|
||||
<string name="sk_confirm_save_changes">Aldaketak gorde nahi dituzu\?</string>
|
||||
<string name="sk_confirm_save_draft">Zirriborroa gorde nahi duzu\?</string>
|
||||
<string name="sk_mark_as_draft">Markatu zirriborro gisa</string>
|
||||
<string name="sk_schedule_post">Argitalpena programatu</string>
|
||||
<string name="sk_schedule_or_draft">Programatu edo zirriborro egin</string>
|
||||
<string name="sk_compose_no_schedule">Ez programatu</string>
|
||||
<string name="sk_compose_no_draft">Ez egin zirriborrorik</string>
|
||||
<string name="sk_settings_reduce_motion">Animazioen mugimenduak gutxitu</string>
|
||||
</resources>
|
||||
@@ -25,7 +25,7 @@
|
||||
<string name="sk_follow_requests">Suivre les demandes</string>
|
||||
<string name="sk_accept_follow_request">Accepter la demande de suivi</string>
|
||||
<string name="sk_reject_follow_request">Refuser la demande de suivi</string>
|
||||
<string name="sk_lists_with_user">Listes avec %s</string>
|
||||
<string name="sk_lists_with_user">Modifier les listes avec %s</string>
|
||||
<string name="sk_settings_always_reveal_content_warnings">Toujours afficher les avertissements de contenu</string>
|
||||
<string name="sk_disable_marquee">Désactiver le défilement du texte dans les barres de titre</string>
|
||||
<string name="sk_settings_contribute">Contribuez à Moshidon</string>
|
||||
@@ -77,7 +77,7 @@
|
||||
<string name="sk_enable_delete_notifications">Activer la suppression des notifications</string>
|
||||
<string name="sk_settings_publish_button_text_title">Personnaliser le texte du bouton Publier</string>
|
||||
<string name="sk_settings_publish_button_text">Texte du bouton Publier</string>
|
||||
<string name="sk_settings_hide_translate_in_timeline">Masquer le bouton de traduction dans la timeline</string>
|
||||
<string name="sk_settings_translate_only_opened">Masquer le bouton de traduction dans la timeline</string>
|
||||
<string name="sk_settings_translation_availability_note_available">%s prend en charge la traduction !</string>
|
||||
<string name="sk_settings_translation_availability_note_unavailable">%s ne semble pas prendre en charge la traduction.</string>
|
||||
<string name="sk_clear_all_notifications_confirm">Voulez-vous vraiment supprimer toutes les notifications \?</string>
|
||||
@@ -91,7 +91,7 @@
|
||||
<string name="sk_loading_resource_on_instance_title">Rechercher sur %s</string>
|
||||
<string name="sk_open_with_account">Ouvrir avec un autre compte</string>
|
||||
<string name="sk_resource_not_found">La ressource est introuvable</string>
|
||||
<string name="sk_favorite_as">Favoris d\'un autre compte</string>
|
||||
<string name="sk_favorite_as">Mettre en favoris avec un autre compte</string>
|
||||
<string name="sk_already_bookmarked">Déjà mis en signet</string>
|
||||
<string name="sk_already_favorited">Déjà mis en favori</string>
|
||||
<string name="sk_reblogged_as">Reposté en tant que %s</string>
|
||||
@@ -99,8 +99,8 @@
|
||||
<string name="sk_bookmarked_as">Ajouté aux signets en tant que %s</string>
|
||||
<string name="sk_favorited_as">Ajouté aux favoris en tant que %s</string>
|
||||
<string name="sk_reply_as">Répondre avec un autre compte</string>
|
||||
<string name="sk_bookmark_as">Mettre en signet sur un autre compte</string>
|
||||
<string name="sk_reblog_as">Reposter depuis un autre compte</string>
|
||||
<string name="sk_bookmark_as">Mettre en signet avec un autre compte</string>
|
||||
<string name="sk_reblog_as">Reposter avec un autre compte</string>
|
||||
<string name="sk_settings_uniform_icon_for_notifications">Icône uniforme pour toutes les notifications</string>
|
||||
<string name="sk_forward_report_to">Transférer à %s</string>
|
||||
<string name="sk_unsent_posts">Messages non envoyés</string>
|
||||
@@ -110,9 +110,9 @@
|
||||
<string name="sk_confirm_delete_scheduled_post">Voulez-vous vraiment supprimer ce message planifié \?</string>
|
||||
<string name="sk_schedule">Planifier</string>
|
||||
<string name="sk_confirm_delete_scheduled_post_title">Supprimer le message planifié</string>
|
||||
<string name="sk_draft_or_schedule">Rédiger ou planifier</string>
|
||||
<string name="sk_draft_or_schedule">Rédiger un brouillon ou planifier</string>
|
||||
<string name="sk_compose_draft">Le message sera enregistré en tant que brouillon.</string>
|
||||
<string name="sk_compose_scheduled">Planifié pour</string>
|
||||
<string name="sk_compose_scheduled">Planifié pour le</string>
|
||||
<string name="sk_draft_saved">Brouillon enregistré</string>
|
||||
<string name="sk_post_scheduled">Message planifié</string>
|
||||
<string name="sk_scheduled_too_soon_title">L\'heure prévue est trop proche</string>
|
||||
@@ -121,4 +121,27 @@
|
||||
<string name="sk_mark_as_draft">Marquer comme brouillon</string>
|
||||
<string name="sk_schedule_post">Planifier le message</string>
|
||||
<string name="sk_confirm_save_changes">Sauvegarder les modifications \?</string>
|
||||
<string name="sk_compose_no_schedule">Ne pas planifier</string>
|
||||
<string name="sk_compose_no_draft">Ne pas marquer comme brouillon</string>
|
||||
<string name="sk_schedule_or_draft">Planifier ou rédiger un brouillon</string>
|
||||
<string name="sk_settings_reduce_motion">Réduire le mouvement dans les animations</string>
|
||||
<string name="sk_mark_as_read">Marquer comme lu</string>
|
||||
<string name="sk_settings_about_instance">À propos de l\'instance</string>
|
||||
<string name="sk_create">Créer</string>
|
||||
<string name="sk_create_list_title">Créer une liste</string>
|
||||
<string name="sk_list_name_hint">Nom de la liste</string>
|
||||
<string name="sk_list_replies_policy">Afficher les réponses à</string>
|
||||
<string name="sk_list_replies_policy_list">membres de la liste</string>
|
||||
<string name="sk_list_replies_policy_followed">utilisateurs suivis</string>
|
||||
<string name="sk_list_replies_policy_none">personne</string>
|
||||
<string name="sk_delete_list">Supprimer la liste</string>
|
||||
<string name="sk_edit_list_title">Modifier la liste</string>
|
||||
<string name="sk_announcements">Annonces</string>
|
||||
<string name="sk_settings_single_notification">Afficher une seule notification</string>
|
||||
<string name="sk_delete_list_confirm">Êtes-vous sûr de vouloir supprimer la liste \"%s\" \?</string>
|
||||
<string name="sk_your_lists">Vos listes</string>
|
||||
<string name="sk_timeline_federated">Fédération</string>
|
||||
<string name="sk_timeline_local">Communauté</string>
|
||||
<string name="sk_timeline_home">Accueil</string>
|
||||
<string name="sk_recent_searches_placeholder">Tapez quelque chose pour commencer la recherche</string>
|
||||
</resources>
|
||||
@@ -1,3 +1,38 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
</resources>
|
||||
<string name="sk_app_name">Moshidon</string>
|
||||
<string name="sk_delete_and_redraft">Eliminar e rescribir</string>
|
||||
<string name="sk_confirm_delete_and_redraft">Tes a certeza de querere eliminar e rescribir esta publicación\?</string>
|
||||
<string name="sk_pinned_posts">Fixado</string>
|
||||
<string name="sk_confirm_delete_and_redraft_title">Elimina e rescribe a Publicación</string>
|
||||
<string name="sk_pin_post">Fixar no perfil</string>
|
||||
<string name="sk_confirm_pin_post_title">Fixar publicación ao perfil</string>
|
||||
<string name="sk_confirm_pin_post">Queres fixar esta publicación ao teu perfil\?</string>
|
||||
<string name="sk_pinning">Fixando a publicación…</string>
|
||||
<string name="sk_unpin_post">Desafixar do perfil</string>
|
||||
<string name="sk_confirm_unpin_post_title">Desafixar publicación do perfil</string>
|
||||
<string name="sk_confirm_unpin_post">Tes a certeza de querer desafixar esta publicación\?</string>
|
||||
<string name="sk_unpinning">Desafixando publicación…</string>
|
||||
<string name="sk_image_description">Descrición da imaxe</string>
|
||||
<string name="sk_lists_with_user">Editar listas con %s</string>
|
||||
<string name="sk_visibility_unlisted">Non listado</string>
|
||||
<string name="sk_settings_show_replies">Mostrar respostas</string>
|
||||
<string name="sk_settings_show_boosts">Mostrar promocións</string>
|
||||
<string name="sk_settings_load_new_posts">Cargar automáticamente novas publicacións</string>
|
||||
<string name="sk_settings_show_interaction_counts">Mostrar contadores de interaccións</string>
|
||||
<string name="sk_settings_app_version">Moshidon v%1$s (%2$d)</string>
|
||||
<string name="sk_mark_media_as_sensitive">Marcar multimedia como sensible</string>
|
||||
<string name="sk_user_post_notifications_on">Acender notificación de publicación para %s</string>
|
||||
<string name="sk_user_post_notifications_off">Apagar notificación de publicación para %s</string>
|
||||
<string name="sk_federated_timeline">Federación</string>
|
||||
<string name="sk_federated_timeline_info_banner">Estas son as publicacións máis recentes das persoas da túa federación.</string>
|
||||
<string name="sk_update_available">Moshidon %s está lista para descargar.</string>
|
||||
<string name="sk_update_ready">Moshidon %s foi descargada e está lista para instalar.</string>
|
||||
<string name="sk_check_for_update">Comprobar actualizacións</string>
|
||||
<string name="sk_no_update_available">Non hai actualizacións</string>
|
||||
<string name="sk_list_timelines">Listas</string>
|
||||
<string name="sk_follow_requests">Solicitudes de seguimento</string>
|
||||
<string name="sk_accept_follow_request">Aceptar solicitude</string>
|
||||
<string name="sk_reject_follow_request">Rexeitar solicitude</string>
|
||||
<string name="sk_settings_always_reveal_content_warnings">Mostrar sempre o contido con avisos</string>
|
||||
</resources>
|
||||
@@ -1,3 +1,127 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
</resources>
|
||||
<string name="sk_notification_type_status">Hozzászólások</string>
|
||||
<string name="sk_notify_posts">Postai értesítések</string>
|
||||
<string name="sk_translate_post">Lefordítani</string>
|
||||
<string name="sk_post_language">Nyelv: %s</string>
|
||||
<string name="sk_clear_recent_languages">Nemrég használt nyelvek törlése</string>
|
||||
<string name="sk_welcome_title">Üdvözöljük!</string>
|
||||
<string name="sk_example_domain">példa.social</string>
|
||||
<string name="sk_confirm_pin_post">Szeretné ezt a bejegyzést a profiljához tűzni\?</string>
|
||||
<string name="sk_confirm_unpin_post">Biztos vagy benne, hogy vissza akarod törölni ezt a posztot\?</string>
|
||||
<string name="sk_pinned_posts">Tűzött</string>
|
||||
<string name="sk_delete_and_redraft">Törlés és újraszövegezés</string>
|
||||
<string name="sk_pin_post">Pin a profilhoz</string>
|
||||
<string name="sk_confirm_pin_post_title">Hozzászólás rögzítése a profilhoz</string>
|
||||
<string name="sk_pinning">Pinning poszt…</string>
|
||||
<string name="sk_unpin_post">Unpin a profilból</string>
|
||||
<string name="sk_confirm_unpin_post_title">Hozzászólás feloldása a profilból</string>
|
||||
<string name="sk_unpinning">Unpinning poszt…</string>
|
||||
<string name="sk_settings_show_replies">Válaszok megjelenítése</string>
|
||||
<string name="sk_visibility_unlisted">Felsorolatlan</string>
|
||||
<string name="sk_app_name">Moshidon</string>
|
||||
<string name="sk_settings_load_new_posts">Automatikusan töltse be az új hozzászólásokat</string>
|
||||
<string name="sk_settings_app_version">Moshidon v%1$s (%2$d)</string>
|
||||
<string name="sk_user_post_notifications_on">Bekapcsoltuk a postai értesítéseket %s számára</string>
|
||||
<string name="sk_user_post_notifications_off">Kikapcsoltam a postai értesítéseket %s számára</string>
|
||||
<string name="sk_mark_media_as_sensitive">A média érzékenynek jelölése</string>
|
||||
<string name="sk_federated_timeline">Föderáció</string>
|
||||
<string name="sk_update_ready">A Moshidon %s letöltődött és telepítésre kész.</string>
|
||||
<string name="sk_disable_marquee">A görgethető szöveg kikapcsolása a címsorokban</string>
|
||||
<string name="sk_check_for_update">Frissítés ellenőrzése</string>
|
||||
<string name="sk_no_update_available">Nincs frissítés elérhető</string>
|
||||
<string name="sk_list_timelines">Listák</string>
|
||||
<string name="sk_follow_requests">Kérések követése</string>
|
||||
<string name="sk_accept_follow_request">Követési kérés elfogadása</string>
|
||||
<string name="sk_lists_with_user">%s-t tartalmazó listák</string>
|
||||
<string name="sk_settings_always_reveal_content_warnings">Mindig fedje fel a tartalmi figyelmeztetéseket</string>
|
||||
<string name="sk_settings_contribute">Hozzájárulni Moshidon</string>
|
||||
<string name="sk_settings_show_federated_timeline">Összevont idővonal megjelenítése</string>
|
||||
<string name="sk_confirm_clear_recent_languages">Biztos, hogy törölni szeretné a nemrég használt nyelveket\?</string>
|
||||
<string name="sk_available_languages">Elérhető nyelvek</string>
|
||||
<string name="sk_language_name">%s (%s)</string>
|
||||
<string name="sk_settings_translate_only_opened">Csak a megnyitott hozzászólások lefordítása</string>
|
||||
<string name="sk_already_reblogged">Már reblogoltam</string>
|
||||
<string name="sk_reblogged_as">Átlogolva mint %s</string>
|
||||
<string name="sk_reblog_as">Reblog más fiókkal</string>
|
||||
<string name="sk_already_favorited">Már kedvelt</string>
|
||||
<string name="sk_favorited_as">Kedvelt mint %s</string>
|
||||
<string name="sk_favorite_as">Kedvenc más fiókkal</string>
|
||||
<string name="sk_already_bookmarked">Már könyvjelzővel van ellátva</string>
|
||||
<string name="sk_bookmarked_as">Könyvjelzőként %s</string>
|
||||
<string name="sk_bookmark_as">Könyvjelző más fiókkal</string>
|
||||
<string name="sk_settings_uniform_icon_for_notifications">Egységes ikon minden értesítéshez</string>
|
||||
<string name="sk_reply_as">Válasz más fiókkal</string>
|
||||
<string name="sk_translate_show_original">Eredeti megjelenítése</string>
|
||||
<string name="sk_translated_using">Fordítás %s használatával</string>
|
||||
<string name="sk_settings_profile">Profil beállítása</string>
|
||||
<string name="sk_settings_posting">Postázási preferenciák</string>
|
||||
<string name="sk_settings_filters">Szűrők konfigurálása</string>
|
||||
<string name="sk_settings_auth">Biztonsági beállítások</string>
|
||||
<string name="sk_settings_rules">Szabályok</string>
|
||||
<string name="sk_settings_donate">Adományozni</string>
|
||||
<string name="sk_settings_color_palette">Színek palettája</string>
|
||||
<string name="sk_color_palette_material3">Rendszer</string>
|
||||
<string name="sk_color_palette_green">Zöld</string>
|
||||
<string name="sk_color_palette_blue">Kék</string>
|
||||
<string name="sk_color_palette_brown">Barna</string>
|
||||
<string name="sk_color_palette_red">Piros</string>
|
||||
<string name="sk_color_palette_yellow">Sárga</string>
|
||||
<string name="sk_color_palette_pink">Rózsaszín</string>
|
||||
<string name="sk_color_palette_purple">Lila</string>
|
||||
<string name="sk_delete_notification_confirm">Biztos, hogy törölni szeretné ezt az értesítést\?</string>
|
||||
<string name="sk_enable_delete_notifications">Értesítések törlésének engedélyezése</string>
|
||||
<string name="sk_settings_publish_button_text">Közzététel gomb szövege</string>
|
||||
<string name="sk_settings_publish_button_text_title">Közzététel gomb szövegének testreszabása</string>
|
||||
<string name="sk_delete_notification">Értesítés törlése</string>
|
||||
<string name="sk_delete_notification_confirm_action">Értesítés törlése</string>
|
||||
<string name="sk_settings_translation_availability_note_available">%s támogatja a fordítást!</string>
|
||||
<string name="sk_settings_translation_availability_note_unavailable">Úgy tűnik, hogy a %s nem támogatja a fordítást.</string>
|
||||
<string name="sk_clear_all_notifications_confirm">Biztos, hogy törölni szeretné az összes értesítést\?</string>
|
||||
<string name="sk_clear_all_notifications">Minden értesítés törlése</string>
|
||||
<string name="sk_clear_all_notifications_confirm_action">Törölje az összes</string>
|
||||
<string name="sk_loading_fediverse_resource_title">Utánanézek a Fediverse-en</string>
|
||||
<string name="sk_reblog_with_visibility">Reblog láthatósággal</string>
|
||||
<string name="sk_quote_post">Poszt erről</string>
|
||||
<string name="sk_undo_reblog">Reblog visszavonása</string>
|
||||
<string name="sk_copy_link_to_post">Link másolása a bejegyzéshez</string>
|
||||
<string name="sk_hashtags_you_follow">Követett hashtagek</string>
|
||||
<string name="sk_loading_resource_on_instance_title">Utánanézek a %s oldalon</string>
|
||||
<string name="sk_resource_not_found">Az erőforrás nem található</string>
|
||||
<string name="sk_open_with_account">Más számlával együtt nyitva</string>
|
||||
<string name="sk_scheduled_too_soon">A bejegyzést legalább 10 perccel későbbre kell időzíteni.</string>
|
||||
<string name="sk_confirm_delete_draft">Biztos vagy benne, hogy törölni akarod ezt a vázlatos hozzászólást\?</string>
|
||||
<string name="sk_confirm_delete_scheduled_post">Biztos, hogy törölni akarod ezt a tervezett hozzászólást\?</string>
|
||||
<string name="sk_compose_draft">A hozzászólás tervezetként lesz elmentve.</string>
|
||||
<string name="sk_scheduled_too_soon_title">A tervezett időpont túl korai</string>
|
||||
<string name="sk_post_scheduled">Tervezett poszt</string>
|
||||
<string name="sk_draft_saved">Tervezet mentve</string>
|
||||
<string name="sk_compose_scheduled">Beütemezve a</string>
|
||||
<string name="sk_draft_or_schedule">Tervezet vagy ütemterv</string>
|
||||
<string name="sk_confirm_delete_scheduled_post_title">Időzített bejegyzés törlése</string>
|
||||
<string name="sk_confirm_delete_draft_title">Tervezet törlése</string>
|
||||
<string name="sk_schedule">Ütemterv</string>
|
||||
<string name="sk_draft">Tervezet</string>
|
||||
<string name="sk_forward_report_to">Továbbítás %s-re</string>
|
||||
<string name="sk_unsent_posts">Nem elküldött hozzászólások</string>
|
||||
<string name="sk_schedule_post">Ütemterv posta</string>
|
||||
<string name="sk_mark_as_draft">Vázlatként megjelölni</string>
|
||||
<string name="sk_confirm_save_changes">Változások mentése\?</string>
|
||||
<string name="sk_confirm_save_draft">Tervezet mentése\?</string>
|
||||
<string name="sk_compose_no_draft">Ne draftoljon</string>
|
||||
<string name="sk_compose_no_schedule">Ne ütemezzen</string>
|
||||
<string name="sk_schedule_or_draft">Ütemterv vagy tervezet</string>
|
||||
<string name="sk_settings_reduce_motion">Mozgás csökkentése animációkban</string>
|
||||
<string name="sk_welcome_text">A cápa tiszteleg előtted! A kezdéshez kérjük, adja meg az alábbiakban az otthoni domain nevét.</string>
|
||||
<string name="sk_federated_timeline_info_banner">Ezek a szövetséged tagjainak legfrissebb bejegyzései.</string>
|
||||
<string name="sk_confirm_delete_and_redraft">Biztos, hogy törölni és újrafogalmazni akarod ezt a hozzászólást\?</string>
|
||||
<string name="sk_update_available">Moshidon %s készen áll a letöltésre.</string>
|
||||
<string name="sk_confirm_delete_and_redraft_title">Törlés és újraszövegezés Hozzászólás</string>
|
||||
<string name="sk_image_description">Kép leírása</string>
|
||||
<string name="sk_settings_show_boosts">Show boostok</string>
|
||||
<string name="sk_settings_show_interaction_counts">Interakciószámok megjelenítése</string>
|
||||
<string name="sk_reject_follow_request">Követési kérelem elutasítása</string>
|
||||
<string name="sk_poll_allow_multiple">Több választási lehetőség engedélyezése</string>
|
||||
<string name="sk_tabs_disable_swipe">Lapok közötti lapozás letiltása</string>
|
||||
<string name="sk_settings_about">Az alkalmazásról</string>
|
||||
</resources>
|
||||
@@ -34,31 +34,31 @@
|
||||
<string name="sk_visibility_unlisted">Tidak terdaftar</string>
|
||||
<string name="sk_mark_media_as_sensitive">Tandai media sebagai sensitif</string>
|
||||
<string name="sk_follow_requests">Permintaan pengikut</string>
|
||||
<string name="sk_lists_with_user">Daftar dengan %s</string>
|
||||
<string name="sk_lists_with_user">Sunting daftar dengan %s</string>
|
||||
<string name="sk_settings_always_reveal_content_warnings">Selalu ungkap peringatan konten</string>
|
||||
<string name="sk_disable_marquee">Nonaktifkan teks bergulir dalam bilah judul</string>
|
||||
<string name="sk_settings_show_federated_timeline">Tampilkan lini masa federasi</string>
|
||||
<string name="sk_notification_type_status">Kiriman</string>
|
||||
<string name="sk_notify_posts">Notifikasi kiriman</string>
|
||||
<string name="sk_settings_color_picker">Warna tema</string>
|
||||
<string name="sk_color_theme_pink">Merah Muda</string>
|
||||
<string name="sk_color_theme_purple">Ungu</string>
|
||||
<string name="sk_color_theme_green">Hijau</string>
|
||||
<string name="sk_color_theme_blue">Biru</string>
|
||||
<string name="sk_color_theme_brown">Cokelat</string>
|
||||
<string name="sk_color_theme_yellow">Kuning</string>
|
||||
<string name="sk_settings_color_palette">Warna tema</string>
|
||||
<string name="sk_color_palette_pink">Merah Muda</string>
|
||||
<string name="sk_color_palette_purple">Ungu</string>
|
||||
<string name="sk_color_palette_green">Hijau</string>
|
||||
<string name="sk_color_palette_blue">Biru</string>
|
||||
<string name="sk_color_palette_brown">Cokelat</string>
|
||||
<string name="sk_color_palette_yellow">Kuning</string>
|
||||
<string name="sk_poll_allow_multiple">Perbolehkan beberapa pilihan</string>
|
||||
<string name="sk_clear_recent_languages">Hapus bahasa terkini yang digunakan</string>
|
||||
<string name="sk_welcome_title">Selamat datang!</string>
|
||||
<string name="sk_confirm_clear_recent_languages">Apakah Anda yakin ingin menghapus bahasa terkini yang Anda gunakan\?</string>
|
||||
<string name="sk_color_theme_material3">Sistem</string>
|
||||
<string name="sk_color_palette_material3">Sistem</string>
|
||||
<string name="sk_available_languages">Bahasa yang tersedia</string>
|
||||
<string name="sk_language_name">%s (%s)</string>
|
||||
<string name="sk_translate_post">Terjemahkan</string>
|
||||
<string name="sk_translate_show_original">Tampilkan yang asli</string>
|
||||
<string name="sk_post_language">Bahasa: %s</string>
|
||||
<string name="sk_example_domain">contoh.social</string>
|
||||
<string name="sk_color_theme_red">Merah</string>
|
||||
<string name="sk_color_palette_red">Merah</string>
|
||||
<string name="sk_translated_using">Diterjemahkan menggunakan %s</string>
|
||||
<string name="sk_welcome_text">Hiu menyapamu! Untuk memulai, silakan memasukkan nama domain instansi Anda di bawah.</string>
|
||||
<string name="sk_tabs_disable_swipe">Nonaktifkan mengusap antara tab</string>
|
||||
@@ -67,7 +67,7 @@
|
||||
<string name="sk_enable_delete_notifications">Aktifkan menghapus notifikasi</string>
|
||||
<string name="sk_settings_publish_button_text">Teks tombol Terbitkan</string>
|
||||
<string name="sk_settings_publish_button_text_title">Ubah teks tombol Terbitkan</string>
|
||||
<string name="sk_settings_hide_translate_in_timeline">Sembunyikan tombol terjemahkan di lini masa</string>
|
||||
<string name="sk_settings_translate_only_opened">Sembunyikan tombol terjemahkan di lini masa</string>
|
||||
<string name="sk_settings_translation_availability_note_available">%s mendukung penerjemahan!</string>
|
||||
<string name="sk_settings_translation_availability_note_unavailable">%s sepertinya tidak mendukung penerjemahan.</string>
|
||||
<string name="sk_clear_all_notifications_confirm">Apakah Anda yakin ingin menghapus semua notifikasi\?</string>
|
||||
@@ -95,12 +95,12 @@
|
||||
<string name="sk_already_bookmarked">Sudah dimarkahi</string>
|
||||
<string name="sk_favorited_as">Difavorit sebagai %s</string>
|
||||
<string name="sk_already_favorited">Sudah difavorit</string>
|
||||
<string name="sk_reblog_as">Bagikan dari akun lain</string>
|
||||
<string name="sk_reblog_as">Bagikan dengan akun lain</string>
|
||||
<string name="sk_reblogged_as">Dibagikan sebagai %s</string>
|
||||
<string name="sk_already_reblogged">Sudah dibagikan</string>
|
||||
<string name="sk_reply_as">Balas dengan akun lain</string>
|
||||
<string name="sk_bookmark_as">Markahi dalam akun lain</string>
|
||||
<string name="sk_favorite_as">Favorit dari akun lain</string>
|
||||
<string name="sk_bookmark_as">Markahi dengan akun lain</string>
|
||||
<string name="sk_favorite_as">Favorit dengan akun lain</string>
|
||||
<string name="sk_settings_uniform_icon_for_notifications">Ikon yang sama untuk semua notifikasi</string>
|
||||
<string name="sk_unsent_posts">Kiriman yang belum dikirim</string>
|
||||
<string name="sk_draft">Draf</string>
|
||||
@@ -123,4 +123,27 @@
|
||||
<string name="sk_mark_as_draft">Tandai sebagai draf</string>
|
||||
<string name="sk_schedule_post">Jadwalkan kiriman</string>
|
||||
<string name="sk_confirm_save_draft">Simpan draf\?</string>
|
||||
<string name="sk_compose_no_schedule">Jangan dijadwalkan</string>
|
||||
<string name="sk_compose_no_draft">Jangan didraf</string>
|
||||
<string name="sk_schedule_or_draft">Jadwalkan atau draf</string>
|
||||
<string name="sk_settings_reduce_motion">Kurangi gerakan dalam animasi</string>
|
||||
<string name="sk_list_replies_policy">Tampilkan balasan ke</string>
|
||||
<string name="sk_announcements">Pengumuman</string>
|
||||
<string name="sk_mark_as_read">Tandai sebagai dibaca</string>
|
||||
<string name="sk_settings_about_instance">Tentang server</string>
|
||||
<string name="sk_settings_single_notification">Hanya tampilkan satu notifikasi</string>
|
||||
<string name="sk_create">Buat</string>
|
||||
<string name="sk_create_list_title">Buat daftar</string>
|
||||
<string name="sk_list_name_hint">Nama daftar</string>
|
||||
<string name="sk_list_replies_policy_list">anggota daftar</string>
|
||||
<string name="sk_list_replies_policy_followed">pengguna mengikuti</string>
|
||||
<string name="sk_list_replies_policy_none">tidak ada siapa pun</string>
|
||||
<string name="sk_delete_list">Hapus daftar</string>
|
||||
<string name="sk_delete_list_confirm">Apakah Anda yakin ingin menghapus daftar “%s”\?</string>
|
||||
<string name="sk_edit_list_title">Sunting daftar</string>
|
||||
<string name="sk_your_lists">Daftar Anda</string>
|
||||
<string name="sk_timeline_federated">Federasi</string>
|
||||
<string name="sk_timeline_home">Beranda</string>
|
||||
<string name="sk_timeline_local">Lokal</string>
|
||||
<string name="sk_recent_searches_placeholder">Ketik sesuatu untuk memulai mencari</string>
|
||||
</resources>
|
||||
@@ -42,7 +42,7 @@
|
||||
<string name="sk_no_update_available">Non ci sono aggiornamenti disponibili</string>
|
||||
<string name="sk_list_timelines">Liste</string>
|
||||
<string name="sk_settings_always_reveal_content_warnings">Apri sempre contenuti segnalati come sensibili</string>
|
||||
<string name="sk_lists_with_user">Liste con %s</string>
|
||||
<string name="sk_lists_with_user">Modifica liste con %s</string>
|
||||
<string name="sk_settings_contribute">Contribuisci a Moshidon</string>
|
||||
<string name="sk_settings_show_federated_timeline">Mostra timeline federata</string>
|
||||
<string name="sk_disable_marquee">Disabilita scorrimento titoli</string>
|
||||
@@ -60,4 +60,86 @@
|
||||
<string name="sk_available_languages">Lingue disponibili</string>
|
||||
<string name="sk_welcome_text">Lo squalo ti saluta! Per iniziare inserisci il dominio dell\'istanza a cui sei iscritto.</string>
|
||||
<string name="sk_color_palette_material3">Sistema</string>
|
||||
<string name="sk_timeline_local">Locale</string>
|
||||
<string name="sk_timeline_federated">Federazione</string>
|
||||
<string name="sk_bookmark_as">Salva con un altro account</string>
|
||||
<string name="sk_bookmarked_as">Salvato come %s</string>
|
||||
<string name="sk_favorite_as">Inserisci tra i preferiti con un altro account</string>
|
||||
<string name="sk_favorited_as">Inserito tra i preferiti come %s</string>
|
||||
<string name="sk_already_favorited">Già tra i preferiti</string>
|
||||
<string name="sk_reblog_as">Esegui il reblog con un altro account</string>
|
||||
<string name="sk_already_reblogged">Reblog già eseguito</string>
|
||||
<string name="sk_settings_profile">Imposta il profilo</string>
|
||||
<string name="sk_settings_posting">Preferenze dei post</string>
|
||||
<string name="sk_settings_filters">Configura filtri</string>
|
||||
<string name="sk_settings_rules">Regole</string>
|
||||
<string name="sk_settings_about">Riguardo all\'app</string>
|
||||
<string name="sk_settings_donate">Dona</string>
|
||||
<string name="sk_delete_notification_confirm_action">Elimina notifica</string>
|
||||
<string name="sk_enable_delete_notifications">Abilita l\'eliminazione delle notifiche</string>
|
||||
<string name="sk_settings_publish_button_text">Testo del pulsante Pubblica</string>
|
||||
<string name="sk_settings_publish_button_text_title">Personalizza il testo del pulsante Pubblica</string>
|
||||
<string name="sk_settings_translation_availability_note_available">%s supporta la traduzione!</string>
|
||||
<string name="sk_settings_translation_availability_note_unavailable">Sembra che %s non supporti la traduzione.</string>
|
||||
<string name="sk_clear_all_notifications">Elimina tutte le notifiche</string>
|
||||
<string name="sk_clear_all_notifications_confirm_action">Elimina tutto</string>
|
||||
<string name="sk_clear_all_notifications_confirm">Sei sicuro di volere eliminare tutte le notifiche\?</string>
|
||||
<string name="sk_loading_fediverse_resource_title">Cercando nel Fediverso</string>
|
||||
<string name="sk_quote_post">Crea un post riguardo a questo</string>
|
||||
<string name="sk_undo_reblog">Annulla il reblog</string>
|
||||
<string name="sk_reblog_with_visibility">Esegui il reblog con visibilità</string>
|
||||
<string name="sk_copy_link_to_post">Copia il link del post</string>
|
||||
<string name="sk_open_with_account">Apri con un altro account</string>
|
||||
<string name="sk_resource_not_found">La risorsa non può essere trovata</string>
|
||||
<string name="sk_draft">Bozza</string>
|
||||
<string name="sk_schedule">Programma</string>
|
||||
<string name="sk_confirm_delete_draft_title">Elimina bozza</string>
|
||||
<string name="sk_draft_or_schedule">Bozza o programma</string>
|
||||
<string name="sk_compose_scheduled">Programmato per</string>
|
||||
<string name="sk_draft_saved">Bozza salvata</string>
|
||||
<string name="sk_forward_report_to">Inoltra a %s</string>
|
||||
<string name="sk_confirm_delete_scheduled_post_title">Elimina post programmato</string>
|
||||
<string name="sk_confirm_delete_scheduled_post">Sei sicuro di volere eliminare questo post programmato\?</string>
|
||||
<string name="sk_compose_draft">Il post verrà salvato come bozza.</string>
|
||||
<string name="sk_post_scheduled">Post programmato</string>
|
||||
<string name="sk_scheduled_too_soon_title">L\'orario programmato è troppo presto</string>
|
||||
<string name="sk_mark_as_draft">Segna come bozza</string>
|
||||
<string name="sk_schedule_post">Programma post</string>
|
||||
<string name="sk_compose_no_schedule">Non programmare</string>
|
||||
<string name="sk_compose_no_draft">Non tenere in bozza</string>
|
||||
<string name="sk_announcements">Annunci</string>
|
||||
<string name="sk_mark_as_read">Segna come letto</string>
|
||||
<string name="sk_settings_single_notification">Mostra solo una notifica</string>
|
||||
<string name="sk_create">Crea</string>
|
||||
<string name="sk_create_list_title">Crea lista</string>
|
||||
<string name="sk_list_name_hint">Nome della lista</string>
|
||||
<string name="sk_list_replies_policy">Mostra risposte a</string>
|
||||
<string name="sk_list_replies_policy_list">membri della lista</string>
|
||||
<string name="sk_list_replies_policy_followed">utenti seguiti</string>
|
||||
<string name="sk_list_replies_policy_none">nessuno</string>
|
||||
<string name="sk_delete_list">Elimina lista</string>
|
||||
<string name="sk_edit_list_title">Modifica lista</string>
|
||||
<string name="sk_your_lists">Le tue liste</string>
|
||||
<string name="sk_reply_as">Rispondi con un altro account</string>
|
||||
<string name="sk_settings_uniform_icon_for_notifications">Icona uniforme per tutte le notifiche</string>
|
||||
<string name="sk_color_palette_red">Rosso</string>
|
||||
<string name="sk_tabs_disable_swipe">Disabilita lo scorrimento tra schede</string>
|
||||
<string name="sk_settings_auth">Impostazioni della sicurezza</string>
|
||||
<string name="sk_delete_notification">Elimina notifica</string>
|
||||
<string name="sk_delete_notification_confirm">Sei sicuro di volere eliminare questa notifica\?</string>
|
||||
<string name="sk_settings_translate_only_opened">Traduci solamente i post aperti</string>
|
||||
<string name="sk_loading_resource_on_instance_title">Cercando in %s</string>
|
||||
<string name="sk_hashtags_you_follow">Hashtags che segui</string>
|
||||
<string name="sk_already_bookmarked">Già salvato</string>
|
||||
<string name="sk_reblogged_as">Reblog eseguito come %s</string>
|
||||
<string name="sk_unsent_posts">Post annullati</string>
|
||||
<string name="sk_confirm_save_draft">Salva bozza\?</string>
|
||||
<string name="sk_confirm_save_changes">Salva le modifiche\?</string>
|
||||
<string name="sk_schedule_or_draft">Programma o bozza</string>
|
||||
<string name="sk_settings_reduce_motion">Riduci il movimento delle animazioni</string>
|
||||
<string name="sk_settings_about_instance">Riguardo all\'istanza</string>
|
||||
<string name="sk_delete_list_confirm">Sei sicuro di volere eliminare la lista \"%s\"\?</string>
|
||||
<string name="sk_timeline_home">Home</string>
|
||||
<string name="sk_confirm_delete_draft">Sei sicuro di volere eliminare questo post in bozza\?</string>
|
||||
<string name="sk_scheduled_too_soon">I post devono essere programmati almeno tra 10 minuti.</string>
|
||||
</resources>
|
||||
@@ -29,7 +29,7 @@
|
||||
<string name="sk_follow_requests">팔로우 요청</string>
|
||||
<string name="sk_accept_follow_request">팔로우 요청 허가</string>
|
||||
<string name="sk_reject_follow_request">팔로우 요청 거부</string>
|
||||
<string name="sk_lists_with_user">%s 님이 포함된 리스트</string>
|
||||
<string name="sk_lists_with_user">%s 님이 포함된 리스트 수정</string>
|
||||
<string name="sk_settings_always_reveal_content_warnings">열람주의 게시물을 항상 펼치기</string>
|
||||
<string name="sk_disable_marquee">제목 표시줄의 텍스트 스크롤 비활성화</string>
|
||||
<string name="sk_app_name">Moshidon</string>
|
||||
@@ -73,7 +73,7 @@
|
||||
<string name="sk_enable_delete_notifications">알림 삭제 활성화</string>
|
||||
<string name="sk_settings_publish_button_text">게시 버튼 텍스트</string>
|
||||
<string name="sk_settings_publish_button_text_title">게시 버튼 사용자화</string>
|
||||
<string name="sk_settings_hide_translate_in_timeline">타임라인에서 번역 버튼 숨김</string>
|
||||
<string name="sk_settings_translate_only_opened">타임라인에서 번역 버튼 숨김</string>
|
||||
<string name="sk_delete_notification">알림 삭제</string>
|
||||
<string name="sk_settings_translation_availability_note_available">%s 서버는 번역을 지원합니다!</string>
|
||||
<string name="sk_settings_translation_availability_note_unavailable">%s 서버는 번역을 지원하지 않는 것 같습니다.</string>
|
||||
@@ -101,4 +101,45 @@
|
||||
<string name="sk_resource_not_found">리소스를 찾을 수 없습니다</string>
|
||||
<string name="sk_loading_resource_on_instance_title">%s에서 찾아보는 중</string>
|
||||
<string name="sk_quote_post">언급하여 게시</string>
|
||||
<string name="sk_unsent_posts">게시하지 않은 게시물</string>
|
||||
<string name="sk_draft">초안 작성</string>
|
||||
<string name="sk_schedule">게시 예약</string>
|
||||
<string name="sk_confirm_delete_draft_title">초안 삭제</string>
|
||||
<string name="sk_confirm_delete_draft">정말로 이 초안을 삭제하시겠습니까\?</string>
|
||||
<string name="sk_confirm_delete_scheduled_post_title">예약한 게시물 삭제</string>
|
||||
<string name="sk_confirm_delete_scheduled_post">정말로 이 예약한 게시물을 삭제하시겠습니까\?</string>
|
||||
<string name="sk_compose_draft">게시물이 초안으로 저장됩니다.</string>
|
||||
<string name="sk_compose_scheduled">예약한 시각</string>
|
||||
<string name="sk_post_scheduled">게시 예약함</string>
|
||||
<string name="sk_scheduled_too_soon">게시 예약은 최소한 10분 뒤로 설정해야 합니다.</string>
|
||||
<string name="sk_draft_or_schedule">초안 작성 또는 게시 예약</string>
|
||||
<string name="sk_scheduled_too_soon_title">예약한 시각이 머지않았습니다</string>
|
||||
<string name="sk_draft_saved">초안 저장함</string>
|
||||
<string name="sk_forward_report_to">%s 인스턴스로 전달</string>
|
||||
<string name="sk_schedule_post">게시 예약</string>
|
||||
<string name="sk_confirm_save_changes">변경 사항을 저장하시겠습니까\?</string>
|
||||
<string name="sk_compose_no_schedule">게시 예약 안 함</string>
|
||||
<string name="sk_compose_no_draft">초안 작성 안 함</string>
|
||||
<string name="sk_confirm_save_draft">초안으로 저장하시겠습니까\?</string>
|
||||
<string name="sk_schedule_or_draft">게시 예약 또는 초안 작성</string>
|
||||
<string name="sk_mark_as_draft">초안으로 표시</string>
|
||||
<string name="sk_settings_reduce_motion">애니메이션의 동작 감소</string>
|
||||
<string name="sk_timeline_home">홈</string>
|
||||
<string name="sk_timeline_local">로컬</string>
|
||||
<string name="sk_timeline_federated">연합</string>
|
||||
<string name="sk_list_replies_policy">답글을 표시할 대상</string>
|
||||
<string name="sk_delete_list_confirm">정말로 이 리스트를 삭제하시겠습니까\?</string>
|
||||
<string name="sk_announcements">공지사항</string>
|
||||
<string name="sk_mark_as_read">읽음으로 표시</string>
|
||||
<string name="sk_settings_about_instance">인스턴스에 대하여</string>
|
||||
<string name="sk_create_list_title">리스트 만들기</string>
|
||||
<string name="sk_list_name_hint">리스트 이름</string>
|
||||
<string name="sk_create">만들기</string>
|
||||
<string name="sk_list_replies_policy_list">리스트의 구성원들</string>
|
||||
<string name="sk_list_replies_policy_followed">팔로우한 사용자 누구나</string>
|
||||
<string name="sk_list_replies_policy_none">아무도 없음</string>
|
||||
<string name="sk_delete_list">리스트 삭제</string>
|
||||
<string name="sk_edit_list_title">리스트 편집</string>
|
||||
<string name="sk_your_lists">리스트</string>
|
||||
<string name="sk_settings_single_notification">하나의 알림만 표시</string>
|
||||
</resources>
|
||||
@@ -17,9 +17,9 @@
|
||||
<string name="sk_update_available">Moshidon %s ကို ဒေါင်းလုဒ်ဆွဲလို့ရပါပြီ။</string>
|
||||
<string name="sk_update_ready">Moshidon %s ကို ဒေါင်းလုဒ်ဆွဲပြီးပြီမလို့ အင်စတောလုပ်နိုင်ပါပြီ။</string>
|
||||
<string name="sk_no_update_available">မည်သည့်အပ်ဒိတ်မျှ မရှိသေးပါ</string>
|
||||
<string name="sk_follow_requests">ဖောလိုဝါအဖြစ် တောင်းဆိုမှုများ</string>
|
||||
<string name="sk_accept_follow_request">ဖောလိုဝါအဖြစ်တောင်းဆိုမှုကို လက်ခံမည်</string>
|
||||
<string name="sk_reject_follow_request">ဖောလိုဝါအဖြစ်တောင်းဆိုမှုကို ငြင်းပယ်မည်</string>
|
||||
<string name="sk_follow_requests">ဖော်လိုဝါအဖြစ် တောင်းဆိုမှုများ</string>
|
||||
<string name="sk_accept_follow_request">ဖော်လိုဝါအဖြစ်တောင်းဆိုမှုကို လက်ခံမည်</string>
|
||||
<string name="sk_reject_follow_request">ဖော်လိုဝါအဖြစ်တောင်းဆိုမှုကို ငြင်းပယ်မည်</string>
|
||||
<string name="sk_confirm_pin_post_title">ပို့စ်အား ပရိုဖိုင်းတွင် ပင်တွဲခြင်း</string>
|
||||
<string name="sk_confirm_delete_and_redraft_title">ပို့စ်အား ဖျက်ပြီးပြန်ရေးခြင်း</string>
|
||||
<string name="sk_confirm_delete_and_redraft">ဖျက်ပြီးပြန်ရေးမှာ သေချာပြီလား\?</string>
|
||||
@@ -31,4 +31,72 @@
|
||||
<string name="sk_federated_timeline_info_banner">သင့်ဖက်ဒရေးရှင်းကလူတွေရဲ့ လတ်တလောပို့စ်တွေ ဖြစ်ပါတယ်။</string>
|
||||
<string name="sk_check_for_update">အပ်ဒိတ်ရှိလားစစ်ဆေးမည်</string>
|
||||
<string name="sk_disable_marquee">ခေါင်းစီးဘားများတွင် စာများရွေ့လျားမှု ပိတ်မည်</string>
|
||||
<string name="sk_poll_allow_multiple">တစ်ခုထက်ပိုသောရွေးချယ်မှုများကို ခွင့်ပြုမည်</string>
|
||||
<string name="sk_clear_recent_languages">လတ်တလောသုံးထားသည့် ဘာသာစကားများကို ရှင်းလင်းမည်</string>
|
||||
<string name="sk_welcome_title">မင်္ဂလာပါ</string>
|
||||
<string name="sk_pinned_posts">ပင်တွဲထားသည်များ</string>
|
||||
<string name="sk_bookmark_as">တခြားအကောင့်ဖြင့် ဘွတ်ခ်မာ့ခ်လုပ်မည်</string>
|
||||
<string name="sk_favorite_as">တခြားအကောင့်ဖြင့် favorite လုပ်မည်</string>
|
||||
<string name="sk_favorited_as">%s ဖြင့် favorite လုပ်လိုက်သည်</string>
|
||||
<string name="sk_bookmarked_as">%s ဖြင့် ဘွတ်ခ်မာ့ခ်လုပ်လိုက်သည်</string>
|
||||
<string name="sk_already_favorited">Favorite လုပ်ပြီးသားဖြစ်သည်</string>
|
||||
<string name="sk_reblogged_as">%s ဖြင့် reblog လုပ်လိုက်သည်</string>
|
||||
<string name="sk_already_reblogged">Reblog လုပ်ပြီးသားဖြစ်သည်</string>
|
||||
<string name="sk_reply_as">တခြားအကောင့်ဖြင့် ရီပလိုင်းပြန်မည်</string>
|
||||
<string name="sk_translated_using">%s ဖြင့် ဘာသာပြန်ထားသည်</string>
|
||||
<string name="sk_post_language">ဘာသာစကား။ ။%s</string>
|
||||
<string name="sk_language_name">%s (%s)</string>
|
||||
<string name="sk_settings_filters">Filter များကို စီစဉ်မည်</string>
|
||||
<string name="sk_settings_auth">လုံခြုံရေးဆိုင်ရာ ဆက်တင်များ</string>
|
||||
<string name="sk_settings_rules">စည်းကမ်းချက်များ</string>
|
||||
<string name="sk_settings_about">အက်ပ်အကြောင်း</string>
|
||||
<string name="sk_settings_donate">လှူဒါန်းမည်</string>
|
||||
<string name="sk_settings_posting">ပို့စ်တင်ခြင်းဆိုင်ရာ အပြင်အဆင်များ</string>
|
||||
<string name="sk_color_palette_purple">ခရမ်းရောင်</string>
|
||||
<string name="sk_color_palette_green">အစိမ်းရောင်</string>
|
||||
<string name="sk_color_palette_blue">အပြာရောင်</string>
|
||||
<string name="sk_color_palette_brown">အညိုရောင်</string>
|
||||
<string name="sk_color_palette_yellow">အဝါရောင်</string>
|
||||
<string name="sk_settings_translation_availability_note_available">%s က ဘာသာပြန်တာကို အထောက်အပံ့ပေးထားပါတယ်။</string>
|
||||
<string name="sk_settings_translation_availability_note_unavailable">%s က ဘာသာပြန်တာကို အထောက်အပံ့ပေးထားပုံမရပါဘူး။</string>
|
||||
<string name="sk_clear_all_notifications_confirm_action">အားလုံးဖျက်</string>
|
||||
<string name="sk_clear_all_notifications">နိုတီအားလုံးကို ရှင်းလင်းမည်</string>
|
||||
<string name="sk_clear_all_notifications_confirm">နိုတီအားလုံးကို ရှင်းလင်းမှာ သေချာပြီလား\?</string>
|
||||
<string name="sk_undo_reblog">Reblog မလုပ်တော့ပါ</string>
|
||||
<string name="sk_hashtags_you_follow">သင်ဖော်လိုးထားသည့် ဟက်ရှ်တက်များ</string>
|
||||
<string name="sk_copy_link_to_post">ပို့စ်လင့်ခ်ကို ကော်ပီကူးမည်</string>
|
||||
<string name="sk_open_with_account">တခြားအကောင့်ဖြင့် ဖွင့်မည်</string>
|
||||
<string name="sk_resource_not_found">ရင်းမြစ်ရှာမတွေ့ပါ</string>
|
||||
<string name="sk_draft">အကြမ်း</string>
|
||||
<string name="sk_schedule">စီစဉ်မည်</string>
|
||||
<string name="sk_confirm_delete_draft_title">အကြမ်းကို ဖျက်မည်</string>
|
||||
<string name="sk_unsent_posts">မတင်ဖြစ်ခဲ့သော ပို့စ်များ</string>
|
||||
<string name="sk_confirm_delete_scheduled_post_title">စီစဉ်ထားသောပို့စ်ကို ဖျက်မည်</string>
|
||||
<string name="sk_confirm_delete_scheduled_post">စီစဉ်ထားတဲ့ ဒီပို့စ်ကိုဖျက်မှာ သေချာပြီလား\?</string>
|
||||
<string name="sk_confirm_delete_draft">ဒီပို့စ်အကြမ်းကို ဖျက်မှာသေချာပြီလား\?</string>
|
||||
<string name="sk_compose_draft">ပို့စ်ကို အကြမ်းအဖြစ် သိမ်းထားမှာဖြစ်ပါတယ်။</string>
|
||||
<string name="sk_compose_scheduled">စီစဉ်ထားသည့်အချိန်</string>
|
||||
<string name="sk_draft_saved">အကြမ်းမှတ်လိုက်သည်</string>
|
||||
<string name="sk_post_scheduled">ပို့စ်ကို စီစဉ်လိုက်သည်</string>
|
||||
<string name="sk_confirm_save_draft">အကြမ်းမှတ်ထားမှာလား\?</string>
|
||||
<string name="sk_confirm_save_changes">အပြောင်းအလဲလုပ်ထားတာတွေကို သိမ်းမှာလား\?</string>
|
||||
<string name="sk_mark_as_draft">အကြမ်းသတ်မှတ်မည်</string>
|
||||
<string name="sk_schedule_post">ပိုစ့်စီစဉ်မည်</string>
|
||||
<string name="sk_settings_reduce_motion">အန်နီမေးရှင်းများတွင် ရွေ့လျားမှုလျှော့မည်</string>
|
||||
<string name="sk_settings_always_reveal_content_warnings">အကြောင်းအရာသတိပေးချက်များကို အမြဲတမ်းဖော်ပြမည်</string>
|
||||
<string name="sk_color_palette_pink">ပန်းရောင်</string>
|
||||
<string name="sk_color_palette_red">အနီရောင်</string>
|
||||
<string name="sk_translate_post">ဘာသာပြန်မည်</string>
|
||||
<string name="sk_example_domain">example.social</string>
|
||||
<string name="sk_settings_profile">ပရိုဖိုင်းကို ပြင်မည်</string>
|
||||
<string name="sk_already_bookmarked">ဘွတ်ခ်မာ့ခ်လုပ်ပြီးသားဖြစ်သည်</string>
|
||||
<string name="sk_reblog_as">တခြားအကောင့်ဖြင့် reblog လုပ်မည်</string>
|
||||
<string name="sk_settings_uniform_icon_for_notifications">နိုတီအားလုံးကို အိုင်ကွန်တူတူထားမည်</string>
|
||||
<string name="sk_notification_type_status">ပို့စ်များ</string>
|
||||
<string name="sk_translate_show_original">မူရင်းပို့စ်ကို ပြသမည်</string>
|
||||
<string name="sk_settings_translate_only_opened">ဖွင့်ထားသည့်ပို့စ်များကိုသာ ဘာသာပြန်မည်</string>
|
||||
<string name="sk_confirm_clear_recent_languages">အခုနောက်ပိုင်းသုံးထားတဲ့ ဘာသာစကားတွေကို ရှင်းလင်းမှာ သေချာပြီလား</string>
|
||||
<string name="sk_welcome_text">ငါးမန်းလေးက သင့်ကိုအလေးပြုကြိုဆိုပါတယ်။ စတင်ဖို့အတွက် Home instance ရဲ့ဒိုမိန်းနာမည်ကိုအောက်တွင် ရိုက်ထည့်ပါ။</string>
|
||||
<string name="sk_scheduled_too_soon_title">စီစဉ်ထားသည့်အချိန်မှာ စောလွန်းနေသည်</string>
|
||||
<string name="sk_scheduled_too_soon">စီစဉ်ထားသည့်ပို့စ်သည် လက်ရှိအချိန်နှင့် အနည်းဆုံး ၁၀ မိနစ်ကွာရမည်။</string>
|
||||
</resources>
|
||||
@@ -14,7 +14,7 @@
|
||||
<string name="sk_confirm_unpin_post">Weet je zeker dat je dit bericht wilt losmaken\?</string>
|
||||
<string name="sk_unpinning">Bericht losmaken…</string>
|
||||
<string name="sk_follow_requests">Volgverzoeken</string>
|
||||
<string name="sk_visibility_unlisted">Geheim</string>
|
||||
<string name="sk_visibility_unlisted">Minder openbaar</string>
|
||||
<string name="sk_image_description">Afbeelding beschrijving</string>
|
||||
<string name="sk_settings_show_replies">Reacties weergeven</string>
|
||||
<string name="sk_settings_show_boosts">Boosts weergeven</string>
|
||||
@@ -33,9 +33,104 @@
|
||||
<string name="sk_list_timelines">Lijsten</string>
|
||||
<string name="sk_reject_follow_request">Volgverzoek afwijzen</string>
|
||||
<string name="sk_accept_follow_request">Volgverzoek accepteren</string>
|
||||
<string name="sk_lists_with_user">Lijsten met %s</string>
|
||||
<string name="sk_lists_with_user">Bewerk lijsten met %s</string>
|
||||
<string name="sk_settings_always_reveal_content_warnings">Onthul altijd inhoudswaarschuwingen</string>
|
||||
<string name="sk_disable_marquee">Schakel scrollende tekst in titelbalken uit</string>
|
||||
<string name="sk_settings_contribute">Bijdragen aan Moshidon</string>
|
||||
<string name="sk_settings_show_federated_timeline">Toon gefedereerde tijdlijn</string>
|
||||
<string name="sk_notification_type_status">Berichten</string>
|
||||
<string name="sk_notify_posts">Bericht meldingen</string>
|
||||
<string name="sk_timeline_local">Lokaal</string>
|
||||
<string name="sk_timeline_home">Home</string>
|
||||
<string name="sk_timeline_federated">Federatie</string>
|
||||
<string name="sk_translate_post">Vertaal</string>
|
||||
<string name="sk_poll_allow_multiple">Meerdere keuzes toestaan</string>
|
||||
<string name="sk_clear_recent_languages">Wis recent gebruikte talen</string>
|
||||
<string name="sk_welcome_text">De haai groet je! Graag je home instance naam hieronder invullen om te beginnen.</string>
|
||||
<string name="sk_welcome_title">Welkom!</string>
|
||||
<string name="sk_translated_using">Vertaald met %s</string>
|
||||
<string name="sk_post_language">Taal: %s</string>
|
||||
<string name="sk_bookmarked_as">Als bookmark opgeslagen als %s</string>
|
||||
<string name="sk_already_bookmarked">Al als bookmark opgeslagen</string>
|
||||
<string name="sk_favorited_as">Als favoriet opgeslagen als %s</string>
|
||||
<string name="sk_language_name">%s (%s)</string>
|
||||
<string name="sk_example_domain">example.social</string>
|
||||
<string name="sk_reply_as">Antwoord met ander account</string>
|
||||
<string name="sk_settings_uniform_icon_for_notifications">Zelfde icoon voor alle meldingen</string>
|
||||
<string name="sk_tabs_disable_swipe">Uitschakelen swipen tussen tabs</string>
|
||||
<string name="sk_settings_profile">Profiel instellen</string>
|
||||
<string name="sk_settings_posting">Voorkeuren plaatsen bericht</string>
|
||||
<string name="sk_settings_filters">Filters instellen</string>
|
||||
<string name="sk_settings_auth">Instellingen beveiliging</string>
|
||||
<string name="sk_settings_rules">Regels</string>
|
||||
<string name="sk_settings_about">Over de app</string>
|
||||
<string name="sk_settings_donate">Doneer</string>
|
||||
<string name="sk_settings_color_palette">Kleurpalet</string>
|
||||
<string name="sk_color_palette_material3">Systeem</string>
|
||||
<string name="sk_color_palette_pink">Roze</string>
|
||||
<string name="sk_color_palette_purple">Paars</string>
|
||||
<string name="sk_color_palette_green">Groen</string>
|
||||
<string name="sk_color_palette_blue">Blauw</string>
|
||||
<string name="sk_color_palette_brown">Bruin</string>
|
||||
<string name="sk_color_palette_red">Rood</string>
|
||||
<string name="sk_color_palette_yellow">Geel</string>
|
||||
<string name="sk_delete_notification_confirm_action">Verwijder melding</string>
|
||||
<string name="sk_delete_notification_confirm">Weet je zeker dat je de melding wilt verwijderen\?</string>
|
||||
<string name="sk_enable_delete_notifications">Meldingen verwijderen inschakelen</string>
|
||||
<string name="sk_settings_publish_button_text">Publiceer knop tekst</string>
|
||||
<string name="sk_settings_publish_button_text_title">Tekst publiceer knop aanpassen</string>
|
||||
<string name="sk_settings_translation_availability_note_available">%s ondersteunt vertaling!</string>
|
||||
<string name="sk_settings_translation_availability_note_unavailable">%s lijkt vertaling niet te ondersteunen.</string>
|
||||
<string name="sk_clear_all_notifications">Wis alle meldingen</string>
|
||||
<string name="sk_clear_all_notifications_confirm_action">Verwijder alles</string>
|
||||
<string name="sk_clear_all_notifications_confirm">Weet je zeker dat je alle meldingen wilt verwijderen\?</string>
|
||||
<string name="sk_loading_fediverse_resource_title">Opzoeken in de Fediverse</string>
|
||||
<string name="sk_copy_link_to_post">Kopieer link naar bericht</string>
|
||||
<string name="sk_loading_resource_on_instance_title">Opzoeken op %s</string>
|
||||
<string name="sk_open_with_account">Open met ander account</string>
|
||||
<string name="sk_unsent_posts">Niet-verzonden berichten</string>
|
||||
<string name="sk_draft">Concept</string>
|
||||
<string name="sk_schedule">Inplannen</string>
|
||||
<string name="sk_confirm_delete_draft">Weet je zeker dat je dit concept bericht wilt verwijderen\?</string>
|
||||
<string name="sk_confirm_delete_scheduled_post_title">Verwijder ingepland bericht</string>
|
||||
<string name="sk_draft_or_schedule">Concept of ingepland</string>
|
||||
<string name="sk_compose_draft">Bericht wordt als concept bewaard.</string>
|
||||
<string name="sk_compose_scheduled">Ingepland om</string>
|
||||
<string name="sk_draft_saved">Concept opgeslagen</string>
|
||||
<string name="sk_post_scheduled">Bericht ingepland</string>
|
||||
<string name="sk_scheduled_too_soon_title">Ingeplande tijd is te snel</string>
|
||||
<string name="sk_scheduled_too_soon">Bericht moet minstens 10 minuten in de toekomst ingepland zijn.</string>
|
||||
<string name="sk_confirm_save_changes">Wijzigingen opslaan\?</string>
|
||||
<string name="sk_mark_as_draft">Markeer als concept</string>
|
||||
<string name="sk_schedule_post">Bericht inplannen</string>
|
||||
<string name="sk_settings_reduce_motion">Beweging in animaties verminderen</string>
|
||||
<string name="sk_announcements">Aankondigingen</string>
|
||||
<string name="sk_mark_as_read">Markeer als gelezen</string>
|
||||
<string name="sk_settings_about_instance">Over instance</string>
|
||||
<string name="sk_settings_single_notification">Toon alleen één melding</string>
|
||||
<string name="sk_create">Maken</string>
|
||||
<string name="sk_create_list_title">Maak lijst</string>
|
||||
<string name="sk_list_name_hint">Lijstnaam</string>
|
||||
<string name="sk_list_replies_policy">Toon antwoorden aan</string>
|
||||
<string name="sk_list_replies_policy_none">niemand</string>
|
||||
<string name="sk_list_replies_policy_followed">gevolgde users</string>
|
||||
<string name="sk_delete_list">Verwijder lijst</string>
|
||||
<string name="sk_delete_list_confirm">Weet je zeker dat je deze lijst wilt verwijderen: “%s”\?</string>
|
||||
<string name="sk_edit_list_title">Bewerk lijst</string>
|
||||
<string name="sk_your_lists">Jouw lijsten</string>
|
||||
<string name="sk_translate_show_original">Toon origineel</string>
|
||||
<string name="sk_available_languages">Beschikbare talen</string>
|
||||
<string name="sk_confirm_clear_recent_languages">Weet je zeker dat je de laatst gebruikte talen wilt wissen\?</string>
|
||||
<string name="sk_delete_notification">Verwijder melding</string>
|
||||
<string name="sk_settings_translate_only_opened">Vertaal alleen geopende berichten</string>
|
||||
<string name="sk_hashtags_you_follow">Hashtags die je volgt</string>
|
||||
<string name="sk_resource_not_found">Bron kon niet worden gevonden</string>
|
||||
<string name="sk_bookmark_as">Bookmark met ander account</string>
|
||||
<string name="sk_favorite_as">Maak favoriet met ander account</string>
|
||||
<string name="sk_already_favorited">Al als favoriet opgeslagen</string>
|
||||
<string name="sk_forward_report_to">Doorsturen naar %s</string>
|
||||
<string name="sk_confirm_delete_draft_title">Verwijder concept</string>
|
||||
<string name="sk_confirm_delete_scheduled_post">Weet je zeker dat je dit ingeplande bericht wilt verwijderen\?</string>
|
||||
<string name="sk_confirm_save_draft">Concept opslaan\?</string>
|
||||
<string name="sk_compose_no_schedule">Niet inplannen</string>
|
||||
</resources>
|
||||
@@ -13,17 +13,17 @@
|
||||
<string name="sk_settings_load_new_posts">Automatycznie wczytuj nowe wpisy</string>
|
||||
<string name="sk_settings_show_interaction_counts">Pokaż dane ilości interakcji</string>
|
||||
<string name="sk_mark_media_as_sensitive">Oznacz jako wrażliwe</string>
|
||||
<string name="sk_user_post_notifications_on">Włączono powiadomienia dla postu %s</string>
|
||||
<string name="sk_user_post_notifications_off">Wyłączono powiadomienia dla postu %s</string>
|
||||
<string name="sk_user_post_notifications_on">Włączono powiadomienia dla wpisu %s</string>
|
||||
<string name="sk_user_post_notifications_off">Wyłączono powiadomienia dla wpisu %s</string>
|
||||
<string name="sk_federated_timeline">fediwersum</string>
|
||||
<string name="sk_federated_timeline_info_banner">To są najnowsze post ze znanej sieci fediwersum dla twojego serwera.</string>
|
||||
<string name="sk_federated_timeline_info_banner">To są najnowsze wpisy z wszystkich serwerów z którymi twoja instancja jest sfederowana.</string>
|
||||
<string name="sk_update_available">Moshidon %s jest dostępny do pobrania.</string>
|
||||
<string name="sk_update_ready">Moshidon %s został pobrany i jest gotowy do instalacji.</string>
|
||||
<string name="sk_check_for_update">Sprawdź dostępność aktualizacji</string>
|
||||
<string name="sk_no_update_available">Brak dostępnych aktualizacji</string>
|
||||
<string name="sk_app_name">Moshidon</string>
|
||||
<string name="sk_pinned_posts">Przypięte</string>
|
||||
<string name="sk_confirm_delete_and_redraft">Jesteś pewnien, że chcesz usunąć zmodyfikowany wpis\?</string>
|
||||
<string name="sk_confirm_delete_and_redraft">Jesteś pewien, że chcesz usunąć wpis i utworzyć jego kopię roboczą\?</string>
|
||||
<string name="sk_confirm_unpin_post">Jesteś pewien, że chcesz odpiąć ten wpis\?</string>
|
||||
<string name="sk_image_description">Opis zdjęcia</string>
|
||||
<string name="sk_confirm_delete_and_redraft_title">Usuń i zmodyfikuj wpis</string>
|
||||
@@ -31,7 +31,7 @@
|
||||
<string name="sk_follow_requests">Prośby o obserwację</string>
|
||||
<string name="sk_accept_follow_request">Zaakceptuj prośby o obserwację</string>
|
||||
<string name="sk_reject_follow_request">Odrzuć prośby o obserwację</string>
|
||||
<string name="sk_lists_with_user">Listy z %s</string>
|
||||
<string name="sk_lists_with_user">Edytuj listy z %s</string>
|
||||
<string name="sk_settings_always_reveal_content_warnings">Zawsze odkrywaj ostrzeżenia o zawartości</string>
|
||||
<string name="sk_disable_marquee">Wyłącz tekst przewijany w paskach tytułowych</string>
|
||||
<string name="sk_settings_contribute">Wspomóż Moshidon</string>
|
||||
@@ -59,4 +59,87 @@
|
||||
<string name="sk_example_domain">przykład.social</string>
|
||||
<string name="sk_welcome_title">Witaj!</string>
|
||||
<string name="sk_welcome_text">Rekin się kłania! Aby zacząć, wpisz adres swojej instancji poniżej.</string>
|
||||
<string name="sk_timeline_local">Lokalne</string>
|
||||
<string name="sk_timeline_federated">Federacja</string>
|
||||
<string name="sk_announcements">Ogłoszenia</string>
|
||||
<string name="sk_list_name_hint">Nazwa listy</string>
|
||||
<string name="sk_timeline_home">Główny widok</string>
|
||||
<string name="sk_bookmark_as">Zapisz zakładkę w innym koncie</string>
|
||||
<string name="sk_bookmarked_as">Zapisano zakładkę jako %s</string>
|
||||
<string name="sk_already_bookmarked">Zakładka została już zapisana</string>
|
||||
<string name="sk_favorited_as">Polubiono jako %s</string>
|
||||
<string name="sk_already_favorited">Już polubiono</string>
|
||||
<string name="sk_reblogged_as">Zrebloguj jako %s</string>
|
||||
<string name="sk_already_reblogged">Już zreblogowano</string>
|
||||
<string name="sk_reply_as">Odpowiedz innym kontem</string>
|
||||
<string name="sk_settings_uniform_icon_for_notifications">Identyczna ikona dla wszystkich notyfikacji</string>
|
||||
<string name="sk_settings_translate_only_opened">Tłumacz tylko otwarte wpisy</string>
|
||||
<string name="sk_tabs_disable_swipe">Wyłącz przeskakiwanie między zakładkami poprzez przesuwanie</string>
|
||||
<string name="sk_settings_profile">Skonfiguruj profil</string>
|
||||
<string name="sk_settings_posting">Preferencje publikowania</string>
|
||||
<string name="sk_settings_filters">Skonfiguruj filtry</string>
|
||||
<string name="sk_settings_auth">Ustawienia bezpieczeństwa</string>
|
||||
<string name="sk_settings_rules">Zasady</string>
|
||||
<string name="sk_settings_about">O aplikacji</string>
|
||||
<string name="sk_settings_donate">Donacje</string>
|
||||
<string name="sk_color_palette_material3">System</string>
|
||||
<string name="sk_color_palette_red">Czerwony</string>
|
||||
<string name="sk_delete_notification">Usuń powiadomienie</string>
|
||||
<string name="sk_delete_notification_confirm_action">Usuń powiadomienie</string>
|
||||
<string name="sk_delete_notification_confirm">Czy jesteś pewien że chcesz usunąć to powiadomienie\?</string>
|
||||
<string name="sk_enable_delete_notifications">Włącz usuwanie notyfikacji</string>
|
||||
<string name="sk_settings_publish_button_text">Opis przycisku publikacji</string>
|
||||
<string name="sk_settings_publish_button_text_title">Skonfiguruj opis przycisku publikacji</string>
|
||||
<string name="sk_settings_translation_availability_note_available">%s wspiera funkcję tłumaczenia!</string>
|
||||
<string name="sk_settings_translation_availability_note_unavailable">Wygląda na to, że %s nie wspiera funkcji tłumaczenia.</string>
|
||||
<string name="sk_clear_all_notifications">Wyczyść wszystkie powiadomienia</string>
|
||||
<string name="sk_clear_all_notifications_confirm_action">Usuń wszystkie</string>
|
||||
<string name="sk_clear_all_notifications_confirm">Czy jesteś pewien że chcesz usunąć wszystkie powiadomienia\?</string>
|
||||
<string name="sk_loading_fediverse_resource_title">Wyszukiwanie na Fediwersum</string>
|
||||
<string name="sk_undo_reblog">Cofnij reblog</string>
|
||||
<string name="sk_reblog_with_visibility">Reblog z widocznością</string>
|
||||
<string name="sk_quote_post">Wpis o tym</string>
|
||||
<string name="sk_hashtags_you_follow">Hashtagi które obserwujesz</string>
|
||||
<string name="sk_copy_link_to_post">Kopiuj link do wpisu</string>
|
||||
<string name="sk_loading_resource_on_instance_title">Wyszukiwanie na %s</string>
|
||||
<string name="sk_open_with_account">Otwórz w innym koncie</string>
|
||||
<string name="sk_resource_not_found">Nie znaleziono zasobu</string>
|
||||
<string name="sk_forward_report_to">Prześlij dalej do %s</string>
|
||||
<string name="sk_draft">Wersja robocza</string>
|
||||
<string name="sk_schedule">Harmonogram</string>
|
||||
<string name="sk_confirm_delete_draft_title">Usuń wersję roboczą</string>
|
||||
<string name="sk_compose_scheduled">Zaplanowany na</string>
|
||||
<string name="sk_draft_saved">Kopia robocza zapisana</string>
|
||||
<string name="sk_scheduled_too_soon_title">Czas publikacji jest za wcześnie</string>
|
||||
<string name="sk_scheduled_too_soon">Czas publikacji musi być najwcześniej za 10 minut.</string>
|
||||
<string name="sk_post_scheduled">Wpis zaplanowany</string>
|
||||
<string name="sk_compose_draft">Wpis zostanie zapisany jako wersja robocza.</string>
|
||||
<string name="sk_draft_or_schedule">Kopia robocza lub zaplanowany wpis</string>
|
||||
<string name="sk_confirm_delete_scheduled_post">Czy chcesz usunąć ten zaplanowany wpis\?</string>
|
||||
<string name="sk_confirm_delete_scheduled_post_title">Usuń zaplanowany wpis</string>
|
||||
<string name="sk_unsent_posts">Niewysłane wpisy</string>
|
||||
<string name="sk_confirm_delete_draft">Czy jesteś pewien że chcesz usunąć tę kopię roboczą\?</string>
|
||||
<string name="sk_confirm_save_draft">Zapisać kopię roboczą\?</string>
|
||||
<string name="sk_confirm_save_changes">Zapisać zmiany\?</string>
|
||||
<string name="sk_mark_as_draft">Oznacz jako wersja robocza</string>
|
||||
<string name="sk_schedule_post">Zaplanuj wpis</string>
|
||||
<string name="sk_compose_no_schedule">Nie planuj publikacji</string>
|
||||
<string name="sk_compose_no_draft">Nie twórz wersji roboczej</string>
|
||||
<string name="sk_schedule_or_draft">Zaplanowany wpis lub kopia robocza</string>
|
||||
<string name="sk_favorite_as">Polub innym kontem</string>
|
||||
<string name="sk_reblog_as">Już zreblogowano</string>
|
||||
<string name="sk_settings_reduce_motion">Zmniejsz ruch animacji</string>
|
||||
<string name="sk_mark_as_read">Oznacz jako przeczytane</string>
|
||||
<string name="sk_settings_about_instance">O instancji</string>
|
||||
<string name="sk_create_list_title">Stwórz listę</string>
|
||||
<string name="sk_create">Stwórz</string>
|
||||
<string name="sk_list_replies_policy">Pokaż odpowiedzi do</string>
|
||||
<string name="sk_list_replies_policy_list">członkowie listy</string>
|
||||
<string name="sk_list_replies_policy_followed">obserwowani użytkownicy</string>
|
||||
<string name="sk_settings_single_notification">Pokazuj tylko jedną notyfikację</string>
|
||||
<string name="sk_list_replies_policy_none">nikt</string>
|
||||
<string name="sk_delete_list">Usuń listę</string>
|
||||
<string name="sk_delete_list_confirm">Czy jesteś pewien że chcesz usunąć tą listę\?</string>
|
||||
<string name="sk_edit_list_title">Edytuj listę</string>
|
||||
<string name="sk_your_lists">Twoje listy</string>
|
||||
</resources>
|
||||
@@ -6,7 +6,7 @@
|
||||
<string name="sk_pin_post">Fixar no perfil</string>
|
||||
<string name="sk_confirm_pin_post_title">Fixar postagem no perfil</string>
|
||||
<string name="sk_confirm_pin_post">Você deseja fixar esta postagem em seu perfil\?</string>
|
||||
<string name="sk_pinning">Fixando postagem…</string>
|
||||
<string name="sk_pinning">Fixando publicação…</string>
|
||||
<string name="sk_app_name">Moshidon</string>
|
||||
<string name="sk_pinned_posts">Fixado</string>
|
||||
<string name="sk_unpin_post">Desafixar do perfil</string>
|
||||
@@ -19,7 +19,7 @@
|
||||
<string name="sk_settings_load_new_posts">Carregar novas postagens automaticamente</string>
|
||||
<string name="sk_mark_media_as_sensitive">Marcar mídia como sensível</string>
|
||||
<string name="sk_settings_app_version">Moshidon v%1$s (%2$d)</string>
|
||||
<string name="sk_lists_with_user">Listas com %s</string>
|
||||
<string name="sk_lists_with_user">Editar listas com %s</string>
|
||||
<string name="sk_user_post_notifications_on">Ativar as notificações de postagem para %s</string>
|
||||
<string name="sk_federated_timeline">Federação</string>
|
||||
<string name="sk_federated_timeline_info_banner">Estas são as postagens mais recentes das pessoas em sua federação.</string>
|
||||
@@ -44,7 +44,7 @@
|
||||
<string name="sk_color_palette_brown">Marrom</string>
|
||||
<string name="sk_color_palette_yellow">Amarelo</string>
|
||||
<string name="sk_color_palette_pink">Rosa</string>
|
||||
<string name="sk_notification_type_status">Postagens</string>
|
||||
<string name="sk_notification_type_status">Publicações</string>
|
||||
<string name="sk_settings_color_palette">Cor do tema</string>
|
||||
<string name="sk_translate_post">Traduzir</string>
|
||||
<string name="sk_translate_show_original">Mostrar original</string>
|
||||
@@ -54,7 +54,7 @@
|
||||
<string name="sk_language_name">%s (%s)</string>
|
||||
<string name="sk_confirm_clear_recent_languages">Você tem certeza que deseja limpar os idiomas usados recentemente\?</string>
|
||||
<string name="sk_clear_recent_languages">Limpar idiomas usados recentemente</string>
|
||||
<string name="sk_notify_posts">Notificações de posts</string>
|
||||
<string name="sk_notify_posts">Notificações de publicações</string>
|
||||
<string name="sk_poll_allow_multiple">Permitir múltiplas escolhas</string>
|
||||
<string name="sk_welcome_text">O tubarão te cumprimenta! Para começar, por favor, digite abaixo o nome de domínio de sua instância de origem.</string>
|
||||
<string name="sk_example_domain">exemplo.social</string>
|
||||
@@ -63,7 +63,7 @@
|
||||
<string name="sk_color_palette_red">Vermelho</string>
|
||||
<string name="sk_settings_donate">Doar</string>
|
||||
<string name="sk_settings_rules">Regras</string>
|
||||
<string name="sk_tabs_disable_swipe">Desativar deslizamento entre as abas</string>
|
||||
<string name="sk_tabs_disable_swipe">Desativar deslizamento entre abas</string>
|
||||
<string name="sk_settings_profile">Configurar perfil</string>
|
||||
<string name="sk_settings_posting">Preferências de postagem</string>
|
||||
<string name="sk_settings_filters">Configurar filtros</string>
|
||||
@@ -71,7 +71,7 @@
|
||||
<string name="sk_delete_notification">Excluir notificação</string>
|
||||
<string name="sk_delete_notification_confirm_action">Excluir notificação</string>
|
||||
<string name="sk_enable_delete_notifications">Habilitar a exclusão de notificações</string>
|
||||
<string name="sk_settings_publish_button_text_title">Customizar o texto do botão de publicar</string>
|
||||
<string name="sk_settings_publish_button_text_title">Customizar texto do botão publicar</string>
|
||||
<string name="sk_settings_translate_only_opened">Esconder botão de tradução na linha do tempo</string>
|
||||
<string name="sk_settings_translation_availability_note_available">%s suporta tradução!</string>
|
||||
<string name="sk_settings_translation_availability_note_unavailable">%s parece não suportar tradução.</string>
|
||||
@@ -79,14 +79,64 @@
|
||||
<string name="sk_clear_all_notifications_confirm_action">Excluir tudo</string>
|
||||
<string name="sk_loading_fediverse_resource_title">Procurando no Fediverso</string>
|
||||
<string name="sk_undo_reblog">Desfazer reblog</string>
|
||||
<string name="sk_reblog_with_visibility">Reblog com visibilidade</string>
|
||||
<string name="sk_reblog_with_visibility">Reblogar com visibilidade</string>
|
||||
<string name="sk_hashtags_you_follow">Hashtags que você segue</string>
|
||||
<string name="sk_copy_link_to_post">Copiar link para postagem</string>
|
||||
<string name="sk_copy_link_to_post">Copiar link da postagem</string>
|
||||
<string name="sk_loading_resource_on_instance_title">Procurando em %s</string>
|
||||
<string name="sk_open_with_account">Abrir com outra conta</string>
|
||||
<string name="sk_resource_not_found">Recurso não pode ser encontrado</string>
|
||||
<string name="sk_resource_not_found">Recurso não foi encontrado</string>
|
||||
<string name="sk_settings_about">Sobre o app</string>
|
||||
<string name="sk_settings_auth">Configurações de segurança</string>
|
||||
<string name="sk_settings_publish_button_text">Texto do botão de publicar</string>
|
||||
<string name="sk_clear_all_notifications_confirm">Você tem certeza que deseja excluir todas as notificações\?</string>
|
||||
<string name="sk_favorite_as">Favoritar com outra conta</string>
|
||||
<string name="sk_bookmark_as">Salvar com outra conta</string>
|
||||
<string name="sk_already_bookmarked">Já salvo</string>
|
||||
<string name="sk_already_favorited">Já favoritado</string>
|
||||
<string name="sk_reply_as">Responder com outra conta</string>
|
||||
<string name="sk_already_reblogged">Já reblogado</string>
|
||||
<string name="sk_reblog_as">Reblogar com outra conta</string>
|
||||
<string name="sk_schedule">Agendar</string>
|
||||
<string name="sk_draft">Rascunho</string>
|
||||
<string name="sk_unsent_posts">Postagens não enviadas</string>
|
||||
<string name="sk_confirm_delete_draft_title">Excluir rascunho</string>
|
||||
<string name="sk_confirm_delete_draft">Você tem certeza que deseja excluir este rascunho\?</string>
|
||||
<string name="sk_confirm_delete_scheduled_post_title">Excluir postagem agendada</string>
|
||||
<string name="sk_confirm_delete_scheduled_post">Você tem certeza que deseja excluir esta postagem agendada\?</string>
|
||||
<string name="sk_compose_draft">A postagem será salva como rascunho.</string>
|
||||
<string name="sk_compose_scheduled">Agendado para</string>
|
||||
<string name="sk_draft_saved">Rascunho salvo</string>
|
||||
<string name="sk_post_scheduled">Postagem agendada</string>
|
||||
<string name="sk_forward_report_to">Encaminhar para %s</string>
|
||||
<string name="sk_scheduled_too_soon_title">O horário agendado está muito próximo</string>
|
||||
<string name="sk_scheduled_too_soon">A postagem deve ser agendada com pelo menos 10 minutos de antecedência.</string>
|
||||
<string name="sk_confirm_save_draft">Salvar rascunho\?</string>
|
||||
<string name="sk_confirm_save_changes">Salvar alterações\?</string>
|
||||
<string name="sk_mark_as_draft">Marcar como rascunho</string>
|
||||
<string name="sk_bookmarked_as">Salvo em %s</string>
|
||||
<string name="sk_favorited_as">Favoritado em %s</string>
|
||||
<string name="sk_reblogged_as">Reblogou como %s</string>
|
||||
<string name="sk_settings_uniform_icon_for_notifications">Padronizar ícone para todas as notificações</string>
|
||||
<string name="sk_quote_post">Publique sobre isso</string>
|
||||
<string name="sk_draft_or_schedule">Rascunhar ou agendar</string>
|
||||
<string name="sk_schedule_post">Agendar publicação</string>
|
||||
<string name="sk_schedule_or_draft">Agendar ou rascunhar</string>
|
||||
<string name="sk_compose_no_schedule">Não agendar</string>
|
||||
<string name="sk_compose_no_draft">Não rascunhar</string>
|
||||
<string name="sk_mark_as_read">Marcar como lido</string>
|
||||
<string name="sk_settings_about_instance">Sobre a instância</string>
|
||||
<string name="sk_create">Criar</string>
|
||||
<string name="sk_create_list_title">Criar lista</string>
|
||||
<string name="sk_list_replies_policy">Mostrar respostas para</string>
|
||||
<string name="sk_list_replies_policy_list">listar membros</string>
|
||||
<string name="sk_list_replies_policy_none">ninguém</string>
|
||||
<string name="sk_delete_list">Excluir lista</string>
|
||||
<string name="sk_delete_list_confirm">Tem certeza que deseja excluir esta lista\?</string>
|
||||
<string name="sk_edit_list_title">Editar lista</string>
|
||||
<string name="sk_your_lists">Suas listas</string>
|
||||
<string name="sk_list_name_hint">Lista de nomes</string>
|
||||
<string name="sk_settings_reduce_motion">Reduzir movimento nas animações</string>
|
||||
<string name="sk_announcements">Comunicados</string>
|
||||
<string name="sk_settings_single_notification">Mostrar apenas uma notificação</string>
|
||||
<string name="sk_list_replies_policy_followed">usuários seguidos</string>
|
||||
</resources>
|
||||
@@ -1,3 +1,24 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
</resources>
|
||||
<string name="sk_delete_and_redraft">Izbriši in ponovno izdelaj</string>
|
||||
<string name="sk_pin_post">Pripni na profil</string>
|
||||
<string name="sk_confirm_pin_post_title">Pripni objavo na profil</string>
|
||||
<string name="sk_pinning">Pripenjam objavo…</string>
|
||||
<string name="sk_unpin_post">Odpni iz profila</string>
|
||||
<string name="sk_confirm_unpin_post_title">Odpni objavo iz profila</string>
|
||||
<string name="sk_image_description">Opis slike</string>
|
||||
<string name="sk_visibility_unlisted">Nenavedeno</string>
|
||||
<string name="sk_settings_show_replies">Prikaži odgovor</string>
|
||||
<string name="sk_mark_media_as_sensitive">Označite medij kot občutljiv</string>
|
||||
<string name="sk_federated_timeline">Federacija</string>
|
||||
<string name="sk_clear_recent_languages">Izbriši nazadnje uporabljene jezike</string>
|
||||
<string name="sk_app_name">Moshidon</string>
|
||||
<string name="sk_pinned_posts">Pripeto</string>
|
||||
<string name="sk_confirm_delete_and_redraft_title">Izbriši ter ponovno izdelaj objavo</string>
|
||||
<string name="sk_confirm_delete_and_redraft">Ali ste prepričani, da želite objavo izbrisati in jo ponovno izdelati\?</string>
|
||||
<string name="sk_confirm_pin_post">Ali želite pripeti to objavo na vaš profil\?</string>
|
||||
<string name="sk_confirm_unpin_post">Ali ste prepričani, da želite odpeti to objavo\?</string>
|
||||
<string name="sk_unpinning">Odpenjanje objave…</string>
|
||||
<string name="sk_settings_load_new_posts">Samodejno naloži nove objave</string>
|
||||
<string name="sk_settings_app_version">Moshidon v%1$s (%2$d)</string>
|
||||
</resources>
|
||||
@@ -41,7 +41,7 @@
|
||||
<string name="sk_follow_requests">Запити на стеження</string>
|
||||
<string name="sk_accept_follow_request">Погодити запит на стеження</string>
|
||||
<string name="sk_reject_follow_request">Відхилити запит на стеження</string>
|
||||
<string name="sk_lists_with_user">Списки з %s</string>
|
||||
<string name="sk_lists_with_user">Редагувати списки з %s</string>
|
||||
<string name="sk_disable_marquee">Вимкнути прокручування тексту у рядках заголовка</string>
|
||||
<string name="sk_settings_contribute">Допомогти у розробці Moshidon</string>
|
||||
<string name="sk_mark_media_as_sensitive">Позначити медіа делікатним</string>
|
||||
@@ -94,11 +94,11 @@
|
||||
<string name="sk_already_bookmarked">Уже в закладках</string>
|
||||
<string name="sk_favorited_as">Уподобано як %s</string>
|
||||
<string name="sk_already_favorited">Уже вподобано</string>
|
||||
<string name="sk_reblog_as">Поширити з іншого облікового запису</string>
|
||||
<string name="sk_reblog_as">Поширити в іншому обліковому записі</string>
|
||||
<string name="sk_already_reblogged">Уже поширено</string>
|
||||
<string name="sk_settings_uniform_icon_for_notifications">Єдина піктограма для всіх сповіщень</string>
|
||||
<string name="sk_bookmark_as">Додати до закладок іншого облікового запису</string>
|
||||
<string name="sk_favorite_as">Уподобане з іншого облікового запису</string>
|
||||
<string name="sk_favorite_as">Уподобане іншим обліковим записом</string>
|
||||
<string name="sk_reblogged_as">Поширено як %s</string>
|
||||
<string name="sk_reply_as">Відповісти з іншого облікового запису</string>
|
||||
<string name="sk_forward_report_to">Переслати до %s</string>
|
||||
@@ -120,4 +120,27 @@
|
||||
<string name="sk_mark_as_draft">Позначити чернеткою</string>
|
||||
<string name="sk_schedule_post">Запланувати допис</string>
|
||||
<string name="sk_confirm_save_draft">Зберегти чернетку\?</string>
|
||||
<string name="sk_schedule_or_draft">Запланувати або перемістити до чернеток</string>
|
||||
<string name="sk_compose_no_schedule">Не планувати</string>
|
||||
<string name="sk_compose_no_draft">Не переміщувати до чернеток</string>
|
||||
<string name="sk_settings_reduce_motion">Зменшити рух в анімації</string>
|
||||
<string name="sk_mark_as_read">Позначити прочитаним</string>
|
||||
<string name="sk_settings_about_instance">Про сервер</string>
|
||||
<string name="sk_create">Створити</string>
|
||||
<string name="sk_create_list_title">Створити список</string>
|
||||
<string name="sk_list_name_hint">Назва списку</string>
|
||||
<string name="sk_list_replies_policy">Показати відповіді для</string>
|
||||
<string name="sk_list_replies_policy_list">учасники списку</string>
|
||||
<string name="sk_list_replies_policy_none">ніхто</string>
|
||||
<string name="sk_delete_list">Видалити список</string>
|
||||
<string name="sk_delete_list_confirm">Ви впевнені, що хочете видалити список «%s»\?</string>
|
||||
<string name="sk_edit_list_title">Редагувати список</string>
|
||||
<string name="sk_your_lists">Ваші списки</string>
|
||||
<string name="sk_announcements">Оголошення</string>
|
||||
<string name="sk_settings_single_notification">Показувати лише одне сповіщення</string>
|
||||
<string name="sk_list_replies_policy_followed">відстежувані користувачі</string>
|
||||
<string name="sk_timeline_home">Головна</string>
|
||||
<string name="sk_timeline_local">Локальна</string>
|
||||
<string name="sk_timeline_federated">Федерація</string>
|
||||
<string name="sk_recent_searches_placeholder">Введіть щось, щоб почати пошук</string>
|
||||
</resources>
|
||||
@@ -32,7 +32,7 @@
|
||||
<string name="sk_list_timelines">列表</string>
|
||||
<string name="sk_accept_follow_request">接受关注请求</string>
|
||||
<string name="sk_reject_follow_request">拒绝关注请求</string>
|
||||
<string name="sk_lists_with_user">%s 的列表</string>
|
||||
<string name="sk_lists_with_user">使用 %s 编辑列表</string>
|
||||
<string name="sk_disable_marquee">禁用标题栏的滚动文本</string>
|
||||
<string name="sk_settings_contribute">向 Moshidon 贡献</string>
|
||||
<string name="sk_settings_show_federated_timeline">显示联邦时间轴</string>
|
||||
@@ -90,13 +90,13 @@
|
||||
<string name="sk_loading_resource_on_instance_title">在 %s 上查找</string>
|
||||
<string name="sk_resource_not_found">找不到资源</string>
|
||||
<string name="sk_open_with_account">用另一个帐户打开</string>
|
||||
<string name="sk_bookmark_as">在其他帐户中添加书签</string>
|
||||
<string name="sk_bookmark_as">与其他帐户的书签</string>
|
||||
<string name="sk_bookmarked_as">已标记为 %s</string>
|
||||
<string name="sk_already_bookmarked">已加入书签</string>
|
||||
<string name="sk_favorite_as">从其他帐户收藏</string>
|
||||
<string name="sk_favorite_as">用其他账号收藏</string>
|
||||
<string name="sk_favorited_as">收藏为 %s</string>
|
||||
<string name="sk_already_favorited">已收藏</string>
|
||||
<string name="sk_reblog_as">从其他帐户重新登录</string>
|
||||
<string name="sk_reblog_as">用其他账号转发</string>
|
||||
<string name="sk_reblogged_as">重新登录为 %s</string>
|
||||
<string name="sk_already_reblogged">已重新登录</string>
|
||||
<string name="sk_reply_as">用其他帐号回复</string>
|
||||
@@ -118,4 +118,33 @@
|
||||
<string name="sk_scheduled_too_soon">嘟文必须预订在未来至少 10 分钟后。</string>
|
||||
<string name="sk_save_draft">保存草稿?</string>
|
||||
<string name="sk_save_changes">保存更改?</string>
|
||||
<string name="sk_confirm_save_draft">保存草稿?</string>
|
||||
<string name="sk_confirm_save_changes">保存更改?</string>
|
||||
<string name="sk_mark_as_draft">标记为草稿</string>
|
||||
<string name="sk_schedule_post">预订嘟文</string>
|
||||
<string name="sk_compose_no_schedule">不预订</string>
|
||||
<string name="sk_compose_no_draft">不要标记为草稿</string>
|
||||
<string name="sk_settings_reduce_motion">减少动画中的效果</string>
|
||||
<string name="sk_schedule_or_draft">预订或草稿</string>
|
||||
<string name="sk_announcements">公告</string>
|
||||
<string name="sk_mark_as_read">标记为已读</string>
|
||||
<string name="sk_settings_about_instance">关于实例</string>
|
||||
<string name="sk_settings_single_notification">只显示一个通知</string>
|
||||
<string name="sk_create">创建</string>
|
||||
<string name="sk_create_list_title">创建列表</string>
|
||||
<string name="sk_list_name_hint">列表名</string>
|
||||
<string name="sk_list_replies_policy">显示回复</string>
|
||||
<string name="sk_list_replies_policy_list">列出成员</string>
|
||||
<string name="sk_list_replies_policy_followed">关注的用户</string>
|
||||
<string name="sk_list_replies_policy_none">没有人</string>
|
||||
<string name="sk_delete_list">删除列表</string>
|
||||
<string name="sk_delete_list_confirm">您确定要删除列表“%s”吗?</string>
|
||||
<string name="sk_edit_list_title">编辑列表</string>
|
||||
<string name="sk_your_lists">你的列表</string>
|
||||
<string name="sk_timeline_federated">联邦</string>
|
||||
<string name="sk_recent_searches_placeholder">输入内容开始搜索</string>
|
||||
<string name="sk_remove_follower">删除关注者</string>
|
||||
<string name="sk_do_remove_follower">删除</string>
|
||||
<string name="sk_remove_follower_success">成功删除关注者</string>
|
||||
<string name="sk_changelog">变更日志</string>
|
||||
</resources>
|
||||
@@ -19,4 +19,6 @@
|
||||
<item name="notifications_all" type="id"/>
|
||||
<item name="notifications_mentions" type="id"/>
|
||||
<item name="notifications_posts" type="id"/>
|
||||
|
||||
<item name="timeline_home" type="id" />
|
||||
</resources>
|
||||
@@ -34,7 +34,7 @@
|
||||
<string name="sk_follow_requests">Follow requests</string>
|
||||
<string name="sk_accept_follow_request">Accept follow request</string>
|
||||
<string name="sk_reject_follow_request">Reject follow request</string>
|
||||
<string name="sk_lists_with_user">Lists with %s</string>
|
||||
<string name="sk_lists_with_user">Edit lists with %s</string>
|
||||
<string name="sk_settings_always_reveal_content_warnings">Always reveal content warnings</string>
|
||||
<string name="sk_disable_marquee">Disable scrolling text in title bars</string>
|
||||
<string name="sk_disable_dividers">Disable post dividers</string>
|
||||
@@ -68,6 +68,9 @@
|
||||
<string name="sk_app_username" translatable="false">\@moshidon</string>
|
||||
<string name="sk_tabs_disable_swipe">Disable swiping between tabs</string>
|
||||
<string name="sk_settings_profile">Set up profile</string>
|
||||
<string name="sk_personal_note">Add a note about this profile</string>
|
||||
<string name="sk_personal_note_confirm">Confirm changes to note</string>
|
||||
<string name="sk_personal_note_update_failed">Failed to save note</string>
|
||||
<string name="sk_settings_posting">Posting preferences</string>
|
||||
<string name="sk_settings_filters">Configure filters</string>
|
||||
<string name="sk_settings_auth">Security settings</string>
|
||||
@@ -139,10 +142,32 @@
|
||||
<string name="sk_keep_only_latest_notification">Keep only latest notification</string>
|
||||
<string name="sk_announcements">Announcements</string>
|
||||
<string name="sk_mark_as_read">Mark as read</string>
|
||||
<string name="sk_settings_about_instance">About instance</string>
|
||||
<string name="sk_settings_single_notification">Only show one notification</string>
|
||||
<string name="sk_create">Create</string>
|
||||
<string name="sk_create_list_title">Create list</string>
|
||||
<string name="sk_list_name_hint">List name</string>
|
||||
<string name="sk_list_replies_policy">Show replies to</string>
|
||||
<string name="sk_list_replies_policy_list">list members</string>
|
||||
<string name="sk_list_replies_policy_followed">followed users</string>
|
||||
<string name="sk_list_replies_policy_none">no one</string>
|
||||
<string name="sk_delete_list">Delete list</string>
|
||||
<string name="sk_delete_list_confirm">Are you sure you want to delete the list “%s”?</string>
|
||||
<string name="sk_edit_list_title">Edit list</string>
|
||||
<string name="sk_your_lists">Your lists</string>
|
||||
<string name="sk_timeline_home">Home</string>
|
||||
<string name="sk_timeline_local">Local</string>
|
||||
<string name="sk_timeline_federated">Federation</string>
|
||||
<string name="sk_recent_searches_placeholder">Type something to start searching</string>
|
||||
<string name="sk_remove_follower">Remove as follower</string>
|
||||
<string name="sk_remove_follower_confirm">Remove %s as a follower by blocking and immediately unblocking them?</string>
|
||||
<string name="sk_do_remove_follower">Remove</string>
|
||||
<string name="sk_remove_follower_success">Successfully removed follower</string>
|
||||
|
||||
<!-- accessibility labels-->
|
||||
<string name="sk_poll_option_add">Add new poll option</string>
|
||||
<string name="sk_fab_compose">Compose</string>
|
||||
<string name="sk_sending_error">Error publishing</string>
|
||||
|
||||
|
||||
</resources>
|
||||
4
metadata/ca/changelogs/55.txt
Normal file
4
metadata/ca/changelogs/55.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
- Corregeix la renderització trencada d'etiquetes HTML i activa la renderització del format Markdown
|
||||
- Inicia el <a href="https://translate.codeberg.org/projects/megalodon">projecte de traducció a Weblate</a>
|
||||
- Afegeix un commutador per a la línia de temps federada
|
||||
- Les versions 52-54 eren xicotets ajustos per a un llançament a Google Play
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user