Compare commits

...

51 Commits

Author SHA1 Message Date
sk
e8f0891f3a re-aligning buttons with avatar 2023-10-16 19:36:12 +02:00
sk
f25906a694 Merge remote-tracking branch 'upstream/l10n_master' 2023-10-16 19:28:27 +02:00
sk
e52699bb1c Merge remote-tracking branch 'weblate/main' 2023-10-16 19:27:38 +02:00
SomeTr
712826451f Translated using Weblate (Welsh)
Currently translated at 77.7% (14 of 18 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/cy/
2023-10-16 17:27:28 +00:00
ihor_ck
3b3065d8bd Translated using Weblate (Ukrainian)
Currently translated at 100.0% (393 of 393 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/uk/
2023-10-16 17:27:28 +00:00
alextecplayz
e11fe7d8cf Translated using Weblate (Romanian)
Currently translated at 100.0% (393 of 393 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/ro/
2023-10-16 17:27:28 +00:00
SomeTr
9a2f7475c9 Translated using Weblate (German)
Currently translated at 100.0% (393 of 393 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/de/
2023-10-16 17:27:28 +00:00
sk
6dffb10906 make version go up 2023-10-16 19:27:12 +02:00
sk
71039d6901 the changes i made were wrong (what a surprise) 2023-10-16 19:26:29 +02:00
sk
db18c7a0d0 events for boosts, adapt removeStatus method 2023-10-16 19:14:16 +02:00
sk
7e80ed6af2 fix and refactor removing statuses 2023-10-16 18:28:47 +02:00
sk
bdd2b90581 allow entering full handles instead of domain
closes sk22#646
2023-10-16 01:03:19 +02:00
sk
50d017d8ba fix account context menu
closes sk22#652
2023-10-16 00:44:47 +02:00
sk
98e003437c fix confirm unfollow 2023-10-16 00:11:47 +02:00
sk
d5d06af614 fix keyboard gap in scheduled post list height 2023-10-15 23:59:26 +02:00
sk
1c930ca3bb check for draft before checking alt texts 2023-10-15 23:42:53 +02:00
sk
0f0c1093d4 don't hide draft options when redrafting 2023-10-15 23:35:01 +02:00
sk
2ad5dc5a74 make unfinished attachment dialog make more sense 2023-10-15 23:20:40 +02:00
sk
e02e0865bd fix softlock when re-saving draft
closes sk22#659
2023-10-15 23:05:29 +02:00
sk
59ee1af75d fix border radius
closes sk22#861
2023-10-15 22:53:23 +02:00
sk
c04584dfa6 fix alignments 2023-10-15 21:17:38 +02:00
sk
190a3b5b08 use fluent dismiss button 2023-10-15 21:17:26 +02:00
sk
f5a67e65f0 fix missing content descriptions, button alignment 2023-10-15 21:16:42 +02:00
Eugen Rochko
498078b6e0 New translations strings.xml (Swedish) 2023-10-15 20:37:55 +02:00
sk
de8c289ca7 finally!! fix reblog/-ply line with extra emoji
closes sk22#468
2023-10-15 20:29:15 +02:00
sk
07b205a746 remove fullText emoji helper, fix content description 2023-10-15 20:18:40 +02:00
sk
a7941310bc no more vertical reblog/reply line layout
closes sk22#834
2023-10-15 20:11:03 +02:00
sk
864b6dcdac remove outdated comment 2023-10-15 20:04:39 +02:00
sk
d3744bb397 remove compact reblog line setting 2023-10-15 19:57:22 +02:00
sk
7d1853bc88 fix saving wrong item
closes sk22#863
2023-10-15 19:46:14 +02:00
sk
9f0db755d1 fix text/buttons alignment, margin
closes sk22#864
2023-10-15 19:44:37 +02:00
sk
06819806be "fix" trends loading indefinitely
closes sk22#781
2023-10-15 19:23:57 +02:00
Eugen Rochko
526f5e319b New translations strings.xml (Swedish) 2023-10-15 18:51:35 +02:00
sk
30a4d0efd9 rename vars, compare content status id for reply 2023-10-15 18:10:57 +02:00
Eugen Rochko
d419dba44a New translations strings.xml (Swedish) 2023-10-15 14:26:36 +02:00
Choukajohn
87da6b9b81 Translated using Weblate (French)
Currently translated at 100.0% (393 of 393 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/fr/
2023-10-15 01:20:04 +00:00
Linerly
67cc1553da Translated using Weblate (Indonesian)
Currently translated at 100.0% (393 of 393 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/id/
2023-10-14 05:22:21 +00:00
sk
9a985aad29 fix deleting boosted posts in profile 2023-10-14 01:47:13 +02:00
Eugen Rochko
fd98159fce New translations strings.xml (Greek) 2023-10-14 00:27:35 +02:00
sk
42fac30e63 wrap into full-width view 2023-10-13 23:50:49 +02:00
sk
18e7f14c16 remove duplicate selectable background 2023-10-13 23:49:54 +02:00
sk
7b263800a6 reduce button margins, realign buttons
closes sk22#
2023-10-13 23:27:49 +02:00
sk
17387a32b2 don't scale buttons with text
re: sk22#787
2023-10-13 23:04:45 +02:00
sk
3fe642c2f2 remove unwanted margin 2023-10-13 22:36:15 +02:00
sk
9225447409 use action bar icons color for toolbar
closes sk22#860
2023-10-13 22:27:53 +02:00
SomeTr
e05dee64b7 Translated using Weblate (Ukrainian)
Currently translated at 99.4% (391 of 393 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/uk/
2023-10-13 20:23:08 +00:00
Choukajohn
7f30973b39 Translated using Weblate (French)
Currently translated at 100.0% (393 of 393 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/fr/
2023-10-13 20:23:08 +00:00
gallegonovato
25da9bb2d0 Translated using Weblate (Spanish)
Currently translated at 100.0% (393 of 393 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/es/
2023-10-13 20:23:08 +00:00
poesty
e17b49e704 Translated using Weblate (Chinese (Simplified))
Currently translated at 99.7% (392 of 393 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/zh_Hans/
2023-10-13 20:23:08 +00:00
sk
db661b56cb fix inconsistent styles, fix non-sp font
closes sk22#862
2023-10-13 22:17:45 +02:00
sk
638e1bf8e9 do show labels per default
This reverts commit a1c81e89e8.
2023-10-13 21:16:52 +02:00
54 changed files with 793 additions and 507 deletions

View File

@@ -15,8 +15,8 @@ android {
applicationId "org.joinmastodon.android.sk"
minSdk 23
targetSdk 33
versionCode 103
versionName "2.1.6+fork.103"
versionCode 105
versionName "2.1.6+fork.105"
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']
}

View File

@@ -51,7 +51,6 @@ public class GlobalUserPreferences{
public static boolean collapseLongPosts;
public static boolean spectatorMode;
public static boolean autoHideFab;
public static boolean compactReblogReplyLine;
public static boolean allowRemoteLoading;
public static boolean forwardReportDefault;
public static AutoRevealMode autoRevealEqualSpoilers;
@@ -112,12 +111,11 @@ public class GlobalUserPreferences{
collapseLongPosts=prefs.getBoolean("collapseLongPosts", true);
spectatorMode=prefs.getBoolean("spectatorMode", false);
autoHideFab=prefs.getBoolean("autoHideFab", true);
compactReblogReplyLine=prefs.getBoolean("compactReblogReplyLine", true);
allowRemoteLoading=prefs.getBoolean("allowRemoteLoading", true);
autoRevealEqualSpoilers=AutoRevealMode.valueOf(prefs.getString("autoRevealEqualSpoilers", AutoRevealMode.THREADS.name()));
forwardReportDefault=prefs.getBoolean("forwardReportDefault", true);
disableM3PillActiveIndicator=prefs.getBoolean("disableM3PillActiveIndicator", false);
showNavigationLabels=prefs.getBoolean("showNavigationLabels", false);
showNavigationLabels=prefs.getBoolean("showNavigationLabels", true);
displayPronounsInTimelines=prefs.getBoolean("displayPronounsInTimelines", true);
displayPronounsInThreads=prefs.getBoolean("displayPronounsInThreads", true);
displayPronounsInUserListings=prefs.getBoolean("displayPronounsInUserListings", true);
@@ -170,7 +168,6 @@ public class GlobalUserPreferences{
.putBoolean("collapseLongPosts", collapseLongPosts)
.putBoolean("spectatorMode", spectatorMode)
.putBoolean("autoHideFab", autoHideFab)
.putBoolean("compactReblogReplyLine", compactReblogReplyLine)
.putBoolean("allowRemoteLoading", allowRemoteLoading)
.putString("autoRevealEqualSpoilers", autoRevealEqualSpoilers.name())
.putBoolean("forwardReportDefault", forwardReportDefault)

View File

@@ -7,7 +7,10 @@ import org.joinmastodon.android.MastodonApp;
import org.joinmastodon.android.api.requests.statuses.SetStatusBookmarked;
import org.joinmastodon.android.api.requests.statuses.SetStatusFavorited;
import org.joinmastodon.android.api.requests.statuses.SetStatusReblogged;
import org.joinmastodon.android.events.ReblogDeletedEvent;
import org.joinmastodon.android.events.StatusCountersUpdatedEvent;
import org.joinmastodon.android.events.StatusCreatedEvent;
import org.joinmastodon.android.events.StatusDeletedEvent;
import org.joinmastodon.android.model.Status;
import org.joinmastodon.android.model.StatusPrivacy;
@@ -48,7 +51,7 @@ public class StatusInteractionController{
runningFavoriteRequests.remove(status.id);
result.favouritesCount = Math.max(0, status.favouritesCount + (favorited ? 1 : -1));
cb.accept(result);
if (updateCounters) E.post(new StatusCountersUpdatedEvent(result));
if(updateCounters) E.post(new StatusCountersUpdatedEvent(result));
}
@Override
@@ -57,13 +60,13 @@ public class StatusInteractionController{
error.showToast(MastodonApp.context);
status.favourited=!favorited;
cb.accept(status);
if (updateCounters) E.post(new StatusCountersUpdatedEvent(status));
if(updateCounters) E.post(new StatusCountersUpdatedEvent(status));
}
})
.exec(accountID);
runningFavoriteRequests.put(status.id, req);
status.favourited=favorited;
if (updateCounters) E.post(new StatusCountersUpdatedEvent(status));
if(updateCounters) E.post(new StatusCountersUpdatedEvent(status));
}
public void setReblogged(Status status, boolean reblogged, StatusPrivacy visibility, Consumer<Status> cb){
@@ -78,11 +81,15 @@ public class StatusInteractionController{
.setCallback(new Callback<>(){
@Override
public void onSuccess(Status reblog){
Status result = reblog.getContentStatus();
Status result=reblog.getContentStatus();
runningReblogRequests.remove(status.id);
result.reblogsCount = Math.max(0, status.reblogsCount + (reblogged ? 1 : -1));
cb.accept(result);
if (updateCounters) E.post(new StatusCountersUpdatedEvent(result));
if(updateCounters){
E.post(new StatusCountersUpdatedEvent(result));
if(reblogged) E.post(new StatusCreatedEvent(reblog, accountID));
else E.post(new ReblogDeletedEvent(status.id, accountID));
}
}
@Override
@@ -91,13 +98,13 @@ public class StatusInteractionController{
error.showToast(MastodonApp.context);
status.reblogged=!reblogged;
cb.accept(status);
if (updateCounters) E.post(new StatusCountersUpdatedEvent(status));
if(updateCounters) E.post(new StatusCountersUpdatedEvent(status));
}
})
.exec(accountID);
runningReblogRequests.put(status.id, req);
status.reblogged=reblogged;
if (updateCounters) E.post(new StatusCountersUpdatedEvent(status));
if(updateCounters) E.post(new StatusCountersUpdatedEvent(status));
}
public void setBookmarked(Status status, boolean bookmarked){
@@ -118,7 +125,7 @@ public class StatusInteractionController{
public void onSuccess(Status result){
runningBookmarkRequests.remove(status.id);
cb.accept(result);
if (updateCounters) E.post(new StatusCountersUpdatedEvent(result));
if(updateCounters) E.post(new StatusCountersUpdatedEvent(result));
}
@Override
@@ -127,12 +134,12 @@ public class StatusInteractionController{
error.showToast(MastodonApp.context);
status.bookmarked=!bookmarked;
cb.accept(status);
if (updateCounters) E.post(new StatusCountersUpdatedEvent(status));
if(updateCounters) E.post(new StatusCountersUpdatedEvent(status));
}
})
.exec(accountID);
runningBookmarkRequests.put(status.id, req);
status.bookmarked=bookmarked;
if (updateCounters) E.post(new StatusCountersUpdatedEvent(status));
if(updateCounters) E.post(new StatusCountersUpdatedEvent(status));
}
}

View File

@@ -0,0 +1,11 @@
package org.joinmastodon.android.events;
public class ReblogDeletedEvent{
public final String statusID;
public final String accountID;
public ReblogDeletedEvent(String statusID, String accountID){
this.statusID=statusID;
this.accountID=accountID;
}
}

View File

@@ -1,7 +1,5 @@
package org.joinmastodon.android.events;
import org.joinmastodon.android.model.ScheduledStatus;
public class ScheduledStatusDeletedEvent{
public final String id;
public final String accountID;

View File

@@ -29,7 +29,6 @@ import android.text.TextWatcher;
import android.text.format.DateFormat;
import android.text.style.BackgroundColorSpan;
import android.text.style.ForegroundColorSpan;
import android.view.HapticFeedbackConstants;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
@@ -111,11 +110,11 @@ import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.Objects;
import java.util.UUID;
import java.util.function.Consumer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
@@ -798,6 +797,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
}
}
@SuppressLint("ClickableViewAccessibility")
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater){
inflater.inflate(editingStatus==null ? R.menu.compose : R.menu.compose_edit, menu);
@@ -828,19 +828,34 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
languageButton = wrap.findViewById(R.id.language_btn);
languageButton.setOnClickListener(v->showLanguageAlert());
languageButton.setOnLongClickListener(v->{
languageButton.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
if(!getLocalPrefs().bottomEncoding){
getLocalPrefs().bottomEncoding=true;
getLocalPrefs().save();
}
return false;
});
publishButton.post(()->publishButton.setMinimumWidth(publishButton.getWidth()));
publishButton.setOnClickListener(v -> {
if(GlobalUserPreferences.altTextReminders && editingStatus==null)
checkAltTextsAndPublish();
else
publish();
publishButton.setOnClickListener(v->{
Consumer<Boolean> draftCheckComplete=(isDraft)->{
if(GlobalUserPreferences.altTextReminders && !isDraft) checkAltTextsAndPublish();
else publish();
};
boolean isAlreadyDraft=scheduledAt!=null && scheduledAt.isAfter(DRAFTS_AFTER_INSTANT);
if(editingStatus!=null && scheduledAt!=null && isAlreadyDraft) {
new M3AlertDialogBuilder(getActivity())
.setTitle(R.string.sk_save_draft)
.setMessage(R.string.sk_save_draft_message)
.setPositiveButton(R.string.save, (d, w)->draftCheckComplete.accept(isAlreadyDraft))
.setNegativeButton(R.string.publish, (d, w)->{
updateScheduledAt(null);
draftCheckComplete.accept(false);
})
.show();
}else{
draftCheckComplete.accept(isAlreadyDraft);
}
});
draftsBtn.setOnClickListener(v-> draftOptionsPopup.show());
draftsBtn.setOnTouchListener(draftOptionsPopup.getDragToOpenListener());
@@ -852,8 +867,8 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
? languageResolver.fromOrFallback(prefs.postingDefaultLanguage)
: languageResolver.getDefault());
if (isInstancePixelfed()) spoilerBtn.setVisibility(View.GONE);
if (isInstancePixelfed() || (editingStatus != null && scheduledStatus == null)) {
if(isInstancePixelfed()) spoilerBtn.setVisibility(View.GONE);
if(isInstancePixelfed() || (editingStatus!=null && !redraftStatus)) {
// editing an already published post
draftsBtn.setVisibility(View.GONE);
}
@@ -977,7 +992,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
@Override
protected int getNavigationIconDrawableResource(){
return R.drawable.ic_baseline_close_24;
return R.drawable.ic_fluent_dismiss_24_regular;
}
@Override
@@ -1053,19 +1068,16 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
}
private void actuallyPublish(){
actuallyPublish(false);
}
private void actuallyPublish(boolean force){
String text=mainEditText.getText().toString();
CreateStatus.Request req=new CreateStatus.Request();
if ("bottom".equals(postLang.encoding)) {
text = new StatusTextEncoder(Bottom::encode).encode(text);
req.spoilerText = "bottom-encoded emoji spam";
if("bottom".equals(postLang.encoding)){
text=new StatusTextEncoder(Bottom::encode).encode(text);
req.spoilerText="bottom-encoded emoji spam";
}
if (localOnly &&
if(localOnly &&
AccountSessionManager.get(accountID).getLocalPreferences().glitchInstance &&
!GLITCH_LOCAL_ONLY_PATTERN.matcher(text).matches()) {
text += " " + GLITCH_LOCAL_ONLY_SUFFIX;
!GLITCH_LOCAL_ONLY_PATTERN.matcher(text).matches()){
text+=" "+GLITCH_LOCAL_ONLY_SUFFIX;
}
req.status=text;
req.localOnly=localOnly;
@@ -1079,19 +1091,6 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
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)) {
new M3AlertDialogBuilder(getActivity())
.setTitle(R.string.sk_save_draft)
.setMessage(R.string.sk_save_draft_message)
.setPositiveButton(R.string.save, (d, w) -> actuallyPublish(true))
.setNegativeButton(R.string.publish, (d, w) -> {
updateScheduledAt(null);
actuallyPublish();
})
.show();
return;
}
if(replyTo!=null || (editingStatus != null && editingStatus.inReplyToId!=null)){
req.inReplyToId=editingStatus!=null ? editingStatus.inReplyToId : replyTo.id;
}
@@ -1286,20 +1285,20 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
}
private void confirmDiscardDraftAndFinish(){
boolean attachmentsPending = mediaViewController.areAnyAttachmentsNotDone();
if (attachmentsPending) new M3AlertDialogBuilder(getActivity())
boolean attachmentsPending=mediaViewController.areAnyAttachmentsNotDone();
if(attachmentsPending) new M3AlertDialogBuilder(getActivity())
.setTitle(R.string.sk_unfinished_attachments)
.setMessage(R.string.sk_unfinished_attachments_message)
.setPositiveButton(R.string.edit, (d, w) -> {})
.setNegativeButton(R.string.discard, (d, w) -> Nav.finish(this))
.setPositiveButton(R.string.ok, (d, w)->{})
.setNegativeButton(R.string.discard, (d, w)->Nav.finish(this))
.show();
else new M3AlertDialogBuilder(getActivity())
.setTitle(editingStatus != null ? R.string.sk_confirm_save_changes : R.string.sk_confirm_save_draft)
.setPositiveButton(R.string.save, (d, w) -> {
updateScheduledAt(scheduledAt == null ? getDraftInstant() : scheduledAt);
.setTitle(editingStatus!=null ? R.string.sk_confirm_save_changes : R.string.sk_confirm_save_draft)
.setPositiveButton(R.string.save, (d, w)->{
updateScheduledAt(scheduledAt==null ? getDraftInstant() : scheduledAt);
publish();
})
.setNegativeButton(R.string.discard, (d, w) -> Nav.finish(this))
.setNegativeButton(R.string.discard, (d, w)->Nav.finish(this))
.show();
}

View File

@@ -400,10 +400,9 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab
addListsToOverflowMenu();
addHashtagsToOverflowMenu();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && !UiUtils.isEMUI()) {
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.P && !UiUtils.isEMUI())
m.setGroupDividerEnabled(true);
}
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater){

View File

@@ -238,7 +238,7 @@ public class NotificationsListFragment extends BaseStatusListFragment<Notificati
continue;
Status contentStatus=ntf.status.getContentStatus();
if(contentStatus.poll!=null && contentStatus.poll.id.equals(ev.poll.id)){
updatePoll(ntf.id, ntf.status, ev.poll);
updatePoll(ntf.id, contentStatus, ev.poll);
}
}
}

View File

@@ -755,20 +755,21 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
boolean hasMultipleAccounts = AccountSessionManager.getInstance().getLoggedInAccounts().size() > 1;
MenuItem openWithAccounts = menu.findItem(R.id.open_with_account);
openWithAccounts.setVisible(hasMultipleAccounts);
SubMenu accountsMenu = openWithAccounts.getSubMenu();
if (hasMultipleAccounts) {
SubMenu accountsMenu=openWithAccounts.getSubMenu();
if(hasMultipleAccounts){
accountsMenu.clear();
UiUtils.populateAccountsMenu(accountID, accountsMenu, s-> UiUtils.openURL(
getActivity(), s.getID(), account.url, false
));
}
menu.findItem(R.id.share).setTitle(R.string.share_user);
if(isOwnProfile) {
if (isInstancePixelfed()) menu.findItem(R.id.scheduled).setVisible(false);
return;
}
MenuItem mute = menu.findItem(R.id.mute);
menu.findItem(R.id.manage_user_lists).setTitle(getString(R.string.sk_lists_with_user, account.getShortUsername()));
MenuItem mute=menu.findItem(R.id.mute);
mute.setTitle(getString(relationship.muting ? R.string.unmute_user : R.string.mute_user, account.getShortUsername()));
mute.setIcon(relationship.muting ? R.drawable.ic_fluent_speaker_0_24_regular : R.drawable.ic_fluent_speaker_off_24_regular);
UiUtils.insetPopupMenuIcon(getContext(), mute);
@@ -776,19 +777,22 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
menu.findItem(R.id.report).setTitle(getString(R.string.report_user, account.getShortUsername()));
menu.findItem(R.id.manage_user_lists).setVisible(relationship.following);
menu.findItem(R.id.soft_block).setVisible(relationship.followedBy && !relationship.following);
MenuItem hideBoosts=menu.findItem(R.id.hide_boosts);
if (relationship.following) {
MenuItem hideBoosts = menu.findItem(R.id.hide_boosts);
hideBoosts.setTitle(getString(relationship.showingReblogs ? R.string.hide_boosts_from_user : R.string.show_boosts_from_user, account.getShortUsername()));
hideBoosts.setIcon(relationship.showingReblogs ? R.drawable.ic_fluent_arrow_repeat_all_off_24_regular : R.drawable.ic_fluent_arrow_repeat_all_24_regular);
UiUtils.insetPopupMenuIcon(getContext(), hideBoosts);
menu.findItem(R.id.manage_user_lists).setTitle(getString(R.string.sk_lists_with_user, account.getShortUsername()));
hideBoosts.setVisible(true);
} else {
menu.findItem(R.id.hide_boosts).setVisible(false);
hideBoosts.setVisible(false);
}
MenuItem blockDomain=menu.findItem(R.id.block_domain);
if(!account.isLocal()){
blockDomain.setTitle(getString(relationship.domainBlocking ? R.string.unblock_domain : R.string.block_domain, account.getDomain()));
blockDomain.setVisible(true);
}else{
blockDomain.setVisible(false);
}
if(!account.isLocal())
menu.findItem(R.id.block_domain).setTitle(getString(relationship.domainBlocking ? R.string.unblock_domain : R.string.block_domain, account.getDomain()));
else
menu.findItem(R.id.block_domain).setVisible(false);
}
@Override
@@ -800,11 +804,11 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
intent.putExtra(Intent.EXTRA_TEXT, account.url);
startActivity(Intent.createChooser(intent, item.getTitle()));
}else if(id==R.id.mute){
confirmToggleMuted();
UiUtils.confirmToggleMuteUser(getActivity(), accountID, account, relationship.muting, this::updateRelationship);
}else if(id==R.id.block){
confirmToggleBlocked();
UiUtils.confirmToggleBlockUser(getActivity(), accountID, account, relationship.blocking, this::updateRelationship);
}else if(id==R.id.soft_block){
confirmSoftBlockUser();
UiUtils.confirmSoftBlockUser(getActivity(), accountID, account, this::updateRelationship);
}else if(id==R.id.report){
Bundle args=new Bundle();
args.putString("account", accountID);
@@ -1101,7 +1105,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
updateMetadataHeight();
Toolbar toolbar=getToolbar();
Drawable close=getToolbarContext().getDrawable(R.drawable.ic_baseline_close_24).mutate();
Drawable close=getToolbarContext().getDrawable(R.drawable.ic_fluent_dismiss_24_regular).mutate();
close.setTint(UiUtils.getThemeColor(getToolbarContext(), R.attr.colorM3OnSurfaceVariant));
toolbar.setNavigationIcon(close);
toolbar.setNavigationContentDescription(R.string.discard);
@@ -1207,18 +1211,6 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
.exec(accountID);
}
private void confirmToggleMuted(){
UiUtils.confirmToggleMuteUser(getActivity(), accountID, account, relationship.muting, this::updateRelationship);
}
private void confirmToggleBlocked(){
UiUtils.confirmToggleBlockUser(getActivity(), accountID, account, relationship.blocking, this::updateRelationship);
}
private void confirmSoftBlockUser(){
UiUtils.confirmSoftBlockUser(getActivity(), accountID, account, this::updateRelationship);
}
private void updateRelationship(Relationship r){
relationship=r;
updateRelationship();

View File

@@ -119,6 +119,15 @@ public class ScheduledStatusListFragment extends BaseStatusListFragment<Schedule
}
}
@Override
protected void onShown(){
super.onShown();
// because, for some reason, when navigating back from compose fragment,
// match_parent would otherwise be incorrect (leaving a gap for the keyboard
// where there is none)
list.post(list::requestLayout);
}
@Override
protected void doLoadData(int offset, int count){
currentRequest=new GetScheduledStatuses(offset==0 ? null : nextMaxID, count)

View File

@@ -13,6 +13,7 @@ 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.ReblogDeletedEvent;
import org.joinmastodon.android.events.RemoveAccountPostsEvent;
import org.joinmastodon.android.events.StatusCountersUpdatedEvent;
import org.joinmastodon.android.events.StatusCreatedEvent;
@@ -28,6 +29,7 @@ import org.joinmastodon.android.ui.displayitems.TextStatusDisplayItem;
import org.parceler.Parcels;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -142,12 +144,12 @@ public abstract class StatusListFragment extends BaseStatusListFragment<Status>
}
}
protected Status getContentStatusByID(String id){
public Status getContentStatusByID(String id){
Status s=getStatusByID(id);
return s==null ? null : s.getContentStatus();
}
protected Status getStatusByID(String id){
public Status getStatusByID(String id){
for(Status s:data){
if(s.id.equals(id)){
return s;
@@ -174,43 +176,58 @@ public abstract class StatusListFragment extends BaseStatusListFragment<Status>
}
}
protected void removeStatus(Status status){
data.remove(status);
preloadedData.remove(status);
int index=-1, ancestorFirstIndex = -1, ancestorLastIndex = -1;
for(int i=0;i<displayItems.size();i++){
StatusDisplayItem item = displayItems.get(i);
if(status.id.equals(item.parentID)){
index=i;
break;
private void iterateRemoveStatus(List<Status> l, String id){
Iterator<Status> it=l.iterator();
while(it.hasNext()){
if(it.next().getContentStatus().id.equals(id)){
it.remove();
}
if (item.parentID.equals(status.inReplyToId)) {
if (ancestorFirstIndex == -1) ancestorFirstIndex = i;
ancestorLastIndex = i;
}
}
private void removeStatusDisplayItems(Status status, int index, int ancestorFirstIndex, int ancestorLastIndex, boolean deleteContent){
// did we find an ancestor that is also the status' neighbor?
if (ancestorFirstIndex >= 0 && ancestorLastIndex == index - 1) {
for (int i = ancestorFirstIndex; i <= ancestorLastIndex; i++) {
StatusDisplayItem item = displayItems.get(i);
if(ancestorFirstIndex>=0 && ancestorLastIndex==index-1){
for(int i=ancestorFirstIndex; i<=ancestorLastIndex; i++){
StatusDisplayItem item=displayItems.get(i);
String id=deleteContent ? item.getContentID() : item.parentID;
// update ancestor to have no descendant anymore
if (item.parentID.equals(status.inReplyToId)) item.hasDescendantNeighbor = false;
if(id.equals(status.inReplyToId)) item.hasDescendantNeighbor=false;
}
adapter.notifyItemRangeChanged(ancestorFirstIndex, ancestorLastIndex - ancestorFirstIndex + 1);
adapter.notifyItemRangeChanged(ancestorFirstIndex, ancestorLastIndex-ancestorFirstIndex+1);
}
if(index==-1)
return;
if(index==-1) return;
int lastIndex;
for(lastIndex=index;lastIndex<displayItems.size();lastIndex++){
if(!displayItems.get(lastIndex).parentID.equals(status.id))
break;
StatusDisplayItem item=displayItems.get(lastIndex);
String id=deleteContent ? item.getContentID() : item.parentID;
if(!id.equals(status.id)) break;
}
displayItems.subList(index, lastIndex).clear();
adapter.notifyItemRangeRemoved(index, lastIndex-index);
}
protected void removeStatus(Status status){
boolean deleteContent=status==status.getContentStatus();
int ancestorFirstIndex=-1, ancestorLastIndex=-1;
for(int i=0;i<displayItems.size();i++){
StatusDisplayItem item=displayItems.get(i);
String id=deleteContent ? item.getContentID() : item.parentID;
if(id.equals(status.id)){
removeStatusDisplayItems(status, i, ancestorFirstIndex, ancestorLastIndex, deleteContent);
ancestorFirstIndex=ancestorLastIndex=-1;
continue;
}
if(id.equals(status.inReplyToId)){
if(ancestorFirstIndex==-1) ancestorFirstIndex=i;
ancestorLastIndex=i;
}
}
iterateRemoveStatus(data, status.id);
iterateRemoveStatus(preloadedData, status.id);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
@@ -277,6 +294,18 @@ public abstract class StatusListFragment extends BaseStatusListFragment<Status>
removeStatus(status);
}
@Subscribe
public void onReblogDeleted(ReblogDeletedEvent ev){
if(!ev.accountID.equals(accountID))
return;
for(Status item : data){
if(item.getContentStatus().id.equals(ev.statusID) && item.reblog!=null){
removeStatus(item);
break;
}
}
}
@Subscribe
public void onStatusCreated(StatusCreatedEvent ev){
if(!ev.accountID.equals(accountID))

View File

@@ -4,6 +4,7 @@ import android.graphics.Rect;
import android.graphics.drawable.Animatable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
@@ -65,6 +66,8 @@ public class DiscoverAccountsFragment extends MastodonRecyclerFragment<DiscoverA
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
accountID=getArguments().getString("account");
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.N)
setRetainInstance(true);
}
@Override

View File

@@ -2,8 +2,8 @@ package org.joinmastodon.android.fragments.discover;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
@@ -14,14 +14,12 @@ import org.joinmastodon.android.api.requests.trends.GetTrendingLinks;
import org.joinmastodon.android.fragments.ScrollableToTop;
import org.joinmastodon.android.model.Card;
import org.joinmastodon.android.model.viewmodel.CardViewModel;
import org.joinmastodon.android.ui.DividerItemDecoration;
import org.joinmastodon.android.ui.OutlineProviders;
import org.joinmastodon.android.ui.drawables.BlurhashCrossfadeDrawable;
import org.joinmastodon.android.ui.utils.DiscoverInfoBannerHelper;
import org.joinmastodon.android.ui.utils.UiUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
@@ -32,11 +30,9 @@ import me.grishka.appkit.api.SimpleCallback;
import me.grishka.appkit.fragments.BaseRecyclerFragment;
import me.grishka.appkit.imageloader.ImageLoaderRecyclerAdapter;
import me.grishka.appkit.imageloader.ImageLoaderViewHolder;
import me.grishka.appkit.imageloader.ListImageLoaderAdapter;
import me.grishka.appkit.imageloader.ListImageLoaderWrapper;
import me.grishka.appkit.imageloader.RecyclerViewDelegate;
import me.grishka.appkit.imageloader.requests.ImageLoaderRequest;
import me.grishka.appkit.imageloader.requests.UrlImageLoaderRequest;
import me.grishka.appkit.utils.BindableViewHolder;
import me.grishka.appkit.utils.MergeRecyclerAdapter;
import me.grishka.appkit.utils.SingleViewRecyclerAdapter;
@@ -60,6 +56,8 @@ public class DiscoverNewsFragment extends BaseRecyclerFragment<CardViewModel> im
super.onCreate(savedInstanceState);
accountID=getArguments().getString("account");
bannerHelper=new DiscoverInfoBannerHelper(DiscoverInfoBannerHelper.BannerType.TRENDING_LINKS, accountID);
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.N)
setRetainInstance(true);
}
@Override

View File

@@ -1,5 +1,6 @@
package org.joinmastodon.android.fragments.discover;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
@@ -9,8 +10,6 @@ import org.joinmastodon.android.R;
import org.joinmastodon.android.api.requests.trends.GetTrendingHashtags;
import org.joinmastodon.android.fragments.ScrollableToTop;
import org.joinmastodon.android.model.Hashtag;
import org.joinmastodon.android.ui.DividerItemDecoration;
import org.joinmastodon.android.ui.utils.DiscoverInfoBannerHelper;
import org.joinmastodon.android.ui.utils.UiUtils;
import org.joinmastodon.android.ui.views.HashtagChartView;
@@ -34,6 +33,8 @@ public class TrendingHashtagsFragment extends BaseRecyclerFragment<Hashtag> impl
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
accountID=getArguments().getString("account");
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.N)
setRetainInstance(true);
}
@Override

View File

@@ -83,9 +83,10 @@ public class CustomWelcomeFragment extends InstanceCatalogFragment {
@Override
protected void updateFilteredList(){
boolean addFakeInstance = currentSearchQuery.length()>0 && currentSearchQuery.matches("^\\S+\\.[^\\.]+$");
String query=getCurrentSearchQuery();
boolean addFakeInstance=query.length()>0 && query.matches("^\\S+\\.[^\\.]+$");
if(addFakeInstance){
fakeInstance.domain=fakeInstance.normalizedDomain=currentSearchQuery;
fakeInstance.domain=fakeInstance.normalizedDomain=query;
fakeInstance.description=getString(R.string.loading_instance);
if(filteredData.size()>0 && filteredData.get(0)==fakeInstance){
if(list.findViewHolderForAdapterPosition(1) instanceof InstanceViewHolder ivh){
@@ -99,12 +100,12 @@ public class CustomWelcomeFragment extends InstanceCatalogFragment {
}
ArrayList<CatalogInstance> prevData=new ArrayList<>(filteredData);
filteredData.clear();
if(currentSearchQuery.length()>0){
if(query.length()>0){
boolean foundExactMatch=false;
for(CatalogInstance inst:data){
if(inst.normalizedDomain.contains(currentSearchQuery)){
if(inst.normalizedDomain.contains(query)){
filteredData.add(inst);
if(inst.normalizedDomain.equals(currentSearchQuery))
if(inst.normalizedDomain.equals(query))
foundExactMatch=true;
}
}

View File

@@ -93,10 +93,10 @@ abstract class InstanceCatalogFragment extends MastodonRecyclerFragment<CatalogI
currentSearchQuery=searchEdit.getText().toString().toLowerCase().trim();
updateFilteredList();
searchEdit.removeCallbacks(searchDebouncer);
Instance instance=instancesCache.get(normalizeInstanceDomain(currentSearchQuery));
Instance instance=instancesCache.get(normalizeInstanceDomain(getCurrentSearchQuery()));
if(instance==null){
showProgressDialog();
loadInstanceInfo(currentSearchQuery, false);
loadInstanceInfo(getCurrentSearchQuery(), false);
}else{
proceedWithAuthOrSignup(instance);
}
@@ -106,7 +106,7 @@ abstract class InstanceCatalogFragment extends MastodonRecyclerFragment<CatalogI
protected void onSearchChangedDebounced(){
currentSearchQuery=searchEdit.getText().toString().toLowerCase().trim();
updateFilteredList();
loadInstanceInfo(currentSearchQuery, false);
loadInstanceInfo(getCurrentSearchQuery(), false);
}
protected List<CatalogInstance> sortInstances(List<CatalogInstance> result){
@@ -126,9 +126,16 @@ abstract class InstanceCatalogFragment extends MastodonRecyclerFragment<CatalogI
instanceProgressDialog.show();
}
protected String getCurrentSearchQuery(){
String[] parts=currentSearchQuery.split("@");
return parts.length>0 ? parts[parts.length-1] : "";
}
protected String normalizeInstanceDomain(String _domain){
if(TextUtils.isEmpty(_domain))
return null;
String[] parts=_domain.split("@");
_domain=parts[parts.length - 1];
if(_domain.contains(":")){
try{
_domain=Uri.parse(_domain).getAuthority();
@@ -198,7 +205,7 @@ abstract class InstanceCatalogFragment extends MastodonRecyclerFragment<CatalogI
instanceProgressDialog=null;
proceedWithAuthOrSignup(result);
}
if(Objects.equals(domain, currentSearchQuery) || Objects.equals(currentSearchQuery, redirects.get(domain)) || Objects.equals(currentSearchQuery, redirectsInverse.get(domain))){
if(Objects.equals(domain, getCurrentSearchQuery()) || Objects.equals(getCurrentSearchQuery(), redirects.get(domain)) || Objects.equals(getCurrentSearchQuery(), redirectsInverse.get(domain))){
boolean found=false;
for(CatalogInstance ci:filteredData){
if(ci.domain.equals(domain) && ci!=fakeInstance){

View File

@@ -227,7 +227,7 @@ public class ReportDoneFragment extends MastodonToolbarFragment{
@Override
protected int getNavigationIconDrawableResource(){
return R.drawable.ic_baseline_close_24;
return R.drawable.ic_fluent_dismiss_24_regular;
}
@Override

View File

@@ -167,7 +167,7 @@ public class SettingsBehaviorFragment extends BaseSettingsFragment<Void> impleme
GlobalUserPreferences.overlayMedia=overlayMediaItem.checked;
GlobalUserPreferences.useCustomTabs=customTabsItem.checked;
GlobalUserPreferences.altTextReminders=altTextItem.checked;
GlobalUserPreferences.confirmUnfollow=customTabsItem.checked;
GlobalUserPreferences.confirmUnfollow=confirmUnfollowItem.checked;
GlobalUserPreferences.confirmBoost=confirmBoostItem.checked;
GlobalUserPreferences.confirmDeletePost=confirmDeleteItem.checked;
GlobalUserPreferences.forwardReportDefault=forwardReportsItem.checked;

View File

@@ -71,7 +71,7 @@ public class SearchViewHelper{
searchLayout.addView(searchEdit, new LinearLayout.LayoutParams(0, ViewGroup.LayoutParams.MATCH_PARENT, 1f));
clearSearchButton=new ImageButton(context);
clearSearchButton.setImageResource(R.drawable.ic_baseline_close_24);
clearSearchButton.setImageResource(R.drawable.ic_fluent_dismiss_24_regular);
clearSearchButton.setContentDescription(context.getString(R.string.clear));
clearSearchButton.setImageTintList(ColorStateList.valueOf(UiUtils.getThemeColor(context, R.attr.colorM3OnSurfaceVariant)));
clearSearchButton.setBackground(UiUtils.getThemeDrawable(toolbarContext, android.R.attr.actionBarItemBackground));

View File

@@ -1,24 +1,17 @@
package org.joinmastodon.android.ui.displayitems;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import org.joinmastodon.android.R;
import org.joinmastodon.android.fragments.BaseStatusListFragment;
import org.joinmastodon.android.model.Attachment;
import org.joinmastodon.android.model.Card;
import org.joinmastodon.android.model.Status;
import org.joinmastodon.android.ui.drawables.BlurhashCrossfadeDrawable;
import org.joinmastodon.android.ui.utils.UiUtils;
import me.grishka.appkit.imageloader.ImageLoaderViewHolder;
public class FileStatusDisplayItem extends StatusDisplayItem{
private final Attachment attachment;

View File

@@ -172,7 +172,6 @@ public class FooterStatusDisplayItem extends StatusDisplayItem{
} else if (action == MotionEvent.ACTION_DOWN) {
longClickPerformed = false;
touchingView = v;
v.setPivotX(V.sp(28));
v.animate().scaleX(0.85f).scaleY(0.85f).setInterpolator(CubicBezierInterpolator.DEFAULT).setDuration(75).start();
if (disabled) return true;
v.postDelayed(longClickRunnable, ViewConfiguration.getLongPressTimeout());

View File

@@ -18,7 +18,7 @@ import me.grishka.appkit.utils.V;
public class GapStatusDisplayItem extends StatusDisplayItem{
public boolean loading;
private Status status;
private final Status status;
public GapStatusDisplayItem(String parentID, BaseStatusListFragment<?> parentFragment, Status status){
super(parentID, parentFragment);

View File

@@ -209,7 +209,6 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
}else if(item.scheduledStatus!=null){
args.putString("sourceText", item.status.text);
args.putString("sourceSpoiler", item.status.spoilerText);
args.putBoolean("redraftStatus", true);
args.putParcelable("scheduledStatus", Parcels.wrap(item.scheduledStatus));
Nav.go(item.parentFragment.getActivity(), ComposeFragment.class, args);
}else{
@@ -219,14 +218,14 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
public void onSuccess(GetStatusSourceText.Response result){
args.putString("sourceText", result.text);
args.putString("sourceSpoiler", result.spoilerText);
if (result.contentType != null) {
if(result.contentType!=null){
args.putString("sourceContentType", result.contentType.name());
}
if (redraft) {
if(redraft){
UiUtils.confirmDeletePost(item.parentFragment.getActivity(), item.parentFragment.getAccountID(), item.status, s->{
Nav.go(item.parentFragment.getActivity(), ComposeFragment.class, args);
}, true);
} else {
}else{
Nav.go(item.parentFragment.getActivity(), ComposeFragment.class, args);
}
}
@@ -243,7 +242,7 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
if (item.scheduledStatus != null) {
UiUtils.confirmDeleteScheduledPost(item.parentFragment.getActivity(), item.parentFragment.getAccountID(), item.scheduledStatus, ()->{});
} else {
UiUtils.confirmDeletePost(item.parentFragment.getActivity(), item.parentFragment.getAccountID(), item.status, s->{});
UiUtils.confirmDeletePost(item.parentFragment.getActivity(), item.parentFragment.getAccountID(), item.status, s->{}, false);
}
}else if(id==R.id.pin || id==R.id.unpin) {
UiUtils.confirmPinPost(item.parentFragment.getActivity(), item.parentFragment.getAccountID(), item.status, !item.status.pinned, s->{});

View File

@@ -10,10 +10,8 @@ import android.text.SpannableStringBuilder;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import org.joinmastodon.android.GlobalUserPreferences;
import org.joinmastodon.android.R;
import org.joinmastodon.android.api.session.AccountSessionManager;
import org.joinmastodon.android.fragments.BaseStatusListFragment;
@@ -40,7 +38,7 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{
private StatusPrivacy visibility;
@DrawableRes
private int iconEnd;
private CustomEmojiHelper emojiHelper=new CustomEmojiHelper(), fullTextEmojiHelper;
private CustomEmojiHelper emojiHelper=new CustomEmojiHelper();
private View.OnClickListener handleClick;
public boolean needBottomPadding;
ReblogOrReplyLineStatusDisplayItem extra;
@@ -58,21 +56,13 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{
HtmlParser.parseCustomEmoji(ssb, emojis);
this.text=ssb;
emojiHelper.setText(ssb);
this.fullText=fullText;
this.icon=icon;
this.status=status;
this.handleClick=handleClick;
TypedValue outValue = new TypedValue();
context.getTheme().resolveAttribute(android.R.attr.selectableItemBackground, outValue, true);
updateVisibility(visibility);
if (fullText != null) {
fullTextEmojiHelper = new CustomEmojiHelper();
SpannableStringBuilder fullTextSsb = new SpannableStringBuilder(fullText);
HtmlParser.parseCustomEmoji(fullTextSsb, emojis);
this.fullText=fullTextSsb;
fullTextEmojiHelper.setText(fullTextSsb);
}
}
public void updateVisibility(StatusPrivacy visibility) {
@@ -92,34 +82,27 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{
@Override
public int getImageCount(){
return emojiHelper.getImageCount();
return emojiHelper.getImageCount() + (extra!=null ? extra.emojiHelper.getImageCount() : 0);
}
@Override
public ImageLoaderRequest getImageRequest(int index){
return emojiHelper.getImageRequest(index);
CustomEmojiHelper helper=index<emojiHelper.getImageCount() ? emojiHelper : extra.emojiHelper;
return helper.getImageRequest(index%emojiHelper.getImageCount());
}
public static class Holder extends StatusDisplayItem.Holder<ReblogOrReplyLineStatusDisplayItem> implements ImageLoaderViewHolder{
private final TextView text, extraText;
private final View separator;
private final ViewGroup parent;
public Holder(Activity activity, ViewGroup parent){
super(activity, R.layout.display_item_reblog_or_reply_line, parent);
this.parent = parent;
text=findViewById(R.id.text);
extraText=findViewById(R.id.extra_text);
separator=findViewById(R.id.separator);
if (GlobalUserPreferences.compactReblogReplyLine) {
parent.addOnLayoutChangeListener((v, l, t, right, b, ol, ot, oldRight, ob) -> {
if (right != oldRight) layoutLine();
});
}
}
private void bindLine(ReblogOrReplyLineStatusDisplayItem item, TextView text) {
if (item.fullText != null) text.setContentDescription(item.fullText);
text.setText(item.text);
text.setCompoundDrawablesRelativeWithIntrinsicBounds(item.icon, 0, item.iconEnd, 0);
text.setOnClickListener(item.handleClick);
@@ -133,7 +116,10 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{
case LOCAL -> R.string.sk_local_only;
default -> 0;
} : 0;
if (visibilityText != 0) text.setContentDescription(item.text + " (" + ctx.getString(visibilityText) + ")");
String visibilityDescription=visibilityText!=0 ? " (" + ctx.getString(visibilityText) + ")" : null;
text.setContentDescription(item.fullText==null && visibilityDescription==null ? null :
(item.fullText!=null ? item.fullText : item.text)
+ (visibilityDescription!=null ? visibilityDescription : ""));
if(Build.VERSION.SDK_INT<Build.VERSION_CODES.N)
UiUtils.fixCompoundDrawableTintOnAndroid6(text);
text.setCompoundDrawableTintList(text.getTextColors());
@@ -146,31 +132,14 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{
extraText.setVisibility(item.extra == null ? View.GONE : View.VISIBLE);
separator.setVisibility(item.extra == null ? View.GONE : View.VISIBLE);
itemView.setPadding(itemView.getPaddingLeft(), itemView.getPaddingTop(), itemView.getPaddingRight(), item.needBottomPadding ? V.dp(16) : 0);
layoutLine();
}
private void layoutLine() {
// layout line only if above header, compact and has extra
if (!GlobalUserPreferences.compactReblogReplyLine || item.extra == null) return;
itemView.measure(
View.MeasureSpec.makeMeasureSpec(parent.getWidth(), View.MeasureSpec.EXACTLY),
View.MeasureSpec.UNSPECIFIED);
boolean isVertical = ((LinearLayout) itemView).getOrientation() == LinearLayout.VERTICAL;
extraText.setPaddingRelative(extraText.getPaddingStart(), item.extra != null && isVertical ? 0 : V.dp(16), extraText.getPaddingEnd(), extraText.getPaddingBottom());
separator.setVisibility(item.extra != null && !isVertical ? View.VISIBLE : View.GONE);
((LinearLayout) itemView).removeView(extraText);
if (isVertical) ((LinearLayout) itemView).addView(extraText);
else ((LinearLayout) itemView).addView(extraText, 0);
text.setText(isVertical ? item.fullText : item.text);
if (item.extra != null) {
extraText.setText(isVertical ? item.extra.fullText : item.extra.text);
}
}
@Override
public void setImage(int index, Drawable image){
item.emojiHelper.setImageDrawable(index, image);
CustomEmojiHelper helper=index<item.emojiHelper.getImageCount() ? item.emojiHelper : item.extra.emojiHelper;
helper.setImageDrawable(index%item.emojiHelper.getImageCount(), image);
text.invalidate();
extraText.invalidate();
}
@Override

View File

@@ -13,6 +13,8 @@ import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import org.joinmastodon.android.GlobalUserPreferences;
import org.joinmastodon.android.R;
import org.joinmastodon.android.api.session.AccountLocalPreferences;
@@ -22,6 +24,7 @@ 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.StatusListFragment;
import org.joinmastodon.android.fragments.ThreadFragment;
import org.joinmastodon.android.model.Account;
import org.joinmastodon.android.model.Attachment;
@@ -58,10 +61,10 @@ public abstract class StatusDisplayItem{
public boolean inset;
public int index;
public boolean
hasDescendantNeighbor = false,
hasAncestoringNeighbor = false,
isMainStatus = true,
isDirectDescendant = false;
hasDescendantNeighbor=false,
hasAncestoringNeighbor=false,
isMainStatus=true,
isDirectDescendant=false;
public static final int FLAG_INSET=1;
public static final int FLAG_NO_FOOTER=1 << 1;
@@ -88,6 +91,16 @@ public abstract class StatusDisplayItem{
this.parentFragment=parentFragment;
}
@NonNull
public String getContentID(){
if(parentFragment instanceof StatusListFragment slf){
Status s=slf.getContentStatusByID(parentID);
return s!=null ? s.id : parentID;
}else{
return parentID;
}
}
public abstract Type getType();
public int getImageCount(){
@@ -129,7 +142,7 @@ public abstract class StatusDisplayItem{
String parentID = parent.getID();
String text = threadReply ? fragment.getString(R.string.sk_show_thread)
: account == null ? fragment.getString(R.string.sk_in_reply)
: GlobalUserPreferences.compactReblogReplyLine && status.reblog != null ? account.displayName
: status.reblog != null ? account.displayName
: fragment.getString(R.string.in_reply_to, account.displayName);
String fullText = threadReply ? fragment.getString(R.string.sk_show_thread)
: account == null ? fragment.getString(R.string.sk_in_reply)
@@ -164,7 +177,7 @@ public abstract class StatusDisplayItem{
if(status.reblog!=null){
boolean isOwnPost = AccountSessionManager.getInstance().isSelf(fragment.getAccountID(), status.account);
String fullText = fragment.getString(R.string.user_boosted, status.account.displayName);
String text = GlobalUserPreferences.compactReblogReplyLine && replyLine != null ? status.account.displayName : fullText;
String text = replyLine != null ? status.account.displayName : fullText;
items.add(new ReblogOrReplyLineStatusDisplayItem(parentID, fragment, text, status.account.emojis, R.drawable.ic_fluent_arrow_repeat_all_20sp_filled, isOwnPost ? status.visibility : null, i->{
args.putParcelable("profileAccount", Parcels.wrap(status.account));
Nav.go(fragment.getActivity(), ProfileFragment.class, args);
@@ -192,7 +205,7 @@ public abstract class StatusDisplayItem{
.map(ReblogOrReplyLineStatusDisplayItem.class::cast)
.findFirst();
if (primaryLine.isPresent() && GlobalUserPreferences.compactReblogReplyLine) {
if (primaryLine.isPresent()) {
primaryLine.get().extra = replyLine;
} else {
items.add(replyLine);

View File

@@ -210,6 +210,7 @@ public class HtmlParser{
}
public static void parseCustomEmoji(SpannableStringBuilder ssb, List<Emoji> emojis){
if(emojis==null) return;
Map<String, Emoji> emojiByCode =
emojis.stream()
.collect(

View File

@@ -68,6 +68,7 @@ import org.joinmastodon.android.E;
import org.joinmastodon.android.GlobalUserPreferences;
import org.joinmastodon.android.MastodonApp;
import org.joinmastodon.android.R;
import org.joinmastodon.android.api.CacheController;
import org.joinmastodon.android.api.MastodonAPIRequest;
import org.joinmastodon.android.api.MastodonErrorResponse;
import org.joinmastodon.android.api.StatusInteractionController;
@@ -625,24 +626,26 @@ public class UiUtils {
.show();
}
public static void confirmDeletePost(Activity activity, String accountID, Status status, Consumer<Status> resultCallback) {
confirmDeletePost(activity, accountID, status, resultCallback, false);
}
public static void confirmDeletePost(Activity activity, String accountID, Status status, Consumer<Status> resultCallback, boolean forRedraft) {
Status s=status.getContentStatus();
showConfirmationAlert(activity,
forRedraft ? R.string.sk_confirm_delete_and_redraft_title : R.string.confirm_delete_title,
forRedraft ? R.string.sk_confirm_delete_and_redraft : R.string.confirm_delete,
forRedraft ? R.string.sk_delete_and_redraft : R.string.delete,
forRedraft ? R.drawable.ic_fluent_arrow_clockwise_28_regular : R.drawable.ic_fluent_delete_28_regular,
() -> new DeleteStatus(status.id)
() -> new DeleteStatus(s.id)
.setCallback(new Callback<>() {
@Override
public void onSuccess(Status result) {
resultCallback.accept(result);
AccountSessionManager.getInstance().getAccount(accountID).getCacheController().deleteStatus(status.id);
CacheController cache=AccountSessionManager.get(accountID).getCacheController();
cache.deleteStatus(s.id);
E.post(new StatusDeletedEvent(s.id, accountID));
if(status!=s){
cache.deleteStatus(status.id);
E.post(new StatusDeletedEvent(status.id, accountID));
}
}
@Override
public void onError(ErrorResponse error) {
@@ -797,11 +800,12 @@ public class UiUtils {
} else if (relationship.muting) {
confirmToggleMuteUser(activity, accountID, account, true, resultCallback);
} else {
Runnable action=()->{
progressCallback.accept(true);
new SetAccountFollowed(account.id, !relationship.following && !relationship.requested, true, false)
.setCallback(new Callback<>() {
new SetAccountFollowed(account.id, !relationship.following && !relationship.requested, true)
.setCallback(new Callback<>(){
@Override
public void onSuccess(Relationship result) {
public void onSuccess(Relationship result){
resultCallback.accept(result);
progressCallback.accept(false);
if(!result.following && !result.requested){
@@ -810,12 +814,18 @@ public class UiUtils {
}
@Override
public void onError(ErrorResponse error) {
public void onError(ErrorResponse error){
error.showToast(activity);
progressCallback.accept(false);
}
})
.exec(accountID);
};
if(relationship.following && GlobalUserPreferences.confirmUnfollow){
showConfirmationAlert(activity, null, activity.getString(R.string.unfollow_confirmation, account.getDisplayUsername()), activity.getString(R.string.unfollow), R.drawable.ic_fluent_person_delete_24_regular, action);
}else{
action.run();
}
}
}
@@ -1711,7 +1721,7 @@ public class UiUtils {
}
public static Optional<String> extractPronouns(Context context, @Nullable Account account) {
if (account == null) return Optional.empty();
if (account==null || account.fields==null) return Optional.empty();
String localizedPronouns=context.getString(R.string.sk_pronouns_label).toLowerCase();
// higher = worse. the lowest number wins. also i'm sorry for writing this

View File

@@ -4,11 +4,12 @@ import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
import android.media.MediaMetadataRetriever;
import android.net.Uri;
import android.os.Build;
@@ -19,6 +20,7 @@ import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewOutlineProvider;
import android.widget.HorizontalScrollView;
import android.widget.ImageButton;
import android.widget.ImageView;
@@ -27,8 +29,8 @@ import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.DrawableRes;
import androidx.annotation.StringRes;
import org.joinmastodon.android.MastodonApp;
import org.joinmastodon.android.R;
@@ -51,11 +53,8 @@ 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;
@@ -204,6 +203,15 @@ public class ComposeMediaViewController{
}
}
private void updateButton(ImageButton btn, @DrawableRes int drawableId, @StringRes int labelId){
btn.setImageResource(drawableId);
String label=fragment.getContext().getString(labelId);
btn.setContentDescription(label);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
btn.setTooltipText(label);
}
}
private View createMediaAttachmentView(DraftMediaAttachment draft){
View thumb=fragment.getActivity().getLayoutInflater().inflate(R.layout.compose_media_thumb, attachmentsView, false);
ImageView img=thumb.findViewById(R.id.thumb);
@@ -231,12 +239,11 @@ public class ComposeMediaViewController{
draft.removeButton.setOnClickListener(this::onRemoveMediaAttachmentClick);
draft.editButton.setTag(draft);
thumb.setOutlineProvider(OutlineProviders.roundedRect(12));
thumb.setOutlineProvider(ViewOutlineProvider.BACKGROUND);
thumb.setClipToOutline(true);
img.setOutlineProvider(OutlineProviders.roundedRect(12));
img.setClipToOutline(true);
thumb.setBackgroundColor(UiUtils.getThemeColor(fragment.getActivity(), R.attr.colorM3Surface));
thumb.setOnLongClickListener(v->{
if(!v.hasTransientState() && attachments.size()>1){
attachmentsView.startDragging(v);
@@ -266,11 +273,11 @@ public class ComposeMediaViewController{
draft.subtitleView.setText(subtitleRes);
}
draft.titleView.setText(fragment.getString(R.string.attachment_x_percent_uploaded, 0));
draft.removeButton.setImageResource(R.drawable.ic_baseline_close_24);
updateButton(draft.removeButton, R.drawable.ic_fluent_dismiss_24_regular, R.string.delete);
if(draft.state==AttachmentUploadState.ERROR){
draft.titleView.setText(R.string.upload_failed);
draft.editButton.setImageResource(R.drawable.ic_fluent_arrow_counterclockwise_24_regular);
updateButton(draft.removeButton, R.drawable.ic_fluent_arrow_counterclockwise_24_regular, R.string.retry);
draft.editButton.setOnClickListener(this::onRetryOrCancelMediaUploadClick);
draft.progressBar.setVisibility(View.GONE);
draft.setUseErrorColors(true);
@@ -280,7 +287,7 @@ public class ComposeMediaViewController{
draft.editButton.setOnClickListener(this::onEditMediaDescriptionClick);
}else{
draft.editButton.setVisibility(View.GONE);
draft.removeButton.setImageResource(R.drawable.ic_baseline_close_24);
updateButton(draft.removeButton, R.drawable.ic_fluent_dismiss_24_regular, R.string.delete);
if(draft.state==AttachmentUploadState.PROCESSING){
draft.titleView.setText(R.string.upload_processing);
}else{
@@ -374,7 +381,7 @@ public class ComposeMediaViewController{
// attachment.retryButton.setContentDescription(fragment.getString(R.string.retry_upload));
V.setVisibilityAnimated(attachment.editButton, View.VISIBLE);
attachment.editButton.setImageResource(R.drawable.ic_fluent_arrow_counterclockwise_24_regular);
updateButton(attachment.editButton, R.drawable.ic_fluent_arrow_counterclockwise_24_regular, R.string.retry);
attachment.editButton.setOnClickListener(ComposeMediaViewController.this::onRetryOrCancelMediaUploadClick);
attachment.setUseErrorColors(true);
V.setVisibilityAnimated(attachment.progressBar, View.GONE);
@@ -478,8 +485,8 @@ public class ComposeMediaViewController{
throw new IllegalStateException("Unexpected state "+attachment.state);
attachment.uploadRequest=null;
attachment.state=AttachmentUploadState.DONE;
attachment.editButton.setImageResource(R.drawable.ic_fluent_edit_24_regular);
attachment.removeButton.setImageResource(R.drawable.ic_fluent_delete_24_regular);
updateButton(attachment.editButton, R.drawable.ic_fluent_edit_24_regular, R.string.sk_edit_alt_text);
updateButton(attachment.removeButton, R.drawable.ic_fluent_dismiss_24_regular, R.string.delete);
attachment.editButton.setOnClickListener(this::onEditMediaDescriptionClick);
V.setVisibilityAnimated(attachment.progressBar, View.GONE);
V.setVisibilityAnimated(attachment.editButton, View.VISIBLE);
@@ -708,18 +715,21 @@ public class ComposeMediaViewController{
if(errorTransitionAnimator!=null)
errorTransitionAnimator.cancel();
AnimatorSet set=new AnimatorSet();
int color1, color2, color3;
int defaultBg=UiUtils.getThemeColor(view.getContext(), R.attr.colorM3Surface);
int errorBg=UiUtils.getThemeColor(view.getContext(), R.attr.colorM3ErrorContainer);
int color2, color3;
if(use){
color1=UiUtils.getThemeColor(view.getContext(), R.attr.colorM3ErrorContainer);
color2=UiUtils.getThemeColor(view.getContext(), R.attr.colorM3Error);
color3=UiUtils.getThemeColor(view.getContext(), R.attr.colorM3OnErrorContainer);
}else{
color1=UiUtils.getThemeColor(view.getContext(), R.attr.colorM3Surface);
color2=UiUtils.getThemeColor(view.getContext(), R.attr.colorM3OnSurface);
color3=UiUtils.getThemeColor(view.getContext(), R.attr.colorM3OnSurfaceVariant);
}
GradientDrawable bg=(GradientDrawable) view.getBackground().mutate();
ValueAnimator bgAnim=ValueAnimator.ofArgb(use ? defaultBg : errorBg, use ? errorBg : defaultBg);
bgAnim.addUpdateListener(anim->bg.setColor((Integer) anim.getAnimatedValue()));
set.playTogether(
ObjectAnimator.ofArgb(view, "backgroundColor", ((ColorDrawable)view.getBackground()).getColor(), color1),
bgAnim,
ObjectAnimator.ofArgb(titleView, "textColor", titleView.getCurrentTextColor(), color2),
ObjectAnimator.ofArgb(subtitleView, "textColor", subtitleView.getCurrentTextColor(), color3),
ObjectAnimator.ofArgb(removeButton.getDrawable(), "tint", subtitleView.getCurrentTextColor(), color3)

View File

@@ -6,6 +6,7 @@ import android.app.Fragment;
import android.content.Intent;
import android.graphics.drawable.Animatable;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.text.SpannableStringBuilder;
import android.text.style.TypefaceSpan;
@@ -25,6 +26,7 @@ import org.joinmastodon.android.GlobalUserPreferences;
import org.joinmastodon.android.R;
import org.joinmastodon.android.api.requests.accounts.SetAccountFollowed;
import org.joinmastodon.android.api.session.AccountSessionManager;
import org.joinmastodon.android.fragments.ListsFragment;
import org.joinmastodon.android.fragments.ProfileFragment;
import org.joinmastodon.android.fragments.report.ReportReasonChoiceFragment;
import org.joinmastodon.android.model.Account;
@@ -98,6 +100,9 @@ public class AccountViewHolder extends BindableViewHolder<AccountViewModel> impl
contextMenu=new PopupMenu(fragment.getActivity(), menuAnchor);
contextMenu.inflate(R.menu.profile);
contextMenu.setOnMenuItemClickListener(this::onContextMenuItemSelected);
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.P && !UiUtils.isEMUI())
contextMenu.getMenu().setGroupDividerEnabled(true);
UiUtils.enablePopupMenuIcons(fragment.getContext(), contextMenu);
setStyle(AccessoryType.BUTTON, false);
}
@@ -212,14 +217,20 @@ public class AccountViewHolder extends BindableViewHolder<AccountViewModel> impl
Menu menu=contextMenu.getMenu();
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()));
MenuItem mute=menu.findItem(R.id.mute);
mute.setTitle(fragment.getString(relationship.muting ? R.string.unmute_user : R.string.mute_user, account.getShortUsername()));
mute.setIcon(relationship.muting ? R.drawable.ic_fluent_speaker_0_24_regular : R.drawable.ic_fluent_speaker_off_24_regular);
UiUtils.insetPopupMenuIcon(fragment.getContext(), mute);
menu.findItem(R.id.block).setTitle(fragment.getString(relationship.blocking ? R.string.unblock_user : R.string.block_user, account.getShortUsername()));
menu.findItem(R.id.report).setTitle(fragment.getString(R.string.report_user, account.getShortUsername()));
menu.findItem(R.id.manage_user_lists).setVisible(relationship.following);
menu.findItem(R.id.soft_block).setVisible(relationship.followedBy && !relationship.following);
MenuItem hideBoosts=menu.findItem(R.id.hide_boosts);
if(relationship.following){
hideBoosts.setTitle(fragment.getString(relationship.showingReblogs ? R.string.hide_boosts_from_user : R.string.show_boosts_from_user, account.getDisplayUsername()));
hideBoosts.setTitle(fragment.getString(relationship.showingReblogs ? R.string.hide_boosts_from_user : R.string.show_boosts_from_user, account.getShortUsername()));
hideBoosts.setIcon(relationship.showingReblogs ? R.drawable.ic_fluent_arrow_repeat_all_off_24_regular : R.drawable.ic_fluent_arrow_repeat_all_24_regular);
UiUtils.insetPopupMenuIcon(fragment.getContext(), hideBoosts);
hideBoosts.setVisible(true);
}else{
hideBoosts.setVisible(false);
@@ -274,6 +285,8 @@ public class AccountViewHolder extends BindableViewHolder<AccountViewModel> impl
UiUtils.confirmToggleMuteUser(fragment.getActivity(), accountID, account, relationship.muting, this::updateRelationship);
}else if(id==R.id.block){
UiUtils.confirmToggleBlockUser(fragment.getActivity(), accountID, account, relationship.blocking, this::updateRelationship);
}else if(id==R.id.soft_block){
UiUtils.confirmSoftBlockUser(fragment.getActivity(), accountID, account, this::updateRelationship);
}else if(id==R.id.report){
Bundle args=new Bundle();
args.putString("account", accountID);
@@ -303,6 +316,12 @@ public class AccountViewHolder extends BindableViewHolder<AccountViewModel> impl
})
.wrapProgress(fragment.getActivity(), R.string.loading, false)
.exec(accountID);
}else if(id==R.id.manage_user_lists){
final Bundle args=new Bundle();
args.putString("account", accountID);
args.putString("profileAccount", account.id);
args.putString("profileDisplayUsername", account.getDisplayUsername());
Nav.go(fragment.getActivity(), ListsFragment.class, args);
}
return true;
}

View File

@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="?colorM3Surface" />
<stroke android:color="?colorM3OutlineVariant" android:width="1dp"/>
<corners android:radius="11dp"/>
<corners android:radius="12dp"/>
</shape>

View File

@@ -1,5 +0,0 @@
<vector android:height="24dp" android:tint="#000000"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z"/>
</vector>

View File

@@ -5,8 +5,7 @@
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:clipToPadding="false"
android:paddingHorizontal="16dp"
android:paddingBottom="4dp">
android:paddingHorizontal="16dp">
<Button
android:id="@+id/language_btn"
@@ -18,14 +17,17 @@
android:drawableStart="@drawable/ic_fluent_local_language_16_regular"
android:drawablePadding="8dp"
android:drawableTint="?colorM3OnSurfaceVariant"
android:contentDescription="@string/language"
android:tooltipText="@string/language"
android:textColor="?colorM3OnSurfaceVariant" />
<ImageButton
android:id="@+id/drafts_btn"
style="@style/Widget.Mastodon.M3.Button.Text"
android:background="@drawable/bg_button_m3_text_circle"
android:layout_width="40dp"
android:layout_width="48dp"
android:layout_height="match_parent"
android:layout_marginStart="-6dp"
android:src="@drawable/ic_fluent_clock_20_regular"
android:tint="?colorM3OnSurfaceVariant"
android:contentDescription="@string/sk_schedule_or_draft"
@@ -37,7 +39,7 @@
android:id="@+id/publish_btn"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginStart="8dp"
android:layout_marginStart="6dp"
android:singleLine="true"
android:ellipsize="end" />

View File

@@ -3,7 +3,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:foreground="@drawable/fg_compose_attachment">
android:background="@drawable/bg_compose_attachment">
<View
android:id="@+id/drag_layer"
@@ -18,6 +18,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/title"
android:layout_margin="1dp"
android:scaleType="centerCrop"
android:importantForAccessibility="no"
tools:src="#0f0"/>
@@ -57,9 +58,11 @@
android:layout_height="48dp"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true"
android:layout_marginEnd="16dp"
android:layout_marginBottom="8dp"
android:src="@drawable/ic_fluent_delete_24_regular"
android:layout_marginEnd="4dp"
android:layout_marginBottom="4dp"
android:contentDescription="@string/delete"
android:tooltipText="@string/delete"
android:src="@drawable/ic_fluent_dismiss_24_regular"
android:tint="?colorM3OnSurfaceVariant"
android:backgroundTint="?colorM3OnSurfaceVariant"
android:background="@drawable/bg_round_ripple"/>
@@ -70,8 +73,9 @@
android:layout_height="48dp"
android:layout_toStartOf="@id/delete"
android:layout_alignParentBottom="true"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:layout_marginBottom="4dp"
android:contentDescription="@string/sk_edit_alt_text"
android:tooltipText="@string/sk_edit_alt_text"
android:src="@drawable/ic_fluent_edit_24_regular"
android:tint="?colorM3OnSurfaceVariant"
android:backgroundTint="?colorM3OnSurfaceVariant"

View File

@@ -1,7 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<org.joinmastodon.android.ui.views.MaxWidthFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<org.joinmastodon.android.ui.views.MaxWidthFrameLayout
android:maxWidth="600sp"
app:defaultWidth="450sp"
android:layout_width="match_parent"
@@ -17,8 +21,8 @@
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingHorizontal="11sp">
<!-- avatar width (46sp) / 2 - button width (24sp) / 2 -->
android:paddingHorizontal="15dp">
<!-- avatar width (46sp) / 2 - button width (24dp) / 2 -->
<FrameLayout
android:layout_weight="1"
@@ -28,12 +32,14 @@
android:id="@+id/reply_btn"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:paddingVertical="12dp">
android:transformPivotX="24dp"
android:transformPivotY="24dp">
<ImageView
android:layout_width="24sp"
android:layout_height="24sp"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center_vertical"
android:layout_marginStart="16dp"
android:layout_marginVertical="12dp"
android:layout_marginStart="12dp"
android:duplicateParentState="true"
android:src="@drawable/ic_fluent_chat_multiple_24_selector_text"
android:tint="?colorM3OnSurfaceVariant"
@@ -44,7 +50,7 @@
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:paddingStart="8dp"
android:minWidth="16dp"
android:minWidth="12dp"
android:gravity="center_vertical"
android:textAppearance="@style/m3_label_large"
android:textColor="?colorM3OnSurfaceVariant"
@@ -63,12 +69,14 @@
android:id="@+id/boost_btn"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:paddingVertical="12dp">
android:transformPivotX="24dp"
android:transformPivotY="24dp">
<ImageView
android:layout_width="24sp"
android:layout_height="24sp"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center_vertical"
android:layout_marginStart="16dp"
android:layout_marginVertical="12dp"
android:layout_marginStart="12dp"
android:duplicateParentState="true"
android:src="@drawable/ic_boost"
android:tint="@color/boost_icon"
@@ -79,7 +87,7 @@
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:paddingStart="8dp"
android:minWidth="16dp"
android:minWidth="12dp"
android:duplicateParentState="true"
android:textColor="@color/boost_icon"
android:gravity="center_vertical"
@@ -99,13 +107,15 @@
android:id="@+id/favorite_btn"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:paddingVertical="12dp">
android:transformPivotX="24dp"
android:transformPivotY="24dp">
<ImageView
android:id="@+id/favorite_icon"
android:layout_width="24sp"
android:layout_height="24sp"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center_vertical"
android:layout_marginStart="16dp"
android:layout_marginVertical="12dp"
android:layout_marginStart="12dp"
android:duplicateParentState="true"
android:src="@drawable/ic_fluent_star_24_selector"
android:tint="@color/favorite_icon"
@@ -116,7 +126,7 @@
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:paddingStart="8dp"
android:minWidth="16dp"
android:minWidth="12dp"
android:textColor="@color/favorite_icon"
android:gravity="center_vertical"
android:textAppearance="@style/m3_label_large"
@@ -135,13 +145,14 @@
android:id="@+id/bookmark_btn"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:paddingVertical="12dp">
android:transformPivotX="24dp"
android:transformPivotY="24dp">
<ImageView
android:id="@+id/bookmark"
android:layout_width="24sp"
android:layout_height="24sp"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center_vertical"
android:layout_marginHorizontal="16dp"
android:layout_margin="12dp"
android:src="@drawable/ic_fluent_bookmark_24_selector"
android:tint="@color/bookmark_icon"
android:gravity="center_vertical"
@@ -153,13 +164,15 @@
android:id="@+id/share_btn"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:paddingVertical="12dp">
android:transformPivotX="24dp"
android:transformPivotY="24dp">
<ImageView
android:id="@+id/share"
android:layout_width="24sp"
android:layout_height="24sp"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center_vertical"
android:layout_marginHorizontal="16dp"
android:layout_marginVertical="12dp"
android:layout_marginHorizontal="12dp"
android:src="@drawable/ic_fluent_share_24_regular"
android:tint="?colorM3OnSurfaceVariant"
android:gravity="center_vertical"/>
@@ -173,6 +186,9 @@
android:id="@+id/footer_emoji_keyboard_container"
android:orientation="vertical">
</LinearLayout>
</GridLayout>
</org.joinmastodon.android.ui.views.MaxWidthFrameLayout>
</org.joinmastodon.android.ui.views.MaxWidthFrameLayout>
</FrameLayout>

View File

@@ -13,8 +13,7 @@
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="64dp"
android:gravity="center_vertical"
android:background="?android:selectableItemBackground">
android:gravity="center_vertical">
<ImageView
android:id="@+id/icon"

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<org.joinmastodon.android.ui.views.AutoOrientationLinearLayout
<org.joinmastodon.android.ui.views.HeaderSubtitleLinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
@@ -47,4 +47,4 @@
android:singleLine="true"
android:ellipsize="end"/>
</org.joinmastodon.android.ui.views.AutoOrientationLinearLayout>
</org.joinmastodon.android.ui.views.HeaderSubtitleLinearLayout>

View File

@@ -470,6 +470,8 @@
android:layout_height="48dp"
android:background="@drawable/bg_icon_button"
android:padding="0px"
android:tint="@color/action_bar_icons"
android:tintMode="src_in"
android:contentDescription="@string/add_media"
android:tooltipText="@string/add_media"
android:src="@drawable/ic_fluent_image_add_24_regular"/>
@@ -480,6 +482,8 @@
android:layout_height="48dp"
android:background="@drawable/bg_icon_button"
android:padding="0px"
android:tint="@color/action_bar_icons"
android:tintMode="src_in"
android:contentDescription="@string/add_poll"
android:tooltipText="@string/add_poll"
android:src="@drawable/ic_fluent_poll_24_selector"/>
@@ -490,6 +494,8 @@
android:layout_height="48dp"
android:background="@drawable/bg_icon_button"
android:padding="0px"
android:tint="@color/action_bar_icons"
android:tintMode="src_in"
android:contentDescription="@string/emoji"
android:tooltipText="@string/emoji"
android:src="@drawable/ic_fluent_emoji_24_selector"/>
@@ -500,6 +506,8 @@
android:layout_height="48dp"
android:background="@drawable/bg_icon_button"
android:padding="0px"
android:tint="@color/action_bar_icons"
android:tintMode="src_in"
android:contentDescription="@string/content_warning"
android:tooltipText="@string/content_warning"
android:src="@drawable/ic_fluent_chat_warning_24_selector"/>
@@ -510,6 +518,8 @@
android:layout_height="48dp"
android:background="@drawable/bg_icon_button"
android:padding="0px"
android:tint="@color/action_bar_icons"
android:tintMode="src_in"
android:contentDescription="@string/sk_content_type"
android:tooltipText="@string/sk_content_type"
android:src="@drawable/ic_fluent_text_edit_style_24_selector"/>

View File

@@ -291,20 +291,18 @@
android:id="@+id/profile_counters"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp">
android:layout_marginHorizontal="4dp">
<LinearLayout
style="@style/Widget.Mastodon.M3.Button.Text"
android:id="@+id/followers_btn"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:background="@drawable/bg_button_borderless_rounded"
android:layout_height="wrap_content"
android:minHeight="48dp"
android:gravity="center_horizontal"
android:orientation="horizontal"
android:paddingLeft="8dp"
android:paddingTop="4dp"
android:paddingRight="8dp"
android:paddingBottom="4dp">
android:paddingStart="12dp"
android:paddingEnd="12dp">
<TextView
android:id="@+id/followers_count"
@@ -335,6 +333,7 @@
android:id="@+id/profile_counters_separator"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:layout_marginHorizontal="-4dp"
android:gravity="center"
android:text="@string/sk_separator"
android:textAppearance="@style/m3_label_large"
@@ -342,16 +341,15 @@
android:textColor="?colorM3OnSurfaceVariant" />
<LinearLayout
style="@style/Widget.Mastodon.M3.Button.Text"
android:id="@+id/following_btn"
android:layout_width="wrap_content"
android:layout_height="48dp"
android:background="@drawable/bg_button_borderless_rounded"
android:layout_height="wrap_content"
android:minHeight="48dp"
android:gravity="center_horizontal"
android:orientation="horizontal"
android:paddingLeft="8dp"
android:paddingTop="4dp"
android:paddingRight="8dp"
android:paddingBottom="4dp">
android:paddingStart="12dp"
android:paddingEnd="12dp">
<TextView
android:id="@+id/following_count"
@@ -359,11 +357,11 @@
android:layout_height="match_parent"
android:layout_marginEnd="4dp"
android:ellipsize="end"
android:textAppearance="@style/m3_label_large"
android:fontFamily="sans-serif-black"
android:gravity="center_vertical"
android:singleLine="true"
android:textColor="?colorM3OnSurfaceVariant"
android:textSize="14dp"
tools:text="123" />
<TextView

View File

@@ -128,9 +128,9 @@
android:layout_weight="1"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:layout_marginTop="6dp"
android:layout_marginStart="16dp"
android:layout_gravity="bottom"
android:paddingTop="4dp"
android:paddingTop="3dp"
android:gravity="center_vertical"
android:minHeight="44dp">
@@ -142,23 +142,66 @@
android:layout_marginEnd="8dp"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:id="@+id/posts_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="@style/m3_title_medium"
android:singleLine="true"
android:layout_height="match_parent"
android:layout_marginEnd="4dp"
android:ellipsize="end"
android:textAppearance="@style/m3_label_large"
android:fontFamily="sans-serif-black"
android:gravity="center_vertical"
android:singleLine="true"
android:textColor="?colorM3OnSurfaceVariant"
tools:text="123" />
<TextView
android:id="@+id/posts_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="4sp"
android:textAppearance="@style/m3_body_large"
android:singleLine="true"
android:layout_height="match_parent"
android:ellipsize="middle"
android:gravity="center_vertical"
android:singleLine="true"
android:textAppearance="@style/m3_label_large"
android:textColor="?colorM3OnSurfaceVariant"
tools:text="posts" />
</LinearLayout>
<LinearLayout
android:id="@+id/followers_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:layout_marginEnd="8dp"
android:orientation="horizontal"
android:gravity="center_vertical">
<TextView
android:id="@+id/followers_count"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginEnd="4dp"
android:ellipsize="end"
android:textAppearance="@style/m3_label_large"
android:fontFamily="sans-serif-black"
android:gravity="center_vertical"
android:singleLine="true"
android:textColor="?colorM3OnSurfaceVariant"
tools:text="123" />
<TextView
android:id="@+id/followers_label"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:ellipsize="middle"
android:gravity="center_vertical"
android:singleLine="true"
android:textAppearance="@style/m3_label_large"
android:textColor="?colorM3OnSurfaceVariant"
tools:text="followers" />
</LinearLayout>
<LinearLayout
@@ -169,50 +212,33 @@
android:layout_marginEnd="8dp"
android:orientation="horizontal"
android:gravity="center_vertical">
<TextView
android:id="@+id/following_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="@style/m3_title_medium"
android:singleLine="true"
android:layout_height="match_parent"
android:layout_marginEnd="4dp"
android:ellipsize="end"
tools:text="123"/>
android:textAppearance="@style/m3_label_large"
android:fontFamily="sans-serif-black"
android:gravity="center_vertical"
android:singleLine="true"
android:textColor="?colorM3OnSurfaceVariant"
tools:text="123" />
<TextView
android:id="@+id/following_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="4sp"
android:textAppearance="@style/m3_body_large"
android:singleLine="true"
android:layout_height="match_parent"
android:ellipsize="middle"
tools:text="following"/>
android:gravity="center_vertical"
android:singleLine="true"
android:textAppearance="@style/m3_label_large"
android:textColor="?colorM3OnSurfaceVariant"
tools:text="following" />
</LinearLayout>
<LinearLayout
android:id="@+id/followers_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:orientation="horizontal"
android:gravity="center_vertical">
<TextView
android:id="@+id/followers_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="@style/m3_title_medium"
android:singleLine="true"
android:ellipsize="end"
tools:text="123"/>
<TextView
android:id="@+id/followers_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="4sp"
android:textAppearance="@style/m3_body_large"
android:singleLine="true"
android:ellipsize="middle"
tools:text="followers"/>
</LinearLayout>
</org.joinmastodon.android.ui.views.AutoOrientationLinearLayout>
<FrameLayout
@@ -223,7 +249,7 @@
android:paddingStart="8dp"
android:paddingEnd="4dp"
android:clipToPadding="false"
android:paddingBottom="8dp"
android:paddingBottom="10dp"
android:visibility="gone">
<org.joinmastodon.android.ui.views.ProgressBarButton
@@ -260,7 +286,7 @@
android:paddingStart="4dp"
android:paddingEnd="16dp"
android:clipToPadding="false"
android:paddingBottom="8dp"
android:paddingBottom="10dp"
android:visibility="gone">
<org.joinmastodon.android.ui.views.ProgressBarButton
@@ -296,7 +322,7 @@
android:layout_gravity="bottom"
android:paddingStart="8dp"
android:paddingEnd="16dp"
android:paddingBottom="8dp"
android:paddingBottom="10dp"
android:clipToPadding="false">
<org.joinmastodon.android.ui.views.ProgressBarButton

View File

@@ -35,7 +35,7 @@
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="end|top"
android:src="@drawable/ic_baseline_close_24"
android:src="@drawable/ic_fluent_dismiss_24_regular"
android:tint="?colorM3DarkOnSurface"
android:background="?android:actionBarItemBackground"/>

View File

@@ -170,7 +170,6 @@
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:layout_marginEnd="8dp"
android:paddingTop="12dp"
android:paddingBottom="16dp"
android:tooltipText="@string/sk_tab_profile"

View File

@@ -1,15 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:id="@+id/menu_group1">
<item android:id="@+id/open_with_account" android:title="@string/sk_open_with_account" android:visible="false" android:icon="@drawable/ic_fluent_person_swap_24_regular">
<menu android:id="@+id/accounts" />
</item>
<item android:id="@+id/share" android:title="@string/share_user" android:icon="@drawable/ic_fluent_share_24_regular"/>
<item android:id="@+id/open_in_browser" android:title="@string/open_in_browser" android:icon="@drawable/ic_fluent_globe_24_regular"/>
</group>
<group android:id="@+id/menu_group2">
<item android:id="@+id/manage_user_lists" android:title="@string/sk_lists_with_user" android:icon="@drawable/ic_fluent_people_24_regular"/>
<item android:id="@+id/mute" android:title="@string/mute_user" android:icon="@drawable/ic_fluent_speaker_off_24_regular"/>
<item android:id="@+id/hide_boosts" android:title="@string/hide_boosts_from_user" android:icon="@drawable/ic_fluent_arrow_repeat_all_off_24_regular"/>
<item android:id="@+id/block" android:title="@string/block_user" android:icon="@drawable/ic_fluent_person_prohibited_24_regular"/>
<item android:id="@+id/soft_block" android:title="@string/sk_remove_follower" android:icon="@drawable/ic_fluent_person_delete_24_regular"/>
<item android:id="@+id/report" android:title="@string/report_user" android:icon="@drawable/ic_fluent_warning_24_regular"/>
<item android:id="@+id/block_domain" android:title="@string/block_domain" android:icon="@drawable/ic_fluent_shield_prohibited_24_regular"/>
<item android:id="@+id/hide_boosts" android:title="@string/hide_boosts_from_user" android:icon="@drawable/ic_fluent_arrow_repeat_all_off_24_regular"/>
<item android:id="@+id/open_in_browser" android:title="@string/open_in_browser" android:icon="@drawable/ic_fluent_globe_24_regular"/>
</group>
</menu>

View File

@@ -38,7 +38,7 @@
<string name="sk_settings_enable_marquee">Laufschrift in Titelleisten deaktivieren</string>
<string name="sk_settings_contribute">Zu Megalodon beitragen</string>
<string name="sk_settings_show_federated_timeline">Föderierte Timeline anzeigen</string>
<string name="sk_notification_type_posts">Beitrags-Benachrichtigungen</string>
<string name="sk_notification_type_posts">Beitrags-Benachrichtigungen</string>
<string name="sk_settings_color_palette">Farbschema</string>
<string name="sk_color_palette_pink">Pink</string>
<string name="sk_color_palette_purple">Violett</string>

View File

@@ -599,7 +599,21 @@
<item quantity="one">%,d ανάρτηση σήμερα</item>
<item quantity="other">%,d αναρτήσεις σήμερα</item>
</plurals>
<string name="error_playing_video">Σφάλμα αναπαραγωγής βίντεο</string>
<string name="timeline_following">Ακολουθείς</string>
<string name="lists">Λίστες</string>
<string name="followed_hashtags">Ετικέτες που ακολουθούνται</string>
<string name="no_lists">Δεν έχεις καμία λίστα ακόμα.</string>
<string name="no_followed_hashtags">Δεν ακολουθείς καμία ετικέτα.</string>
<string name="manage_lists">Διαχείριση λιστών</string>
<string name="manage_hashtags">Διαχείριση ετικετών</string>
<!-- Screen reader description for the menu on the home timeline screen -->
<string name="dropdown_menu">Αναπτυσσόμενο μενού</string>
<string name="edit_list">Επεξεργασία λίστας</string>
<string name="list_members">Μέλη λίστας</string>
<string name="delete_list">Διαγραφή λίστας</string>
<!-- %s is the name of the list -->
<string name="delete_list_confirm">Διαγραφή “%s”;</string>
<string name="list_exclusive">Απόκρυψη μελών στο Ακολουθείς</string>
<!-- %s is a username -->
</resources>

View File

@@ -404,4 +404,7 @@
<string name="sk_muted_accounts">Cuentas silenciadas</string>
<string name="sk_settings_like_icon">Utilizar el corazón como icono favorito</string>
<string name="sk_recently_used">Utilizado recientemente</string>
<string name="sk_set_as_default">Establecer por defecto</string>
<string name="sk_settings_color_palette_default">Por defecto (%s)</string>
<string name="sk_settings_underlined_links">Enlaces subrayados</string>
</resources>

View File

@@ -402,7 +402,10 @@
<string name="sk_time_days">%d jours</string>
<string name="sk_trending_posts_info_banner">Ces publications gagnent actuellement du terrain sur le Fediverse.</string>
<string name="sk_blocked_accounts">Comptes bloqués</string>
<string name="sk_muted_accounts">Comptes silenciés</string>
<string name="sk_muted_accounts">Comptes masqués</string>
<string name="sk_settings_like_icon">Utiliser le cœur comme icône pour les favoris</string>
<string name="sk_recently_used">Utilisé récemment</string>
<string name="sk_set_as_default">Définir par défaut</string>
<string name="sk_settings_color_palette_default">Par défaut (%s)</string>
<string name="sk_settings_underlined_links">Liens soulignés</string>
</resources>

View File

@@ -396,6 +396,9 @@
<string name="sk_post_contains_media">Kiriman berisi media</string>
<string name="sk_blocked_accounts">Akun yang diblokir</string>
<string name="sk_muted_accounts">Akun yang dibisukan</string>
<string name="sk_settings_like_icon">Gunakam hati sebagai ikon favorit</string>
<string name="sk_settings_like_icon">Gunakan hati sebagai ikon favorit</string>
<string name="sk_recently_used">Baru-baru ini digunakan</string>
<string name="sk_set_as_default">Tetapkan sebagai bawaan</string>
<string name="sk_settings_color_palette_default">Bawaan (%s)</string>
<string name="sk_settings_underlined_links">Tautan yang digarisbawahi</string>
</resources>

View File

@@ -401,4 +401,7 @@
<string name="sk_muted_accounts">Conturi amuțite</string>
<string name="sk_settings_like_icon">Folosiți inimă ca iconița favorite</string>
<string name="sk_recently_used">Recent folosit</string>
<string name="sk_set_as_default">Setați ca implicit</string>
<string name="sk_settings_color_palette_default">Implicit (%s)</string>
<string name="sk_settings_underlined_links">Link-uri subliniate</string>
</resources>

View File

@@ -4,17 +4,18 @@
<string name="next">Nästa</string>
<string name="loading_instance">Hämtar serverinfo…</string>
<string name="error">Fel</string>
<string name="not_a_mastodon_instance">%s verkar inte vara en mastodon server.</string>
<string name="not_a_mastodon_instance">%s verkar inte vara en mastodonserver.</string>
<string name="ok">OK</string>
<string name="preparing_auth">Förbereder för autentisering…</string>
<string name="finishing_auth">Slutför autentisering…</string>
<string name="user_boosted">%s boostade</string>
<string name="in_reply_to">Som svar på %s</string>
<string name="notifications">Notiser</string>
<string name="notifications">Aviseringar</string>
<string name="user_followed_you">%s följde dig</string>
<string name="user_sent_follow_request">%s skickade en förfrågan om att följa dig</string>
<string name="user_favorited">%s favoritmarkerade ditt inlägg</string>
<string name="notification_boosted">%s boostade ditt inlägg</string>
<string name="poll_ended">Se resultatet av en omröstning du röstade i</string>
<string name="share_toot_title">Dela</string>
<string name="settings">Inställningar</string>
<string name="publish">Publicera</string>
@@ -105,7 +106,7 @@
<string name="do_unblock">Avblockera</string>
<string name="button_blocked">Blockerad</string>
<string name="action_vote">Rösta</string>
<string name="delete">Radera</string>
<string name="delete">Ta bort</string>
<string name="confirm_delete_title">Radera inlägg</string>
<string name="confirm_delete">Är du säker på att du vill radera detta inlägg?</string>
<string name="deleting">Raderar…</string>
@@ -118,12 +119,15 @@
<string name="hashtags">Hashtaggar</string>
<string name="news">Nyheter</string>
<string name="for_you">För dig</string>
<string name="all_notifications">Alla</string>
<string name="mentions">Omnämningar</string>
<plurals name="x_people_talking">
<item quantity="one">%d person pratar</item>
<item quantity="other">%d personer pratar</item>
</plurals>
<string name="report_title">Rapportera %s</string>
<string name="report_choose_reason">Vad är fel med det här inlägget?</string>
<string name="report_choose_reason_account">Vad är fel med %s?</string>
<string name="report_choose_reason_subtitle">Välj den bästa träffen</string>
<string name="report_reason_personal">Jag gillar det inte</string>
<string name="report_reason_personal_subtitle">Det är inget som du vill se</string>
@@ -131,6 +135,7 @@
<string name="report_reason_spam_subtitle">Skadliga länkar, bedrägligt beteende eller repetitiva svar</string>
<string name="report_reason_violation">Det bryter mot serverns regler</string>
<string name="report_reason_violation_subtitle">Du är medveten om att det bryter mot specifika regler</string>
<string name="report_reason_other">Det är något annat</string>
<string name="report_reason_other_subtitle">Frågan passar inte in i andra kategorier</string>
<string name="report_choose_rule">Vilka regler överträds?</string>
<string name="report_choose_rule_subtitle">Välj alla som stämmer</string>
@@ -139,9 +144,14 @@
<string name="report_comment_title">Finns det något annat vi borde veta?</string>
<string name="report_comment_hint">Ytterligare kommentarer</string>
<string name="sending_report">Skickar rapport…</string>
<string name="report_sent_title">Tack för att du rapporterar, vi kommer att titta på detta.</string>
<string name="report_sent_subtitle">Medan vi granskar detta kan du vidta åtgärder mot %s:</string>
<string name="unfollow_user">Avfölj %s</string>
<string name="unfollow">Avfölj</string>
<string name="mute_user_explain">Du kommer inte se deras inlägg. De kan fortfarande följa dig och se dina inlägg. De kommer inte veta att de är tystade.</string>
<string name="block_user_explain">Du kommer inte se deras inlägg. De kommer inte kunna se dina inlägg eller följa dig. De kommer kunna se att de är blockerade.</string>
<string name="report_personal_title">Vill du inte se detta?</string>
<string name="report_personal_subtitle">Här är dina alternativ för att bestämma vad du ser på Mastodon:</string>
<string name="back">Tillbaka</string>
<string name="search_communities">Servernamn eller URL</string>
<string name="instance_rules_title">Serverregler</string>
@@ -168,19 +178,23 @@
<string name="category_tech">Teknik</string>
<string name="confirm_email_title">Kolla din inkorg</string>
<!-- %s is the email address -->
<string name="confirm_email_subtitle">Klicka på länken som vi har skickat till dig för att bekräfta %s. Vi väntar här.</string>
<string name="confirm_email_didnt_get">Fick du ingen länk?</string>
<string name="resend">Skicka igen</string>
<string name="open_email_app">Öppna e-postappen</string>
<string name="resent_email">Bekräftelse via e-post skickad</string>
<string name="compose_hint">Skriv eller klistra in vad du har på hjärtat</string>
<string name="content_warning">Innehållsvarning</string>
<string name="save">Spara</string>
<string name="add_alt_text">Lägg till alternativtext</string>
<string name="visibility_public">Offentlig</string>
<string name="visibility_followers_only">Endast följare</string>
<string name="visibility_private">Bara omnämnda personer</string>
<string name="recent_searches">Nyligen</string>
<string name="skip">Hoppa över</string>
<string name="notification_type_follow">Nya följare</string>
<string name="notification_type_favorite">Favoriter</string>
<string name="notification_type_reblog">Boostar</string>
<string name="notification_type_mention">Omnämningar</string>
<string name="notification_type_poll">Omröstningar</string>
<string name="choose_account">Välj konto</string>
@@ -188,6 +202,7 @@
<string name="media_attachment_unsupported_type">Filen %s är av en typ som inte stöds</string>
<string name="media_attachment_too_big">Filen %1$s överskrider storleksgränsen på %2$s MB</string>
<string name="settings_theme">Utseende</string>
<string name="theme_auto">Använd systeminställning</string>
<string name="theme_light">Ljust</string>
<string name="theme_dark">Mörkt</string>
<string name="settings_behavior">Beteende</string>
@@ -201,6 +216,8 @@
<string name="settings_app_version">Mastodon för Android v%1$s (%2$d)</string>
<string name="media_cache_cleared">Mediacache rensad</string>
<string name="confirm_log_out">Logga ut från %s?</string>
<string name="sensitive_content_explain">Författaren markerade detta medium som känsligt.</string>
<string name="avatar_description">Gå till %ss profil</string>
<string name="more_options">Fler alternativ</string>
<string name="new_post">Nytt inlägg</string>
<string name="button_reply">Svara</string>
@@ -217,7 +234,10 @@
<string name="follow_user">Följ %s</string>
<string name="unfollowed_user">Avföljde %s</string>
<string name="followed_user">Du följer nu %s</string>
<string name="following_user_requested">Begär att följa %s</string>
<string name="open_in_browser">Öppna i webbläsare</string>
<string name="hide_boosts_from_user">Dölj boostar från %s</string>
<string name="show_boosts_from_user">Visa boostar från %s</string>
<string name="signup_reason">Varför vill du gå med?</string>
<string name="signup_reason_note">Detta kommer hjälpa oss att granska din ansökan.</string>
<string name="clear">Rensa</string>
@@ -231,7 +251,12 @@
<string name="error_saving_file">Fel vid sparande av fil</string>
<string name="file_saved">Filen sparad</string>
<string name="downloading">Laddar ner…</string>
<string name="no_app_to_handle_action">Det finns ingen app för att hantera denna åtgärd</string>
<string name="local_timeline">Lokal</string>
<string name="trending_posts_info_banner">Detta är de inlägg som engagerar på Mastodon.</string>
<string name="trending_links_info_banner">Det här är nyheterna som det talas om på Mastodon.</string>
<!-- %s is the server domain -->
<string name="local_timeline_info_banner">Detta är alla inlägg från alla användare på din server (%s).</string>
<string name="recommended_accounts_info_banner">Du kanske gillar dessa konton baserat på andra konton du följer.</string>
<string name="see_new_posts">Se nya inlägg</string>
<string name="load_missing_posts">Ladda saknade inlägg</string>
@@ -306,6 +331,7 @@
<string name="login_title">Välkommen tillbaka</string>
<string name="login_subtitle">Logga in på den server där du skapade ditt konto.</string>
<string name="server_url">Server-URL</string>
<string name="signup_random_server_explain">Vi kommer att välja en server baserat på ditt språk om du fortsätter utan att göra ett val.</string>
<string name="server_filter_any_language">Vilket språk som helst</string>
<string name="server_filter_instant_signup">Omedelbar registrering</string>
<string name="server_filter_manual_review">Manuell granskning</string>
@@ -327,13 +353,16 @@
<string name="popular_on_mastodon">Populärt på Mastodon</string>
<string name="follow_all">Följ alla</string>
<string name="server_rules_disagree">Instämmer inte alls</string>
<string name="privacy_policy_explanation">TL;DR: Vi samlar inte in eller bearbetar något.</string>
<!-- %s is server domain -->
<string name="server_policy_disagree">Håller inte med %s</string>
<string name="profile_bio">Biografi</string>
<!-- Shown in a progress dialog when you tap "follow all" -->
<string name="sending_follows">Följer användare…</string>
<!-- %1$s is server domain, %2$s is email domain. You can reorder these placeholders to fit your language better. -->
<string name="signup_email_domain_blocked">%1$s tillåter inte registrering från %2$s. Prova en annan eller &lt;a&gt;välj en annan server&lt;/a&gt;.</string>
<string name="spoiler_show">Visa ändå</string>
<string name="spoiler_hide">Dölj igen</string>
<string name="poll_multiple_choice">Välj en eller flera</string>
<string name="save_changes">Spara ändringar</string>
<string name="profile_timeline">Tidslinje</string>
@@ -349,9 +378,12 @@
<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="opening_link">Öppnar länk…</string>
<string name="link_not_supported">Denna länk stöds inte i appen</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>
<string name="post_failed">Misslyckades att skapa inlägg</string>
<!-- %s is formatted file size ("467 KB image") -->
<string name="attachment_description_image">%s bild</string>
<string name="attachment_description_video">%s video</string>
@@ -362,33 +394,80 @@
<string name="attachment_type_audio">Ljud</string>
<string name="attachment_type_gif">GIF</string>
<string name="attachment_type_unknown">Fil</string>
<string name="add_poll_option">Lägg till röstningsalternativ</string>
<string name="poll_length">Undersökningens längd</string>
<string name="poll_style">Stil</string>
<string name="compose_poll_single_choice">Välj en</string>
<string name="compose_poll_multiple_choice">Flera val</string>
<string name="delete_poll_option">Ta bort röstningsalternativ</string>
<string name="poll_style_title">Undersökningsstil</string>
<string name="alt_text">Alt-Text</string>
<string name="help">Hjälp</string>
<string name="what_is_alt_text">Vad är alt-text?</string>
<string name="edit_post">Redigera inlägg</string>
<string name="no_verified_link">Ingen verifierad länk</string>
<string name="compose_autocomplete_emoji_empty">Bläddra bland emoji</string>
<string name="compose_autocomplete_users_empty">Hitta den du söker efter</string>
<string name="no_search_results">Kunde inte hitta något för dessa söktermer</string>
<string name="language">Språk</string>
<string name="language_default">Standard</string>
<string name="language_system">System</string>
<string name="language_detecting">Identifiera språk</string>
<string name="language_cant_detect">Det gick inte att identifiera språk</string>
<string name="language_detected">Identifierat</string>
<string name="media_hidden">Dold media</string>
<string name="post_hidden">Inlägg dolt</string>
<string name="report_title_post">Rapportera inlägg</string>
<string name="forward_report_explanation">Kontot kommer från en annan server. Vill du skicka en anonymiserad kopia av rapporten dit också?</string>
<!-- %s is the server domain -->
<string name="forward_report_to_server">Vidarebefordra till %s</string>
<!-- 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="muted_user">Tystade %s</string>
<string name="report_sent_already_blocked">Du har redan blockerat den här användaren, så det finns inget annat du behöver göra medan vi granskar din rapport.</string>
<string name="report_personal_already_blocked">Du har redan blockerat den här användaren, så det finns inget annat du behöver göra.\n\nTack för att du hjälper till att hålla Mastodon en säker plats för alla!</string>
<string name="blocked_user">Blockerade %s</string>
<string name="mark_all_notifications_read">Markera alla som lästa</string>
<string name="settings_display">Skärm</string>
<string name="settings_filters">Filter</string>
<string name="settings_server_explanation">Översikt, regler och moderatorer</string>
<!-- %s is the app name (Mastodon, key app_name). I made it a placeholder so everything Just Works™ with forks -->
<string name="about_app">Om %s</string>
<string name="default_post_language">Standardspråk för inlägg</string>
<string name="settings_alt_text_reminders">Lägg till alt-textpåminnelser</string>
<string name="settings_confirm_unfollow">Fråga innan du avföljer någon</string>
<string name="settings_confirm_boost">Fråga innan du boostar</string>
<string name="settings_confirm_delete_post">Fråga innan du raderar inlägg</string>
<string name="pause_all_notifications">Pausa alla</string>
<string name="pause_notifications_off">Av</string>
<string name="notifications_policy_anyone">Alla</string>
<string name="notifications_policy_followed">Personer som följer dig</string>
<string name="notifications_policy_follower">Personer du följer</string>
<string name="notifications_policy_no_one">Ingen</string>
<string name="settings_notifications_policy">Få aviseringar från</string>
<string name="notification_type_mentions_and_replies">Omnämningar och svar</string>
<string name="pause_all_notifications_title">Pausa alla aviseringar</string>
<plurals name="x_weeks">
<item quantity="one">%d vecka</item>
<item quantity="other">%d veckor</item>
</plurals>
<!-- %1$s is the date (may be relative, e.g. "today" or "yesterday"), %2$s is the time. You can reorder these placeholders if that works better for your language -->
<string name="today">idag</string>
<string name="yesterday">igår</string>
<string name="tomorrow">i morgon</string>
<!-- %s is the timestamp ("tomorrow at 12:34") -->
<!-- %s is the timestamp ("tomorrow at 12:34") -->
<string name="pause_notifications_banner">Aviseringar kommer att återupptas %s.</string>
<string name="resume_notifications_now">Återuppta nu</string>
<string name="open_system_notification_settings">Gå till aviseringsinställningar</string>
<string name="about_server">Om</string>
<string name="server_rules">Regler</string>
<string name="server_administrator">Administratör</string>
<string name="send_email_to_server_admin">Meddela administratör</string>
<string name="settings_even_more">Ännu fler inställningar</string>
<string name="settings_show_cws">Visa innehållsvarningar</string>
<string name="settings_hide_sensitive_media">Dölj media markerad som känsligt</string>
<string name="settings_show_interaction_counts">Antal inläggsinteraktioner</string>
<string name="settings_show_emoji_in_names">Anpassad emoji i visningsnamn</string>
<plurals name="in_x_hours">
<item quantity="one">om %d timme</item>
@@ -398,29 +477,51 @@
<item quantity="one">%d timme sedan</item>
<item quantity="other">%d timmar sedan</item>
</plurals>
<string name="count_one">En</string>
<string name="count_two">Två</string>
<string name="count_three">Tre</string>
<string name="count_four">Fyra</string>
<!-- %s is the username -->
<string name="unfollow_confirmation">Avfölj %s?</string>
<string name="filter_active">Aktiv</string>
<string name="filter_inactive">Inaktiv</string>
<string name="settings_add_filter">Lägg till filter</string>
<string name="settings_edit_filter">Redigera filter</string>
<string name="settings_filter_duration">Varaktighet</string>
<string name="settings_filter_muted_words">Tystade ord</string>
<string name="settings_filter_context">Tysta från</string>
<string name="settings_filter_show_cw">Visa med innehållsvarning</string>
<string name="settings_delete_filter">Radera filter</string>
<string name="filter_duration_forever">För alltid</string>
<!-- %s is the timestamp ("tomorrow at 12:34") -->
<string name="selection_2_options">%1$s och %2$s</string>
<string name="selection_3_options">%1$s, %2$s och %3$s</string>
<string name="filter_context_home_lists">Hem &amp; listor</string>
<string name="filter_context_notifications">Aviseringar</string>
<string name="filter_context_public_timelines">Publika tidslinjer</string>
<string name="filter_context_threads_replies">Trådar &amp; svar</string>
<string name="filter_context_profiles">Profiler</string>
<string name="settings_filter_title">Rubrik</string>
<string name="settings_delete_filter_title">Ta bort filter ”%s”?</string>
<string name="settings_delete_filter_confirmation">Detta filter kommer raderas från ditt konto på alla dina enheter.</string>
<string name="add_muted_word">Lägg till tystat ord</string>
<string name="edit_muted_word">Redigera tystat ord</string>
<string name="add">Lägg till</string>
<string name="filter_word_or_phrase">Ord eller fras</string>
<string name="settings_delete_filter_word">Ta bort ordet ”%s”?</string>
<string name="enter_selection_mode">Välj</string>
<string name="select_all">Välj alla</string>
<string name="settings_filter_duration_title">Filtervaraktighet</string>
<string name="filter_duration_custom">Anpassad</string>
<plurals name="settings_delete_x_filter_words">
<item quantity="one">Radera %d ord?</item>
<item quantity="other">Radera %d ord?</item>
</plurals>
<string name="required_form_field_blank">Får inte vara tomt</string>
<string name="filter_word_already_in_list">Redan finns i listan</string>
<string name="app_update_ready">Appuppdateringen är redo</string>
<string name="app_update_version">Version %s</string>
<string name="downloading_update">Ladda ner (%d%%)</string>
<!-- Shown like a content warning, %s is the name of the filter -->
<string name="post_matches_filter_x">Matchar filter \"%s\"</string>
<string name="search_mastodon">Sök i Mastodon</string>
@@ -428,6 +529,8 @@
<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>
<string name="posts_matching_string">Inlägg med \"%s\"</string>
<string name="accounts_matching_string">Personer med ”%s”</string>
<!-- Shown in the post header. Please keep it short -->
<string name="time_seconds_ago_short">%ds sedan</string>
<string name="time_minutes_ago_short">%dm sedan</string>
@@ -436,7 +539,38 @@
<!-- %s is the name of the post language -->
<string name="translate_post">Översätt från %s</string>
<!-- %1$s is the language, %2$s is the name of the translation service -->
<string name="post_translated">Översatt från %1$s med %2$s</string>
<string name="translation_show_original">Visa original</string>
<string name="translation_failed">Översättningen misslyckades. Det kan hända att administratören inte har aktiverat översättningar på den här servern eller att servern kör en äldre version av Mastodon som inte har stöd för översättningar ännu.</string>
<string name="settings_privacy">Integritet och räckvidd</string>
<string name="settings_indexable">Inkludera offentliga inlägg i sökresultaten</string>
<string name="error_playing_video">Fel vid videouppspelning</string>
<string name="timeline_following">Följer</string>
<string name="lists">Listor</string>
<string name="followed_hashtags">Följda hashtaggar</string>
<string name="no_lists">Du har inga listor ännu.</string>
<string name="no_followed_hashtags">Du följer inga hashtaggar.</string>
<string name="manage_lists">Hantera listor</string>
<string name="manage_hashtags">Hantera hashtaggar</string>
<!-- Screen reader description for the menu on the home timeline screen -->
<string name="dropdown_menu">Nedrullningsmeny</string>
<string name="edit_list">Redigera lista</string>
<string name="list_members">Lista medlemmar</string>
<string name="delete_list">Ta bort lista</string>
<!-- %s is the name of the list -->
<string name="delete_list_confirm">Ta bort “%s”?</string>
<string name="list_exclusive">Dölj medlemmar i Följer</string>
<string name="list_name">Listnamn</string>
<string name="list_show_replies_to">Visa svar till</string>
<string name="list_replies_no_one">Ingen</string>
<string name="list_replies_members">Listmedlemmar</string>
<string name="confirm_remove_list_members">Ta bort medlemmar?</string>
<string name="remove">Ta bort</string>
<string name="add_list_member">Lägg till medlem</string>
<string name="search_among_people_you_follow">Sök bland personer du följer</string>
<string name="add_user_to_list">Lägg till i lista…</string>
<string name="add_user_to_list_title">Lägg till i lista</string>
<!-- %s is a username -->
<string name="remove_from_list">Ta bort från lista</string>
<string name="confirm_remove_list_member">Ta bort medlem?</string>
</resources>

View File

@@ -406,4 +406,7 @@
<string name="sk_muted_accounts">Ігноровані облікові записи</string>
<string name="sk_settings_like_icon">Використовувати серце як піктограму «Вподобане»</string>
<string name="sk_recently_used">Недавно використані</string>
<string name="sk_settings_underlined_links">Підкреслені посилання</string>
<string name="sk_set_as_default">Установити типово</string>
<string name="sk_settings_color_palette_default">Усталена (%s)</string>
</resources>

View File

@@ -397,4 +397,7 @@
<string name="sk_muted_accounts">已静音账号</string>
<string name="sk_settings_like_icon">使用心形作为收藏图标</string>
<string name="sk_recently_used">最近使用</string>
<string name="sk_set_as_default">设为默认</string>
<string name="sk_settings_color_palette_default">默认(%s</string>
<string name="sk_settings_underlined_links">链接加下划线</string>
</resources>

View File

@@ -293,7 +293,7 @@
<string name="sk_expand">Expand</string>
<string name="sk_collapse">Collapse</string>
<string name="sk_settings_collapse_long_posts">Collapse very long posts</string>
<string name="sk_unfinished_attachments">Fix attachments?</string>
<string name="sk_unfinished_attachments">Uploading attachments</string>
<string name="sk_unfinished_attachments_message">Some attachments havent finished uploading.</string>
<string name="sk_settings_hide_interaction">Hide interaction buttons</string>
<string name="sk_follow_as">Follow from other account</string>
@@ -411,4 +411,5 @@
<string name="sk_recently_used">Recently used</string>
<string name="sk_settings_underlined_links">Underlined links</string>
<string name="sk_set_as_default">Set as default</string>
<string name="sk_edit_alt_text">Edit alt text</string>
</resources>

View File

@@ -1,15 +1,16 @@
<b>Mae Megalodon yn fersiwn wedi'i addasu o'r <href="https://github.com/mastodon/mastodon-android"> app swyddogol Mastodon Android </a> gan ychwanegu nodweddion pwysig sydd ar goll yn yr ap swyddogol, megis ffrwd y ffederasiwn, postio heb ei restru a gwyliwr disgrifiad delwedd.
Mae Megalodon yn fersiwn wedi'i addasu o'r <a href="https://github.com/mastodon/mastodon-android">app swyddogol Mastodon Android</a> gan ychwanegu nodweddion pwysig sydd ar goll yn yr ap swyddogol, megis ffrwd y ffederasiwn, postio heb ei restru a gwyliwr disgrifiad delwedd.
Nodweddion allweddol
<b>Nodweddion allweddol</b>
- <b> postio heb ei restru </b>: Postiwch yn gyhoeddus heb gael eich neges yn ymddangos mewn pynciau trendio, hashnodau neu ffrydiau cyhoeddus.
- <b>Postio heb ei restru</b>: Postiwch yn gyhoeddus heb gael eich neges yn ymddangos mewn pynciau trendio, hashnodau neu ffrydiau cyhoeddus.
- <b>Ffrwd y ffederasiwn</b>: Gwelwch yr holl negeseuon cyhoeddus gan bobl ar bob gweinydd arall yn y fydysawd mae eich gweinydd cartref wedi'i gysylltu iddo.
-<b>Ffrydiau personol</b>: Pinio unrhyw restr neu hashnod i dab cartref Megalodon er mwyn llithro rhwng eich hoff bynciau a phobl
- <b>Ffrydiau personol</b>: Pinio unrhyw restr neu hashnod i dab cartref Megalodon er mwyn llithro rhwng eich hoff bynciau a phobl
- <b>Drafftiau a negeseuon wedi'u trefnu</b>: Yn caniatáu paratoi neges a'i threfnu i'w anfon yn awtomatig ar adeg benodol.
- <b>Pinio negeseuon</b>: Piniwch eich negeseuon pwysicaf i'ch proffil a gweld beth mae eraill wedi pinio gan ddefnyddio'r tab "Pinned".
- <b>Dilyn hashnodau</b>: Gweler negeseuon newydd gyda hashnodau penodol yn uniongyrchol yn eich llinell amser cartref trwy eu dilyn.
- <b>Ateb ceisiadau dilyn</b>: Derbyn neu wrthod ceisiadau dilyn yn eich hysbysiadau neu'r rhestr ceisiadau Dilyn pwrpasol.
- <b>Dileu ac ail-ddrafftio</b>: Y nodwedd boblogaidd a wnaeth olygu'n bosibl heb swyddogaeth olygu go iawn. <b>Dewis iaith</b>: Dewiswch iaith yn ddi-boen ar gyfer pob neges rydych chi'n ei gwneud felly mae hidlyddion a chyfieithu yn gweithio'n gywir.
- <b>Dileu ac ail-ddrafftio</b>: Y nodwedd boblogaidd a wnaeth olygu'n bosibl heb swyddogaeth olygu go iawn.
- <b>Dewis iaith</b>: Dewiswch iaith yn ddi-boen ar gyfer pob neges rydych chi'n ei gwneud felly mae hidlyddion a chyfieithu yn gweithio'n gywir.
- <b>Cyfieithu</b>: Cyfieithu negeseuon yn hawdd y tu mewn i Megalodon! Dim ond os yw'r nodwedd ar gael hefyd ar eich gweinydd Mastodon.
- <b>Dangosydd gwelededd neges</b>: Wrth agor neu ateb neges, bydd eicon defnyddiol sy'n nodi gwelededd y neges yn ymddangos.
- <b>Themâu lliw</b>: Oni ddylech chi hoffi'r lliw Pinc diofyn (mae'r siarc yn eich barnu'n dawel), mae themâu lliw Moshidon ar gael.