Compare commits
128 Commits
feature/lo
...
1.2.0+fork
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d95b395cfc | ||
|
|
b41b2c8f3c | ||
|
|
289dc4bf86 | ||
|
|
c34e1e5f32 | ||
|
|
729680df8c | ||
|
|
b85b578ddd | ||
|
|
8a7d2df7b8 | ||
|
|
3ff3eb819a | ||
|
|
1ea24b5ff6 | ||
|
|
79d0ab311b | ||
|
|
79f7df089e | ||
|
|
32464f8552 | ||
|
|
7ce96a2311 | ||
|
|
a009ea212f | ||
|
|
8848b75325 | ||
|
|
2eb04a3835 | ||
|
|
b61ce8399e | ||
|
|
52392c9ed9 | ||
|
|
4b35ac6ad8 | ||
|
|
a56b603c5c | ||
|
|
48bd277769 | ||
|
|
04101eb31b | ||
|
|
34c6a76a53 | ||
|
|
3f20c6104a | ||
|
|
b5f82261b0 | ||
|
|
b9a5db7ea4 | ||
|
|
64cb6e52a8 | ||
|
|
6e96e8929f | ||
|
|
bdd48f0001 | ||
|
|
4bf19adc8e | ||
|
|
bb9ff3c33f | ||
|
|
ae11e78d78 | ||
|
|
222c3a2526 | ||
|
|
08aa64a666 | ||
|
|
f10c157598 | ||
|
|
5059d8fc4f | ||
|
|
4152179dea | ||
|
|
3619be71ab | ||
|
|
810e9eeb11 | ||
|
|
25cff94665 | ||
|
|
0e08209f4c | ||
|
|
db0b4fb615 | ||
|
|
672cfe58d6 | ||
|
|
338e164143 | ||
|
|
e964b76302 | ||
|
|
8dedc77ff8 | ||
|
|
3b762c14a1 | ||
|
|
59941fc867 | ||
|
|
50601853f5 | ||
|
|
3137f3c1e4 | ||
|
|
bfaa732544 | ||
|
|
1b7a257a48 | ||
|
|
4d40fad10d | ||
|
|
49015f3e3e | ||
|
|
77b5819c65 | ||
|
|
ac5615497b | ||
|
|
4ecd525f13 | ||
|
|
e7cd1cfda2 | ||
|
|
17afa8e6f5 | ||
|
|
8385fb9586 | ||
|
|
ba44aa57d7 | ||
|
|
a70647da44 | ||
|
|
f97aafe374 | ||
|
|
b38a460a02 | ||
|
|
bddf024ba0 | ||
|
|
be7a7acadd | ||
|
|
d05c90ca7f | ||
|
|
4187da9168 | ||
|
|
a051e636e6 | ||
|
|
360cd7b5df | ||
|
|
55d2ca4a93 | ||
|
|
c7f61291ed | ||
|
|
f836361644 | ||
|
|
f404895b5c | ||
|
|
94ed0c3f49 | ||
|
|
00ffe9c41e | ||
|
|
529c1e2b07 | ||
|
|
f2e04e6769 | ||
|
|
f1a7603bdf | ||
|
|
280434b01f | ||
|
|
023a6c3a49 | ||
|
|
ed301cafe0 | ||
|
|
5e97adcd3b | ||
|
|
487deae044 | ||
|
|
a28daa3d75 | ||
|
|
75f311b8a7 | ||
|
|
5d11bee59d | ||
|
|
cd027f1220 | ||
|
|
1d55354be2 | ||
|
|
3143f28e04 | ||
|
|
d381205bbf | ||
|
|
6b6852e134 | ||
|
|
f7a41906e4 | ||
|
|
70ddea2e81 | ||
|
|
92a806462d | ||
|
|
8111ea04b9 | ||
|
|
371f97fa5a | ||
|
|
f7def3ab01 | ||
|
|
1cefc8aaf2 | ||
|
|
a72849bae1 | ||
|
|
5e6b56a738 | ||
|
|
58c754ea2d | ||
|
|
c22374b712 | ||
|
|
7820926e1a | ||
|
|
fcf5887359 | ||
|
|
aade898681 | ||
|
|
d6653b5f78 | ||
|
|
89514dbf14 | ||
|
|
456fbb6fc9 | ||
|
|
f2d29366bd | ||
|
|
ea7c366981 | ||
|
|
fe7362bb28 | ||
|
|
a4d739a9a9 | ||
|
|
d4cf12a0d9 | ||
|
|
69af790e22 | ||
|
|
2936ec81af | ||
|
|
ef1965a41b | ||
|
|
c2d14c64cb | ||
|
|
aa554d91f7 | ||
|
|
cc3845d6f4 | ||
|
|
2571b2d4f7 | ||
|
|
ac7cdb885d | ||
|
|
7b5d95f7ee | ||
|
|
ccf311312e | ||
|
|
42222cd327 | ||
|
|
60961020c8 | ||
|
|
2a7bba24de | ||
|
|
fdbe3fcb13 |
25
README.md
25
README.md
@@ -5,16 +5,29 @@
|
||||
> A fork of [megalodon](https://github.com/sk22/megalodon) which is a fork of [official Mastodon Android app](https://github.com/mastodon/mastodon-android) adding important features that are missing in the official app and possibly won’t ever be implemented, such as the federated timeline, unlisted posting, bookmarks and an image description viewer.
|
||||
|
||||
|
||||
[](https://github.com/LucasGGamerM/moshidon/releases/latest/download/moshidon.apk)
|
||||
[](https://github.com/LucasGGamerM/moshidon/releases/latest/download/moshidon.apk)
|
||||
|
||||
[](https://translate.codeberg.org/engage/moshidon/)
|
||||
|
||||
|
||||
<a href="https://play.google.com/store/apps/details?id=org.joinmastodon.android.moshinda"><img height="50" alt="Get it on Google Play" src="img/google-play-badge.png"></a>
|
||||
|
||||
<a href="https://apt.izzysoft.de/fdroid/index/apk/org.joinmastodon.android.moshinda"><img height="50" alt="Get it on IzzyOnDroid" src="img/izzy-badge.png"></a>
|
||||
|
||||
---
|
||||
|
||||
## F.A.Q
|
||||
|
||||
### Q: What are the main differences between Moshidon and Megalodon?
|
||||
|
||||
### A: There are many, but the most outstanding differences are: the ability to have other server's local timeline inside the app. It can be acessed in the "Add community" option in the top right corner of the Edit timelines screen. Most other features are pretty minor, such as profile notes directly available in the person's profile. Other features are quite minor usability and visibility improvements. All of which can be found in the settings page.
|
||||
|
||||
[<img src="https://gitlab.com/IzzyOnDroid/repo/-/raw/master/assets/IzzyOnDroid.png"
|
||||
alt="Get it on IzzyOnDroid"
|
||||
height="80">](https://apt.izzysoft.de/fdroid/index/apk/org.joinmastodon.android.moshinda)
|
||||
---
|
||||
|
||||
|
||||
## Key features
|
||||
|
||||
### **The ability to add new custom local timelines!**
|
||||
|
||||
### **Material you theme support on Android 12+ devices!**
|
||||
|
||||
### **Show posts filtered with a warning!**
|
||||
@@ -94,7 +107,7 @@ Variant with an integrated updater. If you download Moshidon from here (and not
|
||||
([Pull request](https://github.com/mastodon/mastodon-android/pull/103))
|
||||
* Adding a useful private profile note box!*
|
||||
* Auto hiding the compose button on scroll!*
|
||||
* Adding the hability to remind yourself to add alt text to images!*
|
||||
* Adding the ability to remind yourself to add alt text to images!*
|
||||
* An indicator for if an image has alt text or not*
|
||||
* Adding the ability to have drafts!*
|
||||
* Also adding the ability to view announcements from your instance!*
|
||||
|
||||
@@ -9,8 +9,8 @@ android {
|
||||
applicationId "org.joinmastodon.android.moshinda"
|
||||
minSdk 23
|
||||
targetSdk 33
|
||||
versionCode 94
|
||||
versionName "1.2.0+fork.94.moshinda"
|
||||
versionCode 99
|
||||
versionName "1.2.0+fork.99.moshinda"
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
resConfigs "ar-rSA", "be-rBY", "bn-rBD", "bs-rBA", "ca-rES", "cs-rCZ", "de-rDE", "el-rGR", "es-rES", "eu-rES", "fi-rFI", "fil-rPH", "fr-rFR", "ga-rIE", "gd-rGB", "gl-rES", "hi-rIN", "hr-rHR", "hu-rHU", "hy-rAM", "in-rID", "is-rIS", "it-rIT", "iw-rIL", "ja-rJP", "kab", "ko-rKR", "nl-rNL", "oc-rFR", "pl-rPL", "pt-rBR", "pt-rPT", "ro-rRO", "ru-rRU", "si-rLK", "sl-rSI", "sv-rSE", "th-rTH", "tr-rTR", "uk-rUA", "vi-rVN", "zh-rCN", "zh-rTW"
|
||||
}
|
||||
|
||||
@@ -47,6 +47,8 @@ public class GlobalUserPreferences{
|
||||
public static boolean collapseLongPosts;
|
||||
public static boolean spectatorMode;
|
||||
public static boolean autoHideFab;
|
||||
public static boolean unreadNotifications;
|
||||
public static boolean defaultToUnlistedReplies;
|
||||
public static String publishButtonText;
|
||||
public static ThemePreference theme;
|
||||
public static ColorPreference color;
|
||||
@@ -101,6 +103,8 @@ public class GlobalUserPreferences{
|
||||
collapseLongPosts=prefs.getBoolean("collapseLongPosts", true);
|
||||
spectatorMode=prefs.getBoolean("spectatorMode", false);
|
||||
autoHideFab=prefs.getBoolean("autoHideFab", true);
|
||||
unreadNotifications=prefs.getBoolean("unreadNotifications", false);
|
||||
defaultToUnlistedReplies=prefs.getBoolean("defaultToUnlistedReplies", false);
|
||||
publishButtonText=prefs.getString("publishButtonText", "");
|
||||
theme=ThemePreference.values()[prefs.getInt("theme", 0)];
|
||||
recentLanguages=fromJson(prefs.getString("recentLanguages", "{}"), recentLanguagesType, new HashMap<>());
|
||||
@@ -150,8 +154,10 @@ public class GlobalUserPreferences{
|
||||
.putBoolean("collapseLongPosts", collapseLongPosts)
|
||||
.putBoolean("spectatorMode", spectatorMode)
|
||||
.putBoolean("autoHideFab", autoHideFab)
|
||||
.putBoolean("unreadNotifications", unreadNotifications)
|
||||
.putString("publishButtonText", publishButtonText)
|
||||
.putBoolean("bottomEncoding", bottomEncoding)
|
||||
.putBoolean("defaultToUnlistedReplies", defaultToUnlistedReplies)
|
||||
.putInt("theme", theme.ordinal())
|
||||
.putString("color", color.name())
|
||||
.putString("recentLanguages", gson.toJson(recentLanguages))
|
||||
|
||||
@@ -7,10 +7,14 @@ import android.content.pm.PackageManager;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.widget.Toast;
|
||||
|
||||
import org.joinmastodon.android.api.ObjectValidationException;
|
||||
import org.joinmastodon.android.api.requests.accounts.SetPrivateNote;
|
||||
import org.joinmastodon.android.api.requests.statuses.SetStatusFavorited;
|
||||
import org.joinmastodon.android.api.session.AccountSession;
|
||||
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||
import org.joinmastodon.android.events.StatusCountersUpdatedEvent;
|
||||
import org.joinmastodon.android.fragments.ComposeFragment;
|
||||
import org.joinmastodon.android.fragments.HomeFragment;
|
||||
import org.joinmastodon.android.fragments.ProfileFragment;
|
||||
@@ -19,12 +23,17 @@ import org.joinmastodon.android.fragments.onboarding.AccountActivationFragment;
|
||||
import org.joinmastodon.android.fragments.onboarding.CustomWelcomeFragment;
|
||||
import org.joinmastodon.android.fragments.onboarding.CustomWelcomeFragment;
|
||||
import org.joinmastodon.android.model.Notification;
|
||||
import org.joinmastodon.android.model.NotificationAction;
|
||||
import org.joinmastodon.android.model.Relationship;
|
||||
import org.joinmastodon.android.model.Status;
|
||||
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||
import org.joinmastodon.android.updater.GithubSelfUpdater;
|
||||
import org.parceler.Parcels;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import me.grishka.appkit.FragmentStackActivity;
|
||||
import me.grishka.appkit.api.Callback;
|
||||
import me.grishka.appkit.api.ErrorResponse;
|
||||
|
||||
public class MainActivity extends FragmentStackActivity{
|
||||
@Override
|
||||
|
||||
@@ -5,6 +5,7 @@ import android.app.NotificationChannel;
|
||||
import android.app.NotificationChannelGroup;
|
||||
import android.app.NotificationManager;
|
||||
import android.app.PendingIntent;
|
||||
import android.app.RemoteInput;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
@@ -16,15 +17,24 @@ import android.util.Log;
|
||||
|
||||
import org.joinmastodon.android.api.MastodonAPIController;
|
||||
import org.joinmastodon.android.api.requests.notifications.GetNotificationByID;
|
||||
import org.joinmastodon.android.api.requests.statuses.CreateStatus;
|
||||
import org.joinmastodon.android.api.requests.statuses.SetStatusBookmarked;
|
||||
import org.joinmastodon.android.api.requests.statuses.SetStatusFavorited;
|
||||
import org.joinmastodon.android.api.requests.statuses.SetStatusReblogged;
|
||||
import org.joinmastodon.android.api.session.AccountSession;
|
||||
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||
import org.joinmastodon.android.model.Account;
|
||||
import org.joinmastodon.android.model.NotificationAction;
|
||||
import org.joinmastodon.android.model.Preferences;
|
||||
import org.joinmastodon.android.model.PushNotification;
|
||||
import org.joinmastodon.android.model.StatusPrivacy;
|
||||
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||
import org.parceler.Parcels;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
import java.util.UUID;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import me.grishka.appkit.api.Callback;
|
||||
@@ -37,6 +47,8 @@ public class PushNotificationReceiver extends BroadcastReceiver{
|
||||
private static final String TAG="PushNotificationReceive";
|
||||
|
||||
public static final int NOTIFICATION_ID=178;
|
||||
private static final String ACTION_KEY_TEXT_REPLY = "ACTION_KEY_TEXT_REPLY";
|
||||
|
||||
private static final int SUMMARY_ID = 791;
|
||||
private static int notificationId = 0;
|
||||
|
||||
@@ -76,6 +88,8 @@ public class PushNotificationReceiver extends BroadcastReceiver{
|
||||
@Override
|
||||
public void onSuccess(org.joinmastodon.android.model.Notification result){
|
||||
MastodonAPIController.runInBackground(()->PushNotificationReceiver.this.notify(context, pn, accountID, result));
|
||||
GlobalUserPreferences.unreadNotifications = true;
|
||||
GlobalUserPreferences.save();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -92,6 +106,35 @@ public class PushNotificationReceiver extends BroadcastReceiver{
|
||||
Log.w(TAG, "onReceive: invalid push notification format");
|
||||
}
|
||||
}
|
||||
if(intent.getBooleanExtra("fromNotificationAction", false)){
|
||||
String accountID=intent.getStringExtra("accountID");
|
||||
int notificationId=intent.getIntExtra("notificationId", -1);
|
||||
|
||||
if (notificationId >= 0){
|
||||
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
notificationManager.cancel(accountID, notificationId);
|
||||
}
|
||||
|
||||
if(intent.hasExtra("notification")){
|
||||
org.joinmastodon.android.model.Notification notification=Parcels.unwrap(intent.getParcelableExtra("notification"));
|
||||
String statusID=notification.status.id;
|
||||
if (statusID != null) {
|
||||
AccountSessionManager accountSessionManager = AccountSessionManager.getInstance();
|
||||
Preferences preferences = accountSessionManager.getAccount(accountID).preferences;
|
||||
|
||||
switch (NotificationAction.values()[intent.getIntExtra("notificationAction", 0)]) {
|
||||
case FAVORITE -> new SetStatusFavorited(statusID, true).exec(accountID);
|
||||
case BOOKMARK -> new SetStatusBookmarked(statusID, true).exec(accountID);
|
||||
case BOOST -> new SetStatusReblogged(notification.status.id, true, preferences.postingDefaultVisibility).exec(accountID);
|
||||
case UNBOOST -> new SetStatusReblogged(notification.status.id, false, preferences.postingDefaultVisibility).exec(accountID);
|
||||
case REPLY -> handleReplyAction(context, accountID, intent, notification, notificationId, preferences);
|
||||
default -> Log.w(TAG, "onReceive: Failed to get NotificationAction");
|
||||
}
|
||||
}
|
||||
}else{
|
||||
Log.e(TAG, "onReceive: Failed to load notification");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void notify(Context context, PushNotification pn, String accountID, org.joinmastodon.android.model.Notification notification){
|
||||
@@ -165,6 +208,90 @@ public class PushNotificationReceiver extends BroadcastReceiver{
|
||||
if(AccountSessionManager.getInstance().getLoggedInAccounts().size()>1){
|
||||
builder.setSubText(accountName);
|
||||
}
|
||||
nm.notify(accountID, GlobalUserPreferences.keepOnlyLatestNotification ? NOTIFICATION_ID : notificationId++, builder.build());
|
||||
|
||||
int id = GlobalUserPreferences.keepOnlyLatestNotification ? NOTIFICATION_ID : notificationId++;
|
||||
|
||||
if (notification != null){
|
||||
switch (pn.notificationType){
|
||||
case MENTION, STATUS -> {
|
||||
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.N){
|
||||
builder.addAction(buildReplyAction(context, id, accountID, notification));
|
||||
}
|
||||
builder.addAction(buildNotificationAction(context, id, accountID, notification, context.getString(R.string.button_favorite), NotificationAction.FAVORITE));
|
||||
builder.addAction(buildNotificationAction(context, id, accountID, notification, context.getString(R.string.add_bookmark), NotificationAction.BOOKMARK));
|
||||
if(notification.status.visibility != StatusPrivacy.DIRECT) {
|
||||
builder.addAction(buildNotificationAction(context, id, accountID, notification, context.getString(R.string.button_reblog), NotificationAction.BOOST));
|
||||
}
|
||||
}
|
||||
case UPDATE -> {
|
||||
if(notification.status.reblogged)
|
||||
builder.addAction(buildNotificationAction(context, id, accountID, notification, context.getString(R.string.sk_undo_reblog), NotificationAction.UNBOOST));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
nm.notify(accountID, id, builder.build());
|
||||
}
|
||||
}
|
||||
|
||||
private Notification.Action buildNotificationAction(Context context, int notificationId, String accountID, org.joinmastodon.android.model.Notification notification, String title, NotificationAction action){
|
||||
Intent notificationIntent=new Intent(context, PushNotificationReceiver.class);
|
||||
notificationIntent.putExtra("notificationId", notificationId);
|
||||
notificationIntent.putExtra("fromNotificationAction", true);
|
||||
notificationIntent.putExtra("accountID", accountID);
|
||||
notificationIntent.putExtra("notificationAction", action.ordinal());
|
||||
notificationIntent.putExtra("notification", Parcels.wrap(notification));
|
||||
PendingIntent actionPendingIntent = PendingIntent.getBroadcast(context, new Random().nextInt(), notificationIntent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_ONE_SHOT);
|
||||
|
||||
return new Notification.Action.Builder(null, title, actionPendingIntent).build();
|
||||
}
|
||||
|
||||
private Notification.Action buildReplyAction(Context context, int notificationId, String accountID, org.joinmastodon.android.model.Notification notification){
|
||||
String replyLabel = context.getResources().getString(R.string.button_reply);
|
||||
RemoteInput remoteInput = new RemoteInput.Builder(ACTION_KEY_TEXT_REPLY)
|
||||
.setLabel(replyLabel)
|
||||
.build();
|
||||
|
||||
Intent notificationIntent=new Intent(context, PushNotificationReceiver.class);
|
||||
notificationIntent.putExtra("notificationId", notificationId);
|
||||
notificationIntent.putExtra("fromNotificationAction", true);
|
||||
notificationIntent.putExtra("accountID", accountID);
|
||||
notificationIntent.putExtra("notificationAction", NotificationAction.REPLY.ordinal());
|
||||
notificationIntent.putExtra("notification", Parcels.wrap(notification));
|
||||
|
||||
int flags = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S ? PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT : PendingIntent.FLAG_UPDATE_CURRENT;
|
||||
PendingIntent replyPendingIntent = PendingIntent.getBroadcast(context, new Random().nextInt(), notificationIntent,flags);
|
||||
return new Notification.Action.Builder(null, replyLabel, replyPendingIntent).addRemoteInput(remoteInput).build();
|
||||
}
|
||||
|
||||
private void handleReplyAction(Context context, String accountID, Intent intent, org.joinmastodon.android.model.Notification notification, int notificationId, Preferences preferences) {
|
||||
Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
|
||||
if (remoteInput == null) {
|
||||
Log.e(TAG, "handleReplyAction: Could not get reply input");
|
||||
return;
|
||||
}
|
||||
CharSequence input = remoteInput.getCharSequence(ACTION_KEY_TEXT_REPLY);
|
||||
|
||||
CreateStatus.Request req=new CreateStatus.Request();
|
||||
req.status = input.toString() + "\n\n" + "@" + notification.status.account.acct;
|
||||
req.language = notification.status.language;
|
||||
req.visibility = notification.status.visibility;
|
||||
req.inReplyToId = notification.status.id;
|
||||
if(!notification.status.spoilerText.isEmpty() && GlobalUserPreferences.prefixRepliesWithRe && !notification.status.spoilerText.startsWith("re: ")){
|
||||
req.spoilerText = "re: " + notification.status.spoilerText;
|
||||
}
|
||||
|
||||
new CreateStatus(req, UUID.randomUUID().toString()).exec(accountID);
|
||||
|
||||
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
Notification.Builder builder = android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O ?
|
||||
new Notification.Builder(context, accountID+"_"+notification.type) :
|
||||
new Notification.Builder(context)
|
||||
.setPriority(Notification.PRIORITY_DEFAULT)
|
||||
.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE);
|
||||
|
||||
Notification repliedNotification = builder.setSmallIcon(R.drawable.ic_ntf_logo)
|
||||
.setContentText(context.getString(R.string.mo_notification_action_replied, notification.status.account.getDisplayUsername()))
|
||||
.build();
|
||||
notificationManager.notify(accountID, notificationId, repliedNotification);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package org.joinmastodon.android.api.requests.accounts;
|
||||
|
||||
import org.joinmastodon.android.api.MastodonAPIRequest;
|
||||
import org.joinmastodon.android.model.Account;
|
||||
|
||||
public class GetAccountByHandle extends MastodonAPIRequest<Account>{
|
||||
public GetAccountByHandle(String acct){
|
||||
super(HttpMethod.GET, "/accounts/lookup", Account.class);
|
||||
addQueryParameter("acct", acct);
|
||||
}
|
||||
}
|
||||
@@ -4,8 +4,15 @@ import org.joinmastodon.android.api.MastodonAPIRequest;
|
||||
import org.joinmastodon.android.model.Relationship;
|
||||
|
||||
public class SetAccountMuted extends MastodonAPIRequest<Relationship>{
|
||||
public SetAccountMuted(String id, boolean muted){
|
||||
public SetAccountMuted(String id, boolean muted, long duration){
|
||||
super(HttpMethod.POST, "/accounts/"+id+"/"+(muted ? "mute" : "unmute"), Relationship.class);
|
||||
setRequestBody(new Object());
|
||||
setRequestBody(muted ? new Request(duration): new Object());
|
||||
}
|
||||
|
||||
private static class Request{
|
||||
public long duration;
|
||||
public Request(long duration){
|
||||
this.duration=duration;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,13 +13,11 @@ import android.text.Layout;
|
||||
import android.text.StaticLayout;
|
||||
import android.text.TextPaint;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.WindowInsets;
|
||||
import android.view.animation.TranslateAnimation;
|
||||
import android.widget.ImageButton;
|
||||
import android.widget.ImageButton;
|
||||
import android.widget.Toolbar;
|
||||
|
||||
import org.joinmastodon.android.E;
|
||||
@@ -34,7 +32,6 @@ import org.joinmastodon.android.model.Poll;
|
||||
import org.joinmastodon.android.model.Relationship;
|
||||
import org.joinmastodon.android.model.Status;
|
||||
import org.joinmastodon.android.ui.BetterItemAnimator;
|
||||
import org.joinmastodon.android.model.DisplayItemsParent;
|
||||
import org.joinmastodon.android.ui.PhotoLayoutHelper;
|
||||
import org.joinmastodon.android.ui.TileGridLayoutManager;
|
||||
import org.joinmastodon.android.ui.displayitems.ExtendedFooterStatusDisplayItem;
|
||||
@@ -85,7 +82,7 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
|
||||
protected HashMap<String, Relationship> relationships=new HashMap<>();
|
||||
protected Rect tmpRect=new Rect();
|
||||
|
||||
private final int THRESHHOLD = 800;
|
||||
private final int THRESHOLD = 800;
|
||||
|
||||
public BaseStatusListFragment(){
|
||||
super(20);
|
||||
@@ -303,7 +300,7 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
|
||||
if (fab!=null && GlobalUserPreferences.enableFabAutoHide) {
|
||||
// This piece of code should make it so that the fab is always visible if the status list scroll view is at the item at the top
|
||||
if(list.getChildAt(0).getTop() == 0){
|
||||
scrollDiff=THRESHHOLD+1;
|
||||
scrollDiff= THRESHOLD +1;
|
||||
}else{
|
||||
if(dy > 0){
|
||||
scrollDiff=0;
|
||||
@@ -323,7 +320,7 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
|
||||
fab.setVisibility(View.INVISIBLE);
|
||||
scrollDiff = 0;
|
||||
} else if (dy < 0 && fab.getVisibility() != View.VISIBLE) {
|
||||
if (scrollDiff > THRESHHOLD) {
|
||||
if (scrollDiff > THRESHOLD) {
|
||||
TranslateAnimation animate = new TranslateAnimation(
|
||||
0,
|
||||
0,
|
||||
|
||||
@@ -29,6 +29,7 @@ import android.graphics.drawable.LayerDrawable;
|
||||
import android.icu.text.BreakIterator;
|
||||
import android.media.MediaMetadataRetriever;
|
||||
import android.net.Uri;
|
||||
import android.opengl.Visibility;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.Parcelable;
|
||||
@@ -1945,7 +1946,9 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
|
||||
}
|
||||
|
||||
private void loadDefaultStatusVisibility(Bundle savedInstanceState) {
|
||||
if(replyTo != null) statusVisibility = replyTo.visibility;
|
||||
if(replyTo != null) {
|
||||
statusVisibility = (replyTo.visibility == StatusPrivacy.PUBLIC && GlobalUserPreferences.defaultToUnlistedReplies ? StatusPrivacy.UNLISTED : replyTo.visibility);
|
||||
}
|
||||
|
||||
// A saved privacy setting from a previous compose session wins over the reply visibility
|
||||
if(savedInstanceState !=null){
|
||||
|
||||
@@ -1,14 +1,9 @@
|
||||
package org.joinmastodon.android.fragments;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
|
||||
import org.joinmastodon.android.R;
|
||||
import org.joinmastodon.android.api.requests.timelines.GetPublicTimeline;
|
||||
import org.joinmastodon.android.model.Filter;
|
||||
import org.joinmastodon.android.model.Status;
|
||||
import org.joinmastodon.android.model.TimelineDefinition;
|
||||
import org.joinmastodon.android.utils.StatusFilterPredicate;
|
||||
|
||||
import java.util.List;
|
||||
@@ -16,7 +11,7 @@ import java.util.stream.Collectors;
|
||||
|
||||
import me.grishka.appkit.api.SimpleCallback;
|
||||
|
||||
public class CustomLocalTimelineFragment extends PinnableStatusListFragment {
|
||||
public class CustomLocalTimelineFragment extends StatusListFragment {
|
||||
// private String name;
|
||||
private String domain;
|
||||
|
||||
@@ -40,11 +35,6 @@ public class CustomLocalTimelineFragment extends PinnableStatusListFragment {
|
||||
setTitle(this.domain);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected TimelineDefinition makeTimelineDefinition() {
|
||||
return TimelineDefinition.ofCustomLocalTimeline(domain);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doLoadData(int offset, int count){
|
||||
currentRequest=new GetPublicTimeline(true, false, refreshing ? null : maxID, count)
|
||||
@@ -55,6 +45,11 @@ public class CustomLocalTimelineFragment extends PinnableStatusListFragment {
|
||||
maxID=result.get(result.size()-1).id;
|
||||
if (getActivity() == null) return;
|
||||
result=result.stream().filter(new StatusFilterPredicate(accountID, Filter.FilterContext.PUBLIC)).collect(Collectors.toList());
|
||||
result.stream().forEach(status -> {
|
||||
status.account.acct += "@"+domain;
|
||||
status.reloadWhenClicked = true;
|
||||
});
|
||||
|
||||
onDataLoaded(result, !result.isEmpty());
|
||||
}
|
||||
})
|
||||
|
||||
@@ -7,6 +7,7 @@ import static org.joinmastodon.android.ui.utils.UiUtils.makeBackItem;
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.text.InputType;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
@@ -150,7 +151,7 @@ public class EditTimelinesFragment extends BaseRecyclerFragment<TimelineDefiniti
|
||||
FrameLayout inputWrap = new FrameLayout(getContext());
|
||||
EditText input = new EditText(getContext());
|
||||
input.setHint(R.string.sk_example_domain);
|
||||
input.setText(GlobalUserPreferences.publishButtonText.trim());
|
||||
input.setInputType(InputType.TYPE_TEXT_VARIATION_URI);
|
||||
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
|
||||
params.setMargins(V.dp(16), V.dp(4), V.dp(16), V.dp(16));
|
||||
input.setLayoutParams(params);
|
||||
@@ -190,7 +191,7 @@ public class EditTimelinesFragment extends BaseRecyclerFragment<TimelineDefiniti
|
||||
hashtagsMenu.getItem().setIcon(R.drawable.ic_fluent_number_symbol_24_regular);
|
||||
|
||||
MenuItem addLocalTimelines = menu.add(0, R.id.menu_add_local_timelines, NONE, R.string.local_timeline);
|
||||
addLocalTimelines.setIcon(R.drawable.ic_fluent_people_community_24_regular);
|
||||
addLocalTimelines.setIcon(R.drawable.ic_fluent_add_24_regular);
|
||||
|
||||
makeBackItem(timelinesMenu);
|
||||
makeBackItem(listsMenu);
|
||||
|
||||
@@ -16,6 +16,10 @@ import android.widget.FrameLayout;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
|
||||
import androidx.annotation.IdRes;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import org.joinmastodon.android.GlobalUserPreferences;
|
||||
import org.joinmastodon.android.R;
|
||||
import org.joinmastodon.android.api.session.AccountSession;
|
||||
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||
@@ -28,8 +32,6 @@ import org.parceler.Parcels;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import androidx.annotation.IdRes;
|
||||
import androidx.annotation.Nullable;
|
||||
import me.grishka.appkit.FragmentStackActivity;
|
||||
import me.grishka.appkit.fragments.AppKitFragment;
|
||||
import me.grishka.appkit.fragments.LoaderFragment;
|
||||
@@ -52,6 +54,7 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene
|
||||
private TabBar tabBar;
|
||||
private View tabBarWrap;
|
||||
private ImageView tabBarAvatar;
|
||||
private ImageView notificationTabIcon;
|
||||
@IdRes
|
||||
private int currentTab=R.id.tab_home;
|
||||
|
||||
@@ -117,6 +120,9 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene
|
||||
Account self=AccountSessionManager.getInstance().getAccount(accountID).self;
|
||||
ViewImageLoader.load(tabBarAvatar, null, new UrlImageLoaderRequest(self.avatar, V.dp(28), V.dp(28)));
|
||||
|
||||
notificationTabIcon=content.findViewById(R.id.tab_notifications);
|
||||
setNotificationBadge();
|
||||
|
||||
if(savedInstanceState==null){
|
||||
getChildFragmentManager().beginTransaction()
|
||||
.add(R.id.fragment_wrap, homeTabFragment)
|
||||
@@ -255,6 +261,13 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene
|
||||
scrollable.scrollToTop();
|
||||
return;
|
||||
}
|
||||
|
||||
if(tab == R.id.tab_notifications){
|
||||
GlobalUserPreferences.unreadNotifications = false;
|
||||
GlobalUserPreferences.save();
|
||||
setNotificationBadge();
|
||||
}
|
||||
|
||||
getChildFragmentManager().beginTransaction().hide(fragmentForTab(currentTab)).show(newFragment).commit();
|
||||
maybeTriggerLoading(newFragment);
|
||||
currentTab=tab;
|
||||
@@ -327,4 +340,8 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene
|
||||
// getChildFragmentManager().putFragment(outState, "notificationsFragment", notificationsFragment);
|
||||
// getChildFragmentManager().putFragment(outState, "profileFragment", profileFragment);
|
||||
}
|
||||
|
||||
private void setNotificationBadge() {
|
||||
notificationTabIcon.setImageDrawable(getContext().getDrawable(GlobalUserPreferences.unreadNotifications ? R.drawable.ic_notifications_tab_badged : R.drawable.ic_fluent_alert_28_selector));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -166,8 +166,11 @@ public class NotificationsListFragment extends BaseStatusListFragment<Notificati
|
||||
@Override
|
||||
protected void onShown(){
|
||||
super.onShown();
|
||||
// if(!getArguments().getBoolean("noAutoLoad") && !loaded && !dataLoading)
|
||||
// loadData();
|
||||
if(!getArguments().getBoolean("noAutoLoad") && !loaded && !dataLoading){
|
||||
refreshing=true;
|
||||
loadData();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -199,46 +199,38 @@ public class SettingsFragment extends MastodonToolbarFragment{
|
||||
GlobalUserPreferences.alwaysExpandContentWarnings=i.checked;
|
||||
GlobalUserPreferences.save();
|
||||
}));
|
||||
items.add(new SwitchItem(R.string.sk_tabs_disable_swipe, R.drawable.ic_fluent_swipe_right_24_regular, GlobalUserPreferences.disableSwipe, i->{
|
||||
GlobalUserPreferences.disableSwipe=i.checked;
|
||||
GlobalUserPreferences.save();
|
||||
needAppRestart=true;
|
||||
}));
|
||||
items.add(new SwitchItem(R.string.sk_enable_delete_notifications, R.drawable.ic_fluent_mail_inbox_dismiss_24_regular, GlobalUserPreferences.enableDeleteNotifications, i->{
|
||||
GlobalUserPreferences.enableDeleteNotifications=i.checked;
|
||||
GlobalUserPreferences.save();
|
||||
needAppRestart=true;
|
||||
}));
|
||||
|
||||
// items.add(new SwitchItem(R.string.sk_settings_show_differentiated_notification_icons, R.drawable.ic_ntf_logo, GlobalUserPreferences.showUniformPushNoticationIcons, this::onNotificationStyleChanged));
|
||||
items.add(new SwitchItem(R.string.mo_disable_dividers, R.drawable.ic_fluent_timeline_24_regular, GlobalUserPreferences.disableDividers, i->{
|
||||
GlobalUserPreferences.disableDividers=i.checked;
|
||||
GlobalUserPreferences.save();
|
||||
needAppRestart=true;
|
||||
}));
|
||||
items.add(new SwitchItem(R.string.mo_hide_compose_button_while_scrolling_setting, R.drawable.ic_fluent_edit_24_regular, GlobalUserPreferences.enableFabAutoHide, i->{
|
||||
GlobalUserPreferences.enableFabAutoHide =i.checked;
|
||||
GlobalUserPreferences.save();
|
||||
needAppRestart=true;
|
||||
}));
|
||||
items.add(new SwitchItem(R.string.sk_tabs_disable_swipe, R.drawable.ic_fluent_swipe_right_24_regular, GlobalUserPreferences.disableSwipe, i->{
|
||||
GlobalUserPreferences.disableSwipe=i.checked;
|
||||
GlobalUserPreferences.save();
|
||||
needAppRestart=true;
|
||||
}));
|
||||
|
||||
|
||||
items.add(new HeaderItem(R.string.mo_composer_behavior));
|
||||
items.add(new SwitchItem(R.string.mo_change_default_reply_visibility_to_unlisted, R.drawable.ic_fluent_lock_closed_24_regular, GlobalUserPreferences.defaultToUnlistedReplies, i->{
|
||||
GlobalUserPreferences.defaultToUnlistedReplies=i.checked;
|
||||
GlobalUserPreferences.save();
|
||||
}));
|
||||
items.add(new SwitchItem(R.string.mo_relocate_publish_button, R.drawable.ic_fluent_arrow_autofit_down_24_regular, GlobalUserPreferences.relocatePublishButton, i->{
|
||||
GlobalUserPreferences.relocatePublishButton=i.checked;
|
||||
GlobalUserPreferences.save();
|
||||
}));
|
||||
items.add(new SwitchItem(R.string.sk_settings_single_notification, R.drawable.ic_fluent_convert_range_24_regular, GlobalUserPreferences.keepOnlyLatestNotification, i->{
|
||||
GlobalUserPreferences.keepOnlyLatestNotification=i.checked;
|
||||
GlobalUserPreferences.save();
|
||||
}));
|
||||
items.add(new SwitchItem(R.string.sk_settings_prefix_reply_cw_with_re, R.drawable.ic_fluent_arrow_reply_24_regular, GlobalUserPreferences.prefixRepliesWithRe, i->{
|
||||
GlobalUserPreferences.prefixRepliesWithRe=i.checked;
|
||||
GlobalUserPreferences.save();
|
||||
}));
|
||||
items.add(new SwitchItem(R.string.mo_disable_reminder_to_add_alt_text, R.drawable.ic_fluent_image_alt_text_24_regular, GlobalUserPreferences.disableAltTextReminder, i->{
|
||||
GlobalUserPreferences.showNoAltIndicator=i.checked;
|
||||
GlobalUserPreferences.save();
|
||||
needAppRestart=true;
|
||||
}));
|
||||
|
||||
|
||||
items.add(new SwitchItem(R.string.sk_settings_prefix_reply_cw_with_re, R.drawable.ic_fluent_arrow_reply_24_regular, GlobalUserPreferences.prefixRepliesWithRe, i->{
|
||||
GlobalUserPreferences.prefixRepliesWithRe=i.checked;
|
||||
GlobalUserPreferences.save();
|
||||
}));
|
||||
|
||||
items.add(new HeaderItem(R.string.sk_timelines));
|
||||
items.add(new SwitchItem(R.string.sk_settings_show_replies, R.drawable.ic_fluent_chat_multiple_24_regular, GlobalUserPreferences.showReplies, i->{
|
||||
@@ -303,6 +295,24 @@ public class SettingsFragment extends MastodonToolbarFragment{
|
||||
items.add(new SwitchItem(R.string.sk_notify_update, R.drawable.ic_fluent_history_24_regular, pushSubscription.alerts.update, i->onNotificationsChanged(PushNotification.Type.UPDATE, i.checked), switchEnabled));
|
||||
items.add(new SwitchItem(R.string.sk_notify_poll_results, R.drawable.ic_fluent_poll_24_regular, pushSubscription.alerts.poll, i->onNotificationsChanged(PushNotification.Type.POLL, i.checked), switchEnabled));
|
||||
|
||||
items.add(new HeaderItem(R.string.mo_miscellaneous_settings));
|
||||
items.add(new SwitchItem(R.string.mo_disable_dividers, R.drawable.ic_fluent_timeline_24_regular, GlobalUserPreferences.disableDividers, i->{
|
||||
GlobalUserPreferences.disableDividers=i.checked;
|
||||
GlobalUserPreferences.save();
|
||||
needAppRestart=true;
|
||||
}));
|
||||
items.add(new SwitchItem(R.string.sk_enable_delete_notifications, R.drawable.ic_fluent_mail_inbox_dismiss_24_regular, GlobalUserPreferences.enableDeleteNotifications, i->{
|
||||
GlobalUserPreferences.enableDeleteNotifications=i.checked;
|
||||
GlobalUserPreferences.save();
|
||||
needAppRestart=true;
|
||||
}));
|
||||
items.add(new SwitchItem(R.string.sk_settings_single_notification, R.drawable.ic_fluent_convert_range_24_regular, GlobalUserPreferences.keepOnlyLatestNotification, i->{
|
||||
GlobalUserPreferences.keepOnlyLatestNotification=i.checked;
|
||||
GlobalUserPreferences.save();
|
||||
}));
|
||||
|
||||
|
||||
|
||||
items.add(new HeaderItem(R.string.settings_account));
|
||||
items.add(new TextItem(R.string.sk_settings_profile, ()->UiUtils.launchWebBrowser(getActivity(), "https://"+session.domain+"/settings/profile"), R.drawable.ic_fluent_open_24_regular));
|
||||
items.add(new TextItem(R.string.sk_settings_posting, ()->UiUtils.launchWebBrowser(getActivity(), "https://"+session.domain+"/settings/preferences/other"), R.drawable.ic_fluent_open_24_regular));
|
||||
|
||||
@@ -18,6 +18,7 @@ import org.joinmastodon.android.model.Status;
|
||||
import org.joinmastodon.android.ui.displayitems.ExtendedFooterStatusDisplayItem;
|
||||
import org.joinmastodon.android.ui.displayitems.FooterStatusDisplayItem;
|
||||
import org.joinmastodon.android.ui.displayitems.StatusDisplayItem;
|
||||
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||
import org.parceler.Parcels;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -60,6 +61,18 @@ public abstract class StatusListFragment extends BaseStatusListFragment<Status>{
|
||||
Status status=getContentStatusByID(id);
|
||||
if(status==null)
|
||||
return;
|
||||
if(status.reloadWhenClicked){
|
||||
UiUtils.lookupStatus(getContext(), status, accountID, null, status1 -> {
|
||||
status1.filterRevealed = true;
|
||||
Bundle args=new Bundle();
|
||||
args.putString("account", accountID);
|
||||
args.putParcelable("status", Parcels.wrap(status1));
|
||||
if(status1.inReplyToAccountId!=null && knownAccounts.containsKey(status1.inReplyToAccountId))
|
||||
args.putParcelable("inReplyToAccount", Parcels.wrap(knownAccounts.get(status1.inReplyToAccountId)));
|
||||
Nav.go(getActivity(), ThreadFragment.class, args);
|
||||
});
|
||||
return;
|
||||
}
|
||||
status.filterRevealed = true;
|
||||
Bundle args=new Bundle();
|
||||
args.putString("account", accountID);
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
package org.joinmastodon.android.model;
|
||||
|
||||
public enum NotificationAction {
|
||||
FAVORITE,
|
||||
BOOST,
|
||||
UNBOOST,
|
||||
BOOKMARK,
|
||||
REPLY,
|
||||
}
|
||||
@@ -17,7 +17,7 @@ public class Poll extends BaseModel{
|
||||
public boolean multiple;
|
||||
public int votersCount;
|
||||
public boolean voted;
|
||||
@RequiredField
|
||||
// @RequiredField
|
||||
public List<Integer> ownVotes;
|
||||
@RequiredField
|
||||
public List<Option> options;
|
||||
|
||||
@@ -62,6 +62,7 @@ public class Status extends BaseModel implements DisplayItemsParent, Searchable{
|
||||
public transient boolean spoilerRevealed;
|
||||
public transient boolean textExpanded, textExpandable;
|
||||
public transient boolean hasGapAfter;
|
||||
public boolean reloadWhenClicked;
|
||||
private transient String strippedText;
|
||||
|
||||
@Override
|
||||
|
||||
@@ -111,11 +111,11 @@ public class AccountCardStatusDisplayItem extends StatusDisplayItem{
|
||||
rejectWrap=findViewById(R.id.reject_btn_wrap);
|
||||
|
||||
View card=findViewById(R.id.card);
|
||||
card.setOutlineProvider(OutlineProviders.roundedRect(6));
|
||||
card.setOutlineProvider(OutlineProviders.roundedRect(12));
|
||||
card.setClipToOutline(true);
|
||||
avatar.setOutlineProvider(OutlineProviders.roundedRect(12));
|
||||
avatar.setClipToOutline(true);
|
||||
cover.setOutlineProvider(OutlineProviders.roundedRect(3));
|
||||
cover.setOutlineProvider(OutlineProviders.roundedRect(12));
|
||||
cover.setClipToOutline(true);
|
||||
actionButton.setOnClickListener(this::onActionButtonClick);
|
||||
acceptButton.setOnClickListener(this::onFollowRequestButtonClick);
|
||||
|
||||
@@ -191,6 +191,19 @@ public class FooterStatusDisplayItem extends StatusDisplayItem{
|
||||
}
|
||||
|
||||
private void onReplyClick(View v){
|
||||
if(item.status.reloadWhenClicked){
|
||||
UiUtils.lookupStatus(v.getContext(),
|
||||
item.status, item.accountID, null,
|
||||
status -> {
|
||||
v.startAnimation(opacityIn);
|
||||
Bundle args=new Bundle();
|
||||
args.putString("account", item.accountID);
|
||||
args.putParcelable("replyTo", Parcels.wrap(status));
|
||||
Nav.go(item.parentFragment.getActivity(), ComposeFragment.class, args);
|
||||
}
|
||||
);
|
||||
return;
|
||||
}
|
||||
v.startAnimation(opacityIn);
|
||||
Bundle args=new Bundle();
|
||||
args.putString("account", item.accountID);
|
||||
@@ -214,6 +227,16 @@ public class FooterStatusDisplayItem extends StatusDisplayItem{
|
||||
}
|
||||
|
||||
private void onBoostClick(View v){
|
||||
if(item.status.reloadWhenClicked){
|
||||
UiUtils.lookupStatus(v.getContext(),
|
||||
item.status, item.accountID, null,
|
||||
status -> {
|
||||
boost.setSelected(!status.reblogged);
|
||||
AccountSessionManager.getInstance().getAccount(item.accountID).getStatusInteractionController().setReblogged(status, !status.reblogged, null, r->boostConsumer(v, r));
|
||||
}
|
||||
);
|
||||
return;
|
||||
}
|
||||
boost.setSelected(!item.status.reblogged);
|
||||
AccountSessionManager.getInstance().getAccount(item.accountID).getStatusInteractionController().setReblogged(item.status, !item.status.reblogged, null, r->boostConsumer(v, r));
|
||||
}
|
||||
@@ -310,6 +333,23 @@ public class FooterStatusDisplayItem extends StatusDisplayItem{
|
||||
}
|
||||
|
||||
private void onFavoriteClick(View v){
|
||||
if(item.status.reloadWhenClicked){
|
||||
UiUtils.lookupStatus(v.getContext(),
|
||||
item.status, item.accountID, null,
|
||||
status -> {
|
||||
favorite.setSelected(!status.favourited);
|
||||
AccountSessionManager.getInstance().getAccount(item.accountID).getStatusInteractionController().setFavorited(status, !status.favourited, r->{
|
||||
if (status.favourited) {
|
||||
v.startAnimation(GlobalUserPreferences.reduceMotion ? opacityIn : animSet);
|
||||
} else {
|
||||
v.startAnimation(opacityIn);
|
||||
}
|
||||
bindButton(favorite, r.favouritesCount);
|
||||
});
|
||||
}
|
||||
);
|
||||
return;
|
||||
}
|
||||
favorite.setSelected(!item.status.favourited);
|
||||
AccountSessionManager.getInstance().getAccount(item.accountID).getStatusInteractionController().setFavorited(item.status, !item.status.favourited, r->{
|
||||
if (item.status.favourited) {
|
||||
@@ -336,6 +376,18 @@ public class FooterStatusDisplayItem extends StatusDisplayItem{
|
||||
}
|
||||
|
||||
private void onBookmarkClick(View v){
|
||||
if(item.status.reloadWhenClicked){
|
||||
UiUtils.lookupStatus(v.getContext(),
|
||||
item.status, item.accountID, null,
|
||||
status -> {
|
||||
bookmark.setSelected(!status.bookmarked);
|
||||
AccountSessionManager.getInstance().getAccount(item.accountID).getStatusInteractionController().setBookmarked(status, !status.bookmarked, r->{
|
||||
v.startAnimation(opacityIn);
|
||||
});
|
||||
}
|
||||
);
|
||||
return;
|
||||
}
|
||||
bookmark.setSelected(!item.status.bookmarked);
|
||||
AccountSessionManager.getInstance().getAccount(item.accountID).getStatusInteractionController().setBookmarked(item.status, !item.status.bookmarked, r->{
|
||||
v.startAnimation(opacityIn);
|
||||
|
||||
@@ -441,6 +441,14 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
|
||||
return;
|
||||
}
|
||||
Bundle args=new Bundle();
|
||||
if(item.status != null && item.status.reloadWhenClicked){
|
||||
UiUtils.lookupAccount(v.getContext(), item.status.account, item.accountID, null, account -> {
|
||||
args.putString("account", item.accountID);
|
||||
args.putParcelable("profileAccount", Parcels.wrap(account));
|
||||
Nav.go(item.parentFragment.getActivity(), ProfileFragment.class, args);
|
||||
});
|
||||
return;
|
||||
}
|
||||
args.putString("account", item.accountID);
|
||||
args.putParcelable("profileAccount", Parcels.wrap(item.user));
|
||||
Nav.go(item.parentFragment.getActivity(), ProfileFragment.class, args);
|
||||
|
||||
@@ -67,13 +67,13 @@ public class InsetStatusItemDecoration extends RecyclerView.ItemDecoration{
|
||||
paint.setColor(bgColor);
|
||||
rect.left=V.dp(12);
|
||||
rect.right=list.getWidth()-V.dp(12);
|
||||
rect.inset(V.dp(4), V.dp(4));
|
||||
c.drawRoundRect(rect, V.dp(4), V.dp(4), paint);
|
||||
rect.intersect(V.dp(4), V.dp(4), V.dp(4), V.dp(-4));
|
||||
c.drawRoundRect(rect, V.dp(12), V.dp(12), paint);
|
||||
paint.setStyle(Paint.Style.STROKE);
|
||||
paint.setStrokeWidth(V.dp(1));
|
||||
paint.setColor(borderColor);
|
||||
rect.inset(paint.getStrokeWidth()/2f, paint.getStrokeWidth()/2f);
|
||||
c.drawRoundRect(rect, V.dp(4), V.dp(4), paint);
|
||||
c.drawRoundRect(rect, V.dp(12), V.dp(12), paint);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -36,7 +36,9 @@ import android.text.SpannableStringBuilder;
|
||||
import android.text.Spanned;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.Gravity;
|
||||
import android.view.HapticFeedbackConstants;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.SubMenu;
|
||||
@@ -99,6 +101,7 @@ import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.time.Duration;
|
||||
import java.time.Instant;
|
||||
import java.time.ZoneId;
|
||||
import java.time.ZonedDateTime;
|
||||
@@ -109,6 +112,7 @@ import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
import java.util.function.BiPredicate;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Function;
|
||||
@@ -464,12 +468,45 @@ public class UiUtils{
|
||||
}
|
||||
|
||||
public static void confirmToggleMuteUser(Activity activity, String accountID, Account account, boolean currentlyMuted, Consumer<Relationship> resultCallback){
|
||||
showConfirmationAlert(activity, activity.getString(currentlyMuted ? R.string.confirm_unmute_title : R.string.confirm_mute_title),
|
||||
activity.getString(currentlyMuted ? R.string.confirm_unmute : R.string.confirm_mute, account.displayName),
|
||||
activity.getString(currentlyMuted ? R.string.do_unmute : R.string.do_mute),
|
||||
currentlyMuted ? R.drawable.ic_fluent_speaker_0_28_regular : R.drawable.ic_fluent_speaker_off_28_regular,
|
||||
()->{
|
||||
new SetAccountMuted(account.id, !currentlyMuted)
|
||||
View menu = LayoutInflater.from(activity).inflate(R.layout.item_mute_duration, null);
|
||||
Button button = menu.findViewById(R.id.button);
|
||||
|
||||
AtomicReference<Duration> muteDuration = new AtomicReference<>(Duration.ZERO);
|
||||
|
||||
PopupMenu popupMenu=new PopupMenu(activity, button, Gravity.CENTER_HORIZONTAL);
|
||||
popupMenu.inflate(R.menu.mute_duration);
|
||||
popupMenu.setOnMenuItemClickListener(item -> {
|
||||
int id = item.getItemId();
|
||||
if (id == R.id.duration_indefinite)
|
||||
muteDuration.set(Duration.ZERO);
|
||||
else if (id == R.id.duration_minutes_5) {
|
||||
muteDuration.set(Duration.ofMinutes(5));
|
||||
}else if (id == R.id.duration_minutes_30) {
|
||||
muteDuration.set(Duration.ofMinutes(30));
|
||||
}else if (id == R.id.duration_hours_1) {
|
||||
muteDuration.set(Duration.ofHours(1));
|
||||
}else if (id == R.id.duration_hours_6) {
|
||||
muteDuration.set(Duration.ofHours(6));
|
||||
}else if (id == R.id.duration_days_1) {
|
||||
muteDuration.set(Duration.ofDays(1));
|
||||
}else if (id == R.id.duration_days_3) {
|
||||
muteDuration.set(Duration.ofDays(3));
|
||||
}else if (id == R.id.duration_days_7) {
|
||||
muteDuration.set(Duration.ofDays(7));
|
||||
}
|
||||
button.setText(item.getTitle());
|
||||
return true;
|
||||
});
|
||||
button.setOnTouchListener(popupMenu.getDragToOpenListener());
|
||||
button.setOnClickListener(v->popupMenu.show());
|
||||
button.setText(popupMenu.getMenu().getItem(0).getTitle());
|
||||
|
||||
new M3AlertDialogBuilder(activity)
|
||||
.setTitle(activity.getString(currentlyMuted ? R.string.confirm_unmute_title : R.string.confirm_mute_title))
|
||||
.setMessage(activity.getString(currentlyMuted ? R.string.confirm_unmute : R.string.confirm_mute, account.displayName))
|
||||
.setView(currentlyMuted ? null : menu)
|
||||
.setPositiveButton(activity.getString(currentlyMuted ? R.string.do_unmute : R.string.do_mute), (dlg, i)-> {
|
||||
new SetAccountMuted(account.id, !currentlyMuted, muteDuration.get().getSeconds())
|
||||
.setCallback(new Callback<>(){
|
||||
@Override
|
||||
public void onSuccess(Relationship result){
|
||||
@@ -486,7 +523,10 @@ public class UiUtils{
|
||||
})
|
||||
.wrapProgress(activity, R.string.loading, false)
|
||||
.exec(accountID);
|
||||
});
|
||||
})
|
||||
.setNegativeButton(R.string.cancel, null)
|
||||
.setIcon(currentlyMuted ? R.drawable.ic_fluent_speaker_0_28_regular : R.drawable.ic_fluent_speaker_off_28_regular)
|
||||
.show();
|
||||
}
|
||||
public static void confirmDeletePost(Activity activity, String accountID, Status status, Consumer<Status> resultCallback){
|
||||
confirmDeletePost(activity, accountID, status, resultCallback, false);
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<item>
|
||||
<shape>
|
||||
<solid android:color="?colorPollVoted"/>
|
||||
<corners android:radius="4dp"/>
|
||||
<corners android:radius="8dp"/>
|
||||
</shape>
|
||||
</item>
|
||||
</ripple>
|
||||
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:drawable="@drawable/ic_fluent_alert_28_selector" android:left="2dp" android:right="2dp" android:top="2dp" android:bottom="2dp"/>
|
||||
<item android:width="14dp" android:height="14dp" android:gravity="top|right">
|
||||
<shape android:shape="oval">
|
||||
<stroke android:color="?android:colorPrimary" android:width="2dp"/>
|
||||
<solid android:color="?android:colorAccent"/>
|
||||
</shape>
|
||||
</item>
|
||||
</layer-list>
|
||||
@@ -36,7 +36,7 @@
|
||||
android:layout_marginTop="16dp"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:layout_marginHorizontal="16dp"
|
||||
android:inputType="textFilter|textNoSuggestions"
|
||||
android:inputType="textFilter|textNoSuggestions|textUri"
|
||||
android:singleLine="true"
|
||||
android:imeOptions="actionGo"
|
||||
android:drawableStart="@drawable/ic_fluent_globe_20_regular"
|
||||
|
||||
42
mastodon/src/main/res/layout/item_mute_duration.xml
Normal file
42
mastodon/src/main/res/layout/item_mute_duration.xml
Normal file
@@ -0,0 +1,42 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:orientation="horizontal"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:minHeight="48dp"
|
||||
android:paddingBottom="16dp"
|
||||
android:gravity="center_vertical"
|
||||
android:layoutDirection="locale">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/text"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="24dp"
|
||||
android:layout_weight="1"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:paddingVertical="8dp"
|
||||
android:gravity="center_vertical"
|
||||
android:textColor="?android:textColorPrimary"
|
||||
android:text="@string/mo_mute_label"
|
||||
android:textSize="16sp" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="32dp"
|
||||
android:layout_weight="0"
|
||||
android:layout_marginEnd="24dp"
|
||||
android:maxWidth="140dp"
|
||||
android:background="@drawable/bg_inline_button"
|
||||
android:elevation="0dp"
|
||||
android:ellipsize="middle"
|
||||
android:fontFamily="sans-serif-medium"
|
||||
android:singleLine="true"
|
||||
android:stateListAnimator="@null"
|
||||
android:textColor="?android:textColorPrimary"
|
||||
android:textSize="16sp"
|
||||
tools:text="@string/mute_user" />
|
||||
|
||||
</LinearLayout>
|
||||
11
mastodon/src/main/res/menu/mute_duration.xml
Normal file
11
mastodon/src/main/res/menu/mute_duration.xml
Normal file
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:id="@+id/duration_indefinite" android:title="@string/mo_duration_indefinite" />
|
||||
<item android:id="@+id/duration_minutes_5" android:title="@string/mo_duration_minutes_5"/>
|
||||
<item android:id="@+id/duration_minutes_30" android:title="@string/mo_duration_minutes_30"/>
|
||||
<item android:id="@+id/duration_hours_1" android:title="@string/mo_duration_hours_1"/>
|
||||
<item android:id="@+id/duration_hours_6" android:title="@string/mo_duration_hours_6"/>
|
||||
<item android:id="@+id/duration_days_1" android:title="@string/mo_duration_days_1"/>
|
||||
<item android:id="@+id/duration_days_3" android:title="@string/mo_duration_days_3"/>
|
||||
<item android:id="@+id/duration_days_7" android:title="@string/mo_duration_days_7"/>
|
||||
</menu>
|
||||
@@ -26,4 +26,18 @@
|
||||
<string name="mo_sending_error">Fehler beim Veröffentlichen</string>
|
||||
<string name="mo_filtered">Gefiltert: %s</string>
|
||||
<string name="mo_disable_reminder_to_add_alt_text">Erinnerung zum Hinzufügen einer Bildbeschreibung deaktivieren</string>
|
||||
<string name="mo_add_custom_server_local_timeline">Füge eine lokale Timeline eines benutzerdefinierten Servers hinzu</string>
|
||||
<string name="mo_notification_action_replied">Erfolgreich auf den Beitrag von %s geantwortet</string>
|
||||
<string name="mo_duration_hours_1">1 Stunde</string>
|
||||
<string name="mo_duration_hours_6">6 Stunden</string>
|
||||
<string name="mo_duration_days_1">1 Tag</string>
|
||||
<string name="mo_duration_days_3">3 Tage</string>
|
||||
<string name="mo_mute_label">Dauer:</string>
|
||||
<string name="mo_duration_indefinite">Unbestimmt</string>
|
||||
<string name="mo_duration_minutes_5">5 Minuten</string>
|
||||
<string name="mo_duration_minutes_30">30 Minuten</string>
|
||||
<string name="mo_change_default_reply_visibility_to_unlisted">Standard Antwortsichtbarkeit auf nicht aufgelistet ändern</string>
|
||||
<string name="mo_duration_days_7">7 Tage</string>
|
||||
<string name="mo_composer_behavior">Verhalten des Verfassers</string>
|
||||
<string name="mo_miscellaneous_settings">Sonstige Einstellungen</string>
|
||||
</resources>
|
||||
@@ -20,4 +20,7 @@
|
||||
<string name="mo_settings_contribute">Contribuir en Moshidon</string>
|
||||
<string name="mo_no_image_desc">Las imágenes incluidas no tienen descripción. Por favor, piénsate añadir una para permitir a las personas con discapacidad participar.</string>
|
||||
<string name="mo_filtered">Filtrado: %s</string>
|
||||
<string name="mo_disable_reminder_to_add_alt_text">Desactivar recordatorio para añadir descripción</string>
|
||||
<string name="mo_add_custom_server_local_timeline">Añadir una cronología de un servidor</string>
|
||||
<string name="mo_notification_action_replied">Respondió correctamente a la publicación de %s</string>
|
||||
</resources>
|
||||
@@ -259,4 +259,7 @@
|
||||
<string name="sk_settings_prefix_reply_cw_with_re">Añadir \"re:\" a respuestas a Advertencias de Contenido</string>
|
||||
<string name="sk_spectator_mode">Modo espectador</string>
|
||||
<string name="sk_settings_hide_interaction">Ocultar los botones interactivos</string>
|
||||
<string name="sk_follow_as">Seguir desde otra cuenta</string>
|
||||
<string name="sk_followed_as">Seguido de %s</string>
|
||||
<string name="sk_settings_hide_fab">Ocultar automáticamente el botón Redactar</string>
|
||||
</resources>
|
||||
@@ -72,7 +72,7 @@
|
||||
<string name="sk_settings_translation_availability_note_available">%s-k itzulpena onartzen du!</string>
|
||||
<string name="sk_settings_translation_availability_note_unavailable">%s ez da itzulpena onartzen duten instantzien artean ageri.</string>
|
||||
<string name="sk_clear_all_notifications">Ezabatu jakinarazpen guztiak</string>
|
||||
<string name="sk_clear_all_notifications_confirm_action">Ezabatu dena</string>
|
||||
<string name="sk_clear_all_notifications_confirm_action">Ezabatu denak</string>
|
||||
<string name="sk_clear_all_notifications_confirm">Ziur al zaude jakinarazpen guztiak ezabatu nahi dituzula\?</string>
|
||||
<string name="sk_loading_fediverse_resource_title">Fedibertsoan bilatzen</string>
|
||||
<string name="sk_undo_reblog">Bultzada desegin</string>
|
||||
@@ -146,7 +146,7 @@
|
||||
<string name="sk_changelog">Aldaketen zerrenda</string>
|
||||
<string name="sk_alt_text_missing">Eranskin batek gutxienez ez du deskribapenik.</string>
|
||||
<string name="sk_publish_anyway">Argitaratu hala ere</string>
|
||||
<string name="sk_settings_disable_alt_text_reminder">Desgaitu testu alternatiboaren jakinarazpena</string>
|
||||
<string name="sk_settings_disable_alt_text_reminder">Desgaitu gogorarazlea testu alternatiboa gehitzeko</string>
|
||||
<string name="sk_timelines">Denbora-lerroak</string>
|
||||
<string name="sk_timeline_posts">Bidalketak</string>
|
||||
<string name="sk_timelines_add">Gehitu</string>
|
||||
@@ -218,7 +218,7 @@
|
||||
<string name="sk_edit_timelines">Denbora-lerroak editatu</string>
|
||||
<string name="sk_alt_button">ALT</string>
|
||||
<string name="sk_post_edited">Editatua</string>
|
||||
<string name="sk_notification_type_update">Bidalketa editatua</string>
|
||||
<string name="sk_notification_type_update">Editatutako argitalpenak</string>
|
||||
<string name="sk_notify_update">Bultzatutako bidalketa editatu</string>
|
||||
<string name="sk_no_results">Emaitzarik ez</string>
|
||||
<string name="sk_save_draft">Zirriborroa gorde\?</string>
|
||||
@@ -232,4 +232,33 @@
|
||||
<string name="sk_alt_text_missing_title">Testu alternatiboa falta da</string>
|
||||
<string name="sk_searching">Bilatzen…</string>
|
||||
<string name="sk_save_draft_message">Zirriborro honetako aldaketak gorde edo argitaratu nahi dituzu\?</string>
|
||||
<string name="sk_settings_prefix_reply_cw_with_re">Gehitu \"re:\" hasieran edukiaren abisuen erantzunetan</string>
|
||||
<string name="sk_filtered">Iragazita: %s</string>
|
||||
<string name="sk_expand">Zabaldu</string>
|
||||
<string name="sk_collapse">Itxi</string>
|
||||
<string name="sk_settings_collapse_long_posts">Itxi argitalpen oso luzeak</string>
|
||||
<string name="sk_unfinished_attachments">Finkatu eranskinak\?</string>
|
||||
<string name="sk_unfinished_attachments_message">Eranskin batzuk ez dira igo oraindik.</string>
|
||||
<string name="sk_notify_posts_info_banner">Pertsona batzuen argitalpenen jakinarazpenak gaitzen badituzu, beraien argitalpen berriak hemen ageriko dira.</string>
|
||||
<string name="sk_updater_enable_pre_releases">Gaitu beta bertsioak</string>
|
||||
<string name="sk_inline_direct">aipamenak soilik</string>
|
||||
<string name="sk_separator">·</string>
|
||||
<string name="sk_instance_features">Instantziaren ezaugarriak</string>
|
||||
<string name="sk_settings_local_only_explanation">Zure jatorriko instantziak bertan soilik argitaratzea baimendu behar du hau ibili dadin. Aldatutako Mastodon bertsio askok darabilte, baina Mastodonek ez.</string>
|
||||
<string name="sk_inline_local_only">bertan soilik</string>
|
||||
<string name="sk_settings_support_local_only">Zerbitzariak bertan soilik argitaratzea baimentzen du</string>
|
||||
<string name="sk_settings_glitch_instance">Glitch bertan soilik modua</string>
|
||||
<string name="sk_settings_glitch_mode_explanation">Gaitu hau zure jatorrizko instantziak Glitch badarabil. Ez da beharrezkoa Hometown edo Akkomarako.</string>
|
||||
<string name="sk_signed_up">izena emanda</string>
|
||||
<string name="sk_reported">salatuta</string>
|
||||
<string name="sk_sign_ups">Erabiltzaileen izen-ematea</string>
|
||||
<string name="sk_new_reports">Salaketa berriak</string>
|
||||
<string name="sk_local_only">Bertako instantzia soilik</string>
|
||||
<string name="sk_settings_see_new_posts_button">\"Ikusi argitalpen berriak\" botoia</string>
|
||||
<string name="sk_settings_server_version">Zerbitzariaren bertsioa: %s</string>
|
||||
<string name="sk_notify_poll_results">Bozketaren emaitzak</string>
|
||||
<string name="sk_settings_hide_interaction">Ezkutatu interakzio-botoiak</string>
|
||||
<string name="sk_follow_as">Jarraitu beste kontu batetik</string>
|
||||
<string name="sk_followed_as">%s-(d/t)ik jarraitua</string>
|
||||
<string name="sk_settings_hide_fab">Automatikoki ezkutatu Idatzi botoia</string>
|
||||
</resources>
|
||||
@@ -260,4 +260,7 @@
|
||||
<string name="sk_unfinished_attachments_message">Certaines pièces jointes n\'ont pas fini de se télécharger.</string>
|
||||
<string name="sk_spectator_mode">Mode spectateur</string>
|
||||
<string name="sk_settings_hide_interaction">Masquer les boutons d\'interaction</string>
|
||||
<string name="sk_follow_as">Suivre depuis un autre compte</string>
|
||||
<string name="sk_followed_as">Suivi depuis %s</string>
|
||||
<string name="sk_settings_hide_fab">Masquer automatiquement le bouton Composer</string>
|
||||
</resources>
|
||||
@@ -259,4 +259,7 @@
|
||||
<string name="sk_unfinished_attachments">Arranxar arquivos adxuntos\?</string>
|
||||
<string name="sk_spectator_mode">Modo espectador</string>
|
||||
<string name="sk_settings_hide_interaction">Ocultar botóns de interacción</string>
|
||||
<string name="sk_follow_as">Seguir dende outra conta</string>
|
||||
<string name="sk_followed_as">Seguida dende %s</string>
|
||||
<string name="sk_settings_hide_fab">Auto-ocultar botón de redacción</string>
|
||||
</resources>
|
||||
@@ -252,4 +252,15 @@
|
||||
<string name="sk_settings_support_local_only">Server hanya mendukung pengiriman hanya lokal</string>
|
||||
<string name="sk_settings_server_version">Versi server: %s</string>
|
||||
<string name="sk_notify_poll_results">Hasil japat</string>
|
||||
<string name="sk_filtered">Disaring: %s</string>
|
||||
<string name="sk_expand">Buka</string>
|
||||
<string name="sk_collapse">Tutup</string>
|
||||
<string name="sk_settings_hide_interaction">Sembunyikan tombol interaksi</string>
|
||||
<string name="sk_follow_as">Ikuti dari akun lain</string>
|
||||
<string name="sk_followed_as">Diikuti dari %s</string>
|
||||
<string name="sk_settings_prefix_reply_cw_with_re">Awali peringatan konten balasan dengan “re:”</string>
|
||||
<string name="sk_settings_collapse_long_posts">Tutup kiriman yang sangat panjang</string>
|
||||
<string name="sk_unfinished_attachments">Perbaiki lampiran\?</string>
|
||||
<string name="sk_unfinished_attachments_message">Beberapa lampiran belum selesai diunggah.</string>
|
||||
<string name="sk_settings_hide_fab">Sembunyikan tombol Komposer</string>
|
||||
</resources>
|
||||
@@ -53,58 +53,58 @@
|
||||
<string name="sk_post_language">Lingua: %s</string>
|
||||
<string name="sk_language_name">%s (%s)</string>
|
||||
<string name="sk_confirm_clear_recent_languages">Sei sicuro di voler cancellare le lingue usate di recente\?</string>
|
||||
<string name="sk_clear_recent_languages">Cancella lingue usate di recente</string>
|
||||
<string name="sk_clear_recent_languages">Cancella le lingue usate di recente</string>
|
||||
<string name="sk_welcome_title">Benvenuto!</string>
|
||||
<string name="sk_example_domain">example.social</string>
|
||||
<string name="sk_poll_allow_multiple">Consenti scelte multiple</string>
|
||||
<string name="sk_available_languages">Lingue disponibili</string>
|
||||
<string name="sk_welcome_text">Lo squalo ti saluta! Per iniziare inserisci il dominio dell\'istanza a cui sei iscritto.</string>
|
||||
<string name="sk_welcome_text">Lo squalo ti saluta! Per iniziare inserisci qui sotto l\'indirizzo dell\'istanza a cui sei iscritto.</string>
|
||||
<string name="sk_color_palette_material3">Sistema</string>
|
||||
<string name="sk_timeline_local">Locale</string>
|
||||
<string name="sk_timeline_federated">Federata</string>
|
||||
<string name="sk_bookmark_as">Salva con un altro account</string>
|
||||
<string name="sk_bookmark_as">Aggiungi ai segnalibri con un altro account</string>
|
||||
<string name="sk_bookmarked_as">Salvato come %s</string>
|
||||
<string name="sk_favorite_as">Inserisci tra i preferiti con un altro account</string>
|
||||
<string name="sk_favorite_as">Aggiungi ai preferiti con un altro account</string>
|
||||
<string name="sk_favorited_as">Inserito tra i preferiti come %s</string>
|
||||
<string name="sk_already_favorited">Già tra i preferiti</string>
|
||||
<string name="sk_already_favorited">Già aggiunto ai preferiti</string>
|
||||
<string name="sk_reblog_as">Condividi con un altro account</string>
|
||||
<string name="sk_already_reblogged">Condivisione già eseguita</string>
|
||||
<string name="sk_settings_profile">Imposta il profilo</string>
|
||||
<string name="sk_settings_posting">Preferenze dei post</string>
|
||||
<string name="sk_settings_filters">Configura filtri</string>
|
||||
<string name="sk_already_reblogged">Già condiviso</string>
|
||||
<string name="sk_settings_profile">Impostazioni del profilo</string>
|
||||
<string name="sk_settings_posting">Preferenze di pubblicazione</string>
|
||||
<string name="sk_settings_filters">Configura i filtri</string>
|
||||
<string name="sk_settings_rules">Regole</string>
|
||||
<string name="sk_settings_about">Riguardo all\'app</string>
|
||||
<string name="sk_settings_about">Informazioni sull\'app</string>
|
||||
<string name="sk_settings_donate">Dona</string>
|
||||
<string name="sk_delete_notification_confirm_action">Elimina notifica</string>
|
||||
<string name="sk_enable_delete_notifications">Abilita l\'eliminazione delle notifiche</string>
|
||||
<string name="sk_delete_notification_confirm_action">Elimina la notifica</string>
|
||||
<string name="sk_enable_delete_notifications">Abilita la cancellazione delle notifiche</string>
|
||||
<string name="sk_settings_publish_button_text">Testo del pulsante Pubblica</string>
|
||||
<string name="sk_settings_publish_button_text_title">Personalizza il testo del pulsante Pubblica</string>
|
||||
<string name="sk_settings_translation_availability_note_available">%s supporta la traduzione!</string>
|
||||
<string name="sk_settings_translation_availability_note_unavailable">Sembra che %s non supporti la traduzione.</string>
|
||||
<string name="sk_clear_all_notifications">Elimina tutte le notifiche</string>
|
||||
<string name="sk_clear_all_notifications_confirm_action">Elimina tutto</string>
|
||||
<string name="sk_clear_all_notifications_confirm">Sei sicuro di volere eliminare tutte le notifiche\?</string>
|
||||
<string name="sk_settings_translation_availability_note_unavailable">%s non sembra supportare la traduzione.</string>
|
||||
<string name="sk_clear_all_notifications">Cancella tutte le notifiche</string>
|
||||
<string name="sk_clear_all_notifications_confirm_action">Cancella tutto</string>
|
||||
<string name="sk_clear_all_notifications_confirm">Sei sicuro di voler eliminare tutte le notifiche\?</string>
|
||||
<string name="sk_loading_fediverse_resource_title">Cercando nel Fediverso</string>
|
||||
<string name="sk_quote_post">Crea un post riguardo a questo</string>
|
||||
<string name="sk_undo_reblog">Annulla la condivisione</string>
|
||||
<string name="sk_reblog_with_visibility">Condividi con visibilità</string>
|
||||
<string name="sk_copy_link_to_post">Copia il link del post</string>
|
||||
<string name="sk_reblog_with_visibility">Reblog con visibilità</string>
|
||||
<string name="sk_copy_link_to_post">Copia il link al post</string>
|
||||
<string name="sk_open_with_account">Apri con un altro account</string>
|
||||
<string name="sk_resource_not_found">La risorsa non può essere trovata</string>
|
||||
<string name="sk_resource_not_found">Non è stato possibile trovare la risorsa</string>
|
||||
<string name="sk_draft">Bozza</string>
|
||||
<string name="sk_schedule">Programma</string>
|
||||
<string name="sk_confirm_delete_draft_title">Elimina bozza</string>
|
||||
<string name="sk_draft_or_schedule">Bozza o programma</string>
|
||||
<string name="sk_draft_or_schedule">Salva nelle bozze o programma</string>
|
||||
<string name="sk_compose_scheduled">Programmato per</string>
|
||||
<string name="sk_draft_saved">Bozza salvata</string>
|
||||
<string name="sk_forward_report_to">Inoltra a %s</string>
|
||||
<string name="sk_confirm_delete_scheduled_post_title">Elimina post programmato</string>
|
||||
<string name="sk_confirm_delete_scheduled_post">Sei sicuro di volere eliminare questo post programmato\?</string>
|
||||
<string name="sk_confirm_delete_scheduled_post">Sei sicuro di voler eliminare questo post programmato\?</string>
|
||||
<string name="sk_compose_draft">Il post verrà salvato come bozza.</string>
|
||||
<string name="sk_post_scheduled">Post programmato</string>
|
||||
<string name="sk_scheduled_too_soon_title">L\'orario programmato è troppo presto</string>
|
||||
<string name="sk_mark_as_draft">Segna come bozza</string>
|
||||
<string name="sk_schedule_post">Programma post</string>
|
||||
<string name="sk_schedule_post">Programma il post</string>
|
||||
<string name="sk_compose_no_schedule">Non programmare</string>
|
||||
<string name="sk_compose_no_draft">Non tenere in bozza</string>
|
||||
<string name="sk_announcements">Annunci</string>
|
||||
@@ -123,25 +123,25 @@
|
||||
<string name="sk_reply_as">Rispondi con un altro account</string>
|
||||
<string name="sk_settings_uniform_icon_for_notifications">Icona uniforme per tutte le notifiche</string>
|
||||
<string name="sk_color_palette_red">Rosso</string>
|
||||
<string name="sk_tabs_disable_swipe">Disabilita lo scorrimento tra schede</string>
|
||||
<string name="sk_settings_auth">Impostazioni della sicurezza</string>
|
||||
<string name="sk_delete_notification">Elimina notifica</string>
|
||||
<string name="sk_delete_notification_confirm">Sei sicuro di volere eliminare questa notifica\?</string>
|
||||
<string name="sk_settings_translate_only_opened">Traduci solamente i post aperti</string>
|
||||
<string name="sk_loading_resource_on_instance_title">Cercando in %s</string>
|
||||
<string name="sk_hashtags_you_follow">Hashtags che segui</string>
|
||||
<string name="sk_already_bookmarked">Già salvato</string>
|
||||
<string name="sk_tabs_disable_swipe">Disabilita lo scorrimento tra le schede</string>
|
||||
<string name="sk_settings_auth">Impostazioni di sicurezza</string>
|
||||
<string name="sk_delete_notification">Elimina la notifica</string>
|
||||
<string name="sk_delete_notification_confirm">Sei sicuro di voler eliminare questa notifica\?</string>
|
||||
<string name="sk_settings_translate_only_opened">Traduci solo i post aperti</string>
|
||||
<string name="sk_loading_resource_on_instance_title">Cercando su %s</string>
|
||||
<string name="sk_hashtags_you_follow">Hashtag che segui</string>
|
||||
<string name="sk_already_bookmarked">Già aggiunto ai segnalibri</string>
|
||||
<string name="sk_reblogged_as">Condivisione eseguita come %s</string>
|
||||
<string name="sk_unsent_posts">Post annullati</string>
|
||||
<string name="sk_confirm_save_draft">Salva bozza\?</string>
|
||||
<string name="sk_confirm_save_changes">Salva le modifiche\?</string>
|
||||
<string name="sk_unsent_posts">Post non pubblicati</string>
|
||||
<string name="sk_confirm_save_draft">Salvare la bozza\?</string>
|
||||
<string name="sk_confirm_save_changes">Salvare le modifiche\?</string>
|
||||
<string name="sk_schedule_or_draft">Programma o bozza</string>
|
||||
<string name="sk_settings_reduce_motion">Riduci il movimento delle animazioni</string>
|
||||
<string name="sk_settings_about_instance">Riguardo all\'istanza</string>
|
||||
<string name="sk_delete_list_confirm">Sei sicuro di volere eliminare la lista \"%s\"\?</string>
|
||||
<string name="sk_timeline_home">Home</string>
|
||||
<string name="sk_confirm_delete_draft">Sei sicuro di volere eliminare questo post in bozza\?</string>
|
||||
<string name="sk_scheduled_too_soon">I post devono essere programmati almeno tra 10 minuti.</string>
|
||||
<string name="sk_confirm_delete_draft">Sei sicuro di voler cancellare questa bozza\?</string>
|
||||
<string name="sk_scheduled_too_soon">Il post deve essere programmato almeno 10 minuti prima.</string>
|
||||
<string name="sk_recent_searches_placeholder">Scrivi per iniziare a cercare</string>
|
||||
<string name="sk_remove_follower">Rimuovi come follower</string>
|
||||
<string name="sk_remove_follower_confirm">Rimuovi %s come follower bloccandolo e sboccandolo immediatamente\?</string>
|
||||
@@ -250,4 +250,15 @@
|
||||
<string name="sk_settings_see_new_posts_button">Pulsante \"Mostra nuovi post\"</string>
|
||||
<string name="sk_settings_server_version">Versione server:%s</string>
|
||||
<string name="sk_notify_poll_results">Risultati del sondaggio</string>
|
||||
<string name="sk_settings_prefix_reply_cw_with_re">Aggiungi \"re:\" prima dei CW</string>
|
||||
<string name="sk_filtered">Filtrato: %s</string>
|
||||
<string name="sk_expand">Espandi</string>
|
||||
<string name="sk_collapse">Chiudi</string>
|
||||
<string name="sk_settings_collapse_long_posts">Comprimi post molto lunghi</string>
|
||||
<string name="sk_unfinished_attachments">Correggi gli allegati\?</string>
|
||||
<string name="sk_unfinished_attachments_message">Alcuni allegati non hanno finito l\'upload.</string>
|
||||
<string name="sk_settings_hide_interaction">Nascondi i pulsanti di interazione</string>
|
||||
<string name="sk_follow_as">Segui con un altro account</string>
|
||||
<string name="sk_followed_as">Seguito con %s</string>
|
||||
<string name="sk_settings_hide_fab">Nascondi automaticamente il pulsante Pubblica</string>
|
||||
</resources>
|
||||
@@ -259,4 +259,7 @@
|
||||
<string name="sk_settings_collapse_long_posts">아주 긴 게시물 접기</string>
|
||||
<string name="sk_spectator_mode">관객 모드</string>
|
||||
<string name="sk_settings_hide_interaction">상호작용 버튼 가리기</string>
|
||||
<string name="sk_follow_as">다른 계정으로 팔로우</string>
|
||||
<string name="sk_followed_as">%s 계정으로 팔로우함</string>
|
||||
<string name="sk_settings_hide_fab">게시 버튼 자동으로 가리기</string>
|
||||
</resources>
|
||||
@@ -20,4 +20,6 @@
|
||||
<string name="mo_disable_dividers">Wyłącz dzielenie postów</string>
|
||||
<string name="mo_disable_relocate_publish_button_to_enable_customization">Wyłącz opcję Przenoszenia przycisku publikacji aby umożliwić dostosowywanie</string>
|
||||
<string name="mo_filtered">Wyfiltrowano: %s</string>
|
||||
<string name="mo_disable_reminder_to_add_alt_text">Wyłącz przypomnienie o dodaniu opisu</string>
|
||||
<string name="mo_add_custom_server_local_timeline">Dodaj lokalną oś czasu innej instancji</string>
|
||||
</resources>
|
||||
@@ -258,4 +258,7 @@
|
||||
<string name="sk_settings_prefix_reply_cw_with_re">Zaczynaj CW odpowiedzi od “re:”</string>
|
||||
<string name="sk_settings_collapse_long_posts">Zwijaj bardzo długie posty</string>
|
||||
<string name="sk_settings_hide_interaction">Ukryj przyciski interakcji</string>
|
||||
<string name="sk_followed_as">Obserwowane z %s</string>
|
||||
<string name="sk_follow_as">Obserwuj z innego konta</string>
|
||||
<string name="sk_settings_hide_fab">Automatycznie ukrywaj przycisk tworzenia nowego wpisu</string>
|
||||
</resources>
|
||||
@@ -21,4 +21,18 @@
|
||||
<string name="mo_poll_option_add">Adicionar nova opção de enquete</string>
|
||||
<string name="mo_filtered">Filtrado: %s</string>
|
||||
<string name="mo_disable_reminder_to_add_alt_text">Desabilitar lembrete de adicionar textos descritivos</string>
|
||||
<string name="mo_add_custom_server_local_timeline">Adicionar a linha local de um servidor customizado</string>
|
||||
<string name="mo_notification_action_replied">Respondeu com sucesso ao post de %s</string>
|
||||
<string name="mo_composer_behavior">Comportamento do Compositor</string>
|
||||
<string name="mo_duration_hours_1">1 hora</string>
|
||||
<string name="mo_duration_hours_6">6 horas</string>
|
||||
<string name="mo_duration_days_1">1 dia</string>
|
||||
<string name="mo_duration_days_3">3 dias</string>
|
||||
<string name="mo_duration_days_7">7 dias</string>
|
||||
<string name="mo_mute_label">Duração:</string>
|
||||
<string name="mo_duration_indefinite">Indefinido</string>
|
||||
<string name="mo_duration_minutes_5">5 minutos</string>
|
||||
<string name="mo_duration_minutes_30">30 minutos</string>
|
||||
<string name="mo_change_default_reply_visibility_to_unlisted">Mudar visibilidade padrão das respostas para não listado</string>
|
||||
<string name="mo_miscellaneous_settings">Configurações Diversas</string>
|
||||
</resources>
|
||||
@@ -1,4 +1,25 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
</resources>
|
||||
<string name="mo_welcome_text">Щоб розпочати, будь ласка, введіть адресу вашого екземпляру нижче.</string>
|
||||
<string name="mo_no_image_desc">Зображення не мають опису. Ви можете додати його, щоб люди із вадами зору могли зрозуміти, яке забарвлення в котика.</string>
|
||||
<string name="mo_disable_relocate_publish_button_to_enable_customization">Вимкніть переміщення кнопки \"Опублікувати\" для кастомізації</string>
|
||||
<string name="mo_color_palette_nord">Nord</string>
|
||||
<string name="mo_disable_dividers">Вимкнути роздільники публікацій</string>
|
||||
<string name="mo_relocate_publish_button">Перемістити кнопку \"Опублікувати\"</string>
|
||||
<string name="mo_hide_compose_button_while_scrolling_setting">Сховати кнопку \"Нова публікація\" під час прокручування</string>
|
||||
<string name="mo_personal_note">Додати нотатку до цього профілю</string>
|
||||
<string name="mo_personal_note_confirm">Підтвердити зміни</string>
|
||||
<string name="mo_personal_note_update_failed">Не вдалося зберегти нотатку</string>
|
||||
<string name="mo_settings_contribute">Допомогти у розробці Moshidon</string>
|
||||
<string name="mo_update_available">Moshidon %s готовий до завантаження.</string>
|
||||
<string name="mo_update_ready">Moshidon %s готовий до встановлення.</string>
|
||||
<string name="mo_no_image_desc_title">Немає опису зображення</string>
|
||||
<string name="mo_emoji_recent">Нещодавні</string>
|
||||
<string name="mo_clear_recent_emoji">Очистити нещодавні емоджи</string>
|
||||
<string name="mo_disable_reminder_to_add_alt_text">Вимкнути повідомлення про додавання опису зображення</string>
|
||||
<string name="mo_poll_option_add">Опція \"додати нове опитування\"</string>
|
||||
<string name="mo_fab_compose">Новий допис</string>
|
||||
<string name="mo_sending_error">Помилка при публікації</string>
|
||||
<string name="mo_filtered">Відфільтровано: %s</string>
|
||||
<string name="mo_add_custom_server_local_timeline">Додати місцеву стрічку іншого серверу</string>
|
||||
</resources>
|
||||
@@ -259,4 +259,7 @@
|
||||
<string name="sk_unfinished_attachments_message">Деякі вкладення не повністю завантажилися.</string>
|
||||
<string name="sk_spectator_mode">Режим глядача</string>
|
||||
<string name="sk_settings_hide_interaction">Сховати кнопки взаємодії</string>
|
||||
<string name="sk_follow_as">Підписатися з іншого облікового запису</string>
|
||||
<string name="sk_followed_as">Відстежується з %s</string>
|
||||
<string name="sk_settings_hide_fab">Автоматично ховати кнопку компонування</string>
|
||||
</resources>
|
||||
@@ -21,4 +21,18 @@
|
||||
<string name="mo_sending_error">发布帖文时出错</string>
|
||||
<string name="mo_filtered">已过滤:%s</string>
|
||||
<string name="mo_disable_reminder_to_add_alt_text">禁用添加ALT文本的提醒</string>
|
||||
<string name="mo_add_custom_server_local_timeline">添加自定义实例的本地时间线</string>
|
||||
<string name="mo_notification_action_replied">成功回复了 %s 的帖文</string>
|
||||
<string name="mo_duration_minutes_5">5分钟</string>
|
||||
<string name="mo_duration_hours_6">6小时</string>
|
||||
<string name="mo_duration_days_1">1天</string>
|
||||
<string name="mo_duration_days_3">3天</string>
|
||||
<string name="mo_mute_label">持续时间:</string>
|
||||
<string name="mo_duration_indefinite">无限</string>
|
||||
<string name="mo_duration_minutes_30">30分钟</string>
|
||||
<string name="mo_duration_hours_1">1小时</string>
|
||||
<string name="mo_change_default_reply_visibility_to_unlisted">将回复的默认可见性改为“不公开列出”</string>
|
||||
<string name="mo_duration_days_7">7天</string>
|
||||
<string name="mo_composer_behavior">作者的行为</string>
|
||||
<string name="mo_miscellaneous_settings">杂项设置</string>
|
||||
</resources>
|
||||
@@ -26,10 +26,26 @@
|
||||
<string name="mo_disable_relocate_publish_button_to_enable_customization">Disable "Relocate publish button" to allow customization</string>
|
||||
<string name="mo_disable_reminder_to_add_alt_text">Disable reminder to add alt text</string>
|
||||
<string name="mo_add_custom_server_local_timeline">Add a custom server\'s local timeline</string>
|
||||
|
||||
<string name="mo_notification_action_replied">Successfully replied to the post by %s</string>
|
||||
<string name="mo_change_default_reply_visibility_to_unlisted">Change default reply visibility to unlisted</string>
|
||||
<string name="mo_composer_behavior">Composer\'s Behavior</string>
|
||||
<string name="mo_miscellaneous_settings">Miscellaneous Settings</string>
|
||||
|
||||
<!-- accessibility labels-->
|
||||
<string name="mo_poll_option_add">Add new poll option</string>
|
||||
<string name="mo_fab_compose">Compose</string>
|
||||
<string name="mo_sending_error">Error publishing</string>
|
||||
|
||||
<!-- duration labels-->
|
||||
<string name="mo_mute_label">Duration:</string>
|
||||
<string name="mo_duration_indefinite">Indefinite</string>
|
||||
<string name="mo_duration_minutes_5">5 minutes</string>
|
||||
<string name="mo_duration_minutes_30">30 minutes</string>
|
||||
<string name="mo_duration_hours_1">1 hour</string>
|
||||
<string name="mo_duration_hours_6">6 hours</string>
|
||||
<string name="mo_duration_days_1">1 day</string>
|
||||
<string name="mo_duration_days_3">3 days</string>
|
||||
<string name="mo_duration_days_7">7 days</string>
|
||||
|
||||
|
||||
</resources>
|
||||
5
metadata/de-DE/changelogs/94.txt
Normal file
5
metadata/de-DE/changelogs/94.txt
Normal file
@@ -0,0 +1,5 @@
|
||||
Neue Dinge für 94:
|
||||
- Verbesserungen am Verhalten des Fabs
|
||||
- Geringfügige Änderungen am Launchersymbol
|
||||
- Verbesserungen des Benachrichtigungsverhaltens
|
||||
- Kleinere Fehlerbehebungen und Verbesserungen
|
||||
3
metadata/de-DE/changelogs/95.txt
Normal file
3
metadata/de-DE/changelogs/95.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
Neue Dinge für 95:
|
||||
- Hinzufügen der Möglichkeit, die lokalen Timelines anderer Server in den Timelines anzuzeigen
|
||||
- Kleinere Korrekturen und Verbesserungen
|
||||
3
metadata/de-DE/changelogs/96.txt
Normal file
3
metadata/de-DE/changelogs/96.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
Neue Dinge für 96:
|
||||
- Verbesserung der Möglichkeit, die lokalen Timelines anderer Server in den Timelines anzuzeigen
|
||||
- Kleinere Korrekturen und Verbesserungen
|
||||
3
metadata/de-DE/changelogs/97.txt
Normal file
3
metadata/de-DE/changelogs/97.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
Version 97 fügt hinzu:
|
||||
- Die neue Funktion "Benutzerdefinierte lokale Zeitleisten". Sie kann über das Menü "Zeitleisten hinzufügen" aufgerufen werden.
|
||||
- Kleinere Korrekturen und Verbesserungen
|
||||
1
metadata/de-DE/changelogs/98.txt
Normal file
1
metadata/de-DE/changelogs/98.txt
Normal file
@@ -0,0 +1 @@
|
||||
Erste Veröffentlichung im Play Store
|
||||
3
metadata/en-US/changelogs/95.txt
Normal file
3
metadata/en-US/changelogs/95.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
New things for 95:
|
||||
- Adding the ability to have other server's local timelines in the timelines
|
||||
- Minor fixes and improvements
|
||||
3
metadata/en-US/changelogs/96.txt
Normal file
3
metadata/en-US/changelogs/96.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
New things for 96:
|
||||
- Improving the ability to have other server's local timelines in the timelines
|
||||
- Minor fixes and improvements
|
||||
3
metadata/en-US/changelogs/97.txt
Normal file
3
metadata/en-US/changelogs/97.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
Release 97 adds:
|
||||
- New Custom Local Timelines feature. It can be accessed on the add timelines menu
|
||||
- Minor fixes and improvements
|
||||
1
metadata/en-US/changelogs/98.txt
Normal file
1
metadata/en-US/changelogs/98.txt
Normal file
@@ -0,0 +1 @@
|
||||
Initial play store release
|
||||
6
metadata/en-US/changelogs/99.txt
Normal file
6
metadata/en-US/changelogs/99.txt
Normal file
@@ -0,0 +1,6 @@
|
||||
New things for release 99:
|
||||
- Add notification actions
|
||||
- Add option to enable unlisted replies by default
|
||||
- Add mute timer
|
||||
- Add notification badge if there are unread notifications
|
||||
- Minor bugfixes and usability improvements
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 167 KiB After Width: | Height: | Size: 170 KiB |
6
metadata/es-ES/changelogs/59.txt
Normal file
6
metadata/es-ES/changelogs/59.txt
Normal file
@@ -0,0 +1,6 @@
|
||||
- Añadir selector de idioma
|
||||
- Añadir función de traducción
|
||||
- Mejorar la semántica para votar en las encuestas (botones de radio y casillas de verificación)
|
||||
- Añadir la opción de permitir la votación de múltiples opciones en las encuestas
|
||||
- Nueva pantalla de inicio de sesión
|
||||
- Corrección de errores
|
||||
5
metadata/es-ES/changelogs/61.txt
Normal file
5
metadata/es-ES/changelogs/61.txt
Normal file
@@ -0,0 +1,5 @@
|
||||
- Nuevos esquemas de color: Material You y Rojo
|
||||
- Nuevos tonos gris oscuro para todos los esquemas
|
||||
- Icono de impulso ahora más distinguible
|
||||
- Animaciones para botones de interacción.
|
||||
- Corrección de errores (bloqueo en algunas publicaciones, "listas de", idioma predeterminado para nuevas publicaciones)
|
||||
11
metadata/es-ES/changelogs/62.txt
Normal file
11
metadata/es-ES/changelogs/62.txt
Normal file
@@ -0,0 +1,11 @@
|
||||
- Botón de publicación personalizable
|
||||
- Abrir enlaces de Fediverse en la aplicación
|
||||
- Botón boost de pulsación larga para "citar" un post
|
||||
- Copiar la URL de la publicación al pulsar prolongadamente el botón de compartir
|
||||
- Implementar la eliminación de notificaciones (desactivada por defecto)
|
||||
- Iconos específicos para los distintos tipos de notificaciones
|
||||
- Nuevos colores grises
|
||||
- Añadir la opción de desactivar el deslizamiento entre pestañas.
|
||||
- Añadir varios enlaces a la configuración de la cuenta
|
||||
- Mostrar/ocultar el botón de traducción en la línea de tiempo
|
||||
- Corrección de errores y ajustes
|
||||
6
metadata/es-ES/changelogs/63.txt
Normal file
6
metadata/es-ES/changelogs/63.txt
Normal file
@@ -0,0 +1,6 @@
|
||||
- Opción para seleccionar la visibilidad manteniendo presionado el botón de reblog
|
||||
- Ahora se muestra la visibilidad de los reblogs propios.
|
||||
- Lista agregada de hashtags seguidos
|
||||
- Mantenga presionado a la izquierda para copiarlos
|
||||
- Opción de abrir publicaciones con otra cuenta
|
||||
- Corrección de errores y ajustes menores
|
||||
@@ -1,6 +0,0 @@
|
||||
- Filtros mejorados, incluida la compatibilidad con la opción "Ocultar con advertencia"
|
||||
- Página de perfil rediseñada con los metadatos directamente debajo de la biografía.
|
||||
- Función de contraer/expandir para mensajes muy largos.
|
||||
- Opción de anteponer automáticamente el prefijo "re:" a los mensajes de respuesta.
|
||||
- Opción de ocultar los botones de interacción en la línea de tiempo
|
||||
- Varias correcciones de errores, ajustes y mejoras
|
||||
4
metadata/gl-ES/changelogs/77.txt
Normal file
4
metadata/gl-ES/changelogs/77.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
- Manter pulsado o botón de seguir para seguir perfís de outra conta
|
||||
- Opción de abrir perfís de outra conta
|
||||
- Auto-ocultar o botón de redacción cando deslizas cara abaixo na cronoloxía
|
||||
- Arranxado o bloqueo ao abrir os perfís dos administradores do servidor
|
||||
6
metadata/id/changelogs/76.txt
Normal file
6
metadata/id/changelogs/76.txt
Normal file
@@ -0,0 +1,6 @@
|
||||
- Saringan ditingkatkan, termasuk kompatibilitas “Sembunyikan dengan peringatan”
|
||||
- Rancang ulang halaman profil dengan metadata langsung di bawah bio
|
||||
- Fungsi buka/tutup untuk kiriman yang sangat panjang
|
||||
- Opsi untuk menambahkan peringatan konten pada balasan dengan “re:”
|
||||
- Opsi untuk menyembunyikan tombol interaksi di lini masa
|
||||
- Banyak perbaikan kutu, perubahan, dan peningkatan
|
||||
4
metadata/id/changelogs/77.txt
Normal file
4
metadata/id/changelogs/77.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
- Tekan lama pada tombol ikuti untuk mengikuti profil dari akun lain
|
||||
- Opsi untuk membuka profil di akun yang lain
|
||||
- Sembunyikan tombol komposer secara otomatia ketika menggulir lini masa ke bawah
|
||||
- Perbaiki kemogokan ketika membuka profil admin server
|
||||
10
metadata/it-IT/changelogs/67.txt
Normal file
10
metadata/it-IT/changelogs/67.txt
Normal file
@@ -0,0 +1,10 @@
|
||||
- Nuova home con timeline pubbliche
|
||||
- Mostra annunci del server
|
||||
- Testo scalato in base alle impostazioni di sistema
|
||||
- Filtro migliorato (no, "Nascondi con avvertimento" non funziona ancora) da @thiagojedi
|
||||
- Funzionalità di gestione delle liste
|
||||
- Rimozione di follower con blocco morbido
|
||||
- Respinte le connessioni con fascisti
|
||||
- Risolto il non caricamento delle immagini se connessi all'istanza di Akkoma
|
||||
- Risoluzioni di bug e miglioramenti UI
|
||||
- Aggiunto il registro delle modiifche da @LucasGGamerM
|
||||
9
metadata/it-IT/changelogs/74.txt
Normal file
9
metadata/it-IT/changelogs/74.txt
Normal file
@@ -0,0 +1,9 @@
|
||||
- Le timelines possono essere fissate e riorganizzate
|
||||
- Supporto per post solo locali
|
||||
- Aggiunti indicatori per testi alternativi mancanti
|
||||
- Migliorato l'editor del testo alternativo
|
||||
- Aggiunta intestazione nella home per gli hashtag seguiti
|
||||
- Più categorie di notifiche
|
||||
- Aggiunta nuovamente la possibilità di aprire file
|
||||
- Aggiunto avviso quando si salvano le bozze
|
||||
- Aggiunta opzione per disabilitare il tasto "Visualizza nuovi post"
|
||||
6
metadata/it-IT/changelogs/76.txt
Normal file
6
metadata/it-IT/changelogs/76.txt
Normal file
@@ -0,0 +1,6 @@
|
||||
- Migliorati i filtri, compresa la compatibilità con "Nascondi con avvertimento"
|
||||
- Ripensata la pagina del profilo con metadati sotto la bio
|
||||
- Funzione mostra/nascondi per post molto lunghi
|
||||
- Possibilità di iniziare le risposte a dei Content Warning con "re:"
|
||||
- Possiblità di nascondere i pulsanti di interazione nello scorrimento della timeline
|
||||
- Numerose correzioni di bug e miglioramenti
|
||||
4
metadata/it-IT/changelogs/77.txt
Normal file
4
metadata/it-IT/changelogs/77.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
- Possibilità di seguire con un altro account con tocco prolungato
|
||||
- Possibilità di aprire profili con un altro account
|
||||
- Aggiunta la possibilità di nascondere il pulsante per pubblicare quando si scorre nella timeline
|
||||
- Corretti crash nell'apertura di profili degli amministratori del server
|
||||
4
metadata/ko/changelogs/77.txt
Normal file
4
metadata/ko/changelogs/77.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
- 팔로우 버튼을 길게 눌러 다른 계정으로 프로필 팔로우
|
||||
- 다른 계정으로 프로필을 열 수 있는 옵션
|
||||
- 타임라인을 아래로 스크롤할 때 게시 버튼 자동으로 가리기
|
||||
- 서버 관리자 프로필로 앱을 열 때 발생하는 오류 수정
|
||||
4
metadata/pl/changelogs/77.txt
Normal file
4
metadata/pl/changelogs/77.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
- Długie naciśnięcie przycisku "obserwacji" teraz pozwoli ci obserwować profile z innego konta
|
||||
- Opcja otwierania profili innym kontem
|
||||
- Automatyczne ukrywanie przycisku pisania nowego posta podczas przewijania w dół osi czasu
|
||||
- Naprawiono crash podczas otwierania profili administratora serwera
|
||||
1
metadata/pl/short_description.txt
Normal file
1
metadata/pl/short_description.txt
Normal file
@@ -0,0 +1 @@
|
||||
Mastodon na Android ale ma motyw Material You i ma więcej funkcji
|
||||
1
metadata/pl/title.txt
Normal file
1
metadata/pl/title.txt
Normal file
@@ -0,0 +1 @@
|
||||
Moshidon
|
||||
16
metadata/pt-BR/full_description.txt
Normal file
16
metadata/pt-BR/full_description.txt
Normal file
@@ -0,0 +1,16 @@
|
||||
Moshidon é uma versão modificada do aplicativo Mastodon oficial para Android adicionando recursos importantes que estão faltando no aplicativo oficial, como o federado linha do tempo, postagem não listada e um visualizador de descrição de imagem.
|
||||
|
||||
<b>Principais recursos<b>
|
||||
|
||||
- <b>Muitas cores<b>: Traz material do seu tema e muitas opções coloridas de temas!
|
||||
- <b>Postagens filtradas!<b>: A capacidade de exibir postagens filtradas com um aviso!
|
||||
- <b>Botão Traduzir<b>: Traz um botão traduzir!
|
||||
- <b>Seletor de idioma do toot<b>: Traz um seletor de idioma do toot!
|
||||
- <b>Postagem não listada<b>: Poste publicamente sem que sua postagem apareça em tendências, hashtags ou cronogramas públicos.
|
||||
- <b>Linha do tempo federada<b>: Veja todas as postagens públicas de pessoas em todos os outros bairros do Fediverse aos quais sua instância inicial está conectada.
|
||||
- <b>Visualizador de descrição de imagem<b>: Verifique rapidamente se uma imagem ou vídeo tem um texto alternativo anexado a ele.
|
||||
- <b>Pinagem de postagens<b>: Fixe suas postagens mais importantes em seu perfil e veja o que outras pessoas fixaram usando a guia "Fixadas".
|
||||
- <b>Seguir hashtags<b>: veja novas postagens de hashtags específicas diretamente em sua linha do tempo inicial, seguindo-as.
|
||||
- <b>Responder a solicitações de acompanhamento<b>: Aceite ou recuse solicitações de acompanhamento de suas notificações ou da lista dedicada de solicitações de acompanhamento.
|
||||
- <b>Excluir e rediscutir<b>: O recurso muito apreciado que tornou a edição possível sem uma função de edição real.
|
||||
- <b>Extras<b>: Traz muitos recursos extras de UI, como ícones de interação nas Notificações e remove muitos incômodos com a UI original!<b>
|
||||
1
metadata/pt-BR/short_description.txt
Normal file
1
metadata/pt-BR/short_description.txt
Normal file
@@ -0,0 +1 @@
|
||||
Mastodon para Android mas é Material You e tem mais recursos
|
||||
1
metadata/pt-BR/title.txt
Normal file
1
metadata/pt-BR/title.txt
Normal file
@@ -0,0 +1 @@
|
||||
Moshidon
|
||||
4
metadata/uk/changelogs/77.txt
Normal file
4
metadata/uk/changelogs/77.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
- Затискання кнопки підписатися, щоб підписатися на профілі з іншого облікового запису
|
||||
- Можливість відкривати профілі в іншому обліковому записі
|
||||
- Автоприховування кнопки компонування під час гортання стрічки вниз
|
||||
- Виправлено збій під час відкриття профілів адміністратора сервера
|
||||
1
metadata/uk/short_description.txt
Normal file
1
metadata/uk/short_description.txt
Normal file
@@ -0,0 +1 @@
|
||||
Mastodon для Android, але має більше функцій й дизайн Material You
|
||||
1
metadata/uk/title.txt
Normal file
1
metadata/uk/title.txt
Normal file
@@ -0,0 +1 @@
|
||||
Moshidon
|
||||
6
metadata/zh-CN/changelogs/59.txt
Normal file
6
metadata/zh-CN/changelogs/59.txt
Normal file
@@ -0,0 +1,6 @@
|
||||
‐ 新增语言选择器
|
||||
- 新增翻译功能
|
||||
- 改进投票贴文语义 (单选/多选)
|
||||
- 新增允许在投票中设置多选的功能
|
||||
- 新登录界面
|
||||
- 修复部分bug
|
||||
5
metadata/zh-CN/changelogs/61.txt
Normal file
5
metadata/zh-CN/changelogs/61.txt
Normal file
@@ -0,0 +1,5 @@
|
||||
- 新增颜色主题:Material You和红色主题
|
||||
- 为全部主题新增深灰色调
|
||||
- 转发图标改为更醒目的填充式图标
|
||||
- 为互动按钮添加了动画
|
||||
- 修复部分bug(发布部分贴文时崩溃,“特定列表”,贴文默认语言)
|
||||
11
metadata/zh-CN/changelogs/62.txt
Normal file
11
metadata/zh-CN/changelogs/62.txt
Normal file
@@ -0,0 +1,11 @@
|
||||
- 可自定义发布按钮
|
||||
- 在应用中打开Fedivese链接
|
||||
- 长按转发按钮可引用一篇帖子
|
||||
- 长按分享按钮可复制贴文URL
|
||||
- 实现了删除通知功能(默认禁用)
|
||||
- 为不同类型通知提供了专门的图标
|
||||
- 新增灰色色调
|
||||
- 添加禁用滑动切换选项卡的设置
|
||||
- 添加各种链接到账户设置
|
||||
- 添加在时间轴上显示/隐藏翻译按钮的开关
|
||||
- 修复bug与程序微调
|
||||
6
metadata/zh-CN/changelogs/63.txt
Normal file
6
metadata/zh-CN/changelogs/63.txt
Normal file
@@ -0,0 +1,6 @@
|
||||
- 长按可选选择特定转发的可见性
|
||||
- 显示自己转发的可见性
|
||||
- 添加已关注的标签列表
|
||||
- 长按复制链接
|
||||
- 添加使用其它账户打开帖子的选项
|
||||
- 修复bug与程序微调
|
||||
10
metadata/zh-CN/changelogs/65.txt
Normal file
10
metadata/zh-CN/changelogs/65.txt
Normal file
@@ -0,0 +1,10 @@
|
||||
- 草稿和定时发布功能
|
||||
- 回复时显示原帖
|
||||
- 与Mastodon 4.0兼容的过滤器(目前还没有“隐藏并警告功能”)
|
||||
- 长按可通过其它已登录账户与贴文交互
|
||||
- 在所有菜单中添加图标
|
||||
- 新增转发举报的开关
|
||||
- 添加使用“发布关于此事的贴文”功能时的提及(@)功能
|
||||
- 添加使用统一通知图标而非不同图标的设置项
|
||||
- 添加从设置中访问应用内规则列表的选项
|
||||
- 修复bug
|
||||
10
metadata/zh-CN/changelogs/67.txt
Normal file
10
metadata/zh-CN/changelogs/67.txt
Normal file
@@ -0,0 +1,10 @@
|
||||
- 新的主页选项卡,包含公共时间轴
|
||||
- 显示服务器公告
|
||||
- 根据系统设置进行文本缩放
|
||||
- 改进了过滤功能(目前还没有“带警告标识并隐藏”功能)(由@thiagojedi实现)
|
||||
- 列表管理功能
|
||||
- 使用“软拉黑”移除关注你的用户
|
||||
- 不允许与法西斯主义者建立联系
|
||||
- 在连接到Akkoma实例时修复图像加载问题
|
||||
- 修复bug和UI调整
|
||||
- 更新日志刷新器(由@LucasGGamerM实现)
|
||||
9
metadata/zh-CN/changelogs/74.txt
Normal file
9
metadata/zh-CN/changelogs/74.txt
Normal file
@@ -0,0 +1,9 @@
|
||||
- 时间轴可以被固定和重新排列
|
||||
- 支持仅在本地服务器发布
|
||||
- 新增缺失alt文本的提示
|
||||
- 改进alt文本编辑器
|
||||
- 新增标题:时间轴中关注的标签
|
||||
- 更多通知分类
|
||||
- 重新添加文件打开器
|
||||
- 在保存已编辑的草稿时提示
|
||||
- 新增禁用“查看新帖子”按钮的选项
|
||||
6
metadata/zh-CN/changelogs/76.txt
Normal file
6
metadata/zh-CN/changelogs/76.txt
Normal file
@@ -0,0 +1,6 @@
|
||||
- 改进过滤器,包括兼容“警告并隐藏”
|
||||
- 重新设计个人资料页面,元信息直接显示在自我介绍下方
|
||||
- 针对非常长的帖子的折叠/展开功能
|
||||
- 自动为回复加上“re:”前缀的选项
|
||||
- 新增在时间轴中隐藏互动按钮的选项
|
||||
- 各种错误修复、调整和改进
|
||||
4
metadata/zh-CN/changelogs/77.txt
Normal file
4
metadata/zh-CN/changelogs/77.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
- 长按关注按钮可从其他帐户关注个人资料
|
||||
- 新增从其他帐户打开个人资料的选项
|
||||
- 向下滚动时间轴时自动隐藏发帖按钮
|
||||
- 修复打开服务器管理员资料时崩溃的问题
|
||||
5
metadata/zh-CN/changelogs/91.txt
Normal file
5
metadata/zh-CN/changelogs/91.txt
Normal file
@@ -0,0 +1,5 @@
|
||||
版本91的新功能:
|
||||
- 新增为带过滤标签的帖子显示警告的功能
|
||||
- 修复了自动更新程序的问题
|
||||
- 修复了一些与过滤系统相关的崩溃问题
|
||||
- 进行了小规模的优化,提高用户体验
|
||||
4
metadata/zh-CN/changelogs/92.txt
Normal file
4
metadata/zh-CN/changelogs/92.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
版本92的更新内容:
|
||||
- 更好的过滤器
|
||||
- 新的个人资料页面布局
|
||||
- 大量微小的调整和改进
|
||||
5
metadata/zh-CN/changelogs/94.txt
Normal file
5
metadata/zh-CN/changelogs/94.txt
Normal file
@@ -0,0 +1,5 @@
|
||||
版本94的更新内容:
|
||||
- 改进浮动操作按钮的行为
|
||||
- 对启动器图标进行了微小的更改
|
||||
- 改进通知行为
|
||||
- 其它小修复与改进
|
||||
3
metadata/zh-CN/changelogs/95.txt
Normal file
3
metadata/zh-CN/changelogs/95.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
版本95的更新内容:
|
||||
- 增加在时间轴中添加其他服务器的本地时间轴的功能
|
||||
- 一些小修复和改进
|
||||
3
metadata/zh-CN/changelogs/96.txt
Normal file
3
metadata/zh-CN/changelogs/96.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
版本96的更新内容:
|
||||
- 改进在时间轴中添加其他服务器的本地时间轴的功能
|
||||
- 一些小修复和改进
|
||||
3
metadata/zh-CN/changelogs/97.txt
Normal file
3
metadata/zh-CN/changelogs/97.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
版本97的更新内容:
|
||||
- 新增自定义本地时间轴功能。可以在添加时间轴菜单中访问。
|
||||
- 一些小修复和改进
|
||||
1
metadata/zh-CN/changelogs/98.txt
Normal file
1
metadata/zh-CN/changelogs/98.txt
Normal file
@@ -0,0 +1 @@
|
||||
首个Play Store发布版本
|
||||
@@ -3,6 +3,7 @@ Moshidon 是<a href="https://github.com/mastodon/mastodon-android">官方 Mastod
|
||||
<b>主要特点</b>
|
||||
|
||||
- <b>许多颜色</b>:为您提供 material you 主题和许多丰富多彩的主题选项!
|
||||
- <b>过滤贴文</b>:可为带过滤内容标记的贴文显示敏感内容警告!
|
||||
- <b>翻译按钮</b>:带来翻译按钮!
|
||||
- <b>嘟文语言选择器</b>:引入了嘟文语言选择器!
|
||||
- <b>不公开发帖</b>:公开发布而不让您的嘟文出现在趋势、主题标签或公共时间轴中。
|
||||
|
||||
Reference in New Issue
Block a user