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" applicationId "org.joinmastodon.android.sk"
minSdk 23 minSdk 23
targetSdk 33 targetSdk 33
versionCode 103 versionCode 105
versionName "2.1.6+fork.103" versionName "2.1.6+fork.105"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 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'] 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 collapseLongPosts;
public static boolean spectatorMode; public static boolean spectatorMode;
public static boolean autoHideFab; public static boolean autoHideFab;
public static boolean compactReblogReplyLine;
public static boolean allowRemoteLoading; public static boolean allowRemoteLoading;
public static boolean forwardReportDefault; public static boolean forwardReportDefault;
public static AutoRevealMode autoRevealEqualSpoilers; public static AutoRevealMode autoRevealEqualSpoilers;
@@ -112,12 +111,11 @@ public class GlobalUserPreferences{
collapseLongPosts=prefs.getBoolean("collapseLongPosts", true); collapseLongPosts=prefs.getBoolean("collapseLongPosts", true);
spectatorMode=prefs.getBoolean("spectatorMode", false); spectatorMode=prefs.getBoolean("spectatorMode", false);
autoHideFab=prefs.getBoolean("autoHideFab", true); autoHideFab=prefs.getBoolean("autoHideFab", true);
compactReblogReplyLine=prefs.getBoolean("compactReblogReplyLine", true);
allowRemoteLoading=prefs.getBoolean("allowRemoteLoading", true); allowRemoteLoading=prefs.getBoolean("allowRemoteLoading", true);
autoRevealEqualSpoilers=AutoRevealMode.valueOf(prefs.getString("autoRevealEqualSpoilers", AutoRevealMode.THREADS.name())); autoRevealEqualSpoilers=AutoRevealMode.valueOf(prefs.getString("autoRevealEqualSpoilers", AutoRevealMode.THREADS.name()));
forwardReportDefault=prefs.getBoolean("forwardReportDefault", true); forwardReportDefault=prefs.getBoolean("forwardReportDefault", true);
disableM3PillActiveIndicator=prefs.getBoolean("disableM3PillActiveIndicator", false); disableM3PillActiveIndicator=prefs.getBoolean("disableM3PillActiveIndicator", false);
showNavigationLabels=prefs.getBoolean("showNavigationLabels", false); showNavigationLabels=prefs.getBoolean("showNavigationLabels", true);
displayPronounsInTimelines=prefs.getBoolean("displayPronounsInTimelines", true); displayPronounsInTimelines=prefs.getBoolean("displayPronounsInTimelines", true);
displayPronounsInThreads=prefs.getBoolean("displayPronounsInThreads", true); displayPronounsInThreads=prefs.getBoolean("displayPronounsInThreads", true);
displayPronounsInUserListings=prefs.getBoolean("displayPronounsInUserListings", true); displayPronounsInUserListings=prefs.getBoolean("displayPronounsInUserListings", true);
@@ -170,7 +168,6 @@ public class GlobalUserPreferences{
.putBoolean("collapseLongPosts", collapseLongPosts) .putBoolean("collapseLongPosts", collapseLongPosts)
.putBoolean("spectatorMode", spectatorMode) .putBoolean("spectatorMode", spectatorMode)
.putBoolean("autoHideFab", autoHideFab) .putBoolean("autoHideFab", autoHideFab)
.putBoolean("compactReblogReplyLine", compactReblogReplyLine)
.putBoolean("allowRemoteLoading", allowRemoteLoading) .putBoolean("allowRemoteLoading", allowRemoteLoading)
.putString("autoRevealEqualSpoilers", autoRevealEqualSpoilers.name()) .putString("autoRevealEqualSpoilers", autoRevealEqualSpoilers.name())
.putBoolean("forwardReportDefault", forwardReportDefault) .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.SetStatusBookmarked;
import org.joinmastodon.android.api.requests.statuses.SetStatusFavorited; import org.joinmastodon.android.api.requests.statuses.SetStatusFavorited;
import org.joinmastodon.android.api.requests.statuses.SetStatusReblogged; 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.StatusCountersUpdatedEvent;
import org.joinmastodon.android.events.StatusCreatedEvent;
import org.joinmastodon.android.events.StatusDeletedEvent;
import org.joinmastodon.android.model.Status; import org.joinmastodon.android.model.Status;
import org.joinmastodon.android.model.StatusPrivacy; import org.joinmastodon.android.model.StatusPrivacy;
@@ -82,7 +85,11 @@ public class StatusInteractionController{
runningReblogRequests.remove(status.id); runningReblogRequests.remove(status.id);
result.reblogsCount = Math.max(0, status.reblogsCount + (reblogged ? 1 : -1)); result.reblogsCount = Math.max(0, status.reblogsCount + (reblogged ? 1 : -1));
cb.accept(result); 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 @Override

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; package org.joinmastodon.android.events;
import org.joinmastodon.android.model.ScheduledStatus;
public class ScheduledStatusDeletedEvent{ public class ScheduledStatusDeletedEvent{
public final String id; public final String id;
public final String accountID; public final String accountID;

View File

@@ -29,7 +29,6 @@ import android.text.TextWatcher;
import android.text.format.DateFormat; import android.text.format.DateFormat;
import android.text.style.BackgroundColorSpan; import android.text.style.BackgroundColorSpan;
import android.text.style.ForegroundColorSpan; import android.text.style.ForegroundColorSpan;
import android.view.HapticFeedbackConstants;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu; import android.view.Menu;
@@ -111,11 +110,11 @@ import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle; import java.time.format.FormatStyle;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Objects; import java.util.Objects;
import java.util.UUID; import java.util.UUID;
import java.util.function.Consumer;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -798,6 +797,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
} }
} }
@SuppressLint("ClickableViewAccessibility")
@Override @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater){ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater){
inflater.inflate(editingStatus==null ? R.menu.compose : R.menu.compose_edit, menu); 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 = wrap.findViewById(R.id.language_btn);
languageButton.setOnClickListener(v->showLanguageAlert()); languageButton.setOnClickListener(v->showLanguageAlert());
languageButton.setOnLongClickListener(v->{ languageButton.setOnLongClickListener(v->{
languageButton.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
if(!getLocalPrefs().bottomEncoding){ if(!getLocalPrefs().bottomEncoding){
getLocalPrefs().bottomEncoding=true; getLocalPrefs().bottomEncoding=true;
getLocalPrefs().save(); getLocalPrefs().save();
} }
return false; return false;
}); });
publishButton.post(()->publishButton.setMinimumWidth(publishButton.getWidth()));
publishButton.setOnClickListener(v->{ publishButton.setOnClickListener(v->{
if(GlobalUserPreferences.altTextReminders && editingStatus==null) Consumer<Boolean> draftCheckComplete=(isDraft)->{
checkAltTextsAndPublish(); if(GlobalUserPreferences.altTextReminders && !isDraft) checkAltTextsAndPublish();
else else publish();
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.setOnClickListener(v-> draftOptionsPopup.show());
draftsBtn.setOnTouchListener(draftOptionsPopup.getDragToOpenListener()); draftsBtn.setOnTouchListener(draftOptionsPopup.getDragToOpenListener());
@@ -853,7 +868,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
: languageResolver.getDefault()); : languageResolver.getDefault());
if(isInstancePixelfed()) spoilerBtn.setVisibility(View.GONE); if(isInstancePixelfed()) spoilerBtn.setVisibility(View.GONE);
if (isInstancePixelfed() || (editingStatus != null && scheduledStatus == null)) { if(isInstancePixelfed() || (editingStatus!=null && !redraftStatus)) {
// editing an already published post // editing an already published post
draftsBtn.setVisibility(View.GONE); draftsBtn.setVisibility(View.GONE);
} }
@@ -977,7 +992,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
@Override @Override
protected int getNavigationIconDrawableResource(){ protected int getNavigationIconDrawableResource(){
return R.drawable.ic_baseline_close_24; return R.drawable.ic_fluent_dismiss_24_regular;
} }
@Override @Override
@@ -1053,9 +1068,6 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
} }
private void actuallyPublish(){ private void actuallyPublish(){
actuallyPublish(false);
}
private void actuallyPublish(boolean force){
String text=mainEditText.getText().toString(); String text=mainEditText.getText().toString();
CreateStatus.Request req=new CreateStatus.Request(); CreateStatus.Request req=new CreateStatus.Request();
if("bottom".equals(postLang.encoding)){ if("bottom".equals(postLang.encoding)){
@@ -1079,19 +1091,6 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
req.mediaAttributes=mediaViewController.getAttachmentAttributes(); 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)){ if(replyTo!=null || (editingStatus != null && editingStatus.inReplyToId!=null)){
req.inReplyToId=editingStatus!=null ? editingStatus.inReplyToId : replyTo.id; req.inReplyToId=editingStatus!=null ? editingStatus.inReplyToId : replyTo.id;
} }
@@ -1290,7 +1289,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
if(attachmentsPending) new M3AlertDialogBuilder(getActivity()) if(attachmentsPending) new M3AlertDialogBuilder(getActivity())
.setTitle(R.string.sk_unfinished_attachments) .setTitle(R.string.sk_unfinished_attachments)
.setMessage(R.string.sk_unfinished_attachments_message) .setMessage(R.string.sk_unfinished_attachments_message)
.setPositiveButton(R.string.edit, (d, w) -> {}) .setPositiveButton(R.string.ok, (d, w)->{})
.setNegativeButton(R.string.discard, (d, w)->Nav.finish(this)) .setNegativeButton(R.string.discard, (d, w)->Nav.finish(this))
.show(); .show();
else new M3AlertDialogBuilder(getActivity()) else new M3AlertDialogBuilder(getActivity())

View File

@@ -400,10 +400,9 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab
addListsToOverflowMenu(); addListsToOverflowMenu();
addHashtagsToOverflowMenu(); 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); m.setGroupDividerEnabled(true);
} }
}
@Override @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater){ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater){

View File

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

@@ -762,12 +762,13 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
getActivity(), s.getID(), account.url, false getActivity(), s.getID(), account.url, false
)); ));
} }
menu.findItem(R.id.share).setTitle(R.string.share_user);
if(isOwnProfile) { if(isOwnProfile) {
if (isInstancePixelfed()) menu.findItem(R.id.scheduled).setVisible(false); if (isInstancePixelfed()) menu.findItem(R.id.scheduled).setVisible(false);
return; return;
} }
menu.findItem(R.id.manage_user_lists).setTitle(getString(R.string.sk_lists_with_user, account.getShortUsername()));
MenuItem mute=menu.findItem(R.id.mute); MenuItem mute=menu.findItem(R.id.mute);
mute.setTitle(getString(relationship.muting ? R.string.unmute_user : R.string.mute_user, account.getShortUsername())); mute.setTitle(getString(relationship.muting ? R.string.unmute_user : R.string.mute_user, account.getShortUsername()));
mute.setIcon(relationship.muting ? R.drawable.ic_fluent_speaker_0_24_regular : R.drawable.ic_fluent_speaker_off_24_regular); mute.setIcon(relationship.muting ? R.drawable.ic_fluent_speaker_0_24_regular : R.drawable.ic_fluent_speaker_off_24_regular);
@@ -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.report).setTitle(getString(R.string.report_user, account.getShortUsername()));
menu.findItem(R.id.manage_user_lists).setVisible(relationship.following); menu.findItem(R.id.manage_user_lists).setVisible(relationship.following);
menu.findItem(R.id.soft_block).setVisible(relationship.followedBy && !relationship.following); menu.findItem(R.id.soft_block).setVisible(relationship.followedBy && !relationship.following);
if (relationship.following) {
MenuItem hideBoosts=menu.findItem(R.id.hide_boosts); MenuItem hideBoosts=menu.findItem(R.id.hide_boosts);
if (relationship.following) {
hideBoosts.setTitle(getString(relationship.showingReblogs ? R.string.hide_boosts_from_user : R.string.show_boosts_from_user, account.getShortUsername())); hideBoosts.setTitle(getString(relationship.showingReblogs ? R.string.hide_boosts_from_user : R.string.show_boosts_from_user, account.getShortUsername()));
hideBoosts.setIcon(relationship.showingReblogs ? R.drawable.ic_fluent_arrow_repeat_all_off_24_regular : R.drawable.ic_fluent_arrow_repeat_all_24_regular); hideBoosts.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); 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 { } 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 @Override
@@ -800,11 +804,11 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
intent.putExtra(Intent.EXTRA_TEXT, account.url); intent.putExtra(Intent.EXTRA_TEXT, account.url);
startActivity(Intent.createChooser(intent, item.getTitle())); startActivity(Intent.createChooser(intent, item.getTitle()));
}else if(id==R.id.mute){ }else if(id==R.id.mute){
confirmToggleMuted(); UiUtils.confirmToggleMuteUser(getActivity(), accountID, account, relationship.muting, this::updateRelationship);
}else if(id==R.id.block){ }else if(id==R.id.block){
confirmToggleBlocked(); UiUtils.confirmToggleBlockUser(getActivity(), accountID, account, relationship.blocking, this::updateRelationship);
}else if(id==R.id.soft_block){ }else if(id==R.id.soft_block){
confirmSoftBlockUser(); UiUtils.confirmSoftBlockUser(getActivity(), accountID, account, this::updateRelationship);
}else if(id==R.id.report){ }else if(id==R.id.report){
Bundle args=new Bundle(); Bundle args=new Bundle();
args.putString("account", accountID); args.putString("account", accountID);
@@ -1101,7 +1105,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
updateMetadataHeight(); updateMetadataHeight();
Toolbar toolbar=getToolbar(); 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)); close.setTint(UiUtils.getThemeColor(getToolbarContext(), R.attr.colorM3OnSurfaceVariant));
toolbar.setNavigationIcon(close); toolbar.setNavigationIcon(close);
toolbar.setNavigationContentDescription(R.string.discard); toolbar.setNavigationContentDescription(R.string.discard);
@@ -1207,18 +1211,6 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
.exec(accountID); .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){ private void updateRelationship(Relationship r){
relationship=r; relationship=r;
updateRelationship(); 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 @Override
protected void doLoadData(int offset, int count){ protected void doLoadData(int offset, int count){
currentRequest=new GetScheduledStatuses(offset==0 ? null : nextMaxID, 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.api.session.AccountSessionManager;
import org.joinmastodon.android.events.EmojiReactionsUpdatedEvent; import org.joinmastodon.android.events.EmojiReactionsUpdatedEvent;
import org.joinmastodon.android.events.PollUpdatedEvent; import org.joinmastodon.android.events.PollUpdatedEvent;
import org.joinmastodon.android.events.ReblogDeletedEvent;
import org.joinmastodon.android.events.RemoveAccountPostsEvent; import org.joinmastodon.android.events.RemoveAccountPostsEvent;
import org.joinmastodon.android.events.StatusCountersUpdatedEvent; import org.joinmastodon.android.events.StatusCountersUpdatedEvent;
import org.joinmastodon.android.events.StatusCreatedEvent; import org.joinmastodon.android.events.StatusCreatedEvent;
@@ -28,6 +29,7 @@ import org.joinmastodon.android.ui.displayitems.TextStatusDisplayItem;
import org.parceler.Parcels; import org.parceler.Parcels;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; 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); Status s=getStatusByID(id);
return s==null ? null : s.getContentStatus(); return s==null ? null : s.getContentStatus();
} }
protected Status getStatusByID(String id){ public Status getStatusByID(String id){
for(Status s:data){ for(Status s:data){
if(s.id.equals(id)){ if(s.id.equals(id)){
return s; return s;
@@ -174,43 +176,58 @@ public abstract class StatusListFragment extends BaseStatusListFragment<Status>
} }
} }
protected void removeStatus(Status status){ private void iterateRemoveStatus(List<Status> l, String id){
data.remove(status); Iterator<Status> it=l.iterator();
preloadedData.remove(status); while(it.hasNext()){
int index=-1, ancestorFirstIndex = -1, ancestorLastIndex = -1; if(it.next().getContentStatus().id.equals(id)){
for(int i=0;i<displayItems.size();i++){ it.remove();
StatusDisplayItem item = displayItems.get(i);
if(status.id.equals(item.parentID)){
index=i;
break;
} }
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? // did we find an ancestor that is also the status' neighbor?
if(ancestorFirstIndex>=0 && ancestorLastIndex==index-1){ if(ancestorFirstIndex>=0 && ancestorLastIndex==index-1){
for(int i=ancestorFirstIndex; i<=ancestorLastIndex; i++){ for(int i=ancestorFirstIndex; i<=ancestorLastIndex; i++){
StatusDisplayItem item=displayItems.get(i); StatusDisplayItem item=displayItems.get(i);
String id=deleteContent ? item.getContentID() : item.parentID;
// update ancestor to have no descendant anymore // 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) if(index==-1) return;
return;
int lastIndex; int lastIndex;
for(lastIndex=index;lastIndex<displayItems.size();lastIndex++){ for(lastIndex=index;lastIndex<displayItems.size();lastIndex++){
if(!displayItems.get(lastIndex).parentID.equals(status.id)) StatusDisplayItem item=displayItems.get(lastIndex);
break; String id=deleteContent ? item.getContentID() : item.parentID;
if(!id.equals(status.id)) break;
} }
displayItems.subList(index, lastIndex).clear(); displayItems.subList(index, lastIndex).clear();
adapter.notifyItemRangeRemoved(index, lastIndex-index); 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 @Override
public void onConfigurationChanged(Configuration newConfig) { public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig); super.onConfigurationChanged(newConfig);
@@ -277,6 +294,18 @@ public abstract class StatusListFragment extends BaseStatusListFragment<Status>
removeStatus(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 @Subscribe
public void onStatusCreated(StatusCreatedEvent ev){ public void onStatusCreated(StatusCreatedEvent ev){
if(!ev.accountID.equals(accountID)) if(!ev.accountID.equals(accountID))

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -167,7 +167,7 @@ public class SettingsBehaviorFragment extends BaseSettingsFragment<Void> impleme
GlobalUserPreferences.overlayMedia=overlayMediaItem.checked; GlobalUserPreferences.overlayMedia=overlayMediaItem.checked;
GlobalUserPreferences.useCustomTabs=customTabsItem.checked; GlobalUserPreferences.useCustomTabs=customTabsItem.checked;
GlobalUserPreferences.altTextReminders=altTextItem.checked; GlobalUserPreferences.altTextReminders=altTextItem.checked;
GlobalUserPreferences.confirmUnfollow=customTabsItem.checked; GlobalUserPreferences.confirmUnfollow=confirmUnfollowItem.checked;
GlobalUserPreferences.confirmBoost=confirmBoostItem.checked; GlobalUserPreferences.confirmBoost=confirmBoostItem.checked;
GlobalUserPreferences.confirmDeletePost=confirmDeleteItem.checked; GlobalUserPreferences.confirmDeletePost=confirmDeleteItem.checked;
GlobalUserPreferences.forwardReportDefault=forwardReportsItem.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)); searchLayout.addView(searchEdit, new LinearLayout.LayoutParams(0, ViewGroup.LayoutParams.MATCH_PARENT, 1f));
clearSearchButton=new ImageButton(context); 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.setContentDescription(context.getString(R.string.clear));
clearSearchButton.setImageTintList(ColorStateList.valueOf(UiUtils.getThemeColor(context, R.attr.colorM3OnSurfaceVariant))); clearSearchButton.setImageTintList(ColorStateList.valueOf(UiUtils.getThemeColor(context, R.attr.colorM3OnSurfaceVariant)));
clearSearchButton.setBackground(UiUtils.getThemeDrawable(toolbarContext, android.R.attr.actionBarItemBackground)); clearSearchButton.setBackground(UiUtils.getThemeDrawable(toolbarContext, android.R.attr.actionBarItemBackground));

View File

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

View File

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

View File

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

View File

@@ -209,7 +209,6 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
}else if(item.scheduledStatus!=null){ }else if(item.scheduledStatus!=null){
args.putString("sourceText", item.status.text); args.putString("sourceText", item.status.text);
args.putString("sourceSpoiler", item.status.spoilerText); args.putString("sourceSpoiler", item.status.spoilerText);
args.putBoolean("redraftStatus", true);
args.putParcelable("scheduledStatus", Parcels.wrap(item.scheduledStatus)); args.putParcelable("scheduledStatus", Parcels.wrap(item.scheduledStatus));
Nav.go(item.parentFragment.getActivity(), ComposeFragment.class, args); Nav.go(item.parentFragment.getActivity(), ComposeFragment.class, args);
}else{ }else{
@@ -243,7 +242,7 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
if (item.scheduledStatus != null) { if (item.scheduledStatus != null) {
UiUtils.confirmDeleteScheduledPost(item.parentFragment.getActivity(), item.parentFragment.getAccountID(), item.scheduledStatus, ()->{}); UiUtils.confirmDeleteScheduledPost(item.parentFragment.getActivity(), item.parentFragment.getAccountID(), item.scheduledStatus, ()->{});
} else { } 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) { }else if(id==R.id.pin || id==R.id.unpin) {
UiUtils.confirmPinPost(item.parentFragment.getActivity(), item.parentFragment.getAccountID(), item.status, !item.status.pinned, s->{}); 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.util.TypedValue;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import org.joinmastodon.android.GlobalUserPreferences;
import org.joinmastodon.android.R; import org.joinmastodon.android.R;
import org.joinmastodon.android.api.session.AccountSessionManager; import org.joinmastodon.android.api.session.AccountSessionManager;
import org.joinmastodon.android.fragments.BaseStatusListFragment; import org.joinmastodon.android.fragments.BaseStatusListFragment;
@@ -40,7 +38,7 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{
private StatusPrivacy visibility; private StatusPrivacy visibility;
@DrawableRes @DrawableRes
private int iconEnd; private int iconEnd;
private CustomEmojiHelper emojiHelper=new CustomEmojiHelper(), fullTextEmojiHelper; private CustomEmojiHelper emojiHelper=new CustomEmojiHelper();
private View.OnClickListener handleClick; private View.OnClickListener handleClick;
public boolean needBottomPadding; public boolean needBottomPadding;
ReblogOrReplyLineStatusDisplayItem extra; ReblogOrReplyLineStatusDisplayItem extra;
@@ -58,21 +56,13 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{
HtmlParser.parseCustomEmoji(ssb, emojis); HtmlParser.parseCustomEmoji(ssb, emojis);
this.text=ssb; this.text=ssb;
emojiHelper.setText(ssb); emojiHelper.setText(ssb);
this.fullText=fullText;
this.icon=icon; this.icon=icon;
this.status=status; this.status=status;
this.handleClick=handleClick; this.handleClick=handleClick;
TypedValue outValue = new TypedValue(); TypedValue outValue = new TypedValue();
context.getTheme().resolveAttribute(android.R.attr.selectableItemBackground, outValue, true); context.getTheme().resolveAttribute(android.R.attr.selectableItemBackground, outValue, true);
updateVisibility(visibility); 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) { public void updateVisibility(StatusPrivacy visibility) {
@@ -92,34 +82,27 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{
@Override @Override
public int getImageCount(){ public int getImageCount(){
return emojiHelper.getImageCount(); return emojiHelper.getImageCount() + (extra!=null ? extra.emojiHelper.getImageCount() : 0);
} }
@Override @Override
public ImageLoaderRequest getImageRequest(int index){ 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{ public static class Holder extends StatusDisplayItem.Holder<ReblogOrReplyLineStatusDisplayItem> implements ImageLoaderViewHolder{
private final TextView text, extraText; private final TextView text, extraText;
private final View separator; private final View separator;
private final ViewGroup parent;
public Holder(Activity activity, ViewGroup parent){ public Holder(Activity activity, ViewGroup parent){
super(activity, R.layout.display_item_reblog_or_reply_line, parent); super(activity, R.layout.display_item_reblog_or_reply_line, parent);
this.parent = parent;
text=findViewById(R.id.text); text=findViewById(R.id.text);
extraText=findViewById(R.id.extra_text); extraText=findViewById(R.id.extra_text);
separator=findViewById(R.id.separator); 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) { private void bindLine(ReblogOrReplyLineStatusDisplayItem item, TextView text) {
if (item.fullText != null) text.setContentDescription(item.fullText);
text.setText(item.text); text.setText(item.text);
text.setCompoundDrawablesRelativeWithIntrinsicBounds(item.icon, 0, item.iconEnd, 0); text.setCompoundDrawablesRelativeWithIntrinsicBounds(item.icon, 0, item.iconEnd, 0);
text.setOnClickListener(item.handleClick); text.setOnClickListener(item.handleClick);
@@ -133,7 +116,10 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{
case LOCAL -> R.string.sk_local_only; case LOCAL -> R.string.sk_local_only;
default -> 0; default -> 0;
} : 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) if(Build.VERSION.SDK_INT<Build.VERSION_CODES.N)
UiUtils.fixCompoundDrawableTintOnAndroid6(text); UiUtils.fixCompoundDrawableTintOnAndroid6(text);
text.setCompoundDrawableTintList(text.getTextColors()); text.setCompoundDrawableTintList(text.getTextColors());
@@ -146,31 +132,14 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{
extraText.setVisibility(item.extra == null ? View.GONE : View.VISIBLE); extraText.setVisibility(item.extra == null ? View.GONE : View.VISIBLE);
separator.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); 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 @Override
public void setImage(int index, Drawable image){ 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(); text.invalidate();
extraText.invalidate();
} }
@Override @Override

View File

@@ -13,6 +13,8 @@ import android.text.TextUtils;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import androidx.annotation.NonNull;
import org.joinmastodon.android.GlobalUserPreferences; import org.joinmastodon.android.GlobalUserPreferences;
import org.joinmastodon.android.R; import org.joinmastodon.android.R;
import org.joinmastodon.android.api.session.AccountLocalPreferences; 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.HomeTabFragment;
import org.joinmastodon.android.fragments.ListTimelineFragment; import org.joinmastodon.android.fragments.ListTimelineFragment;
import org.joinmastodon.android.fragments.ProfileFragment; import org.joinmastodon.android.fragments.ProfileFragment;
import org.joinmastodon.android.fragments.StatusListFragment;
import org.joinmastodon.android.fragments.ThreadFragment; import org.joinmastodon.android.fragments.ThreadFragment;
import org.joinmastodon.android.model.Account; import org.joinmastodon.android.model.Account;
import org.joinmastodon.android.model.Attachment; import org.joinmastodon.android.model.Attachment;
@@ -88,6 +91,16 @@ public abstract class StatusDisplayItem{
this.parentFragment=parentFragment; 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 abstract Type getType();
public int getImageCount(){ public int getImageCount(){
@@ -129,7 +142,7 @@ public abstract class StatusDisplayItem{
String parentID = parent.getID(); String parentID = parent.getID();
String text = threadReply ? fragment.getString(R.string.sk_show_thread) String text = threadReply ? fragment.getString(R.string.sk_show_thread)
: account == null ? fragment.getString(R.string.sk_in_reply) : 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); : fragment.getString(R.string.in_reply_to, account.displayName);
String fullText = threadReply ? fragment.getString(R.string.sk_show_thread) String fullText = threadReply ? fragment.getString(R.string.sk_show_thread)
: account == null ? fragment.getString(R.string.sk_in_reply) : account == null ? fragment.getString(R.string.sk_in_reply)
@@ -164,7 +177,7 @@ public abstract class StatusDisplayItem{
if(status.reblog!=null){ if(status.reblog!=null){
boolean isOwnPost = AccountSessionManager.getInstance().isSelf(fragment.getAccountID(), status.account); boolean isOwnPost = AccountSessionManager.getInstance().isSelf(fragment.getAccountID(), status.account);
String fullText = fragment.getString(R.string.user_boosted, status.account.displayName); 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->{ 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)); args.putParcelable("profileAccount", Parcels.wrap(status.account));
Nav.go(fragment.getActivity(), ProfileFragment.class, args); Nav.go(fragment.getActivity(), ProfileFragment.class, args);
@@ -192,7 +205,7 @@ public abstract class StatusDisplayItem{
.map(ReblogOrReplyLineStatusDisplayItem.class::cast) .map(ReblogOrReplyLineStatusDisplayItem.class::cast)
.findFirst(); .findFirst();
if (primaryLine.isPresent() && GlobalUserPreferences.compactReblogReplyLine) { if (primaryLine.isPresent()) {
primaryLine.get().extra = replyLine; primaryLine.get().extra = replyLine;
} else { } else {
items.add(replyLine); items.add(replyLine);

View File

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

View File

@@ -68,6 +68,7 @@ import org.joinmastodon.android.E;
import org.joinmastodon.android.GlobalUserPreferences; import org.joinmastodon.android.GlobalUserPreferences;
import org.joinmastodon.android.MastodonApp; import org.joinmastodon.android.MastodonApp;
import org.joinmastodon.android.R; import org.joinmastodon.android.R;
import org.joinmastodon.android.api.CacheController;
import org.joinmastodon.android.api.MastodonAPIRequest; import org.joinmastodon.android.api.MastodonAPIRequest;
import org.joinmastodon.android.api.MastodonErrorResponse; import org.joinmastodon.android.api.MastodonErrorResponse;
import org.joinmastodon.android.api.StatusInteractionController; import org.joinmastodon.android.api.StatusInteractionController;
@@ -625,24 +626,26 @@ public class UiUtils {
.show(); .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) { public static void confirmDeletePost(Activity activity, String accountID, Status status, Consumer<Status> resultCallback, boolean forRedraft) {
Status s=status.getContentStatus();
showConfirmationAlert(activity, showConfirmationAlert(activity,
forRedraft ? R.string.sk_confirm_delete_and_redraft_title : R.string.confirm_delete_title, 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_confirm_delete_and_redraft : R.string.confirm_delete,
forRedraft ? R.string.sk_delete_and_redraft : R.string.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, 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<>() { .setCallback(new Callback<>() {
@Override @Override
public void onSuccess(Status result) { public void onSuccess(Status result) {
resultCallback.accept(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)); E.post(new StatusDeletedEvent(status.id, accountID));
} }
}
@Override @Override
public void onError(ErrorResponse error) { public void onError(ErrorResponse error) {
@@ -797,8 +800,9 @@ public class UiUtils {
} else if (relationship.muting) { } else if (relationship.muting) {
confirmToggleMuteUser(activity, accountID, account, true, resultCallback); confirmToggleMuteUser(activity, accountID, account, true, resultCallback);
} else { } else {
Runnable action=()->{
progressCallback.accept(true); progressCallback.accept(true);
new SetAccountFollowed(account.id, !relationship.following && !relationship.requested, true, false) new SetAccountFollowed(account.id, !relationship.following && !relationship.requested, true)
.setCallback(new Callback<>(){ .setCallback(new Callback<>(){
@Override @Override
public void onSuccess(Relationship result){ public void onSuccess(Relationship result){
@@ -816,6 +820,12 @@ public class UiUtils {
} }
}) })
.exec(accountID); .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) { 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(); String localizedPronouns=context.getString(R.string.sk_pronouns_label).toLowerCase();
// higher = worse. the lowest number wins. also i'm sorry for writing this // 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.AnimatorListenerAdapter;
import android.animation.AnimatorSet; import android.animation.AnimatorSet;
import android.animation.ObjectAnimator; import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.content.Context; import android.content.Context;
import android.database.Cursor; import android.database.Cursor;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
import android.media.MediaMetadataRetriever; import android.media.MediaMetadataRetriever;
import android.net.Uri; import android.net.Uri;
import android.os.Build; import android.os.Build;
@@ -19,6 +20,7 @@ import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.ViewOutlineProvider;
import android.widget.HorizontalScrollView; import android.widget.HorizontalScrollView;
import android.widget.ImageButton; import android.widget.ImageButton;
import android.widget.ImageView; import android.widget.ImageView;
@@ -27,8 +29,8 @@ import android.widget.ProgressBar;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.DrawableRes;
import androidx.annotation.Nullable; import androidx.annotation.StringRes;
import org.joinmastodon.android.MastodonApp; import org.joinmastodon.android.MastodonApp;
import org.joinmastodon.android.R; import org.joinmastodon.android.R;
@@ -51,11 +53,8 @@ import org.parceler.Parcel;
import org.parceler.Parcels; import org.parceler.Parcels;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.ListIterator;
import java.util.Locale; import java.util.Locale;
import java.util.Objects; import java.util.Objects;
import java.util.function.Consumer; 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){ private View createMediaAttachmentView(DraftMediaAttachment draft){
View thumb=fragment.getActivity().getLayoutInflater().inflate(R.layout.compose_media_thumb, attachmentsView, false); View thumb=fragment.getActivity().getLayoutInflater().inflate(R.layout.compose_media_thumb, attachmentsView, false);
ImageView img=thumb.findViewById(R.id.thumb); ImageView img=thumb.findViewById(R.id.thumb);
@@ -231,12 +239,11 @@ public class ComposeMediaViewController{
draft.removeButton.setOnClickListener(this::onRemoveMediaAttachmentClick); draft.removeButton.setOnClickListener(this::onRemoveMediaAttachmentClick);
draft.editButton.setTag(draft); draft.editButton.setTag(draft);
thumb.setOutlineProvider(OutlineProviders.roundedRect(12)); thumb.setOutlineProvider(ViewOutlineProvider.BACKGROUND);
thumb.setClipToOutline(true); thumb.setClipToOutline(true);
img.setOutlineProvider(OutlineProviders.roundedRect(12)); img.setOutlineProvider(OutlineProviders.roundedRect(12));
img.setClipToOutline(true); img.setClipToOutline(true);
thumb.setBackgroundColor(UiUtils.getThemeColor(fragment.getActivity(), R.attr.colorM3Surface));
thumb.setOnLongClickListener(v->{ thumb.setOnLongClickListener(v->{
if(!v.hasTransientState() && attachments.size()>1){ if(!v.hasTransientState() && attachments.size()>1){
attachmentsView.startDragging(v); attachmentsView.startDragging(v);
@@ -266,11 +273,11 @@ public class ComposeMediaViewController{
draft.subtitleView.setText(subtitleRes); draft.subtitleView.setText(subtitleRes);
} }
draft.titleView.setText(fragment.getString(R.string.attachment_x_percent_uploaded, 0)); 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){ if(draft.state==AttachmentUploadState.ERROR){
draft.titleView.setText(R.string.upload_failed); 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.editButton.setOnClickListener(this::onRetryOrCancelMediaUploadClick);
draft.progressBar.setVisibility(View.GONE); draft.progressBar.setVisibility(View.GONE);
draft.setUseErrorColors(true); draft.setUseErrorColors(true);
@@ -280,7 +287,7 @@ public class ComposeMediaViewController{
draft.editButton.setOnClickListener(this::onEditMediaDescriptionClick); draft.editButton.setOnClickListener(this::onEditMediaDescriptionClick);
}else{ }else{
draft.editButton.setVisibility(View.GONE); 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){ if(draft.state==AttachmentUploadState.PROCESSING){
draft.titleView.setText(R.string.upload_processing); draft.titleView.setText(R.string.upload_processing);
}else{ }else{
@@ -374,7 +381,7 @@ public class ComposeMediaViewController{
// attachment.retryButton.setContentDescription(fragment.getString(R.string.retry_upload)); // attachment.retryButton.setContentDescription(fragment.getString(R.string.retry_upload));
V.setVisibilityAnimated(attachment.editButton, View.VISIBLE); 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.editButton.setOnClickListener(ComposeMediaViewController.this::onRetryOrCancelMediaUploadClick);
attachment.setUseErrorColors(true); attachment.setUseErrorColors(true);
V.setVisibilityAnimated(attachment.progressBar, View.GONE); V.setVisibilityAnimated(attachment.progressBar, View.GONE);
@@ -478,8 +485,8 @@ public class ComposeMediaViewController{
throw new IllegalStateException("Unexpected state "+attachment.state); throw new IllegalStateException("Unexpected state "+attachment.state);
attachment.uploadRequest=null; attachment.uploadRequest=null;
attachment.state=AttachmentUploadState.DONE; attachment.state=AttachmentUploadState.DONE;
attachment.editButton.setImageResource(R.drawable.ic_fluent_edit_24_regular); updateButton(attachment.editButton, R.drawable.ic_fluent_edit_24_regular, R.string.sk_edit_alt_text);
attachment.removeButton.setImageResource(R.drawable.ic_fluent_delete_24_regular); updateButton(attachment.removeButton, R.drawable.ic_fluent_dismiss_24_regular, R.string.delete);
attachment.editButton.setOnClickListener(this::onEditMediaDescriptionClick); attachment.editButton.setOnClickListener(this::onEditMediaDescriptionClick);
V.setVisibilityAnimated(attachment.progressBar, View.GONE); V.setVisibilityAnimated(attachment.progressBar, View.GONE);
V.setVisibilityAnimated(attachment.editButton, View.VISIBLE); V.setVisibilityAnimated(attachment.editButton, View.VISIBLE);
@@ -708,18 +715,21 @@ public class ComposeMediaViewController{
if(errorTransitionAnimator!=null) if(errorTransitionAnimator!=null)
errorTransitionAnimator.cancel(); errorTransitionAnimator.cancel();
AnimatorSet set=new AnimatorSet(); 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){ if(use){
color1=UiUtils.getThemeColor(view.getContext(), R.attr.colorM3ErrorContainer);
color2=UiUtils.getThemeColor(view.getContext(), R.attr.colorM3Error); color2=UiUtils.getThemeColor(view.getContext(), R.attr.colorM3Error);
color3=UiUtils.getThemeColor(view.getContext(), R.attr.colorM3OnErrorContainer); color3=UiUtils.getThemeColor(view.getContext(), R.attr.colorM3OnErrorContainer);
}else{ }else{
color1=UiUtils.getThemeColor(view.getContext(), R.attr.colorM3Surface);
color2=UiUtils.getThemeColor(view.getContext(), R.attr.colorM3OnSurface); color2=UiUtils.getThemeColor(view.getContext(), R.attr.colorM3OnSurface);
color3=UiUtils.getThemeColor(view.getContext(), R.attr.colorM3OnSurfaceVariant); 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( set.playTogether(
ObjectAnimator.ofArgb(view, "backgroundColor", ((ColorDrawable)view.getBackground()).getColor(), color1), bgAnim,
ObjectAnimator.ofArgb(titleView, "textColor", titleView.getCurrentTextColor(), color2), ObjectAnimator.ofArgb(titleView, "textColor", titleView.getCurrentTextColor(), color2),
ObjectAnimator.ofArgb(subtitleView, "textColor", subtitleView.getCurrentTextColor(), color3), ObjectAnimator.ofArgb(subtitleView, "textColor", subtitleView.getCurrentTextColor(), color3),
ObjectAnimator.ofArgb(removeButton.getDrawable(), "tint", 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.content.Intent;
import android.graphics.drawable.Animatable; import android.graphics.drawable.Animatable;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.text.SpannableStringBuilder; import android.text.SpannableStringBuilder;
import android.text.style.TypefaceSpan; import android.text.style.TypefaceSpan;
@@ -25,6 +26,7 @@ import org.joinmastodon.android.GlobalUserPreferences;
import org.joinmastodon.android.R; import org.joinmastodon.android.R;
import org.joinmastodon.android.api.requests.accounts.SetAccountFollowed; import org.joinmastodon.android.api.requests.accounts.SetAccountFollowed;
import org.joinmastodon.android.api.session.AccountSessionManager; import org.joinmastodon.android.api.session.AccountSessionManager;
import org.joinmastodon.android.fragments.ListsFragment;
import org.joinmastodon.android.fragments.ProfileFragment; import org.joinmastodon.android.fragments.ProfileFragment;
import org.joinmastodon.android.fragments.report.ReportReasonChoiceFragment; import org.joinmastodon.android.fragments.report.ReportReasonChoiceFragment;
import org.joinmastodon.android.model.Account; import org.joinmastodon.android.model.Account;
@@ -98,6 +100,9 @@ public class AccountViewHolder extends BindableViewHolder<AccountViewModel> impl
contextMenu=new PopupMenu(fragment.getActivity(), menuAnchor); contextMenu=new PopupMenu(fragment.getActivity(), menuAnchor);
contextMenu.inflate(R.menu.profile); contextMenu.inflate(R.menu.profile);
contextMenu.setOnMenuItemClickListener(this::onContextMenuItemSelected); 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); setStyle(AccessoryType.BUTTON, false);
} }
@@ -212,14 +217,20 @@ public class AccountViewHolder extends BindableViewHolder<AccountViewModel> impl
Menu menu=contextMenu.getMenu(); Menu menu=contextMenu.getMenu();
Account account=item.account; 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.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())); MenuItem mute=menu.findItem(R.id.mute);
menu.findItem(R.id.block).setTitle(fragment.getString(relationship.blocking ? R.string.unblock_user : R.string.block_user, account.getDisplayUsername())); mute.setTitle(fragment.getString(relationship.muting ? R.string.unmute_user : R.string.mute_user, account.getShortUsername()));
menu.findItem(R.id.report).setTitle(fragment.getString(R.string.report_user, account.getDisplayUsername())); 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); MenuItem hideBoosts=menu.findItem(R.id.hide_boosts);
if(relationship.following){ 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); hideBoosts.setVisible(true);
}else{ }else{
hideBoosts.setVisible(false); hideBoosts.setVisible(false);
@@ -274,6 +285,8 @@ public class AccountViewHolder extends BindableViewHolder<AccountViewModel> impl
UiUtils.confirmToggleMuteUser(fragment.getActivity(), accountID, account, relationship.muting, this::updateRelationship); UiUtils.confirmToggleMuteUser(fragment.getActivity(), accountID, account, relationship.muting, this::updateRelationship);
}else if(id==R.id.block){ }else if(id==R.id.block){
UiUtils.confirmToggleBlockUser(fragment.getActivity(), accountID, account, relationship.blocking, this::updateRelationship); 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){ }else if(id==R.id.report){
Bundle args=new Bundle(); Bundle args=new Bundle();
args.putString("account", accountID); args.putString("account", accountID);
@@ -303,6 +316,12 @@ public class AccountViewHolder extends BindableViewHolder<AccountViewModel> impl
}) })
.wrapProgress(fragment.getActivity(), R.string.loading, false) .wrapProgress(fragment.getActivity(), R.string.loading, false)
.exec(accountID); .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; return true;
} }

View File

@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"> <shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="?colorM3Surface" />
<stroke android:color="?colorM3OutlineVariant" android:width="1dp"/> <stroke android:color="?colorM3OutlineVariant" android:width="1dp"/>
<corners android:radius="11dp"/> <corners android:radius="12dp"/>
</shape> </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_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:clipToPadding="false" android:clipToPadding="false"
android:paddingHorizontal="16dp" android:paddingHorizontal="16dp">
android:paddingBottom="4dp">
<Button <Button
android:id="@+id/language_btn" android:id="@+id/language_btn"
@@ -18,14 +17,17 @@
android:drawableStart="@drawable/ic_fluent_local_language_16_regular" android:drawableStart="@drawable/ic_fluent_local_language_16_regular"
android:drawablePadding="8dp" android:drawablePadding="8dp"
android:drawableTint="?colorM3OnSurfaceVariant" android:drawableTint="?colorM3OnSurfaceVariant"
android:contentDescription="@string/language"
android:tooltipText="@string/language"
android:textColor="?colorM3OnSurfaceVariant" /> android:textColor="?colorM3OnSurfaceVariant" />
<ImageButton <ImageButton
android:id="@+id/drafts_btn" android:id="@+id/drafts_btn"
style="@style/Widget.Mastodon.M3.Button.Text" style="@style/Widget.Mastodon.M3.Button.Text"
android:background="@drawable/bg_button_m3_text_circle" android:background="@drawable/bg_button_m3_text_circle"
android:layout_width="40dp" android:layout_width="48dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_marginStart="-6dp"
android:src="@drawable/ic_fluent_clock_20_regular" android:src="@drawable/ic_fluent_clock_20_regular"
android:tint="?colorM3OnSurfaceVariant" android:tint="?colorM3OnSurfaceVariant"
android:contentDescription="@string/sk_schedule_or_draft" android:contentDescription="@string/sk_schedule_or_draft"
@@ -37,7 +39,7 @@
android:id="@+id/publish_btn" android:id="@+id/publish_btn"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_marginStart="8dp" android:layout_marginStart="6dp"
android:singleLine="true" android:singleLine="true"
android:ellipsize="end" /> android:ellipsize="end" />

View File

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

View File

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

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?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" xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:orientation="horizontal"
android:layout_width="match_parent" android:layout_width="match_parent"
@@ -47,4 +47,4 @@
android:singleLine="true" android:singleLine="true"
android:ellipsize="end"/> 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:layout_height="48dp"
android:background="@drawable/bg_icon_button" android:background="@drawable/bg_icon_button"
android:padding="0px" android:padding="0px"
android:tint="@color/action_bar_icons"
android:tintMode="src_in"
android:contentDescription="@string/add_media" android:contentDescription="@string/add_media"
android:tooltipText="@string/add_media" android:tooltipText="@string/add_media"
android:src="@drawable/ic_fluent_image_add_24_regular"/> android:src="@drawable/ic_fluent_image_add_24_regular"/>
@@ -480,6 +482,8 @@
android:layout_height="48dp" android:layout_height="48dp"
android:background="@drawable/bg_icon_button" android:background="@drawable/bg_icon_button"
android:padding="0px" android:padding="0px"
android:tint="@color/action_bar_icons"
android:tintMode="src_in"
android:contentDescription="@string/add_poll" android:contentDescription="@string/add_poll"
android:tooltipText="@string/add_poll" android:tooltipText="@string/add_poll"
android:src="@drawable/ic_fluent_poll_24_selector"/> android:src="@drawable/ic_fluent_poll_24_selector"/>
@@ -490,6 +494,8 @@
android:layout_height="48dp" android:layout_height="48dp"
android:background="@drawable/bg_icon_button" android:background="@drawable/bg_icon_button"
android:padding="0px" android:padding="0px"
android:tint="@color/action_bar_icons"
android:tintMode="src_in"
android:contentDescription="@string/emoji" android:contentDescription="@string/emoji"
android:tooltipText="@string/emoji" android:tooltipText="@string/emoji"
android:src="@drawable/ic_fluent_emoji_24_selector"/> android:src="@drawable/ic_fluent_emoji_24_selector"/>
@@ -500,6 +506,8 @@
android:layout_height="48dp" android:layout_height="48dp"
android:background="@drawable/bg_icon_button" android:background="@drawable/bg_icon_button"
android:padding="0px" android:padding="0px"
android:tint="@color/action_bar_icons"
android:tintMode="src_in"
android:contentDescription="@string/content_warning" android:contentDescription="@string/content_warning"
android:tooltipText="@string/content_warning" android:tooltipText="@string/content_warning"
android:src="@drawable/ic_fluent_chat_warning_24_selector"/> android:src="@drawable/ic_fluent_chat_warning_24_selector"/>
@@ -510,6 +518,8 @@
android:layout_height="48dp" android:layout_height="48dp"
android:background="@drawable/bg_icon_button" android:background="@drawable/bg_icon_button"
android:padding="0px" android:padding="0px"
android:tint="@color/action_bar_icons"
android:tintMode="src_in"
android:contentDescription="@string/sk_content_type" android:contentDescription="@string/sk_content_type"
android:tooltipText="@string/sk_content_type" android:tooltipText="@string/sk_content_type"
android:src="@drawable/ic_fluent_text_edit_style_24_selector"/> android:src="@drawable/ic_fluent_text_edit_style_24_selector"/>

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,15 +1,19 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <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"> <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" /> <menu android:id="@+id/accounts" />
</item> </item>
<item android:id="@+id/share" android:title="@string/share_user" android:icon="@drawable/ic_fluent_share_24_regular"/> <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/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/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/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/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/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/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"/> </group>
<item android:id="@+id/open_in_browser" android:title="@string/open_in_browser" android:icon="@drawable/ic_fluent_globe_24_regular"/>
</menu> </menu>

View File

@@ -38,7 +38,7 @@
<string name="sk_settings_enable_marquee">Laufschrift in Titelleisten deaktivieren</string> <string name="sk_settings_enable_marquee">Laufschrift in Titelleisten deaktivieren</string>
<string name="sk_settings_contribute">Zu Megalodon beitragen</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_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_settings_color_palette">Farbschema</string>
<string name="sk_color_palette_pink">Pink</string> <string name="sk_color_palette_pink">Pink</string>
<string name="sk_color_palette_purple">Violett</string> <string name="sk_color_palette_purple">Violett</string>

View File

@@ -599,7 +599,21 @@
<item quantity="one">%,d ανάρτηση σήμερα</item> <item quantity="one">%,d ανάρτηση σήμερα</item>
<item quantity="other">%,d αναρτήσεις σήμερα</item> <item quantity="other">%,d αναρτήσεις σήμερα</item>
</plurals> </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 --> <!-- 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 --> <!-- %s is the name of the list -->
<string name="delete_list_confirm">Διαγραφή “%s”;</string>
<string name="list_exclusive">Απόκρυψη μελών στο Ακολουθείς</string>
<!-- %s is a username --> <!-- %s is a username -->
</resources> </resources>

View File

@@ -404,4 +404,7 @@
<string name="sk_muted_accounts">Cuentas silenciadas</string> <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_settings_like_icon">Utilizar el corazón como icono favorito</string>
<string name="sk_recently_used">Utilizado recientemente</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> </resources>

View File

@@ -402,7 +402,10 @@
<string name="sk_time_days">%d jours</string> <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_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_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_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_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> </resources>

View File

@@ -396,6 +396,9 @@
<string name="sk_post_contains_media">Kiriman berisi media</string> <string name="sk_post_contains_media">Kiriman berisi media</string>
<string name="sk_blocked_accounts">Akun yang diblokir</string> <string name="sk_blocked_accounts">Akun yang diblokir</string>
<string name="sk_muted_accounts">Akun yang dibisukan</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_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> </resources>

View File

@@ -401,4 +401,7 @@
<string name="sk_muted_accounts">Conturi amuțite</string> <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_settings_like_icon">Folosiți inimă ca iconița favorite</string>
<string name="sk_recently_used">Recent folosit</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> </resources>

View File

@@ -10,11 +10,12 @@
<string name="finishing_auth">Slutför autentisering…</string> <string name="finishing_auth">Slutför autentisering…</string>
<string name="user_boosted">%s boostade</string> <string name="user_boosted">%s boostade</string>
<string name="in_reply_to">Som svar på %s</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_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_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="user_favorited">%s favoritmarkerade ditt inlägg</string>
<string name="notification_boosted">%s boostade 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="share_toot_title">Dela</string>
<string name="settings">Inställningar</string> <string name="settings">Inställningar</string>
<string name="publish">Publicera</string> <string name="publish">Publicera</string>
@@ -105,7 +106,7 @@
<string name="do_unblock">Avblockera</string> <string name="do_unblock">Avblockera</string>
<string name="button_blocked">Blockerad</string> <string name="button_blocked">Blockerad</string>
<string name="action_vote">Rösta</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_title">Radera inlägg</string>
<string name="confirm_delete">Är du säker på att du vill radera detta 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> <string name="deleting">Raderar…</string>
@@ -118,12 +119,15 @@
<string name="hashtags">Hashtaggar</string> <string name="hashtags">Hashtaggar</string>
<string name="news">Nyheter</string> <string name="news">Nyheter</string>
<string name="for_you">För dig</string> <string name="for_you">För dig</string>
<string name="all_notifications">Alla</string>
<string name="mentions">Omnämningar</string> <string name="mentions">Omnämningar</string>
<plurals name="x_people_talking"> <plurals name="x_people_talking">
<item quantity="one">%d person pratar</item> <item quantity="one">%d person pratar</item>
<item quantity="other">%d personer pratar</item> <item quantity="other">%d personer pratar</item>
</plurals> </plurals>
<string name="report_title">Rapportera %s</string> <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_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">Jag gillar det inte</string>
<string name="report_reason_personal_subtitle">Det är inget som du vill se</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_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">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_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_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">Vilka regler överträds?</string>
<string name="report_choose_rule_subtitle">Välj alla som stämmer</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_title">Finns det något annat vi borde veta?</string>
<string name="report_comment_hint">Ytterligare kommentarer</string> <string name="report_comment_hint">Ytterligare kommentarer</string>
<string name="sending_report">Skickar rapport…</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_user">Avfölj %s</string>
<string name="unfollow">Avfölj</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_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="back">Tillbaka</string>
<string name="search_communities">Servernamn eller URL</string> <string name="search_communities">Servernamn eller URL</string>
<string name="instance_rules_title">Serverregler</string> <string name="instance_rules_title">Serverregler</string>
@@ -168,19 +178,23 @@
<string name="category_tech">Teknik</string> <string name="category_tech">Teknik</string>
<string name="confirm_email_title">Kolla din inkorg</string> <string name="confirm_email_title">Kolla din inkorg</string>
<!-- %s is the email address --> <!-- %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="confirm_email_didnt_get">Fick du ingen länk?</string>
<string name="resend">Skicka igen</string> <string name="resend">Skicka igen</string>
<string name="open_email_app">Öppna e-postappen</string> <string name="open_email_app">Öppna e-postappen</string>
<string name="resent_email">Bekräftelse via e-post skickad</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="content_warning">Innehållsvarning</string>
<string name="save">Spara</string> <string name="save">Spara</string>
<string name="add_alt_text">Lägg till alternativtext</string> <string name="add_alt_text">Lägg till alternativtext</string>
<string name="visibility_public">Offentlig</string> <string name="visibility_public">Offentlig</string>
<string name="visibility_followers_only">Endast följare</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="recent_searches">Nyligen</string>
<string name="skip">Hoppa över</string> <string name="skip">Hoppa över</string>
<string name="notification_type_follow">Nya följare</string> <string name="notification_type_follow">Nya följare</string>
<string name="notification_type_favorite">Favoriter</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_mention">Omnämningar</string>
<string name="notification_type_poll">Omröstningar</string> <string name="notification_type_poll">Omröstningar</string>
<string name="choose_account">Välj konto</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_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="media_attachment_too_big">Filen %1$s överskrider storleksgränsen på %2$s MB</string>
<string name="settings_theme">Utseende</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_light">Ljust</string>
<string name="theme_dark">Mörkt</string> <string name="theme_dark">Mörkt</string>
<string name="settings_behavior">Beteende</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="settings_app_version">Mastodon för Android v%1$s (%2$d)</string>
<string name="media_cache_cleared">Mediacache rensad</string> <string name="media_cache_cleared">Mediacache rensad</string>
<string name="confirm_log_out">Logga ut från %s?</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="more_options">Fler alternativ</string>
<string name="new_post">Nytt inlägg</string> <string name="new_post">Nytt inlägg</string>
<string name="button_reply">Svara</string> <string name="button_reply">Svara</string>
@@ -217,7 +234,10 @@
<string name="follow_user">Följ %s</string> <string name="follow_user">Följ %s</string>
<string name="unfollowed_user">Avföljde %s</string> <string name="unfollowed_user">Avföljde %s</string>
<string name="followed_user">Du följer nu %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="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">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="signup_reason_note">Detta kommer hjälpa oss att granska din ansökan.</string>
<string name="clear">Rensa</string> <string name="clear">Rensa</string>
@@ -231,7 +251,12 @@
<string name="error_saving_file">Fel vid sparande av fil</string> <string name="error_saving_file">Fel vid sparande av fil</string>
<string name="file_saved">Filen sparad</string> <string name="file_saved">Filen sparad</string>
<string name="downloading">Laddar ner…</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 --> <!-- %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="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="see_new_posts">Se nya inlägg</string>
<string name="load_missing_posts">Ladda saknade 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_title">Välkommen tillbaka</string>
<string name="login_subtitle">Logga in på den server där du skapade ditt konto.</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="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_any_language">Vilket språk som helst</string>
<string name="server_filter_instant_signup">Omedelbar registrering</string> <string name="server_filter_instant_signup">Omedelbar registrering</string>
<string name="server_filter_manual_review">Manuell granskning</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="popular_on_mastodon">Populärt på Mastodon</string>
<string name="follow_all">Följ alla</string> <string name="follow_all">Följ alla</string>
<string name="server_rules_disagree">Instämmer inte alls</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 --> <!-- %s is server domain -->
<string name="server_policy_disagree">Håller inte med %s</string> <string name="server_policy_disagree">Håller inte med %s</string>
<string name="profile_bio">Biografi</string> <string name="profile_bio">Biografi</string>
<!-- Shown in a progress dialog when you tap "follow all" --> <!-- Shown in a progress dialog when you tap "follow all" -->
<string name="sending_follows">Följer användare…</string> <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. --> <!-- %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_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="poll_multiple_choice">Välj en eller flera</string>
<string name="save_changes">Spara ändringar</string> <string name="save_changes">Spara ändringar</string>
<string name="profile_timeline">Tidslinje</string> <string name="profile_timeline">Tidslinje</string>
@@ -349,9 +378,12 @@
<string name="welcome_to_mastodon">Välkommen till Mastodon</string> <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="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="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="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="confirm_log_out_all_accounts">Logga ut från alla konton?</string>
<string name="retry">Försök igen</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") --> <!-- %s is formatted file size ("467 KB image") -->
<string name="attachment_description_image">%s bild</string> <string name="attachment_description_image">%s bild</string>
<string name="attachment_description_video">%s video</string> <string name="attachment_description_video">%s video</string>
@@ -362,33 +394,80 @@
<string name="attachment_type_audio">Ljud</string> <string name="attachment_type_audio">Ljud</string>
<string name="attachment_type_gif">GIF</string> <string name="attachment_type_gif">GIF</string>
<string name="attachment_type_unknown">Fil</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="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="edit_post">Redigera inlägg</string>
<string name="no_verified_link">Ingen verifierad länk</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">Språk</string>
<string name="language_default">Standard</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="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 --> <!-- %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 --> <!-- 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="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="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_filters">Filter</string>
<string name="settings_server_explanation">Översikt, regler och moderatorer</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 --> <!-- %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="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="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_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="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"> <plurals name="x_weeks">
<item quantity="one">%d vecka</item> <item quantity="one">%d vecka</item>
<item quantity="other">%d veckor</item> <item quantity="other">%d veckor</item>
</plurals> </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 --> <!-- %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") -->
<!-- %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="about_server">Om</string>
<string name="server_rules">Regler</string> <string name="server_rules">Regler</string>
<string name="server_administrator">Administratör</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> <string name="settings_show_emoji_in_names">Anpassad emoji i visningsnamn</string>
<plurals name="in_x_hours"> <plurals name="in_x_hours">
<item quantity="one">om %d timme</item> <item quantity="one">om %d timme</item>
@@ -398,29 +477,51 @@
<item quantity="one">%d timme sedan</item> <item quantity="one">%d timme sedan</item>
<item quantity="other">%d timmar sedan</item> <item quantity="other">%d timmar sedan</item>
</plurals> </plurals>
<string name="count_one">En</string>
<string name="count_two">Två</string> <string name="count_two">Två</string>
<string name="count_three">Tre</string> <string name="count_three">Tre</string>
<string name="count_four">Fyra</string> <string name="count_four">Fyra</string>
<!-- %s is the username --> <!-- %s is the username -->
<string name="unfollow_confirmation">Avfölj %s?</string>
<string name="filter_active">Aktiv</string> <string name="filter_active">Aktiv</string>
<string name="filter_inactive">Inaktiv</string> <string name="filter_inactive">Inaktiv</string>
<string name="settings_add_filter">Lägg till filter</string> <string name="settings_add_filter">Lägg till filter</string>
<string name="settings_edit_filter">Redigera 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="settings_delete_filter">Radera filter</string>
<string name="filter_duration_forever">För alltid</string>
<!-- %s is the timestamp ("tomorrow at 12:34") --> <!-- %s is the timestamp ("tomorrow at 12:34") -->
<string name="selection_2_options">%1$s och %2$s</string> <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="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="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="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="add">Lägg till</string>
<string name="filter_word_or_phrase">Ord eller fras</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="enter_selection_mode">Välj</string>
<string name="select_all">Välj alla</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"> <plurals name="settings_delete_x_filter_words">
<item quantity="one">Radera %d ord?</item> <item quantity="one">Radera %d ord?</item>
<item quantity="other">Radera %d ord?</item> <item quantity="other">Radera %d ord?</item>
</plurals> </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="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 --> <!-- Shown like a content warning, %s is the name of the filter -->
<string name="post_matches_filter_x">Matchar filter \"%s\"</string> <string name="post_matches_filter_x">Matchar filter \"%s\"</string>
<string name="search_mastodon">Sök i Mastodon</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="search_open_url">Öppna URL i Mastodon</string>
<string name="posts_matching_hashtag">Inlägg med \"%s\"</string> <string name="posts_matching_hashtag">Inlägg med \"%s\"</string>
<string name="search_go_to_account">Gå till %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 --> <!-- Shown in the post header. Please keep it short -->
<string name="time_seconds_ago_short">%ds sedan</string> <string name="time_seconds_ago_short">%ds sedan</string>
<string name="time_minutes_ago_short">%dm sedan</string> <string name="time_minutes_ago_short">%dm sedan</string>
@@ -436,7 +539,38 @@
<!-- %s is the name of the post language --> <!-- %s is the name of the post language -->
<string name="translate_post">Översätt från %s</string> <string name="translate_post">Översätt från %s</string>
<!-- %1$s is the language, %2$s is the name of the translation service --> <!-- %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 --> <!-- 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 --> <!-- %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 --> <!-- %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> </resources>

View File

@@ -406,4 +406,7 @@
<string name="sk_muted_accounts">Ігноровані облікові записи</string> <string name="sk_muted_accounts">Ігноровані облікові записи</string>
<string name="sk_settings_like_icon">Використовувати серце як піктограму «Вподобане»</string> <string name="sk_settings_like_icon">Використовувати серце як піктограму «Вподобане»</string>
<string name="sk_recently_used">Недавно використані</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> </resources>

View File

@@ -397,4 +397,7 @@
<string name="sk_muted_accounts">已静音账号</string> <string name="sk_muted_accounts">已静音账号</string>
<string name="sk_settings_like_icon">使用心形作为收藏图标</string> <string name="sk_settings_like_icon">使用心形作为收藏图标</string>
<string name="sk_recently_used">最近使用</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> </resources>

View File

@@ -293,7 +293,7 @@
<string name="sk_expand">Expand</string> <string name="sk_expand">Expand</string>
<string name="sk_collapse">Collapse</string> <string name="sk_collapse">Collapse</string>
<string name="sk_settings_collapse_long_posts">Collapse very long posts</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_unfinished_attachments_message">Some attachments havent finished uploading.</string>
<string name="sk_settings_hide_interaction">Hide interaction buttons</string> <string name="sk_settings_hide_interaction">Hide interaction buttons</string>
<string name="sk_follow_as">Follow from other account</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_recently_used">Recently used</string>
<string name="sk_settings_underlined_links">Underlined links</string> <string name="sk_settings_underlined_links">Underlined links</string>
<string name="sk_set_as_default">Set as default</string> <string name="sk_set_as_default">Set as default</string>
<string name="sk_edit_alt_text">Edit alt text</string>
</resources> </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>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>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>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>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>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>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>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. - <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.