Compare commits
113 Commits
v2.0.3+for
...
revert-804
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f6ea0404ef | ||
|
|
8cd55fc365 | ||
|
|
f14df2bb0f | ||
|
|
53369eb2d4 | ||
|
|
807010893a | ||
|
|
ea01b14ffb | ||
|
|
3fd9dc1dcd | ||
|
|
02a4a77885 | ||
|
|
651090a504 | ||
|
|
203254c9f4 | ||
|
|
16ef577a7a | ||
|
|
734b3bced6 | ||
|
|
e26c641dc7 | ||
|
|
9295cf4e9c | ||
|
|
dd9237e9ca | ||
|
|
ea81c1fad6 | ||
|
|
d334703c65 | ||
|
|
5f6f3c94c9 | ||
|
|
09ba42a974 | ||
|
|
b1e43d6f97 | ||
|
|
ea92a61d13 | ||
|
|
7fda69a6aa | ||
|
|
cf8b9ac649 | ||
|
|
3c122b005d | ||
|
|
f9dc6105f4 | ||
|
|
d7fe3c80e6 | ||
|
|
e996deea0b | ||
|
|
580ae15af6 | ||
|
|
e66078e52e | ||
|
|
f84356f5d0 | ||
|
|
1fa5a8436b | ||
|
|
2a471ffa96 | ||
|
|
1ee5e1ab3a | ||
|
|
4d90cad034 | ||
|
|
45615b1fc5 | ||
|
|
9fd0e7fea4 | ||
|
|
696016bd8f | ||
|
|
cc46e09853 | ||
|
|
83e84836b5 | ||
|
|
14bb544344 | ||
|
|
ceec18ff5e | ||
|
|
d36ad43700 | ||
|
|
fb39f74ba5 | ||
|
|
9bfc73d6ee | ||
|
|
efb72eace9 | ||
|
|
84b15f4a49 | ||
|
|
2c793fd83b | ||
|
|
900b204bb0 | ||
|
|
17d679901a | ||
|
|
c3d9147705 | ||
|
|
d8036779f8 | ||
|
|
2fafdcc4f8 | ||
|
|
ef3f96ba74 | ||
|
|
91bf1b277f | ||
|
|
c6acd35ceb | ||
|
|
a85a0b7d78 | ||
|
|
3a35674ea2 | ||
|
|
3235cf1c4f | ||
|
|
3f6bda28b3 | ||
|
|
c0b4f4dd79 | ||
|
|
ad96031aeb | ||
|
|
aa9e66e6a2 | ||
|
|
86081654fb | ||
|
|
cac030ffed | ||
|
|
2a913e26e7 | ||
|
|
f60375cd5f | ||
|
|
5920270899 | ||
|
|
f36aee44c6 | ||
|
|
cd24526a9d | ||
|
|
a345ac1390 | ||
|
|
71f4f089b6 | ||
|
|
0f72809342 | ||
|
|
40a033d692 | ||
|
|
d44df2c23c | ||
|
|
47fde1e08b | ||
|
|
0688521ae8 | ||
|
|
bdf0f21647 | ||
|
|
bb03342ff2 | ||
|
|
3d987b8e1d | ||
|
|
57043912e0 | ||
|
|
00aef5ea6b | ||
|
|
369b69668c | ||
|
|
65245f4560 | ||
|
|
4d4fdc97d4 | ||
|
|
c96577891c | ||
|
|
f48b2fc9cb | ||
|
|
2fca2580ed | ||
|
|
7adc1da361 | ||
|
|
6dc24dde43 | ||
|
|
4929e0e6ec | ||
|
|
16a8b8ed71 | ||
|
|
ad1412817e | ||
|
|
d9e6bb3bea | ||
|
|
8970404638 | ||
|
|
2a2241d7f9 | ||
|
|
db1a47e8eb | ||
|
|
3e57061cef | ||
|
|
cd200f8450 | ||
|
|
782013079f | ||
|
|
e5db8acd66 | ||
|
|
1a6a8019c8 | ||
|
|
e935eef29f | ||
|
|
381defda51 | ||
|
|
02ae80c204 | ||
|
|
82214b30e8 | ||
|
|
33a1f48602 | ||
|
|
aee845e5cc | ||
|
|
cd780f6006 | ||
|
|
d4741fefa0 | ||
|
|
7e1e8a2616 | ||
|
|
d73c05cdfc | ||
|
|
78323023cb | ||
|
|
2cf084c98f |
1
.github/FUNDING.yml
vendored
1
.github/FUNDING.yml
vendored
@@ -3,7 +3,6 @@
|
||||
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
||||
patreon: # mastodon
|
||||
open_collective: # Replace with a single Open Collective username e.g., user1
|
||||
ko_fi: xsk22
|
||||
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||
liberapay: # Replace with a single Liberapay username e.g., user1
|
||||
|
||||
@@ -15,8 +15,8 @@ android {
|
||||
applicationId "org.joinmastodon.android.sk"
|
||||
minSdk 23
|
||||
targetSdk 33
|
||||
versionCode 97
|
||||
versionName "2.0.3+fork.97"
|
||||
versionCode 98
|
||||
versionName "2.0.3+fork.98"
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
resourceConfigurations += ['ar-rSA', 'ar-rDZ', 'be-rBY', 'bn-rBD', 'bs-rBA', 'ca-rES', 'cs-rCZ', 'da-rDK', 'de-rDE', 'el-rGR', 'es-rES', 'eu-rES', 'fa-rIR', 'fi-rFI', 'fil-rPH', 'fr-rFR', 'ga-rIE', 'gd-rGB', 'gl-rES', 'hi-rIN', 'hr-rHR', 'hu-rHU', 'hy-rAM', 'ig-rNG', 'in-rID', 'is-rIS', 'it-rIT', 'iw-rIL', 'ja-rJP', 'kab', 'ko-rKR', 'my-rMM', 'nl-rNL', 'no-rNO', 'oc-rFR', 'pl-rPL', 'pt-rBR', 'pt-rPT', 'ro-rRO', 'ru-rRU', 'si-rLK', 'sl-rSI', 'sv-rSE', 'th-rTH', 'tr-rTR', 'uk-rUA', 'ur-rIN', 'vi-rVN', 'zh-rCN', 'zh-rTW']
|
||||
}
|
||||
|
||||
@@ -325,7 +325,7 @@ public class PushNotificationReceiver extends BroadcastReceiver{
|
||||
req.visibility = preferences.postingDefaultVisibility;
|
||||
req.inReplyToId = notification.status.id;
|
||||
|
||||
if (!notification.status.spoilerText.isEmpty() &&
|
||||
if (notification.status.hasSpoiler() &&
|
||||
(GlobalUserPreferences.prefixReplies == ALWAYS
|
||||
|| (GlobalUserPreferences.prefixReplies == TO_OTHERS && !ownID.equals(notification.status.account.id)))
|
||||
&& !notification.status.spoilerText.startsWith("re: ")) {
|
||||
|
||||
@@ -27,9 +27,9 @@ public class UnifiedPushNotificationReceiver extends MessagingReceiver{
|
||||
public void onNewEndpoint(@NotNull Context context, @NotNull String endpoint, @NotNull String instance) {
|
||||
// Called when a new endpoint be used for sending push messages
|
||||
Log.d(TAG, "onNewEndpoint: New Endpoint " + endpoint + " for "+ instance);
|
||||
AccountSession account = AccountSessionManager.getInstance().getLastActiveAccount();
|
||||
AccountSession account = AccountSessionManager.getInstance().tryGetAccount(instance);
|
||||
if (account != null)
|
||||
account.getPushSubscriptionManager().registerAccountForPush(null);
|
||||
account.getPushSubscriptionManager().registerAccountForPush(null, endpoint);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -37,7 +37,7 @@ public class UnifiedPushNotificationReceiver extends MessagingReceiver{
|
||||
// called when the registration is not possible, eg. no network
|
||||
Log.d(TAG, "onRegistrationFailed: " + instance);
|
||||
//re-register for gcm
|
||||
AccountSession account = AccountSessionManager.getInstance().getLastActiveAccount();
|
||||
AccountSession account = AccountSessionManager.getInstance().tryGetAccount(instance);
|
||||
if (account != null)
|
||||
account.getPushSubscriptionManager().registerAccountForPush(null);
|
||||
}
|
||||
@@ -47,7 +47,7 @@ public class UnifiedPushNotificationReceiver extends MessagingReceiver{
|
||||
// called when this application is unregistered from receiving push messages
|
||||
Log.d(TAG, "onUnregistered: " + instance);
|
||||
//re-register for gcm
|
||||
AccountSession account = AccountSessionManager.getInstance().getLastActiveAccount();
|
||||
AccountSession account = AccountSessionManager.getInstance().tryGetAccount(instance);
|
||||
if (account != null)
|
||||
account.getPushSubscriptionManager().registerAccountForPush(null);
|
||||
}
|
||||
@@ -55,7 +55,10 @@ public class UnifiedPushNotificationReceiver extends MessagingReceiver{
|
||||
@Override
|
||||
public void onMessage(@NotNull Context context, @NotNull byte[] message, @NotNull String instance) {
|
||||
// Called when a new message is received. The message contains the full POST body of the push message
|
||||
AccountSession account = AccountSessionManager.getInstance().getAccount(instance);
|
||||
AccountSession account = AccountSessionManager.getInstance().tryGetAccount(instance);
|
||||
|
||||
if (account == null)
|
||||
return;
|
||||
|
||||
//this is stupid
|
||||
// Mastodon stores the info to decrypt the message in the HTTP headers, which are not accessible in UnifiedPush,
|
||||
|
||||
@@ -125,11 +125,11 @@ public class PushSubscriptionManager{
|
||||
// this function is used for registering push notifications using FCM
|
||||
// to avoid NonFreeNet in F-Droid, this registration is disabled in it
|
||||
// see https://github.com/LucasGGamerM/moshidon/issues/206 for more context
|
||||
if(BuildConfig.BUILD_TYPE.equals("fdroidRelease"))
|
||||
if(BuildConfig.BUILD_TYPE.equals("fdroidRelease") || TextUtils.isEmpty(deviceToken)){
|
||||
Log.d(TAG, "Skipping registering for FCM push notifications");
|
||||
return;
|
||||
}
|
||||
|
||||
if(TextUtils.isEmpty(deviceToken))
|
||||
throw new IllegalStateException("No device push token available");
|
||||
String endpoint = "https://app.joinmastodon.org/relay-to/fcm/"+deviceToken+"/"+accountID;
|
||||
registerAccountForPush(subscription, endpoint);
|
||||
}
|
||||
|
||||
@@ -11,13 +11,11 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class CreateStatus extends MastodonAPIRequest<Status>{
|
||||
public static final Instant DRAFTS_AFTER_INSTANT = Instant.ofEpochMilli(253370764799999L) /* end of 9998 */;
|
||||
private static final float draftFactor = 31536000000f /* one year */ / 253370764799999f /* end of 9998 */;
|
||||
public static long EPOCH_OF_THE_YEAR_FIVE_THOUSAND=95617584000000L;
|
||||
public static final Instant DRAFTS_AFTER_INSTANT=Instant.ofEpochMilli(EPOCH_OF_THE_YEAR_FIVE_THOUSAND - 1) /* end of 4999 */;
|
||||
|
||||
public static Instant getDraftInstant() {
|
||||
// returns an instant between 9999-01-01 00:00:00 and 9999-12-31 23:59:59
|
||||
// yes, this is a weird implementation for something that hardly matters
|
||||
return DRAFTS_AFTER_INSTANT.plusMillis(1 + (long) (System.currentTimeMillis() * draftFactor));
|
||||
return DRAFTS_AFTER_INSTANT.plusMillis(System.currentTimeMillis());
|
||||
}
|
||||
|
||||
public CreateStatus(CreateStatus.Request req, String uuid){
|
||||
@@ -36,6 +34,7 @@ public class CreateStatus extends MastodonAPIRequest<Status>{
|
||||
|
||||
public static class Request{
|
||||
public String status;
|
||||
public List<MediaAttribute> mediaAttributes;
|
||||
public List<String> mediaIds;
|
||||
public Poll poll;
|
||||
public String inReplyToId;
|
||||
@@ -55,5 +54,17 @@ public class CreateStatus extends MastodonAPIRequest<Status>{
|
||||
public boolean multiple;
|
||||
public boolean hideTotals;
|
||||
}
|
||||
|
||||
public static class MediaAttribute{
|
||||
public String id;
|
||||
public String description;
|
||||
public String focus;
|
||||
|
||||
public MediaAttribute(String id, String description, String focus){
|
||||
this.id=id;
|
||||
this.description=description;
|
||||
this.focus=focus;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,6 @@ import org.joinmastodon.android.model.TimelineDefinition;
|
||||
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class AccountLocalPreferences{
|
||||
private final SharedPreferences prefs;
|
||||
@@ -39,7 +38,7 @@ public class AccountLocalPreferences{
|
||||
public boolean keepOnlyLatestNotification;
|
||||
|
||||
public boolean emojiReactionsEnabled;
|
||||
public boolean showEmojiReactionsInLists;
|
||||
public ShowEmojiReactions showEmojiReactions;
|
||||
|
||||
private final static Type recentLanguagesType = new TypeToken<ArrayList<String>>() {}.getType();
|
||||
private final static Type timelinesType = new TypeToken<ArrayList<TimelineDefinition>>() {}.getType();
|
||||
@@ -66,7 +65,7 @@ public class AccountLocalPreferences{
|
||||
timelineReplyVisibility=prefs.getString("timelineReplyVisibility", null);
|
||||
keepOnlyLatestNotification=prefs.getBoolean("keepOnlyLatestNotification", false);
|
||||
emojiReactionsEnabled=prefs.getBoolean("emojiReactionsEnabled", session.getInstance().isPresent() && session.getInstance().get().isAkkoma());
|
||||
showEmojiReactionsInLists=prefs.getBoolean("showEmojiReactionsInLists", false);
|
||||
showEmojiReactions=ShowEmojiReactions.valueOf(prefs.getString("showEmojiReactions", ShowEmojiReactions.HIDE_EMPTY.name()));
|
||||
}
|
||||
|
||||
public long getNotificationsPauseEndTime(){
|
||||
@@ -99,7 +98,13 @@ public class AccountLocalPreferences{
|
||||
.putString("timelineReplyVisibility", timelineReplyVisibility)
|
||||
.putBoolean("keepOnlyLatestNotification", keepOnlyLatestNotification)
|
||||
.putBoolean("emojiReactionsEnabled", emojiReactionsEnabled)
|
||||
.putBoolean("showEmojiReactionsInLists", showEmojiReactionsInLists)
|
||||
.putString("showEmojiReactions", showEmojiReactions.name())
|
||||
.apply();
|
||||
}
|
||||
|
||||
public enum ShowEmojiReactions{
|
||||
HIDE_EMPTY,
|
||||
ONLY_OPENED,
|
||||
ALWAYS
|
||||
}
|
||||
}
|
||||
|
||||
@@ -146,6 +146,9 @@ public class AccountSession{
|
||||
@Override
|
||||
public void onError(ErrorResponse error){
|
||||
Log.w(TAG, "Failed to load preferences for account "+getID()+": "+error);
|
||||
if (preferences==null)
|
||||
preferences=new Preferences();
|
||||
preferencesFromAccountSource(self);
|
||||
}
|
||||
})
|
||||
.exec(getID());
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
package org.joinmastodon.android.events;
|
||||
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import org.joinmastodon.android.model.EmojiReaction;
|
||||
import java.util.List;
|
||||
|
||||
public class EmojiReactionsUpdatedEvent{
|
||||
public final String id;
|
||||
public final List<EmojiReaction> reactions;
|
||||
public final boolean updateTextPadding;
|
||||
public RecyclerView.ViewHolder viewHolder;
|
||||
|
||||
public EmojiReactionsUpdatedEvent(String id, List<EmojiReaction> reactions, boolean updateTextPadding, RecyclerView.ViewHolder viewHolder){
|
||||
this.id=id;
|
||||
this.reactions=reactions;
|
||||
this.updateTextPadding=updateTextPadding;
|
||||
this.viewHolder=viewHolder;
|
||||
}
|
||||
}
|
||||
@@ -1,27 +1,14 @@
|
||||
package org.joinmastodon.android.events;
|
||||
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import org.joinmastodon.android.api.CacheController;
|
||||
import org.joinmastodon.android.model.EmojiReaction;
|
||||
import org.joinmastodon.android.model.Status;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class StatusCountersUpdatedEvent{
|
||||
public String id;
|
||||
public long favorites, reblogs, replies;
|
||||
public boolean favorited, reblogged, bookmarked, pinned;
|
||||
public List<EmojiReaction> reactions;
|
||||
public Status status;
|
||||
public RecyclerView.ViewHolder viewHolder;
|
||||
|
||||
public StatusCountersUpdatedEvent(Status s){
|
||||
this(s, null);
|
||||
}
|
||||
|
||||
public StatusCountersUpdatedEvent(Status s, RecyclerView.ViewHolder vh){
|
||||
id=s.id;
|
||||
status=s;
|
||||
favorites=s.favouritesCount;
|
||||
@@ -31,7 +18,5 @@ public class StatusCountersUpdatedEvent{
|
||||
reblogged=s.reblogged;
|
||||
bookmarked=s.bookmarked;
|
||||
pinned=s.pinned;
|
||||
reactions=new ArrayList<>(s.reactions);
|
||||
viewHolder=vh;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -71,11 +71,12 @@ public class AnnouncementsFragment extends BaseStatusListFragment<Announcement>
|
||||
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),
|
||||
textItem,
|
||||
new EmojiReactionsStatusDisplayItem(a.id, this, fakeStatus, accountID, false, true)
|
||||
);
|
||||
|
||||
List<StatusDisplayItem> items=new ArrayList<>();
|
||||
items.add(HeaderStatusDisplayItem.fromAnnouncement(a, fakeStatus, instanceUser, this, accountID, this::onMarkAsRead));
|
||||
items.add(textItem);
|
||||
if(!isInstanceAkkoma()) items.add(new EmojiReactionsStatusDisplayItem(a.id, this, fakeStatus, accountID, false, true));
|
||||
return items;
|
||||
}
|
||||
|
||||
public void onMarkAsRead(String id) {
|
||||
|
||||
@@ -419,7 +419,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
||||
hasSpoiler=true;
|
||||
spoilerWrap.setVisibility(View.VISIBLE);
|
||||
spoilerBtn.setSelected(true);
|
||||
}else if(editingStatus!=null && !TextUtils.isEmpty(editingStatus.spoilerText)){
|
||||
}else if(editingStatus!=null && editingStatus.hasSpoiler()){
|
||||
hasSpoiler=true;
|
||||
spoilerWrap.setVisibility(View.VISIBLE);
|
||||
spoilerEdit.setText(getArguments().getString("sourceSpoiler", editingStatus.spoilerText));
|
||||
@@ -673,11 +673,12 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
||||
? UiUtils.formatRelativeTimestamp(getContext(), status.createdAt)
|
||||
: getString(R.string.edited_timestamp, UiUtils.formatRelativeTimestamp(getContext(), status.editedAt));
|
||||
|
||||
String sepp = getString(R.string.sk_separator);
|
||||
String username = status.account.getDisplayUsername();
|
||||
((TextView) view.findViewById(R.id.time_and_username)).setText(time == null ? username :
|
||||
username + " " + sepp + " " + time);
|
||||
if (status.spoilerText != null && !status.spoilerText.isBlank()) {
|
||||
((TextView) view.findViewById(R.id.username)).setText(status.account.getDisplayUsername());
|
||||
view.findViewById(R.id.separator).setVisibility(time==null ? View.GONE : View.VISIBLE);
|
||||
view.findViewById(R.id.time).setVisibility(time==null ? View.GONE : View.VISIBLE);
|
||||
if(time!=null) ((TextView) view.findViewById(R.id.time)).setText(time);
|
||||
|
||||
if (status.hasSpoiler()) {
|
||||
TextView replyToSpoiler = view.findViewById(R.id.reply_to_spoiler);
|
||||
replyToSpoiler.setVisibility(View.VISIBLE);
|
||||
replyToSpoiler.setText(status.spoilerText);
|
||||
@@ -1065,6 +1066,9 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
||||
req.scheduledAt=scheduledAt;
|
||||
if(!mediaViewController.isEmpty()){
|
||||
req.mediaIds=mediaViewController.getAttachmentIDs();
|
||||
if(editingStatus != null){
|
||||
req.mediaAttributes=mediaViewController.getAttachmentAttributes();
|
||||
}
|
||||
}
|
||||
// ask whether to publish now when editing an existing draft
|
||||
if (!force && editingStatus != null && scheduledAt != null && scheduledAt.isAfter(DRAFTS_AFTER_INSTANT)) {
|
||||
|
||||
@@ -45,8 +45,8 @@ public class FeaturedHashtagsListFragment extends BaseStatusListFragment<Hashtag
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onItemClick(String id){
|
||||
UiUtils.openHashtagTimeline(getActivity(), accountID, id, data.stream().filter(h -> Objects.equals(h.name, id)).findAny().map(h -> h.following).orElse(null));
|
||||
public void onItemClick(String hashtag){
|
||||
UiUtils.openHashtagTimeline(getActivity(), accountID, hashtag, data.stream().filter(h -> Objects.equals(h.name, hashtag)).findAny().map(h -> h.following).orElse(null));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -201,7 +201,7 @@ public class FollowRequestsListFragment extends MastodonRecyclerFragment<FollowR
|
||||
}
|
||||
|
||||
// literally the same as AccountCardStatusDisplayItem and DiscoverAccountsFragment. code should be generalized
|
||||
private class AccountViewHolder extends BindableViewHolder<AccountWrapper> implements ImageLoaderViewHolder, UsableRecyclerView.Clickable{
|
||||
private class AccountViewHolder extends BindableViewHolder<AccountWrapper> implements ImageLoaderViewHolder, UsableRecyclerView.DisableableClickable{
|
||||
private final ImageView cover, avatar;
|
||||
private final TextView name, username, bio, followersCount, followingCount, postsCount, followersLabel, followingLabel, postsLabel;
|
||||
private final ProgressBarButton actionButton, acceptButton, rejectButton;
|
||||
@@ -233,15 +233,24 @@ public class FollowRequestsListFragment extends MastodonRecyclerFragment<FollowR
|
||||
rejectProgress=findViewById(R.id.reject_progress);
|
||||
rejectWrap=findViewById(R.id.reject_btn_wrap);
|
||||
|
||||
itemView.setOutlineProvider(OutlineProviders.roundedRect(6));
|
||||
itemView.setClipToOutline(true);
|
||||
avatar.setOutlineProvider(OutlineProviders.roundedRect(12));
|
||||
avatar.setOutlineProvider(OutlineProviders.roundedRect(15));
|
||||
avatar.setClipToOutline(true);
|
||||
cover.setOutlineProvider(OutlineProviders.roundedRect(3));
|
||||
View border=findViewById(R.id.avatar_border);
|
||||
border.setOutlineProvider(OutlineProviders.roundedRect(17));
|
||||
border.setClipToOutline(true);
|
||||
cover.setOutlineProvider(OutlineProviders.roundedRect(9));
|
||||
cover.setClipToOutline(true);
|
||||
itemView.setOutlineProvider(OutlineProviders.roundedRect(12));
|
||||
itemView.setClipToOutline(true);
|
||||
actionButton.setOnClickListener(this::onActionButtonClick);
|
||||
acceptButton.setOnClickListener(this::onFollowRequestButtonClick);
|
||||
rejectButton.setOnClickListener(this::onFollowRequestButtonClick);
|
||||
itemView.setOnClickListener(v->this.onClick());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEnabled(){
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -254,26 +263,23 @@ public class FollowRequestsListFragment extends MastodonRecyclerFragment<FollowR
|
||||
postsCount.setText(UiUtils.abbreviateNumber(item.account.statusesCount));
|
||||
followersLabel.setText(getResources().getQuantityString(R.plurals.followers, (int)Math.min(999, item.account.followersCount)));
|
||||
followingLabel.setText(getResources().getQuantityString(R.plurals.following, (int)Math.min(999, item.account.followingCount)));
|
||||
postsLabel.setText(getResources().getQuantityString(R.plurals.x_posts, (int)(item.account.statusesCount%1000), item.account.statusesCount));
|
||||
postsLabel.setText(getResources().getQuantityString(R.plurals.sk_posts_count_label, (int)(item.account.statusesCount%1000), item.account.statusesCount));
|
||||
followersCount.setVisibility(item.account.followersCount < 0 ? View.GONE : View.VISIBLE);
|
||||
followersLabel.setVisibility(item.account.followersCount < 0 ? View.GONE : View.VISIBLE);
|
||||
followingCount.setVisibility(item.account.followingCount < 0 ? View.GONE : View.VISIBLE);
|
||||
followingLabel.setVisibility(item.account.followingCount < 0 ? View.GONE : View.VISIBLE);
|
||||
relationship=relationships.get(item.account.id);
|
||||
if(relationship == null || !relationship.followedBy){
|
||||
UiUtils.setExtraTextInfo(getContext(), null, findViewById(R.id.pronouns), true, false, false, item.account);
|
||||
|
||||
if(relationship==null || !relationship.followedBy){
|
||||
actionWrap.setVisibility(View.GONE);
|
||||
acceptWrap.setVisibility(View.VISIBLE);
|
||||
rejectWrap.setVisibility(View.VISIBLE);
|
||||
|
||||
// i hate that i wasn't able to do this in xml
|
||||
acceptButton.setCompoundDrawableTintList(acceptButton.getTextColors());
|
||||
acceptProgress.setIndeterminateTintList(acceptButton.getTextColors());
|
||||
rejectButton.setCompoundDrawableTintList(rejectButton.getTextColors());
|
||||
rejectProgress.setIndeterminateTintList(rejectButton.getTextColors());
|
||||
}else if(relationship==null){
|
||||
actionWrap.setVisibility(View.GONE);
|
||||
acceptWrap.setVisibility(View.GONE);
|
||||
rejectWrap.setVisibility(View.GONE);
|
||||
}else{
|
||||
actionWrap.setVisibility(View.VISIBLE);
|
||||
acceptWrap.setVisibility(View.GONE);
|
||||
|
||||
@@ -15,6 +15,7 @@ import org.joinmastodon.android.E;
|
||||
import org.joinmastodon.android.GlobalUserPreferences;
|
||||
import org.joinmastodon.android.R;
|
||||
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||
import org.joinmastodon.android.events.EmojiReactionsUpdatedEvent;
|
||||
import org.joinmastodon.android.events.PollUpdatedEvent;
|
||||
import org.joinmastodon.android.events.RemoveAccountPostsEvent;
|
||||
import org.joinmastodon.android.events.StatusCountersUpdatedEvent;
|
||||
@@ -27,10 +28,10 @@ import org.joinmastodon.android.ui.displayitems.ExtendedFooterStatusDisplayItem;
|
||||
import org.joinmastodon.android.ui.displayitems.FooterStatusDisplayItem;
|
||||
import org.joinmastodon.android.ui.displayitems.NotificationHeaderStatusDisplayItem;
|
||||
import org.joinmastodon.android.ui.displayitems.StatusDisplayItem;
|
||||
import org.joinmastodon.android.ui.displayitems.TextStatusDisplayItem;
|
||||
import org.joinmastodon.android.ui.utils.DiscoverInfoBannerHelper;
|
||||
import org.joinmastodon.android.ui.utils.InsetStatusItemDecoration;
|
||||
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||
import org.joinmastodon.android.utils.ElevationOnScrollListener;
|
||||
import org.joinmastodon.android.utils.ObjectIdComparator;
|
||||
import org.parceler.Parcels;
|
||||
|
||||
@@ -44,7 +45,6 @@ import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import me.grishka.appkit.api.SimpleCallback;
|
||||
import me.grishka.appkit.utils.MergeRecyclerAdapter;
|
||||
import me.grishka.appkit.views.FragmentRootLinearLayout;
|
||||
|
||||
public class NotificationsListFragment extends BaseStatusListFragment<Notification> {
|
||||
private boolean onlyMentions;
|
||||
@@ -103,8 +103,6 @@ public class NotificationsListFragment extends BaseStatusListFragment<Notificati
|
||||
int flags=titleItem==null ? 0 : (StatusDisplayItem.FLAG_NO_FOOTER | StatusDisplayItem.FLAG_INSET | StatusDisplayItem.FLAG_NO_EMOJI_REACTIONS); // | StatusDisplayItem.FLAG_NO_HEADER);
|
||||
if (GlobalUserPreferences.spectatorMode)
|
||||
flags |= StatusDisplayItem.FLAG_NO_FOOTER;
|
||||
if (!getLocalPrefs().showEmojiReactionsInLists)
|
||||
flags |= StatusDisplayItem.FLAG_NO_EMOJI_REACTIONS;
|
||||
ArrayList<StatusDisplayItem> items=StatusDisplayItem.buildItems(this, n.status, accountID, n, knownAccounts, null, flags);
|
||||
if(titleItem!=null)
|
||||
items.add(0, titleItem);
|
||||
@@ -249,8 +247,7 @@ public class NotificationsListFragment extends BaseStatusListFragment<Notificati
|
||||
@Subscribe
|
||||
public void onStatusCountersUpdated(StatusCountersUpdatedEvent ev){
|
||||
for(Notification n:data){
|
||||
if (n.status == null) continue;
|
||||
if(n.status.getContentStatus().id.equals(ev.id)){
|
||||
if(n.status!=null && n.status.getContentStatus().id.equals(ev.id)){
|
||||
n.status.getContentStatus().update(ev);
|
||||
AccountSessionManager.get(accountID).getCacheController().updateNotification(n);
|
||||
for(int i=0;i<list.getChildCount();i++){
|
||||
@@ -259,15 +256,36 @@ public class NotificationsListFragment extends BaseStatusListFragment<Notificati
|
||||
footer.rebind();
|
||||
}else if(holder instanceof ExtendedFooterStatusDisplayItem.Holder footer && footer.getItem().status==n.status.getContentStatus()){
|
||||
footer.rebind();
|
||||
}else if(holder instanceof EmojiReactionsStatusDisplayItem.Holder reactions && ev.viewHolder!=holder){
|
||||
reactions.rebind();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for(Notification n:preloadedData){
|
||||
if (n.status == null) continue;
|
||||
if(n.status.getContentStatus().id.equals(ev.id)){
|
||||
if(n.status!=null && n.status.getContentStatus().id.equals(ev.id)){
|
||||
n.status.getContentStatus().update(ev);
|
||||
AccountSessionManager.get(accountID).getCacheController().updateNotification(n);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void onEmojiReactionsChanged(EmojiReactionsUpdatedEvent ev){
|
||||
for(Notification n : data){
|
||||
if(n.status!=null && n.status.getContentStatus().id.equals(ev.id)){
|
||||
n.status.getContentStatus().update(ev);
|
||||
AccountSessionManager.get(accountID).getCacheController().updateNotification(n);
|
||||
for(int i=0; i<list.getChildCount(); i++){
|
||||
RecyclerView.ViewHolder holder=list.getChildViewHolder(list.getChildAt(i));
|
||||
if(holder instanceof EmojiReactionsStatusDisplayItem.Holder reactions && reactions.getItem().status==n.status.getContentStatus() && ev.viewHolder!=holder){
|
||||
reactions.rebind();
|
||||
}else if(holder instanceof TextStatusDisplayItem.Holder text && text.getItem().parentID.equals(n.getID())){
|
||||
text.rebind();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for(Notification n : preloadedData){
|
||||
if(n.status!=null && n.status.getContentStatus().id.equals(ev.id)){
|
||||
n.status.getContentStatus().update(ev);
|
||||
AccountSessionManager.get(accountID).getCacheController().updateNotification(n);
|
||||
}
|
||||
|
||||
@@ -4,10 +4,12 @@ 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.assist.AssistContent;
|
||||
import android.content.Intent;
|
||||
import android.content.res.ColorStateList;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.TypedArray;
|
||||
import android.graphics.Color;
|
||||
@@ -131,6 +133,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
private CoverImageView cover;
|
||||
private View avatarBorder;
|
||||
private TextView name, username, bio, followersCount, followersLabel, followingCount, followingLabel;
|
||||
private ImageView lockIcon, botIcon;
|
||||
private ProgressBarButton actionButton, notifyButton;
|
||||
private ViewPager2 pager;
|
||||
private NestedRecyclerScrollView scrollView;
|
||||
@@ -230,6 +233,8 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
avatarBorder=content.findViewById(R.id.avatar_border);
|
||||
name=content.findViewById(R.id.name);
|
||||
username=content.findViewById(R.id.username);
|
||||
lockIcon=content.findViewById(R.id.lock_icon);
|
||||
botIcon=content.findViewById(R.id.bot_icon);
|
||||
bio=content.findViewById(R.id.bio);
|
||||
followersCount=content.findViewById(R.id.followers_count);
|
||||
followersLabel=content.findViewById(R.id.followers_label);
|
||||
@@ -258,6 +263,8 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
list=content.findViewById(R.id.metadata);
|
||||
rolesView=content.findViewById(R.id.roles);
|
||||
|
||||
avatarBorder.setOutlineProvider(OutlineProviders.roundedRect(26));
|
||||
avatarBorder.setClipToOutline(true);
|
||||
avatar.setOutlineProvider(OutlineProviders.roundedRect(24));
|
||||
avatar.setClipToOutline(true);
|
||||
|
||||
@@ -345,7 +352,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
followersBtn.setOnClickListener(this::onFollowersOrFollowingClick);
|
||||
followingBtn.setOnClickListener(this::onFollowersOrFollowingClick);
|
||||
|
||||
username.setOnClickListener(v->{
|
||||
content.findViewById(R.id.username_wrap).setOnClickListener(v->{
|
||||
try {
|
||||
new GetInstance()
|
||||
.setCallback(new Callback<>(){
|
||||
@@ -366,7 +373,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
.execRemote(Uri.parse(account.url).getHost());
|
||||
} catch (NullPointerException ignored) {
|
||||
// maybe the url was malformed?
|
||||
Toast.makeText(getContext(), R.string.error, Toast.LENGTH_SHORT);
|
||||
Toast.makeText(getContext(), R.string.error, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
});
|
||||
|
||||
@@ -590,6 +597,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("SetTextI18n")
|
||||
private void bindHeaderView(){
|
||||
setTitle(account.displayName);
|
||||
setSubtitle(getResources().getQuantityString(R.plurals.x_posts, (int)(account.statusesCount%1000), account.statusesCount));
|
||||
@@ -622,19 +630,15 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
String acct = ((isSelf || account.isRemote)
|
||||
? account.getFullyQualifiedName()
|
||||
: account.acct);
|
||||
if(account.locked){
|
||||
ssb=new SpannableStringBuilder("@");
|
||||
ssb.append(acct);
|
||||
ssb.append(" ");
|
||||
Drawable lock=username.getResources().getDrawable(R.drawable.ic_lock, getActivity().getTheme()).mutate();
|
||||
lock.setBounds(0, 0, lock.getIntrinsicWidth(), lock.getIntrinsicHeight());
|
||||
lock.setTint(username.getCurrentTextColor());
|
||||
ssb.append(getString(R.string.manually_approves_followers), new ImageSpan(lock, ImageSpan.ALIGN_BASELINE), 0);
|
||||
username.setText(ssb);
|
||||
}else{
|
||||
// noinspection SetTextI18n
|
||||
username.setText('@'+acct);
|
||||
}
|
||||
|
||||
username.setText('@'+acct);
|
||||
|
||||
lockIcon.setVisibility(account.locked ? View.VISIBLE : View.GONE);
|
||||
lockIcon.setImageTintList(ColorStateList.valueOf(username.getCurrentTextColor()));
|
||||
|
||||
botIcon.setVisibility(account.bot ? View.VISIBLE : View.GONE);
|
||||
botIcon.setImageTintList(ColorStateList.valueOf(username.getCurrentTextColor()));
|
||||
|
||||
CharSequence parsedBio=HtmlParser.parse(account.note, account.emojis, Collections.emptyList(), Collections.emptyList(), accountID);
|
||||
if(TextUtils.isEmpty(parsedBio)){
|
||||
bio.setVisibility(View.GONE);
|
||||
@@ -1057,7 +1061,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
actionButton.setText(R.string.save_changes);
|
||||
pager.setVisibility(View.GONE);
|
||||
tabbar.setVisibility(View.GONE);
|
||||
Drawable overlay=getResources().getDrawable(R.drawable.edit_avatar_overlay).mutate();
|
||||
Drawable overlay=getResources().getDrawable(R.drawable.edit_avatar_overlay, getActivity().getTheme()).mutate();
|
||||
avatar.setForeground(overlay);
|
||||
updateMetadataHeight();
|
||||
|
||||
@@ -1426,16 +1430,14 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
}
|
||||
}
|
||||
|
||||
private class AboutViewHolder extends BaseViewHolder implements ImageLoaderViewHolder {
|
||||
private class AboutViewHolder extends BaseViewHolder implements ImageLoaderViewHolder{
|
||||
private final TextView title;
|
||||
private final LinkedTextView value;
|
||||
// private final ImageView verifiedIcon;
|
||||
|
||||
public AboutViewHolder(){
|
||||
super(R.layout.item_profile_about);
|
||||
title=findViewById(R.id.title);
|
||||
value=findViewById(R.id.value);
|
||||
// verifiedIcon=findViewById(R.id.verified_icon);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1443,7 +1445,18 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||
super.onBind(item);
|
||||
title.setText(item.parsedName);
|
||||
value.setText(item.parsedValue);
|
||||
// verifiedIcon.setVisibility(item.verifiedAt!=null ? View.VISIBLE : View.GONE);
|
||||
if(item.verifiedAt!=null){
|
||||
int textColor=UiUtils.isDarkTheme() ? 0xFF89bb9c : 0xFF5b8e63;
|
||||
value.setTextColor(textColor);
|
||||
value.setLinkTextColor(textColor);
|
||||
Drawable check=getResources().getDrawable(R.drawable.ic_fluent_checkmark_starburst_20_regular, getActivity().getTheme()).mutate();
|
||||
check.setTint(textColor);
|
||||
value.setCompoundDrawablesRelativeWithIntrinsicBounds(null, null, check, null);
|
||||
}else{
|
||||
value.setTextColor(UiUtils.getThemeColor(getActivity(), android.R.attr.textColorPrimary));
|
||||
value.setLinkTextColor(UiUtils.getThemeColor(getActivity(), android.R.attr.colorAccent));
|
||||
value.setCompoundDrawables(null, null, null, null);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -80,7 +80,10 @@ public class ScheduledStatusListFragment extends BaseStatusListFragment<Schedule
|
||||
|
||||
@Override
|
||||
protected List<StatusDisplayItem> buildDisplayItems(ScheduledStatus s) {
|
||||
return StatusDisplayItem.buildItems(this, s.toStatus(), accountID, s, knownAccounts, false, false, false, true, null);
|
||||
return StatusDisplayItem.buildItems(this, s.toStatus(), accountID, s, knownAccounts, null,
|
||||
StatusDisplayItem.FLAG_NO_EMOJI_REACTIONS |
|
||||
StatusDisplayItem.FLAG_NO_FOOTER |
|
||||
StatusDisplayItem.FLAG_NO_TRANSLATE);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package org.joinmastodon.android.fragments;
|
||||
|
||||
import static org.joinmastodon.android.api.session.AccountLocalPreferences.ShowEmojiReactions.ONLY_OPENED;
|
||||
|
||||
import android.content.res.Configuration;
|
||||
import android.os.Bundle;
|
||||
|
||||
@@ -7,7 +9,9 @@ import com.squareup.otto.Subscribe;
|
||||
|
||||
import org.joinmastodon.android.E;
|
||||
import org.joinmastodon.android.GlobalUserPreferences;
|
||||
import org.joinmastodon.android.api.session.AccountLocalPreferences;
|
||||
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||
import org.joinmastodon.android.events.EmojiReactionsUpdatedEvent;
|
||||
import org.joinmastodon.android.events.PollUpdatedEvent;
|
||||
import org.joinmastodon.android.events.RemoveAccountPostsEvent;
|
||||
import org.joinmastodon.android.events.StatusCountersUpdatedEvent;
|
||||
@@ -20,6 +24,7 @@ import org.joinmastodon.android.ui.displayitems.EmojiReactionsStatusDisplayItem;
|
||||
import org.joinmastodon.android.ui.displayitems.ExtendedFooterStatusDisplayItem;
|
||||
import org.joinmastodon.android.ui.displayitems.FooterStatusDisplayItem;
|
||||
import org.joinmastodon.android.ui.displayitems.StatusDisplayItem;
|
||||
import org.joinmastodon.android.ui.displayitems.TextStatusDisplayItem;
|
||||
import org.parceler.Parcels;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -36,9 +41,10 @@ public abstract class StatusListFragment extends BaseStatusListFragment<Status>
|
||||
protected List<StatusDisplayItem> buildDisplayItems(Status s){
|
||||
boolean isMainThreadStatus = this instanceof ThreadFragment t && s.id.equals(t.mainStatus.id);
|
||||
int flags = 0;
|
||||
AccountLocalPreferences lp=getLocalPrefs();
|
||||
if (GlobalUserPreferences.spectatorMode)
|
||||
flags |= StatusDisplayItem.FLAG_NO_FOOTER;
|
||||
if (!getLocalPrefs().showEmojiReactionsInLists)
|
||||
if (!lp.emojiReactionsEnabled || lp.showEmojiReactions==ONLY_OPENED)
|
||||
flags |= StatusDisplayItem.FLAG_NO_EMOJI_REACTIONS;
|
||||
return StatusDisplayItem.buildItems(this, s, accountID, s, knownAccounts, getFilterContext(), isMainThreadStatus ? 0 : flags);
|
||||
}
|
||||
@@ -223,8 +229,30 @@ public abstract class StatusListFragment extends BaseStatusListFragment<Status>
|
||||
footer.rebind();
|
||||
}else if(holder instanceof ExtendedFooterStatusDisplayItem.Holder footer && footer.getItem().status==s.getContentStatus()){
|
||||
footer.rebind();
|
||||
}else if(holder instanceof EmojiReactionsStatusDisplayItem.Holder reactions && reactions.getItem().status==s.getContentStatus() && ev.viewHolder!=holder){
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for(Status s:preloadedData){
|
||||
if(s.getContentStatus().id.equals(ev.id)){
|
||||
s.getContentStatus().update(ev);
|
||||
AccountSessionManager.get(accountID).getCacheController().updateStatus(s);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void onEmojiReactionsChanged(EmojiReactionsUpdatedEvent ev){
|
||||
for(Status s:data){
|
||||
if(s.getContentStatus().id.equals(ev.id)){
|
||||
s.getContentStatus().update(ev);
|
||||
AccountSessionManager.get(accountID).getCacheController().updateStatus(s);
|
||||
for(int i=0;i<list.getChildCount();i++){
|
||||
RecyclerView.ViewHolder holder=list.getChildViewHolder(list.getChildAt(i));
|
||||
if(holder instanceof EmojiReactionsStatusDisplayItem.Holder reactions && reactions.getItem().status==s.getContentStatus() && ev.viewHolder!=holder){
|
||||
reactions.rebind();
|
||||
}else if(holder instanceof TextStatusDisplayItem.Holder text && text.getItem().parentID.equals(s.getID())){
|
||||
text.rebind();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -197,7 +197,7 @@ public class DiscoverAccountsFragment extends MastodonRecyclerFragment<DiscoverA
|
||||
}
|
||||
}
|
||||
|
||||
private class AccountViewHolder extends BindableViewHolder<AccountWrapper> implements ImageLoaderViewHolder, UsableRecyclerView.Clickable{
|
||||
private class AccountViewHolder extends BindableViewHolder<AccountWrapper> implements ImageLoaderViewHolder, UsableRecyclerView.DisableableClickable{
|
||||
private final ImageView cover, avatar;
|
||||
private final TextView name, username, bio, followersCount, followingCount, postsCount, followersLabel, followingLabel, postsLabel;
|
||||
private final ProgressBarButton actionButton;
|
||||
@@ -223,13 +223,22 @@ public class DiscoverAccountsFragment extends MastodonRecyclerFragment<DiscoverA
|
||||
actionProgress=findViewById(R.id.action_progress);
|
||||
actionWrap=findViewById(R.id.action_btn_wrap);
|
||||
|
||||
itemView.setOutlineProvider(OutlineProviders.roundedRect(6));
|
||||
itemView.setClipToOutline(true);
|
||||
avatar.setOutlineProvider(OutlineProviders.roundedRect(12));
|
||||
avatar.setOutlineProvider(OutlineProviders.roundedRect(15));
|
||||
avatar.setClipToOutline(true);
|
||||
cover.setOutlineProvider(OutlineProviders.roundedRect(3));
|
||||
View border=findViewById(R.id.avatar_border);
|
||||
border.setOutlineProvider(OutlineProviders.roundedRect(17));
|
||||
border.setClipToOutline(true);
|
||||
cover.setOutlineProvider(OutlineProviders.roundedRect(9));
|
||||
cover.setClipToOutline(true);
|
||||
itemView.setOutlineProvider(OutlineProviders.roundedRect(12));
|
||||
itemView.setClipToOutline(true);
|
||||
actionButton.setOnClickListener(this::onActionButtonClick);
|
||||
itemView.setOnClickListener(v->this.onClick());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEnabled(){
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -242,12 +251,14 @@ public class DiscoverAccountsFragment extends MastodonRecyclerFragment<DiscoverA
|
||||
postsCount.setText(UiUtils.abbreviateNumber(item.account.statusesCount));
|
||||
followersLabel.setText(getResources().getQuantityString(R.plurals.followers, (int)Math.min(999, item.account.followersCount)));
|
||||
followingLabel.setText(getResources().getQuantityString(R.plurals.following, (int)Math.min(999, item.account.followingCount)));
|
||||
postsLabel.setText(getResources().getQuantityString(R.plurals.x_posts, (int)(item.account.statusesCount%1000), item.account.statusesCount));
|
||||
postsLabel.setText(getResources().getQuantityString(R.plurals.sk_posts_count_label, (int)(item.account.statusesCount%1000), item.account.statusesCount));
|
||||
followersCount.setVisibility(item.account.followersCount < 0 ? View.GONE : View.VISIBLE);
|
||||
followersLabel.setVisibility(item.account.followersCount < 0 ? View.GONE : View.VISIBLE);
|
||||
followingCount.setVisibility(item.account.followingCount < 0 ? View.GONE : View.VISIBLE);
|
||||
followingLabel.setVisibility(item.account.followingCount < 0 ? View.GONE : View.VISIBLE);
|
||||
relationship=relationships.get(item.account.id);
|
||||
UiUtils.setExtraTextInfo(getContext(), null, findViewById(R.id.pronouns), true, false, false, item.account);
|
||||
|
||||
if(relationship==null){
|
||||
actionWrap.setVisibility(View.GONE);
|
||||
}else{
|
||||
|
||||
@@ -70,7 +70,7 @@ public class SearchFragment extends BaseStatusListFragment<SearchResult>{
|
||||
return switch(s.type){
|
||||
case ACCOUNT -> Collections.singletonList(new AccountStatusDisplayItem(s.id, this, s.account));
|
||||
case HASHTAG -> Collections.singletonList(new HashtagStatusDisplayItem(s.id, this, s.hashtag));
|
||||
case STATUS -> StatusDisplayItem.buildItems(this, s.status, accountID, s, knownAccounts, FilterContext.PUBLIC, !getLocalPrefs().showEmojiReactionsInLists ? StatusDisplayItem.FLAG_NO_EMOJI_REACTIONS : 0);
|
||||
case STATUS -> StatusDisplayItem.buildItems(this, s.status, accountID, s, knownAccounts, FilterContext.PUBLIC, 0);
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -139,7 +139,9 @@ public class CustomWelcomeFragment extends InstanceCatalogFragment {
|
||||
headerView.findViewById(R.id.more).setVisibility(View.GONE);
|
||||
headerView.findViewById(R.id.visibility).setVisibility(View.GONE);
|
||||
headerView.findViewById(R.id.unread_indicator).setVisibility(View.GONE);
|
||||
((TextView) headerView.findViewById(R.id.time_and_username)).setText(R.string.sk_app_username);
|
||||
headerView.findViewById(R.id.separator).setVisibility(View.GONE);
|
||||
headerView.findViewById(R.id.time).setVisibility(View.GONE);
|
||||
((TextView) headerView.findViewById(R.id.username)).setText(R.string.sk_app_username);
|
||||
((TextView) headerView.findViewById(R.id.name)).setText(R.string.sk_app_name);
|
||||
((ImageView) headerView.findViewById(R.id.avatar)).setImageDrawable(getActivity().getDrawable(R.mipmap.ic_launcher));
|
||||
((FragmentStackActivity) getActivity()).invalidateSystemBarColors(this);
|
||||
|
||||
@@ -16,6 +16,7 @@ import org.joinmastodon.android.model.viewmodel.ListItem;
|
||||
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import me.grishka.appkit.imageloader.ImageCache;
|
||||
@@ -32,7 +33,7 @@ public class SettingsAboutAppFragment extends BaseSettingsFragment<Void>{
|
||||
setTitle(getString(R.string.about_app, getString(R.string.sk_app_name)));
|
||||
AccountSession s=AccountSessionManager.get(accountID);
|
||||
onDataLoaded(List.of(
|
||||
new ListItem<>(R.string.sk_settings_donate, 0, R.drawable.ic_fluent_heart_24_regular, ()->UiUtils.launchWebBrowser(getActivity(), getString(R.string.donate_url))),
|
||||
new ListItem<>(R.string.sk_settings_donate, 0, R.drawable.ic_fluent_heart_24_regular, ()->UiUtils.openHashtagTimeline(getActivity(), accountID, getString(R.string.donate_hashtag), null)),
|
||||
new ListItem<>(R.string.sk_settings_contribute, 0, R.drawable.ic_fluent_open_24_regular, ()->UiUtils.launchWebBrowser(getActivity(), getString(R.string.repo_url))),
|
||||
new ListItem<>(R.string.settings_tos, 0, R.drawable.ic_fluent_open_24_regular, ()->UiUtils.launchWebBrowser(getActivity(), "https://"+s.domain+"/terms")),
|
||||
new ListItem<>(R.string.settings_privacy_policy, 0, R.drawable.ic_fluent_open_24_regular, ()->UiUtils.launchWebBrowser(getActivity(), getString(R.string.privacy_policy_url)), 0, true),
|
||||
|
||||
@@ -2,10 +2,14 @@ package org.joinmastodon.android.fragments.settings;
|
||||
|
||||
import android.os.Bundle;
|
||||
|
||||
import androidx.annotation.StringRes;
|
||||
|
||||
import org.joinmastodon.android.E;
|
||||
import org.joinmastodon.android.R;
|
||||
import org.joinmastodon.android.api.session.AccountLocalPreferences;
|
||||
import org.joinmastodon.android.api.session.AccountSession;
|
||||
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||
import org.joinmastodon.android.events.StatusDisplaySettingsChangedEvent;
|
||||
import org.joinmastodon.android.fragments.HasAccountID;
|
||||
import org.joinmastodon.android.model.ContentType;
|
||||
import org.joinmastodon.android.model.viewmodel.CheckableListItem;
|
||||
@@ -15,12 +19,13 @@ import org.joinmastodon.android.ui.utils.UiUtils;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.stream.IntStream;
|
||||
|
||||
import me.grishka.appkit.Nav;
|
||||
|
||||
public class SettingsInstanceFragment extends BaseSettingsFragment<Void> implements HasAccountID{
|
||||
private CheckableListItem<Void> contentTypesItem, emojiReactionsItem, emojiReactionsInListsItem, localOnlyItem, glitchModeItem;
|
||||
private ListItem<Void> defaultContentTypeItem;
|
||||
private CheckableListItem<Void> contentTypesItem, emojiReactionsItem, localOnlyItem, glitchModeItem;
|
||||
private ListItem<Void> defaultContentTypeItem, showEmojiReactionsItem;
|
||||
private AccountLocalPreferences lp;
|
||||
|
||||
@Override
|
||||
@@ -35,16 +40,16 @@ public class SettingsInstanceFragment extends BaseSettingsFragment<Void> impleme
|
||||
new ListItem<>(R.string.sk_settings_posting, 0, R.drawable.ic_fluent_open_24_regular, ()->UiUtils.launchWebBrowser(getActivity(), "https://"+s.domain+"/settings/preferences/other")),
|
||||
new ListItem<>(R.string.sk_settings_auth, 0, R.drawable.ic_fluent_open_24_regular, ()->UiUtils.launchWebBrowser(getActivity(), "https://"+s.domain+"/auth/edit"), 0, true),
|
||||
contentTypesItem=new CheckableListItem<>(R.string.sk_settings_content_types, R.string.sk_settings_content_types_explanation, CheckableListItem.Style.SWITCH, lp.contentTypesEnabled, R.drawable.ic_fluent_text_edit_style_24_regular, this::onContentTypeClick),
|
||||
defaultContentTypeItem=new ListItem<>(R.string.sk_settings_default_content_type, lp.defaultContentType.getName(), R.drawable.ic_fluent_text_bold_24_regular, this::onDefaultContentTypeClick),
|
||||
defaultContentTypeItem=new ListItem<>(R.string.sk_settings_default_content_type, lp.defaultContentType.getName(), R.drawable.ic_fluent_text_bold_24_regular, this::onDefaultContentTypeClick, 0, true),
|
||||
emojiReactionsItem=new CheckableListItem<>(R.string.sk_settings_emoji_reactions, R.string.sk_settings_emoji_reactions_explanation, CheckableListItem.Style.SWITCH, lp.emojiReactionsEnabled, R.drawable.ic_fluent_emoji_laugh_24_regular, this::onEmojiReactionsClick),
|
||||
emojiReactionsInListsItem=new CheckableListItem<>(R.string.sk_settings_emoji_reactions_in_lists, R.string.sk_settings_emoji_reactions_in_lists_explanation, CheckableListItem.Style.SWITCH, lp.showEmojiReactionsInLists, R.drawable.ic_fluent_emoji_24_regular, ()->toggleCheckableItem(emojiReactionsInListsItem)),
|
||||
showEmojiReactionsItem=new ListItem<>(R.string.sk_settings_show_emoji_reactions, getShowEmojiReactionsString(), R.drawable.ic_fluent_emoji_24_regular, this::onShowEmojiReactionsClick, 0, true),
|
||||
localOnlyItem=new CheckableListItem<>(R.string.sk_settings_support_local_only, R.string.sk_settings_local_only_explanation, CheckableListItem.Style.SWITCH, lp.localOnlySupported, R.drawable.ic_fluent_eye_24_regular, this::onLocalOnlyClick),
|
||||
glitchModeItem=new CheckableListItem<>(R.string.sk_settings_glitch_instance, R.string.sk_settings_glitch_mode_explanation, CheckableListItem.Style.SWITCH, lp.glitchInstance, R.drawable.ic_fluent_eye_24_filled, ()->toggleCheckableItem(glitchModeItem))
|
||||
));
|
||||
contentTypesItem.checkedChangeListener=checked->onContentTypeClick();
|
||||
defaultContentTypeItem.isEnabled=contentTypesItem.checked;
|
||||
emojiReactionsItem.checkedChangeListener=checked->onEmojiReactionsClick();
|
||||
emojiReactionsInListsItem.isEnabled=emojiReactionsItem.checked;
|
||||
showEmojiReactionsItem.isEnabled=emojiReactionsItem.checked;
|
||||
localOnlyItem.checkedChangeListener=checked->onLocalOnlyClick();
|
||||
glitchModeItem.isEnabled=localOnlyItem.checked;
|
||||
}
|
||||
@@ -57,10 +62,10 @@ public class SettingsInstanceFragment extends BaseSettingsFragment<Void> impleme
|
||||
super.onHidden();
|
||||
lp.contentTypesEnabled=contentTypesItem.checked;
|
||||
lp.emojiReactionsEnabled=emojiReactionsItem.checked;
|
||||
lp.showEmojiReactionsInLists=emojiReactionsInListsItem.checked;
|
||||
lp.localOnlySupported=localOnlyItem.checked;
|
||||
lp.glitchInstance=glitchModeItem.checked;
|
||||
lp.save();
|
||||
E.post(new StatusDisplaySettingsChangedEvent(accountID));
|
||||
}
|
||||
|
||||
private void onServerClick(){
|
||||
@@ -107,11 +112,34 @@ public class SettingsInstanceFragment extends BaseSettingsFragment<Void> impleme
|
||||
.show();
|
||||
}
|
||||
|
||||
private void onShowEmojiReactionsClick(){
|
||||
int selected=lp.showEmojiReactions.ordinal();
|
||||
int[] newSelected={selected};
|
||||
new M3AlertDialogBuilder(getActivity())
|
||||
.setTitle(R.string.sk_settings_show_emoji_reactions)
|
||||
.setSingleChoiceItems((String[]) IntStream.of(R.string.sk_settings_show_emoji_reactions_hide_empty, R.string.sk_settings_show_emoji_reactions_only_opened, R.string.sk_settings_show_emoji_reactions_always).mapToObj(this::getString).toArray(String[]::new),
|
||||
selected, (dlg, item)->newSelected[0]=item)
|
||||
.setPositiveButton(R.string.ok, (dlg, item)->{
|
||||
lp.showEmojiReactions=AccountLocalPreferences.ShowEmojiReactions.values()[newSelected[0]];
|
||||
showEmojiReactionsItem.subtitleRes=getShowEmojiReactionsString();
|
||||
rebindItem(showEmojiReactionsItem);
|
||||
})
|
||||
.setNegativeButton(R.string.cancel, null)
|
||||
.show();
|
||||
}
|
||||
|
||||
private @StringRes int getShowEmojiReactionsString(){
|
||||
return switch(lp.showEmojiReactions){
|
||||
case HIDE_EMPTY -> R.string.sk_settings_show_emoji_reactions_hide_empty;
|
||||
case ONLY_OPENED -> R.string.sk_settings_show_emoji_reactions_only_opened;
|
||||
case ALWAYS -> R.string.sk_settings_show_emoji_reactions_always;
|
||||
};
|
||||
}
|
||||
|
||||
private void onEmojiReactionsClick(){
|
||||
toggleCheckableItem(emojiReactionsItem);
|
||||
emojiReactionsInListsItem.checked=false;
|
||||
emojiReactionsInListsItem.isEnabled=emojiReactionsItem.checked;
|
||||
rebindItem(emojiReactionsInListsItem);
|
||||
showEmojiReactionsItem.isEnabled=emojiReactionsItem.checked;
|
||||
rebindItem(showEmojiReactionsItem);
|
||||
}
|
||||
|
||||
private void onLocalOnlyClick(){
|
||||
|
||||
@@ -98,6 +98,7 @@ public class SettingsNotificationsFragment extends BaseSettingsFragment<Void>{
|
||||
|
||||
typeItems=List.of(mentionsItem, boostsItem, favoritesItem, followersItem, pollsItem, updateItem, postsItem);
|
||||
pauseItem.checkedChangeListener=checked->onPauseNotificationsClick(true);
|
||||
unifiedPushItem.checkedChangeListener=checked->onUnifiedPush();
|
||||
updatePolicyItem(null);
|
||||
updatePauseItem();
|
||||
}
|
||||
@@ -347,7 +348,7 @@ public class SettingsNotificationsFragment extends BaseSettingsFragment<Void>{
|
||||
|
||||
private void showUnifiedPushRegisterDialog(List<String> distributors){
|
||||
new M3AlertDialogBuilder(getContext()).setTitle(R.string.sk_settings_unifiedpush_choose).setItems(distributors.toArray(String[]::new),
|
||||
(dialog, which) ->{
|
||||
(dialog, which)->{
|
||||
String userDistrib = distributors.get(which);
|
||||
UnifiedPush.saveDistributor(getContext(), userDistrib);
|
||||
UnifiedPush.registerApp(
|
||||
@@ -358,6 +359,6 @@ public class SettingsNotificationsFragment extends BaseSettingsFragment<Void>{
|
||||
);
|
||||
unifiedPushItem.toggle();
|
||||
rebindItem(unifiedPushItem);
|
||||
}).show();
|
||||
}).setOnCancelListener(d->rebindItem(unifiedPushItem)).show();
|
||||
}
|
||||
}
|
||||
@@ -41,6 +41,12 @@ public class Emoji extends BaseModel{
|
||||
this.staticUrl = staticUrl;
|
||||
}
|
||||
|
||||
public String getUrl(boolean playGifs){
|
||||
String idealUrl=playGifs ? url : staticUrl;
|
||||
if(idealUrl==null) return url==null ? staticUrl : url;
|
||||
return idealUrl;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString(){
|
||||
return "Emoji{"+
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package org.joinmastodon.android.model;
|
||||
|
||||
import org.joinmastodon.android.GlobalUserPreferences;
|
||||
import org.parceler.Parcel;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -22,6 +23,12 @@ public class EmojiReaction {
|
||||
|
||||
public transient ImageLoaderRequest request;
|
||||
|
||||
public String getUrl(boolean playGifs){
|
||||
String idealUrl=playGifs ? url : staticUrl;
|
||||
if(idealUrl==null) return url==null ? staticUrl : url;
|
||||
return idealUrl;
|
||||
}
|
||||
|
||||
public static EmojiReaction of(Emoji info, Account me){
|
||||
EmojiReaction reaction=new EmojiReaction();
|
||||
reaction.me=true;
|
||||
|
||||
@@ -14,6 +14,7 @@ public class FilterResult extends BaseModel {
|
||||
@Override
|
||||
public void postprocess() throws ObjectValidationException {
|
||||
super.postprocess();
|
||||
if (filter != null) filter.postprocess();
|
||||
if(filter!=null) filter.postprocess();
|
||||
if(keywordMatches==null) keywordMatches=List.of();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,10 +13,10 @@ import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParseException;
|
||||
|
||||
import org.joinmastodon.android.GlobalUserPreferences;
|
||||
import org.joinmastodon.android.api.ObjectValidationException;
|
||||
import org.joinmastodon.android.api.RequiredField;
|
||||
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||
import org.joinmastodon.android.events.EmojiReactionsUpdatedEvent;
|
||||
import org.joinmastodon.android.events.StatusCountersUpdatedEvent;
|
||||
import org.joinmastodon.android.ui.text.HtmlParser;
|
||||
import org.parceler.Parcel;
|
||||
@@ -114,8 +114,8 @@ public class Status extends BaseModel implements DisplayItemsParent, Searchable{
|
||||
for(FilterResult fr:filtered)
|
||||
fr.postprocess();
|
||||
|
||||
if(!TextUtils.isEmpty(spoilerText)) sensitive=true;
|
||||
spoilerRevealed=TextUtils.isEmpty(spoilerText);
|
||||
spoilerRevealed=!hasSpoiler();
|
||||
if(!spoilerRevealed) sensitive=true;
|
||||
sensitiveRevealed=!sensitive;
|
||||
if(visibility.equals(StatusPrivacy.LOCAL)) localOnly=true;
|
||||
if(emojiReactions!=null) reactions=emojiReactions;
|
||||
@@ -175,6 +175,9 @@ public class Status extends BaseModel implements DisplayItemsParent, Searchable{
|
||||
reblogged=ev.reblogged;
|
||||
bookmarked=ev.bookmarked;
|
||||
pinned=ev.pinned;
|
||||
}
|
||||
|
||||
public void update(EmojiReactionsUpdatedEvent ev){
|
||||
reactions=ev.reactions;
|
||||
}
|
||||
|
||||
@@ -188,6 +191,10 @@ public class Status extends BaseModel implements DisplayItemsParent, Searchable{
|
||||
return strippedText;
|
||||
}
|
||||
|
||||
public boolean hasSpoiler(){
|
||||
return !TextUtils.isEmpty(spoilerText);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public Status clone(){
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -37,6 +37,16 @@ public class OutlineProviders{
|
||||
}
|
||||
};
|
||||
|
||||
private final static int BUTTON_BG_HEIGHT=V.dp(40);
|
||||
public static final ViewOutlineProvider M3_BUTTON=new ViewOutlineProvider(){
|
||||
@Override
|
||||
public void getOutline(View view, Outline outline){
|
||||
int viewHeight=view.getHeight();
|
||||
int top=Math.floorDiv(viewHeight - BUTTON_BG_HEIGHT, 2);
|
||||
outline.setRoundRect(0, top, view.getWidth(), top + BUTTON_BG_HEIGHT, V.dp(20));
|
||||
}
|
||||
};
|
||||
|
||||
public static ViewOutlineProvider roundedRect(int dp){
|
||||
ViewOutlineProvider provider=roundedRects.get(dp);
|
||||
if(provider!=null)
|
||||
|
||||
@@ -111,15 +111,24 @@ public class AccountCardStatusDisplayItem extends StatusDisplayItem{
|
||||
rejectWrap=findViewById(R.id.reject_btn_wrap);
|
||||
|
||||
View card=findViewById(R.id.card);
|
||||
card.setOutlineProvider(OutlineProviders.roundedRect(6));
|
||||
card.setOutlineProvider(OutlineProviders.roundedRect(12));
|
||||
card.setClipToOutline(true);
|
||||
avatar.setOutlineProvider(OutlineProviders.roundedRect(12));
|
||||
avatar.setOutlineProvider(OutlineProviders.roundedRect(15));
|
||||
avatar.setClipToOutline(true);
|
||||
cover.setOutlineProvider(OutlineProviders.roundedRect(3));
|
||||
View border=findViewById(R.id.avatar_border);
|
||||
border.setOutlineProvider(OutlineProviders.roundedRect(17));
|
||||
border.setClipToOutline(true);
|
||||
cover.setOutlineProvider(OutlineProviders.roundedRect(9));
|
||||
cover.setClipToOutline(true);
|
||||
actionButton.setOnClickListener(this::onActionButtonClick);
|
||||
acceptButton.setOnClickListener(this::onFollowRequestButtonClick);
|
||||
rejectButton.setOnClickListener(this::onFollowRequestButtonClick);
|
||||
card.setOnClickListener(v->onClick());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEnabled(){
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -132,18 +141,19 @@ public class AccountCardStatusDisplayItem extends StatusDisplayItem{
|
||||
postsCount.setText(UiUtils.abbreviateNumber(item.account.statusesCount));
|
||||
followersLabel.setText(item.parentFragment.getResources().getQuantityString(R.plurals.followers, (int)Math.min(999, item.account.followersCount)));
|
||||
followingLabel.setText(item.parentFragment.getResources().getQuantityString(R.plurals.following, (int)Math.min(999, item.account.followingCount)));
|
||||
postsLabel.setText(item.parentFragment.getResources().getQuantityString(R.plurals.x_posts, (int)(item.account.statusesCount%1000), item.account.statusesCount));
|
||||
postsLabel.setText(item.parentFragment.getResources().getQuantityString(R.plurals.sk_posts_count_label, (int)(item.account.statusesCount%1000), item.account.statusesCount));
|
||||
followersCount.setVisibility(item.account.followersCount < 0 ? View.GONE : View.VISIBLE);
|
||||
followersLabel.setVisibility(item.account.followersCount < 0 ? View.GONE : View.VISIBLE);
|
||||
followingCount.setVisibility(item.account.followingCount < 0 ? View.GONE : View.VISIBLE);
|
||||
followingLabel.setVisibility(item.account.followingCount < 0 ? View.GONE : View.VISIBLE);
|
||||
relationship=item.parentFragment.getRelationship(item.account.id);
|
||||
if(item.notification.type == Notification.Type.FOLLOW_REQUEST && (relationship == null || !relationship.followedBy)){
|
||||
UiUtils.setExtraTextInfo(item.parentFragment.getContext(), null, findViewById(R.id.pronouns), true, false, false, item.account);
|
||||
|
||||
if(item.notification.type==Notification.Type.FOLLOW_REQUEST && (relationship==null || !relationship.followedBy)){
|
||||
actionWrap.setVisibility(View.GONE);
|
||||
acceptWrap.setVisibility(View.VISIBLE);
|
||||
rejectWrap.setVisibility(View.VISIBLE);
|
||||
|
||||
// i hate that i wasn't able to do this in xml
|
||||
acceptButton.setCompoundDrawableTintList(acceptButton.getTextColors());
|
||||
acceptProgress.setIndeterminateTintList(acceptButton.getTextColors());
|
||||
rejectButton.setCompoundDrawableTintList(rejectButton.getTextColors());
|
||||
@@ -163,7 +173,7 @@ public class AccountCardStatusDisplayItem extends StatusDisplayItem{
|
||||
private void onFollowRequestButtonClick(View v) {
|
||||
itemView.setHasTransientState(true);
|
||||
UiUtils.handleFollowRequest((Activity) v.getContext(), item.account, item.parentFragment.getAccountID(), null, v == acceptButton, relationship, rel -> {
|
||||
if(v.getContext()==null) return;
|
||||
if(v.getContext()==null || rel==null) return;
|
||||
itemView.setHasTransientState(false);
|
||||
item.parentFragment.putRelationship(item.account.id, rel);
|
||||
RecyclerView.Adapter<? extends RecyclerView.ViewHolder> adapter = getBindingAdapter();
|
||||
|
||||
@@ -17,9 +17,11 @@ import android.widget.ProgressBar;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.LinearSmoothScroller;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import org.joinmastodon.android.E;
|
||||
import org.joinmastodon.android.GlobalUserPreferences;
|
||||
import org.joinmastodon.android.R;
|
||||
import org.joinmastodon.android.api.MastodonAPIRequest;
|
||||
import org.joinmastodon.android.api.requests.announcements.AddAnnouncementReaction;
|
||||
@@ -30,11 +32,10 @@ import org.joinmastodon.android.api.requests.statuses.PleromaAddStatusReaction;
|
||||
import org.joinmastodon.android.api.requests.statuses.PleromaDeleteStatusReaction;
|
||||
import org.joinmastodon.android.api.session.AccountSession;
|
||||
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||
import org.joinmastodon.android.events.StatusCountersUpdatedEvent;
|
||||
import org.joinmastodon.android.events.EmojiReactionsUpdatedEvent;
|
||||
import org.joinmastodon.android.fragments.BaseStatusListFragment;
|
||||
import org.joinmastodon.android.fragments.account_list.StatusEmojiReactionsListFragment;
|
||||
import org.joinmastodon.android.model.Account;
|
||||
import org.joinmastodon.android.model.Announcement;
|
||||
import org.joinmastodon.android.model.Emoji;
|
||||
import org.joinmastodon.android.model.EmojiReaction;
|
||||
import org.joinmastodon.android.model.Status;
|
||||
@@ -59,24 +60,24 @@ import me.grishka.appkit.views.UsableRecyclerView;
|
||||
public class EmojiReactionsStatusDisplayItem extends StatusDisplayItem {
|
||||
public final Status status;
|
||||
private final Drawable placeholder;
|
||||
private final boolean hideAdd, forAnnouncement;
|
||||
private final boolean hideEmpty, forAnnouncement, playGifs;
|
||||
private final String accountID;
|
||||
private boolean hidden;
|
||||
private static final float ALPHA_DISABLED=0.55f;
|
||||
|
||||
public EmojiReactionsStatusDisplayItem(String parentID, BaseStatusListFragment<?> parentFragment, Status status, String accountID, boolean hideAdd, boolean forAnnouncement) {
|
||||
public EmojiReactionsStatusDisplayItem(String parentID, BaseStatusListFragment<?> parentFragment, Status status, String accountID, boolean hideEmpty, boolean forAnnouncement) {
|
||||
super(parentID, parentFragment);
|
||||
this.status=status;
|
||||
this.hideAdd=hideAdd;
|
||||
this.hideEmpty=hideEmpty;
|
||||
this.forAnnouncement=forAnnouncement;
|
||||
this.accountID=accountID;
|
||||
placeholder=parentFragment.getContext().getDrawable(R.drawable.image_placeholder).mutate();
|
||||
placeholder.setBounds(0, 0, V.sp(24), V.sp(24));
|
||||
updateHidden();
|
||||
playGifs=GlobalUserPreferences.playGifs;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getImageCount(){
|
||||
return (int) status.reactions.stream().filter(r->r.url != null).count();
|
||||
return (int) status.reactions.stream().filter(r->r.getUrl(playGifs)!=null).count();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -90,23 +91,18 @@ public class EmojiReactionsStatusDisplayItem extends StatusDisplayItem {
|
||||
}
|
||||
|
||||
public boolean isHidden(){
|
||||
return hidden;
|
||||
}
|
||||
|
||||
private void updateHidden(){
|
||||
hidden=status.reactions.isEmpty() && hideAdd;
|
||||
return status.reactions.isEmpty() && hideEmpty;
|
||||
}
|
||||
|
||||
// borrowed from ProfileFragment
|
||||
private void setActionProgressVisible(Holder.EmojiReactionViewHolder vh, boolean visible){
|
||||
if(vh==null) return;
|
||||
vh.progress.setVisibility(visible ? View.VISIBLE : View.GONE);
|
||||
if(visible)
|
||||
vh.progress.setIndeterminateTintList(vh.btn.getTextColors());
|
||||
vh.btn.setClickable(!visible);
|
||||
vh.btn.setAlpha(visible ? ALPHA_DISABLED : 1);
|
||||
}
|
||||
|
||||
private MastodonAPIRequest<?> createRequest(String name, int count, boolean delete, Holder.EmojiReactionViewHolder vh, Runnable cb){
|
||||
private MastodonAPIRequest<?> createRequest(String name, int count, boolean delete, Holder.EmojiReactionViewHolder vh, Runnable cb, Runnable err){
|
||||
setActionProgressVisible(vh, true);
|
||||
boolean ak=parentFragment.isInstanceAkkoma();
|
||||
boolean keepSpinning=delete && count == 1;
|
||||
@@ -124,6 +120,7 @@ public class EmojiReactionsStatusDisplayItem extends StatusDisplayItem {
|
||||
public void onError(ErrorResponse error){
|
||||
setActionProgressVisible(vh, false);
|
||||
error.showToast(parentFragment.getContext());
|
||||
if(err!=null) err.run();
|
||||
}
|
||||
});
|
||||
}else{
|
||||
@@ -140,6 +137,7 @@ public class EmojiReactionsStatusDisplayItem extends StatusDisplayItem {
|
||||
public void onError(ErrorResponse error){
|
||||
setActionProgressVisible(vh, false);
|
||||
error.showToast(parentFragment.getContext());
|
||||
if(err!=null) err.run();
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -151,6 +149,7 @@ public class EmojiReactionsStatusDisplayItem extends StatusDisplayItem {
|
||||
private CustomEmojiPopupKeyboard emojiKeyboard;
|
||||
private final View space;
|
||||
private final ImageButton addButton;
|
||||
private final ProgressBar progress;
|
||||
private final EmojiReactionsAdapter adapter;
|
||||
private final ListImageLoaderWrapper imgLoader;
|
||||
|
||||
@@ -162,6 +161,7 @@ public class EmojiReactionsStatusDisplayItem extends StatusDisplayItem {
|
||||
imgLoader=new ListImageLoaderWrapper(activity, list, new RecyclerViewDelegate(list), null);
|
||||
list.setAdapter(adapter=new EmojiReactionsAdapter(this, imgLoader));
|
||||
addButton=findViewById(R.id.add_btn);
|
||||
progress=findViewById(R.id.progress);
|
||||
addButton.setOnClickListener(this::onReactClick);
|
||||
space=findViewById(R.id.space);
|
||||
list.setLayoutManager(new LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL, false));
|
||||
@@ -171,8 +171,9 @@ public class EmojiReactionsStatusDisplayItem extends StatusDisplayItem {
|
||||
public void onBind(EmojiReactionsStatusDisplayItem item) {
|
||||
if(emojiKeyboard != null) root.removeView(emojiKeyboard.getView());
|
||||
AccountSession session=item.parentFragment.getSession();
|
||||
item.status.reactions.forEach(r->
|
||||
r.request=r.url != null ? new UrlImageLoaderRequest(r.url, V.sp(24), V.sp(24)) : null);
|
||||
item.status.reactions.forEach(r->r.request=r.getUrl(item.playGifs)!=null
|
||||
? new UrlImageLoaderRequest(r.getUrl(item.playGifs), V.sp(24), V.sp(24))
|
||||
: null);
|
||||
emojiKeyboard=new CustomEmojiPopupKeyboard(
|
||||
(Activity) item.parentFragment.getContext(),
|
||||
AccountSessionManager.getInstance().getCustomEmojis(session.domain),
|
||||
@@ -180,12 +181,12 @@ public class EmojiReactionsStatusDisplayItem extends StatusDisplayItem {
|
||||
emojiKeyboard.setListener(this);
|
||||
space.setVisibility(View.GONE);
|
||||
root.addView(emojiKeyboard.getView());
|
||||
item.updateHidden();
|
||||
root.setVisibility(item.hidden ? View.GONE : View.VISIBLE);
|
||||
line.setVisibility(item.hidden ? View.GONE : View.VISIBLE);
|
||||
boolean hidden=item.isHidden();
|
||||
root.setVisibility(hidden ? View.GONE : View.VISIBLE);
|
||||
line.setVisibility(hidden ? View.GONE : View.VISIBLE);
|
||||
line.setPadding(
|
||||
list.getPaddingLeft(),
|
||||
item.hidden ? 0 : V.dp(8),
|
||||
hidden ? 0 : V.dp(8),
|
||||
list.getPaddingRight(),
|
||||
item.forAnnouncement ? V.dp(8) : 0
|
||||
);
|
||||
@@ -212,25 +213,51 @@ public class EmojiReactionsStatusDisplayItem extends StatusDisplayItem {
|
||||
}
|
||||
|
||||
private void addEmojiReaction(String emoji, Emoji info) {
|
||||
if(item.status.reactions.stream().filter(r->r.name.equals(emoji) && r.me).findAny().isPresent()) return;
|
||||
int countBefore=item.status.reactions.size();
|
||||
for(int i=0; i<item.status.reactions.size(); i++){
|
||||
EmojiReaction r=item.status.reactions.get(i);
|
||||
if(r.name.equals(emoji) && r.me){
|
||||
RecyclerView.SmoothScroller scroller=new LinearSmoothScroller(list.getContext());
|
||||
scroller.setTargetPosition(i);
|
||||
list.getLayoutManager().startSmoothScroll(scroller);
|
||||
return; // nothing to do, already added
|
||||
}
|
||||
}
|
||||
|
||||
progress.setVisibility(View.VISIBLE);
|
||||
addButton.setClickable(false);
|
||||
addButton.setAlpha(ALPHA_DISABLED);
|
||||
|
||||
Runnable resetBtn=()->{
|
||||
progress.setVisibility(View.GONE);
|
||||
addButton.setClickable(true);
|
||||
addButton.setAlpha(1f);
|
||||
};
|
||||
Account me=AccountSessionManager.get(item.accountID).self;
|
||||
EmojiReaction existing=null;
|
||||
for(int i=0; i<item.status.reactions.size(); i++){
|
||||
EmojiReaction r=item.status.reactions.get(i);
|
||||
if(r.name.equals(emoji)){
|
||||
existing=r;
|
||||
r.add(me);
|
||||
adapter.notifyItemChanged(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(existing==null){
|
||||
item.status.reactions.add(0, info!=null ? EmojiReaction.of(info, me) : EmojiReaction.of(emoji, me));
|
||||
adapter.notifyItemRangeInserted(0, 1);
|
||||
}
|
||||
E.post(new StatusCountersUpdatedEvent(item.status, adapter.parentHolder));
|
||||
item.createRequest(emoji, existing==null ? 1 : existing.count, false, null, ()->{}).exec(item.accountID);
|
||||
EmojiReaction finalExisting=existing;
|
||||
item.createRequest(emoji, existing==null ? 1 : existing.count, false, null, ()->{
|
||||
resetBtn.run();
|
||||
if(finalExisting==null){
|
||||
int pos=item.status.reactions.size();
|
||||
item.status.reactions.add(pos, info!=null ? EmojiReaction.of(info, me) : EmojiReaction.of(emoji, me));
|
||||
adapter.notifyItemRangeInserted(pos, 1);
|
||||
RecyclerView.SmoothScroller scroller=new LinearSmoothScroller(list.getContext());
|
||||
scroller.setTargetPosition(pos);
|
||||
list.getLayoutManager().startSmoothScroll(scroller);
|
||||
}else{
|
||||
finalExisting.add(me);
|
||||
adapter.notifyItemChanged(item.status.reactions.indexOf(finalExisting));
|
||||
}
|
||||
E.post(new EmojiReactionsUpdatedEvent(item.status.id, item.status.reactions, countBefore==0, adapter.parentHolder));
|
||||
}, resetBtn).exec(item.accountID);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -259,7 +286,7 @@ public class EmojiReactionsStatusDisplayItem extends StatusDisplayItem {
|
||||
|
||||
@Override
|
||||
public void clearImage(int index){
|
||||
if(item.status.reactions.get(index).url==null) return;
|
||||
if(item.status.reactions.get(index).getUrl(item.playGifs)==null) return;
|
||||
setImage(index, item.placeholder);
|
||||
}
|
||||
|
||||
@@ -292,7 +319,7 @@ public class EmojiReactionsStatusDisplayItem extends StatusDisplayItem {
|
||||
|
||||
@Override
|
||||
public int getImageCountForItem(int position){
|
||||
return item.status.reactions.get(position).url == null ? 0 : 1;
|
||||
return item.status.reactions.get(position).getUrl(item.playGifs)==null ? 0 : 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -309,6 +336,7 @@ public class EmojiReactionsStatusDisplayItem extends StatusDisplayItem {
|
||||
super(context, R.layout.item_emoji_reaction, list);
|
||||
btn=findViewById(R.id.btn);
|
||||
progress=findViewById(R.id.progress);
|
||||
itemView.setClickable(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -331,7 +359,7 @@ public class EmojiReactionsStatusDisplayItem extends StatusDisplayItem {
|
||||
btn.setText(UiUtils.abbreviateNumber(reaction.count));
|
||||
btn.setContentDescription(reaction.name);
|
||||
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) btn.setTooltipText(reaction.name);
|
||||
if(reaction.url==null){
|
||||
if(reaction.getUrl(parent.playGifs)==null){
|
||||
Paint p=new Paint();
|
||||
p.setTextSize(V.sp(18));
|
||||
TextDrawable drawable=new TextDrawable(p, reaction.name);
|
||||
@@ -359,9 +387,13 @@ public class EmojiReactionsStatusDisplayItem extends StatusDisplayItem {
|
||||
break;
|
||||
}
|
||||
|
||||
E.post(new StatusCountersUpdatedEvent(parent.status, adapter.parentHolder));
|
||||
if(parent.isHidden()){
|
||||
adapter.parentHolder.root.setVisibility(View.GONE);
|
||||
adapter.parentHolder.line.setVisibility(View.GONE);
|
||||
}
|
||||
E.post(new EmojiReactionsUpdatedEvent(parent.status.id, parent.status.reactions, parent.status.reactions.isEmpty(), adapter.parentHolder));
|
||||
adapter.parentHolder.imgLoader.updateImages();
|
||||
}).exec(parent.parentFragment.getAccountID());
|
||||
}, null).exec(parent.parentFragment.getAccountID());
|
||||
});
|
||||
|
||||
if (parent.parentFragment.isInstanceAkkoma()) {
|
||||
@@ -373,7 +405,7 @@ public class EmojiReactionsStatusDisplayItem extends StatusDisplayItem {
|
||||
args.putString("statusID", parent.status.id);
|
||||
int atSymbolIndex = emojiReaction.name.indexOf("@");
|
||||
args.putString("emoji", atSymbolIndex != -1 ? emojiReaction.name.substring(0, atSymbolIndex) : emojiReaction.name);
|
||||
args.putString("url", emojiReaction.url);
|
||||
args.putString("url", emojiReaction.getUrl(parent.playGifs));
|
||||
args.putInt("count", emojiReaction.count);
|
||||
Nav.go(parent.parentFragment.getActivity(), StatusEmojiReactionsListFragment.class, args);
|
||||
return true;
|
||||
|
||||
@@ -132,9 +132,9 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
|
||||
}
|
||||
|
||||
public static class Holder extends StatusDisplayItem.Holder<HeaderStatusDisplayItem> implements ImageLoaderViewHolder{
|
||||
private final TextView name, timeAndUsername, extraText, pronouns;
|
||||
private final View collapseBtn;
|
||||
private final ImageView avatar, more, visibility, deleteNotification, unreadIndicator, markAsRead, collapseBtnIcon;
|
||||
private final TextView name, time, username, extraText, pronouns;
|
||||
private final View collapseBtn, timeUsernameSeparator;
|
||||
private final ImageView avatar, more, visibility, deleteNotification, unreadIndicator, markAsRead, collapseBtnIcon, botIcon;
|
||||
private final PopupMenu optionsMenu;
|
||||
private Relationship relationship;
|
||||
private APIRequest<?> currentRelationshipRequest;
|
||||
@@ -146,7 +146,10 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
|
||||
protected Holder(Activity activity, @LayoutRes int layout, ViewGroup parent){
|
||||
super(activity, layout, parent);
|
||||
name=findViewById(R.id.name);
|
||||
timeAndUsername=findViewById(R.id.time_and_username);
|
||||
time=findViewById(R.id.time);
|
||||
username=findViewById(R.id.username);
|
||||
botIcon=findViewById(R.id.bot_icon);
|
||||
timeUsernameSeparator=findViewById(R.id.separator);
|
||||
avatar=findViewById(R.id.avatar);
|
||||
more=findViewById(R.id.more);
|
||||
visibility=findViewById(R.id.visibility);
|
||||
@@ -190,7 +193,7 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
|
||||
}
|
||||
}
|
||||
boolean isPixelfed = item.parentFragment.isInstancePixelfed();
|
||||
boolean textEmpty = TextUtils.isEmpty(item.status.content) && TextUtils.isEmpty(item.status.spoilerText);
|
||||
boolean textEmpty = TextUtils.isEmpty(item.status.content) && !item.status.hasSpoiler();
|
||||
if(!redraft && (isPixelfed || textEmpty)){
|
||||
// pixelfed doesn't support /statuses/:id/source :/
|
||||
if (isPixelfed) {
|
||||
@@ -315,18 +318,26 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
|
||||
else if (item.status != null && item.status.editedAt != null)
|
||||
time=item.parentFragment.getString(R.string.edited_timestamp, UiUtils.formatRelativeTimestamp(itemView.getContext(), item.status.editedAt));
|
||||
|
||||
String sepp = item.parentFragment.getString(R.string.sk_separator);
|
||||
String username = "@" + item.user.acct;
|
||||
timeAndUsername.setText(time == null ? username :
|
||||
username + " " + sepp + " " + time);
|
||||
this.username.setText(item.user.getDisplayUsername());
|
||||
this.timeUsernameSeparator.setVisibility(time==null ? View.GONE : View.VISIBLE);
|
||||
this.time.setVisibility(time==null ? View.GONE : View.VISIBLE);
|
||||
if(time!=null) this.time.setText(time);
|
||||
|
||||
botIcon.setVisibility(item.user.bot ? View.VISIBLE : View.GONE);
|
||||
botIcon.setColorFilter(username.getCurrentTextColor());
|
||||
|
||||
deleteNotification.setVisibility(GlobalUserPreferences.enableDeleteNotifications && item.notification!=null && !item.inset ? View.VISIBLE : View.GONE);
|
||||
if (item.hasVisibilityToggle){
|
||||
boolean disabled = !item.status.sensitiveRevealed ||
|
||||
(!TextUtils.isEmpty(item.status.spoilerText) &&
|
||||
!item.status.spoilerRevealed);
|
||||
visibility.setEnabled(!disabled);
|
||||
V.setVisibilityAnimated(visibility, disabled ? View.INVISIBLE : View.VISIBLE);
|
||||
boolean hidden = !item.status.sensitiveRevealed || (item.status.hasSpoiler() && !item.status.spoilerRevealed);
|
||||
|
||||
// doing this because V.setVisibilityAnimated ignores changes between INVISIBLE and GONE
|
||||
int newVis=hidden ? View.INVISIBLE : View.VISIBLE;
|
||||
if(newVis==View.INVISIBLE && visibility.getVisibility()==View.GONE)
|
||||
visibility.setVisibility(newVis);
|
||||
else
|
||||
V.setVisibilityAnimated(visibility, newVis);
|
||||
|
||||
visibility.setEnabled(!hidden);
|
||||
visibility.setContentDescription(item.parentFragment.getString(item.status.sensitiveRevealed ? R.string.spoiler_hide : R.string.spoiler_show));
|
||||
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
|
||||
visibility.setTooltipText(visibility.getContentDescription());
|
||||
|
||||
@@ -6,6 +6,7 @@ import android.net.Uri;
|
||||
import android.text.TextUtils;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
@@ -13,12 +14,14 @@ import org.joinmastodon.android.R;
|
||||
import org.joinmastodon.android.fragments.BaseStatusListFragment;
|
||||
import org.joinmastodon.android.model.Card;
|
||||
import org.joinmastodon.android.model.Status;
|
||||
import org.joinmastodon.android.ui.OutlineProviders;
|
||||
import org.joinmastodon.android.ui.drawables.BlurhashCrossfadeDrawable;
|
||||
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||
|
||||
import me.grishka.appkit.imageloader.ImageLoaderViewHolder;
|
||||
import me.grishka.appkit.imageloader.requests.ImageLoaderRequest;
|
||||
import me.grishka.appkit.imageloader.requests.UrlImageLoaderRequest;
|
||||
import me.grishka.appkit.utils.V;
|
||||
|
||||
public class LinkCardStatusDisplayItem extends StatusDisplayItem{
|
||||
private final Status status;
|
||||
@@ -51,6 +54,7 @@ public class LinkCardStatusDisplayItem extends StatusDisplayItem{
|
||||
public static class Holder extends StatusDisplayItem.Holder<LinkCardStatusDisplayItem> implements ImageLoaderViewHolder{
|
||||
private final TextView title, description, domain;
|
||||
private final ImageView photo;
|
||||
private final View inner;
|
||||
private BlurhashCrossfadeDrawable crossfadeDrawable=new BlurhashCrossfadeDrawable();
|
||||
private boolean didClear;
|
||||
|
||||
@@ -60,7 +64,8 @@ public class LinkCardStatusDisplayItem extends StatusDisplayItem{
|
||||
description=findViewById(R.id.description);
|
||||
domain=findViewById(R.id.domain);
|
||||
photo=findViewById(R.id.photo);
|
||||
findViewById(R.id.inner).setOnClickListener(this::onClick);
|
||||
inner=findViewById(R.id.inner);
|
||||
inner.setOnClickListener(this::onClick);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -84,6 +89,15 @@ public class LinkCardStatusDisplayItem extends StatusDisplayItem{
|
||||
photo.setImageDrawable(crossfadeDrawable);
|
||||
didClear=false;
|
||||
}
|
||||
|
||||
// if there's no image, we don't want to cover the inset borders
|
||||
FrameLayout.LayoutParams params=(FrameLayout.LayoutParams) inner.getLayoutParams();
|
||||
int margin=item.inset && item.imgRequest == null ? V.dp(1) : 0;
|
||||
params.setMargins(margin, 0, margin, margin);
|
||||
|
||||
boolean insetAndLast=item.inset && isLastDisplayItemForStatus();
|
||||
inner.setClipToOutline(insetAndLast);
|
||||
inner.setOutlineProvider(insetAndLast ? OutlineProviders.bottomRoundedRect(12) : null);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -26,6 +26,7 @@ import org.joinmastodon.android.R;
|
||||
import org.joinmastodon.android.fragments.BaseStatusListFragment;
|
||||
import org.joinmastodon.android.model.Attachment;
|
||||
import org.joinmastodon.android.model.Status;
|
||||
import org.joinmastodon.android.ui.OutlineProviders;
|
||||
import org.joinmastodon.android.ui.PhotoLayoutHelper;
|
||||
import org.joinmastodon.android.ui.drawables.SpoilerStripesDrawable;
|
||||
import org.joinmastodon.android.ui.photoviewer.PhotoViewerHost;
|
||||
@@ -210,6 +211,10 @@ public class MediaGridStatusDisplayItem extends StatusDisplayItem{
|
||||
sensitiveText.setText(R.string.media_hidden);
|
||||
else
|
||||
sensitiveText.setText(R.string.sensitive_content_explain);
|
||||
|
||||
boolean insetAndLast=item.inset && isLastDisplayItemForStatus();
|
||||
wrapper.setClipToOutline(insetAndLast);
|
||||
wrapper.setOutlineProvider(insetAndLast ? OutlineProviders.bottomRoundedRect(12) : null);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -79,7 +79,7 @@ public class PollOptionStatusDisplayItem extends StatusDisplayItem{
|
||||
progressBg=activity.getResources().getDrawable(R.drawable.bg_poll_option_voted, activity.getTheme()).mutate();
|
||||
progressBgInset=activity.getResources().getDrawable(R.drawable.bg_poll_option_voted_inset, activity.getTheme()).mutate();
|
||||
itemView.setOnClickListener(this::onButtonClick);
|
||||
button.setOutlineProvider(OutlineProviders.roundedRect(24));
|
||||
button.setOutlineProvider(OutlineProviders.M3_BUTTON);
|
||||
button.setClipToOutline(true);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
package org.joinmastodon.android.ui.displayitems;
|
||||
|
||||
import static org.joinmastodon.android.api.session.AccountLocalPreferences.ShowEmojiReactions.ALWAYS;
|
||||
import static org.joinmastodon.android.api.session.AccountLocalPreferences.ShowEmojiReactions.ONLY_OPENED;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.Fragment;
|
||||
import android.content.Context;
|
||||
@@ -12,13 +15,13 @@ import android.view.ViewGroup;
|
||||
|
||||
import org.joinmastodon.android.GlobalUserPreferences;
|
||||
import org.joinmastodon.android.R;
|
||||
import org.joinmastodon.android.api.session.AccountLocalPreferences;
|
||||
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||
import org.joinmastodon.android.fragments.BaseStatusListFragment;
|
||||
import org.joinmastodon.android.fragments.HashtagTimelineFragment;
|
||||
import org.joinmastodon.android.fragments.HomeTabFragment;
|
||||
import org.joinmastodon.android.fragments.ListTimelineFragment;
|
||||
import org.joinmastodon.android.fragments.ProfileFragment;
|
||||
import org.joinmastodon.android.fragments.ScheduledStatusListFragment;
|
||||
import org.joinmastodon.android.fragments.ThreadFragment;
|
||||
import org.joinmastodon.android.model.Account;
|
||||
import org.joinmastodon.android.model.Attachment;
|
||||
@@ -51,7 +54,7 @@ import me.grishka.appkit.views.UsableRecyclerView;
|
||||
public abstract class StatusDisplayItem{
|
||||
public final String parentID;
|
||||
public final BaseStatusListFragment<?> parentFragment;
|
||||
public boolean inset;
|
||||
public boolean inset, insetPadding=true;
|
||||
public int index;
|
||||
public boolean
|
||||
hasDescendantNeighbor = false,
|
||||
@@ -121,19 +124,6 @@ public abstract class StatusDisplayItem{
|
||||
};
|
||||
}
|
||||
|
||||
public static ArrayList<StatusDisplayItem> buildItems(BaseStatusListFragment<?> fragment, Status status, String accountID, DisplayItemsParent parentObject, Map<String, Account> knownAccounts, boolean inset, boolean showReactions, boolean addFooter, boolean disableTranslate, FilterContext filterContext) {
|
||||
int flags=0;
|
||||
if(inset)
|
||||
flags|=FLAG_INSET;
|
||||
if(!addFooter)
|
||||
flags|=FLAG_NO_FOOTER;
|
||||
if (disableTranslate)
|
||||
flags|=FLAG_NO_TRANSLATE;
|
||||
if (!showReactions)
|
||||
flags|=FLAG_NO_EMOJI_REACTIONS;
|
||||
return buildItems(fragment, status, accountID, parentObject, knownAccounts, filterContext, flags);
|
||||
}
|
||||
|
||||
public static ReblogOrReplyLineStatusDisplayItem buildReplyLine(BaseStatusListFragment<?> fragment, Status status, String accountID, DisplayItemsParent parent, Account account, boolean threadReply) {
|
||||
String parentID = parent.getID();
|
||||
String text = threadReply ? fragment.getString(R.string.sk_show_thread)
|
||||
@@ -227,7 +217,7 @@ public abstract class StatusDisplayItem{
|
||||
}
|
||||
|
||||
ArrayList<StatusDisplayItem> contentItems;
|
||||
if(!TextUtils.isEmpty(statusForContent.spoilerText)){
|
||||
if(statusForContent.hasSpoiler()){
|
||||
if (AccountSessionManager.get(accountID).getLocalPreferences().revealCWs) statusForContent.spoilerRevealed = true;
|
||||
SpoilerStatusDisplayItem spoilerItem=new SpoilerStatusDisplayItem(parentID, fragment, null, statusForContent, Type.SPOILER);
|
||||
items.add(spoilerItem);
|
||||
@@ -291,10 +281,12 @@ public abstract class StatusDisplayItem{
|
||||
if(contentItems!=items && statusForContent.spoilerRevealed){
|
||||
items.addAll(contentItems);
|
||||
}
|
||||
if((flags & FLAG_NO_EMOJI_REACTIONS)==0
|
||||
&& AccountSessionManager.get(accountID).getLocalPreferences().emojiReactionsEnabled){
|
||||
AccountLocalPreferences lp=fragment.getLocalPrefs();
|
||||
if((flags & FLAG_NO_EMOJI_REACTIONS)==0 && lp.emojiReactionsEnabled &&
|
||||
(lp.showEmojiReactions!=ONLY_OPENED || fragment instanceof ThreadFragment)){
|
||||
boolean isMainStatus=fragment instanceof ThreadFragment t && t.getMainStatus().id.equals(statusForContent.id);
|
||||
items.add(new EmojiReactionsStatusDisplayItem(parentID, fragment, statusForContent, accountID, !isMainStatus, false));
|
||||
boolean showAddButton=lp.showEmojiReactions==ALWAYS || isMainStatus;
|
||||
items.add(new EmojiReactionsStatusDisplayItem(parentID, fragment, statusForContent, accountID, !showAddButton, false));
|
||||
}
|
||||
FooterStatusDisplayItem footer=null;
|
||||
if((flags & FLAG_NO_FOOTER)==0){
|
||||
@@ -307,7 +299,7 @@ public abstract class StatusDisplayItem{
|
||||
int i=1;
|
||||
boolean inset=(flags & FLAG_INSET)!=0;
|
||||
// add inset dummy so last content item doesn't clip out of inset bounds
|
||||
if(inset || footer==null){
|
||||
if((inset || footer==null) && (flags & FLAG_CHECKABLE)==0){
|
||||
items.add(new DummyStatusDisplayItem(parentID, fragment));
|
||||
// in case we ever need the dummy to display a margin for the media grid again:
|
||||
// (i forgot why we apparently don't need this anymore)
|
||||
@@ -389,6 +381,35 @@ public abstract class StatusDisplayItem{
|
||||
item.parentFragment.onItemClick(item.parentID);
|
||||
}
|
||||
|
||||
public Optional<StatusDisplayItem> getNextVisibleDisplayItem(){
|
||||
Optional<StatusDisplayItem> next=getNextDisplayItem();
|
||||
for(int offset=1; next.isPresent(); next=getDisplayItemOffset(++offset)){
|
||||
if(!next.map(n->
|
||||
(n instanceof EmojiReactionsStatusDisplayItem e && e.isHidden()) ||
|
||||
(n instanceof DummyStatusDisplayItem)
|
||||
).orElse(false)) return next;
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public Optional<StatusDisplayItem> getNextDisplayItem(){
|
||||
return getDisplayItemOffset(1);
|
||||
}
|
||||
|
||||
public Optional<StatusDisplayItem> getDisplayItemOffset(int offset){
|
||||
int nextPos=getAbsoluteAdapterPosition() + offset;
|
||||
List<StatusDisplayItem> displayItems=item.parentFragment.getDisplayItems();
|
||||
return displayItems.size() > nextPos
|
||||
? Optional.of(displayItems.get(nextPos))
|
||||
: Optional.empty();
|
||||
}
|
||||
|
||||
public boolean isLastDisplayItemForStatus(){
|
||||
return getNextVisibleDisplayItem()
|
||||
.map(n->!n.parentID.equals(item.parentID))
|
||||
.orElse(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEnabled(){
|
||||
return item.parentFragment.isItemEnabled(item.parentID);
|
||||
|
||||
@@ -32,8 +32,6 @@ import org.joinmastodon.android.ui.utils.UiUtils;
|
||||
import org.joinmastodon.android.ui.views.LinkedTextView;
|
||||
import org.joinmastodon.android.utils.StatusTextEncoder;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
@@ -196,24 +194,12 @@ public class TextStatusDisplayItem extends StatusDisplayItem{
|
||||
|
||||
readMore.setText(item.status.textExpanded ? R.string.sk_collapse : R.string.sk_expand);
|
||||
|
||||
// remove additional padding when (transparently padded) translate button is visible
|
||||
int nextPos=getAbsoluteAdapterPosition() + 1;
|
||||
int bottomPadding=V.dp(12);
|
||||
List<StatusDisplayItem> displayItems=item.parentFragment.getDisplayItems();
|
||||
if(displayItems.size() > nextPos){
|
||||
StatusDisplayItem next=displayItems.get(nextPos);
|
||||
if(next instanceof EmojiReactionsStatusDisplayItem e && e.isHidden()){
|
||||
next=displayItems.size() > ++nextPos ? displayItems.get(nextPos) : null;
|
||||
}
|
||||
|
||||
if(next instanceof FooterStatusDisplayItem){
|
||||
bottomPadding=V.dp(6);
|
||||
// why does java code always end up looking like this
|
||||
} else if((!item.inset && next instanceof DummyStatusDisplayItem) ||
|
||||
next instanceof EmojiReactionsStatusDisplayItem e && !e.isHidden()){
|
||||
bottomPadding=0;
|
||||
}
|
||||
}
|
||||
StatusDisplayItem next=getNextVisibleDisplayItem().orElse(null);
|
||||
if(next!=null && !next.parentID.equals(item.parentID)) next=null;
|
||||
int bottomPadding=next instanceof FooterStatusDisplayItem ? V.dp(6)
|
||||
: item.inset ? V.dp(12)
|
||||
: (next instanceof EmojiReactionsStatusDisplayItem || next==null) ? 0
|
||||
: V.dp(12);
|
||||
itemView.setPadding(itemView.getPaddingLeft(), itemView.getPaddingTop(), itemView.getPaddingRight(), bottomPadding);
|
||||
|
||||
if (!GlobalUserPreferences.collapseLongPosts) {
|
||||
|
||||
@@ -8,8 +8,6 @@ import android.view.View;
|
||||
|
||||
import org.joinmastodon.android.R;
|
||||
import org.joinmastodon.android.fragments.BaseStatusListFragment;
|
||||
import org.joinmastodon.android.ui.displayitems.LinkCardStatusDisplayItem;
|
||||
import org.joinmastodon.android.ui.displayitems.MediaGridStatusDisplayItem;
|
||||
import org.joinmastodon.android.ui.displayitems.StatusDisplayItem;
|
||||
|
||||
import java.util.List;
|
||||
@@ -89,10 +87,10 @@ public class InsetStatusItemDecoration extends RecyclerView.ItemDecoration{
|
||||
pad=V.dp(16);
|
||||
// else
|
||||
// pad=V.dp(12);
|
||||
boolean insetLeft=true, insetRight=true;
|
||||
if(insetLeft)
|
||||
boolean insetPadding=((StatusDisplayItem.Holder<?>) holder).getItem().insetPadding;
|
||||
if(insetPadding)
|
||||
outRect.left=pad;
|
||||
if(insetRight)
|
||||
if(insetPadding)
|
||||
outRect.right=pad;
|
||||
|
||||
// had to comment this out because animations with offsets aren't handled properly.
|
||||
|
||||
@@ -747,9 +747,6 @@ public class UiUtils {
|
||||
if(relationship.blocking){
|
||||
button.setText(R.string.button_blocked);
|
||||
styleRes=R.style.Widget_Mastodon_M3_Button_Tonal_Error;
|
||||
}else if(relationship.blockedBy){
|
||||
button.setText(R.string.button_follow);
|
||||
styleRes=R.style.Widget_Mastodon_M3_Button_Filled;
|
||||
}else if(relationship.requested){
|
||||
button.setText(R.string.button_follow_pending);
|
||||
styleRes=R.style.Widget_Mastodon_M3_Button_Tonal;
|
||||
@@ -761,7 +758,6 @@ public class UiUtils {
|
||||
styleRes=R.style.Widget_Mastodon_M3_Button_Tonal;
|
||||
}
|
||||
|
||||
button.setEnabled(!relationship.blockedBy);
|
||||
TypedArray ta=button.getContext().obtainStyledAttributes(styleRes, new int[]{android.R.attr.background});
|
||||
button.setBackground(ta.getDrawable(0));
|
||||
ta.recycle();
|
||||
@@ -1073,8 +1069,8 @@ public class UiUtils {
|
||||
return back;
|
||||
}
|
||||
|
||||
public static boolean setExtraTextInfo(Context ctx, TextView extraText, TextView pronouns, boolean displayPronouns, boolean mentionedOnly, boolean localOnly, @Nullable Account account) {
|
||||
List<String> extraParts = new ArrayList<>();
|
||||
public static boolean setExtraTextInfo(Context ctx, @Nullable TextView extraText, @Nullable TextView pronouns, boolean displayPronouns, boolean mentionedOnly, boolean localOnly, @Nullable Account account) {
|
||||
List<String> extraParts = extraText!=null && (localOnly || mentionedOnly) ? new ArrayList<>() : null;
|
||||
Optional<String> p=pronouns==null || !displayPronouns ? Optional.empty() : extractPronouns(ctx, account);
|
||||
if(p.isPresent()) {
|
||||
HtmlParser.setTextWithCustomEmoji(pronouns, p.get(), account.emojis);
|
||||
@@ -1086,7 +1082,7 @@ public class UiUtils {
|
||||
extraParts.add(ctx.getString(R.string.sk_inline_local_only));
|
||||
if(mentionedOnly)
|
||||
extraParts.add(ctx.getString(R.string.sk_inline_direct));
|
||||
if(!extraParts.isEmpty()) {
|
||||
if(extraText!=null && extraParts!=null && !extraParts.isEmpty()) {
|
||||
String sepp = ctx.getString(R.string.sk_separator);
|
||||
String text = String.join(" " + sepp + " ", extraParts);
|
||||
if(account == null) extraText.setText(text);
|
||||
@@ -1094,7 +1090,7 @@ public class UiUtils {
|
||||
extraText.setVisibility(View.VISIBLE);
|
||||
return true;
|
||||
}else{
|
||||
extraText.setVisibility(View.GONE);
|
||||
if(extraText!=null) extraText.setVisibility(View.GONE);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,10 +27,14 @@ import android.widget.ProgressBar;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import org.joinmastodon.android.MastodonApp;
|
||||
import org.joinmastodon.android.R;
|
||||
import org.joinmastodon.android.api.MastodonAPIController;
|
||||
import org.joinmastodon.android.api.ProgressListener;
|
||||
import org.joinmastodon.android.api.requests.statuses.CreateStatus;
|
||||
import org.joinmastodon.android.api.requests.statuses.GetAttachmentByID;
|
||||
import org.joinmastodon.android.api.requests.statuses.UpdateAttachment;
|
||||
import org.joinmastodon.android.api.requests.statuses.UploadAttachment;
|
||||
@@ -47,8 +51,11 @@ import org.parceler.Parcel;
|
||||
import org.parceler.Parcels;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.ListIterator;
|
||||
import java.util.Locale;
|
||||
import java.util.Objects;
|
||||
import java.util.function.Consumer;
|
||||
@@ -550,6 +557,14 @@ public class ComposeMediaViewController{
|
||||
public List<String> getAttachmentIDs(){
|
||||
return attachments.stream().map(a->a.serverAttachment.id).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
public List<CreateStatus.Request.MediaAttribute> getAttachmentAttributes(){
|
||||
List<CreateStatus.Request.MediaAttribute> mediaAttributes = new ArrayList<>();
|
||||
for (DraftMediaAttachment att:attachments){
|
||||
mediaAttributes.add(new CreateStatus.Request.MediaAttribute(att.serverAttachment.id, att.description, null));
|
||||
}
|
||||
return mediaAttributes;
|
||||
}
|
||||
|
||||
public boolean isEmpty(){
|
||||
return attachments.isEmpty();
|
||||
@@ -592,7 +607,7 @@ public class ComposeMediaViewController{
|
||||
public void saveAltTextsBeforePublishing(Runnable onSuccess, Consumer<ErrorResponse> onError){
|
||||
ArrayList<UpdateAttachment> updateAltTextRequests=new ArrayList<>();
|
||||
for(DraftMediaAttachment att:attachments){
|
||||
if(!att.descriptionSaved){
|
||||
if(!att.descriptionSaved && att.serverAttachment.description == null){
|
||||
UpdateAttachment req=new UpdateAttachment(att.serverAttachment.id, att.description);
|
||||
req.setCallback(new Callback<>(){
|
||||
@Override
|
||||
|
||||
@@ -213,6 +213,7 @@ public class AccountViewHolder extends BindableViewHolder<AccountViewModel> impl
|
||||
Account account=item.account;
|
||||
|
||||
menu.findItem(R.id.share).setTitle(fragment.getString(R.string.share_user, account.getDisplayUsername()));
|
||||
menu.findItem(R.id.manage_user_lists).setTitle(fragment.getString(R.string.sk_lists_with_user, account.getShortUsername()));
|
||||
menu.findItem(R.id.mute).setTitle(fragment.getString(relationship.muting ? R.string.unmute_user : R.string.mute_user, account.getDisplayUsername()));
|
||||
menu.findItem(R.id.block).setTitle(fragment.getString(relationship.blocking ? R.string.unblock_user : R.string.block_user, account.getDisplayUsername()));
|
||||
menu.findItem(R.id.report).setTitle(fragment.getString(R.string.report_user, account.getDisplayUsername()));
|
||||
|
||||
@@ -40,11 +40,9 @@ public abstract class ListItemViewHolder<T extends ListItem<?>> extends Bindable
|
||||
|
||||
if(TextUtils.isEmpty(item.subtitle) && item.subtitleRes==0){
|
||||
subtitle.setVisibility(View.GONE);
|
||||
title.setMaxLines(2);
|
||||
view.setMinimumHeight(V.dp(56));
|
||||
}else{
|
||||
subtitle.setVisibility(View.VISIBLE);
|
||||
title.setMaxLines(1);
|
||||
view.setMinimumHeight(V.dp(72));
|
||||
if(TextUtils.isEmpty(item.subtitle))
|
||||
subtitle.setText(item.subtitleRes);
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:state_enabled="true">
|
||||
<ripple android:color="@color/m3_on_secondary_container_overlay">
|
||||
<item>
|
||||
<item android:gravity="center_vertical" android:height="40dp">
|
||||
<shape>
|
||||
<solid android:color="?colorM3ErrorContainer"/>
|
||||
<corners android:radius="20dp"/>
|
||||
@@ -11,9 +11,13 @@
|
||||
</ripple>
|
||||
</item>
|
||||
<item>
|
||||
<shape>
|
||||
<solid android:color="?colorM3DisabledBackground"/>
|
||||
<corners android:radius="20dp"/>
|
||||
</shape>
|
||||
<layer-list>
|
||||
<item android:gravity="center_vertical" android:height="40dp">
|
||||
<shape>
|
||||
<solid android:color="?colorM3DisabledBackground"/>
|
||||
<corners android:radius="20dp"/>
|
||||
</shape>
|
||||
</item>
|
||||
</layer-list>
|
||||
</item>
|
||||
</selector>
|
||||
20
mastodon/src/main/res/drawable/bg_filled_card.xml
Normal file
20
mastodon/src/main/res/drawable/bg_filled_card.xml
Normal file
@@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item>
|
||||
<color android:color="?colorM3Surface"/>
|
||||
</item>
|
||||
<item>
|
||||
<shape android:tint="?colorM3Primary">
|
||||
<solid android:color="?colorFilledCardAlpha"/>
|
||||
</shape>
|
||||
</item>
|
||||
<item>
|
||||
<ripple android:color="@color/m3_on_surface_variant_overlay">
|
||||
<item android:id="@android:id/mask">
|
||||
<shape>
|
||||
<solid android:color="#000"/>
|
||||
</shape>
|
||||
</item>
|
||||
</ripple>
|
||||
</item>
|
||||
</layer-list>
|
||||
@@ -5,8 +5,8 @@
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:pathData="M12,1.996C16.05,1.996 19.357,5.191 19.496,9.245L19.5,9.496V13.593L20.88,16.749C20.949,16.907 20.985,17.077 20.985,17.25C20.985,17.94 20.425,18.5 19.735,18.5L15,18.501C15,20.158 13.657,21.501 12,21.501C10.402,21.501 9.096,20.252 9.005,18.678L9,18.499L4.275,18.5C4.104,18.5 3.934,18.465 3.777,18.396C3.144,18.121 2.853,17.385 3.128,16.752L4.5,13.594V9.496C4.501,5.341 7.852,1.996 12,1.996ZM13.5,18.499L10.5,18.501C10.5,19.33 11.172,20.001 12,20.001C12.78,20.001 13.421,19.406 13.493,18.646L13.5,18.499ZM12,3.496C8.68,3.496 6.001,6.17 6,9.496V13.906L4.656,17H19.353L18,13.907L18,9.509L17.997,9.284C17.885,6.05 15.242,3.496 12,3.496Z"
|
||||
android:fillColor="#212121"/>
|
||||
android:fillColor="@color/fluent_default_icon_tint"/>
|
||||
<path
|
||||
android:pathData="M8.083,9.969A0.508,0.508 0,0 0,8.807 10.682L11.494,7.955L11.494,14.897a0.508,0.508 0,1 0,1.016 0L12.509,7.958L15.193,10.682A0.508,0.508 45,0 0,15.917 9.969L12.452,6.453a0.635,0.635 0,0 0,-0.904 0z"
|
||||
android:fillColor="#212121"/>
|
||||
android:fillColor="@color/fluent_default_icon_tint"/>
|
||||
</vector>
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp" android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
|
||||
<path android:pathData="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"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,3 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="20dp" android:height="20dp" android:viewportWidth="20" android:viewportHeight="20">
|
||||
<path android:pathData="M8.46 1.897l0.99 0.39c0.353 0.138 0.746 0.138 1.099 0l0.99-0.39c1.21-0.477 2.582 0.091 3.102 1.285l0.424 0.975c0.151 0.348 0.429 0.626 0.777 0.777l0.975 0.424c1.194 0.52 1.762 1.891 1.285 3.103l-0.39 0.99c-0.139 0.352-0.139 0.745 0 1.098l0.39 0.99c0.477 1.21-0.091 2.582-1.285 3.102l-0.975 0.424c-0.348 0.151-0.626 0.429-0.777 0.777l-0.424 0.975c-0.52 1.194-1.891 1.762-3.103 1.285l-0.99-0.39c-0.352-0.139-0.745-0.139-1.098 0l-0.99 0.39c-1.21 0.477-2.582-0.091-3.102-1.285l-0.424-0.975c-0.151-0.348-0.429-0.626-0.777-0.777l-0.975-0.424c-1.194-0.52-1.762-1.891-1.285-3.103l0.39-0.99c0.138-0.352 0.138-0.745 0-1.098l-0.39-0.99C1.42 7.25 1.988 5.878 3.182 5.358l0.975-0.424c0.348-0.151 0.626-0.429 0.777-0.777l0.424-0.975C5.878 1.988 7.25 1.42 8.461 1.897zm3.445 0.93l-0.99 0.39c-0.588 0.232-1.243 0.232-1.831 0l-0.99-0.39C7.384 2.549 6.58 2.881 6.275 3.582L5.851 4.556C5.599 5.136 5.136 5.6 4.556 5.851L3.581 6.275c-0.7 0.305-1.033 1.109-0.753 1.82l0.389 0.989c0.232 0.588 0.232 1.243 0 1.831l-0.39 0.99c-0.279 0.71 0.054 1.514 0.754 1.819l0.975 0.424c0.58 0.252 1.043 0.715 1.295 1.295l0.424 0.975c0.305 0.7 1.109 1.033 1.82 0.753l0.989-0.39c0.588-0.23 1.243-0.23 1.831 0l0.99 0.39c0.71 0.28 1.514-0.053 1.819-0.753l0.424-0.975c0.252-0.58 0.715-1.043 1.295-1.295l0.975-0.424c0.7-0.305 1.033-1.11 0.753-1.82l-0.39-0.989c-0.23-0.588-0.23-1.243 0-1.831l0.39-0.99c0.28-0.71-0.053-1.514-0.753-1.819l-0.975-0.424c-0.58-0.252-1.043-0.715-1.295-1.295l-0.424-0.975c-0.305-0.7-1.11-1.033-1.82-0.753zm-2.927 8.944l3.648-4.104c0.183-0.206 0.5-0.225 0.706-0.041 0.183 0.163 0.218 0.43 0.095 0.633l-0.054 0.073-4 4.5c-0.17 0.19-0.451 0.22-0.655 0.081l-0.072-0.06-2-2c-0.195-0.195-0.195-0.512 0-0.707 0.173-0.174 0.443-0.193 0.638-0.058l0.069 0.058 1.625 1.625 3.648-4.104-3.648 4.104z" android:fillColor="@color/fluent_default_icon_tint"/>
|
||||
</vector>
|
||||
@@ -1,6 +0,0 @@
|
||||
<?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="M10 2c1.657 0 3 1.343 3 3v1h1c1.105 0 2 0.895 2 2v7c0 1.105-0.895 2-2 2H6c-1.105 0-2-0.895-2-2V8c0-1.105 0.895-2 2-2h1V5c0-1.657 1.343-3 3-3zm0 8.5c-0.552 0-1 0.448-1 1s0.448 1 1 1 1-0.448 1-1-0.448-1-1-1zM10 4C9.448 4 9 4.448 9 5v1h2V5c0-0.552-0.448-1-1-1z" android:fillColor="@color/fluent_default_icon_tint"/>
|
||||
</group>
|
||||
</vector>
|
||||
@@ -1,9 +0,0 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="20dp"
|
||||
android:height="20dp"
|
||||
android:viewportWidth="20"
|
||||
android:viewportHeight="20">
|
||||
<path
|
||||
android:fillColor="@android:color/white"
|
||||
android:pathData="M5.5,19Q4.875,19 4.438,18.562Q4,18.125 4,17.5V9.5Q4,8.875 4.438,8.438Q4.875,8 5.5,8H6V6Q6,4.333 7.167,3.167Q8.333,2 10,2Q11.667,2 12.833,3.167Q14,4.333 14,6V8H14.5Q15.125,8 15.562,8.438Q16,8.875 16,9.5V17.5Q16,18.125 15.562,18.562Q15.125,19 14.5,19ZM7.5,8H12.5V6Q12.5,4.958 11.771,4.229Q11.042,3.5 10,3.5Q8.958,3.5 8.229,4.229Q7.5,4.958 7.5,6ZM10,15Q10.625,15 11.062,14.562Q11.5,14.125 11.5,13.5Q11.5,12.875 11.062,12.438Q10.625,12 10,12Q9.375,12 8.938,12.438Q8.5,12.875 8.5,13.5Q8.5,14.125 8.938,14.562Q9.375,15 10,15Z"/>
|
||||
</vector>
|
||||
@@ -1,5 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<corners android:radius="26dp"/>
|
||||
<stroke android:width="4dp" android:color="?colorM3Surface"/>
|
||||
</shape>
|
||||
@@ -9,17 +9,32 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/add_btn"
|
||||
android:layout_width="wrap_content"
|
||||
<FrameLayout
|
||||
android:id="@+id/add_btn_wrap"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="2dp"
|
||||
android:minHeight="48dp"
|
||||
android:minWidth="48dp"
|
||||
android:background="@drawable/bg_button_m3_tonal_circle"
|
||||
android:tooltipText="@string/sk_button_react"
|
||||
android:contentDescription="@string/sk_button_react"
|
||||
android:src="@drawable/ic_fluent_add_24_filled" />
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_marginStart="2dp">
|
||||
<ProgressBar
|
||||
android:id="@+id/progress"
|
||||
style="?android:progressBarStyleSmall"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:elevation="10dp"
|
||||
android:indeterminate="true"
|
||||
android:outlineProvider="none"
|
||||
android:visibility="gone"/>
|
||||
<ImageButton
|
||||
android:id="@+id/add_btn"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:minHeight="48dp"
|
||||
android:minWidth="48dp"
|
||||
android:background="@drawable/bg_button_m3_tonal_circle"
|
||||
android:tooltipText="@string/sk_button_react"
|
||||
android:contentDescription="@string/sk_button_react"
|
||||
android:src="@drawable/ic_fluent_add_24_filled" />
|
||||
</FrameLayout>
|
||||
|
||||
<org.joinmastodon.android.ui.views.EmojiReactionsRecyclerView
|
||||
android:id="@+id/list"
|
||||
@@ -28,6 +43,7 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="-4dp"
|
||||
android:paddingStart="8dp"
|
||||
android:paddingEnd="3dp"
|
||||
android:clipToPadding="false"
|
||||
android:requiresFadingEdge="horizontal"
|
||||
android:fadingEdgeLength="24dp" />
|
||||
|
||||
@@ -152,20 +152,62 @@
|
||||
|
||||
</org.joinmastodon.android.ui.views.HeaderSubtitleLinearLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/time_and_username"
|
||||
<org.joinmastodon.android.ui.views.HeaderSubtitleLinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/time_and_username"
|
||||
android:layout_alignBottom="@id/avatar"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:layout_toStartOf="@id/buttons"
|
||||
android:layout_toEndOf="@id/avatar"
|
||||
android:layout_marginBottom="3sp"
|
||||
android:textAlignment="viewStart"
|
||||
android:singleLine="true"
|
||||
android:ellipsize="end"
|
||||
android:textAppearance="@style/m3_body_medium"
|
||||
android:textColor="?colorM3OnSurfaceVariant"
|
||||
tools:text="9h ago · \@Gargron@mastodon.social"/>
|
||||
android:layout_marginBottom="3sp">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/username"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAlignment="viewStart"
|
||||
android:singleLine="true"
|
||||
android:ellipsize="end"
|
||||
android:textAppearance="@style/m3_body_medium"
|
||||
android:textColor="?colorM3OnSurfaceVariant"
|
||||
tools:text="\@Gargron@mastodon.social"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/bot_icon"
|
||||
android:layout_width="16sp"
|
||||
android:layout_height="16sp"
|
||||
android:layout_marginStart="4sp"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:visibility="gone"
|
||||
android:importantForAccessibility="no"
|
||||
android:contentDescription="@string/sk_icon_bot"
|
||||
android:src="@drawable/ic_fluent_bot_20_filled" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/separator"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="4sp"
|
||||
android:textAlignment="viewStart"
|
||||
android:importantForAccessibility="no"
|
||||
android:singleLine="true"
|
||||
android:textAppearance="@style/m3_body_medium"
|
||||
android:textColor="?colorM3OnSurfaceVariant"
|
||||
android:text="@string/sk_separator"/>
|
||||
|
||||
|
||||
<TextView
|
||||
android:id="@+id/time"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAlignment="viewStart"
|
||||
android:singleLine="true"
|
||||
android:ellipsize="end"
|
||||
android:textAppearance="@style/m3_body_medium"
|
||||
android:textColor="?colorM3OnSurfaceVariant"
|
||||
tools:text="9h ago"/>
|
||||
|
||||
</org.joinmastodon.android.ui.views.HeaderSubtitleLinearLayout>
|
||||
|
||||
</RelativeLayout>
|
||||
@@ -8,83 +8,33 @@
|
||||
android:paddingLeft="16dp"
|
||||
android:clipToPadding="false">
|
||||
|
||||
<View
|
||||
android:id="@+id/checkbox"
|
||||
android:layout_width="32dp"
|
||||
android:layout_height="32dp"
|
||||
android:layout_marginStart="-4dp"
|
||||
android:layout_marginTop="-8dp"
|
||||
android:layout_marginEnd="12dp"
|
||||
android:duplicateParentState="true"/>
|
||||
<FrameLayout
|
||||
android:id="@+id/checkbox_wrap"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="46sp"
|
||||
android:duplicateParentState="true">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/more"
|
||||
android:layout_width="24dp"
|
||||
android:layout_height="24dp"
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:layout_marginTop="-2dp"
|
||||
android:layout_marginEnd="-2dp"
|
||||
android:background="?android:selectableItemBackgroundBorderless"
|
||||
android:scaleType="center"
|
||||
android:tint="?colorM3OnSurfaceVariant"
|
||||
android:contentDescription="@string/more_options"
|
||||
android:src="@drawable/ic_fluent_more_vertical_20_filled" />
|
||||
<View
|
||||
android:id="@+id/checkbox"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_width="32dp"
|
||||
android:layout_height="32dp"
|
||||
android:layout_marginStart="-4dp"
|
||||
android:layout_marginTop="0dp"
|
||||
android:layout_marginEnd="12dp"
|
||||
android:duplicateParentState="true"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/avatar"
|
||||
android:layout_width="40dp"
|
||||
android:layout_height="40dp"
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_toEndOf="@id/checkbox"
|
||||
android:layout_marginTop="2dp"
|
||||
android:layout_marginEnd="8dp" />
|
||||
</FrameLayout>
|
||||
|
||||
<org.joinmastodon.android.ui.views.HeaderSubtitleLinearLayout
|
||||
android:id="@+id/name_wrap"
|
||||
<FrameLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="24dp"
|
||||
android:layout_toEndOf="@id/avatar"
|
||||
android:layout_toStartOf="@id/more"
|
||||
android:layout_marginEnd="8dp">
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="-16dp"
|
||||
android:layout_marginStart="-16dp"
|
||||
android:layout_toEndOf="@id/checkbox_wrap">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/name"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="24dp"
|
||||
android:ellipsize="end"
|
||||
android:singleLine="true"
|
||||
android:textAppearance="@style/m3_title_medium"
|
||||
android:textColor="?colorM3OnSurface"
|
||||
android:gravity="start|center_vertical"
|
||||
tools:text="Eugen" />
|
||||
<include layout="@layout/display_item_header" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/extra_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="24dp"
|
||||
android:layout_marginStart="8dp"
|
||||
android:ellipsize="end"
|
||||
android:singleLine="true"
|
||||
android:textAppearance="@style/m3_title_medium"
|
||||
android:fontFamily="sans-serif"
|
||||
android:textAlignment="viewStart"
|
||||
android:textColor="?colorM3OnSurface"
|
||||
tools:text="boosted your cat picture" />
|
||||
|
||||
</org.joinmastodon.android.ui.views.HeaderSubtitleLinearLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/time_and_username"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="20dp"
|
||||
android:layout_below="@id/name_wrap"
|
||||
android:layout_toEndOf="@id/avatar"
|
||||
android:singleLine="true"
|
||||
android:ellipsize="end"
|
||||
android:textAppearance="@style/m3_title_small"
|
||||
android:gravity="center_vertical"
|
||||
android:textColor="?colorM3OnSurfaceVariant"
|
||||
tools:text="9h ago · \@Gargron@mastodon.social"/>
|
||||
</FrameLayout>
|
||||
|
||||
</org.joinmastodon.android.ui.views.CheckableRelativeLayout>
|
||||
@@ -62,8 +62,7 @@
|
||||
android:layout_alignParentStart="true"
|
||||
android:layout_marginStart="12dp"
|
||||
android:layout_marginTop="-44dp"
|
||||
android:background="@drawable/profile_ava_bg"
|
||||
android:outlineProvider="@null">
|
||||
android:background="?colorM3Surface">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/avatar"
|
||||
@@ -168,17 +167,56 @@
|
||||
|
||||
</org.joinmastodon.android.ui.views.AutoOrientationLinearLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/username"
|
||||
<org.joinmastodon.android.ui.views.AutoOrientationLinearLayout
|
||||
android:id="@+id/username_wrap"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginLeft="16dp"
|
||||
android:paddingTop="2dp"
|
||||
android:paddingBottom="8dp"
|
||||
android:layout_marginRight="16dp"
|
||||
android:textAppearance="@style/m3_title_small"
|
||||
android:textColor="?colorM3OnSurfaceVariant"
|
||||
tools:text="\@Gargron" />
|
||||
android:layout_marginStart="16dp"
|
||||
android:layout_marginEnd="12dp"
|
||||
android:layout_marginBottom="8dp">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/username"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="2dp"
|
||||
android:layout_marginEnd="4dp"
|
||||
android:maxLines="1"
|
||||
android:ellipsize="end"
|
||||
android:textAppearance="@style/m3_title_small"
|
||||
android:textColor="?colorM3OnSurfaceVariant"
|
||||
tools:text="\@Gargron" />
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginTop="2dp">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/lock_icon"
|
||||
android:layout_width="18sp"
|
||||
android:layout_height="18sp"
|
||||
android:layout_marginEnd="4dp"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:visibility="gone"
|
||||
android:importantForAccessibility="no"
|
||||
android:contentDescription="@string/manually_approves_followers"
|
||||
android:src="@drawable/ic_fluent_lock_closed_20_filled" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/bot_icon"
|
||||
android:layout_width="18sp"
|
||||
android:layout_height="18sp"
|
||||
android:layout_marginEnd="4dp"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:visibility="gone"
|
||||
android:importantForAccessibility="no"
|
||||
android:contentDescription="@string/sk_icon_bot"
|
||||
android:src="@drawable/ic_fluent_bot_20_filled" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</org.joinmastodon.android.ui.views.AutoOrientationLinearLayout>
|
||||
|
||||
<org.joinmastodon.android.ui.views.LinkedTextView
|
||||
android:id="@+id/bio"
|
||||
|
||||
@@ -91,50 +91,6 @@
|
||||
|
||||
</RelativeLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/forward_report"
|
||||
android:orientation="horizontal"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:paddingHorizontal="8dp"
|
||||
android:paddingVertical="8dp"
|
||||
android:gravity="center_vertical"
|
||||
android:layoutDirection="locale"
|
||||
android:background="?android:selectableItemBackground">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/icon"
|
||||
android:layout_width="24dp"
|
||||
android:layout_height="24dp"
|
||||
android:layout_marginStart="16dp"
|
||||
android:layout_marginEnd="32dp"
|
||||
android:importantForAccessibility="no"
|
||||
android:tint="?android:textColorPrimary"
|
||||
android:src="@drawable/ic_fluent_arrow_forward_24_regular"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/forward_report_text"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:paddingVertical="8dp"
|
||||
android:textSize="16sp"
|
||||
android:text="@string/sk_forward_report_to"
|
||||
android:textColor="?android:textColorPrimary" />
|
||||
|
||||
<Switch
|
||||
android:id="@+id/forward_report_switch"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:duplicateParentState="true"
|
||||
android:layout_marginStart="16dp"
|
||||
android:layout_marginEnd="12dp"
|
||||
android:focusable="false"
|
||||
android:clickable="false"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</ScrollView>
|
||||
|
||||
@@ -3,74 +3,114 @@
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="?colorM3SurfaceVariant"
|
||||
android:elevation="2dp"
|
||||
android:paddingBottom="0dp">
|
||||
android:background="@drawable/bg_filled_card">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/cover"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="128dp"
|
||||
android:layout_marginTop="4dp"
|
||||
android:layout_marginLeft="4dp"
|
||||
android:layout_marginRight="4dp"
|
||||
android:layout_marginTop="6dp"
|
||||
android:layout_marginLeft="6dp"
|
||||
android:layout_marginRight="6dp"
|
||||
android:scaleType="centerCrop"
|
||||
tools:src="#0f0"/>
|
||||
|
||||
<View
|
||||
android:id="@+id/avatar_border"
|
||||
android:layout_width="60dp"
|
||||
android:layout_height="60dp"
|
||||
<FrameLayout
|
||||
android:id="@+id/avatar_wrap"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@id/cover"
|
||||
android:layout_alignParentStart="true"
|
||||
android:layout_marginTop="-6dp"
|
||||
android:layout_marginStart="14dp"
|
||||
android:background="@drawable/discover_ava_bg"/>
|
||||
android:layout_marginTop="-12dp"
|
||||
android:layout_marginStart="13dp"
|
||||
android:layout_marginEnd="12dp">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/avatar"
|
||||
android:layout_width="56dp"
|
||||
android:layout_height="56dp"
|
||||
android:layout_below="@id/cover"
|
||||
android:layout_alignParentStart="true"
|
||||
android:layout_marginStart="16dp"
|
||||
android:layout_marginTop="-4dp"
|
||||
android:scaleType="centerCrop"
|
||||
tools:src="#f00" />
|
||||
<View
|
||||
android:id="@+id/avatar_border"
|
||||
android:layout_gravity="center"
|
||||
android:layout_width="66dp"
|
||||
android:layout_height="66dp"
|
||||
android:background="@drawable/bg_filled_card"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/name"
|
||||
<ImageView
|
||||
android:id="@+id/avatar"
|
||||
android:layout_gravity="center"
|
||||
android:layout_width="60dp"
|
||||
android:layout_height="60dp"
|
||||
android:scaleType="centerCrop"
|
||||
tools:src="#f00" />
|
||||
|
||||
</FrameLayout>
|
||||
|
||||
|
||||
<org.joinmastodon.android.ui.views.HeaderSubtitleLinearLayout
|
||||
android:id="@+id/name_wrap"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="24dp"
|
||||
android:layout_toEndOf="@id/avatar"
|
||||
android:layout_below="@id/cover"
|
||||
android:layout_marginStart="16dp"
|
||||
android:layout_marginTop="8dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_toEndOf="@id/avatar_wrap"
|
||||
android:layout_marginEnd="16dp"
|
||||
android:singleLine="true"
|
||||
android:ellipsize="end"
|
||||
android:gravity="center_vertical"
|
||||
android:textAppearance="@style/m3_title_medium"
|
||||
tools:text="Eugen"/>
|
||||
android:layout_above="@+id/username">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/name"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:ellipsize="end"
|
||||
android:singleLine="true"
|
||||
android:textAppearance="@style/m3_title_medium"
|
||||
android:textColor="?colorM3OnSurface"
|
||||
android:gravity="start|center_vertical"
|
||||
tools:text="Eugen" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/pronouns"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="8sp"
|
||||
android:maxWidth="161sp"
|
||||
android:ellipsize="end"
|
||||
android:singleLine="true"
|
||||
android:textAppearance="@style/m3_title_medium"
|
||||
android:fontFamily="sans-serif"
|
||||
android:textAlignment="viewStart"
|
||||
android:textColor="?colorM3OnSurface"
|
||||
tools:text="they/them" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/extra_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="8sp"
|
||||
android:ellipsize="end"
|
||||
android:singleLine="true"
|
||||
android:textAppearance="@style/m3_title_medium"
|
||||
android:fontFamily="sans-serif"
|
||||
android:textAlignment="viewStart"
|
||||
android:textColor="?colorM3OnSurface"
|
||||
tools:text="boosted your cat picture" />
|
||||
|
||||
</org.joinmastodon.android.ui.views.HeaderSubtitleLinearLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/username"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignStart="@id/name"
|
||||
android:layout_alignEnd="@id/name"
|
||||
android:layout_below="@id/name"
|
||||
android:layout_alignBottom="@id/avatar_wrap"
|
||||
android:layout_marginEnd="16dp"
|
||||
android:layout_toEndOf="@id/avatar_wrap"
|
||||
android:layout_marginBottom="3sp"
|
||||
android:textAlignment="viewStart"
|
||||
android:singleLine="true"
|
||||
android:ellipsize="end"
|
||||
android:gravity="center_vertical"
|
||||
android:textAppearance="@style/m3_title_small"
|
||||
android:textAppearance="@style/m3_body_medium"
|
||||
android:textColor="?colorM3OnSurfaceVariant"
|
||||
tools:text="\@Gargron@mastodon.social"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/bio"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@id/avatar"
|
||||
android:layout_below="@id/avatar_wrap"
|
||||
android:layout_marginLeft="16dp"
|
||||
android:layout_marginRight="16dp"
|
||||
android:layout_marginTop="8dp"
|
||||
|
||||
@@ -3,14 +3,13 @@
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:paddingEnd="8dp"
|
||||
tools:ignore="RtlSymmetry">
|
||||
<ProgressBar
|
||||
android:id="@+id/progress"
|
||||
style="?android:progressBarStyleSmall"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:layout_gravity="center"
|
||||
android:elevation="10dp"
|
||||
android:indeterminate="true"
|
||||
@@ -21,6 +20,7 @@
|
||||
style="@style/Widget.Mastodon.M3.Button.Outlined.Icon"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:drawableTint="@null"
|
||||
android:drawableStart="@drawable/image_placeholder"
|
||||
android:background="@drawable/bg_button_m3_tonal"/>
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="8dp"
|
||||
android:paddingEnd="16dp"
|
||||
android:clipToPadding="false"
|
||||
android:background="?colorM3Background"
|
||||
tools:ignore="RtlSymmetry">
|
||||
@@ -26,6 +25,7 @@
|
||||
android:layout_height="48dp"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:layout_marginStart="8dp"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:scaleType="center"
|
||||
android:tint="?colorM3OnSurface"
|
||||
android:background="?android:actionBarItemBackground"
|
||||
|
||||
@@ -182,7 +182,7 @@
|
||||
<string name="report_reason_spam">إنه غير مرغوب فيه</string>
|
||||
<string name="report_reason_spam_subtitle">روابط خبيثة أو تفاعل كاذب أو ردود متكررة</string>
|
||||
<string name="report_reason_violation">ينتهك قواعد الخادم</string>
|
||||
<string name="report_reason_violation_subtitle">تعلم أنه ينتهك قواعد محددة</string>
|
||||
<string name="report_reason_violation_subtitle">أنت مُدرك لانتهاكه قواعد مُحَدَّدَة</string>
|
||||
<string name="report_reason_other">إنَّهُ شَيءٌ آخَر</string>
|
||||
<string name="report_reason_other_subtitle">لا تندرج هذه المشكلة ضمن فئات أخرى</string>
|
||||
<string name="report_choose_rule">ما هي القواعد المنتهكة؟</string>
|
||||
@@ -362,7 +362,7 @@
|
||||
<item quantity="zero">منذ %d ثانية</item>
|
||||
<item quantity="one">منذ ثانية</item>
|
||||
<item quantity="two">منذ ثانيتان</item>
|
||||
<item quantity="few">%d ثواني</item>
|
||||
<item quantity="few">%d ثوانٍ</item>
|
||||
<item quantity="many">منذ %d ثانية</item>
|
||||
<item quantity="other">%d ثواني مضت</item>
|
||||
</plurals>
|
||||
@@ -463,7 +463,7 @@
|
||||
<string name="welcome_to_mastodon">أهلًا بك على ماستدون</string>
|
||||
<string name="welcome_paragraph1">ماستدون شبكة اجتماعية لامركزية، بمعنى أنه ليس هناك شركة واحدة تتحكم فيها. وهي تتألف من العديد من الخوادم التي تدار بشكل مستقل، وجميعها متصلة معا.</string>
|
||||
<string name="what_are_servers">ما هي الخوادم؟</string>
|
||||
<string name="welcome_paragraph2"><![CDATA[تتم استضافة كل حساب ماستدون على خادم - ولكل منها قيمه وقواعده ومسؤوليه الخاصين. بغض النظر عن الشخص الذي تختاره ، يمكنك متابعة الأشخاص والتفاعل معهم على أي خادم.]]></string>
|
||||
<string name="welcome_paragraph2">تتم استضافة كل حساب ماستدون على خادم - ولكل خادم قيمه وقواعده ومسؤوليه الخاصين. مهما اخترت أي خادم، يمكنك متابعة الأشخاص والتفاعل معهم على أي خادم آخر.</string>
|
||||
<string name="opening_link">رابط الافتتاح…</string>
|
||||
<string name="link_not_supported">هذا الرابط غير مدعوم في التطبيق</string>
|
||||
<string name="log_out_all_accounts">تسجيل الخروج من جميع الحسابات</string>
|
||||
@@ -694,8 +694,8 @@
|
||||
<string name="posts_matching_string">منشورات تحتوي على “%s”</string>
|
||||
<string name="accounts_matching_string">أشخاص لديهم \"%s\"</string>
|
||||
<!-- Shown in the post header. Please keep it short -->
|
||||
<string name="time_seconds_ago_short">مُنذُ %dث</string>
|
||||
<string name="time_minutes_ago_short">مُنذُ %dش</string>
|
||||
<string name="time_hours_ago_short">مُنذُ %dس</string>
|
||||
<string name="time_days_ago_short">مُنذُ %dي</string>
|
||||
<string name="time_seconds_ago_short">مُنذُ %dثا</string>
|
||||
<string name="time_minutes_ago_short">مُنذُ %dد</string>
|
||||
<string name="time_hours_ago_short">مُنذُ %dسا</string>
|
||||
<string name="time_days_ago_short">مُنذُ %d أيام</string>
|
||||
</resources>
|
||||
|
||||
@@ -404,7 +404,6 @@
|
||||
<string name="welcome_to_mastodon">Вітаем у Mastodon</string>
|
||||
<string name="welcome_paragraph1">Mastodon - гэта дэцэнтралізаваная сацыяльная сетка, што азначае, што ні адна кампанія не кантралюе яе. Яна складаецца з мноства незалежна працуючых сервераў, злучаных разам.</string>
|
||||
<string name="what_are_servers">Што такое серверы?</string>
|
||||
<string name="welcome_paragraph2"><![CDATA[Кожны акаўнт Mastodon размяшчаецца на серверы - кожны са сваімі каштоўнасцямі, правіламі і адміністратарамі. Незалежна ад таго, які сервер вы вылучыце, вы можаце сачыць і ўзаемадзейнічаць з людзьмі на любым серверы.]]></string>
|
||||
<string name="retry">Паўтарыць</string>
|
||||
<!-- %s is formatted file size ("467 KB image") -->
|
||||
<string name="attachment_type_video">Відэа</string>
|
||||
|
||||
@@ -181,7 +181,6 @@
|
||||
<string name="welcome_to_mastodon">Mastodon - এ আপনাকে স্বাগত জানাই</string>
|
||||
<string name="welcome_paragraph1">Mastodon হল একটি বিকেন্দ্রীভূত সামাজিক নেটওয়ার্ক, যার মানে কোনো একক কোম্পানি এটিকে নিয়ন্ত্রণ করে না। এটি অনেকগুলি স্বাধীনভাবে চালিত সার্ভারের সমন্বয়ে গঠিত, যেখানে সব সার্ভারগুলি একসাথে সংযুক্ত৷</string>
|
||||
<string name="what_are_servers">সার্ভার কি?</string>
|
||||
<string name="welcome_paragraph2"><![CDATA[প্রতিটি Mastodon অ্যাকাউন্টকে একটি সার্ভারে হোস্ট করা হয় — প্রত্যেকটির নিজস্ব মান, নিয়ম এবং প্রশাসক (অ্যাডমিন) রয়েছে। আপনি যে কোনো সার্ভারই বেছে নিন না কেন তা বিবেচ্য নয়, আপনি যেকোনো সার্ভারের লোকেদের সাথে যোগাযোগ করতে এবং তাদের ফলো করতে পারেন।]]></string>
|
||||
<!-- %s is formatted file size ("467 KB image") -->
|
||||
<!-- %s is the server domain -->
|
||||
<!-- Shown on the "stamp" on the screen that appears after you report a post/user. Please keep the translation short, preferably a single word -->
|
||||
|
||||
@@ -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">Edita les llistes amb %s</string>
|
||||
<string name="sk_lists_with_user">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 Megalodon</string>
|
||||
<string name="sk_settings_show_federated_timeline">Mostra la línia de temps federada</string>
|
||||
@@ -246,11 +246,130 @@
|
||||
<string name="sk_searching">Cercant…</string>
|
||||
<string name="sk_save_draft">Voleu desar l\'esborrany\?</string>
|
||||
<string name="sk_settings_show_no_alt_indicator">Indicador dels textos alternatius inexistents</string>
|
||||
<string name="sk_settings_prefix_reply_cw_with_re">Afegeix «re:» a les respostes als avisos de contingut</string>
|
||||
<string name="sk_settings_prefix_reply_cw_with_re">Afig «re:» en respondre als avisos de contingut</string>
|
||||
<string name="sk_filtered">Filtrat: %s</string>
|
||||
<string name="sk_expand">Amplia</string>
|
||||
<string name="sk_collapse">Tanca</string>
|
||||
<string name="sk_settings_collapse_long_posts">Acurta les publicacions llargues</string>
|
||||
<string name="sk_signed_up">registrat</string>
|
||||
<string name="sk_spectator_mode">Mode d\'espectador</string>
|
||||
<string name="sk_button_react">Reacciona amb un emoji</string>
|
||||
<string name="sk_enter_emoji_hint">Escriviu per a reaccionar amb un emoji</string>
|
||||
<string name="sk_duration_minutes_5">5 minuts</string>
|
||||
<string name="sk_duration_minutes_30">30 minuts</string>
|
||||
<string name="sk_duration_hours_1">1 hora</string>
|
||||
<string name="sk_duration_hours_6">6 hores</string>
|
||||
<string name="sk_duration_indefinite">Indefinida</string>
|
||||
<string name="sk_mute_label">Durada</string>
|
||||
<string name="sk_enter_emoji_toast">Heu d\'escriure un emoji</string>
|
||||
<string name="sk_again_for_system_keyboard">Toqueu una altra vegada per a obrir el teclat del sistema</string>
|
||||
<string name="sk_duration_days_1">1 dia</string>
|
||||
<string name="sk_duration_days_3">3 dies</string>
|
||||
<string name="sk_duration_days_7">7 dies</string>
|
||||
<string name="sk_notification_mention">%s t\'ha mencionat</string>
|
||||
<string name="sk_settings_auto_reveal_equal_spoilers">Mostra els mateixos avisos de contingut en respostes</string>
|
||||
<string name="sk_settings_auto_reveal_nobody">Mai</string>
|
||||
<string name="sk_settings_auto_reveal_author">Respostes del mateix autor</string>
|
||||
<string name="sk_open_in_app_failed">No s\'ha pogut obrir</string>
|
||||
<string name="sk_no_remote_info_hint">La informació remota no està disponible</string>
|
||||
<string name="sk_error_loading_profile">No s\'ha pogut carregar el perfil via %s</string>
|
||||
<string name="sk_settings_prefix_replies_to_others">Només en resposta a altres</string>
|
||||
<string name="sk_settings_prefix_replies_always">Responent a qualsevol</string>
|
||||
<string name="sk_settings_prefix_replies_never">Mai</string>
|
||||
<string name="sk_content_type_unspecified">Sense especificar</string>
|
||||
<string name="sk_content_type_plain">Text pla</string>
|
||||
<string name="sk_content_type_html">HTML</string>
|
||||
<string name="sk_content_type">Tipus de contingut</string>
|
||||
<string name="sk_content_type_mfm">MFM</string>
|
||||
<string name="sk_settings_default_content_type">Contingut per defecte</string>
|
||||
<string name="sk_timeline_bubble">Bombolla</string>
|
||||
<string name="sk_in_reply">Resposta</string>
|
||||
<string name="sk_followed_as">Seguit a %s</string>
|
||||
<string name="sk_follow_as">Segueix des d\'un altre compte</string>
|
||||
<string name="sk_icon_feed">Línia del temps</string>
|
||||
<string name="sk_edit_timeline_tag_main">Publicacions amb l\'etiqueta…</string>
|
||||
<string name="sk_edit_timeline_tags_explanation">Tingueu en compte que el servidor gestiona aquestes operacions. És possible que no s\'admeta combinar-les.</string>
|
||||
<string name="sk_new_reports">Denúncies noves</string>
|
||||
<string name="sk_unfinished_attachments_message">Alguns fitxers adjunts no han acabat de pujar-se\'n.</string>
|
||||
<string name="sk_settings_hide_fab">Amaga automàticament el botó de redacció</string>
|
||||
<string name="sk_settings_confirm_before_reblog">Confirma abans d\'impulsar</string>
|
||||
<string name="sk_settings_content_types">Activa la formatació de text</string>
|
||||
<string name="sk_settings_content_types_explanation">Permet establir un format de contingut com Markdown en crear una publicació. Tingueu en compte que no totes les instàncies són compatibles.</string>
|
||||
<string name="sk_settings_default_content_type_explanation">Això permet preseleccionar un tipus de contingut en crear publicacions noves, substituint el valor establert a «Preferències de publicació».</string>
|
||||
<string name="sk_settings_emoji_reactions">Activa les reaccions d\'emojis</string>
|
||||
<string name="sk_settings_emoji_reactions_explanation">Mostra les reaccions d\'emojis a les publicacions i us permet interactuar amb elles. Algunes versions modificades de Mastodon són compatibles, però Mastodon no.</string>
|
||||
<string name="sk_settings_emoji_reactions_in_lists">Mostra les reaccions d\'emojis a les línies de temps</string>
|
||||
<plurals name="sk_users_reacted_with">
|
||||
<item quantity="one">Un usuari ha reaccionat amb %2$s</item>
|
||||
<item quantity="other">%1$,d usuaris han reaccionat amb %2$s</item>
|
||||
</plurals>
|
||||
<string name="sk_settings_emoji_reactions_in_lists_explanation">Si les reaccions d\'emojis s\'han de mostrar a les línies de temps. Si l\'opció està desactivada, les reaccions d\'emojis només es mostraran quan es visualitze un fil.</string>
|
||||
<string name="sk_settings_unifiedpush">Utilitza UnifiedPush</string>
|
||||
<string name="sk_list_exclusive_switch">Fes la llista exclusiva</string>
|
||||
<string name="sk_settings_unifiedpush_choose">Tria un distribuïdor</string>
|
||||
<string name="sk_list_exclusive_switch_explanation">Els membres d\'una llista exclusiva no apareixeran a la línia de temps de l\'inici (si la vostra instància és compatible).</string>
|
||||
<string name="sk_settings_unifiedpush_no_distributor_body">Heu d\'instal·lar un distribuïdor perquè funcionen les notificacions UnifiedPush. Per a més informació, visita https://unifiedpush.org/</string>
|
||||
<string name="sk_settings_allow_remote_loading">Carrega la informació de les instàncies remotes</string>
|
||||
<string name="sk_settings_forward_report_default">Activa per defecte «Reenvia la denúncia»</string>
|
||||
<string name="sk_gif_badge">GIF</string>
|
||||
<string name="sk_quoting_user">Citant %s</string>
|
||||
<string name="sk_settings_reply_visibility">Visibilitat de la resposta</string>
|
||||
<string name="sk_settings_reply_visibility_all">Totes les respostes</string>
|
||||
<string name="sk_settings_reply_visibility_following">Respostes als meus seguits</string>
|
||||
<string name="sk_settings_reply_visibility_self">Respostes a mi</string>
|
||||
<string name="sk_notification_action_replied">S\'ha enviat la resposta a %s</string>
|
||||
<string name="sk_settings_continues_playback">Superposició d\'àudio</string>
|
||||
<string name="sk_settings_continues_playback_summary">Permet que els fitxers multimèdia que ja s\'estan reproduint continuen reproduint-se en la superposició el reproductor nou</string>
|
||||
<string name="sk_settings_unifiedpush_no_distributor">No s\'ha trobat cap distribuïdor</string>
|
||||
<string name="sk_icon_bed">Llit</string>
|
||||
<string name="sk_icon_recycle_bin">Paperera de reciclatge</string>
|
||||
<string name="sk_icon_verified">Verificat</string>
|
||||
<string name="sk_icon_doctor">Metge</string>
|
||||
<string name="sk_icon_diamond">Diamant</string>
|
||||
<string name="sk_icon_umbrella">Paraigua</string>
|
||||
<string name="sk_add_timeline">Afig línia de temps</string>
|
||||
<string name="sk_edit_timeline_tag_any">…o alguna d\'aquestes</string>
|
||||
<string name="sk_edit_timeline_tag_all">…i cada una d\'aquestes</string>
|
||||
<string name="sk_edit_timeline_tag_none">…però cap d\'aquestes</string>
|
||||
<string name="sk_edit_timeline_tag_hint">Introduïu l\'etiqueta…</string>
|
||||
<string name="sk_edit_timeline_tags_hint">Introduïu etiquetes…</string>
|
||||
<string name="sk_icon_beaker">Vas científic</string>
|
||||
<string name="sk_hashtag_timeline_local_only_switch">Mostra només publicacions locals\?</string>
|
||||
<string name="sk_add_timeline_tag_error_empty">L\'etiqueta no pot ser buida</string>
|
||||
<string name="sk_reported">denunciat</string>
|
||||
<string name="sk_unfinished_attachments">Voleu arreglar els adjunts\?</string>
|
||||
<string name="sk_reply_line_above_avatar">Text «En resposta a» damunt de l\'avatar</string>
|
||||
<string name="sk_compact_reblog_reply_line">Text compacte d\'impuls/resposta</string>
|
||||
<string name="sk_content_type_markdown">Markdown</string>
|
||||
<string name="sk_content_type_bbcode">BBCode</string>
|
||||
<string name="sk_instance_info_unavailable">La informació de la instància no està disponible temporalment</string>
|
||||
<string name="sk_open_in_app">Obri en l\'aplicació</string>
|
||||
<string name="sk_external_share_title">Comparteix amb un compte</string>
|
||||
<string name="sk_external_share_or_open_title">Comparteix o obri amb un compte</string>
|
||||
<string name="sk_settings_show_labels_in_navigation_bar">Mostra els noms de les pestanyes a la barra de navegació</string>
|
||||
<string name="sk_tab_profile">Perfil</string>
|
||||
<string name="sk_tab_notifications">Notificacions</string>
|
||||
<string name="sk_tab_search">Cerca</string>
|
||||
<string name="sk_tab_home">Inici</string>
|
||||
<string name="sk_settings_display_pronouns_in_user_listings">Mostra els pronoms als llistats d\'usuaris</string>
|
||||
<string name="sk_settings_display_pronouns_in_threads">Mostra els pronoms als fils</string>
|
||||
<string name="sk_settings_display_pronouns_in_timelines">Mostra els pronoms a les línies de temps</string>
|
||||
<string name="sk_settings_instance">Instància</string>
|
||||
<string name="sk_switch_timeline">Canvia de línia de temps</string>
|
||||
<string name="sk_pronouns_label">Pronoms</string>
|
||||
<string name="sk_spoiler_show">Mostra el contingut</string>
|
||||
<string name="sk_exclusive_list">Llista exclusiva</string>
|
||||
<string name="sk_settings_allow_remote_loading_explanation">Prova d\'obtenir llistes més precises de seguidors, m\'agrada i impulsos carregant la informació de la instància d\'origen.</string>
|
||||
<string name="sk_settings_auto_reveal_anyone">Respostes de tothom</string>
|
||||
<string name="sk_advanced_options_show">Mostra les opcions avançades</string>
|
||||
<string name="sk_advanced_options_hide">Amaga les opcions avançades</string>
|
||||
<string name="sk_disable_pill_shaped_active_indicator">Desactiva l\'indicador en forma de pastilla de pestanya activa</string>
|
||||
<string name="sk_settings_true_black">Mode de negre pur</string>
|
||||
<string name="sk_reacted_with">%1$s ha reaccionat amb %2$s</string>
|
||||
<string name="sk_reacted">%s ha reaccionat</string>
|
||||
<string name="sk_settings_hide_interaction">Amaga els botons d\'interacció</string>
|
||||
<string name="sk_show_thread">Mostra el fil</string>
|
||||
<string name="sk_bubble_timeline_info_banner">Aquestes són les publicacions més recents de la xarxa seleccionades per l\'administració de la instància.</string>
|
||||
<string name="sk_icon_gauge">Indicador</string>
|
||||
<string name="sk_search_fediverse">Cerca al fedivers</string>
|
||||
</resources>
|
||||
@@ -425,7 +425,6 @@
|
||||
<string name="welcome_to_mastodon">Vítejte na Mastodonu</string>
|
||||
<string name="welcome_paragraph1">Mastodon je decentralizovaná sociální síť, což znamená, že ji neovládá žádná jednotlivá společnost. Skládá se z mnoha nezávisle spravovaných serverů, všechny jsou propojeny dohromady.</string>
|
||||
<string name="what_are_servers">Co jsou to servery?</string>
|
||||
<string name="welcome_paragraph2"><![CDATA[Každý účet Mastodon je hostován na serveru - každý s vlastními hodnotami, pravidly a správci. Bez ohledu na to, který si vyberete, můžete sledovat a komunikovat s lidmi na jakémkoliv serveru.]]></string>
|
||||
<string name="opening_link">Odkaz se otevírá…</string>
|
||||
<string name="link_not_supported">Tento odkaz není v aplikaci podporovaný</string>
|
||||
<string name="log_out_all_accounts">Odhlásit se ze všech účtů</string>
|
||||
|
||||
@@ -387,7 +387,6 @@
|
||||
<string name="welcome_to_mastodon">Velkommen til Mastodon</string>
|
||||
<string name="welcome_paragraph1">Mastodon er et decentraliseret socialt netværk, hvilket betyder at ingen enkelt virksomhed styrer det. Det består af mange uafhængige servere, alle forbundet sammen.</string>
|
||||
<string name="what_are_servers">Hvad er servere?</string>
|
||||
<string name="welcome_paragraph2"><![CDATA[Alle Mastodon-konti har plads på en server. Hver server har sine egne værdier, regler og administratorer. Ligegyldigt hvilken server du vælger, kan du følge og interagere med folk på alle andre servere.]]></string>
|
||||
<string name="opening_link">Åbner link…</string>
|
||||
<string name="link_not_supported">Linket er ikke understøttet i appen</string>
|
||||
<string name="log_out_all_accounts">Log ud af alle konti</string>
|
||||
|
||||
@@ -43,8 +43,8 @@
|
||||
<string name="block_user">%s sperren</string>
|
||||
<string name="unblock_user">%s entsperren</string>
|
||||
<string name="report_user">%s melden</string>
|
||||
<string name="block_domain">%s sperren</string>
|
||||
<string name="unblock_domain">%s nicht mehr sperren</string>
|
||||
<string name="block_domain">%s blockieren</string>
|
||||
<string name="unblock_domain">%s nicht mehr blockieren</string>
|
||||
<plurals name="x_posts">
|
||||
<item quantity="one">%,d Beitrag</item>
|
||||
<item quantity="other">%,d Beiträge</item>
|
||||
@@ -98,12 +98,12 @@
|
||||
<string name="do_unmute">Nicht mehr stummschalten</string>
|
||||
<string name="confirm_block_title">Konto sperren</string>
|
||||
<string name="confirm_block_domain_title">Domain sperren</string>
|
||||
<string name="confirm_block">Bestätigen, um %s zu sperren</string>
|
||||
<string name="confirm_block">Bestätigen, um %s zu blockieren</string>
|
||||
<string name="do_block">Sperren</string>
|
||||
<string name="confirm_unblock_title">Konto nicht mehr sperren</string>
|
||||
<string name="confirm_unblock_domain_title">Domain nicht mehr blockieren</string>
|
||||
<string name="confirm_unblock">Bestätigen, um Sperre von %s aufzuheben</string>
|
||||
<string name="do_unblock">Sperre aufheben</string>
|
||||
<string name="confirm_unblock">Bestätigen, um %s nicht mehr zu blockieren</string>
|
||||
<string name="do_unblock">Nicht mehr blockieren</string>
|
||||
<string name="button_blocked">Blockiert</string>
|
||||
<string name="action_vote">Abstimmen</string>
|
||||
<string name="delete">Löschen</string>
|
||||
@@ -387,7 +387,6 @@
|
||||
<string name="welcome_to_mastodon">Willkommen auf Mastodon</string>
|
||||
<string name="welcome_paragraph1">Mastodon ist ein dezentrales, soziales Netzwerk. Das bedeutet, dass es nicht von einem einzigen Unternehmen kontrolliert wird. Das Netzwerk besteht aus unabhängig voneinander betriebenen Servern, die miteinander verbunden sind.</string>
|
||||
<string name="what_are_servers">Was sind Server?</string>
|
||||
<string name="welcome_paragraph2"><![CDATA[Jedes Mastodon-Konto wird auf einem Server gehostet. Jeder Server hat dabei seine eigenen Werte, Regeln und Administrator*innen. Aber egal, für welchen Server Du Dich entscheidest: Du kannst mit Leuten von anderen Servern interagieren und ihnen folgen.]]></string>
|
||||
<string name="opening_link">Link wird geöffnet…</string>
|
||||
<string name="link_not_supported">Dieser Link wird in der App nicht unterstützt</string>
|
||||
<string name="log_out_all_accounts">Von allen Konten abmelden</string>
|
||||
|
||||
@@ -387,7 +387,6 @@
|
||||
<string name="welcome_to_mastodon">Καλώς ήρθες στο Mastodon</string>
|
||||
<string name="welcome_paragraph1">Το Mastodon είναι ένα αποκεντρωμένο κοινωνικό δίκτυο που σημαίνει ότι καμία εταιρεία δεν το ελέγχει. Αποτελείται από πολλούς ανεξάρτητους διακομιστές, όλοι συνδεδεμένοι μαζί.</string>
|
||||
<string name="what_are_servers">Τι είναι οι διακομιστές;</string>
|
||||
<string name="welcome_paragraph2"><![CDATA[Κάθε λογαριασμός Mastodon φιλοξενείται σε ένα διακομιστή - ο καθένας με τις δικές του αξίες, κανόνες και διαχειριστές. Ανεξάρτητα από το ποιον μπορεί να επιλέξεις, μπορείς να ακολουθήσεις και να αλληλεπιδράσεις με άτομα από οποιονδήποτε διακομιστή.]]></string>
|
||||
<string name="opening_link">Άνοιγμα συνδέσμου…</string>
|
||||
<string name="link_not_supported">Αυτός ο σύνδεσμος δεν υποστηρίζεται στην εφαρμογή</string>
|
||||
<string name="log_out_all_accounts">Αποσύνδεση από όλους τους λογαριασμούς</string>
|
||||
|
||||
@@ -387,7 +387,6 @@
|
||||
<string name="welcome_to_mastodon">Bienvenido/da a Mastodon</string>
|
||||
<string name="welcome_paragraph1">Mastodon es una red social descentralizada, lo que significa que no la controla una sola compañía. Está formada por muchos servidores independientes, todos juntos conectados.</string>
|
||||
<string name="what_are_servers">¿Qué son los servidores?</string>
|
||||
<string name="welcome_paragraph2"><![CDATA[Cada cuenta de Mastodon está alojada en un servidor — cada uno con sus propios valores, reglas y administradores. No importa cual elijas, puede seguir e interactuar con personas en cualquier servidor.]]></string>
|
||||
<string name="opening_link">Abriendo enlace…</string>
|
||||
<string name="link_not_supported">Este enlace no es compatible con la aplicación</string>
|
||||
<string name="log_out_all_accounts">Cerrar sesión en todas las cuentas</string>
|
||||
|
||||
@@ -373,4 +373,9 @@
|
||||
<string name="sk_settings_emoji_reactions_in_lists_explanation">Las reacciones con los emoticonos deben mostrarse en las líneas de tiempo. Si esta opción está desactivada, las reacciones con los emoticonos solo se mostrarán al ver un hilo.</string>
|
||||
<string name="sk_button_react">Reacciona con un emoticono</string>
|
||||
<string name="sk_again_for_system_keyboard">Pulsa de nuevo para el Teclado del sistema</string>
|
||||
<plurals name="sk_posts_count_label">
|
||||
<item quantity="one">tema</item>
|
||||
<item quantity="many">temas</item>
|
||||
<item quantity="other">temas</item>
|
||||
</plurals>
|
||||
</resources>
|
||||
@@ -387,7 +387,6 @@
|
||||
<string name="welcome_to_mastodon">به ماستودون خوش آمدید</string>
|
||||
<string name="welcome_paragraph1">ماستودون یک شبکه اجتماعی غیر متمرکز است،به این معنی که هیچ شرکتی آن را کنترل نمی کند. این از بسیاری از کارسازهای مستقل تشکیل شده است که همه به هم متصل هستند.</string>
|
||||
<string name="what_are_servers">کارساز شما کجاست؟</string>
|
||||
<string name="welcome_paragraph2"><![CDATA[هر حساب ماستودون بر روی یک سرور میزبانی می شود — هر کدام با مقادیر، قوانین و مدیران خاص خود. مهم نیست کدام یک را انتخاب می کنید، می توانید افراد را در هر کارسازی دنبال کنید و با آنها تعامل داشته باشید.]]></string>
|
||||
<string name="opening_link">باز کردن پیوند…</string>
|
||||
<string name="link_not_supported">این پیوند در کاره پشتیبانی نمی شود</string>
|
||||
<string name="log_out_all_accounts">از همه حسابها خارج شوید</string>
|
||||
|
||||
@@ -387,7 +387,7 @@
|
||||
<string name="welcome_to_mastodon">Bienvenue sur Mastodon</string>
|
||||
<string name="welcome_paragraph1">Mastodon est un réseau social décentralisé, ce qui signifie qu’aucune entreprise ne le contrôle. Il est composé de plusieurs serveurs indépendants, tous connectés ensemble.</string>
|
||||
<string name="what_are_servers">Que sont les serveurs ?</string>
|
||||
<string name="welcome_paragraph2"><![CDATA[Chaque compte Mastodon est hébergé sur un serveur, chacun ayant ses valeurs, ses règles, et ses administratrices ou administrateurs. Quel que soit le serveur que vous choisissez, vous pouvez suivre et interagir avec des personnes sur n\'importe quel serveur.]]></string>
|
||||
<string name="welcome_paragraph2">Chaque compte Mastodon est hébergé sur un serveur, chacun ayant ses valeurs, ses règles, et ses administratrices ou administrateurs. Quel que soit le serveur que vous choisissez, vous pouvez suivre et interagir avec des personnes sur n\'importe quel autre serveur.</string>
|
||||
<string name="opening_link">Ouverture du lien…</string>
|
||||
<string name="link_not_supported">Ce lien n’est pas pris en charge dans l’application</string>
|
||||
<string name="log_out_all_accounts">Se déconnecter de tous les comptes</string>
|
||||
|
||||
@@ -374,4 +374,9 @@
|
||||
<string name="sk_again_for_system_keyboard">Appuyez à nouveau pour le clavier système</string>
|
||||
<string name="sk_enter_emoji_hint">Tapez pour réagir avec un emoji</string>
|
||||
<string name="sk_enter_emoji_toast">Vous devez saisir un emoji</string>
|
||||
<plurals name="sk_posts_count_label">
|
||||
<item quantity="one">message</item>
|
||||
<item quantity="many">messages</item>
|
||||
<item quantity="other">messages</item>
|
||||
</plurals>
|
||||
</resources>
|
||||
@@ -425,7 +425,7 @@
|
||||
<string name="welcome_to_mastodon">Fàilte gu Mastodon</string>
|
||||
<string name="welcome_paragraph1">’S e lìonra sòisealta sgaoilte a th’ ann am Mastodon agus is ciall dha seo nach eil e fo smachd aon chompanaidh a-mhàin. Tha e dèanta de ghrunn fhrithealaichean a tha ’gan ruith gu neo-eisimeileach ach ceangailte ri chèile.</string>
|
||||
<string name="what_are_servers">Dè th’ anns na frithealaichean?</string>
|
||||
<string name="welcome_paragraph2"><![CDATA[Tha gach cunntas Mastodon ’ga òstadh air frithealaiche – tha luachan, riaghailtean ⁊ rianairean sònraichte aig gach fear. Ge b’ e dè am frithealaiche a thaghas tu, ’s urrainn dhut daoine air frithealaiche sam bith a leantainn is bruidhinn riutha.]]></string>
|
||||
<string name="welcome_paragraph2">Tha gach cunntas Mastodon ’ga òstadh air frithealaiche – tha luachan, riaghailtean ⁊ rianairean sònraichte aig gach fear. Ge b’ e dè am frithealaiche a thaghas tu, ’s urrainn dhut daoine air frithealaiche sam bith a leantainn is bruidhinn riutha.</string>
|
||||
<string name="opening_link">A’ fosgladh a’ cheangail…</string>
|
||||
<string name="link_not_supported">Cha chuir an aplacaid taic ris a’ cheangal seo</string>
|
||||
<string name="log_out_all_accounts">Clàraich a-mach às a h-uile cunntas</string>
|
||||
|
||||
@@ -336,7 +336,6 @@
|
||||
<string name="welcome_to_mastodon">Benvida a Mastodon</string>
|
||||
<string name="welcome_paragraph1">Mastodon é unha rede social descentralizada, onde ningunha empresa ten o control. Está formada por moitos servidores independentes comunicándose entre si.</string>
|
||||
<string name="what_are_servers">Que son os servidores?</string>
|
||||
<string name="welcome_paragraph2"><![CDATA[Cada conta Mastodon está hospedada nun servidor — cada unha coas súas regras, valores e admins. Non importa cal elixas, podes seguir e interactuar con persoas de outros servidores.]]></string>
|
||||
<!-- %s is formatted file size ("467 KB image") -->
|
||||
<!-- %s is the server domain -->
|
||||
<!-- Shown on the "stamp" on the screen that appears after you report a post/user. Please keep the translation short, preferably a single word -->
|
||||
|
||||
@@ -1,3 +1,18 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
</resources>
|
||||
<string name="sk_app_name">मेगालोडॉन</string>
|
||||
<string name="sk_pinned_posts">पिन किया गया</string>
|
||||
<string name="sk_delete_and_redraft">हटाएं और पुनः ड्राफ्ट करें</string>
|
||||
<string name="sk_confirm_delete_and_redraft_title">हटाएं और पोस्ट को पुनः ड्राफ्ट करें</string>
|
||||
<string name="sk_pin_post">प्रोफाइल पर पिन करें</string>
|
||||
<string name="sk_confirm_pin_post_title">पोस्ट को प्रोफाइल पर पिन करें</string>
|
||||
<string name="sk_pinning">पोस्ट पिन की जा रही है…</string>
|
||||
<string name="sk_unpin_post">प्रोफाइल से अनपिन करें</string>
|
||||
<string name="sk_confirm_unpin_post_title">पोस्ट को प्रोफाइल से अनपिन करें</string>
|
||||
<string name="sk_unpinning">पोस्ट अनपिन की जा रही है…</string>
|
||||
<string name="sk_image_description">चित्र विवरण</string>
|
||||
<string name="sk_visibility_unlisted">असूचित</string>
|
||||
<string name="sk_confirm_delete_and_redraft">क्या आप निश्चित हैं कि आप इस पोस्ट को हटाकर पुनः ड्राफ़्ट करना चाहते हैं\?</string>
|
||||
<string name="sk_confirm_unpin_post">क्या आप निश्चित हैं कि आपको यह पोस्ट अनपिन करनी है\?</string>
|
||||
<string name="sk_confirm_pin_post">क्या आप इस पोस्ट को अपनी प्रोफाइल पर पिन करना चाहते हैं\?</string>
|
||||
</resources>
|
||||
@@ -303,7 +303,6 @@
|
||||
<string name="welcome_to_mastodon">Բարի գալուստ Մաստոդոն</string>
|
||||
<string name="welcome_paragraph1">Մաստոդոնը ապակենտրոնացված սոցցանց է, այսինքն՝ այն չի պատկանում մի ընկերության։ Այն բաղկացած է բազմաթիվ անկախ և կապակցված սերվերներից։</string>
|
||||
<string name="what_are_servers">Ի՞նչ է սերվերը։</string>
|
||||
<string name="welcome_paragraph2"><![CDATA[Մաստոդոնի որևէ հաշիվ գտնվում է սերվերի վրա - ամեն մեկը՝ իր արժեքներով, կանոններով և ադմիններով։ Դուք կարող եք հետևել և շփվել որևէ սերվերի մարդկանց հետ՝ անկախ ձեր ընտրությունից։]]></string>
|
||||
<string name="retry">Կրկին</string>
|
||||
<!-- %s is formatted file size ("467 KB image") -->
|
||||
<string name="alt_text">Բացատրություն</string>
|
||||
|
||||
@@ -368,7 +368,6 @@
|
||||
<string name="welcome_to_mastodon">Selamat datang di Mastodon</string>
|
||||
<string name="welcome_paragraph1">Mastodon adalah jejaring sosial terdesentralisasi, tidak ada satu pun perusahaan yang mengontrol. Semua dijalankan oleh server independen, terkoneksi bersama.</string>
|
||||
<string name="what_are_servers">Apa itu server?</string>
|
||||
<string name="welcome_paragraph2"><![CDATA[Semua akun Mastodon berada pada sebuah server — dengan nilai, aturan, dan admin masing-masing. Mana pun yang kamu pilih, kamu bisa mengikuti dan berinteraksi dengan server mana pun.]]></string>
|
||||
<string name="opening_link">Membuka tautan…</string>
|
||||
<string name="link_not_supported">Tautan ini tidak didukung dalam aplikasi</string>
|
||||
<string name="log_out_all_accounts">Keluar dari semua akun</string>
|
||||
|
||||
@@ -372,4 +372,7 @@
|
||||
<string name="sk_settings_emoji_reactions_in_lists_explanation">"Menentukan apakah reaksi emoji ditampilkan di lini masa. Jika opsi ini mati, reaksi emoji hanya akan ditampilkan ketika melihat sebuah utas."</string>
|
||||
<string name="sk_button_react">Bereaksi dengan emoji</string>
|
||||
<string name="sk_again_for_system_keyboard">Ketuk lagi untuk Papan Ketik Sistem</string>
|
||||
<plurals name="sk_posts_count_label">
|
||||
<item quantity="other">kiriman</item>
|
||||
</plurals>
|
||||
</resources>
|
||||
@@ -387,7 +387,7 @@
|
||||
<string name="welcome_to_mastodon">Velkomin í Mastodon</string>
|
||||
<string name="welcome_paragraph1">Mastodon er dreyfhýst samfélagsnet, sem þýðir að ekkert eitt fyrirtæki ræður yfir því. Netið samanstendur af mörgum sjálfstætt reknum netþjónum sem tengjast innbyrðis.</string>
|
||||
<string name="what_are_servers">Hvað eru netþjónar?</string>
|
||||
<string name="welcome_paragraph2"><![CDATA[Hver einasti Mastodon-aðgangur er hýstur á sínum netþjóni — hver slíkur er með sín eigin gildi, reglur og stjórnendur. Það skiftir ekki máli hvern þeirra þú velur, þú getur fylgst fylgst með og átt í samskiptum við fólk á hvaða netþjóni sem er.]]></string>
|
||||
<string name="welcome_paragraph2">Hver einasti Mastodon-aðgangur er hýstur á sínum netþjóni — hver slíkur er með sín eigin gildi, reglur og stjórnendur. Það skiftir ekki máli hvern þeirra þú velur, þú getur fylgst fylgst með og átt í samskiptum við fólk á hvaða netþjóni sem er.</string>
|
||||
<string name="opening_link">Opna tengil…</string>
|
||||
<string name="link_not_supported">Það er ekki stuðningur við tengilinn í forritinu</string>
|
||||
<string name="log_out_all_accounts">Skrá út úr öllum aðgöngum</string>
|
||||
|
||||
@@ -387,7 +387,6 @@
|
||||
<string name="welcome_to_mastodon">Benvenuto/a su Mastodon</string>
|
||||
<string name="welcome_paragraph1">Mastodon è un social network decentralizzato, il che significa che nessuna singola azienda lo controlla. È composto da molti server indipendenti e tutti connessi insieme.</string>
|
||||
<string name="what_are_servers">Cosa sono i server?</string>
|
||||
<string name="welcome_paragraph2"><![CDATA[Ogni account Mastodon è ospitato su un server — ognuno con i propri valori, regole, e amministratori. Non importa quale scegliere, è possibile seguire e interagire con le persone su qualsiasi server.]]></string>
|
||||
<string name="opening_link">Apertura del collegamento…</string>
|
||||
<string name="link_not_supported">Questo collegamento non è supportato nell\'app</string>
|
||||
<string name="log_out_all_accounts">Esci da tutti gli account</string>
|
||||
|
||||
@@ -36,13 +36,13 @@
|
||||
<string name="button_following">フォロー中</string>
|
||||
<string name="edit_profile">プロフィールを編集</string>
|
||||
<string name="share_user">プロフィールを共有</string>
|
||||
<string name="mute_user">%s さんをミュート</string>
|
||||
<string name="unmute_user">%s さんのミュートを解除</string>
|
||||
<string name="block_user">%s さんをブロック</string>
|
||||
<string name="unblock_user">%s さんのブロックを解除</string>
|
||||
<string name="report_user">%s さんを報告</string>
|
||||
<string name="block_domain">%s をブロック</string>
|
||||
<string name="unblock_domain">%s のブロックを解除</string>
|
||||
<string name="mute_user">ミュート: %s さん</string>
|
||||
<string name="unmute_user">ミュート解除: %s さん</string>
|
||||
<string name="block_user">ブロック: %s さん</string>
|
||||
<string name="unblock_user">ブロック解除: %s さん</string>
|
||||
<string name="report_user">報告: %s さん</string>
|
||||
<string name="block_domain">ブロック: %s</string>
|
||||
<string name="unblock_domain">ブロック解除: %s</string>
|
||||
<plurals name="x_posts">
|
||||
<item quantity="other">投稿 %,d 件</item>
|
||||
</plurals>
|
||||
@@ -134,7 +134,7 @@
|
||||
<string name="sending_report">報告を送信しています...</string>
|
||||
<string name="report_sent_title">ご報告ありがとうございます、追って確認します。</string>
|
||||
<string name="report_sent_subtitle">私たちが確認する前でも、あなたが %s さんにできる対応があります。</string>
|
||||
<string name="unfollow_user">%s さんのフォローを解除</string>
|
||||
<string name="unfollow_user">フォロー解除: %s さん</string>
|
||||
<string name="unfollow">フォローを解除</string>
|
||||
<string name="mute_user_explain">ミュートすると、相手の投稿が表示されなくなります。相手は引き続きあなたをフォローしたり、あなたの投稿を表示したりできますが、ミュートしていることは伝わりません。</string>
|
||||
<string name="block_user_explain">ブロックすると、相手の投稿が表示されなくなります。相手はあなたの投稿を見たり、フォローしたりできなくなります。相手にブロックしていることが伝わります。</string>
|
||||
@@ -222,13 +222,13 @@
|
||||
<string name="home_timeline">ホームタイムライン</string>
|
||||
<string name="my_profile">プロフィール</string>
|
||||
<string name="media_viewer">メディアビューアー</string>
|
||||
<string name="follow_user">%s さんをフォロー</string>
|
||||
<string name="follow_user">フォロー: %s さん</string>
|
||||
<string name="unfollowed_user">%s さんのフォローを解除しました</string>
|
||||
<string name="followed_user">%s さんをフォローしました</string>
|
||||
<string name="following_user_requested">%s さんにフォローリクエストを送信しました</string>
|
||||
<string name="open_in_browser">ブラウザーで開く</string>
|
||||
<string name="hide_boosts_from_user">%s さんのブーストを非表示</string>
|
||||
<string name="show_boosts_from_user">%s さんのブーストを表示</string>
|
||||
<string name="hide_boosts_from_user">ブーストを非表示: %s さん</string>
|
||||
<string name="show_boosts_from_user">ブーストを表示: %s さん</string>
|
||||
<string name="signup_reason">参加したい理由を入力してください</string>
|
||||
<string name="signup_reason_note">申請の確認に役立つメッセージを添えてください。</string>
|
||||
<string name="clear">クリア</string>
|
||||
@@ -368,7 +368,7 @@
|
||||
<string name="welcome_to_mastodon">Mastodon とは</string>
|
||||
<string name="welcome_paragraph1">Mastodon は、いち企業の統制に依存しない非中央集権型のソーシャルネットワークです。たくさんの独立したサーバーが相互につながり合い、ひとつのネットワークを形成しています。</string>
|
||||
<string name="what_are_servers">サーバーとは</string>
|
||||
<string name="welcome_paragraph2"><![CDATA[Mastodon のアカウントはいずれかのサーバーに所属します。それぞれのサーバーは異なる価値観やルールをもち、それらを管理する管理者がいます。どのサーバーにいても、ほかのあらゆるサーバーのユーザーをフォローして、かかわりをもつことができるでしょう。]]></string>
|
||||
<string name="welcome_paragraph2">Mastodon のアカウントはいずれかのサーバーに所属します。それぞれのサーバーには異なる価値観やルールがあり、それらを管理する管理者がいます。どのサーバーにいても、他のあらゆるサーバーのユーザーをフォローして、関わりを持てるでしょう。</string>
|
||||
<string name="opening_link">リンクを開いています…</string>
|
||||
<string name="link_not_supported">アプリはこのリンクに対応していません</string>
|
||||
<string name="log_out_all_accounts">すべてのアカウントをログアウト</string>
|
||||
|
||||
@@ -383,7 +383,6 @@
|
||||
<string name="welcome_to_mastodon">Welkom bij Mastodon</string>
|
||||
<string name="welcome_paragraph1">Mastodon is een gedecentraliseerd sociaal netwerk, wat betekent dat geen enkel bedrijf het controleert. Het bestaat uit veel onafhankelijk opererende servers, allemaal met elkaar verbonden.</string>
|
||||
<string name="what_are_servers">Wat zijn servers?</string>
|
||||
<string name="welcome_paragraph2"><![CDATA[Elk Mastodonaccount wordt op een server gehost - elk met diens eigen waarden, regels en beheerders. Het maakt niet uit welke server je kiest, je kunt mensen op elke server volgen en ermee communiceren.]]></string>
|
||||
<string name="opening_link">Koppeling aan het openen…</string>
|
||||
<string name="link_not_supported">Deze koppeling wordt niet ondersteund in de app</string>
|
||||
<string name="log_out_all_accounts">Bij alle accounts afmelden</string>
|
||||
|
||||
@@ -310,4 +310,8 @@
|
||||
<string name="sk_instance_info_unavailable">Instance informatie tijdelijk niet beschikbaar</string>
|
||||
<string name="sk_settings_show_labels_in_navigation_bar">Toon tab labels op navigatiebalk</string>
|
||||
<string name="sk_tab_profile">Profiel</string>
|
||||
<plurals name="sk_posts_count_label">
|
||||
<item quantity="one">bericht</item>
|
||||
<item quantity="other">berichten</item>
|
||||
</plurals>
|
||||
</resources>
|
||||
@@ -387,7 +387,6 @@
|
||||
<string name="welcome_to_mastodon">Velkommen til Mastodon</string>
|
||||
<string name="welcome_paragraph1">Mastodon er et desentralisert sosialt nettverk, som betyr at ingen selskaper kontrollerer det. Det består av mange uavhengige servere som er koblet sammen.</string>
|
||||
<string name="what_are_servers">Hva er en server?</string>
|
||||
<string name="welcome_paragraph2"><![CDATA[Enhver Mastodon konto er en vert på en server - med sine egne verdier, regler og administratorer. Uansett hvilken du velger, kan du følge og samhandle med folk på hvilken som helst server.]]></string>
|
||||
<string name="opening_link">Åpner link…</string>
|
||||
<string name="link_not_supported">Denne linken støttes ikke av appen</string>
|
||||
<string name="log_out_all_accounts">Logg ut av alle kontoer</string>
|
||||
|
||||
@@ -425,7 +425,6 @@
|
||||
<string name="welcome_to_mastodon">Witaj na Mastodonie</string>
|
||||
<string name="welcome_paragraph1">Mastodon to zdecentralizowana sieć społecznościowa, co oznacza że żadna firma nie może nią kontrolować w całości. Składa się z wielu niezależnych od siebie serwerów, które się ze sobą komunikują.</string>
|
||||
<string name="what_are_servers">Czym są serwery?</string>
|
||||
<string name="welcome_paragraph2"><![CDATA[Każde konto na Mastodonie jest hostowane na instancjach, które wyróżniają się wartościami, zasadami i administracją. Nieważne, jaką wybierzesz - i tak będziesz mógł/mogła kontaktować się nawet z tymi spoza Twojej instancji.]]></string>
|
||||
<string name="opening_link">Otwieranie linku…</string>
|
||||
<string name="link_not_supported">Ten link nie jest wspierany w aplikacji</string>
|
||||
<string name="log_out_all_accounts">Wyloguj się wszędzie</string>
|
||||
|
||||
@@ -377,7 +377,6 @@
|
||||
<string name="welcome_to_mastodon">Bem-vindo ao Mastodon</string>
|
||||
<string name="welcome_paragraph1">Mastodon é uma rede social descentralizada, o que significa que nenhuma empresa a controla. É composto de muitos servidores executados de forma independente, todos conectados entre si.</string>
|
||||
<string name="what_are_servers">O que são servidores?</string>
|
||||
<string name="welcome_paragraph2"><![CDATA[Cada conta Mastodon é hospedada em um servidor - cada um com seus próprios valores, regras e administradores. Não importa qual você escolha, você pode seguir e interagir com as pessoas que estão em qualquer outro servidor.]]></string>
|
||||
<string name="opening_link">Abrindo link…</string>
|
||||
<string name="link_not_supported">Este link não é compatível com o aplicativo</string>
|
||||
<string name="log_out_all_accounts">Sair de todas as contas</string>
|
||||
@@ -466,6 +465,7 @@
|
||||
<string name="about_server">Sobre</string>
|
||||
<string name="server_rules">Regras</string>
|
||||
<string name="server_administrator">Administrador</string>
|
||||
<string name="send_email_to_server_admin">Contatar administrador</string>
|
||||
<string name="notifications_disabled_in_system">Ative as notificações nas configurações do seu dispositivo para ver as atualizações de qualquer lugar.</string>
|
||||
<string name="settings_even_more">Ainda mais configurações</string>
|
||||
<string name="settings_show_cws">Mostrar avisos de conteúdo</string>
|
||||
|
||||
@@ -251,7 +251,7 @@
|
||||
<string name="sk_unfinished_attachments">Corrigir anexos\?</string>
|
||||
<string name="sk_settings_glitch_mode_explanation">Habilite isso se sua instância inicial for executada no Glitch. Não é necessário para Hometown ou Akkoma.</string>
|
||||
<string name="sk_collapse">Mostrar menos</string>
|
||||
<string name="sk_settings_prefix_reply_cw_with_re">Adicionar \"re:\" nos Avisos de Conteúdo em resposta a</string>
|
||||
<string name="sk_settings_prefix_reply_cw_with_re">Prefixe com “Aviso de conteúdo” ao responder</string>
|
||||
<string name="sk_spectator_mode">Modo espectador</string>
|
||||
<string name="sk_timeline_bubble">Bolha</string>
|
||||
<string name="sk_bubble_timeline_info_banner">Esses são as publicações mais recentes da rede com curadoria dos administradores da sua instância.</string>
|
||||
@@ -333,4 +333,41 @@
|
||||
<string name="sk_switch_timeline">Alternar linha do tempo</string>
|
||||
<string name="sk_settings_true_black">Modo preto</string>
|
||||
<string name="sk_search_fediverse">Pesquisar no Fediverso</string>
|
||||
<string name="sk_settings_emoji_reactions_in_lists">Mostrar reações de emojis em linhas do tempo</string>
|
||||
<string name="sk_settings_emoji_reactions_in_lists_explanation">Se as reações dos emojis devem ser exibidas nas linhas do tempo. Se esta opção estiver desativada, as reações de emoji só serão exibidas ao visualizar um tópico.</string>
|
||||
<plurals name="sk_users_reacted_with">
|
||||
<item quantity="one">Um usuário reagiu com %2$s</item>
|
||||
<item quantity="many">%1$,d usuários reagiram com %2$s</item>
|
||||
<item quantity="other">%1$,d usuários reagiram com %2$s</item>
|
||||
</plurals>
|
||||
<string name="sk_mute_label">Duração</string>
|
||||
<string name="sk_button_react">Reaja com emoji</string>
|
||||
<string name="sk_enter_emoji_toast">Você precisa digitar um emoji</string>
|
||||
<string name="sk_enter_emoji_hint">Digite para reagir com um emoji</string>
|
||||
<string name="sk_again_for_system_keyboard">Toque novamente para Teclado do Sistema</string>
|
||||
<string name="sk_duration_minutes_5">5 minutos</string>
|
||||
<string name="sk_duration_minutes_30">30 minutos</string>
|
||||
<string name="sk_duration_hours_1">1 hora</string>
|
||||
<string name="sk_duration_hours_6">6 horas</string>
|
||||
<string name="sk_duration_days_1">1 dia</string>
|
||||
<string name="sk_duration_days_3">3 dias</string>
|
||||
<string name="sk_duration_days_7">7 dias</string>
|
||||
<string name="sk_duration_indefinite">Indeterminado</string>
|
||||
<string name="sk_settings_emoji_reactions">Ativar reações emoji</string>
|
||||
<string name="sk_settings_emoji_reactions_explanation">Exibe reações emoji nas publicações e permite interagir com elas. Algumas versões modificadas do Mastodon suportam isso, mas o Mastodon não.</string>
|
||||
<string name="sk_settings_unifiedpush_choose">Escolha um distribuidor</string>
|
||||
<string name="sk_settings_unifiedpush_no_distributor_body">Você precisa instalar um distribuidor para que as notificações UnifiedPush funcionem. Para obter mais informações, visite https://unifiedpush.org/</string>
|
||||
<string name="sk_settings_continues_playback">Sobreposição de áudio</string>
|
||||
<string name="sk_settings_continues_playback_summary">Permitir que a mídia já reproduzida continue sendo reproduzida, sobrepondo a nova reprodução</string>
|
||||
<string name="sk_settings_unifiedpush_no_distributor">Nenhum distribuidor encontrado</string>
|
||||
<string name="sk_settings_unifiedpush">Usar UnifiedPush</string>
|
||||
<string name="sk_settings_display_pronouns_in_timelines">Exibir pronomes em linhas do tempo</string>
|
||||
<string name="sk_settings_display_pronouns_in_threads">Exibir pronomes em tópicos</string>
|
||||
<string name="sk_settings_display_pronouns_in_user_listings">Exibir pronomes nas listas de usuários</string>
|
||||
<string name="sk_tab_notifications">Notificações</string>
|
||||
<string name="sk_tab_profile">Perfil</string>
|
||||
<string name="sk_notification_mention">Você foi mencionado por %s</string>
|
||||
<string name="sk_settings_auto_reveal_equal_spoilers">Revelar automaticamente Avisos de Conteúdo nas respostas</string>
|
||||
<string name="sk_icon_recycle_bin">Lixeira de reciclagem</string>
|
||||
<string name="sk_tab_search">Pesquisar</string>
|
||||
</resources>
|
||||
@@ -425,7 +425,7 @@
|
||||
<string name="welcome_to_mastodon">Добро пожаловать в Mastodon</string>
|
||||
<string name="welcome_paragraph1">Mastodon - это децентрализованная социальная сеть, то есть ни одна компания не контролирует ее. Она состоит из множества независимо управляемых серверов, соединенных вместе.</string>
|
||||
<string name="what_are_servers">Что такое сервер?</string>
|
||||
<string name="welcome_paragraph2"><![CDATA[Каждый аккаунт Mastodon размещается на сервере - каждый со своими ценностями, правилами и администраторами. Независимо от того, какой сервер вы выберете, вы можете следить и взаимодействовать с людьми на любом сервере.]]></string>
|
||||
<string name="welcome_paragraph2">Каждый аккаунт Mastodon размещается на сервере - каждый со своими ценностями, правилами и администраторами. Независимо от того, какой сервер вы выберете, вы можете следить и взаимодействовать с людьми на любом сервере.</string>
|
||||
<string name="opening_link">Открытие ссылки…</string>
|
||||
<string name="link_not_supported">Эта ссылка не поддерживается в приложении</string>
|
||||
<string name="log_out_all_accounts">Выйти из всех аккаунтов</string>
|
||||
|
||||
@@ -323,4 +323,12 @@
|
||||
<string name="sk_content_type_unspecified">Не указано</string>
|
||||
<string name="sk_bubble_timeline_info_banner">Это недавние посты из сети, управляемой администраторами этого сервера.</string>
|
||||
<string name="sk_search_fediverse">Искать в Федивёрсе</string>
|
||||
<string name="sk_settings_unifiedpush">Использовать UnifiedPush</string>
|
||||
<string name="sk_settings_unifiedpush_choose">Выберите распределитель</string>
|
||||
<string name="sk_settings_unifiedpush_no_distributor_body">Для работы уведомлений Вам необходимо установить распределитель UnifiedPush. Подробности: https://unifiedpush.org/</string>
|
||||
<string name="sk_content_type_mfm">MFM</string>
|
||||
<string name="sk_settings_auto_reveal_equal_spoilers">Автоотображение идентичных предупреждений о содержимом в ответах</string>
|
||||
<string name="sk_settings_prefix_replies_to_others">Только в ответ другим</string>
|
||||
<string name="sk_settings_unifiedpush_no_distributor">Распределители не найдены</string>
|
||||
<string name="sk_settings_content_types_explanation">Позволяет устанавливать тип содержимого вроде Markdown при создании поста. Имейте в виду, что это поддерживается не на всех серверах.</string>
|
||||
</resources>
|
||||
@@ -403,7 +403,6 @@
|
||||
<string name="welcome_to_mastodon">Dobrodošli na Mastodon</string>
|
||||
<string name="welcome_paragraph1">Mastodon je decentralizirano družbeno omrežje, kar pomeni, da ga ne upravlja nobeno posamezno podjetje. Sestavljajo ga številni neodvisni strežniki, ki so medsebojno povezani.</string>
|
||||
<string name="what_are_servers">Kaj so strežniki?</string>
|
||||
<string name="welcome_paragraph2"><![CDATA[Vsak račun Mastodon gostuje na strežniku — vsak strežnik ima svoje vrednote, pravila in skbrnike. Vseeno je, katerega izberete - sledite in komunicirate lahko z osebbami na poljubnem strežniku.]]></string>
|
||||
<string name="opening_link">Odpiranje povezav ...</string>
|
||||
<string name="log_out_all_accounts">Odjava iz vseh računov</string>
|
||||
<string name="confirm_log_out_all_accounts">Ali se želite odjaviti iz vseh računov?</string>
|
||||
|
||||
@@ -138,6 +138,7 @@
|
||||
<string name="sending_report">Skickar rapport…</string>
|
||||
<string name="unfollow_user">Avfölj %s</string>
|
||||
<string name="unfollow">Avfölj</string>
|
||||
<string name="report_personal_title">Vill du inte se detta?</string>
|
||||
<string name="back">Tillbaka</string>
|
||||
<string name="search_communities">Servernamn eller URL</string>
|
||||
<string name="instance_rules_title">Serverregler</string>
|
||||
@@ -343,7 +344,6 @@
|
||||
<string name="welcome_to_mastodon">Välkommen till Mastodon</string>
|
||||
<string name="welcome_paragraph1">Mastodon är ett decentraliserat socialt nätverk, vilket innebär att inget enskilt företag kontrollerar det. Det består av många oberoende servrar, alla sammankopplade.</string>
|
||||
<string name="what_are_servers">Vad är servrar?</string>
|
||||
<string name="welcome_paragraph2"><![CDATA[Varje Mastodon-konto finns på en server — var och en med sina värderingar, regler och administratörer. Oavsett vilken du väljer kan du följa och interagera med människor på vilken server som helst.]]></string>
|
||||
<string name="log_out_all_accounts">Logga ut från alla konton</string>
|
||||
<string name="confirm_log_out_all_accounts">Logga ut från alla konton?</string>
|
||||
<string name="retry">Försök igen</string>
|
||||
@@ -357,11 +357,13 @@
|
||||
<string name="attachment_type_unknown">Fil</string>
|
||||
<string name="help">Hjälp</string>
|
||||
<string name="edit_post">Redigera inlägg</string>
|
||||
<string name="no_verified_link">Ingen verifierad länk</string>
|
||||
<string name="language">Språk</string>
|
||||
<string name="language_default">Standard</string>
|
||||
<string name="report_title_post">Rapportera inlägg</string>
|
||||
<!-- %s is the server domain -->
|
||||
<!-- Shown on the "stamp" on the screen that appears after you report a post/user. Please keep the translation short, preferably a single word -->
|
||||
<string name="reported">Rapporterad</string>
|
||||
<string name="mark_all_notifications_read">Markera alla som lästa</string>
|
||||
<string name="settings_filters">Filter</string>
|
||||
<string name="settings_server_explanation">Översikt, regler och moderatorer</string>
|
||||
@@ -379,6 +381,10 @@
|
||||
<string name="about_server">Om</string>
|
||||
<string name="server_rules">Regler</string>
|
||||
<string name="server_administrator">Administratör</string>
|
||||
<plurals name="in_x_hours">
|
||||
<item quantity="one">om %d timme</item>
|
||||
<item quantity="other">om %d timmar</item>
|
||||
</plurals>
|
||||
<plurals name="x_hours_ago">
|
||||
<item quantity="one">%d timme sedan</item>
|
||||
<item quantity="other">%d timmar sedan</item>
|
||||
@@ -401,6 +407,7 @@
|
||||
<!-- Shown like a content warning, %s is the name of the filter -->
|
||||
<string name="clear_all">Rensa alla</string>
|
||||
<string name="search_open_url">Öppna URL i Mastodon</string>
|
||||
<string name="posts_matching_hashtag">Inlägg med \"%s\"</string>
|
||||
<string name="search_go_to_account">Gå till %s</string>
|
||||
<!-- Shown in the post header. Please keep it short -->
|
||||
<string name="time_seconds_ago_short">%ds sedan</string>
|
||||
|
||||
@@ -40,4 +40,116 @@
|
||||
<string name="sk_update_ready">Megalodon %s är nerladdad och redo att installeras.</string>
|
||||
<string name="sk_settings_translation_availability_note_unavailable">%s verkar inte stödja översättning.</string>
|
||||
<string name="sk_clear_recent_languages">Rensa nyligen använda språk</string>
|
||||
<string name="sk_duration_minutes_30">30 minuter</string>
|
||||
<string name="sk_duration_hours_1">1 timme</string>
|
||||
<string name="sk_duration_hours_6">6 timmar</string>
|
||||
<string name="sk_duration_days_1">1 dag</string>
|
||||
<string name="sk_duration_days_3">3 dagar</string>
|
||||
<string name="sk_duration_days_7">7 dagar</string>
|
||||
<string name="sk_timeline_local">Lokal</string>
|
||||
<string name="sk_timeline_federated">Federation</string>
|
||||
<string name="sk_poll_allow_multiple">Tillåt flera val</string>
|
||||
<string name="sk_translate_post">Översätt</string>
|
||||
<string name="sk_available_languages">Tillgängliga språk</string>
|
||||
<string name="sk_confirm_clear_recent_languages">Är du säker på att du vill rensa dina nyligen använda språk\?</string>
|
||||
<string name="sk_bookmark_as">Bokmärk med annat konto</string>
|
||||
<string name="sk_favorite_as">Favorit med annat konto</string>
|
||||
<string name="sk_bookmarked_as">Bokmärkt som %s</string>
|
||||
<string name="sk_already_bookmarked">Redan bokmärkt</string>
|
||||
<string name="sk_favorited_as">Favorit som %s</string>
|
||||
<string name="sk_settings_rules">Regler</string>
|
||||
<string name="sk_settings_auth">Säkerhetsinställningar</string>
|
||||
<string name="sk_settings_color_palette">Färgpalett</string>
|
||||
<string name="sk_color_palette_purple">Lila</string>
|
||||
<string name="sk_color_palette_green">Grön</string>
|
||||
<string name="sk_color_palette_blue">Blå</string>
|
||||
<string name="sk_color_palette_brown">Brun</string>
|
||||
<string name="sk_color_palette_pink">Rosa</string>
|
||||
<string name="sk_hashtags_you_follow">Hashtaggar du föjer</string>
|
||||
<string name="sk_timelines">Tidslinjer</string>
|
||||
<string name="sk_timeline">Tidslinje</string>
|
||||
<string name="sk_post_language">Språk: %s</string>
|
||||
<string name="sk_duration_minutes_5">5 minuter</string>
|
||||
<string name="sk_reply_line_above_avatar">\"Som svar till\"-linje ovanför avatar</string>
|
||||
<string name="sk_open_with_account">Öppna med annat konot</string>
|
||||
<string name="sk_compose_draft">Inlägget kommer sparas som utkast.</string>
|
||||
<string name="sk_scheduled_too_soon">Inlägg måste schemaläggas minst 10 minuter i framtiden.</string>
|
||||
<string name="sk_timeline_home">Hem</string>
|
||||
<string name="sk_remove">Ta bort</string>
|
||||
<string name="sk_forward_report_to">Vidarebefordra till %s</string>
|
||||
<string name="sk_confirm_save_draft">Spara utkast\?</string>
|
||||
<string name="sk_confirm_save_changes">Spara ändringar\?</string>
|
||||
<string name="sk_mark_as_draft">Markera som utkast</string>
|
||||
<string name="sk_schedule_post">Schemalägg inlägg</string>
|
||||
<string name="sk_compose_no_schedule">Schemalägg inte</string>
|
||||
<string name="sk_icon_umbrella">Paraply</string>
|
||||
<string name="sk_settings_reduce_motion">Reducera rörelser i animationer</string>
|
||||
<string name="sk_announcements">Meddelanden</string>
|
||||
<string name="sk_mark_as_read">Markera som läst</string>
|
||||
<string name="sk_settings_about_instance">Om instansen</string>
|
||||
<string name="sk_create">Skapa</string>
|
||||
<string name="sk_in_reply">Som svar</string>
|
||||
<string name="sk_recent_searches_placeholder">Skriv för att börja söka</string>
|
||||
<string name="sk_remove_follower">Ta bort följare</string>
|
||||
<string name="sk_remove_follower_confirm">Ta bort %s som följare genom att blockera och omedelbart avblockera dem\?</string>
|
||||
<string name="sk_do_remove_follower">Ta bort</string>
|
||||
<string name="sk_remove_follower_success">Följaren har tagits bort</string>
|
||||
<string name="sk_alt_text_missing_title">Alternativtext saknas</string>
|
||||
<string name="sk_alt_text_missing">Minst en bilaga saknar beskrivning.</string>
|
||||
<string name="sk_publish_anyway">Publicera ändå</string>
|
||||
<string name="sk_settings_disable_alt_text_reminder">Inaktivera påminnelse om att lägga till alternativtext</string>
|
||||
<string name="sk_searching">Söker…</string>
|
||||
<string name="sk_no_results">Inga resultat</string>
|
||||
<string name="sk_icon_book">Bok</string>
|
||||
<string name="sk_edit_timeline">Redigera tidslinje</string>
|
||||
<string name="sk_edit_timelines">Redigera tidslinjer</string>
|
||||
<string name="sk_alt_button">ALT</string>
|
||||
<string name="sk_save_draft">Spara utkast\?</string>
|
||||
<string name="sk_save_draft_message">Vill du spara dina ändringar till det här utkastet eller publicera det nu\?</string>
|
||||
<string name="sk_no_alt_text">Ingen alternativtext tillgänglig</string>
|
||||
<string name="sk_separator">·</string>
|
||||
<string name="sk_settings_reply_visibility_all">Alla svar</string>
|
||||
<string name="sk_settings_reply_visibility_self">Svar till mig</string>
|
||||
<string name="sk_color_palette_red">Röd</string>
|
||||
<string name="sk_color_palette_yellow">Gul</string>
|
||||
<string name="sk_already_favorited">Redan favorit</string>
|
||||
<string name="sk_compose_scheduled">Schemalagt för</string>
|
||||
<string name="sk_post_scheduled">Inlägg schemalagt</string>
|
||||
<string name="sk_scheduled_too_soon_title">Schemalagd tid är för tidigt</string>
|
||||
<string name="sk_create_list_title">Skapa lista</string>
|
||||
<string name="sk_list_name_hint">Listans namn</string>
|
||||
<string name="sk_list_replies_policy">Visa svar till</string>
|
||||
<string name="sk_list_replies_policy_list">medlemmar i listan</string>
|
||||
<string name="sk_list_replies_policy_followed">följda användare</string>
|
||||
<string name="sk_list_replies_policy_none">ingen</string>
|
||||
<string name="sk_hashtag">Hashtagg</string>
|
||||
<string name="sk_icon_heart">Hjärta</string>
|
||||
<string name="sk_icon_star">Stjärna</string>
|
||||
<string name="sk_icon_city">Stad</string>
|
||||
<string name="sk_icon_cat">Katt</string>
|
||||
<string name="sk_icon_dog">Hund</string>
|
||||
<string name="sk_icon_rabbit">Kanin</string>
|
||||
<string name="sk_icon_turtle">Sköldpadda</string>
|
||||
<string name="sk_icon_balloon">Ballong</string>
|
||||
<string name="sk_edit_list_title">Redigera lista</string>
|
||||
<string name="sk_your_lists">Dina listor</string>
|
||||
<string name="sk_timeline_posts">Inlägg</string>
|
||||
<string name="sk_timelines_add">Lägg till</string>
|
||||
<string name="sk_list">Lista</string>
|
||||
<string name="sk_timeline_icon">Ikon</string>
|
||||
<string name="sk_icon_microphone">Mikrofon</string>
|
||||
<string name="sk_icon_microscope">Mikroskop</string>
|
||||
<string name="sk_icon_coffee">Kaffe</string>
|
||||
<string name="sk_icon_stethoscope">Stetoskop</string>
|
||||
<string name="sk_icon_bicycle">Cykel</string>
|
||||
<string name="sk_icon_map">Karta</string>
|
||||
<string name="sk_icon_backpack">Ryggsäck</string>
|
||||
<string name="sk_icon_pizza">Pizza</string>
|
||||
<string name="sk_post_edited">redigerad</string>
|
||||
<string name="sk_notification_type_update">Redigerade inlägg</string>
|
||||
<string name="sk_welcome_title">Välkommen!</string>
|
||||
<string name="sk_draft">Utkast</string>
|
||||
<string name="sk_reply_as">Svara med annat konto</string>
|
||||
<string name="sk_unsent_posts">Opublicerade inlägg</string>
|
||||
<string name="sk_draft_saved">Utkast sparat</string>
|
||||
</resources>
|
||||
@@ -368,7 +368,7 @@
|
||||
<string name="welcome_to_mastodon">ยินดีต้อนรับสู่ Mastodon</string>
|
||||
<string name="welcome_paragraph1">Mastodon เป็นเครือข่ายสังคมแบบกระจายศูนย์ หมายความว่าไม่มีบริษัทใดควบคุมเครือข่ายสังคม เครือข่ายสังคมประกอบด้วยเซิร์ฟเวอร์ที่ทำงานอย่างอิสระจำนวนมาก ทั้งหมดเชื่อมต่อเข้าด้วยกัน</string>
|
||||
<string name="what_are_servers">เซิร์ฟเวอร์คืออะไร?</string>
|
||||
<string name="welcome_paragraph2"><![CDATA[ทุกบัญชี Mastodon ได้รับการโฮสต์ในเซิร์ฟเวอร์ — แต่ละแห่งมีค่า, กฎ และผู้ดูแลของเซิร์ฟเวอร์เอง ไม่ว่าคุณจะเลือกเซิร์ฟเวอร์ใด คุณสามารถติดตามและโต้ตอบกับผู้คนในเซิร์ฟเวอร์ใด ๆ]]></string>
|
||||
<string name="welcome_paragraph2">ทุกบัญชี Mastodon ได้รับการโฮสต์ในเซิร์ฟเวอร์ — แต่ละแห่งมีค่า, กฎ และผู้ดูแลของเซิร์ฟเวอร์เอง ไม่ว่าคุณจะเลือกเซิร์ฟเวอร์ใด คุณสามารถติดตามและโต้ตอบกับผู้คนในเซิร์ฟเวอร์ใด ๆ</string>
|
||||
<string name="opening_link">กำลังเปิดลิงก์…</string>
|
||||
<string name="link_not_supported">ไม่รองรับลิงก์นี้ในแอป</string>
|
||||
<string name="log_out_all_accounts">ออกจากระบบบัญชีทั้งหมด</string>
|
||||
|
||||
@@ -1,3 +1,78 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
</resources>
|
||||
<string name="sk_delete_and_redraft">ลบแล้วร่างใหม่</string>
|
||||
<string name="sk_confirm_delete_and_redraft_title">ลบแล้วร่างโพสต์ใหม่</string>
|
||||
<string name="sk_pin_post">ปักหมุดไปยังโปรไฟล์</string>
|
||||
<string name="sk_confirm_pin_post_title">ปักหมุดโพสต์ไปยังโปรไฟล์</string>
|
||||
<string name="sk_pinning">กำลังปักหมุดโพสต์…</string>
|
||||
<string name="sk_unpin_post">เลิกปักหมุดจากโปรไฟล์</string>
|
||||
<string name="sk_confirm_unpin_post_title">เลิกปักหมุดโพสต์จากโปรไฟล์</string>
|
||||
<string name="sk_confirm_unpin_post">คุณแน่ใจหรือไม่ว่าต้องการเลิกปักหมุดโพสต์นี้\?</string>
|
||||
<string name="sk_unpinning">กำลังเลิกปักหมุดโพสต์…</string>
|
||||
<string name="sk_image_description">คำอธิบายภาพ</string>
|
||||
<string name="sk_pinned_posts">ปักหมุด</string>
|
||||
<string name="sk_confirm_delete_and_redraft">คุณแน่ใจหรือไม่ว่าต้องการลบและร่างโพสต์นี้ใหม่\?</string>
|
||||
<string name="sk_confirm_pin_post">คุณต้องการปักหมุดโพสต์นี้ไปยังโปรไฟล์ของคุณหรือไม่\?</string>
|
||||
<string name="sk_poll_allow_multiple">อนุญาตหลายตัวเลือก</string>
|
||||
<string name="sk_clear_recent_languages">ล้างภาษาที่ใช้ล่าสุด</string>
|
||||
<string name="sk_welcome_title">ยินดีต้อนรับ!</string>
|
||||
<string name="sk_app_name">Megalodon</string>
|
||||
<string name="sk_visibility_unlisted">ไม่อยู่ในรายการ</string>
|
||||
<string name="sk_settings_show_replies">แสดงการตอบกลับ</string>
|
||||
<string name="sk_translate_show_original">แสดงต้นฉบับ</string>
|
||||
<string name="sk_translated_using">แปลด้วย %s</string>
|
||||
<string name="sk_post_language">ภาษา: %s</string>
|
||||
<string name="sk_available_languages">ภาษาที่ใช้งานได้</string>
|
||||
<string name="sk_language_name">%1$s (%2$s)</string>
|
||||
<string name="sk_confirm_clear_recent_languages">คุณแน่ใจหรือไม่ว่าต้องการล้างภาษาที่ใช้ล่าสุด\?</string>
|
||||
<string name="sk_example_domain">example.social</string>
|
||||
<string name="sk_translate_post">แปล</string>
|
||||
<string name="sk_settings_translate_only_opened">แปลเฉพาะโพสต์ที่เปิดอยู่</string>
|
||||
<string name="sk_settings_rules">กฎ</string>
|
||||
<string name="sk_settings_profile">ตั้งค่าโปรไฟล์</string>
|
||||
<string name="sk_settings_about">เกี่ยวกับแอป</string>
|
||||
<string name="sk_settings_donate">บริจาค</string>
|
||||
<string name="sk_color_palette_material3">ระบบ</string>
|
||||
<string name="sk_color_palette_pink">ชมพู</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_settings_color_palette">ชุดสี</string>
|
||||
<string name="sk_delete_notification">ลบการแจ้งเตือน</string>
|
||||
<string name="sk_delete_notification_confirm_action">ลบการแจ้งเตือน</string>
|
||||
<string name="sk_delete_notification_confirm">คุณแน่ใจหรือไม่ว่าต้องการลบการแจ้งเตือนนี้\?</string>
|
||||
<string name="sk_clear_all_notifications_confirm_action">ลบทั้งหมด</string>
|
||||
<string name="sk_clear_all_notifications_confirm">คุณแน่ใจหรือไม่ว่าต้องการล้างการแจ้งเตือนทั้งหมด\?</string>
|
||||
<string name="sk_lists_with_user">รายการที่มี %s</string>
|
||||
<string name="sk_settings_reply_visibility_all">การตอบกลับทั้งหมด</string>
|
||||
<string name="sk_settings_reply_visibility_following">การตอบกลับถึงผู้ที่ฉันติดตาม</string>
|
||||
<string name="sk_settings_reply_visibility_self">การตอบกลับถึงฉัน</string>
|
||||
<string name="sk_quoting_user">กำลังอ้างอิง %s</string>
|
||||
<string name="sk_settings_reply_visibility">การมองเห็นการตอบกลับ</string>
|
||||
<string name="sk_settings_show_boosts">แสดงการดัน</string>
|
||||
<string name="sk_settings_continues_playback">ซ้อนทับเสียง</string>
|
||||
<string name="sk_settings_continues_playback_summary">อนุญาตให้สื่อที่กำลังเล่นอยู่แล้วเล่นต่อไปได้ โดยซ้อนทับการเล่นใหม่</string>
|
||||
<string name="sk_settings_load_new_posts">โหลดโพสต์ใหม่อัตโนมัติ</string>
|
||||
<string name="sk_settings_app_version">Megalodon รุ่น %1$s (%2$d)</string>
|
||||
<string name="sk_mark_media_as_sensitive">ทำเครื่องหมายสื่อว่าละเอียดอ่อน</string>
|
||||
<string name="sk_user_post_notifications_off">ปิดการแจ้งเตือนโพสต์สำหรับ %s แล้ว</string>
|
||||
<string name="sk_federated_timeline">ที่ติดต่อกับภายนอก</string>
|
||||
<string name="sk_color_palette_red">แดง</string>
|
||||
<string name="sk_settings_publish_button_text">ข้อความปุ่มเผยแพร่</string>
|
||||
<string name="sk_check_for_update">ตรวจสอบอัปเดต</string>
|
||||
<string name="sk_no_update_available">ไม่มีการอัปเดต</string>
|
||||
<string name="sk_list_timelines">รายการ</string>
|
||||
<string name="sk_follow_requests">คำขอติดตาม</string>
|
||||
<string name="sk_accept_follow_request">ยอมรับคำขอติดตาม</string>
|
||||
<string name="sk_reject_follow_request">ปฏิเสธคำขอติดตาม</string>
|
||||
<string name="sk_color_palette_yellow">เหลือง</string>
|
||||
<string name="sk_settings_show_interaction_counts">แสดงจำนวนการโต้ตอบ</string>
|
||||
<string name="sk_notification_type_status">โพสต์</string>
|
||||
<string name="sk_user_post_notifications_on">เปิดการแจ้งเตือนโพสต์สำหรับ %s แล้ว</string>
|
||||
<string name="sk_notification_type_posts">การแจ้งเตือนโพสต์</string>
|
||||
<string name="sk_update_available">Megalodon รุ่น %s พร้อมให้ดาวน์โหลดแล้ว</string>
|
||||
<string name="sk_settings_tabs_disable_swipe">ปิดใช้การปัดระหว่างแท็บ</string>
|
||||
<string name="sk_update_ready">Megalodon รุ่น %s ดาวน์โหลดเสร็จและพร้อมให้ติดตั้งแล้ว</string>
|
||||
<string name="sk_clear_all_notifications">ล้างการแจ้งเตือนทั้งหมด</string>
|
||||
</resources>
|
||||
@@ -387,7 +387,6 @@
|
||||
<string name="welcome_to_mastodon">Mastodon\'a hoş geldiniz</string>
|
||||
<string name="welcome_paragraph1">Mastodon merkezi olmayan bir sosyal ağdır, yani onu tek bir şirket kontrol etmiyor. Hepsi birbirine bağlı, bağımsız olarak çalışan birçok sunucudan oluşur.</string>
|
||||
<string name="what_are_servers">Sunucular nedir?</string>
|
||||
<string name="welcome_paragraph2"><![CDATA[Her Mastodon hesabı bir sunucuda barındırılır - her birinin kendi değerleri, kuralları ve yöneticileri vardır. Hangisini seçerseniz seçin, herhangi bir sunucudaki insanları takip edebilir ve onlarla etkileşime geçebilirsiniz.]]></string>
|
||||
<string name="opening_link">Bağlantı açılıyor…</string>
|
||||
<string name="link_not_supported">Bu bağlantı uygulamada desteklenmiyor</string>
|
||||
<string name="log_out_all_accounts">Tüm hesaplardan çıkış yap</string>
|
||||
|
||||
@@ -425,7 +425,6 @@
|
||||
<string name="welcome_to_mastodon">Вітаємо у Mastodon</string>
|
||||
<string name="welcome_paragraph1">Mastodon - це децентралізована соціальна мережа, тобто жодна компанія не контролює її. Вона складається з багатьох незалежних серверів, які з\'єднані між собою.</string>
|
||||
<string name="what_are_servers">Що таке сервери?</string>
|
||||
<string name="welcome_paragraph2"><![CDATA[Кожен акаунт Mastodon розміщений на сервері, й кожен сервер має особисті цінності, правила, й адмінів. Немає різниці, який ви оберете. Ви можете підписуватися та спілкуватися з усіма, навіть якщо ви на різних серверах.]]></string>
|
||||
<string name="opening_link">Відкриття посилання…</string>
|
||||
<string name="link_not_supported">Це посилання не підтримується застосунком</string>
|
||||
<string name="log_out_all_accounts">Вийти з усіх акаунтів</string>
|
||||
|
||||
@@ -374,4 +374,10 @@
|
||||
<string name="sk_enter_emoji_toast">Вам потрібно ввести емоджі</string>
|
||||
<string name="sk_enter_emoji_hint">Введіть, щоб відреагувати з емоджі</string>
|
||||
<string name="sk_settings_emoji_reactions_in_lists_explanation">Чи відображати реакції емоджі у стрічках. Якщо цю опцію вимкнено, реакції емоджі показуватимуться лише під час перегляду гілки.</string>
|
||||
<plurals name="sk_posts_count_label">
|
||||
<item quantity="one">допис</item>
|
||||
<item quantity="few">дописи</item>
|
||||
<item quantity="many">дописів</item>
|
||||
<item quantity="other">дописів</item>
|
||||
</plurals>
|
||||
</resources>
|
||||
@@ -40,7 +40,7 @@
|
||||
<color name="m3_neutral2_100">@android:color/system_neutral2_100</color>
|
||||
<color name="m3_neutral2_50t">@android:color/system_neutral2_50</color>
|
||||
<color name="m3_neutral2_50">@android:color/system_neutral2_50</color>
|
||||
<color name="m3_neutral2_25">@android:color/system_neutral2_10</color>
|
||||
<color name="m3_neutral2_10">@android:color/system_neutral2_10</color>
|
||||
|
||||
<color name="m3_accent2_25">@android:color/system_accent2_10</color>
|
||||
<color name="m3_accent2_50">@android:color/system_accent2_50</color>
|
||||
|
||||
@@ -203,14 +203,14 @@
|
||||
<string name="settings_contribute">Đóng góp cho Mastodon</string>
|
||||
<string name="settings_tos">Điều khoản dịch vụ</string>
|
||||
<string name="settings_privacy_policy">Chính sách bảo mật</string>
|
||||
<string name="settings_clear_cache">Xoá bộ nhớ đệm</string>
|
||||
<string name="settings_clear_cache">Xóa bộ nhớ đệm</string>
|
||||
<string name="settings_app_version">Mastodon for Android v%1$s (%2$d)</string>
|
||||
<string name="media_cache_cleared">Đã xóa bộ nhớ đệm</string>
|
||||
<string name="confirm_log_out">Đăng xuất %s?</string>
|
||||
<string name="sensitive_content_explain">Người đăng đánh dấu media này nhạy cảm.</string>
|
||||
<string name="sensitive_content_explain">Người đăng đánh dấu media này nhạy cảm</string>
|
||||
<string name="avatar_description">Xem hồ sơ %s</string>
|
||||
<string name="more_options">Nhiều tùy chọn hơn</string>
|
||||
<string name="new_post">Viết tút</string>
|
||||
<string name="new_post">Soạn tút</string>
|
||||
<string name="button_reply">Trả lời</string>
|
||||
<string name="button_reblog">Đăng lại</string>
|
||||
<string name="button_favorite">Thích</string>
|
||||
@@ -368,7 +368,7 @@
|
||||
<string name="welcome_to_mastodon">Chào mừng đến với Mastodon</string>
|
||||
<string name="welcome_paragraph1">Mastodon là một mạng xã hội phi tập trung, không có công ty nào kiểm soát. Nó bao gồm nhiều máy chủ độc lập được kết nối với nhau.</string>
|
||||
<string name="what_are_servers">Máy chủ là gì?</string>
|
||||
<string name="welcome_paragraph2"><![CDATA[Mỗi tài khoản Mastodon được lưu trữ trên một máy chủ — với nội quy và quản trị viên riêng. Bất kể bạn chọn máy chủ nào, bạn có thể theo dõi và tương tác với mọi người trên máy chủ khác.]]></string>
|
||||
<string name="welcome_paragraph2">Mỗi tài khoản Mastodon được lưu trữ trên một máy chủ — với nội quy & quản trị viên riêng. Bất kể bạn chọn máy chủ nào, bạn có thể theo dõi và tương tác với mọi người trên máy chủ khác.</string>
|
||||
<string name="opening_link">Mở liên kết…</string>
|
||||
<string name="link_not_supported">App không hỗ trợ liên kết này</string>
|
||||
<string name="log_out_all_accounts">Đăng xuất khỏi mọi tài khoản</string>
|
||||
|
||||
@@ -368,7 +368,6 @@
|
||||
<string name="welcome_to_mastodon">欢迎来到Mastodon</string>
|
||||
<string name="welcome_paragraph1">Mastodon 是去中心化的社交网络,这意味着它不由任何企业独控。它是由众多独立运行的实例共同联结而成的。</string>
|
||||
<string name="what_are_servers">是什么实例?</string>
|
||||
<string name="welcome_paragraph2"><![CDATA[所有的 Mastodon 账户皆托管于各自的服务器上,每个服务器有各自的价值取向、规则与管理员。无论你选择哪个服务器,你都能关注并与其他任何服务器上的用户互动。]]></string>
|
||||
<string name="opening_link">打开链接…</string>
|
||||
<string name="link_not_supported">应用不支持该链接</string>
|
||||
<string name="log_out_all_accounts">登出所有账户</string>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user