From d0a9ba041d3d7473e61283fdeb02f2ac9ee88ec1 Mon Sep 17 00:00:00 2001 From: FineFindus <63370021+FineFindus@users.noreply.github.com> Date: Fri, 17 Feb 2023 22:21:56 +0100 Subject: [PATCH 001/111] fix(fab): completly hide --- .../android/fragments/BaseStatusListFragment.java | 4 +--- .../org/joinmastodon/android/fragments/ProfileFragment.java | 2 -- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java index 231356c24..220720189 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java @@ -304,12 +304,11 @@ public abstract class BaseStatusListFragment exten 0, fab.getHeight() * 2); animate.setDuration(300); - animate.setFillAfter(true); fab.startAnimation(animate); fab.setVisibility(View.INVISIBLE); scrollDiff = 0; } else if (dy < 0 && fab.getVisibility() != View.VISIBLE) { - if (list.getChildLayoutPosition(list.getChildAt(0)) == 0 || scrollDiff > 400) { + if (list.getChildAt(0).getTop() == 0 || scrollDiff > 400) { fab.setVisibility(View.VISIBLE); TranslateAnimation animate = new TranslateAnimation( 0, @@ -317,7 +316,6 @@ public abstract class BaseStatusListFragment exten fab.getHeight() * 2, 0); animate.setDuration(300); - animate.setFillAfter(true); fab.startAnimation(animate); scrollDiff = 0; } else { diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java index 18f4b67aa..e4d087476 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java @@ -798,7 +798,6 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList 0, fab.getHeight() * 2); animate.setDuration(300); - animate.setFillAfter(true); fab.startAnimation(animate); fab.setVisibility(View.INVISIBLE); scrollDiff = 0; @@ -811,7 +810,6 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList fab.getHeight() * 2, 0); animate.setDuration(300); - animate.setFillAfter(true); fab.startAnimation(animate); scrollDiff = 0; } else { From 73481f4a1f6749c375e69b278718aebab4478985 Mon Sep 17 00:00:00 2001 From: FineFindus <63370021+FineFindus@users.noreply.github.com> Date: Sat, 25 Feb 2023 23:19:41 +0100 Subject: [PATCH 002/111] Merge branch 'feat/notification-actions' --- .../android/PushNotificationReceiver.java | 53 ++++++++++++++++++- .../android/model/NotificationAction.java | 7 +++ 2 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 mastodon/src/main/java/org/joinmastodon/android/model/NotificationAction.java diff --git a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java index 5023e1996..3b665e118 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java +++ b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java @@ -9,6 +9,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.graphics.drawable.Drawable; +import android.graphics.drawable.Icon; import android.os.Build; import android.os.Bundle; import android.text.TextUtils; @@ -16,10 +17,15 @@ 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.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.PushNotification; +import org.joinmastodon.android.model.Status; import org.joinmastodon.android.ui.utils.UiUtils; import org.parceler.Parcels; @@ -27,6 +33,7 @@ import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; +import me.grishka.appkit.api.APIRequest; import me.grishka.appkit.api.Callback; import me.grishka.appkit.api.ErrorResponse; import me.grishka.appkit.imageloader.ImageCache; @@ -91,6 +98,25 @@ public class PushNotificationReceiver extends BroadcastReceiver{ Log.w(TAG, "onReceive: invalid push notification format"); } } + if(intent.getBooleanExtra("fromNotificationAction", false)) { + String accountID=intent.getStringExtra("accountID"); + + if(intent.hasExtra("notification")){ + org.joinmastodon.android.model.Notification notification=Parcels.unwrap(intent.getParcelableExtra("notification")); + String statusID=notification.status.id; + if (statusID != null) { + + switch (NotificationAction.values()[intent.getIntExtra("notificationAction", 0)]) { + case FAVORITE -> new SetStatusFavorited(statusID, true).exec(accountID); + case BOOKMARK -> new SetStatusBookmarked(statusID, true).exec(accountID); +// case REBLOG -> new SetStatusReblogged(notification.status.id, true, GlobalUserPreferences.); + 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){ @@ -142,7 +168,7 @@ public class PushNotificationReceiver extends BroadcastReceiver{ .setShowWhen(true) .setCategory(Notification.CATEGORY_SOCIAL) .setAutoCancel(true) - .setColor(context.getColor(R.color.primary_700)); + .setColor(context.getColor(R.color.shortcut_icon_background)); if (!GlobalUserPreferences.uniformNotificationIcon) { builder.setSmallIcon(switch (pn.notificationType) { @@ -164,6 +190,31 @@ public class PushNotificationReceiver extends BroadcastReceiver{ if(AccountSessionManager.getInstance().getLoggedInAccounts().size()>1){ builder.setSubText(accountName); } + + + switch (pn.notificationType) { + case MENTION -> { + builder.addAction(buildNotificationAction(context, accountID, notification, "Favourite", NotificationAction.FAVORITE)); + builder.addAction(buildNotificationAction(context, accountID, notification, "Bookmark", NotificationAction.BOOKMARK)); +// builder.addAction(buildNotificationAction(context, accountID, notification, "Reblog", NotificationAction.REBLOG)); + } +// case FOLLOW -> builder.addAction(buildNotificationAction(context, accountID, notification, null, "Refollow", NotificationAction.FAVORITE)); + } + nm.notify(accountID, GlobalUserPreferences.keepOnlyLatestNotification ? NOTIFICATION_ID : notificationId++, builder.build()); } + + private Notification.Action buildNotificationAction(Context context, String accountID, org.joinmastodon.android.model.Notification notification, String title, NotificationAction action){ + Intent notificationIntent=new Intent(context, PushNotificationReceiver.class); + notificationIntent.putExtra("fromNotificationAction", true); + notificationIntent.putExtra("accountID", accountID); + notificationIntent.putExtra("notificationAction", action.ordinal()); + if(notification!=null){ + notificationIntent.putExtra("notification", Parcels.wrap(notification)); + } + PendingIntent actionPendingIntent = + PendingIntent.getBroadcast(context, 1, notificationIntent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT); + + return new Notification.Action.Builder(null, title, actionPendingIntent).build(); + } } diff --git a/mastodon/src/main/java/org/joinmastodon/android/model/NotificationAction.java b/mastodon/src/main/java/org/joinmastodon/android/model/NotificationAction.java new file mode 100644 index 000000000..d59947bee --- /dev/null +++ b/mastodon/src/main/java/org/joinmastodon/android/model/NotificationAction.java @@ -0,0 +1,7 @@ +package org.joinmastodon.android.model; + +public enum NotificationAction { + FAVORITE, + REBLOG, + BOOKMARK, +} From e68160800d86022149896a297d5285b9733952f0 Mon Sep 17 00:00:00 2001 From: FineFindus <63370021+FineFindus@users.noreply.github.com> Date: Sun, 26 Feb 2023 15:21:52 +0100 Subject: [PATCH 003/111] feat(notifications/action): add boost action --- .../android/PushNotificationReceiver.java | 11 +++++++++-- mastodon/src/main/res/values/strings_sk.xml | 1 + 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java index 3b665e118..5963aff85 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java +++ b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java @@ -24,8 +24,10 @@ 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.Status; +import org.joinmastodon.android.model.StatusPrivacy; import org.joinmastodon.android.ui.utils.UiUtils; import org.parceler.Parcels; @@ -109,7 +111,11 @@ public class PushNotificationReceiver extends BroadcastReceiver{ switch (NotificationAction.values()[intent.getIntExtra("notificationAction", 0)]) { case FAVORITE -> new SetStatusFavorited(statusID, true).exec(accountID); case BOOKMARK -> new SetStatusBookmarked(statusID, true).exec(accountID); -// case REBLOG -> new SetStatusReblogged(notification.status.id, true, GlobalUserPreferences.); + case REBLOG -> { + AccountSessionManager accountSessionManager = AccountSessionManager.getInstance(); + Preferences preferences = accountSessionManager.getAccount(accountID).preferences; + new SetStatusReblogged(notification.status.id, true, preferences.postingDefaultVisibility).exec(accountID); + } default -> Log.w(TAG, "onReceive: Failed to get NotificationAction"); } } @@ -196,7 +202,8 @@ public class PushNotificationReceiver extends BroadcastReceiver{ case MENTION -> { builder.addAction(buildNotificationAction(context, accountID, notification, "Favourite", NotificationAction.FAVORITE)); builder.addAction(buildNotificationAction(context, accountID, notification, "Bookmark", NotificationAction.BOOKMARK)); -// builder.addAction(buildNotificationAction(context, accountID, notification, "Reblog", NotificationAction.REBLOG)); + if (notification != null && notification.status.visibility != StatusPrivacy.DIRECT) + builder.addAction(buildNotificationAction(context, accountID, notification, context.getString(R.string.sk_notification_action_boost), NotificationAction.REBLOG)); } // case FOLLOW -> builder.addAction(buildNotificationAction(context, accountID, notification, null, "Refollow", NotificationAction.FAVORITE)); } diff --git a/mastodon/src/main/res/values/strings_sk.xml b/mastodon/src/main/res/values/strings_sk.xml index a94de6489..28857dd63 100644 --- a/mastodon/src/main/res/values/strings_sk.xml +++ b/mastodon/src/main/res/values/strings_sk.xml @@ -262,4 +262,5 @@ Follow from other account Followed from %s Auto-hide Compose button + Boost \ No newline at end of file From ea190c05976c3dd66fc58a49ff09a9ca05eebe52 Mon Sep 17 00:00:00 2001 From: FineFindus <63370021+FineFindus@users.noreply.github.com> Date: Sun, 26 Feb 2023 15:23:38 +0100 Subject: [PATCH 004/111] feat(notifications/action): use string titles --- .../org/joinmastodon/android/PushNotificationReceiver.java | 4 ++-- mastodon/src/main/res/values/strings_sk.xml | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java index 5963aff85..91780ef43 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java +++ b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java @@ -200,8 +200,8 @@ public class PushNotificationReceiver extends BroadcastReceiver{ switch (pn.notificationType) { case MENTION -> { - builder.addAction(buildNotificationAction(context, accountID, notification, "Favourite", NotificationAction.FAVORITE)); - builder.addAction(buildNotificationAction(context, accountID, notification, "Bookmark", NotificationAction.BOOKMARK)); + builder.addAction(buildNotificationAction(context, accountID, notification, context.getString(R.string.sk_notification_action_favorite), NotificationAction.FAVORITE)); + builder.addAction(buildNotificationAction(context, accountID, notification, context.getString(R.string.sk_notification_action_bookmark), NotificationAction.BOOKMARK)); if (notification != null && notification.status.visibility != StatusPrivacy.DIRECT) builder.addAction(buildNotificationAction(context, accountID, notification, context.getString(R.string.sk_notification_action_boost), NotificationAction.REBLOG)); } diff --git a/mastodon/src/main/res/values/strings_sk.xml b/mastodon/src/main/res/values/strings_sk.xml index 28857dd63..305df8b06 100644 --- a/mastodon/src/main/res/values/strings_sk.xml +++ b/mastodon/src/main/res/values/strings_sk.xml @@ -262,5 +262,7 @@ Follow from other account Followed from %s Auto-hide Compose button + Favorite + Bookmark Boost \ No newline at end of file From bfcd67cbaf50c7f926c3b0719682b068df72f696 Mon Sep 17 00:00:00 2001 From: FineFindus <63370021+FineFindus@users.noreply.github.com> Date: Sun, 26 Feb 2023 19:15:31 +0100 Subject: [PATCH 005/111] feat(notifications/action): only show actions if necessary --- .../android/PushNotificationReceiver.java | 17 ++++++++++++----- mastodon/src/main/res/values/strings_sk.xml | 1 + 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java index 91780ef43..a14844da4 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java +++ b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java @@ -198,14 +198,21 @@ public class PushNotificationReceiver extends BroadcastReceiver{ } + if (notification != null) { switch (pn.notificationType) { case MENTION -> { - builder.addAction(buildNotificationAction(context, accountID, notification, context.getString(R.string.sk_notification_action_favorite), NotificationAction.FAVORITE)); - builder.addAction(buildNotificationAction(context, accountID, notification, context.getString(R.string.sk_notification_action_bookmark), NotificationAction.BOOKMARK)); - if (notification != null && notification.status.visibility != StatusPrivacy.DIRECT) - builder.addAction(buildNotificationAction(context, accountID, notification, context.getString(R.string.sk_notification_action_boost), NotificationAction.REBLOG)); + if(!notification.status.favourited) + builder.addAction(buildNotificationAction(context, accountID, notification, context.getString(R.string.sk_notification_action_favorite), NotificationAction.FAVORITE)); + if(!notification.status.bookmarked) + builder.addAction(buildNotificationAction(context, accountID, notification, context.getString(R.string.sk_notification_action_bookmark), NotificationAction.BOOKMARK)); + if(notification.status.visibility != StatusPrivacy.DIRECT) + builder.addAction(buildNotificationAction(context, accountID, notification, context.getString(R.string.sk_notification_action_boost), NotificationAction.REBLOG)); } -// case FOLLOW -> builder.addAction(buildNotificationAction(context, accountID, notification, null, "Refollow", NotificationAction.FAVORITE)); + case FOLLOW -> { +// if ( notification != null && notification.status.account.) + builder.addAction(buildNotificationAction(context, accountID, notification, context.getString(R.string.sk_notification_action_follow), NotificationAction.FAVORITE)); + } + } } nm.notify(accountID, GlobalUserPreferences.keepOnlyLatestNotification ? NOTIFICATION_ID : notificationId++, builder.build()); diff --git a/mastodon/src/main/res/values/strings_sk.xml b/mastodon/src/main/res/values/strings_sk.xml index 305df8b06..1d90fbaab 100644 --- a/mastodon/src/main/res/values/strings_sk.xml +++ b/mastodon/src/main/res/values/strings_sk.xml @@ -265,4 +265,5 @@ Favorite Bookmark Boost + Refollow \ No newline at end of file From 50362d630b651fcec21e1e4f47906cbec62c56f0 Mon Sep 17 00:00:00 2001 From: FineFindus <63370021+FineFindus@users.noreply.github.com> Date: Sun, 26 Feb 2023 20:50:03 +0100 Subject: [PATCH 006/111] feat(notifications/action): add unboost action --- .../android/PushNotificationReceiver.java | 38 +++++++++---------- .../android/model/NotificationAction.java | 4 +- mastodon/src/main/res/values/strings_sk.xml | 1 + 3 files changed, 21 insertions(+), 22 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java index a14844da4..4c5938e81 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java +++ b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java @@ -9,7 +9,6 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.graphics.drawable.Drawable; -import android.graphics.drawable.Icon; import android.os.Build; import android.os.Bundle; import android.text.TextUtils; @@ -26,7 +25,6 @@ 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.Status; import org.joinmastodon.android.model.StatusPrivacy; import org.joinmastodon.android.ui.utils.UiUtils; import org.parceler.Parcels; @@ -35,7 +33,6 @@ import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; -import me.grishka.appkit.api.APIRequest; import me.grishka.appkit.api.Callback; import me.grishka.appkit.api.ErrorResponse; import me.grishka.appkit.imageloader.ImageCache; @@ -107,15 +104,14 @@ public class PushNotificationReceiver extends BroadcastReceiver{ 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 REBLOG -> { - AccountSessionManager accountSessionManager = AccountSessionManager.getInstance(); - Preferences preferences = accountSessionManager.getAccount(accountID).preferences; - new SetStatusReblogged(notification.status.id, true, preferences.postingDefaultVisibility).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); default -> Log.w(TAG, "onReceive: Failed to get NotificationAction"); } } @@ -199,20 +195,20 @@ public class PushNotificationReceiver extends BroadcastReceiver{ if (notification != null) { - switch (pn.notificationType) { - case MENTION -> { - if(!notification.status.favourited) - builder.addAction(buildNotificationAction(context, accountID, notification, context.getString(R.string.sk_notification_action_favorite), NotificationAction.FAVORITE)); - if(!notification.status.bookmarked) - builder.addAction(buildNotificationAction(context, accountID, notification, context.getString(R.string.sk_notification_action_bookmark), NotificationAction.BOOKMARK)); - if(notification.status.visibility != StatusPrivacy.DIRECT) - builder.addAction(buildNotificationAction(context, accountID, notification, context.getString(R.string.sk_notification_action_boost), NotificationAction.REBLOG)); + switch (pn.notificationType) { + case MENTION, STATUS -> { + if(!notification.status.favourited) + builder.addAction(buildNotificationAction(context, accountID, notification, context.getString(R.string.sk_notification_action_favorite), NotificationAction.FAVORITE)); + if(!notification.status.bookmarked) + builder.addAction(buildNotificationAction(context, accountID, notification, context.getString(R.string.sk_notification_action_bookmark), NotificationAction.BOOKMARK)); + if(notification.status.visibility != StatusPrivacy.DIRECT) + builder.addAction(buildNotificationAction(context, accountID, notification, context.getString(R.string.sk_notification_action_boost), NotificationAction.BOOST)); + } + case UPDATE -> { + if(notification.status.reblogged) + builder.addAction(buildNotificationAction(context, accountID, notification, context.getString(R.string.sk_notification_action_unboost), NotificationAction.UNBOOST)); + } } - case FOLLOW -> { -// if ( notification != null && notification.status.account.) - builder.addAction(buildNotificationAction(context, accountID, notification, context.getString(R.string.sk_notification_action_follow), NotificationAction.FAVORITE)); - } - } } nm.notify(accountID, GlobalUserPreferences.keepOnlyLatestNotification ? NOTIFICATION_ID : notificationId++, builder.build()); diff --git a/mastodon/src/main/java/org/joinmastodon/android/model/NotificationAction.java b/mastodon/src/main/java/org/joinmastodon/android/model/NotificationAction.java index d59947bee..420bb1d1a 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/model/NotificationAction.java +++ b/mastodon/src/main/java/org/joinmastodon/android/model/NotificationAction.java @@ -2,6 +2,8 @@ package org.joinmastodon.android.model; public enum NotificationAction { FAVORITE, - REBLOG, + BOOST, + UNBOOST, BOOKMARK, + REPLY, } diff --git a/mastodon/src/main/res/values/strings_sk.xml b/mastodon/src/main/res/values/strings_sk.xml index 1d90fbaab..73e65aea3 100644 --- a/mastodon/src/main/res/values/strings_sk.xml +++ b/mastodon/src/main/res/values/strings_sk.xml @@ -265,5 +265,6 @@ Favorite Bookmark Boost + Unboost Refollow \ No newline at end of file From 0b58d19811d9e3ad4314c9d684e64679b3531075 Mon Sep 17 00:00:00 2001 From: FineFindus <63370021+FineFindus@users.noreply.github.com> Date: Sun, 26 Feb 2023 21:56:18 +0100 Subject: [PATCH 007/111] feat(notifications/action): remove notfication after action --- .../android/PushNotificationReceiver.java | 26 +++++++++++-------- .../android/model/NotificationAction.java | 1 - 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java index 4c5938e81..fa8a02b90 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java +++ b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java @@ -99,6 +99,12 @@ public class PushNotificationReceiver extends BroadcastReceiver{ } 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(notificationId); + } if(intent.hasExtra("notification")){ org.joinmastodon.android.model.Notification notification=Parcels.unwrap(intent.getParcelableExtra("notification")); @@ -193,35 +199,33 @@ public class PushNotificationReceiver extends BroadcastReceiver{ builder.setSubText(accountName); } + int id = GlobalUserPreferences.keepOnlyLatestNotification ? NOTIFICATION_ID : notificationId++; if (notification != null) { switch (pn.notificationType) { case MENTION, STATUS -> { - if(!notification.status.favourited) - builder.addAction(buildNotificationAction(context, accountID, notification, context.getString(R.string.sk_notification_action_favorite), NotificationAction.FAVORITE)); - if(!notification.status.bookmarked) - builder.addAction(buildNotificationAction(context, accountID, notification, context.getString(R.string.sk_notification_action_bookmark), NotificationAction.BOOKMARK)); + builder.addAction(buildNotificationAction(context, id, accountID, notification, context.getString(R.string.sk_notification_action_favorite), NotificationAction.FAVORITE)); + builder.addAction(buildNotificationAction(context, id, accountID, notification, context.getString(R.string.sk_notification_action_bookmark), NotificationAction.BOOKMARK)); if(notification.status.visibility != StatusPrivacy.DIRECT) - builder.addAction(buildNotificationAction(context, accountID, notification, context.getString(R.string.sk_notification_action_boost), NotificationAction.BOOST)); + builder.addAction(buildNotificationAction(context, id, accountID, notification, context.getString(R.string.sk_notification_action_boost), NotificationAction.BOOST)); } case UPDATE -> { if(notification.status.reblogged) - builder.addAction(buildNotificationAction(context, accountID, notification, context.getString(R.string.sk_notification_action_unboost), NotificationAction.UNBOOST)); + builder.addAction(buildNotificationAction(context, id, accountID, notification, context.getString(R.string.sk_notification_action_unboost), NotificationAction.UNBOOST)); } } } - nm.notify(accountID, GlobalUserPreferences.keepOnlyLatestNotification ? NOTIFICATION_ID : notificationId++, builder.build()); + nm.notify(accountID, id, builder.build()); } - private Notification.Action buildNotificationAction(Context context, String accountID, org.joinmastodon.android.model.Notification notification, String title, NotificationAction action){ + 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()); - if(notification!=null){ - notificationIntent.putExtra("notification", Parcels.wrap(notification)); - } + notificationIntent.putExtra("notification", Parcels.wrap(notification)); PendingIntent actionPendingIntent = PendingIntent.getBroadcast(context, 1, notificationIntent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT); diff --git a/mastodon/src/main/java/org/joinmastodon/android/model/NotificationAction.java b/mastodon/src/main/java/org/joinmastodon/android/model/NotificationAction.java index 420bb1d1a..6fc1259a0 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/model/NotificationAction.java +++ b/mastodon/src/main/java/org/joinmastodon/android/model/NotificationAction.java @@ -5,5 +5,4 @@ public enum NotificationAction { BOOST, UNBOOST, BOOKMARK, - REPLY, } From 2dc6deb93a0ea74e72b14b7f8d4fed1f9b1f8998 Mon Sep 17 00:00:00 2001 From: FineFindus <63370021+FineFindus@users.noreply.github.com> Date: Mon, 27 Feb 2023 20:24:09 +0100 Subject: [PATCH 008/111] fix(notifications/action): use radom request code Fixes the issue with pendingIntents overwriting each other. Probability of equal same request code should be near 0 with 2^32 ints available --- .../org/joinmastodon/android/PushNotificationReceiver.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java index fa8a02b90..1fb45f4fb 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java +++ b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java @@ -31,6 +31,7 @@ import org.parceler.Parcels; import java.util.Arrays; import java.util.List; +import java.util.Random; import java.util.stream.Collectors; import me.grishka.appkit.api.Callback; @@ -227,7 +228,7 @@ public class PushNotificationReceiver extends BroadcastReceiver{ notificationIntent.putExtra("notificationAction", action.ordinal()); notificationIntent.putExtra("notification", Parcels.wrap(notification)); PendingIntent actionPendingIntent = - PendingIntent.getBroadcast(context, 1, notificationIntent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT); + PendingIntent.getBroadcast(context, new Random().nextInt(), notificationIntent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_ONE_SHOT); return new Notification.Action.Builder(null, title, actionPendingIntent).build(); } From 1c3857060966db3cfaf71906fffeed26ccd6bb01 Mon Sep 17 00:00:00 2001 From: FineFindus <63370021+FineFindus@users.noreply.github.com> Date: Mon, 27 Feb 2023 21:15:28 +0100 Subject: [PATCH 009/111] fix(notifications/action): remove notification after tapping action --- .../java/org/joinmastodon/android/PushNotificationReceiver.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java index 1fb45f4fb..dfe52cd2c 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java +++ b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java @@ -104,7 +104,7 @@ public class PushNotificationReceiver extends BroadcastReceiver{ if ( notificationId >= 0) { NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); - notificationManager.cancel(notificationId); + notificationManager.cancel(accountID, notificationId); } if(intent.hasExtra("notification")){ From 36808e4e8e1b06af5d7830d0e2189822ce6f7a00 Mon Sep 17 00:00:00 2001 From: FineFindus <63370021+FineFindus@users.noreply.github.com> Date: Mon, 27 Feb 2023 21:18:51 +0100 Subject: [PATCH 010/111] fix(notifications/action): remove unused string --- mastodon/src/main/res/values/strings_sk.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/mastodon/src/main/res/values/strings_sk.xml b/mastodon/src/main/res/values/strings_sk.xml index 73e65aea3..e97ee60d1 100644 --- a/mastodon/src/main/res/values/strings_sk.xml +++ b/mastodon/src/main/res/values/strings_sk.xml @@ -266,5 +266,4 @@ Bookmark Boost Unboost - Refollow \ No newline at end of file From 6756b36e8791b37d5a7b8d6efdea10bbbbc882aa Mon Sep 17 00:00:00 2001 From: FineFindus <63370021+FineFindus@users.noreply.github.com> Date: Mon, 27 Feb 2023 21:20:02 +0100 Subject: [PATCH 011/111] style(notifications/action): fix whitespaces --- .../android/PushNotificationReceiver.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java index dfe52cd2c..6f92d5348 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java +++ b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java @@ -98,11 +98,11 @@ public class PushNotificationReceiver extends BroadcastReceiver{ Log.w(TAG, "onReceive: invalid push notification format"); } } - if(intent.getBooleanExtra("fromNotificationAction", false)) { + if(intent.getBooleanExtra("fromNotificationAction", false)){ String accountID=intent.getStringExtra("accountID"); int notificationId=intent.getIntExtra("notificationId", -1); - if ( notificationId >= 0) { + if (notificationId >= 0){ NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.cancel(accountID, notificationId); } @@ -122,7 +122,7 @@ public class PushNotificationReceiver extends BroadcastReceiver{ default -> Log.w(TAG, "onReceive: Failed to get NotificationAction"); } } - } else { + }else{ Log.e(TAG, "onReceive: Failed to load notification"); } } @@ -202,8 +202,8 @@ public class PushNotificationReceiver extends BroadcastReceiver{ int id = GlobalUserPreferences.keepOnlyLatestNotification ? NOTIFICATION_ID : notificationId++; - if (notification != null) { - switch (pn.notificationType) { + if (notification != null){ + switch (pn.notificationType){ case MENTION, STATUS -> { builder.addAction(buildNotificationAction(context, id, accountID, notification, context.getString(R.string.sk_notification_action_favorite), NotificationAction.FAVORITE)); builder.addAction(buildNotificationAction(context, id, accountID, notification, context.getString(R.string.sk_notification_action_bookmark), NotificationAction.BOOKMARK)); @@ -227,8 +227,7 @@ public class PushNotificationReceiver extends BroadcastReceiver{ 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); + 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(); } From cbcdf09bfea7aaa529706ef4a95220601bc36dd3 Mon Sep 17 00:00:00 2001 From: FineFindus <63370021+FineFindus@users.noreply.github.com> Date: Fri, 3 Mar 2023 23:45:07 +0100 Subject: [PATCH 012/111] Merge branch 'feat/notification-actions' --- .../android/PushNotificationReceiver.java | 68 ++++++++++++++++++- .../android/model/NotificationAction.java | 1 + mastodon/src/main/res/values/strings_sk.xml | 2 + 3 files changed, 70 insertions(+), 1 deletion(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java index 6f92d5348..d66529974 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java +++ b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java @@ -5,17 +5,22 @@ 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; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; +import android.service.notification.StatusBarNotification; import android.text.TextUtils; import android.util.Log; +import androidx.annotation.RequiresApi; + 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; @@ -32,6 +37,7 @@ 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; @@ -44,6 +50,9 @@ 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; @Override @@ -119,6 +128,7 @@ public class PushNotificationReceiver extends BroadcastReceiver{ 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"); } } @@ -205,10 +215,14 @@ public class PushNotificationReceiver extends BroadcastReceiver{ 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.sk_notification_action_favorite), NotificationAction.FAVORITE)); builder.addAction(buildNotificationAction(context, id, accountID, notification, context.getString(R.string.sk_notification_action_bookmark), NotificationAction.BOOKMARK)); - if(notification.status.visibility != StatusPrivacy.DIRECT) + if(notification.status.visibility != StatusPrivacy.DIRECT) { builder.addAction(buildNotificationAction(context, id, accountID, notification, context.getString(R.string.sk_notification_action_boost), NotificationAction.BOOST)); + } } case UPDATE -> { if(notification.status.reblogged) @@ -231,4 +245,56 @@ public class PushNotificationReceiver extends BroadcastReceiver{ 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.sk_notification_action_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(); + req.language = preferences.postingDefaultLanguage; + req.visibility = preferences.postingDefaultVisibility; + 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.sk_notification_action_replied, notification.status.account.getDisplayUsername())) + .build(); +// notificationManager.cancel(accountID, notificationId); +// notificationManager.notify(notificationId, repliedNotification); + notificationManager.notify(accountID, notificationId, repliedNotification); + } } diff --git a/mastodon/src/main/java/org/joinmastodon/android/model/NotificationAction.java b/mastodon/src/main/java/org/joinmastodon/android/model/NotificationAction.java index 6fc1259a0..420bb1d1a 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/model/NotificationAction.java +++ b/mastodon/src/main/java/org/joinmastodon/android/model/NotificationAction.java @@ -5,4 +5,5 @@ public enum NotificationAction { BOOST, UNBOOST, BOOKMARK, + REPLY, } diff --git a/mastodon/src/main/res/values/strings_sk.xml b/mastodon/src/main/res/values/strings_sk.xml index e97ee60d1..a14d23879 100644 --- a/mastodon/src/main/res/values/strings_sk.xml +++ b/mastodon/src/main/res/values/strings_sk.xml @@ -266,4 +266,6 @@ Bookmark Boost Unboost + Reply + Successfully replied to the post by %s \ No newline at end of file From 1124bab96bab163871d3ed5e817589efddda33fa Mon Sep 17 00:00:00 2001 From: FineFindus <63370021+FineFindus@users.noreply.github.com> Date: Fri, 3 Mar 2023 23:49:45 +0100 Subject: [PATCH 013/111] style(notifications-actions/reply): clean-up --- .../org/joinmastodon/android/PushNotificationReceiver.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java index d66529974..a9175a983 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java +++ b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java @@ -12,12 +12,9 @@ import android.content.Intent; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; -import android.service.notification.StatusBarNotification; import android.text.TextUtils; import android.util.Log; -import androidx.annotation.RequiresApi; - import org.joinmastodon.android.api.MastodonAPIController; import org.joinmastodon.android.api.requests.notifications.GetNotificationByID; import org.joinmastodon.android.api.requests.statuses.CreateStatus; @@ -281,7 +278,7 @@ public class PushNotificationReceiver extends BroadcastReceiver{ req.spoilerText = "re: " + notification.status.spoilerText; } -// new CreateStatus(req, UUID.randomUUID().toString()).exec(accountID); + 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 ? @@ -293,8 +290,6 @@ public class PushNotificationReceiver extends BroadcastReceiver{ Notification repliedNotification = builder.setSmallIcon(R.drawable.ic_ntf_logo) .setContentText(context.getString(R.string.sk_notification_action_replied, notification.status.account.getDisplayUsername())) .build(); -// notificationManager.cancel(accountID, notificationId); -// notificationManager.notify(notificationId, repliedNotification); notificationManager.notify(accountID, notificationId, repliedNotification); } } From 5e8ede6ab8b7787e61cd8ec70478fffe86ead507 Mon Sep 17 00:00:00 2001 From: FineFindus <63370021+FineFindus@users.noreply.github.com> Date: Fri, 3 Mar 2023 23:49:45 +0100 Subject: [PATCH 014/111] style(notifications-actions/reply): clean-up From 654e3eb36bdfa24cd97259c306d4b89b534310fd Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Thu, 9 Mar 2023 23:29:35 +0100 Subject: [PATCH 015/111] New translations strings.xml (Japanese) --- mastodon/src/main/res/values-ja-rJP/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/mastodon/src/main/res/values-ja-rJP/strings.xml b/mastodon/src/main/res/values-ja-rJP/strings.xml index 2c3e2f8f8..e883e73d7 100644 --- a/mastodon/src/main/res/values-ja-rJP/strings.xml +++ b/mastodon/src/main/res/values-ja-rJP/strings.xml @@ -401,6 +401,7 @@ 人気のアカウント すべてフォローする 同意しない + ※: 私たちはいかなる個人情報も収集しません。 %s のポリシーに同意しない 自己紹介 From d769f757ed98131941123ffcf4281ff843482a96 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 11 Mar 2023 08:04:43 +0100 Subject: [PATCH 016/111] New translations full_description.txt (Belarusian) --- fastlane/metadata/android/be-BY/full_description.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastlane/metadata/android/be-BY/full_description.txt b/fastlane/metadata/android/be-BY/full_description.txt index 0f54689a5..0f1eacfce 100644 --- a/fastlane/metadata/android/be-BY/full_description.txt +++ b/fastlane/metadata/android/be-BY/full_description.txt @@ -2,7 +2,7 @@ Mastodon - гэта найбуйнейшая дэцэнтралізаваная Далучайцеся да супольнасці і стварыце свой профіль. Знаходзьце цікавых людзей, сачыце за імі і чытайце іх допісы ў храналагічнай стужцы без рэкламы. Выяўляйце сябе з дапамогай карыстальніцкіх эмодзі, малюнкаў, GIF-файлаў, відэа і аўдыя ў допісах на 500 знакаў. Удзельнічайце ў абмеркаваннях і прасоўвайце выдатныя допісы ад іншых людзей. Знаходзьце новыя ўліковыя запісы, на якія можна падпісацца, і папулярныя хэштэгі, каб пашырыць сваю сетку. -Mastodon створаны з акцэнтам на прыватнасць і бяспеку. Вырашайце з кім абагульваць вашы допісы: з вашымі падпісчыкамі, толькі з людзьмі, якіх вы згадваеце, або з усім светам. Папярэджанні аб змесце дазваляюць схаваць допісы, якія змяшчаюць канфідэнцыяльны або правакацыйны матэрыял, пакуль вы не будзеце гатовыя да яго. Кожная суполка мае ўласныя правілы і мадэратараў, якія забяспечваюць бяспеку яе ўдзельнікаў, а надзейныя інструменты блакіроўкі і сістэма скарг дапамагаюць прадухіліць злоўжыванні. +Mastodon створаны з акцэнтам на прыватнасць і бяспеку. Вырашайце з кім абагульваць вашы допісы: з вашымі падпісчыкамі, толькі з людзьмі, якіх вы згадваеце або з усім светам. Папярэджанні аб змесціве дазваляюць схаваць допісы, якія змяшчаюць канфідэнцыяльны або правакацыйны матэрыял, пакуль вы не будзеце гатовыя да яго. Кожная суполка мае ўласныя правілы і мадэратараў, якія забяспечваюць бяспеку яе ўдзельнікаў, а надзейныя інструменты блакіроўкі і сістэма скарг дапамагаюць прадухіліць злоўжыванні. Больш функцый: From a3146d6cddacfa560e665d65567d35b9478ba10c Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 11 Mar 2023 09:12:18 +0100 Subject: [PATCH 017/111] New translations full_description.txt (Belarusian) --- fastlane/metadata/android/be-BY/full_description.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fastlane/metadata/android/be-BY/full_description.txt b/fastlane/metadata/android/be-BY/full_description.txt index 0f1eacfce..f702b54fe 100644 --- a/fastlane/metadata/android/be-BY/full_description.txt +++ b/fastlane/metadata/android/be-BY/full_description.txt @@ -8,9 +8,9 @@ Mastodon створаны з акцэнтам на прыватнасць і б • Цёмны рэжым: чытайце допісы ў светлым, цёмным або сапраўдным чорным рэжыме • Апытанні: пытайцеся ў падпісчыкаў іх меркаванне і падлічвайце галасы -• Даследуйце: папулярныя хэштэгі і ўліковыя запісы даступныя адным націскам +• Даследуйце: папулярныя хэштэгі і ўліковыя запісы — адным дотыкам • Апавяшчэнні: атрымлівайце апавяшчэнні аб новых падпісчыках, адказах і рэпостах • Абагульванне: публікуйце непасрэдна ў Mastodon з любога меню абагульвання ў любой праграме -• Прывабнасць: наш талісман - чароўны слон, і вы будзеце бачыць, як ён з'яўляецца час ад часу +• Прывабнасць: нашым талісманам з'яўляецца чароўны слон, і час ад часу ён будзеце з'яўляцца перад вамі Mastodon з'яўляецца зарэгістраванай некамерцыйнай арганізацыяй і яго развіццё падтрымліваецца непасрэдна вашымі ахвяраваннямі. У нас няма рэкламы, манетызацыі і венчурнага капіталу, і мы плануем так і працягваць. From 5c7fe9dcb505566a461e8df5f6bd9a28c036115b Mon Sep 17 00:00:00 2001 From: FineFindus <63370021+FineFindus@users.noreply.github.com> Date: Sat, 11 Mar 2023 13:00:36 +0100 Subject: [PATCH 018/111] fix: disable group divider on EMUI (#453) Fixes an issues, where the forth menu item does not show up, when the divider is enabled on EMUI devices --- .../org/joinmastodon/android/fragments/HomeTabFragment.java | 2 +- .../main/java/org/joinmastodon/android/ui/utils/UiUtils.java | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTabFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTabFragment.java index 37ce0e002..adf202bce 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTabFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTabFragment.java @@ -358,7 +358,7 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab addListsToOverflowMenu(); addHashtagsToOverflowMenu(); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && !UiUtils.isEMUI()) { m.setGroupDividerEnabled(true); } } diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java b/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java index c720958a5..ee413c9be 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java @@ -1143,6 +1143,10 @@ public class UiUtils { return !TextUtils.isEmpty(getSystemProperty("ro.miui.ui.version.code")); } + public static boolean isEMUI() { + return !TextUtils.isEmpty(getSystemProperty("ro.build.version.emui")); + } + public static int alphaBlendColors(int color1, int color2, float alpha) { float alpha0 = 1f - alpha; int r = Math.round(((color1 >> 16) & 0xFF) * alpha0 + ((color2 >> 16) & 0xFF) * alpha); From 4d04741fe000af8a9d833c84ecb0d3bf7d09c9a0 Mon Sep 17 00:00:00 2001 From: FineFindus <63370021+FineFindus@users.noreply.github.com> Date: Sat, 11 Mar 2023 13:01:11 +0100 Subject: [PATCH 019/111] feat(welcome): use URI InputType (#454) --- mastodon/src/main/res/layout/header_welcome_custom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mastodon/src/main/res/layout/header_welcome_custom.xml b/mastodon/src/main/res/layout/header_welcome_custom.xml index ed6bda666..ea6c2a9e7 100644 --- a/mastodon/src/main/res/layout/header_welcome_custom.xml +++ b/mastodon/src/main/res/layout/header_welcome_custom.xml @@ -36,7 +36,7 @@ android:layout_marginTop="16dp" android:layout_marginBottom="8dp" android:layout_marginHorizontal="16dp" - android:inputType="textFilter|textNoSuggestions" + android:inputType="textUri|textNoSuggestions" android:singleLine="true" android:imeOptions="actionGo" android:drawableStart="@drawable/ic_fluent_globe_20_regular" From 675c49a9228960ab9923716bb5aa80f109b3ab1e Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 11 Mar 2023 14:05:46 +0100 Subject: [PATCH 020/111] New translations strings.xml (Urdu (India)) --- mastodon/src/main/res/values-ur-rIN/strings.xml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 mastodon/src/main/res/values-ur-rIN/strings.xml diff --git a/mastodon/src/main/res/values-ur-rIN/strings.xml b/mastodon/src/main/res/values-ur-rIN/strings.xml new file mode 100644 index 000000000..0091cc2f8 --- /dev/null +++ b/mastodon/src/main/res/values-ur-rIN/strings.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + From 884347da1249a926d7992a14ca6ee922eecaa3bf Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 11 Mar 2023 14:05:47 +0100 Subject: [PATCH 021/111] New translations full_description.txt (Urdu (India)) --- .../metadata/android/ur-IN/full_description.txt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 fastlane/metadata/android/ur-IN/full_description.txt diff --git a/fastlane/metadata/android/ur-IN/full_description.txt b/fastlane/metadata/android/ur-IN/full_description.txt new file mode 100644 index 000000000..11d74abb1 --- /dev/null +++ b/fastlane/metadata/android/ur-IN/full_description.txt @@ -0,0 +1,16 @@ +Mastodon is the largest decentralized social network on the internet. Instead of a single website, it’s a network of millions of users in independent communities that can all interact with one another, seamlessly. No matter what you’re into, you can meet passionate people posting about it on Mastodon! + +Join a community and create your profile. Find and follow fascinating folks and read their posts in an ad-free, chronological timeline. Express yourself with custom emoji, images, GIFs, videos, and audio in 500-character posts. Reply to threads and reblog posts from anyone to share great stuff. Find new accounts to follow and trending hashtags to expand your network. + +Mastodon is built with a focus on privacy and safety. Decide whether your posts are shared with your followers, just the people you mention, or the whole world. Content warnings let you hide posts containing sensitive or triggering material until you're ready to engage with them. Each community has its own guidelines and moderators to keep its members safe, and robust blocking and reporting tools help prevent abuse. + +More features: + +• Dark Mode: Read posts in light, dark, or true black mode +• Polls: Ask followers for their opinion and tally the votes +• Explore: Trending hashtags and accounts are a tap away +• Notifications: Get notified about new follows, replies, and reblogs +• Sharing: Post directly to Mastodon from any share sheet in any app +• Cuteness: Our mascot is an adorable elephant, and you'll see them pop up from time to time + +Mastodon is a registered nonprofit and development is supported directly by your donations. There’s no advertising, no monetization, and no venture capital, and we plan to keep it that way. From 656364db601b697c49f7d4f18dcb3041f3e554f1 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 11 Mar 2023 14:05:48 +0100 Subject: [PATCH 022/111] New translations short_description.txt (Urdu (India)) --- fastlane/metadata/android/ur-IN/short_description.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 fastlane/metadata/android/ur-IN/short_description.txt diff --git a/fastlane/metadata/android/ur-IN/short_description.txt b/fastlane/metadata/android/ur-IN/short_description.txt new file mode 100644 index 000000000..8f5a9b847 --- /dev/null +++ b/fastlane/metadata/android/ur-IN/short_description.txt @@ -0,0 +1 @@ +Decentralized social network \ No newline at end of file From a2fd4be3392653879aa84f62aaa8262502df9bb5 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 11 Mar 2023 14:05:49 +0100 Subject: [PATCH 023/111] New translations title.txt (Urdu (India)) --- fastlane/metadata/android/ur-IN/title.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 fastlane/metadata/android/ur-IN/title.txt diff --git a/fastlane/metadata/android/ur-IN/title.txt b/fastlane/metadata/android/ur-IN/title.txt new file mode 100644 index 000000000..8123241a0 --- /dev/null +++ b/fastlane/metadata/android/ur-IN/title.txt @@ -0,0 +1 @@ +Mastodon \ No newline at end of file From 3584c123d6e312eb4988832ccfe906cce5a488a4 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 11 Mar 2023 22:33:13 +0100 Subject: [PATCH 024/111] New translations strings.xml (Belarusian) --- mastodon/src/main/res/values-be-rBY/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/mastodon/src/main/res/values-be-rBY/strings.xml b/mastodon/src/main/res/values-be-rBY/strings.xml index dc5b1b24b..86907982c 100644 --- a/mastodon/src/main/res/values-be-rBY/strings.xml +++ b/mastodon/src/main/res/values-be-rBY/strings.xml @@ -435,6 +435,7 @@ Ваш ідэнтыфікатар можа быць @gothgirl654@example.social, але вы ўсё яшчэ можаце падпісвацца, пашыраць і перапісвацца з @fallout5ever@example.online. Як выбраць сервер? Розныя людзі выбіраюць розныя серверы па розных прычынах. art.example з\'яўляецца выдатным месцам для мастакоў, у той час як glasgow.example можа быць добрым выбарам для шатландцаў.\n\nВы не памыліцеся ні з адным з нашых рэкамендаваных сервераў, так што незалежна ад таго, які вы выбераце (або калі ўведзяце ваш уласны ў радку пошуку сервера), вы нідзе нічога не прапусціце. + Любая мова Еўропа Паўночная Амерыка Паўднёвая Амерыка From ca101748ebfb607dfa00d3e40d60dae972ae5f96 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sat, 11 Mar 2023 23:37:17 +0100 Subject: [PATCH 025/111] New translations strings.xml (Belarusian) --- mastodon/src/main/res/values-be-rBY/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mastodon/src/main/res/values-be-rBY/strings.xml b/mastodon/src/main/res/values-be-rBY/strings.xml index 86907982c..36070ccd5 100644 --- a/mastodon/src/main/res/values-be-rBY/strings.xml +++ b/mastodon/src/main/res/values-be-rBY/strings.xml @@ -26,7 +26,7 @@ Налады Апублікаваць Скасаваць чарнавік? - Скасаваць + Выйсці Скасаваць падпісчык From 0c7f27b3aca71f68d32e7033025918f3a08efbe9 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sun, 12 Mar 2023 20:47:06 +0100 Subject: [PATCH 026/111] New translations strings.xml (Swedish) --- .../src/main/res/values-sv-rSE/strings.xml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/mastodon/src/main/res/values-sv-rSE/strings.xml b/mastodon/src/main/res/values-sv-rSE/strings.xml index 374f78684..b32359bf0 100644 --- a/mastodon/src/main/res/values-sv-rSE/strings.xml +++ b/mastodon/src/main/res/values-sv-rSE/strings.xml @@ -173,7 +173,16 @@ Tillbaka Mastodon utgörs av användare på olika servrar. Välj en server baserat på dina intressen, region eller en allmän server. Du kan fortfarande nå alla, oavsett server. + Servernamn eller URL + Serverregler + Genom att fortsätta, samtycker du till att följa följande regler som fastställts och verkställs av %s moderatorer. + Skapa konto redigera + Namn + Användarnamn + E-post + Lösenord + Bekräfta lösenord Inkludera stora bokstäver, specialtecken och siffror för att öka ditt lösenords styrka. Vetenskap Aktivism @@ -188,7 +197,10 @@ Musik Regionalt Teknik + Kolla din inkorg + Tryck på länken vi skickade dig för att verifiera %s. Vi väntar här. + Fick du inte en länk? Skicka igen Öppna e-postappen Bekräftelse via e-post skickad @@ -276,6 +288,7 @@ Öppna i webbläsare Dölj boostar från %s Visa boostar från %s + Varför vill du gå med? Detta kommer hjälpa oss att granska din ansökan. Rensa Bild för sidhuvud @@ -368,6 +381,8 @@ Ladda ner (%s) Installera + Din integritet + Även om Mastodon-appen inte samlar in några data, kan servern du registrerar dig genom ha en annan policy.\n\nOm du inte håller med policyn för %skan du gå tillbaka och välja en annan server. Jag godkänner Den här listan är tom Denna server accepterar inte nyregistreringar. @@ -379,11 +394,14 @@ Välkommen tillbaka Logga in på den server där du skapade ditt konto. Server-URL + Vad är Mastodon? Tänk dig att du har en epostadress som slutar med @example.com.\n\nDu kan skicka och ta emot epost från vem som helst, även om deras epostadress slutar med @gmail.com, @icloud.com eller @example.com. Mastodon fungerar så. Ditt handtag kan vara @gothgirl654@example.social men du kan fortfarande följa, boosta och chatta med @fallout5ever@example.online. Hur väljer jag en server? Olika personer väljer olika servrar av olika anledningar. art.example är en bra plats för konstnärer medan glasgow.exempel kan vara ett bra val för skottar.\n\nMed någon av våra rekommenderar servrar kan du inte hamna fel så oavsett vilken du väljer, eller om du skriver in din egen i serverns sökfältet, kommer du aldrig missa något. + Vi kommer att välja en server baserat på ditt språk om du fortsätter utan att göra ett val. + Omedelbar registrering From 72b16be29796f068f186b432c1a1eaaae9aa3746 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Sun, 12 Mar 2023 21:53:57 +0100 Subject: [PATCH 027/111] New translations strings.xml (Swedish) --- .../src/main/res/values-sv-rSE/strings.xml | 30 +++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/mastodon/src/main/res/values-sv-rSE/strings.xml b/mastodon/src/main/res/values-sv-rSE/strings.xml index b32359bf0..d68d74198 100644 --- a/mastodon/src/main/res/values-sv-rSE/strings.xml +++ b/mastodon/src/main/res/values-sv-rSE/strings.xml @@ -200,7 +200,7 @@ Kolla din inkorg Tryck på länken vi skickade dig för att verifiera %s. Vi väntar här. - Fick du inte en länk? + Fick du ingen länk? Skicka igen Öppna e-postappen Bekräftelse via e-post skickad @@ -242,7 +242,7 @@ Beteende Spela animerade avatarer och emojis Använd webbläsaren i appen - Notiser + Aviseringar Meddela mig när vem som helst en följare @@ -401,8 +401,34 @@ Hur väljer jag en server? Olika personer väljer olika servrar av olika anledningar. art.example är en bra plats för konstnärer medan glasgow.exempel kan vara ett bra val för skottar.\n\nMed någon av våra rekommenderar servrar kan du inte hamna fel så oavsett vilken du väljer, eller om du skriver in din egen i serverns sökfältet, kommer du aldrig missa något. Vi kommer att välja en server baserat på ditt språk om du fortsätter utan att göra ett val. + Vilket språk som helst Omedelbar registrering + Manuell granskning + Valfri registreringshastighet + Europa + Nordamerika + Sydamerika + Afrika + Asien + Oceanien + Accepterar inte nya medlemmar + Specialintressen + Lösenorden matchar inte + Välj för mig + Lägg till rad + Konfiguration av profil + Du kan alltid fylla i detta senare i fliken Profil. + Du kan lägga till upp till fyra profilfält för vad du vill. Plats, länkar, pronomen - himlen är gränsen. + Populärt på Mastodon + Följ alla + Instämmer inte alls + TL;DR: Vi samlar inte in eller bearbetar något. + Håller inte med %s + Biografi + Följer användare… + %1$s tillåter inte registrering från %2$s. Prova en annan eller <a>välj en annan server</a>. + Det här användarnamnet är redan taget. From 6bf713c96c6bf15a9fcbedd8a474c9a6e8ada631 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 13 Mar 2023 00:35:08 +0100 Subject: [PATCH 028/111] New translations strings.xml (Polish) --- mastodon/src/main/res/values-pl-rPL/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mastodon/src/main/res/values-pl-rPL/strings.xml b/mastodon/src/main/res/values-pl-rPL/strings.xml index 8d1965720..26e3f9cac 100644 --- a/mastodon/src/main/res/values-pl-rPL/strings.xml +++ b/mastodon/src/main/res/values-pl-rPL/strings.xml @@ -6,7 +6,7 @@ Dalej Pobieranie informacji o serwerze… Błąd - %s wydaje się nie być instancją Mastodona. + %s nie wydaje się być serwerem Mastodona. OK Przygotowywanie do uwierzytelniania… Kończenie uwierzytelniania… From 834f84f995c4689e54107aa5643805ceaf5929c7 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 13 Mar 2023 07:58:41 +0100 Subject: [PATCH 029/111] New translations strings.xml (Burmese) --- .../src/main/res/values-my-rMM/strings.xml | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/mastodon/src/main/res/values-my-rMM/strings.xml b/mastodon/src/main/res/values-my-rMM/strings.xml index fddee2cf4..2d8b6b3e4 100644 --- a/mastodon/src/main/res/values-my-rMM/strings.xml +++ b/mastodon/src/main/res/values-my-rMM/strings.xml @@ -58,6 +58,31 @@ အကောင့်ဖွင့်ခဲ့သည့် ရက်စွဲ ပြီးပြီ လုပ်ဆောင်နေသည်… + %s ၏ ပို့စ် + + %d မိနစ် + + + %d နာရီ + + + %d ရက် + + + %d စက္ကန့် ကျန်ရှိ + + + %d မိနစ် ကျန်ရှိ + + + %d နာရီ ကျန်ရှိ + + + %d ရက် ကျန်ရှိ + + + မဲပေးသူ %,d ဦး + From 2991c7421c9dea67c8af3916ddfe3eeb1e14498a Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 13 Mar 2023 08:59:13 +0100 Subject: [PATCH 030/111] New translations strings.xml (Burmese) --- .../src/main/res/values-my-rMM/strings.xml | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/mastodon/src/main/res/values-my-rMM/strings.xml b/mastodon/src/main/res/values-my-rMM/strings.xml index 2d8b6b3e4..89b160fef 100644 --- a/mastodon/src/main/res/values-my-rMM/strings.xml +++ b/mastodon/src/main/res/values-my-rMM/strings.xml @@ -83,6 +83,52 @@ မဲပေးသူ %,d ဦး + မဲပေးခွင့်ပိတ်သွားပါပြီ + အကောင့်ဘလော့ခြင်း + ဒိုမိန်းကို ဘလော့လုပ်ခြင်း + %s ကို ဘလော့မှာသေချာပြီလား + ဘလော့မည် + အကောင့်ဘလော့ဖြုတ်ခြင်း + ဒိုမိန်းကို ဘလော့ဖြုတ်ခြင်း + %s ကို ဘလော့ဖြုတ်မှာသေချာပြီလား + ဘလော့ဖြုတ်မည် + ဘလော့ထား + မဲပေးမည် + ကြည့်ရန် နှိပ်ပါ + ဖျက်မည် + ပို့စ်ဖျက်ခြင်း + ဒီပို့စ်ကိုဖျက်မှာ သေချာပြီလား? + ပို့စ်ဖျက်နေသည်… + ဖွင့်မည် + ခဏရပ်မည် + အကောင့်ထွက်မည် + အကောင့်ထည့်မည် + ရှာဖွေရန် + ဟက်ရှ်တက်များ + သတင်းများ + သင့်အတွက် + အားလုံး + မန်းရှင်းထားသည်များ + + လူ %d ဦး ပြောနေသည် + + %s ကို တိုင်ကြားခြင်း + ဒီပိုစ့်က ဘာဖြစ်လို့ပါလဲ? + %s က ဘာဖြစ်လို့ပါလဲ? + အကိုက်ညီဆုံးအဖြေကို ရွေးချယ်ပါ + မကြိုက်လို့ + သင်ကြည့်ချင်တာ မဟုတ်လို့ + Spam မို့လို့ + အန္တရာယ်ရှိတဲ့ လင့်ခ်မို့လို့ (သို့) engagement အတုမို့လို့ (သို့) ထပ်ခါထပ်ခါရီပလိုင်းပြန်ထားလို့ + ဆာဗာစည်းမျဉ်းတွေကို ချိုးဖောက်ထားလို့ + စည်းမျဉ်းစည်းကမ်းတစ်ခုခုကို ချိုးဖောက်ထားတယ်ဆိုတာ သင်သိနေလို့ + တခြားဟာ + အပေါ်က အမျိုးအစားတွေထဲက မဟုတ်လို့ + ဘယ်စည်းမျဉ်းတွေကို ချိုးဖောက်ထားပါသလဲ? + သက်ဆိုင်သမျှကို ရွေးချယ်ပါ + ဤတိုင်ကြားမှုကို အထောက်အကူပေးနိုင်မည့် ပို့စ်တစ်ခုခုရှိပါသလား? + သက်ဆိုင်သမျှကို ရွေးချယ်ပါ + တခြား ကျွန်တော်တို့ကိုသိစေချင်တာ ရှိပါသလား? From abf94e1e701ea8ebf0ac8c36c1ff19f407857f93 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 13 Mar 2023 10:01:18 +0100 Subject: [PATCH 031/111] New translations strings.xml (Burmese) --- mastodon/src/main/res/values-my-rMM/strings.xml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mastodon/src/main/res/values-my-rMM/strings.xml b/mastodon/src/main/res/values-my-rMM/strings.xml index 89b160fef..32951ff60 100644 --- a/mastodon/src/main/res/values-my-rMM/strings.xml +++ b/mastodon/src/main/res/values-my-rMM/strings.xml @@ -126,9 +126,12 @@ အပေါ်က အမျိုးအစားတွေထဲက မဟုတ်လို့ ဘယ်စည်းမျဉ်းတွေကို ချိုးဖောက်ထားပါသလဲ? သက်ဆိုင်သမျှကို ရွေးချယ်ပါ - ဤတိုင်ကြားမှုကို အထောက်အကူပေးနိုင်မည့် ပို့စ်တစ်ခုခုရှိပါသလား? + ဤတိုင်ကြားမှုကို အထောက်အကူပေးနိုင်မယ့် နောက်ထပ်ပို့စ်တွေ ရှိပါသေးလား? သက်ဆိုင်သမျှကို ရွေးချယ်ပါ တခြား ကျွန်တော်တို့ကိုသိစေချင်တာ ရှိပါသလား? + ထပ်ပေါင်းမှတ်ချက်ပေးရန် + တိုင်ကြားစာ ပေးပို့နေသည်… + တိုင်ကြားမှုအတွက် ကျေးဇူးတင်ပါတယ်။ ကျွန်တော်တို့ စစ်ဆေးပေးပါ့မယ်။ From 2d071ca252a48cef95ff4749f8c0756370c28b12 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 13 Mar 2023 12:53:22 +0100 Subject: [PATCH 032/111] New translations strings.xml (Burmese) --- mastodon/src/main/res/values-my-rMM/strings.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mastodon/src/main/res/values-my-rMM/strings.xml b/mastodon/src/main/res/values-my-rMM/strings.xml index 32951ff60..cd8684e79 100644 --- a/mastodon/src/main/res/values-my-rMM/strings.xml +++ b/mastodon/src/main/res/values-my-rMM/strings.xml @@ -132,6 +132,12 @@ ထပ်ပေါင်းမှတ်ချက်ပေးရန် တိုင်ကြားစာ ပေးပို့နေသည်… တိုင်ကြားမှုအတွက် ကျေးဇူးတင်ပါတယ်။ ကျွန်တော်တို့ စစ်ဆေးပေးပါ့မယ်။ + %s ကို ဖောလိုးမလုပ်တော့ + ဖောလိုးမလုပ်တော့ + သူက သင့်ကိုဖောလိုးလုပ်နိုင်မှာမဟုတ်တော့သလို သင့်ပိုစ့်တွေကိုလည်း မမြင်ရတော့ပါဘူး။ ဒါပေမယ့် သူဘလော့ခံလိုက်ရတာကိုတော့ တွေ့မြင်နိုင်ပါတယ်။ + ဒါကို မမြင်ချင်ဘူးလား? + Mastodon ပေါ်မှာ သင်မမြင်ချင်တာတစ်ခုခုတွေ့ခဲ့ရင် သူ့ကို သင့်ကွန်ရက်ကနေ ဖယ်ထုတ်နိုင်ပါတယ်။ + Mastodon ကို မတူညီတဲ့ဆာဗာပေါင်းစုံက အသုံးပြုများနဲ့ ဖွဲ့စည်းထားပါတယ်။ From be050abf7e4bc9e7715f41d224e9c3c54915be0c Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 13 Mar 2023 14:01:13 +0100 Subject: [PATCH 033/111] New translations strings.xml (Burmese) --- .../src/main/res/values-my-rMM/strings.xml | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/mastodon/src/main/res/values-my-rMM/strings.xml b/mastodon/src/main/res/values-my-rMM/strings.xml index cd8684e79..f291d48d3 100644 --- a/mastodon/src/main/res/values-my-rMM/strings.xml +++ b/mastodon/src/main/res/values-my-rMM/strings.xml @@ -138,7 +138,67 @@ ဒါကို မမြင်ချင်ဘူးလား? Mastodon ပေါ်မှာ သင်မမြင်ချင်တာတစ်ခုခုတွေ့ခဲ့ရင် သူ့ကို သင့်ကွန်ရက်ကနေ ဖယ်ထုတ်နိုင်ပါတယ်။ Mastodon ကို မတူညီတဲ့ဆာဗာပေါင်းစုံက အသုံးပြုများနဲ့ ဖွဲ့စည်းထားပါတယ်။ + သင့်စိတ်ဝင်စားမှု သို့မဟုတ် သင့်ဒေသပေါ်လိုက်ပြီး ဆာဗာရွေးချယ်နိုင်သလို အထွေထွေသုံးဆာဗာကိုလည်း ရွေးချယ်နိုင်ပါသည်။ အခြားသူတွေနဲ့ ဆက်သွယ်ရာမှာတော့ မည်သည့်ဆာဗာပဲဖြစ်နေပါစေ အချင်းချင်း ပုံမှန်အတိုင်း ဆက်သွယ်ချိတ်ဆက်နိုင်မှာပါ။ + ဆာဗာအမည် သို့မဟုတ် URL + ဆာဗာစည်းမျဉ်းများ + ရှေ့ဆက်ခြင်းအားဖြင့် သင်သည် %s ၏ စီမံကွပ်ကဲသူများမှ ချမှတ်ထားသော အောက်ပါစည်းမျဉ်းများကို သဘောတူပြီးဖြစ်ပါသည်။ + အကောင့်ဖန်တီးမည် + အမည် + အသုံးပြုသူအမည် + အီးမေးလ် + စကားဝှက် + စကားဝှက်ကို အတည်ပြုပါ + သင့်စကားဝှက်ခိုင်မာမှုကို မြှင့်တင်ရန် စာလုံးအကြီးများ၊ special character များနှင့် နံပါတ်များထည့်သွင်းပါ။ + ပညာရေး + တက်ကြွလှုပ်ရှားမှု + အားလုံး + အနုပညာ + အစားအသောက် + ဂိမ်း + အထွေထွေ + သတင်းစာပညာ + LGBT + ဂီတ + ဒေသဆိုင်ရာ + နည်းပညာ + သင့်အီးမေးလ် စာဝင်ပုံးကို စစ်ဆေးပါ + ဖိုင် %s သည် ထောက်ပံ့မပေးထားသည့်အမျိုးအစားဖြစ်သည် + ဖိုင် %1$s သည် အရွယ်အစားကန့်သတ်ချက်ဖြစ်သော %2$s MB ထက် ကျော်လွန်နေသည် + အလိုလျောက် + အလင်း + အမှောင် + အနက်စစ်စစ်မုဒ် + အပြုအမူဆိုင်ရာ + ရွေ့လျားနေသော Avatar များနှင့် အီမိုဂျီများ + အက်ပ်တွင်း ဘရောက်ဇာကို သုံးမည် + နိုတီများ + အသိပေးပါ + တစ်ယောက်ယောက်က + ဖောလိုးဝါတစ်ယောက်က + ကျွန်ုပ်ဖောလိုးလုပ်ထားသူက + မည်သူကမျှ + ကျွန်ုပ်ပို့စ်ကို နှစ်သက်လျှင် + ကျွန်ုပ်ကို ဖောလိုးလုပ်လျှင် + ကျွန်ုပ်ပို့စ်ကို reblog လုပ်လျှင် + ကျွန်ုပ်ကို မန်းရှင်းခေါ်လျှင် + ပျင်းစရာကောင်းသည်များ + အကောင့်ဆက်တင်များ + ဝန်ဆောင်မှုဆိုင်ရာ စည်းကမ်းချက်များ + ကိုယ်ရေးအချက်အလက်မူဝါဒ + ပူပူစပ်စပ်ဇုန် + မီဒီယာကက်ရှ်ကို ရှင်းလင်းမည် + အန်းဒရိုက်အတွက် မက်စ်စတိုဒွန် - ဗားရှင်း %1$s (%2$d) + မီဒီယာကက်ရှ်ကို ရှင်းလင်းလိုက်ပါပြီ + အကောင့်ထွက်မှာ သေချာပြီလား? + ထိလွယ်ရှလွယ် အကြောင်းအရာ + စာရေးသူက ဤဓာတ်ပုံ/ဗီဒီယိုကို ထိရှလွယ်သည်အဖြစ် မှတ်သားထားသည်၊ ကြည့်ရန် ထိပါ။ + ကြည့်ရန် ထိပါ + %s ရဲ့ ပရိုဖိုင်းကို သွားမည် + ပို့စ်အသစ် + ဓာတ်ပုံ/ဗီဒီယိုထည့်ရန် + စစ်တမ်းကောက်ရန် + အီမိုဂျီ From a9b828001c7a66efdc44441038331c48b5e5612f Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 13 Mar 2023 15:08:41 +0100 Subject: [PATCH 034/111] New translations strings.xml (Burmese) --- .../src/main/res/values-my-rMM/strings.xml | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/mastodon/src/main/res/values-my-rMM/strings.xml b/mastodon/src/main/res/values-my-rMM/strings.xml index f291d48d3..c57b37301 100644 --- a/mastodon/src/main/res/values-my-rMM/strings.xml +++ b/mastodon/src/main/res/values-my-rMM/strings.xml @@ -199,7 +199,27 @@ ဓာတ်ပုံ/ဗီဒီယိုထည့်ရန် စစ်တမ်းကောက်ရန် အီမိုဂျီ + ပို့စ်အား တွေ့မြင်နိုင်မှု + မူလ တိုင်းမ်လိုင်း + ကျွန်ုပ်၏ပရိုဖိုင်း + မီဒီယာကြည့်ရှုခြင်း + Reblog များ + နှစ်သက်မှုများ + ပြင်ဆင်မှုမှတ်တမ်း + နောက်ဆုံးပြင်ဆင်ချိန်မှာ %s + အခုလေးတင် + + လွန်ခဲ့သော %d စက္ကန့်က + + + လွန်ခဲ့သော %d မိနစ်က + + ပြင်ဆင်ထား %s + မူရင်းပို့စ် + အကြောင်းအရာသတိပေးချက် ထည့်လိုက်သည် + အကြောင်းအရာသတိပေးချက်ကို ပြင်လိုက်သည် + အကြောင်းအရာသတိပေးချက်ကို ဖယ်ရှားလိုက်သည် From 1c340b7c666ec254160b63bbef2ffa8bc30abe75 Mon Sep 17 00:00:00 2001 From: sk Date: Mon, 13 Mar 2023 18:56:06 +0100 Subject: [PATCH 035/111] fix extra text padding in compose --- mastodon/src/main/res/layout/fragment_compose.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mastodon/src/main/res/layout/fragment_compose.xml b/mastodon/src/main/res/layout/fragment_compose.xml index ce06d7675..80426d5a5 100644 --- a/mastodon/src/main/res/layout/fragment_compose.xml +++ b/mastodon/src/main/res/layout/fragment_compose.xml @@ -101,9 +101,9 @@ android:id="@+id/self_extra_text" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="2sp" android:layout_marginStart="8sp" android:layout_toEndOf="@id/self_name" + android:paddingTop="4sp" android:ellipsize="end" android:fontFamily="sans-serif" android:singleLine="true" From 16857bebd98ecc4a1b4d66805a5e5c5f4485416d Mon Sep 17 00:00:00 2001 From: sk Date: Mon, 13 Mar 2023 19:05:22 +0100 Subject: [PATCH 036/111] add tooltip closes sk22#436 --- mastodon/src/main/res/layout/display_item_header.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/mastodon/src/main/res/layout/display_item_header.xml b/mastodon/src/main/res/layout/display_item_header.xml index be6903169..8217f2750 100644 --- a/mastodon/src/main/res/layout/display_item_header.xml +++ b/mastodon/src/main/res/layout/display_item_header.xml @@ -27,6 +27,7 @@ android:visibility="gone" android:background="?android:actionBarItemBackground" android:contentDescription="@string/sk_delete_notification" + android:tooltipText="@string/sk_delete_notification" android:scaleType="center" android:src="@drawable/ic_fluent_dismiss_20_filled" android:tint="?android:textColorSecondary" /> From c5a19a2334a1cbf1e01383294616f1a6c865b422 Mon Sep 17 00:00:00 2001 From: sk Date: Mon, 13 Mar 2023 19:29:40 +0100 Subject: [PATCH 037/111] fix duplicate notification status header --- .../android/fragments/NotificationsListFragment.java | 2 +- .../android/ui/displayitems/StatusDisplayItem.java | 6 ------ 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsListFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsListFragment.java index a8e421746..5857a446d 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsListFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsListFragment.java @@ -94,7 +94,7 @@ public class NotificationsListFragment extends BaseStatusListFragment items=StatusDisplayItem.buildItems(this, n.status, accountID, n, knownAccounts, titleItem!=null, titleItem==null, n, false, Filter.FilterContext.NOTIFICATIONS, titleItem); + ArrayList items=StatusDisplayItem.buildItems(this, n.status, accountID, n, knownAccounts, titleItem!=null, titleItem==null, n, false, Filter.FilterContext.NOTIFICATIONS); if(titleItem!=null) items.add(0, titleItem); return items; diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java index 7b835fba8..a7ce2594b 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java @@ -93,10 +93,6 @@ public abstract class StatusDisplayItem{ } public static ArrayList buildItems(BaseStatusListFragment fragment, Status status, String accountID, DisplayItemsParent parentObject, Map knownAccounts, boolean inset, boolean addFooter, Notification notification, boolean disableTranslate, Filter.FilterContext filterContext){ - return buildItems(fragment, status, accountID, parentObject, knownAccounts, inset, addFooter, notification, disableTranslate, filterContext, null); - } - - public static ArrayList buildItems(BaseStatusListFragment fragment, Status status, String accountID, DisplayItemsParent parentObject, Map knownAccounts, boolean inset, boolean addFooter, Notification notification, boolean disableTranslate, Filter.FilterContext filterContext, StatusDisplayItem titleItem){ String parentID=parentObject.getID(); ArrayList items=new ArrayList<>(); @@ -178,8 +174,6 @@ public abstract class StatusDisplayItem{ item.index=i++; } - if (titleItem != null) items.add(0, titleItem); - if (!statusForContent.filterRevealed) { return new ArrayList<>(List.of( new WarningFilteredStatusDisplayItem(parentID, fragment, statusForContent, items) From 80d529d503961c296dff9a9d753f5fd0b21ffd41 Mon Sep 17 00:00:00 2001 From: sk Date: Mon, 13 Mar 2023 20:00:56 +0100 Subject: [PATCH 038/111] display reply header for unknown original poster re: mastodon#342 --- .../ui/displayitems/StatusDisplayItem.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java index a7ce2594b..793df98e5 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java @@ -115,12 +115,16 @@ public abstract class StatusDisplayItem{ args.putParcelable("profileAccount", Parcels.wrap(status.account)); Nav.go(fragment.getActivity(), ProfileFragment.class, args); })); - }else if(status.inReplyToAccountId!=null && knownAccounts.containsKey(status.inReplyToAccountId)){ - Account account=Objects.requireNonNull(knownAccounts.get(status.inReplyToAccountId)); - items.add(new ReblogOrReplyLineStatusDisplayItem(parentID, fragment, fragment.getString(R.string.in_reply_to, account.displayName), account.emojis, R.drawable.ic_fluent_arrow_reply_20_filled, null, i->{ - args.putParcelable("profileAccount", Parcels.wrap(account)); - Nav.go(fragment.getActivity(), ProfileFragment.class, args); - })); + }else if(status.inReplyToAccountId!=null){ + if (knownAccounts.containsKey(status.inReplyToAccountId)) { + Account account = Objects.requireNonNull(knownAccounts.get(status.inReplyToAccountId)); + items.add(new ReblogOrReplyLineStatusDisplayItem(parentID, fragment, fragment.getString(R.string.in_reply_to, account.displayName), account.emojis, R.drawable.ic_fluent_arrow_reply_20_filled, null, i -> { + args.putParcelable("profileAccount", Parcels.wrap(account)); + Nav.go(fragment.getActivity(), ProfileFragment.class, args); + })); + } else { + items.add(new ReblogOrReplyLineStatusDisplayItem(parentID, fragment, fragment.getString(R.string.in_reply_to), List.of(), R.drawable.ic_fluent_arrow_reply_20_filled, null, null)); + } } else if ( !(status.tags.isEmpty() || fragment instanceof HashtagTimelineFragment || From 4c85fd43873b6a216d95408cabf67518aa6a5257 Mon Sep 17 00:00:00 2001 From: sk Date: Mon, 13 Mar 2023 20:06:05 +0100 Subject: [PATCH 039/111] use custom string for anonymous reply --- .../android/ui/displayitems/StatusDisplayItem.java | 4 ++-- mastodon/src/main/res/values/strings_sk.xml | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java index 793df98e5..c6a15e7ea 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java @@ -115,7 +115,7 @@ public abstract class StatusDisplayItem{ args.putParcelable("profileAccount", Parcels.wrap(status.account)); Nav.go(fragment.getActivity(), ProfileFragment.class, args); })); - }else if(status.inReplyToAccountId!=null){ + } if(status.inReplyToAccountId!=null){ if (knownAccounts.containsKey(status.inReplyToAccountId)) { Account account = Objects.requireNonNull(knownAccounts.get(status.inReplyToAccountId)); items.add(new ReblogOrReplyLineStatusDisplayItem(parentID, fragment, fragment.getString(R.string.in_reply_to, account.displayName), account.emojis, R.drawable.ic_fluent_arrow_reply_20_filled, null, i -> { @@ -123,7 +123,7 @@ public abstract class StatusDisplayItem{ Nav.go(fragment.getActivity(), ProfileFragment.class, args); })); } else { - items.add(new ReblogOrReplyLineStatusDisplayItem(parentID, fragment, fragment.getString(R.string.in_reply_to), List.of(), R.drawable.ic_fluent_arrow_reply_20_filled, null, null)); + items.add(new ReblogOrReplyLineStatusDisplayItem(parentID, fragment, fragment.getString(R.string.sk_in_reply), List.of(), R.drawable.ic_fluent_arrow_reply_20_filled, null, null)); } } else if ( !(status.tags.isEmpty() || diff --git a/mastodon/src/main/res/values/strings_sk.xml b/mastodon/src/main/res/values/strings_sk.xml index a94de6489..a58cf7dd7 100644 --- a/mastodon/src/main/res/values/strings_sk.xml +++ b/mastodon/src/main/res/values/strings_sk.xml @@ -262,4 +262,5 @@ Follow from other account Followed from %s Auto-hide Compose button + In reply \ No newline at end of file From 27c2791d6c19208346a7fa1df8db56fd7ba8e77d Mon Sep 17 00:00:00 2001 From: sk Date: Tue, 14 Mar 2023 14:58:21 +0100 Subject: [PATCH 040/111] add reblogged account to known accounts --- .../android/fragments/NotificationsListFragment.java | 2 ++ .../org/joinmastodon/android/fragments/StatusListFragment.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsListFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsListFragment.java index 5857a446d..a95f061af 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsListFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsListFragment.java @@ -117,6 +117,8 @@ public class NotificationsListFragment extends BaseStatusListFragment{ protected void addAccountToKnown(Status s){ if(!knownAccounts.containsKey(s.account.id)) knownAccounts.put(s.account.id, s.account); + if(s.reblog!=null && !knownAccounts.containsKey(s.reblog.account.id)) + knownAccounts.put(s.reblog.account.id, s.reblog.account); } @Override From 5e194e30795be42a4b2a1696a10bfaeba2bc39f1 Mon Sep 17 00:00:00 2001 From: sk Date: Tue, 14 Mar 2023 14:59:11 +0100 Subject: [PATCH 041/111] display both reply and reblog re: sk22#448 --- .../ReblogOrReplyLineStatusDisplayItem.java | 23 ++++++++-- .../ui/displayitems/StatusDisplayItem.java | 46 +++++++++++-------- .../display_item_reblog_or_reply_line.xml | 1 + 3 files changed, 48 insertions(+), 22 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java index 366d5ba9f..b958fa7ed 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java @@ -27,6 +27,7 @@ import androidx.annotation.Nullable; import me.grishka.appkit.imageloader.ImageLoaderViewHolder; import me.grishka.appkit.imageloader.requests.ImageLoaderRequest; +import me.grishka.appkit.utils.V; public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{ private CharSequence text; @@ -37,8 +38,13 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{ private int iconEnd; private CustomEmojiHelper emojiHelper=new CustomEmojiHelper(); private View.OnClickListener handleClick; + private boolean isLastLine; public ReblogOrReplyLineStatusDisplayItem(String parentID, BaseStatusListFragment parentFragment, CharSequence text, List emojis, @DrawableRes int icon, StatusPrivacy visibility, @Nullable View.OnClickListener handleClick){ + this(parentID, parentFragment, text, emojis, icon, visibility, handleClick, true); + } + + public ReblogOrReplyLineStatusDisplayItem(String parentID, BaseStatusListFragment parentFragment, CharSequence text, List emojis, @DrawableRes int icon, StatusPrivacy visibility, @Nullable View.OnClickListener handleClick, boolean isLastLine){ super(parentID, parentFragment); SpannableStringBuilder ssb=new SpannableStringBuilder(text); HtmlParser.parseCustomEmoji(ssb, emojis); @@ -49,6 +55,11 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{ TypedValue outValue = new TypedValue(); context.getTheme().resolveAttribute(android.R.attr.selectableItemBackground, outValue, true); updateVisibility(visibility); + setIsLastLine(isLastLine); + } + + public void setIsLastLine(boolean isLastLine) { + this.isLastLine = isLastLine; } public void updateVisibility(StatusPrivacy visibility) { @@ -78,18 +89,21 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{ public static class Holder extends StatusDisplayItem.Holder implements ImageLoaderViewHolder{ private final TextView text; + private final View frame; + public Holder(Activity activity, ViewGroup parent){ super(activity, R.layout.display_item_reblog_or_reply_line, parent); text=findViewById(R.id.text); + frame=findViewById(R.id.frame); } @Override public void onBind(ReblogOrReplyLineStatusDisplayItem item){ text.setText(item.text); text.setCompoundDrawablesRelativeWithIntrinsicBounds(item.icon, 0, item.iconEnd, 0); - if(item.handleClick!=null) text.setOnClickListener(item.handleClick); - text.setEnabled(!item.inset); - text.setClickable(!item.inset); + text.setOnClickListener(item.handleClick); + text.setEnabled(!item.inset && item.handleClick != null); + text.setClickable(!item.inset && item.handleClick != null); Context ctx = itemView.getContext(); int visibilityText = item.visibility != null ? switch (item.visibility) { case PUBLIC -> R.string.visibility_public; @@ -100,6 +114,9 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{ if (visibilityText != 0) text.setContentDescription(item.text + " (" + ctx.getString(visibilityText) + ")"); if(Build.VERSION.SDK_INT{ args.putParcelable("profileAccount", Parcels.wrap(status.account)); Nav.go(fragment.getActivity(), ProfileFragment.class, args); - })); - } if(status.inReplyToAccountId!=null){ - if (knownAccounts.containsKey(status.inReplyToAccountId)) { - Account account = Objects.requireNonNull(knownAccounts.get(status.inReplyToAccountId)); - items.add(new ReblogOrReplyLineStatusDisplayItem(parentID, fragment, fragment.getString(R.string.in_reply_to, account.displayName), account.emojis, R.drawable.ic_fluent_arrow_reply_20_filled, null, i -> { - args.putParcelable("profileAccount", Parcels.wrap(account)); - Nav.go(fragment.getActivity(), ProfileFragment.class, args); - })); - } else { - items.add(new ReblogOrReplyLineStatusDisplayItem(parentID, fragment, fragment.getString(R.string.sk_in_reply), List.of(), R.drawable.ic_fluent_arrow_reply_20_filled, null, null)); - } - } else if ( - !(status.tags.isEmpty() || - fragment instanceof HashtagTimelineFragment || - fragment instanceof ListTimelineFragment - ) && fragment.getParentFragment() instanceof HomeTabFragment home - ) { + }, false)); + } + + if(statusForContent.inReplyToAccountId!=null){ + Account account = knownAccounts.get(statusForContent.inReplyToAccountId); + View.OnClickListener handleClick = account == null ? null : i -> { + args.putParcelable("profileAccount", Parcels.wrap(account)); + Nav.go(fragment.getActivity(), ProfileFragment.class, args); + }; + String text = account != null ? fragment.getString(R.string.in_reply_to, account.displayName) : fragment.getString(R.string.sk_in_reply); + items.add(new ReblogOrReplyLineStatusDisplayItem( + parentID, fragment, text, account == null ? List.of() : account.emojis, + R.drawable.ic_fluent_arrow_reply_20_filled, null, handleClick, false + )); + } + + if (status.reblog == null && !(status.tags.isEmpty() || + fragment instanceof HashtagTimelineFragment || + fragment instanceof ListTimelineFragment + ) && fragment.getParentFragment() instanceof HomeTabFragment home) { home.getHashtags().stream() .filter(followed -> status.tags.stream() .anyMatch(hashtag -> followed.name.equalsIgnoreCase(hashtag.name))) @@ -142,9 +144,15 @@ public abstract class StatusDisplayItem{ i -> { args.putString("hashtag", hashtag.name); Nav.go(fragment.getActivity(), HashtagTimelineFragment.class, args); - } + }, + false ))); } + + if (items.size() > 0) { + ((ReblogOrReplyLineStatusDisplayItem) items.get(items.size() - 1)).setIsLastLine(true); + } + HeaderStatusDisplayItem header; items.add(header=new HeaderStatusDisplayItem(parentID, statusForContent.account, statusForContent.createdAt, fragment, accountID, statusForContent, null, notification, scheduledStatus)); if(!TextUtils.isEmpty(statusForContent.content)) diff --git a/mastodon/src/main/res/layout/display_item_reblog_or_reply_line.xml b/mastodon/src/main/res/layout/display_item_reblog_or_reply_line.xml index b97a3c8a0..90bf482c3 100644 --- a/mastodon/src/main/res/layout/display_item_reblog_or_reply_line.xml +++ b/mastodon/src/main/res/layout/display_item_reblog_or_reply_line.xml @@ -2,6 +2,7 @@ Date: Tue, 14 Mar 2023 15:34:05 +0100 Subject: [PATCH 042/111] fuck it, indented header line closes #448 --- .../ReblogOrReplyLineStatusDisplayItem.java | 13 ++--- .../ui/displayitems/StatusDisplayItem.java | 47 ++++++++++--------- 2 files changed, 33 insertions(+), 27 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java index b958fa7ed..a6924dc52 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java @@ -38,13 +38,10 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{ private int iconEnd; private CustomEmojiHelper emojiHelper=new CustomEmojiHelper(); private View.OnClickListener handleClick; - private boolean isLastLine; + private boolean isLastLine = true; + private int lineNo = 0; public ReblogOrReplyLineStatusDisplayItem(String parentID, BaseStatusListFragment parentFragment, CharSequence text, List emojis, @DrawableRes int icon, StatusPrivacy visibility, @Nullable View.OnClickListener handleClick){ - this(parentID, parentFragment, text, emojis, icon, visibility, handleClick, true); - } - - public ReblogOrReplyLineStatusDisplayItem(String parentID, BaseStatusListFragment parentFragment, CharSequence text, List emojis, @DrawableRes int icon, StatusPrivacy visibility, @Nullable View.OnClickListener handleClick, boolean isLastLine){ super(parentID, parentFragment); SpannableStringBuilder ssb=new SpannableStringBuilder(text); HtmlParser.parseCustomEmoji(ssb, emojis); @@ -55,13 +52,16 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{ TypedValue outValue = new TypedValue(); context.getTheme().resolveAttribute(android.R.attr.selectableItemBackground, outValue, true); updateVisibility(visibility); - setIsLastLine(isLastLine); } public void setIsLastLine(boolean isLastLine) { this.isLastLine = isLastLine; } + public void setLineNo(int lineNo) { + this.lineNo = lineNo; + } + public void updateVisibility(StatusPrivacy visibility) { this.visibility = visibility; this.iconEnd = visibility != null ? switch (visibility) { @@ -116,6 +116,7 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{ UiUtils.fixCompoundDrawableTintOnAndroid6(text); ViewGroup.MarginLayoutParams params = new ViewGroup.MarginLayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); params.bottomMargin = V.dp(item.isLastLine ? -12 : -18); + params.leftMargin = V.dp(13) * item.lineNo; frame.setLayoutParams(params); } diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java index 3ad8a7c39..f40c93c8b 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java @@ -113,23 +113,8 @@ public abstract class StatusDisplayItem{ items.add(new ReblogOrReplyLineStatusDisplayItem(parentID, fragment, fragment.getString(R.string.user_boosted, status.account.displayName), status.account.emojis, R.drawable.ic_fluent_arrow_repeat_all_20_filled, isOwnPost ? status.visibility : null, i->{ args.putParcelable("profileAccount", Parcels.wrap(status.account)); Nav.go(fragment.getActivity(), ProfileFragment.class, args); - }, false)); - } - - if(statusForContent.inReplyToAccountId!=null){ - Account account = knownAccounts.get(statusForContent.inReplyToAccountId); - View.OnClickListener handleClick = account == null ? null : i -> { - args.putParcelable("profileAccount", Parcels.wrap(account)); - Nav.go(fragment.getActivity(), ProfileFragment.class, args); - }; - String text = account != null ? fragment.getString(R.string.in_reply_to, account.displayName) : fragment.getString(R.string.sk_in_reply); - items.add(new ReblogOrReplyLineStatusDisplayItem( - parentID, fragment, text, account == null ? List.of() : account.emojis, - R.drawable.ic_fluent_arrow_reply_20_filled, null, handleClick, false - )); - } - - if (status.reblog == null && !(status.tags.isEmpty() || + })); + } else if (!(status.tags.isEmpty() || fragment instanceof HashtagTimelineFragment || fragment instanceof ListTimelineFragment ) && fragment.getParentFragment() instanceof HomeTabFragment home) { @@ -144,15 +129,35 @@ public abstract class StatusDisplayItem{ i -> { args.putString("hashtag", hashtag.name); Nav.go(fragment.getActivity(), HashtagTimelineFragment.class, args); - }, - false + } ))); } - if (items.size() > 0) { - ((ReblogOrReplyLineStatusDisplayItem) items.get(items.size() - 1)).setIsLastLine(true); + if(statusForContent.inReplyToAccountId!=null){ + Account account = knownAccounts.get(statusForContent.inReplyToAccountId); + View.OnClickListener handleClick = account == null ? null : i -> { + args.putParcelable("profileAccount", Parcels.wrap(account)); + Nav.go(fragment.getActivity(), ProfileFragment.class, args); + }; + String text = account != null ? fragment.getString(R.string.in_reply_to, account.displayName) : fragment.getString(R.string.sk_in_reply); + items.add(new ReblogOrReplyLineStatusDisplayItem( + parentID, fragment, text, account == null ? List.of() : account.emojis, + R.drawable.ic_fluent_arrow_reply_20_filled, null, handleClick + )); } + int l = 0; + ReblogOrReplyLineStatusDisplayItem lastLine = null; + for (StatusDisplayItem item : items) { + if (item instanceof ReblogOrReplyLineStatusDisplayItem line) { + line.setLineNo(l); + line.setIsLastLine(false); + lastLine = line; + l++; + } + } + if (lastLine != null) lastLine.setIsLastLine(true); + HeaderStatusDisplayItem header; items.add(header=new HeaderStatusDisplayItem(parentID, statusForContent.account, statusForContent.createdAt, fragment, accountID, statusForContent, null, notification, scheduledStatus)); if(!TextUtils.isEmpty(statusForContent.content)) From 56b24420d15cce8b786070703c5593651305f859 Mon Sep 17 00:00:00 2001 From: sk Date: Tue, 14 Mar 2023 15:37:06 +0100 Subject: [PATCH 043/111] add local-only string --- .../ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java | 1 + 1 file changed, 1 insertion(+) diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java index a6924dc52..4d3022a46 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java @@ -109,6 +109,7 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{ case PUBLIC -> R.string.visibility_public; case UNLISTED -> R.string.sk_visibility_unlisted; case PRIVATE -> R.string.visibility_followers_only; + case LOCAL -> R.string.sk_local_only; default -> 0; } : 0; if (visibilityText != 0) text.setContentDescription(item.text + " (" + ctx.getString(visibilityText) + ")"); From bad72985cbf7cb969109c30778ed40a5cb8f0642 Mon Sep 17 00:00:00 2001 From: sk Date: Wed, 15 Mar 2023 12:49:09 +0100 Subject: [PATCH 044/111] bump version --- mastodon/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mastodon/build.gradle b/mastodon/build.gradle index 60e8ba425..a7006cc63 100644 --- a/mastodon/build.gradle +++ b/mastodon/build.gradle @@ -9,8 +9,8 @@ android { applicationId "org.joinmastodon.android.sk" minSdk 23 targetSdk 33 - versionCode 77 - versionName "1.2.0+fork.77" + versionCode 78 + versionName "1.2.0+fork.78" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resConfigs "ar-rSA", "be-rBY", "bn-rBD", "bs-rBA", "ca-rES", "cs-rCZ", "da-rDK", "de-rDE", "el-rGR", "es-rES", "eu-rES", "fa-rIR", "fi-rFI", "fil-rPH", "fr-rFR", "ga-rIE", "gd-rGB", "gl-rES", "hi-rIN", "hr-rHR", "hu-rHU", "hy-rAM", "ig-rNG", "in-rID", "is-rIS", "it-rIT", "iw-rIL", "ja-rJP", "kab", "ko-rKR", "my-rMM", "nl-rNL", "no-rNO", "oc-rFR", "pl-rPL", "pt-rBR", "pt-rPT", "ro-rRO", "ru-rRU", "si-rLK", "sl-rSI", "sv-rSE", "th-rTH", "tr-rTR", "uk-rUA", "vi-rVN", "zh-rCN", "zh-rTW" } From 584700225c22034a53594d3363dcabc3beba4272 Mon Sep 17 00:00:00 2001 From: sk Date: Wed, 15 Mar 2023 17:36:07 +0100 Subject: [PATCH 045/111] reply line below avatar --- .../android/GlobalUserPreferences.java | 3 +++ .../android/fragments/ComposeFragment.java | 4 ++- .../android/fragments/SettingsFragment.java | 4 +++ .../ReblogOrReplyLineStatusDisplayItem.java | 24 ++++++----------- .../ui/displayitems/StatusDisplayItem.java | 26 ++++++++++--------- .../src/main/res/layout/fragment_compose.xml | 19 +++++++++++++- mastodon/src/main/res/values/strings_sk.xml | 1 + 7 files changed, 51 insertions(+), 30 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java b/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java index ce645c5c5..d66b63f04 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java +++ b/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java @@ -44,6 +44,7 @@ public class GlobalUserPreferences{ public static boolean collapseLongPosts; public static boolean spectatorMode; public static boolean autoHideFab; + public static boolean replyLineBelowHeader; public static String publishButtonText; public static ThemePreference theme; public static ColorPreference color; @@ -93,6 +94,7 @@ public class GlobalUserPreferences{ collapseLongPosts=prefs.getBoolean("collapseLongPosts", true); spectatorMode=prefs.getBoolean("spectatorMode", false); autoHideFab=prefs.getBoolean("autoHideFab", true); + replyLineBelowHeader=prefs.getBoolean("replyLineBelowHeader", true); publishButtonText=prefs.getString("publishButtonText", ""); theme=ThemePreference.values()[prefs.getInt("theme", 0)]; recentLanguages=fromJson(prefs.getString("recentLanguages", null), recentLanguagesType, new HashMap<>()); @@ -136,6 +138,7 @@ public class GlobalUserPreferences{ .putBoolean("autoHideFab", autoHideFab) .putString("publishButtonText", publishButtonText) .putBoolean("bottomEncoding", bottomEncoding) + .putBoolean("replyLineBelowHeader", replyLineBelowHeader) .putInt("theme", theme.ordinal()) .putString("color", color.name()) .putString("recentLanguages", gson.toJson(recentLanguages)) diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java index db7ee5596..a27f9c73c 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java @@ -333,7 +333,9 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr scheduleTimeBtn=view.findViewById(R.id.scheduled_time_btn); sensitiveIcon=view.findViewById(R.id.sensitive_icon); sensitiveItem=view.findViewById(R.id.sensitive_item); - replyText=view.findViewById(R.id.reply_text); + replyText=view.findViewById(GlobalUserPreferences.replyLineBelowHeader ? R.id.reply_text_below : R.id.reply_text); + view.findViewById(GlobalUserPreferences.replyLineBelowHeader ? R.id.reply_text : R.id.reply_text_below) + .setVisibility(View.GONE); if (isPhotoPickerAvailable()) { PopupMenu attachPopup = new PopupMenu(getContext(), mediaBtn); diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java index 34e7a522f..d7f299143 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java @@ -253,6 +253,10 @@ public class SettingsFragment extends MastodonToolbarFragment{ GlobalUserPreferences.save(); needAppRestart=true; })); + items.add(new SwitchItem(R.string.sk_reply_line_below_avatar, R.drawable.ic_fluent_arrow_reply_24_regular, GlobalUserPreferences.replyLineBelowHeader, i->{ + GlobalUserPreferences.replyLineBelowHeader=i.checked; + GlobalUserPreferences.save(); + })); items.add(new SwitchItem(R.string.sk_settings_translate_only_opened, R.drawable.ic_fluent_translate_24_regular, GlobalUserPreferences.translateButtonOpenedOnly, i->{ GlobalUserPreferences.translateButtonOpenedOnly=i.checked; GlobalUserPreferences.save(); diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java index 4d3022a46..71973c466 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java @@ -38,10 +38,9 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{ private int iconEnd; private CustomEmojiHelper emojiHelper=new CustomEmojiHelper(); private View.OnClickListener handleClick; - private boolean isLastLine = true; - private int lineNo = 0; + boolean belowHeader, needBottomPadding; - public ReblogOrReplyLineStatusDisplayItem(String parentID, BaseStatusListFragment parentFragment, CharSequence text, List emojis, @DrawableRes int icon, StatusPrivacy visibility, @Nullable View.OnClickListener handleClick){ + public ReblogOrReplyLineStatusDisplayItem(String parentID, BaseStatusListFragment parentFragment, CharSequence text, List emojis, @DrawableRes int icon, StatusPrivacy visibility, @Nullable View.OnClickListener handleClick) { super(parentID, parentFragment); SpannableStringBuilder ssb=new SpannableStringBuilder(text); HtmlParser.parseCustomEmoji(ssb, emojis); @@ -54,14 +53,6 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{ updateVisibility(visibility); } - public void setIsLastLine(boolean isLastLine) { - this.isLastLine = isLastLine; - } - - public void setLineNo(int lineNo) { - this.lineNo = lineNo; - } - public void updateVisibility(StatusPrivacy visibility) { this.visibility = visibility; this.iconEnd = visibility != null ? switch (visibility) { @@ -89,12 +80,10 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{ public static class Holder extends StatusDisplayItem.Holder implements ImageLoaderViewHolder{ private final TextView text; - private final View frame; public Holder(Activity activity, ViewGroup parent){ super(activity, R.layout.display_item_reblog_or_reply_line, parent); text=findViewById(R.id.text); - frame=findViewById(R.id.frame); } @Override @@ -116,9 +105,12 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{ if(Build.VERSION.SDK_INT { @@ -140,28 +142,28 @@ public abstract class StatusDisplayItem{ Nav.go(fragment.getActivity(), ProfileFragment.class, args); }; String text = account != null ? fragment.getString(R.string.in_reply_to, account.displayName) : fragment.getString(R.string.sk_in_reply); - items.add(new ReblogOrReplyLineStatusDisplayItem( + replyLine = new ReblogOrReplyLineStatusDisplayItem( parentID, fragment, text, account == null ? List.of() : account.emojis, R.drawable.ic_fluent_arrow_reply_20_filled, null, handleClick - )); + ); } - int l = 0; - ReblogOrReplyLineStatusDisplayItem lastLine = null; - for (StatusDisplayItem item : items) { - if (item instanceof ReblogOrReplyLineStatusDisplayItem line) { - line.setLineNo(l); - line.setIsLastLine(false); - lastLine = line; - l++; - } + if (replyLine != null && !GlobalUserPreferences.replyLineBelowHeader) { + items.add(replyLine); } - if (lastLine != null) lastLine.setIsLastLine(true); HeaderStatusDisplayItem header; items.add(header=new HeaderStatusDisplayItem(parentID, statusForContent.account, statusForContent.createdAt, fragment, accountID, statusForContent, null, notification, scheduledStatus)); + + if (replyLine != null && GlobalUserPreferences.replyLineBelowHeader) { + replyLine.belowHeader = true; + items.add(replyLine); + } + if(!TextUtils.isEmpty(statusForContent.content)) items.add(new TextStatusDisplayItem(parentID, HtmlParser.parse(statusForContent.content, statusForContent.emojis, statusForContent.mentions, statusForContent.tags, accountID), fragment, statusForContent, disableTranslate)); + else if (GlobalUserPreferences.replyLineBelowHeader && replyLine != null) + replyLine.needBottomPadding=true; else header.needBottomPadding=true; List imageAttachments=statusForContent.mediaAttachments.stream().filter(att->att.type.isImage()).collect(Collectors.toList()); diff --git a/mastodon/src/main/res/layout/fragment_compose.xml b/mastodon/src/main/res/layout/fragment_compose.xml index 80426d5a5..56f797dc6 100644 --- a/mastodon/src/main/res/layout/fragment_compose.xml +++ b/mastodon/src/main/res/layout/fragment_compose.xml @@ -64,10 +64,10 @@ android:paddingBottom="6dp" android:textAppearance="@style/m3_title_small" android:drawableStart="@drawable/ic_fluent_arrow_reply_20_filled" - tools:drawableEnd="@drawable/ic_fluent_earth_20_regular" android:drawableTint="?android:textColorSecondary" android:drawablePadding="6dp" android:singleLine="true" + android:text="@string/sk_in_reply" android:ellipsize="end"/> + + Followed from %s Auto-hide Compose button In reply + “In reply to” line below avatar \ No newline at end of file From 16f907c91f0d48170f65fd0f291627e26f88f547 Mon Sep 17 00:00:00 2001 From: sk Date: Wed, 15 Mar 2023 19:23:20 +0100 Subject: [PATCH 046/111] show thread reply line --- .../android/ui/displayitems/StatusDisplayItem.java | 13 ++++++++++--- mastodon/src/main/res/values/strings_sk.xml | 1 + 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java index 92f1fd05f..62caa539a 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java @@ -135,13 +135,20 @@ public abstract class StatusDisplayItem{ } ReblogOrReplyLineStatusDisplayItem replyLine = null; - if(statusForContent.inReplyToAccountId!=null){ + boolean threadReply = statusForContent.inReplyToAccountId != null && + statusForContent.inReplyToAccountId.equals(status.account.id); + + if(statusForContent.inReplyToAccountId!=null && !(threadReply && fragment instanceof ThreadFragment)){ Account account = knownAccounts.get(statusForContent.inReplyToAccountId); - View.OnClickListener handleClick = account == null ? null : i -> { + View.OnClickListener handleClick = account == null || threadReply ? null : i -> { args.putParcelable("profileAccount", Parcels.wrap(account)); Nav.go(fragment.getActivity(), ProfileFragment.class, args); }; - String text = account != null ? fragment.getString(R.string.in_reply_to, account.displayName) : fragment.getString(R.string.sk_in_reply); + + String text = threadReply ? + fragment.getString(R.string.sk_show_thread) : account != null ? + fragment.getString(R.string.in_reply_to, account.displayName) : fragment.getString(R.string.sk_in_reply); + replyLine = new ReblogOrReplyLineStatusDisplayItem( parentID, fragment, text, account == null ? List.of() : account.emojis, R.drawable.ic_fluent_arrow_reply_20_filled, null, handleClick diff --git a/mastodon/src/main/res/values/strings_sk.xml b/mastodon/src/main/res/values/strings_sk.xml index 020abb079..4406ecca2 100644 --- a/mastodon/src/main/res/values/strings_sk.xml +++ b/mastodon/src/main/res/values/strings_sk.xml @@ -264,4 +264,5 @@ Auto-hide Compose button In reply “In reply to” line below avatar + Show thread \ No newline at end of file From e2193e8e3c700addbe6951e3fb821726d56d93a2 Mon Sep 17 00:00:00 2001 From: sk Date: Wed, 15 Mar 2023 21:24:25 +0100 Subject: [PATCH 047/111] reply line below, compact above --- .../android/GlobalUserPreferences.java | 9 ++- .../android/fragments/ComposeFragment.java | 4 +- .../android/fragments/SettingsFragment.java | 15 ++++- .../ReblogOrReplyLineStatusDisplayItem.java | 20 ++++-- .../ui/displayitems/StatusDisplayItem.java | 65 ++++++++++++------- .../ic_fluent_re_order_24_regular.xml | 3 + .../display_item_reblog_or_reply_line.xml | 41 ++++++++++-- mastodon/src/main/res/values/strings_sk.xml | 3 +- 8 files changed, 116 insertions(+), 44 deletions(-) create mode 100644 mastodon/src/main/res/drawable/ic_fluent_re_order_24_regular.xml diff --git a/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java b/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java index d66b63f04..fa2d08f3e 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java +++ b/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java @@ -44,7 +44,8 @@ public class GlobalUserPreferences{ public static boolean collapseLongPosts; public static boolean spectatorMode; public static boolean autoHideFab; - public static boolean replyLineBelowHeader; + public static boolean replyLineAboveHeader; + public static boolean compactReblogReplyLine; public static String publishButtonText; public static ThemePreference theme; public static ColorPreference color; @@ -94,7 +95,8 @@ public class GlobalUserPreferences{ collapseLongPosts=prefs.getBoolean("collapseLongPosts", true); spectatorMode=prefs.getBoolean("spectatorMode", false); autoHideFab=prefs.getBoolean("autoHideFab", true); - replyLineBelowHeader=prefs.getBoolean("replyLineBelowHeader", true); + replyLineAboveHeader =prefs.getBoolean("replyLineAboveHeader", false); + compactReblogReplyLine=prefs.getBoolean("compactReblogReplyLine", true); publishButtonText=prefs.getString("publishButtonText", ""); theme=ThemePreference.values()[prefs.getInt("theme", 0)]; recentLanguages=fromJson(prefs.getString("recentLanguages", null), recentLanguagesType, new HashMap<>()); @@ -136,9 +138,10 @@ public class GlobalUserPreferences{ .putBoolean("collapseLongPosts", collapseLongPosts) .putBoolean("spectatorMode", spectatorMode) .putBoolean("autoHideFab", autoHideFab) + .putBoolean("compactReblogReplyLine", compactReblogReplyLine) .putString("publishButtonText", publishButtonText) .putBoolean("bottomEncoding", bottomEncoding) - .putBoolean("replyLineBelowHeader", replyLineBelowHeader) + .putBoolean("replyLineAboveHeader", replyLineAboveHeader) .putInt("theme", theme.ordinal()) .putString("color", color.name()) .putString("recentLanguages", gson.toJson(recentLanguages)) diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java index a27f9c73c..7afaf9935 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java @@ -333,8 +333,8 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr scheduleTimeBtn=view.findViewById(R.id.scheduled_time_btn); sensitiveIcon=view.findViewById(R.id.sensitive_icon); sensitiveItem=view.findViewById(R.id.sensitive_item); - replyText=view.findViewById(GlobalUserPreferences.replyLineBelowHeader ? R.id.reply_text_below : R.id.reply_text); - view.findViewById(GlobalUserPreferences.replyLineBelowHeader ? R.id.reply_text : R.id.reply_text_below) + replyText=view.findViewById(GlobalUserPreferences.replyLineAboveHeader ? R.id.reply_text : R.id.reply_text_below); + view.findViewById(GlobalUserPreferences.replyLineAboveHeader ? R.id.reply_text_below : R.id.reply_text) .setVisibility(View.GONE); if (isPhotoPickerAvailable()) { diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java index d7f299143..6704813bc 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java @@ -80,7 +80,7 @@ public class SettingsFragment extends MastodonToolbarFragment{ private ArrayList items=new ArrayList<>(); private ThemeItem themeItem; private NotificationPolicyItem notificationPolicyItem; - private SwitchItem showNewPostsButtonItem, glitchModeItem; + private SwitchItem showNewPostsButtonItem, glitchModeItem, compactReblogReplyLineItem; private String accountID; private boolean needUpdateNotificationSettings; private boolean needAppRestart; @@ -253,10 +253,19 @@ public class SettingsFragment extends MastodonToolbarFragment{ GlobalUserPreferences.save(); needAppRestart=true; })); - items.add(new SwitchItem(R.string.sk_reply_line_below_avatar, R.drawable.ic_fluent_arrow_reply_24_regular, GlobalUserPreferences.replyLineBelowHeader, i->{ - GlobalUserPreferences.replyLineBelowHeader=i.checked; + items.add(new SwitchItem(R.string.sk_reply_line_above_avatar, R.drawable.ic_fluent_arrow_reply_24_regular, GlobalUserPreferences.replyLineAboveHeader, i->{ + GlobalUserPreferences.replyLineAboveHeader=i.checked; + GlobalUserPreferences.compactReblogReplyLine=i.checked; + compactReblogReplyLineItem.enabled=i.checked; + compactReblogReplyLineItem.checked= GlobalUserPreferences.replyLineAboveHeader; + if (list.findViewHolderForAdapterPosition(items.indexOf(compactReblogReplyLineItem)) instanceof SwitchViewHolder svh) svh.rebind(); GlobalUserPreferences.save(); })); + items.add(compactReblogReplyLineItem=new SwitchItem(R.string.sk_compact_reblog_reply_line, R.drawable.ic_fluent_re_order_24_regular, GlobalUserPreferences.compactReblogReplyLine, i->{ + GlobalUserPreferences.compactReblogReplyLine=i.checked; + GlobalUserPreferences.save();; + })); + compactReblogReplyLineItem.enabled=GlobalUserPreferences.replyLineAboveHeader; items.add(new SwitchItem(R.string.sk_settings_translate_only_opened, R.drawable.ic_fluent_translate_24_regular, GlobalUserPreferences.translateButtonOpenedOnly, i->{ GlobalUserPreferences.translateButtonOpenedOnly=i.checked; GlobalUserPreferences.save(); diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java index 71973c466..edb1b60d3 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java @@ -39,6 +39,7 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{ private CustomEmojiHelper emojiHelper=new CustomEmojiHelper(); private View.OnClickListener handleClick; boolean belowHeader, needBottomPadding; + ReblogOrReplyLineStatusDisplayItem secondary; public ReblogOrReplyLineStatusDisplayItem(String parentID, BaseStatusListFragment parentFragment, CharSequence text, List emojis, @DrawableRes int icon, StatusPrivacy visibility, @Nullable View.OnClickListener handleClick) { super(parentID, parentFragment); @@ -79,15 +80,17 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{ } public static class Holder extends StatusDisplayItem.Holder implements ImageLoaderViewHolder{ - private final TextView text; + private final TextView text, secondaryText; + private final View secondaryWrap; public Holder(Activity activity, ViewGroup parent){ super(activity, R.layout.display_item_reblog_or_reply_line, parent); text=findViewById(R.id.text); + secondaryText=findViewById(R.id.secondary_text); + secondaryWrap=findViewById(R.id.secondary_wrap); } - @Override - public void onBind(ReblogOrReplyLineStatusDisplayItem item){ + private void bindLine(ReblogOrReplyLineStatusDisplayItem item, TextView text) { text.setText(item.text); text.setCompoundDrawablesRelativeWithIntrinsicBounds(item.icon, 0, item.iconEnd, 0); text.setOnClickListener(item.handleClick); @@ -104,11 +107,18 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{ if (visibilityText != 0) text.setContentDescription(item.text + " (" + ctx.getString(visibilityText) + ")"); if(Build.VERSION.SDK_INT { + args.putParcelable("profileAccount", Parcels.wrap(account)); + Nav.go(fragment.getActivity(), ProfileFragment.class, args); + }; + + String text = threadReply ? fragment.getString(R.string.sk_show_thread) + : account == null ? fragment.getString(R.string.sk_in_reply) + : GlobalUserPreferences.compactReblogReplyLine && status.reblog != null ? account.displayName + : fragment.getString(R.string.in_reply_to, account.displayName); + + replyLine = new ReblogOrReplyLineStatusDisplayItem( + parentID, fragment, text, account == null ? List.of() : account.emojis, + R.drawable.ic_fluent_arrow_reply_20_filled, null, handleClick + ); + } + if(status.reblog!=null){ boolean isOwnPost = AccountSessionManager.getInstance().isSelf(fragment.getAccountID(), status.account); - items.add(new ReblogOrReplyLineStatusDisplayItem(parentID, fragment, fragment.getString(R.string.user_boosted, status.account.displayName), status.account.emojis, R.drawable.ic_fluent_arrow_repeat_all_20_filled, isOwnPost ? status.visibility : null, i->{ + String text = GlobalUserPreferences.compactReblogReplyLine && replyLine != null + ? status.account.displayName + : fragment.getString(R.string.user_boosted, status.account.displayName); + + items.add(new ReblogOrReplyLineStatusDisplayItem(parentID, fragment, text, status.account.emojis, R.drawable.ic_fluent_arrow_repeat_all_20_filled, isOwnPost ? status.visibility : null, i->{ args.putParcelable("profileAccount", Parcels.wrap(status.account)); Nav.go(fragment.getActivity(), ProfileFragment.class, args); })); @@ -134,42 +161,30 @@ public abstract class StatusDisplayItem{ ))); } - ReblogOrReplyLineStatusDisplayItem replyLine = null; - boolean threadReply = statusForContent.inReplyToAccountId != null && - statusForContent.inReplyToAccountId.equals(status.account.id); + if (replyLine != null && GlobalUserPreferences.replyLineAboveHeader) { + Optional primaryLine = items.stream() + .filter(i -> i instanceof ReblogOrReplyLineStatusDisplayItem) + .map(ReblogOrReplyLineStatusDisplayItem.class::cast) + .findFirst(); - if(statusForContent.inReplyToAccountId!=null && !(threadReply && fragment instanceof ThreadFragment)){ - Account account = knownAccounts.get(statusForContent.inReplyToAccountId); - View.OnClickListener handleClick = account == null || threadReply ? null : i -> { - args.putParcelable("profileAccount", Parcels.wrap(account)); - Nav.go(fragment.getActivity(), ProfileFragment.class, args); - }; - - String text = threadReply ? - fragment.getString(R.string.sk_show_thread) : account != null ? - fragment.getString(R.string.in_reply_to, account.displayName) : fragment.getString(R.string.sk_in_reply); - - replyLine = new ReblogOrReplyLineStatusDisplayItem( - parentID, fragment, text, account == null ? List.of() : account.emojis, - R.drawable.ic_fluent_arrow_reply_20_filled, null, handleClick - ); - } - - if (replyLine != null && !GlobalUserPreferences.replyLineBelowHeader) { - items.add(replyLine); + if (primaryLine.isPresent() && GlobalUserPreferences.compactReblogReplyLine) { + primaryLine.get().secondary = replyLine; + } else { + items.add(replyLine); + } } HeaderStatusDisplayItem header; items.add(header=new HeaderStatusDisplayItem(parentID, statusForContent.account, statusForContent.createdAt, fragment, accountID, statusForContent, null, notification, scheduledStatus)); - if (replyLine != null && GlobalUserPreferences.replyLineBelowHeader) { + if (replyLine != null && !GlobalUserPreferences.replyLineAboveHeader) { replyLine.belowHeader = true; items.add(replyLine); } if(!TextUtils.isEmpty(statusForContent.content)) items.add(new TextStatusDisplayItem(parentID, HtmlParser.parse(statusForContent.content, statusForContent.emojis, statusForContent.mentions, statusForContent.tags, accountID), fragment, statusForContent, disableTranslate)); - else if (GlobalUserPreferences.replyLineBelowHeader && replyLine != null) + else if (!GlobalUserPreferences.replyLineAboveHeader && replyLine != null) replyLine.needBottomPadding=true; else header.needBottomPadding=true; diff --git a/mastodon/src/main/res/drawable/ic_fluent_re_order_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_re_order_24_regular.xml new file mode 100644 index 000000000..15ef7bc46 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_re_order_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/layout/display_item_reblog_or_reply_line.xml b/mastodon/src/main/res/layout/display_item_reblog_or_reply_line.xml index 90bf482c3..f3de28551 100644 --- a/mastodon/src/main/res/layout/display_item_reblog_or_reply_line.xml +++ b/mastodon/src/main/res/layout/display_item_reblog_or_reply_line.xml @@ -1,16 +1,16 @@ - - \ No newline at end of file + + + + + + + + + \ No newline at end of file diff --git a/mastodon/src/main/res/values/strings_sk.xml b/mastodon/src/main/res/values/strings_sk.xml index 4406ecca2..1a6a70b3e 100644 --- a/mastodon/src/main/res/values/strings_sk.xml +++ b/mastodon/src/main/res/values/strings_sk.xml @@ -263,6 +263,7 @@ Followed from %s Auto-hide Compose button In reply - “In reply to” line below avatar + “In reply to” line above avatar Show thread + Compact reblog/reply line \ No newline at end of file From 938ae97cacb5e50f35c6cc346a14cd7b745a92f1 Mon Sep 17 00:00:00 2001 From: sk Date: Wed, 15 Mar 2023 21:26:41 +0100 Subject: [PATCH 048/111] remove click handler for reply line --- .../android/ui/displayitems/StatusDisplayItem.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java index 4179ee64d..19b30ceb0 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java @@ -116,19 +116,13 @@ public abstract class StatusDisplayItem{ if(statusForContent.inReplyToAccountId!=null && !(threadReply && fragment instanceof ThreadFragment)){ Account account = knownAccounts.get(statusForContent.inReplyToAccountId); - View.OnClickListener handleClick = account == null || threadReply ? null : i -> { - args.putParcelable("profileAccount", Parcels.wrap(account)); - Nav.go(fragment.getActivity(), ProfileFragment.class, args); - }; - String text = threadReply ? fragment.getString(R.string.sk_show_thread) : account == null ? fragment.getString(R.string.sk_in_reply) : GlobalUserPreferences.compactReblogReplyLine && status.reblog != null ? account.displayName : fragment.getString(R.string.in_reply_to, account.displayName); - replyLine = new ReblogOrReplyLineStatusDisplayItem( parentID, fragment, text, account == null ? List.of() : account.emojis, - R.drawable.ic_fluent_arrow_reply_20_filled, null, handleClick + R.drawable.ic_fluent_arrow_reply_20_filled, null, null ); } From 499ac8f727be45cb35c3045266bdd3797ff1b049 Mon Sep 17 00:00:00 2001 From: sk Date: Wed, 15 Mar 2023 22:30:57 +0100 Subject: [PATCH 049/111] improve compact reply/reblog header --- .../android/GlobalUserPreferences.java | 2 +- .../android/fragments/SettingsFragment.java | 4 +- .../ReblogOrReplyLineStatusDisplayItem.java | 29 +++++++--- .../ui/displayitems/StatusDisplayItem.java | 2 +- .../display_item_reblog_or_reply_line.xml | 58 +++++++++---------- 5 files changed, 54 insertions(+), 41 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java b/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java index fa2d08f3e..6115c1120 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java +++ b/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java @@ -95,7 +95,7 @@ public class GlobalUserPreferences{ collapseLongPosts=prefs.getBoolean("collapseLongPosts", true); spectatorMode=prefs.getBoolean("spectatorMode", false); autoHideFab=prefs.getBoolean("autoHideFab", true); - replyLineAboveHeader =prefs.getBoolean("replyLineAboveHeader", false); + replyLineAboveHeader=prefs.getBoolean("replyLineAboveHeader", true); compactReblogReplyLine=prefs.getBoolean("compactReblogReplyLine", true); publishButtonText=prefs.getString("publishButtonText", ""); theme=ThemePreference.values()[prefs.getInt("theme", 0)]; diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java index 6704813bc..487751cdc 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java @@ -260,10 +260,12 @@ public class SettingsFragment extends MastodonToolbarFragment{ compactReblogReplyLineItem.checked= GlobalUserPreferences.replyLineAboveHeader; if (list.findViewHolderForAdapterPosition(items.indexOf(compactReblogReplyLineItem)) instanceof SwitchViewHolder svh) svh.rebind(); GlobalUserPreferences.save(); + needAppRestart=true; })); items.add(compactReblogReplyLineItem=new SwitchItem(R.string.sk_compact_reblog_reply_line, R.drawable.ic_fluent_re_order_24_regular, GlobalUserPreferences.compactReblogReplyLine, i->{ GlobalUserPreferences.compactReblogReplyLine=i.checked; - GlobalUserPreferences.save();; + GlobalUserPreferences.save(); + needAppRestart=true; })); compactReblogReplyLineItem.enabled=GlobalUserPreferences.replyLineAboveHeader; items.add(new SwitchItem(R.string.sk_settings_translate_only_opened, R.drawable.ic_fluent_translate_24_regular, GlobalUserPreferences.translateButtonOpenedOnly, i->{ diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java index edb1b60d3..2e1b8a77f 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java @@ -10,8 +10,10 @@ import android.text.SpannableStringBuilder; import android.util.TypedValue; import android.view.View; import android.view.ViewGroup; +import android.widget.LinearLayout; import android.widget.TextView; +import org.joinmastodon.android.GlobalUserPreferences; import org.joinmastodon.android.R; import org.joinmastodon.android.fragments.BaseStatusListFragment; import org.joinmastodon.android.model.Emoji; @@ -39,7 +41,7 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{ private CustomEmojiHelper emojiHelper=new CustomEmojiHelper(); private View.OnClickListener handleClick; boolean belowHeader, needBottomPadding; - ReblogOrReplyLineStatusDisplayItem secondary; + ReblogOrReplyLineStatusDisplayItem extra; public ReblogOrReplyLineStatusDisplayItem(String parentID, BaseStatusListFragment parentFragment, CharSequence text, List emojis, @DrawableRes int icon, StatusPrivacy visibility, @Nullable View.OnClickListener handleClick) { super(parentID, parentFragment); @@ -80,14 +82,26 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{ } public static class Holder extends StatusDisplayItem.Holder implements ImageLoaderViewHolder{ - private final TextView text, secondaryText; - private final View secondaryWrap; + private final TextView text, extraText; + private final View separator; public Holder(Activity activity, ViewGroup parent){ super(activity, R.layout.display_item_reblog_or_reply_line, parent); text=findViewById(R.id.text); - secondaryText=findViewById(R.id.secondary_text); - secondaryWrap=findViewById(R.id.secondary_wrap); + extraText=findViewById(R.id.extra_text); + separator=findViewById(R.id.separator); + if (GlobalUserPreferences.replyLineAboveHeader && GlobalUserPreferences.compactReblogReplyLine) { + itemView.getViewTreeObserver().addOnPreDrawListener(() -> { + int orientation = ((LinearLayout) itemView).getOrientation(); + extraText.setPaddingRelative(extraText.getPaddingStart(), V.dp(16), extraText.getPaddingEnd(), extraText.getPaddingBottom()); + separator.setVisibility(View.GONE); + if (getItem() != null && getItem().extra != null) { + if (orientation == LinearLayout.VERTICAL) extraText.setPaddingRelative(extraText.getPaddingStart(), 0, extraText.getPaddingEnd(), extraText.getPaddingBottom()); + else separator.setVisibility(View.VISIBLE); + } + return true; + }); + } } private void bindLine(ReblogOrReplyLineStatusDisplayItem item, TextView text) { @@ -114,8 +128,9 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{ @Override public void onBind(ReblogOrReplyLineStatusDisplayItem item){ bindLine(item, text); - if (item.secondary != null) bindLine(item.secondary, secondaryText); - secondaryWrap.setVisibility(item.secondary == null ? View.GONE : View.VISIBLE); + if (item.extra != null) bindLine(item.extra, extraText); + extraText.setVisibility(item.extra == null ? View.GONE : View.VISIBLE); + separator.setVisibility(item.extra == null ? View.GONE : View.VISIBLE); ViewGroup.MarginLayoutParams params = new ViewGroup.MarginLayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); params.bottomMargin = item.belowHeader ? V.dp(-6) : V.dp(-12); params.topMargin = item.belowHeader ? V.dp(-6) : 0; diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java index 19b30ceb0..3e3bb3bf0 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java @@ -162,7 +162,7 @@ public abstract class StatusDisplayItem{ .findFirst(); if (primaryLine.isPresent() && GlobalUserPreferences.compactReblogReplyLine) { - primaryLine.get().secondary = replyLine; + primaryLine.get().extra = replyLine; } else { items.add(replyLine); } diff --git a/mastodon/src/main/res/layout/display_item_reblog_or_reply_line.xml b/mastodon/src/main/res/layout/display_item_reblog_or_reply_line.xml index f3de28551..2138522c0 100644 --- a/mastodon/src/main/res/layout/display_item_reblog_or_reply_line.xml +++ b/mastodon/src/main/res/layout/display_item_reblog_or_reply_line.xml @@ -1,16 +1,17 @@ - - + android:layout_marginHorizontal="6dp" + android:paddingTop="16dp" + android:paddingHorizontal="1dp" + android:textAppearance="@style/m3_title_small" + android:gravity="center_horizontal" + android:importantForAccessibility="no" + android:includeFontPadding="false" + android:text="@string/sk_separator" /> - - - - - + \ No newline at end of file From f71bb6b78c6f6ac4d5c40ce3295e0bfc5dd8977a Mon Sep 17 00:00:00 2001 From: sk Date: Wed, 15 Mar 2023 22:36:30 +0100 Subject: [PATCH 050/111] use pre draw listener instead of post hopefully fixes sk22#422 --- .../displayitems/TextStatusDisplayItem.java | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/TextStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/TextStatusDisplayItem.java index 6e94d4195..83a8b7ef1 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/TextStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/TextStatusDisplayItem.java @@ -6,6 +6,7 @@ import android.graphics.drawable.Drawable; import android.text.TextUtils; import android.view.View; import android.view.ViewGroup; +import android.view.ViewTreeObserver; import android.widget.LinearLayout; import android.widget.Button; import android.widget.ScrollView; @@ -227,13 +228,20 @@ public class TextStatusDisplayItem extends StatusDisplayItem{ readMore.setVisibility(View.GONE); } - if (GlobalUserPreferences.collapseLongPosts) text.post(() -> { - boolean tooBig = text.getMeasuredHeight() > textMaxHeight; - boolean inTimeline = !item.textSelectable; - boolean hasSpoiler = !TextUtils.isEmpty(item.status.spoilerText); - boolean expandable = inTimeline && tooBig && !hasSpoiler; - item.parentFragment.onEnableExpandable(this, expandable); - }); + if (GlobalUserPreferences.collapseLongPosts) { + text.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { + @Override + public boolean onPreDraw() { + text.getViewTreeObserver().removeOnPreDrawListener(this); + boolean tooBig = text.getMeasuredHeight() > textMaxHeight; + boolean inTimeline = !item.textSelectable; + boolean hasSpoiler = !TextUtils.isEmpty(item.status.spoilerText); + boolean expandable = inTimeline && tooBig && !hasSpoiler; + item.parentFragment.onEnableExpandable(Holder.this, expandable); + return true; + } + }); + } readMore.setVisibility(item.status.textExpandable && !item.status.textExpanded ? View.VISIBLE : View.GONE); textScrollView.setLayoutParams(item.status.textExpandable && !item.status.textExpanded ? collapseParams : wrapParams); From 94b862a3ff526df33367ed93630d5159db2d9f84 Mon Sep 17 00:00:00 2001 From: sk Date: Wed, 15 Mar 2023 23:27:43 +0100 Subject: [PATCH 051/111] improve reblog/reply line render --- .../displayitems/ReblogOrReplyLineStatusDisplayItem.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java index 2e1b8a77f..6f9766c3d 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java @@ -92,13 +92,10 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{ separator=findViewById(R.id.separator); if (GlobalUserPreferences.replyLineAboveHeader && GlobalUserPreferences.compactReblogReplyLine) { itemView.getViewTreeObserver().addOnPreDrawListener(() -> { + if (item == null) return true; int orientation = ((LinearLayout) itemView).getOrientation(); - extraText.setPaddingRelative(extraText.getPaddingStart(), V.dp(16), extraText.getPaddingEnd(), extraText.getPaddingBottom()); - separator.setVisibility(View.GONE); - if (getItem() != null && getItem().extra != null) { - if (orientation == LinearLayout.VERTICAL) extraText.setPaddingRelative(extraText.getPaddingStart(), 0, extraText.getPaddingEnd(), extraText.getPaddingBottom()); - else separator.setVisibility(View.VISIBLE); - } + extraText.setPaddingRelative(extraText.getPaddingStart(), item.extra != null && orientation == LinearLayout.VERTICAL ? 0 : V.dp(16), extraText.getPaddingEnd(), extraText.getPaddingBottom()); + separator.setVisibility(item.extra != null && orientation == LinearLayout.HORIZONTAL ? View.VISIBLE : View.GONE); return true; }); } From 9cc8b2668c96bc0ea1c636ae8de904058a33452c Mon Sep 17 00:00:00 2001 From: sk Date: Wed, 15 Mar 2023 23:31:51 +0100 Subject: [PATCH 052/111] fix show thread not working for reposts --- .../joinmastodon/android/ui/displayitems/StatusDisplayItem.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java index 3e3bb3bf0..e57cb0218 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java @@ -112,7 +112,7 @@ public abstract class StatusDisplayItem{ ReblogOrReplyLineStatusDisplayItem replyLine = null; boolean threadReply = statusForContent.inReplyToAccountId != null && - statusForContent.inReplyToAccountId.equals(status.account.id); + statusForContent.inReplyToAccountId.equals(statusForContent.account.id); if(statusForContent.inReplyToAccountId!=null && !(threadReply && fragment instanceof ThreadFragment)){ Account account = knownAccounts.get(statusForContent.inReplyToAccountId); From f852dac1e57684bb88b7e835bb3a09689f6d57c6 Mon Sep 17 00:00:00 2001 From: Jacoco <63549689+Jacocococo@users.noreply.github.com> Date: Thu, 16 Mar 2023 00:49:11 +0100 Subject: [PATCH 053/111] Improvements for Pleroma/Akkoma (#445) * Reply Visibility on Plemora * Sort statuses in thread * Get default visibility and language from account if preferences fail * Fix for Mentions tab in notifications on Pleroma * Mark status as sensitive if not already when spoilertext is present * Integrating Pleroma quoting for new posts * move string to strings_sk * use null instead of empty string * change string * fix crash due to null value * update string --------- Co-authored-by: sk --- .../android/GlobalUserPreferences.java | 7 +++ .../android/api/CacheController.java | 8 ++- .../notifications/GetNotifications.java | 19 ++++--- .../api/requests/statuses/CreateStatus.java | 2 + .../requests/timelines/GetHomeTimeline.java | 3 ++ .../api/session/AccountSessionManager.java | 15 +++++- .../android/fragments/ComposeFragment.java | 53 +++++++++++-------- .../android/fragments/SettingsFragment.java | 35 ++++++++++++ .../android/fragments/ThreadFragment.java | 46 ++++++++++++++++ .../joinmastodon/android/model/Status.java | 5 ++ .../displayitems/FooterStatusDisplayItem.java | 19 ++++--- .../src/main/res/menu/reply_visibility.xml | 6 +++ mastodon/src/main/res/values/strings_sk.xml | 5 ++ 13 files changed, 184 insertions(+), 39 deletions(-) create mode 100644 mastodon/src/main/res/menu/reply_visibility.xml diff --git a/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java b/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java index 6115c1120..e9461d660 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java +++ b/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java @@ -57,6 +57,11 @@ public class GlobalUserPreferences{ public static Set accountsWithLocalOnlySupport; public static Set accountsInGlitchMode; + /** + * Pleroma + */ + public static String replyVisibility; + private static SharedPreferences getPrefs(){ return MastodonApp.context.getSharedPreferences("global", Context.MODE_PRIVATE); } @@ -103,6 +108,7 @@ public class GlobalUserPreferences{ pinnedTimelines=fromJson(prefs.getString("pinnedTimelines", null), pinnedTimelinesType, new HashMap<>()); accountsWithLocalOnlySupport=prefs.getStringSet("accountsWithLocalOnlySupport", new HashSet<>()); accountsInGlitchMode=prefs.getStringSet("accountsInGlitchMode", new HashSet<>()); + replyVisibility=prefs.getString("replyVisibility", null); try { color=ColorPreference.valueOf(prefs.getString("color", ColorPreference.PINK.name())); @@ -148,6 +154,7 @@ public class GlobalUserPreferences{ .putString("pinnedTimelines", gson.toJson(pinnedTimelines)) .putStringSet("accountsWithLocalOnlySupport", accountsWithLocalOnlySupport) .putStringSet("accountsInGlitchMode", accountsInGlitchMode) + .putString("replyVisibility", replyVisibility) .apply(); } diff --git a/mastodon/src/main/java/org/joinmastodon/android/api/CacheController.java b/mastodon/src/main/java/org/joinmastodon/android/api/CacheController.java index 3b58fac14..9609bfa34 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/api/CacheController.java +++ b/mastodon/src/main/java/org/joinmastodon/android/api/CacheController.java @@ -13,9 +13,11 @@ import org.joinmastodon.android.BuildConfig; import org.joinmastodon.android.MastodonApp; import org.joinmastodon.android.api.requests.notifications.GetNotifications; import org.joinmastodon.android.api.requests.timelines.GetHomeTimeline; +import org.joinmastodon.android.api.session.AccountSession; import org.joinmastodon.android.api.session.AccountSessionManager; import org.joinmastodon.android.model.CacheablePaginatedResponse; import org.joinmastodon.android.model.Filter; +import org.joinmastodon.android.model.Instance; import org.joinmastodon.android.model.Notification; import org.joinmastodon.android.model.PaginatedResponse; import org.joinmastodon.android.model.SearchResult; @@ -130,7 +132,8 @@ public class CacheController{ cancelDelayedClose(); databaseThread.postRunnable(()->{ try{ - List filters=AccountSessionManager.getInstance().getAccount(accountID).wordFilters.stream().filter(f->f.context.contains(Filter.FilterContext.NOTIFICATIONS)).collect(Collectors.toList()); + AccountSession accountSession=AccountSessionManager.getInstance().getAccount(accountID); + List filters=accountSession.wordFilters.stream().filter(f->f.context.contains(Filter.FilterContext.NOTIFICATIONS)).collect(Collectors.toList()); if(!forceReload){ SQLiteDatabase db=getOrOpenDatabase(); String table=onlyPosts ? "notifications_posts" : onlyMentions ? "notifications_mentions" : "notifications_all"; @@ -160,7 +163,8 @@ public class CacheController{ Log.w(TAG, "getNotifications: corrupted notification object in database", x); } } - new GetNotifications(maxID, count, onlyPosts ? EnumSet.of(Notification.Type.STATUS) : onlyMentions ? EnumSet.of(Notification.Type.MENTION): EnumSet.allOf(Notification.Type.class)) + Instance instance=AccountSessionManager.getInstance().getInstanceInfo(accountSession.domain); + new GetNotifications(maxID, count, onlyPosts ? EnumSet.of(Notification.Type.STATUS) : onlyMentions ? EnumSet.of(Notification.Type.MENTION): EnumSet.allOf(Notification.Type.class), instance.pleroma != null) .setCallback(new Callback<>(){ @Override public void onSuccess(List result){ diff --git a/mastodon/src/main/java/org/joinmastodon/android/api/requests/notifications/GetNotifications.java b/mastodon/src/main/java/org/joinmastodon/android/api/requests/notifications/GetNotifications.java index 3c5a162fb..33aefea52 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/api/requests/notifications/GetNotifications.java +++ b/mastodon/src/main/java/org/joinmastodon/android/api/requests/notifications/GetNotifications.java @@ -1,6 +1,5 @@ package org.joinmastodon.android.api.requests.notifications; -import com.google.gson.annotations.SerializedName; import com.google.gson.reflect.TypeToken; import org.joinmastodon.android.api.ApiUtils; @@ -11,18 +10,24 @@ import java.util.EnumSet; import java.util.List; public class GetNotifications extends MastodonAPIRequest>{ - public GetNotifications(String maxID, int limit, EnumSet includeTypes){ + public GetNotifications(String maxID, int limit, EnumSet includeTypes, boolean isPleromaInstance){ super(HttpMethod.GET, "/notifications", new TypeToken<>(){}); if(maxID!=null) addQueryParameter("max_id", maxID); if(limit>0) addQueryParameter("limit", ""+limit); if(includeTypes!=null){ - for(String type:ApiUtils.enumSetToStrings(includeTypes, Notification.Type.class)){ - addQueryParameter("types[]", type); - } - for(String type:ApiUtils.enumSetToStrings(EnumSet.complementOf(includeTypes), Notification.Type.class)){ - addQueryParameter("exclude_types[]", type); + if(!isPleromaInstance) { + for(String type:ApiUtils.enumSetToStrings(includeTypes, Notification.Type.class)){ + addQueryParameter("types[]", type); + } + for(String type:ApiUtils.enumSetToStrings(EnumSet.complementOf(includeTypes), Notification.Type.class)){ + addQueryParameter("exclude_types[]", type); + } + }else{ + for(String type:ApiUtils.enumSetToStrings(includeTypes, Notification.Type.class)){ + addQueryParameter("include_types[]", type); + } } } removeUnsupportedItems=true; diff --git a/mastodon/src/main/java/org/joinmastodon/android/api/requests/statuses/CreateStatus.java b/mastodon/src/main/java/org/joinmastodon/android/api/requests/statuses/CreateStatus.java index bd6b307b1..267617ff0 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/api/requests/statuses/CreateStatus.java +++ b/mastodon/src/main/java/org/joinmastodon/android/api/requests/statuses/CreateStatus.java @@ -45,6 +45,8 @@ public class CreateStatus extends MastodonAPIRequest{ public Instant scheduledAt; public String language; + public String quoteId; + public static class Poll{ public ArrayList options=new ArrayList<>(); public int expiresIn; diff --git a/mastodon/src/main/java/org/joinmastodon/android/api/requests/timelines/GetHomeTimeline.java b/mastodon/src/main/java/org/joinmastodon/android/api/requests/timelines/GetHomeTimeline.java index a84978d2a..3792c5a66 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/api/requests/timelines/GetHomeTimeline.java +++ b/mastodon/src/main/java/org/joinmastodon/android/api/requests/timelines/GetHomeTimeline.java @@ -2,6 +2,7 @@ package org.joinmastodon.android.api.requests.timelines; import com.google.gson.reflect.TypeToken; +import org.joinmastodon.android.GlobalUserPreferences; import org.joinmastodon.android.api.MastodonAPIRequest; import org.joinmastodon.android.model.Status; @@ -18,5 +19,7 @@ public class GetHomeTimeline extends MastodonAPIRequest>{ addQueryParameter("since_id", sinceID); if(limit>0) addQueryParameter("limit", ""+limit); + if(GlobalUserPreferences.replyVisibility != null) + addQueryParameter("reply_visibility", GlobalUserPreferences.replyVisibility); } } diff --git a/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSessionManager.java b/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSessionManager.java index 4f3b57a39..4b4871ba0 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSessionManager.java +++ b/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSessionManager.java @@ -278,6 +278,12 @@ public class AccountSessionManager{ public void onSuccess(Account result){ session.self=result; session.infoLastUpdated=System.currentTimeMillis(); + if(session.preferences != null && session.preferences.postingDefaultVisibility != null){ + session.preferences.postingDefaultVisibility = result.source.privacy; + } + if(session.preferences != null && session.preferences.postingDefaultLanguage != null){ + session.preferences.postingDefaultLanguage = result.source.language; + } writeAccountsFile(); } @@ -297,7 +303,14 @@ public class AccountSessionManager{ } @Override - public void onError(ErrorResponse error) {} + public void onError(ErrorResponse error) { + Preferences preferences = new Preferences(); + if(session.self != null){ + preferences.postingDefaultVisibility = session.self.source.privacy; + preferences.postingDefaultLanguage = session.self.source.language; + } + session.preferences = preferences; + } }).exec(session.getID()); } diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java index 7afaf9935..3f4d47e71 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java @@ -204,6 +204,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr private List customEmojis; private CustomEmojiPopupKeyboard emojiKeyboard; private Status replyTo; + private Status quote; private String initialText; private String uuid; private int pollDuration=24*3600; @@ -252,6 +253,8 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr editingStatus=Parcels.unwrap(getArguments().getParcelable("editStatus")); if(getArguments().containsKey("replyTo")) replyTo=Parcels.unwrap(getArguments().getParcelable("replyTo")); + if(getArguments().containsKey("quote")) + quote=Parcels.unwrap(getArguments().getParcelable("quote")); if(instance==null){ Nav.finish(this); return; @@ -607,7 +610,8 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr } }); spoilerEdit.addTextChangedListener(new SimpleTextWatcher(e->updateCharCounter())); - if(replyTo!=null){ + if(replyTo!=null || quote!=null){ + Status status = quote!=null ? quote : replyTo; View replyWrap = view.findViewById(R.id.reply_wrap); scrollView.getViewTreeObserver().addOnGlobalLayoutListener(() -> { int scrollHeight = scrollView.getHeight(); @@ -633,13 +637,13 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr originalPost.setOnClickListener(v->{ Bundle args=new Bundle(); args.putString("account", accountID); - args.putParcelable("status", Parcels.wrap(replyTo)); + args.putParcelable("status", Parcels.wrap(status)); imm.hideSoftInputFromWindow(view.getWindowToken(), 0); Nav.go(getActivity(), ThreadFragment.class, args); }); ImageView avatar = view.findViewById(R.id.avatar); - ViewImageLoader.load(avatar, null, new UrlImageLoaderRequest(replyTo.account.avatar)); + ViewImageLoader.load(avatar, null, new UrlImageLoaderRequest(status.account.avatar)); ViewOutlineProvider roundCornersOutline=new ViewOutlineProvider(){ @Override public void getOutline(View view, Outline outline){ @@ -651,15 +655,15 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr avatar.setOnClickListener(v->{ Bundle args=new Bundle(); args.putString("account", accountID); - args.putParcelable("profileAccount", Parcels.wrap(replyTo.account)); + args.putParcelable("profileAccount", Parcels.wrap(status.account)); imm.hideSoftInputFromWindow(view.getWindowToken(), 0); Nav.go(getActivity(), ProfileFragment.class, args); }); - ((TextView) view.findViewById(R.id.name)).setText(replyTo.account.displayName); - ((TextView) view.findViewById(R.id.username)).setText(replyTo.account.getDisplayUsername()); + ((TextView) view.findViewById(R.id.name)).setText(status.account.displayName); + ((TextView) view.findViewById(R.id.username)).setText(status.account.getDisplayUsername()); view.findViewById(R.id.visibility).setVisibility(View.GONE); - Drawable visibilityIcon = getActivity().getDrawable(switch(replyTo.visibility){ + Drawable visibilityIcon = getActivity().getDrawable(switch(status.visibility){ case PUBLIC -> R.drawable.ic_fluent_earth_20_regular; case UNLISTED -> R.drawable.ic_fluent_lock_open_20_regular; case PRIVATE -> R.drawable.ic_fluent_lock_closed_20_filled; @@ -670,36 +674,36 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr moreBtn.setImageDrawable(visibilityIcon); moreBtn.setBackground(null); TextView timestamp = view.findViewById(R.id.timestamp); - if (replyTo.editedAt==null) timestamp.setText(UiUtils.formatRelativeTimestamp(getContext(), replyTo.createdAt)); - else timestamp.setText(getString(R.string.edited_timestamp, UiUtils.formatRelativeTimestamp(getContext(), replyTo.editedAt))); - if (replyTo.spoilerText != null && !replyTo.spoilerText.isBlank()) { + if (status.editedAt==null) timestamp.setText(UiUtils.formatRelativeTimestamp(getContext(), status.createdAt)); + else timestamp.setText(getString(R.string.edited_timestamp, UiUtils.formatRelativeTimestamp(getContext(), status.editedAt))); + if (status.spoilerText != null && !status.spoilerText.isBlank()) { view.findViewById(R.id.spoiler_header).setVisibility(View.VISIBLE); - ((TextView) view.findViewById(R.id.spoiler_title_inline)).setText(replyTo.spoilerText); + ((TextView) view.findViewById(R.id.spoiler_title_inline)).setText(status.spoilerText); } - SpannableStringBuilder content = HtmlParser.parse(replyTo.content, replyTo.emojis, replyTo.mentions, replyTo.tags, accountID); + SpannableStringBuilder content = HtmlParser.parse(status.content, status.emojis, status.mentions, status.tags, accountID); LinkedTextView text = view.findViewById(R.id.text); if (content.length() > 0) text.setText(content); else view.findViewById(R.id.display_item_text).setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, V.dp(16))); - replyText.setText(getString(R.string.in_reply_to, replyTo.account.displayName)); - int visibilityNameRes = switch (replyTo.visibility) { + replyText.setText(getString(quote!=null? R.string.sk_quoting_user : R.string.in_reply_to, status.account.displayName)); + int visibilityNameRes = switch (status.visibility) { case PUBLIC -> R.string.visibility_public; case UNLISTED -> R.string.sk_visibility_unlisted; case PRIVATE -> R.string.visibility_followers_only; case DIRECT -> R.string.visibility_private; case LOCAL -> R.string.sk_local_only; }; - replyText.setContentDescription(getString(R.string.in_reply_to, replyTo.account.displayName) + ". " + getString(R.string.post_visibility) + ": " + getString(visibilityNameRes)); + replyText.setContentDescription(getString(R.string.in_reply_to, status.account.displayName) + ". " + getString(R.string.post_visibility) + ": " + getString(visibilityNameRes)); replyText.setOnClickListener(v->{ scrollView.smoothScrollTo(0, 0); }); ArrayList mentions=new ArrayList<>(); String ownID=AccountSessionManager.getInstance().getAccount(accountID).self.id; - if(!replyTo.account.id.equals(ownID)) - mentions.add('@'+replyTo.account.acct); - for(Mention mention:replyTo.mentions){ + if(!status.account.id.equals(ownID)) + mentions.add('@'+status.account.acct); + for(Mention mention:status.mentions){ if(mention.id.equals(ownID)) continue; String m='@'+mention.acct; @@ -712,17 +716,17 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr ignoreSelectionChanges=true; mainEditText.setSelection(mainEditText.length()); ignoreSelectionChanges=false; - if(!TextUtils.isEmpty(replyTo.spoilerText)){ + if(!TextUtils.isEmpty(status.spoilerText)){ hasSpoiler=true; spoilerEdit.setVisibility(View.VISIBLE); - if(GlobalUserPreferences.prefixRepliesWithRe && !replyTo.spoilerText.startsWith("re: ")){ - spoilerEdit.setText("re: " + replyTo.spoilerText); + if(GlobalUserPreferences.prefixRepliesWithRe && !status.spoilerText.startsWith("re: ")){ + spoilerEdit.setText("re: " + status.spoilerText); }else{ - spoilerEdit.setText(replyTo.spoilerText); + spoilerEdit.setText(status.spoilerText); } spoilerBtn.setSelected(true); } - if (replyTo.language != null && !replyTo.language.isEmpty()) updateLanguage(replyTo.language); + if (status.language != null && !status.language.isEmpty()) updateLanguage(status.language); } }else if (editingStatus==null || editingStatus.inReplyToId==null){ // TODO: remove workaround after https://github.com/mastodon/mastodon-android/issues/341 gets fixed @@ -1089,6 +1093,9 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr if(hasSpoiler && spoilerEdit.length()>0){ req.spoilerText=spoilerEdit.getText().toString(); } + if(quote != null){ + req.quoteId=quote.id; + } if(uuid==null) uuid=UUID.randomUUID().toString(); diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java index 487751cdc..0c0f38df2 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java @@ -213,6 +213,22 @@ public class SettingsFragment extends MastodonToolbarFragment{ GlobalUserPreferences.showReplies=i.checked; GlobalUserPreferences.save(); })); + if (instance.pleroma != null) { + items.add(new ButtonItem(R.string.sk_settings_reply_visibility, R.drawable.ic_fluent_chat_24_regular, b->{ + PopupMenu popupMenu=new PopupMenu(getActivity(), b, Gravity.CENTER_HORIZONTAL); + popupMenu.inflate(R.menu.reply_visibility); + popupMenu.setOnMenuItemClickListener(item -> this.onReplyVisibilityChanged(item, b)); + b.setOnTouchListener(popupMenu.getDragToOpenListener()); + b.setOnClickListener(v->popupMenu.show()); + b.setText(GlobalUserPreferences.replyVisibility == null ? + R.string.sk_settings_reply_visibility_all : + switch(GlobalUserPreferences.replyVisibility){ + case "following" -> R.string.sk_settings_reply_visibility_following; + case "self" -> R.string.sk_settings_reply_visibility_self; + default -> R.string.sk_settings_reply_visibility_all; + }); + })); + } items.add(new SwitchItem(R.string.sk_settings_show_boosts, R.drawable.ic_fluent_arrow_repeat_all_24_regular, GlobalUserPreferences.showBoosts, i->{ GlobalUserPreferences.showBoosts=i.checked; GlobalUserPreferences.save(); @@ -480,6 +496,25 @@ public class SettingsFragment extends MastodonToolbarFragment{ } } + private boolean onReplyVisibilityChanged(MenuItem item, Button btn){ + String pref = null; + int id = item.getItemId(); + + if (id == R.id.reply_visibility_following) pref = "following"; + else if (id == R.id.reply_visibility_self) pref = "self"; + + GlobalUserPreferences.replyVisibility=pref; + GlobalUserPreferences.save(); + btn.setText(GlobalUserPreferences.replyVisibility == null ? + R.string.sk_settings_reply_visibility_all : + switch(GlobalUserPreferences.replyVisibility){ + case "following" -> R.string.sk_settings_reply_visibility_following; + case "self" -> R.string.sk_settings_reply_visibility_self; + default -> R.string.sk_settings_reply_visibility_all; + }); + return true; + } + private void restartActivityToApplyNewTheme(){ // Calling activity.recreate() causes a black screen for like half a second. // So, let's take a screenshot and overlay it on top to create the illusion of a smoother transition. diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ThreadFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ThreadFragment.java index 03cadb3b0..c16d776c4 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ThreadFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ThreadFragment.java @@ -5,9 +5,12 @@ import android.view.View; import org.joinmastodon.android.R; import org.joinmastodon.android.api.requests.statuses.GetStatusContext; +import org.joinmastodon.android.api.session.AccountSession; +import org.joinmastodon.android.api.session.AccountSessionManager; import org.joinmastodon.android.events.StatusCreatedEvent; import org.joinmastodon.android.model.Account; import org.joinmastodon.android.model.Filter; +import org.joinmastodon.android.model.Instance; import org.joinmastodon.android.model.Status; import org.joinmastodon.android.model.StatusContext; import org.joinmastodon.android.ui.displayitems.ExtendedFooterStatusDisplayItem; @@ -19,6 +22,7 @@ import org.joinmastodon.android.ui.utils.UiUtils; import org.joinmastodon.android.utils.StatusFilterPredicate; import org.parceler.Parcels; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -68,6 +72,30 @@ public class ThreadFragment extends StatusListFragment{ data.add(mainStatus); onAppendItems(Collections.singletonList(mainStatus)); } + AccountSession account=AccountSessionManager.getInstance().getAccount(accountID); + Instance instance=AccountSessionManager.getInstance().getInstanceInfo(account.domain); + if(instance.pleroma != null){ + List threadIds=new ArrayList<>(); + threadIds.add(mainStatus.id); + for(Status s:result.descendants){ + if(threadIds.contains(s.inReplyToId)){ + threadIds.add(s.id); + } + } + threadIds.add(mainStatus.inReplyToId); + for(int i=result.ancestors.size()-1; i >= 0; i--){ + Status s=result.ancestors.get(i); + if(s.inReplyToId != null && threadIds.contains(s.id)){ + threadIds.add(s.inReplyToId); + } + } + + result.ancestors=result.ancestors.stream().filter(s -> threadIds.contains(s.id)).collect(Collectors.toList()); + result.descendants=getDescendantsOrdered(mainStatus.id, + result.descendants.stream() + .filter(s -> threadIds.contains(s.id)) + .collect(Collectors.toList())); + } result.descendants=filterStatuses(result.descendants); result.ancestors=filterStatuses(result.ancestors); if(footerProgress!=null) @@ -90,6 +118,24 @@ public class ThreadFragment extends StatusListFragment{ .exec(accountID); } + private List getDescendantsOrdered(String id, List statuses){ + List out=new ArrayList<>(); + for(Status s:getDirectDescendants(id, statuses)){ + out.add(s); + getDirectDescendants(s.id, statuses).forEach(d ->{ + out.add(d); + out.addAll(getDescendantsOrdered(d.id, statuses)); + }); + } + return out; + } + + private List getDirectDescendants(String id, List statuses){ + return statuses.stream() + .filter(s -> s.inReplyToId.equals(id)) + .collect(Collectors.toList()); + } + private List filterStatuses(List statuses){ StatusFilterPredicate statusFilterPredicate=new StatusFilterPredicate(accountID,Filter.FilterContext.THREAD); return statuses.stream() diff --git a/mastodon/src/main/java/org/joinmastodon/android/model/Status.java b/mastodon/src/main/java/org/joinmastodon/android/model/Status.java index 8574b520c..aa3aa6944 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/model/Status.java +++ b/mastodon/src/main/java/org/joinmastodon/android/model/Status.java @@ -58,6 +58,8 @@ public class Status extends BaseModel implements DisplayItemsParent, Searchable{ public boolean bookmarked; public boolean pinned; + public Status quote; + public transient boolean filterRevealed; public transient boolean spoilerRevealed; public transient boolean textExpanded, textExpandable; @@ -66,6 +68,9 @@ public class Status extends BaseModel implements DisplayItemsParent, Searchable{ @Override public void postprocess() throws ObjectValidationException{ + if(spoilerText!=null && !spoilerText.isEmpty() && !sensitive) + sensitive=true; + super.postprocess(); if(application!=null) application.postprocess(); diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/FooterStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/FooterStatusDisplayItem.java index c23841fac..a8cb070b0 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/FooterStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/FooterStatusDisplayItem.java @@ -26,6 +26,7 @@ import org.joinmastodon.android.api.session.AccountSession; import org.joinmastodon.android.api.session.AccountSessionManager; import org.joinmastodon.android.fragments.BaseStatusListFragment; import org.joinmastodon.android.fragments.ComposeFragment; +import org.joinmastodon.android.model.Instance; import org.joinmastodon.android.model.Status; import org.joinmastodon.android.model.StatusPrivacy; import org.joinmastodon.android.ui.M3AlertDialogBuilder; @@ -281,12 +282,18 @@ public class FooterStatusDisplayItem extends StatusDisplayItem{ v.startAnimation(opacityIn); Bundle args=new Bundle(); args.putString("account", item.accountID); - StringBuilder prefilledText = new StringBuilder().append("\n\n"); - String ownID = AccountSessionManager.getInstance().getAccount(item.accountID).self.id; - if (!item.status.account.id.equals(ownID)) prefilledText.append('@').append(item.status.account.acct).append(' '); - prefilledText.append(item.status.url); - args.putString("prefilledText", prefilledText.toString()); - args.putInt("selectionStart", 0); + AccountSession accountSession=AccountSessionManager.getInstance().getAccount(item.accountID); + Instance instance=AccountSessionManager.getInstance().getInstanceInfo(accountSession.domain); + if(instance.pleroma == null){ + StringBuilder prefilledText = new StringBuilder().append("\n\n"); + String ownID = AccountSessionManager.getInstance().getAccount(item.accountID).self.id; + if (!item.status.account.id.equals(ownID)) prefilledText.append('@').append(item.status.account.acct).append(' '); + prefilledText.append(item.status.url); + args.putString("prefilledText", prefilledText.toString()); + args.putInt("selectionStart", 0); + }else{ + args.putParcelable("quote", Parcels.wrap(item.status)); + } Nav.go(item.parentFragment.getActivity(), ComposeFragment.class, args); }); diff --git a/mastodon/src/main/res/menu/reply_visibility.xml b/mastodon/src/main/res/menu/reply_visibility.xml new file mode 100644 index 000000000..05c8e7711 --- /dev/null +++ b/mastodon/src/main/res/menu/reply_visibility.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/mastodon/src/main/res/values/strings_sk.xml b/mastodon/src/main/res/values/strings_sk.xml index 95956b3e5..9fbaee7c8 100644 --- a/mastodon/src/main/res/values/strings_sk.xml +++ b/mastodon/src/main/res/values/strings_sk.xml @@ -16,6 +16,11 @@ Image description Unlisted Show replies + Quoting %s + Reply visibility + All replies + Replies to my follows + Replies to me Show boosts Automatically load new posts Show interaction counts From c5e84605169f72138dd56123eb1cde1e911d12d9 Mon Sep 17 00:00:00 2001 From: sk Date: Thu, 16 Mar 2023 01:02:33 +0100 Subject: [PATCH 054/111] change notification action names --- .../android/PushNotificationReceiver.java | 14 +++++++------- .../android/model/NotificationAction.java | 4 ++-- mastodon/src/main/res/values/strings_sk.xml | 5 ----- 3 files changed, 9 insertions(+), 14 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java index a9175a983..776ca9fef 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java +++ b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java @@ -123,8 +123,8 @@ public class PushNotificationReceiver extends BroadcastReceiver{ 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 REBLOG -> new SetStatusReblogged(notification.status.id, true, preferences.postingDefaultVisibility).exec(accountID); + case UNDO_REBLOG -> 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"); } @@ -215,15 +215,15 @@ public class PushNotificationReceiver extends BroadcastReceiver{ 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.sk_notification_action_favorite), NotificationAction.FAVORITE)); - builder.addAction(buildNotificationAction(context, id, accountID, notification, context.getString(R.string.sk_notification_action_bookmark), NotificationAction.BOOKMARK)); + 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.sk_notification_action_boost), NotificationAction.BOOST)); + builder.addAction(buildNotificationAction(context, id, accountID, notification, context.getString(R.string.button_reblog), NotificationAction.REBLOG)); } } case UPDATE -> { if(notification.status.reblogged) - builder.addAction(buildNotificationAction(context, id, accountID, notification, context.getString(R.string.sk_notification_action_unboost), NotificationAction.UNBOOST)); + builder.addAction(buildNotificationAction(context, id, accountID, notification, context.getString(R.string.sk_undo_reblog), NotificationAction.UNDO_REBLOG)); } } } @@ -244,7 +244,7 @@ public class PushNotificationReceiver extends BroadcastReceiver{ } private Notification.Action buildReplyAction(Context context, int notificationId, String accountID, org.joinmastodon.android.model.Notification notification){ - String replyLabel = context.getResources().getString(R.string.sk_notification_action_reply); + String replyLabel = context.getResources().getString(R.string.button_reply); RemoteInput remoteInput = new RemoteInput.Builder(ACTION_KEY_TEXT_REPLY) .setLabel(replyLabel) .build(); diff --git a/mastodon/src/main/java/org/joinmastodon/android/model/NotificationAction.java b/mastodon/src/main/java/org/joinmastodon/android/model/NotificationAction.java index 420bb1d1a..4f43a51a8 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/model/NotificationAction.java +++ b/mastodon/src/main/java/org/joinmastodon/android/model/NotificationAction.java @@ -2,8 +2,8 @@ package org.joinmastodon.android.model; public enum NotificationAction { FAVORITE, - BOOST, - UNBOOST, + REBLOG, + UNDO_REBLOG, BOOKMARK, REPLY, } diff --git a/mastodon/src/main/res/values/strings_sk.xml b/mastodon/src/main/res/values/strings_sk.xml index 9fbaee7c8..c485ebbb5 100644 --- a/mastodon/src/main/res/values/strings_sk.xml +++ b/mastodon/src/main/res/values/strings_sk.xml @@ -267,11 +267,6 @@ Follow from other account Followed from %s Auto-hide Compose button - Favorite - Bookmark - Boost - Unboost - Reply Successfully replied to the post by %s In reply “In reply to” line above avatar From 70e4cb2286e2ce4bc426ac2470d1507335ad1a1a Mon Sep 17 00:00:00 2001 From: sk Date: Thu, 16 Mar 2023 01:18:46 +0100 Subject: [PATCH 055/111] change inline reply notification --- .../android/PushNotificationReceiver.java | 41 ++++++++++++++----- mastodon/src/main/res/values/strings_sk.xml | 2 +- 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java index 776ca9fef..6e0457b58 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java +++ b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java @@ -27,6 +27,7 @@ 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.Status; import org.joinmastodon.android.model.StatusPrivacy; import org.joinmastodon.android.ui.utils.UiUtils; import org.parceler.Parcels; @@ -278,18 +279,36 @@ public class PushNotificationReceiver extends BroadcastReceiver{ req.spoilerText = "re: " + notification.status.spoilerText; } - new CreateStatus(req, UUID.randomUUID().toString()).exec(accountID); + new CreateStatus(req, UUID.randomUUID().toString()).setCallback(new Callback() { + @Override + public void onSuccess(Status status) { + 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); - 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.status = status; + Intent contentIntent=new Intent(context, MainActivity.class); + contentIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + contentIntent.putExtra("fromNotification", true); + contentIntent.putExtra("accountID", accountID); + contentIntent.putExtra("notification", Parcels.wrap(notification)); - Notification repliedNotification = builder.setSmallIcon(R.drawable.ic_ntf_logo) - .setContentText(context.getString(R.string.sk_notification_action_replied, notification.status.account.getDisplayUsername())) - .build(); - notificationManager.notify(accountID, notificationId, repliedNotification); + Notification repliedNotification = builder.setSmallIcon(R.drawable.ic_ntf_logo) + .setContentTitle(context.getString(R.string.sk_notification_action_replied, notification.status.account.displayName)) + .setContentText(status.getStrippedText()) + .setCategory(Notification.CATEGORY_SOCIAL) + .setContentIntent(PendingIntent.getActivity(context, notificationId, contentIntent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT)) + .build(); + notificationManager.notify(accountID, notificationId, repliedNotification); + } + + @Override + public void onError(ErrorResponse errorResponse) { + + } + }).exec(accountID); } } diff --git a/mastodon/src/main/res/values/strings_sk.xml b/mastodon/src/main/res/values/strings_sk.xml index c485ebbb5..dcc03d4ed 100644 --- a/mastodon/src/main/res/values/strings_sk.xml +++ b/mastodon/src/main/res/values/strings_sk.xml @@ -267,7 +267,7 @@ Follow from other account Followed from %s Auto-hide Compose button - Successfully replied to the post by %s + Sent reply to %s In reply “In reply to” line above avatar Show thread From ede47af962cad8c0afc88165b1217909389fbd6c Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Fri, 17 Feb 2023 14:16:25 +0000 Subject: [PATCH 056/111] Translated using Weblate (Spanish) Currently translated at 100.0% (262 of 262 strings) Translation: Megalodon/values Translate-URL: https://translate.codeberg.org/projects/megalodon/values/es/ --- mastodon/src/main/res/values-es-rES/strings_sk.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mastodon/src/main/res/values-es-rES/strings_sk.xml b/mastodon/src/main/res/values-es-rES/strings_sk.xml index 3899d2007..0baec8263 100644 --- a/mastodon/src/main/res/values-es-rES/strings_sk.xml +++ b/mastodon/src/main/res/values-es-rES/strings_sk.xml @@ -259,4 +259,7 @@ Añadir \"re:\" a respuestas a Advertencias de Contenido Modo espectador Ocultar los botones interactivos + Seguir desde otra cuenta + Seguido de %s + Ocultar automáticamente el botón Redactar \ No newline at end of file From 4a2dcdf7014e0b04168704bd76bb76d0a67ab0fa Mon Sep 17 00:00:00 2001 From: Choukajohn Date: Fri, 17 Feb 2023 17:28:37 +0000 Subject: [PATCH 057/111] Translated using Weblate (French) Currently translated at 100.0% (262 of 262 strings) Translation: Megalodon/values Translate-URL: https://translate.codeberg.org/projects/megalodon/values/fr/ --- mastodon/src/main/res/values-fr-rFR/strings_sk.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mastodon/src/main/res/values-fr-rFR/strings_sk.xml b/mastodon/src/main/res/values-fr-rFR/strings_sk.xml index 8b62b273d..7294880a8 100644 --- a/mastodon/src/main/res/values-fr-rFR/strings_sk.xml +++ b/mastodon/src/main/res/values-fr-rFR/strings_sk.xml @@ -260,4 +260,7 @@ Certaines pièces jointes n\'ont pas fini de se télécharger. Mode spectateur Masquer les boutons d\'interaction + Suivre depuis un autre compte + Suivi depuis %s + Masquer automatiquement le bouton Composer \ No newline at end of file From cc7c4fc95ff5ee40052b95bd49c43e7d2a73744f Mon Sep 17 00:00:00 2001 From: Espasant3 Date: Fri, 17 Feb 2023 14:35:22 +0000 Subject: [PATCH 058/111] Translated using Weblate (Galician) Currently translated at 99.6% (261 of 262 strings) Translation: Megalodon/values Translate-URL: https://translate.codeberg.org/projects/megalodon/values/gl/ --- mastodon/src/main/res/values-gl-rES/strings_sk.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mastodon/src/main/res/values-gl-rES/strings_sk.xml b/mastodon/src/main/res/values-gl-rES/strings_sk.xml index 9e6d97e8b..956c5d547 100644 --- a/mastodon/src/main/res/values-gl-rES/strings_sk.xml +++ b/mastodon/src/main/res/values-gl-rES/strings_sk.xml @@ -259,4 +259,7 @@ Arranxar arquivos adxuntos\? Modo espectador Ocultar botóns de interacción + Seguir dende outra conta + Seguida dende %s + Auto-ocultar botón de redacción \ No newline at end of file From 0f87fc7924e32bf639879d5b740ddf767088d0c2 Mon Sep 17 00:00:00 2001 From: Linerly Date: Fri, 17 Feb 2023 15:20:23 +0000 Subject: [PATCH 059/111] Translated using Weblate (Indonesian) Currently translated at 100.0% (262 of 262 strings) Translation: Megalodon/values Translate-URL: https://translate.codeberg.org/projects/megalodon/values/id/ --- mastodon/src/main/res/values-in-rID/strings_sk.xml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/mastodon/src/main/res/values-in-rID/strings_sk.xml b/mastodon/src/main/res/values-in-rID/strings_sk.xml index c46a3ca59..3d99980be 100644 --- a/mastodon/src/main/res/values-in-rID/strings_sk.xml +++ b/mastodon/src/main/res/values-in-rID/strings_sk.xml @@ -252,4 +252,15 @@ Server hanya mendukung pengiriman hanya lokal Versi server: %s Hasil japat + Disaring: %s + Buka + Tutup + Sembunyikan tombol interaksi + Ikuti dari akun lain + Diikuti dari %s + Awali peringatan konten balasan dengan “re:” + Tutup kiriman yang sangat panjang + Perbaiki lampiran\? + Beberapa lampiran belum selesai diunggah. + Sembunyikan tombol Komposer \ No newline at end of file From e52170abea20e5be782c33d219d5fff6ec4e93e5 Mon Sep 17 00:00:00 2001 From: McKris Date: Fri, 17 Feb 2023 13:26:30 +0000 Subject: [PATCH 060/111] Translated using Weblate (Polish) Currently translated at 100.0% (262 of 262 strings) Translation: Megalodon/values Translate-URL: https://translate.codeberg.org/projects/megalodon/values/pl/ --- mastodon/src/main/res/values-pl-rPL/strings_sk.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mastodon/src/main/res/values-pl-rPL/strings_sk.xml b/mastodon/src/main/res/values-pl-rPL/strings_sk.xml index 8d9970d17..074caffb7 100644 --- a/mastodon/src/main/res/values-pl-rPL/strings_sk.xml +++ b/mastodon/src/main/res/values-pl-rPL/strings_sk.xml @@ -258,4 +258,7 @@ Zaczynaj CW odpowiedzi od “re:” Zwijaj bardzo długie posty Ukryj przyciski interakcji + Obserwowane z %s + Obserwuj z innego konta + Automatycznie ukrywaj przycisk tworzenia nowego wpisu \ No newline at end of file From 5bbe11bf4504052253704da7a9eb6a5d227353d5 Mon Sep 17 00:00:00 2001 From: ihor_ck Date: Fri, 17 Feb 2023 19:55:45 +0000 Subject: [PATCH 061/111] Translated using Weblate (Ukrainian) Currently translated at 100.0% (262 of 262 strings) Translation: Megalodon/values Translate-URL: https://translate.codeberg.org/projects/megalodon/values/uk/ --- mastodon/src/main/res/values-uk-rUA/strings_sk.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mastodon/src/main/res/values-uk-rUA/strings_sk.xml b/mastodon/src/main/res/values-uk-rUA/strings_sk.xml index b6eceba40..2669331e5 100644 --- a/mastodon/src/main/res/values-uk-rUA/strings_sk.xml +++ b/mastodon/src/main/res/values-uk-rUA/strings_sk.xml @@ -259,4 +259,7 @@ Деякі вкладення не повністю завантажилися. Режим глядача Сховати кнопки взаємодії + Підписатися з іншого облікового запису + Відстежується з %s + Автоматично ховати кнопку компонування \ No newline at end of file From ecc8daa8f1d4b41d742c85a79951eb9f5858df74 Mon Sep 17 00:00:00 2001 From: Linerly Date: Fri, 17 Feb 2023 15:24:22 +0000 Subject: [PATCH 062/111] Translated using Weblate (Indonesian) Currently translated at 100.0% (16 of 16 strings) Translation: Megalodon/metadata Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/id/ --- metadata/id/changelogs/76.txt | 6 ++++++ metadata/id/changelogs/77.txt | 4 ++++ 2 files changed, 10 insertions(+) create mode 100644 metadata/id/changelogs/76.txt create mode 100644 metadata/id/changelogs/77.txt diff --git a/metadata/id/changelogs/76.txt b/metadata/id/changelogs/76.txt new file mode 100644 index 000000000..50e3b088a --- /dev/null +++ b/metadata/id/changelogs/76.txt @@ -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 diff --git a/metadata/id/changelogs/77.txt b/metadata/id/changelogs/77.txt new file mode 100644 index 000000000..4c899c84c --- /dev/null +++ b/metadata/id/changelogs/77.txt @@ -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 From c9be188d1921e12edc023454d2a734324a611352 Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Fri, 17 Feb 2023 14:15:52 +0000 Subject: [PATCH 063/111] Translated using Weblate (Spanish) Currently translated at 100.0% (16 of 16 strings) Translation: Megalodon/metadata Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/es/ --- metadata/es/changelogs/77.txt | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 metadata/es/changelogs/77.txt diff --git a/metadata/es/changelogs/77.txt b/metadata/es/changelogs/77.txt new file mode 100644 index 000000000..3d800c844 --- /dev/null +++ b/metadata/es/changelogs/77.txt @@ -0,0 +1,4 @@ +- Mantenga presionado el botón de seguimiento para seguir los perfiles de otra cuenta +- Opción para abrir perfiles en otra cuenta +- Ocultar automáticamente el botón de redacción al desplazarse hacia abajo en la línea de tiempo +- Solucione el bloqueo al abrir los perfiles de administrador del servidor From 5d91e8030cb82b2e939f7f5f6f982dd90c5602d6 Mon Sep 17 00:00:00 2001 From: McKris Date: Fri, 17 Feb 2023 13:27:19 +0000 Subject: [PATCH 064/111] Translated using Weblate (Polish) Currently translated at 100.0% (16 of 16 strings) Translation: Megalodon/metadata Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/pl/ --- metadata/pl/changelogs/77.txt | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 metadata/pl/changelogs/77.txt diff --git a/metadata/pl/changelogs/77.txt b/metadata/pl/changelogs/77.txt new file mode 100644 index 000000000..e8df953d0 --- /dev/null +++ b/metadata/pl/changelogs/77.txt @@ -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 From aaa88c45f737f98f51114ef450ff171cffb8cd74 Mon Sep 17 00:00:00 2001 From: ihor_ck Date: Fri, 17 Feb 2023 19:55:12 +0000 Subject: [PATCH 065/111] Translated using Weblate (Ukrainian) Currently translated at 100.0% (16 of 16 strings) Translation: Megalodon/metadata Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/uk/ --- metadata/uk/changelogs/77.txt | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 metadata/uk/changelogs/77.txt diff --git a/metadata/uk/changelogs/77.txt b/metadata/uk/changelogs/77.txt new file mode 100644 index 000000000..0bd5e9792 --- /dev/null +++ b/metadata/uk/changelogs/77.txt @@ -0,0 +1,4 @@ +- Затискання кнопки підписатися, щоб підписатися на профілі з іншого облікового запису +- Можливість відкривати профілі в іншому обліковому записі +- Автоприховування кнопки компонування під час гортання стрічки вниз +- Виправлено збій під час відкриття профілів адміністратора сервера From fc5eeae9e7de92326d8c5dc6a7248a2fa31b021c Mon Sep 17 00:00:00 2001 From: Espasant3 Date: Fri, 17 Feb 2023 14:42:48 +0000 Subject: [PATCH 066/111] Translated using Weblate (Galician) Currently translated at 93.7% (15 of 16 strings) Translation: Megalodon/metadata Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/gl/ --- metadata/gl-ES/changelogs/77.txt | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 metadata/gl-ES/changelogs/77.txt diff --git a/metadata/gl-ES/changelogs/77.txt b/metadata/gl-ES/changelogs/77.txt new file mode 100644 index 000000000..e93ac15b7 --- /dev/null +++ b/metadata/gl-ES/changelogs/77.txt @@ -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 +- Arranxados From 4591731cdc4901838adb23af06c70d9894e225e7 Mon Sep 17 00:00:00 2001 From: a_mento Date: Sat, 18 Feb 2023 22:49:41 +0000 Subject: [PATCH 067/111] Translated using Weblate (Basque) Currently translated at 100.0% (262 of 262 strings) Translation: Megalodon/values Translate-URL: https://translate.codeberg.org/projects/megalodon/values/eu/ --- .../src/main/res/values-eu-rES/strings_sk.xml | 35 +++++++++++++++++-- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/mastodon/src/main/res/values-eu-rES/strings_sk.xml b/mastodon/src/main/res/values-eu-rES/strings_sk.xml index a674d7458..7cf917166 100644 --- a/mastodon/src/main/res/values-eu-rES/strings_sk.xml +++ b/mastodon/src/main/res/values-eu-rES/strings_sk.xml @@ -72,7 +72,7 @@ %s-k itzulpena onartzen du! %s ez da itzulpena onartzen duten instantzien artean ageri. Ezabatu jakinarazpen guztiak - Ezabatu dena + Ezabatu denak Ziur al zaude jakinarazpen guztiak ezabatu nahi dituzula\? Fedibertsoan bilatzen Bultzada desegin @@ -146,7 +146,7 @@ Aldaketen zerrenda Eranskin batek gutxienez ez du deskribapenik. Argitaratu hala ere - Desgaitu testu alternatiboaren jakinarazpena + Desgaitu gogorarazlea testu alternatiboa gehitzeko Denbora-lerroak Bidalketak Gehitu @@ -218,7 +218,7 @@ Denbora-lerroak editatu ALT Editatua - Bidalketa editatua + Editatutako argitalpenak Bultzatutako bidalketa editatu Emaitzarik ez Zirriborroa gorde\? @@ -232,4 +232,33 @@ Testu alternatiboa falta da Bilatzen… Zirriborro honetako aldaketak gorde edo argitaratu nahi dituzu\? + Gehitu \"re:\" hasieran edukiaren abisuen erantzunetan + Iragazita: %s + Zabaldu + Itxi + Itxi argitalpen oso luzeak + Finkatu eranskinak\? + Eranskin batzuk ez dira igo oraindik. + Pertsona batzuen argitalpenen jakinarazpenak gaitzen badituzu, beraien argitalpen berriak hemen ageriko dira. + Gaitu beta bertsioak + aipamenak soilik + · + Instantziaren ezaugarriak + Zure jatorriko instantziak bertan soilik argitaratzea baimendu behar du hau ibili dadin. Aldatutako Mastodon bertsio askok darabilte, baina Mastodonek ez. + bertan soilik + Zerbitzariak bertan soilik argitaratzea baimentzen du + Glitch bertan soilik modua + Gaitu hau zure jatorrizko instantziak Glitch badarabil. Ez da beharrezkoa Hometown edo Akkomarako. + izena emanda + salatuta + Erabiltzaileen izen-ematea + Salaketa berriak + Bertako instantzia soilik + \"Ikusi argitalpen berriak\" botoia + Zerbitzariaren bertsioa: %s + Bozketaren emaitzak + Ezkutatu interakzio-botoiak + Jarraitu beste kontu batetik + %s-(d/t)ik jarraitua + Automatikoki ezkutatu Idatzi botoia \ No newline at end of file From 676b195aee8779b96c58ca729d46962da3bb98a6 Mon Sep 17 00:00:00 2001 From: gicorada Date: Tue, 21 Feb 2023 14:27:27 +0000 Subject: [PATCH 068/111] Translated using Weblate (Italian) Currently translated at 100.0% (262 of 262 strings) Translation: Megalodon/values Translate-URL: https://translate.codeberg.org/projects/megalodon/values/it/ --- .../src/main/res/values-it-rIT/strings_sk.xml | 81 +++++++++++-------- 1 file changed, 46 insertions(+), 35 deletions(-) diff --git a/mastodon/src/main/res/values-it-rIT/strings_sk.xml b/mastodon/src/main/res/values-it-rIT/strings_sk.xml index 7314c4aeb..ad00a1c79 100644 --- a/mastodon/src/main/res/values-it-rIT/strings_sk.xml +++ b/mastodon/src/main/res/values-it-rIT/strings_sk.xml @@ -53,58 +53,58 @@ Lingua: %s %s (%s) Sei sicuro di voler cancellare le lingue usate di recente\? - Cancella lingue usate di recente + Cancella le lingue usate di recente Benvenuto! example.social Consenti scelte multiple Lingue disponibili - Lo squalo ti saluta! Per iniziare inserisci il dominio dell\'istanza a cui sei iscritto. + Lo squalo ti saluta! Per iniziare inserisci qui sotto l\'indirizzo dell\'istanza a cui sei iscritto. Sistema Locale Federata - Salva con un altro account + Aggiungi ai segnalibri con un altro account Salvato come %s - Inserisci tra i preferiti con un altro account + Aggiungi ai preferiti con un altro account Inserito tra i preferiti come %s - Già tra i preferiti + Già aggiunto ai preferiti Condividi con un altro account - Condivisione già eseguita - Imposta il profilo - Preferenze dei post - Configura filtri + Già condiviso + Impostazioni del profilo + Preferenze di pubblicazione + Configura i filtri Regole - Riguardo all\'app + Informazioni sull\'app Dona - Elimina notifica - Abilita l\'eliminazione delle notifiche + Elimina la notifica + Abilita la cancellazione delle notifiche Testo del pulsante Pubblica Personalizza il testo del pulsante Pubblica %s supporta la traduzione! - Sembra che %s non supporti la traduzione. - Elimina tutte le notifiche - Elimina tutto - Sei sicuro di volere eliminare tutte le notifiche\? + %s non sembra supportare la traduzione. + Cancella tutte le notifiche + Cancella tutto + Sei sicuro di voler eliminare tutte le notifiche\? Cercando nel Fediverso Crea un post riguardo a questo Annulla la condivisione - Condividi con visibilità - Copia il link del post + Reblog con visibilità + Copia il link al post Apri con un altro account - La risorsa non può essere trovata + Non è stato possibile trovare la risorsa Bozza Programma Elimina bozza - Bozza o programma + Salva nelle bozze o programma Programmato per Bozza salvata Inoltra a %s Elimina post programmato - Sei sicuro di volere eliminare questo post programmato\? + Sei sicuro di voler eliminare questo post programmato\? Il post verrà salvato come bozza. Post programmato L\'orario programmato è troppo presto Segna come bozza - Programma post + Programma il post Non programmare Non tenere in bozza Annunci @@ -123,25 +123,25 @@ Rispondi con un altro account Icona uniforme per tutte le notifiche Rosso - Disabilita lo scorrimento tra schede - Impostazioni della sicurezza - Elimina notifica - Sei sicuro di volere eliminare questa notifica\? - Traduci solamente i post aperti - Cercando in %s - Hashtags che segui - Già salvato + Disabilita lo scorrimento tra le schede + Impostazioni di sicurezza + Elimina la notifica + Sei sicuro di voler eliminare questa notifica\? + Traduci solo i post aperti + Cercando su %s + Hashtag che segui + Già aggiunto ai segnalibri Condivisione eseguita come %s - Post annullati - Salva bozza\? - Salva le modifiche\? + Post non pubblicati + Salvare la bozza\? + Salvare le modifiche\? Programma o bozza Riduci il movimento delle animazioni Riguardo all\'istanza Sei sicuro di volere eliminare la lista \"%s\"\? Home - Sei sicuro di volere eliminare questo post in bozza\? - I post devono essere programmati almeno tra 10 minuti. + Sei sicuro di voler cancellare questa bozza\? + Il post deve essere programmato almeno 10 minuti prima. Scrivi per iniziare a cercare Rimuovi come follower Rimuovi %s come follower bloccandolo e sboccandolo immediatamente\? @@ -250,4 +250,15 @@ Pulsante \"Mostra nuovi post\" Versione server:%s Risultati del sondaggio + Aggiungi \"re:\" prima dei CW + Filtrato: %s + Espandi + Chiudi + Comprimi post molto lunghi + Correggi gli allegati\? + Alcuni allegati non hanno finito l\'upload. + Nascondi i pulsanti di interazione + Segui con un altro account + Seguito con %s + Nascondi automaticamente il pulsante Pubblica \ No newline at end of file From 94b92bd7c131dac80bb3533e5e548472f3f7cc89 Mon Sep 17 00:00:00 2001 From: gicorada Date: Tue, 21 Feb 2023 14:52:45 +0000 Subject: [PATCH 069/111] Translated using Weblate (Italian) Currently translated at 100.0% (16 of 16 strings) Translation: Megalodon/metadata Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/it/ --- metadata/it-IT/changelogs/67.txt | 10 ++++++++++ metadata/it-IT/changelogs/74.txt | 9 +++++++++ metadata/it-IT/changelogs/76.txt | 6 ++++++ metadata/it-IT/changelogs/77.txt | 4 ++++ metadata/it-IT/full_description.txt | 2 +- 5 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 metadata/it-IT/changelogs/67.txt create mode 100644 metadata/it-IT/changelogs/74.txt create mode 100644 metadata/it-IT/changelogs/76.txt create mode 100644 metadata/it-IT/changelogs/77.txt diff --git a/metadata/it-IT/changelogs/67.txt b/metadata/it-IT/changelogs/67.txt new file mode 100644 index 000000000..251bfd285 --- /dev/null +++ b/metadata/it-IT/changelogs/67.txt @@ -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 diff --git a/metadata/it-IT/changelogs/74.txt b/metadata/it-IT/changelogs/74.txt new file mode 100644 index 000000000..e7457d965 --- /dev/null +++ b/metadata/it-IT/changelogs/74.txt @@ -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" diff --git a/metadata/it-IT/changelogs/76.txt b/metadata/it-IT/changelogs/76.txt new file mode 100644 index 000000000..3931bd368 --- /dev/null +++ b/metadata/it-IT/changelogs/76.txt @@ -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 diff --git a/metadata/it-IT/changelogs/77.txt b/metadata/it-IT/changelogs/77.txt new file mode 100644 index 000000000..44c85d6d4 --- /dev/null +++ b/metadata/it-IT/changelogs/77.txt @@ -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 diff --git a/metadata/it-IT/full_description.txt b/metadata/it-IT/full_description.txt index f65c72ee5..8f2c9836b 100644 --- a/metadata/it-IT/full_description.txt +++ b/metadata/it-IT/full_description.txt @@ -4,8 +4,8 @@ Megalodon è una versione modificata dell' Segui gli hashtags: Vedi i nuovi post da hashtags specifici direttamente nella timeline Home seguendoli. - Richieste di seguirti: Accetta o rifiuta le richieste di seguirti dalle notifiche o dalla lista delle richieste. From 6c881eccd24dee81ffb5aba2d726354f99f4d6dc Mon Sep 17 00:00:00 2001 From: Espasant3 Date: Mon, 20 Feb 2023 18:46:06 +0000 Subject: [PATCH 070/111] Translated using Weblate (Galician) Currently translated at 100.0% (16 of 16 strings) Translation: Megalodon/metadata Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/gl/ --- metadata/gl-ES/changelogs/77.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/metadata/gl-ES/changelogs/77.txt b/metadata/gl-ES/changelogs/77.txt index e93ac15b7..36504a9cf 100644 --- a/metadata/gl-ES/changelogs/77.txt +++ b/metadata/gl-ES/changelogs/77.txt @@ -1,4 +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 -- Arranxados +- Arranxado o bloqueo ao abrir os perfís dos administradores do servidor From b0b497ed46d54110c59873a8012da434d4360875 Mon Sep 17 00:00:00 2001 From: AiOO Date: Sat, 4 Mar 2023 14:40:48 +0000 Subject: [PATCH 071/111] Translated using Weblate (Korean) Currently translated at 100.0% (262 of 262 strings) Translation: Megalodon/values Translate-URL: https://translate.codeberg.org/projects/megalodon/values/ko/ --- mastodon/src/main/res/values-ko-rKR/strings_sk.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mastodon/src/main/res/values-ko-rKR/strings_sk.xml b/mastodon/src/main/res/values-ko-rKR/strings_sk.xml index 462c00979..b4f54d38b 100644 --- a/mastodon/src/main/res/values-ko-rKR/strings_sk.xml +++ b/mastodon/src/main/res/values-ko-rKR/strings_sk.xml @@ -259,4 +259,7 @@ 아주 긴 게시물 접기 관객 모드 상호작용 버튼 가리기 + 다른 계정으로 팔로우 + %s 계정으로 팔로우함 + 게시 버튼 자동으로 가리기 \ No newline at end of file From 722ad8c53ebd4dde870715dd3187b0a70d6c3f98 Mon Sep 17 00:00:00 2001 From: AiOO Date: Sat, 4 Mar 2023 14:43:47 +0000 Subject: [PATCH 072/111] Translated using Weblate (Korean) Currently translated at 100.0% (16 of 16 strings) Translation: Megalodon/metadata Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/ko/ --- metadata/ko/changelogs/77.txt | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 metadata/ko/changelogs/77.txt diff --git a/metadata/ko/changelogs/77.txt b/metadata/ko/changelogs/77.txt new file mode 100644 index 000000000..ec88829eb --- /dev/null +++ b/metadata/ko/changelogs/77.txt @@ -0,0 +1,4 @@ +- 팔로우 버튼을 길게 눌러 다른 계정으로 프로필 팔로우 +- 다른 계정으로 프로필을 열 수 있는 옵션 +- 타임라인을 아래로 스크롤할 때 게시 버튼 자동으로 가리기 +- 서버 관리자 프로필로 앱을 열 때 발생하는 오류 수정 From 6ba8555adf6954b683a38d643d703a5889a40081 Mon Sep 17 00:00:00 2001 From: Andrewblasco Date: Tue, 7 Mar 2023 18:27:38 +0000 Subject: [PATCH 073/111] Translated using Weblate (Spanish) Currently translated at 100.0% (262 of 262 strings) Translation: Megalodon/values Translate-URL: https://translate.codeberg.org/projects/megalodon/values/es/ --- mastodon/src/main/res/values-es-rES/strings_sk.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mastodon/src/main/res/values-es-rES/strings_sk.xml b/mastodon/src/main/res/values-es-rES/strings_sk.xml index 0baec8263..2828258fe 100644 --- a/mastodon/src/main/res/values-es-rES/strings_sk.xml +++ b/mastodon/src/main/res/values-es-rES/strings_sk.xml @@ -252,14 +252,14 @@ Resultado de encuestas Filtrado: %s Ampliar - Reducir - Acortar publicaciones largas + Minimizar + Minimizar publicaciones largas ¿Corregir adjuntos\? Algunos adjuntos no han terminado de subirse. Añadir \"re:\" a respuestas a Advertencias de Contenido Modo espectador - Ocultar los botones interactivos + Ocultar los botones de interacción Seguir desde otra cuenta - Seguido de %s + Seguido desde %s Ocultar automáticamente el botón Redactar \ No newline at end of file From 43717634f697130b336f01a993e4a79aae8a292f Mon Sep 17 00:00:00 2001 From: Oliebol Date: Tue, 7 Mar 2023 08:50:27 +0000 Subject: [PATCH 074/111] Translated using Weblate (Dutch) Currently translated at 95.8% (251 of 262 strings) Translation: Megalodon/values Translate-URL: https://translate.codeberg.org/projects/megalodon/values/nl/ --- mastodon/src/main/res/values-nl-rNL/strings_sk.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mastodon/src/main/res/values-nl-rNL/strings_sk.xml b/mastodon/src/main/res/values-nl-rNL/strings_sk.xml index b6a8d7735..43cc6a141 100644 --- a/mastodon/src/main/res/values-nl-rNL/strings_sk.xml +++ b/mastodon/src/main/res/values-nl-rNL/strings_sk.xml @@ -248,4 +248,7 @@ Lange berichten inklappen Enkele bijlagen zijn nog niet klaar met uploaden. Niet opslaan als concept + Verberg interactie knoppen + Volgen met ander account + Gevolgd met %s \ No newline at end of file From 473d3a5196962bd4b46c86b690c71969872d1fd0 Mon Sep 17 00:00:00 2001 From: ling0412 Date: Wed, 8 Mar 2023 14:02:14 +0000 Subject: [PATCH 075/111] Translated using Weblate (Chinese (Simplified)) Currently translated at 87.5% (14 of 16 strings) Translation: Megalodon/metadata Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/zh_Hans/ --- metadata/zh-Hans/short_description.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/metadata/zh-Hans/short_description.txt b/metadata/zh-Hans/short_description.txt index 54543e817..f8d3f5aa3 100644 --- a/metadata/zh-Hans/short_description.txt +++ b/metadata/zh-Hans/short_description.txt @@ -1 +1 @@ -Mastodon for Android 但粉色并且更多功能 +安卓平台的粉色 Mastodon 客户端,拥有更多功能 From 79d48a12a95bdb8ea4aafa0e3c7d5030e64c64bc Mon Sep 17 00:00:00 2001 From: sk22 Date: Tue, 14 Mar 2023 14:40:46 +0000 Subject: [PATCH 076/111] Translated using Weblate (German) Currently translated at 100.0% (263 of 263 strings) Translation: Megalodon/values Translate-URL: https://translate.codeberg.org/projects/megalodon/values/de/ --- mastodon/src/main/res/values-de-rDE/strings_sk.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/mastodon/src/main/res/values-de-rDE/strings_sk.xml b/mastodon/src/main/res/values-de-rDE/strings_sk.xml index 83992076a..b9377c24a 100644 --- a/mastodon/src/main/res/values-de-rDE/strings_sk.xml +++ b/mastodon/src/main/res/values-de-rDE/strings_sk.xml @@ -261,4 +261,5 @@ Mit %s gefolgt Verfassen-Button automatisch ausblenden Mit anderem Account folgen + Als Antwort \ No newline at end of file From 9ceea8de99d2bae0ad8d11ecd9cb4a00fbd27d62 Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Wed, 15 Mar 2023 13:25:32 +0000 Subject: [PATCH 077/111] Translated using Weblate (Spanish) Currently translated at 100.0% (263 of 263 strings) Translation: Megalodon/values Translate-URL: https://translate.codeberg.org/projects/megalodon/values/es/ --- mastodon/src/main/res/values-es-rES/strings_sk.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/mastodon/src/main/res/values-es-rES/strings_sk.xml b/mastodon/src/main/res/values-es-rES/strings_sk.xml index 2828258fe..70820673e 100644 --- a/mastodon/src/main/res/values-es-rES/strings_sk.xml +++ b/mastodon/src/main/res/values-es-rES/strings_sk.xml @@ -262,4 +262,5 @@ Seguir desde otra cuenta Seguido desde %s Ocultar automáticamente el botón Redactar + Respondiendo a \ No newline at end of file From 7df72e6bc68a62d77856c7ef0914d9908c4a95c1 Mon Sep 17 00:00:00 2001 From: Choukajohn Date: Tue, 14 Mar 2023 15:42:19 +0000 Subject: [PATCH 078/111] Translated using Weblate (French) Currently translated at 100.0% (263 of 263 strings) Translation: Megalodon/values Translate-URL: https://translate.codeberg.org/projects/megalodon/values/fr/ --- mastodon/src/main/res/values-fr-rFR/strings_sk.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/mastodon/src/main/res/values-fr-rFR/strings_sk.xml b/mastodon/src/main/res/values-fr-rFR/strings_sk.xml index 7294880a8..c6407c5ce 100644 --- a/mastodon/src/main/res/values-fr-rFR/strings_sk.xml +++ b/mastodon/src/main/res/values-fr-rFR/strings_sk.xml @@ -263,4 +263,5 @@ Suivre depuis un autre compte Suivi depuis %s Masquer automatiquement le bouton Composer + En réponse \ No newline at end of file From 21ee5fc2bfe3a5642eb3535657702dc44685755b Mon Sep 17 00:00:00 2001 From: Espasant3 Date: Wed, 15 Mar 2023 18:43:46 +0000 Subject: [PATCH 079/111] Translated using Weblate (Galician) Currently translated at 100.0% (263 of 263 strings) Translation: Megalodon/values Translate-URL: https://translate.codeberg.org/projects/megalodon/values/gl/ --- mastodon/src/main/res/values-gl-rES/strings_sk.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/mastodon/src/main/res/values-gl-rES/strings_sk.xml b/mastodon/src/main/res/values-gl-rES/strings_sk.xml index 956c5d547..a47a990db 100644 --- a/mastodon/src/main/res/values-gl-rES/strings_sk.xml +++ b/mastodon/src/main/res/values-gl-rES/strings_sk.xml @@ -262,4 +262,5 @@ Seguir dende outra conta Seguida dende %s Auto-ocultar botón de redacción + Respondendo \ No newline at end of file From a4a206eae6dd0ec0a08778b5b7bc1b6135f53a6b Mon Sep 17 00:00:00 2001 From: Linerly Date: Tue, 14 Mar 2023 15:27:09 +0000 Subject: [PATCH 080/111] Translated using Weblate (Indonesian) Currently translated at 100.0% (263 of 263 strings) Translation: Megalodon/values Translate-URL: https://translate.codeberg.org/projects/megalodon/values/id/ --- mastodon/src/main/res/values-in-rID/strings_sk.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/mastodon/src/main/res/values-in-rID/strings_sk.xml b/mastodon/src/main/res/values-in-rID/strings_sk.xml index 3d99980be..659186834 100644 --- a/mastodon/src/main/res/values-in-rID/strings_sk.xml +++ b/mastodon/src/main/res/values-in-rID/strings_sk.xml @@ -263,4 +263,5 @@ Perbaiki lampiran\? Beberapa lampiran belum selesai diunggah. Sembunyikan tombol Komposer + Dalam balasan \ No newline at end of file From 9a1e33a776a31f90f36345c8eb8c3db1c138cbc5 Mon Sep 17 00:00:00 2001 From: McKris Date: Tue, 14 Mar 2023 15:12:49 +0000 Subject: [PATCH 081/111] Translated using Weblate (Polish) Currently translated at 100.0% (263 of 263 strings) Translation: Megalodon/values Translate-URL: https://translate.codeberg.org/projects/megalodon/values/pl/ --- mastodon/src/main/res/values-pl-rPL/strings_sk.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/mastodon/src/main/res/values-pl-rPL/strings_sk.xml b/mastodon/src/main/res/values-pl-rPL/strings_sk.xml index 074caffb7..db42ae10c 100644 --- a/mastodon/src/main/res/values-pl-rPL/strings_sk.xml +++ b/mastodon/src/main/res/values-pl-rPL/strings_sk.xml @@ -261,4 +261,5 @@ Obserwowane z %s Obserwuj z innego konta Automatycznie ukrywaj przycisk tworzenia nowego wpisu + W odpowiedzi \ No newline at end of file From 093a27970dccf10d6e1417c0c47e740047c9621d Mon Sep 17 00:00:00 2001 From: ihor_ck Date: Tue, 14 Mar 2023 18:24:54 +0000 Subject: [PATCH 082/111] Translated using Weblate (Ukrainian) Currently translated at 100.0% (263 of 263 strings) Translation: Megalodon/values Translate-URL: https://translate.codeberg.org/projects/megalodon/values/uk/ --- mastodon/src/main/res/values-uk-rUA/strings_sk.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/mastodon/src/main/res/values-uk-rUA/strings_sk.xml b/mastodon/src/main/res/values-uk-rUA/strings_sk.xml index 2669331e5..169314f46 100644 --- a/mastodon/src/main/res/values-uk-rUA/strings_sk.xml +++ b/mastodon/src/main/res/values-uk-rUA/strings_sk.xml @@ -262,4 +262,5 @@ Підписатися з іншого облікового запису Відстежується з %s Автоматично ховати кнопку компонування + У відповідь \ No newline at end of file From def79e591bb370efde6da49e5a4da168b9b04a60 Mon Sep 17 00:00:00 2001 From: sk22 Date: Wed, 15 Mar 2023 23:54:19 +0000 Subject: [PATCH 083/111] Translated using Weblate (German) Currently translated at 96.7% (268 of 277 strings) Translation: Megalodon/values Translate-URL: https://translate.codeberg.org/projects/megalodon/values/de/ --- mastodon/src/main/res/values-de-rDE/strings_sk.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mastodon/src/main/res/values-de-rDE/strings_sk.xml b/mastodon/src/main/res/values-de-rDE/strings_sk.xml index b9377c24a..f95f02bf4 100644 --- a/mastodon/src/main/res/values-de-rDE/strings_sk.xml +++ b/mastodon/src/main/res/values-de-rDE/strings_sk.xml @@ -262,4 +262,9 @@ Verfassen-Button automatisch ausblenden Mit anderem Account folgen Als Antwort + Antwort-Sichtbarkeit + Alle Antworten + Antworten auf Follows + Antworten an mich + Zitiere %s \ No newline at end of file From fdca799a5f3eecefc9717d6050c8eb718b27235c Mon Sep 17 00:00:00 2001 From: sk Date: Thu, 16 Mar 2023 18:49:40 +0100 Subject: [PATCH 084/111] add todo --- .../android/ui/displayitems/TextStatusDisplayItem.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/TextStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/TextStatusDisplayItem.java index 83a8b7ef1..2cc7913fc 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/TextStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/TextStatusDisplayItem.java @@ -166,12 +166,12 @@ public class TextStatusDisplayItem extends StatusDisplayItem{ boolean translateEnabled = !item.disableTranslate && instanceInfo != null && instanceInfo.v2 != null && instanceInfo.v2.configuration.translation != null && instanceInfo.v2.configuration.translation.enabled; - boolean isBottomText = BOTTOM_TEXT_PATTERN.matcher(item.status.getStrippedText()).find(); boolean translateVisible = (isBottomText || ( translateEnabled && !item.status.visibility.isLessVisibleThan(StatusPrivacy.UNLISTED) && item.status.language != null && + // todo: compare to user's locale instead (how do i query that?!) (item.session.preferences == null || !item.status.language.equalsIgnoreCase(item.session.preferences.postingDefaultLanguage)))) && (!GlobalUserPreferences.translateButtonOpenedOnly || item.textSelectable); translateWrap.setVisibility(translateVisible ? View.VISIBLE : View.GONE); From 8dfc1ecae8d0c99ef7bb16c38d6a35c794b20351 Mon Sep 17 00:00:00 2001 From: sk Date: Thu, 16 Mar 2023 19:14:28 +0100 Subject: [PATCH 085/111] reply part before reblog part --- .../displayitems/ReblogOrReplyLineStatusDisplayItem.java | 3 +++ .../main/res/layout/display_item_reblog_or_reply_line.xml | 8 ++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java index 6f9766c3d..d64f49a64 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java @@ -96,6 +96,9 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{ int orientation = ((LinearLayout) itemView).getOrientation(); extraText.setPaddingRelative(extraText.getPaddingStart(), item.extra != null && orientation == LinearLayout.VERTICAL ? 0 : V.dp(16), extraText.getPaddingEnd(), extraText.getPaddingBottom()); separator.setVisibility(item.extra != null && orientation == LinearLayout.HORIZONTAL ? View.VISIBLE : View.GONE); + ((LinearLayout) itemView).removeView(extraText); + if (orientation == LinearLayout.VERTICAL) ((LinearLayout) itemView).addView(extraText); + else ((LinearLayout) itemView).addView(extraText, 0); return true; }); } diff --git a/mastodon/src/main/res/layout/display_item_reblog_or_reply_line.xml b/mastodon/src/main/res/layout/display_item_reblog_or_reply_line.xml index 2138522c0..b15c5ae8d 100644 --- a/mastodon/src/main/res/layout/display_item_reblog_or_reply_line.xml +++ b/mastodon/src/main/res/layout/display_item_reblog_or_reply_line.xml @@ -8,13 +8,13 @@ android:layout_marginBottom="-12dp"> Date: Thu, 16 Mar 2023 19:22:58 +0100 Subject: [PATCH 086/111] improve pre draw listener --- .../ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java index d64f49a64..22ca15e57 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java @@ -84,6 +84,7 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{ public static class Holder extends StatusDisplayItem.Holder implements ImageLoaderViewHolder{ private final TextView text, extraText; private final View separator; + private int currentOrientation = -1; public Holder(Activity activity, ViewGroup parent){ super(activity, R.layout.display_item_reblog_or_reply_line, parent); @@ -94,6 +95,8 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{ itemView.getViewTreeObserver().addOnPreDrawListener(() -> { if (item == null) return true; int orientation = ((LinearLayout) itemView).getOrientation(); + if (orientation == currentOrientation) return true; // only run once + currentOrientation = orientation; extraText.setPaddingRelative(extraText.getPaddingStart(), item.extra != null && orientation == LinearLayout.VERTICAL ? 0 : V.dp(16), extraText.getPaddingEnd(), extraText.getPaddingBottom()); separator.setVisibility(item.extra != null && orientation == LinearLayout.HORIZONTAL ? View.VISIBLE : View.GONE); ((LinearLayout) itemView).removeView(extraText); From d5b6c02b227845447b0492320eeed49d11788a80 Mon Sep 17 00:00:00 2001 From: sk Date: Thu, 16 Mar 2023 19:55:56 +0100 Subject: [PATCH 087/111] content descriptions for compact reblog/reply line --- .../ReblogOrReplyLineStatusDisplayItem.java | 9 ++++++++- .../android/ui/displayitems/StatusDisplayItem.java | 13 +++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java index 22ca15e57..937b08bd7 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java @@ -32,7 +32,7 @@ import me.grishka.appkit.imageloader.requests.ImageLoaderRequest; import me.grishka.appkit.utils.V; public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{ - private CharSequence text; + private CharSequence text, compactText; @DrawableRes private int icon; private StatusPrivacy visibility; @@ -42,8 +42,13 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{ private View.OnClickListener handleClick; boolean belowHeader, needBottomPadding; ReblogOrReplyLineStatusDisplayItem extra; + String contentDescription; public ReblogOrReplyLineStatusDisplayItem(String parentID, BaseStatusListFragment parentFragment, CharSequence text, List emojis, @DrawableRes int icon, StatusPrivacy visibility, @Nullable View.OnClickListener handleClick) { + this(parentID, parentFragment, text, emojis, icon, visibility, handleClick, null); + } + + public ReblogOrReplyLineStatusDisplayItem(String parentID, BaseStatusListFragment parentFragment, CharSequence text, List emojis, @DrawableRes int icon, StatusPrivacy visibility, @Nullable View.OnClickListener handleClick, String contentDescription) { super(parentID, parentFragment); SpannableStringBuilder ssb=new SpannableStringBuilder(text); HtmlParser.parseCustomEmoji(ssb, emojis); @@ -54,6 +59,7 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{ TypedValue outValue = new TypedValue(); context.getTheme().resolveAttribute(android.R.attr.selectableItemBackground, outValue, true); updateVisibility(visibility); + this.contentDescription = contentDescription; } public void updateVisibility(StatusPrivacy visibility) { @@ -108,6 +114,7 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{ } private void bindLine(ReblogOrReplyLineStatusDisplayItem item, TextView text) { + if (item.contentDescription != null) text.setContentDescription(item.contentDescription); text.setText(item.text); text.setCompoundDrawablesRelativeWithIntrinsicBounds(item.icon, 0, item.iconEnd, 0); text.setOnClickListener(item.handleClick); diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java index e57cb0218..fcffebbe1 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/StatusDisplayItem.java @@ -120,22 +120,23 @@ public abstract class StatusDisplayItem{ : account == null ? fragment.getString(R.string.sk_in_reply) : GlobalUserPreferences.compactReblogReplyLine && status.reblog != null ? account.displayName : fragment.getString(R.string.in_reply_to, account.displayName); + String fullText = threadReply ? fragment.getString(R.string.sk_show_thread) + : account == null ? fragment.getString(R.string.sk_in_reply) + : fragment.getString(R.string.in_reply_to, account.displayName); replyLine = new ReblogOrReplyLineStatusDisplayItem( parentID, fragment, text, account == null ? List.of() : account.emojis, - R.drawable.ic_fluent_arrow_reply_20_filled, null, null + R.drawable.ic_fluent_arrow_reply_20_filled, null, null, fullText ); } if(status.reblog!=null){ boolean isOwnPost = AccountSessionManager.getInstance().isSelf(fragment.getAccountID(), status.account); - String text = GlobalUserPreferences.compactReblogReplyLine && replyLine != null - ? status.account.displayName - : fragment.getString(R.string.user_boosted, status.account.displayName); - + String fullText = fragment.getString(R.string.user_boosted, status.account.displayName); + String text = GlobalUserPreferences.compactReblogReplyLine && replyLine != null ? status.account.displayName : fullText; items.add(new ReblogOrReplyLineStatusDisplayItem(parentID, fragment, text, status.account.emojis, R.drawable.ic_fluent_arrow_repeat_all_20_filled, isOwnPost ? status.visibility : null, i->{ args.putParcelable("profileAccount", Parcels.wrap(status.account)); Nav.go(fragment.getActivity(), ProfileFragment.class, args); - })); + }, fullText)); } else if (!(status.tags.isEmpty() || fragment instanceof HashtagTimelineFragment || fragment instanceof ListTimelineFragment From 6fef51fcbb4c2b88f39cffeb0d601e3c4311da89 Mon Sep 17 00:00:00 2001 From: sk Date: Fri, 17 Mar 2023 00:51:22 +0100 Subject: [PATCH 088/111] measure text manually hopefully fix sk22#422 --- .../fragments/BaseStatusListFragment.java | 1 - .../displayitems/TextStatusDisplayItem.java | 25 +++++++++---------- mastodon/src/main/res/values/dimens.xml | 2 +- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java index 1ff5a2d2e..10cbfee43 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java @@ -503,7 +503,6 @@ public abstract class BaseStatusListFragment exten holder.getItem().status.textExpandable = expandable; HeaderStatusDisplayItem.Holder header = findHolderOfType(holder.getItemID(), HeaderStatusDisplayItem.Holder.class); if (header != null) header.rebind(); - holder.rebind(); } } diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/TextStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/TextStatusDisplayItem.java index 2cc7913fc..c325336bf 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/TextStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/TextStatusDisplayItem.java @@ -98,9 +98,11 @@ public class TextStatusDisplayItem extends StatusDisplayItem{ private final float textMaxHeight, textCollapsedHeight; private final LinearLayout.LayoutParams collapseParams, wrapParams; + private final ViewGroup parent; public Holder(Activity activity, ViewGroup parent){ super(activity, R.layout.display_item_text, parent); + this.parent=parent; text=findViewById(R.id.text); spoilerTitle=findViewById(R.id.spoiler_title); spoilerTitleInline=findViewById(R.id.spoiler_title_inline); @@ -228,19 +230,16 @@ public class TextStatusDisplayItem extends StatusDisplayItem{ readMore.setVisibility(View.GONE); } - if (GlobalUserPreferences.collapseLongPosts) { - text.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { - @Override - public boolean onPreDraw() { - text.getViewTreeObserver().removeOnPreDrawListener(this); - boolean tooBig = text.getMeasuredHeight() > textMaxHeight; - boolean inTimeline = !item.textSelectable; - boolean hasSpoiler = !TextUtils.isEmpty(item.status.spoilerText); - boolean expandable = inTimeline && tooBig && !hasSpoiler; - item.parentFragment.onEnableExpandable(Holder.this, expandable); - return true; - } - }); + text.measure( + View.MeasureSpec.makeMeasureSpec(parent.getWidth(), View.MeasureSpec.EXACTLY), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); + + if (GlobalUserPreferences.collapseLongPosts && !item.status.textExpandable) { + boolean tooBig = text.getMeasuredHeight() > textMaxHeight; + boolean inTimeline = !item.textSelectable; + boolean hasSpoiler = !TextUtils.isEmpty(item.status.spoilerText); + boolean expandable = inTimeline && tooBig && !hasSpoiler; + item.parentFragment.onEnableExpandable(Holder.this, expandable); } readMore.setVisibility(item.status.textExpandable && !item.status.textExpanded ? View.VISIBLE : View.GONE); diff --git a/mastodon/src/main/res/values/dimens.xml b/mastodon/src/main/res/values/dimens.xml index a39dcef97..a4c273231 100644 --- a/mastodon/src/main/res/values/dimens.xml +++ b/mastodon/src/main/res/values/dimens.xml @@ -1,5 +1,5 @@ - 350dp + 220dp 150dp \ No newline at end of file From 4db90b87f49a5062e5d1ff90d23f6d5635c7e124 Mon Sep 17 00:00:00 2001 From: sk Date: Fri, 17 Mar 2023 01:06:43 +0100 Subject: [PATCH 089/111] compare status lang to device locale re: sk22#458 --- .../android/ui/displayitems/TextStatusDisplayItem.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/TextStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/TextStatusDisplayItem.java index c325336bf..a75ebc2fe 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/TextStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/TextStatusDisplayItem.java @@ -32,6 +32,7 @@ import org.joinmastodon.android.ui.utils.UiUtils; import org.joinmastodon.android.ui.views.LinkedTextView; import org.joinmastodon.android.utils.StatusTextEncoder; +import java.util.Locale; import java.util.regex.Pattern; import me.grishka.appkit.api.Callback; @@ -173,8 +174,8 @@ public class TextStatusDisplayItem extends StatusDisplayItem{ translateEnabled && !item.status.visibility.isLessVisibleThan(StatusPrivacy.UNLISTED) && item.status.language != null && - // todo: compare to user's locale instead (how do i query that?!) - (item.session.preferences == null || !item.status.language.equalsIgnoreCase(item.session.preferences.postingDefaultLanguage)))) + // todo: compare to mastodon locale instead (how do i query that?!) + !item.status.language.equalsIgnoreCase(Locale.getDefault().getLanguage()))) && (!GlobalUserPreferences.translateButtonOpenedOnly || item.textSelectable); translateWrap.setVisibility(translateVisible ? View.VISIBLE : View.GONE); translateButton.setText(item.translated ? R.string.sk_translate_show_original : R.string.sk_translate_post); From 8bd3c7cc2808ed6e54e71f4c344b11d7fa19af59 Mon Sep 17 00:00:00 2001 From: sk Date: Fri, 17 Mar 2023 01:23:14 +0100 Subject: [PATCH 090/111] fix crash when navigating while sending fix sk22#446 --- .../org/joinmastodon/android/fragments/ComposeFragment.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java index 3f4d47e71..2ab21d41c 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java @@ -1128,7 +1128,9 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr }else{ E.post(new StatusUpdatedEvent(result)); } - Nav.finish(ComposeFragment.this); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O || !isStateSaved()) { + Nav.finish(ComposeFragment.this); + } if (getArguments().getBoolean("navigateToStatus", false)) { Bundle args=new Bundle(); args.putString("account", accountID); From 21b07368420a4ad2769a6608e995e20a5010b77e Mon Sep 17 00:00:00 2001 From: sk Date: Fri, 17 Mar 2023 01:28:38 +0100 Subject: [PATCH 091/111] fix null pointer exception closes sk22#442 --- .../joinmastodon/android/fragments/NotificationsFragment.java | 2 +- .../org/joinmastodon/android/fragments/ProfileFragment.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsFragment.java index 38b4d9ae6..4500fac60 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsFragment.java @@ -232,7 +232,7 @@ public class NotificationsFragment extends MastodonToolbarFragment implements Sc @Override public SimpleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){ FrameLayout view=tabViews[viewType]; - ((ViewGroup)view.getParent()).removeView(view); + if (view.getParent() != null) ((ViewGroup)view.getParent()).removeView(view); view.setVisibility(View.VISIBLE); view.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); return new SimpleViewHolder(view); diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java index e4d087476..648c017c0 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java @@ -1133,7 +1133,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList @Override public SimpleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){ FrameLayout view=tabViews[viewType]; - ((ViewGroup)view.getParent()).removeView(view); + if (view.getParent() != null) ((ViewGroup)view.getParent()).removeView(view); view.setVisibility(View.VISIBLE); view.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); return new SimpleViewHolder(view); From b667afc7cd46ca3acb0c730781795b66a44f725b Mon Sep 17 00:00:00 2001 From: sk Date: Fri, 17 Mar 2023 02:30:21 +0100 Subject: [PATCH 092/111] some barebones calckey compatibility re: sk22#429 --- .../android/api/MastodonAPIController.java | 6 ++- .../android/fragments/ComposeFragment.java | 5 ++- .../android/fragments/ProfileFragment.java | 10 +++-- .../joinmastodon/android/model/Account.java | 4 +- .../org/joinmastodon/android/model/Poll.java | 6 ++- .../joinmastodon/android/model/Status.java | 38 ++++++++++++++++++- .../ExtendedFooterStatusDisplayItem.java | 4 +- 7 files changed, 58 insertions(+), 15 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/api/MastodonAPIController.java b/mastodon/src/main/java/org/joinmastodon/android/api/MastodonAPIController.java index 3f8696dd2..564c53248 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/api/MastodonAPIController.java +++ b/mastodon/src/main/java/org/joinmastodon/android/api/MastodonAPIController.java @@ -16,6 +16,7 @@ import org.joinmastodon.android.MastodonApp; import org.joinmastodon.android.api.gson.IsoInstantTypeAdapter; import org.joinmastodon.android.api.gson.IsoLocalDateTypeAdapter; import org.joinmastodon.android.api.session.AccountSession; +import org.joinmastodon.android.model.Status; import java.io.BufferedReader; import java.io.IOException; @@ -40,12 +41,15 @@ import okhttp3.ResponseBody; public class MastodonAPIController{ private static final String TAG="MastodonAPIController"; - public static final Gson gson=new GsonBuilder() + public static final Gson gsonWithoutDeserializer = new GsonBuilder() .disableHtmlEscaping() .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) .registerTypeAdapter(Instant.class, new IsoInstantTypeAdapter()) .registerTypeAdapter(LocalDate.class, new IsoLocalDateTypeAdapter()) .create(); + public static final Gson gson = gsonWithoutDeserializer.newBuilder() + .registerTypeAdapter(Status.class, new Status.StatusDeserializer()) + .create(); private static WorkerThread thread=new WorkerThread("MastodonAPIController"); private static OkHttpClient httpClient=new OkHttpClient.Builder().build(); diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java index 2ab21d41c..41d9e6f93 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java @@ -674,8 +674,9 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr moreBtn.setImageDrawable(visibilityIcon); moreBtn.setBackground(null); TextView timestamp = view.findViewById(R.id.timestamp); - if (status.editedAt==null) timestamp.setText(UiUtils.formatRelativeTimestamp(getContext(), status.createdAt)); - else timestamp.setText(getString(R.string.edited_timestamp, UiUtils.formatRelativeTimestamp(getContext(), status.editedAt))); + if (status.editedAt!=null) timestamp.setText(getString(R.string.edited_timestamp, UiUtils.formatRelativeTimestamp(getContext(), status.editedAt))); + else if (status.createdAt!=null) timestamp.setText(UiUtils.formatRelativeTimestamp(getContext(), status.createdAt)); + else timestamp.setText(""); if (status.spoilerText != null && !status.spoilerText.isBlank()) { view.findViewById(R.id.spoiler_header).setVisibility(View.VISIBLE); ((TextView) view.findViewById(R.id.spoiler_title_inline)).setText(status.spoilerText); diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java index 648c017c0..7705b47c4 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java @@ -550,10 +550,12 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList fields.clear(); - AccountField joined=new AccountField(); - joined.parsedName=joined.name=getString(R.string.profile_joined); - joined.parsedValue=joined.value=DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).format(LocalDateTime.ofInstant(account.createdAt, ZoneId.systemDefault())); - fields.add(joined); + if (account.createdAt != null) { + AccountField joined=new AccountField(); + joined.parsedName=joined.name=getString(R.string.profile_joined); + joined.parsedValue=joined.value=DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).format(LocalDateTime.ofInstant(account.createdAt, ZoneId.systemDefault())); + fields.add(joined); + } for(AccountField field:account.fields){ field.parsedValue=ssb=HtmlParser.parse(field.value, account.emojis, Collections.emptyList(), Collections.emptyList(), accountID); diff --git a/mastodon/src/main/java/org/joinmastodon/android/model/Account.java b/mastodon/src/main/java/org/joinmastodon/android/model/Account.java index 362406f85..b4424e0a6 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/model/Account.java +++ b/mastodon/src/main/java/org/joinmastodon/android/model/Account.java @@ -43,7 +43,7 @@ public class Account extends BaseModel implements Searchable{ /** * The profile's display name. */ - @RequiredField +// @RequiredField public String displayName; /** * The profile's bio / description. @@ -86,7 +86,7 @@ public class Account extends BaseModel implements Searchable{ /** * When the account was created. */ - @RequiredField +// @RequiredField public Instant createdAt; /** * When the most recent status was posted. diff --git a/mastodon/src/main/java/org/joinmastodon/android/model/Poll.java b/mastodon/src/main/java/org/joinmastodon/android/model/Poll.java index 5aeeb9e54..739a79f71 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/model/Poll.java +++ b/mastodon/src/main/java/org/joinmastodon/android/model/Poll.java @@ -18,11 +18,11 @@ public class Poll extends BaseModel{ public int votersCount; public int votesCount; public boolean voted; - @RequiredField +// @RequiredField public List ownVotes; @RequiredField public List - + + - + - \ No newline at end of file From f9607a434ada5d22cb488654c8a4194a03dad8cd Mon Sep 17 00:00:00 2001 From: sk Date: Mon, 20 Mar 2023 22:19:15 +0100 Subject: [PATCH 100/111] use accent color for notif title closes sk22#461 --- .../org/joinmastodon/android/PushNotificationReceiver.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java index 6e0457b58..353e0d8fc 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java +++ b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java @@ -55,6 +55,7 @@ public class PushNotificationReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent){ + UiUtils.setUserPreferredTheme(context); if(BuildConfig.DEBUG){ Log.e(TAG, "received: "+intent); Bundle extras=intent.getExtras(); @@ -185,7 +186,7 @@ public class PushNotificationReceiver extends BroadcastReceiver{ .setShowWhen(true) .setCategory(Notification.CATEGORY_SOCIAL) .setAutoCancel(true) - .setColor(context.getColor(R.color.shortcut_icon_background)); + .setColor(UiUtils.getThemeColor(context, android.R.attr.colorAccent)); if (!GlobalUserPreferences.uniformNotificationIcon) { builder.setSmallIcon(switch (pn.notificationType) { From bec47f40f7603db03f56ab80564581fd15880b58 Mon Sep 17 00:00:00 2001 From: sk Date: Mon, 20 Mar 2023 23:25:29 +0100 Subject: [PATCH 101/111] colorful swipe-to-refresh spinner closes sk22#455 --- .../fragments/BaseStatusListFragment.java | 3 +- .../fragments/EditTimelinesFragment.java | 3 +- .../fragments/FollowRequestsListFragment.java | 3 +- .../fragments/FollowedHashtagsFragment.java | 3 +- .../fragments/ListTimelinesFragment.java | 3 +- .../android/fragments/RecyclerFragment.java | 45 +++++++++++++++++++ .../account_list/BaseAccountListFragment.java | 4 +- .../discover/DiscoverAccountsFragment.java | 4 +- .../discover/DiscoverNewsFragment.java | 4 +- .../discover/TrendingHashtagsFragment.java | 4 +- .../onboarding/InstanceCatalogFragment.java | 6 +-- .../OnboardingFollowSuggestionsFragment.java | 4 +- .../android/ui/utils/UiUtils.java | 9 ++++ 13 files changed, 72 insertions(+), 23 deletions(-) create mode 100644 mastodon/src/main/java/org/joinmastodon/android/fragments/RecyclerFragment.java diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java index 10cbfee43..6d6389236 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/BaseStatusListFragment.java @@ -62,7 +62,6 @@ import androidx.recyclerview.widget.RecyclerView; import me.grishka.appkit.Nav; import me.grishka.appkit.api.Callback; import me.grishka.appkit.api.ErrorResponse; -import me.grishka.appkit.fragments.BaseRecyclerFragment; import me.grishka.appkit.imageloader.ImageLoaderRecyclerAdapter; import me.grishka.appkit.imageloader.ImageLoaderViewHolder; import me.grishka.appkit.imageloader.requests.ImageLoaderRequest; @@ -70,7 +69,7 @@ import me.grishka.appkit.utils.BindableViewHolder; import me.grishka.appkit.utils.V; import me.grishka.appkit.views.UsableRecyclerView; -public abstract class BaseStatusListFragment extends BaseRecyclerFragment implements PhotoViewerHost, ScrollableToTop{ +public abstract class BaseStatusListFragment extends RecyclerFragment implements PhotoViewerHost, ScrollableToTop{ protected ArrayList displayItems=new ArrayList<>(); protected DisplayItemsAdapter adapter; protected String accountID; diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/EditTimelinesFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/EditTimelinesFragment.java index c947b0fa9..3dbf2f2c9 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/EditTimelinesFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/EditTimelinesFragment.java @@ -47,11 +47,10 @@ import java.util.Map; import me.grishka.appkit.api.Callback; import me.grishka.appkit.api.ErrorResponse; -import me.grishka.appkit.fragments.BaseRecyclerFragment; import me.grishka.appkit.utils.BindableViewHolder; import me.grishka.appkit.views.UsableRecyclerView; -public class EditTimelinesFragment extends BaseRecyclerFragment implements ScrollableToTop { +public class EditTimelinesFragment extends RecyclerFragment implements ScrollableToTop { private String accountID; private TimelinesAdapter adapter; private final ItemTouchHelper itemTouchHelper; diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/FollowRequestsListFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/FollowRequestsListFragment.java index 76b28334f..385a64084 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/FollowRequestsListFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/FollowRequestsListFragment.java @@ -38,7 +38,6 @@ import me.grishka.appkit.Nav; import me.grishka.appkit.api.Callback; import me.grishka.appkit.api.ErrorResponse; import me.grishka.appkit.api.SimpleCallback; -import me.grishka.appkit.fragments.BaseRecyclerFragment; import me.grishka.appkit.imageloader.ImageLoaderRecyclerAdapter; import me.grishka.appkit.imageloader.ImageLoaderViewHolder; import me.grishka.appkit.imageloader.requests.ImageLoaderRequest; @@ -47,7 +46,7 @@ import me.grishka.appkit.utils.BindableViewHolder; import me.grishka.appkit.utils.V; import me.grishka.appkit.views.UsableRecyclerView; -public class FollowRequestsListFragment extends BaseRecyclerFragment implements ScrollableToTop{ +public class FollowRequestsListFragment extends RecyclerFragment implements ScrollableToTop{ private String accountID; private Map relationships=Collections.emptyMap(); private GetAccountRelationships relationshipsRequest; diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/FollowedHashtagsFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/FollowedHashtagsFragment.java index cdb729841..297d6427a 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/FollowedHashtagsFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/FollowedHashtagsFragment.java @@ -16,11 +16,10 @@ import org.joinmastodon.android.ui.DividerItemDecoration; import org.joinmastodon.android.ui.utils.UiUtils; import me.grishka.appkit.api.SimpleCallback; -import me.grishka.appkit.fragments.BaseRecyclerFragment; import me.grishka.appkit.utils.BindableViewHolder; import me.grishka.appkit.views.UsableRecyclerView; -public class FollowedHashtagsFragment extends BaseRecyclerFragment implements ScrollableToTop { +public class FollowedHashtagsFragment extends RecyclerFragment implements ScrollableToTop { private String nextMaxID; private String accountId; diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ListTimelinesFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ListTimelinesFragment.java index 2b7c6a874..301b61a93 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ListTimelinesFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ListTimelinesFragment.java @@ -37,11 +37,10 @@ import me.grishka.appkit.Nav; import me.grishka.appkit.api.Callback; import me.grishka.appkit.api.ErrorResponse; import me.grishka.appkit.api.SimpleCallback; -import me.grishka.appkit.fragments.BaseRecyclerFragment; import me.grishka.appkit.utils.BindableViewHolder; import me.grishka.appkit.views.UsableRecyclerView; -public class ListTimelinesFragment extends BaseRecyclerFragment implements ScrollableToTop { +public class ListTimelinesFragment extends RecyclerFragment implements ScrollableToTop { private String accountId; private String profileAccountId; private final HashMap userInListBefore = new HashMap<>(); diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/RecyclerFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/RecyclerFragment.java new file mode 100644 index 000000000..b5e0923af --- /dev/null +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/RecyclerFragment.java @@ -0,0 +1,45 @@ +package org.joinmastodon.android.fragments; + +import android.content.Context; +import android.os.Bundle; +import android.view.View; + +import org.joinmastodon.android.R; +import org.joinmastodon.android.ui.utils.UiUtils; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import me.grishka.appkit.fragments.BaseRecyclerFragment; + + +public abstract class RecyclerFragment extends BaseRecyclerFragment { + public RecyclerFragment(int perPage) { + super(perPage); + } + + public RecyclerFragment(int layout, int perPage) { + super(layout, perPage); + } + + public void onViewCreated(View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + Context ctx = getContext(); + List colors = new ArrayList<>(Arrays.asList( + R.color.primary_600, + R.color.red_primary_600, + R.color.green_primary_600, + R.color.blue_primary_600, + R.color.purple_600 + )); + int primary = UiUtils.getThemeColorRes(ctx, R.attr.colorPrimary600); + if (!colors.contains(primary)) colors.add(0, primary); + int offset = colors.indexOf(primary); + int[] sorted = new int[colors.size()]; + for (int i = 0; i < colors.size(); i++) { + sorted[i] = colors.get((i + offset) % colors.size()); + } + refreshLayout.setColorSchemeResources(sorted); + } +} diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/account_list/BaseAccountListFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/account_list/BaseAccountListFragment.java index 6a7fb48b6..4a247b0bf 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/account_list/BaseAccountListFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/account_list/BaseAccountListFragment.java @@ -25,6 +25,7 @@ import org.joinmastodon.android.api.requests.accounts.SetAccountFollowed; import org.joinmastodon.android.api.session.AccountSessionManager; import org.joinmastodon.android.fragments.ListTimelinesFragment; import org.joinmastodon.android.fragments.ProfileFragment; +import org.joinmastodon.android.fragments.RecyclerFragment; import org.joinmastodon.android.fragments.report.ReportReasonChoiceFragment; import org.joinmastodon.android.model.Account; import org.joinmastodon.android.model.Relationship; @@ -48,7 +49,6 @@ import me.grishka.appkit.Nav; import me.grishka.appkit.api.APIRequest; import me.grishka.appkit.api.Callback; import me.grishka.appkit.api.ErrorResponse; -import me.grishka.appkit.fragments.BaseRecyclerFragment; import me.grishka.appkit.imageloader.ImageLoaderRecyclerAdapter; import me.grishka.appkit.imageloader.ImageLoaderViewHolder; import me.grishka.appkit.imageloader.requests.ImageLoaderRequest; @@ -57,7 +57,7 @@ import me.grishka.appkit.utils.BindableViewHolder; import me.grishka.appkit.utils.V; import me.grishka.appkit.views.UsableRecyclerView; -public abstract class BaseAccountListFragment extends BaseRecyclerFragment{ +public abstract class BaseAccountListFragment extends RecyclerFragment { protected HashMap relationships=new HashMap<>(); protected String accountID; protected ArrayList> relationshipsRequests=new ArrayList<>(); diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/DiscoverAccountsFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/DiscoverAccountsFragment.java index c89c5c0b1..ae26e50e3 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/DiscoverAccountsFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/DiscoverAccountsFragment.java @@ -17,6 +17,7 @@ import org.joinmastodon.android.api.requests.accounts.GetAccountRelationships; import org.joinmastodon.android.api.requests.accounts.GetFollowSuggestions; import org.joinmastodon.android.fragments.IsOnTop; import org.joinmastodon.android.fragments.ProfileFragment; +import org.joinmastodon.android.fragments.RecyclerFragment; import org.joinmastodon.android.fragments.ScrollableToTop; import org.joinmastodon.android.model.Account; import org.joinmastodon.android.model.FollowSuggestion; @@ -40,7 +41,6 @@ import me.grishka.appkit.Nav; import me.grishka.appkit.api.Callback; import me.grishka.appkit.api.ErrorResponse; import me.grishka.appkit.api.SimpleCallback; -import me.grishka.appkit.fragments.BaseRecyclerFragment; import me.grishka.appkit.imageloader.ImageLoaderRecyclerAdapter; import me.grishka.appkit.imageloader.ImageLoaderViewHolder; import me.grishka.appkit.imageloader.requests.ImageLoaderRequest; @@ -49,7 +49,7 @@ import me.grishka.appkit.utils.BindableViewHolder; import me.grishka.appkit.utils.V; import me.grishka.appkit.views.UsableRecyclerView; -public class DiscoverAccountsFragment extends BaseRecyclerFragment implements ScrollableToTop, IsOnTop { +public class DiscoverAccountsFragment extends RecyclerFragment implements ScrollableToTop, IsOnTop { private String accountID; private Map relationships=Collections.emptyMap(); private GetAccountRelationships relationshipsRequest; diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/DiscoverNewsFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/DiscoverNewsFragment.java index 10a3a77dd..c0e66d312 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/DiscoverNewsFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/DiscoverNewsFragment.java @@ -11,6 +11,7 @@ import android.widget.TextView; import org.joinmastodon.android.R; import org.joinmastodon.android.api.requests.trends.GetTrendingLinks; import org.joinmastodon.android.fragments.IsOnTop; +import org.joinmastodon.android.fragments.RecyclerFragment; import org.joinmastodon.android.fragments.ScrollableToTop; import org.joinmastodon.android.model.Card; import org.joinmastodon.android.ui.DividerItemDecoration; @@ -26,7 +27,6 @@ import java.util.stream.Collectors; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import me.grishka.appkit.api.SimpleCallback; -import me.grishka.appkit.fragments.BaseRecyclerFragment; import me.grishka.appkit.imageloader.ImageLoaderRecyclerAdapter; import me.grishka.appkit.imageloader.ImageLoaderViewHolder; import me.grishka.appkit.imageloader.requests.ImageLoaderRequest; @@ -35,7 +35,7 @@ import me.grishka.appkit.utils.BindableViewHolder; import me.grishka.appkit.utils.V; import me.grishka.appkit.views.UsableRecyclerView; -public class DiscoverNewsFragment extends BaseRecyclerFragment implements ScrollableToTop, IsOnTop { +public class DiscoverNewsFragment extends RecyclerFragment implements ScrollableToTop, IsOnTop { private String accountID; private List imageRequests=Collections.emptyList(); private DiscoverInfoBannerHelper bannerHelper=new DiscoverInfoBannerHelper(DiscoverInfoBannerHelper.BannerType.TRENDING_LINKS); diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/TrendingHashtagsFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/TrendingHashtagsFragment.java index 01c98c615..80ae96697 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/TrendingHashtagsFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/TrendingHashtagsFragment.java @@ -8,6 +8,7 @@ import android.widget.TextView; import org.joinmastodon.android.R; import org.joinmastodon.android.api.requests.trends.GetTrendingHashtags; import org.joinmastodon.android.fragments.IsOnTop; +import org.joinmastodon.android.fragments.RecyclerFragment; import org.joinmastodon.android.fragments.ScrollableToTop; import org.joinmastodon.android.model.Hashtag; import org.joinmastodon.android.ui.DividerItemDecoration; @@ -20,11 +21,10 @@ import java.util.List; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import me.grishka.appkit.api.SimpleCallback; -import me.grishka.appkit.fragments.BaseRecyclerFragment; import me.grishka.appkit.utils.BindableViewHolder; import me.grishka.appkit.views.UsableRecyclerView; -public class TrendingHashtagsFragment extends BaseRecyclerFragment implements ScrollableToTop, IsOnTop { +public class TrendingHashtagsFragment extends RecyclerFragment implements ScrollableToTop, IsOnTop { private String accountID; private DiscoverInfoBannerHelper bannerHelper=new DiscoverInfoBannerHelper(DiscoverInfoBannerHelper.BannerType.TRENDING_HASHTAGS); diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/onboarding/InstanceCatalogFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/onboarding/InstanceCatalogFragment.java index 99c9a7478..ed7981c15 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/onboarding/InstanceCatalogFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/onboarding/InstanceCatalogFragment.java @@ -17,6 +17,7 @@ import org.joinmastodon.android.R; import org.joinmastodon.android.api.MastodonAPIController; import org.joinmastodon.android.api.MastodonErrorResponse; import org.joinmastodon.android.api.requests.instance.GetInstance; +import org.joinmastodon.android.fragments.RecyclerFragment; import org.joinmastodon.android.model.Instance; import org.joinmastodon.android.model.catalog.CatalogInstance; import org.joinmastodon.android.ui.M3AlertDialogBuilder; @@ -44,7 +45,6 @@ import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import me.grishka.appkit.api.Callback; import me.grishka.appkit.api.ErrorResponse; -import me.grishka.appkit.fragments.BaseRecyclerFragment; import me.grishka.appkit.utils.BindableViewHolder; import me.grishka.appkit.utils.MergeRecyclerAdapter; import me.grishka.appkit.utils.V; @@ -52,7 +52,7 @@ import okhttp3.Call; import okhttp3.Request; import okhttp3.Response; -abstract class InstanceCatalogFragment extends BaseRecyclerFragment{ +abstract class InstanceCatalogFragment extends RecyclerFragment { protected RecyclerView.Adapter adapter; protected MergeRecyclerAdapter mergeAdapter; protected CatalogInstance chosenInstance; @@ -75,7 +75,7 @@ abstract class InstanceCatalogFragment extends BaseRecyclerFragment{ +public class OnboardingFollowSuggestionsFragment extends RecyclerFragment { private String accountID; private Map relationships=Collections.emptyMap(); private GetAccountRelationships relationshipsRequest; diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java b/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java index 9662ace45..975fef86e 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java @@ -338,12 +338,21 @@ public class UiUtils { } public static int getThemeColor(Context context, @AttrRes int attr) { + if (context == null) return 0xff00ff00; TypedArray ta = context.obtainStyledAttributes(new int[]{attr}); int color = ta.getColor(0, 0xff00ff00); ta.recycle(); return color; } + public static int getThemeColorRes(Context context, @AttrRes int attr) { + if (context == null) return 0xff00ff00; + TypedArray ta = context.obtainStyledAttributes(new int[]{attr}); + int color = ta.getResourceId(0, R.color.black); + ta.recycle(); + return color; + } + public static void openProfileByID(Context context, String selfID, String id) { Bundle args = new Bundle(); args.putString("account", selfID); From ff272179e73dd04938ef6b3f8e1143fdf5cec5ff Mon Sep 17 00:00:00 2001 From: sk Date: Tue, 21 Mar 2023 00:52:20 +0100 Subject: [PATCH 102/111] implement notification badge using markers --- .../android/PushNotificationReceiver.java | 2 + .../joinmastodon/android/api/ApiUtils.java | 2 +- .../api/requests/markers/GetMarkers.java | 17 +++++ .../android/api/session/AccountSession.java | 2 + .../api/session/AccountSessionManager.java | 20 ++++++ .../events/AllNotificationsSeenEvent.java | 4 ++ .../events/NotificationReceivedEvent.java | 8 +++ .../android/fragments/HomeFragment.java | 63 +++++++++++++++++++ .../fragments/NotificationsListFragment.java | 5 ++ .../joinmastodon/android/model/Marker.java | 9 +++ .../joinmastodon/android/model/Markers.java | 14 +++++ .../ic_fluent_alert_28_filled_badged.xml | 10 +++ .../ic_fluent_alert_28_regular_badged.xml | 10 +++ .../ic_fluent_alert_28_selector_badged.xml | 8 +++ mastodon/src/main/res/layout/tab_bar.xml | 1 - 15 files changed, 173 insertions(+), 2 deletions(-) create mode 100644 mastodon/src/main/java/org/joinmastodon/android/api/requests/markers/GetMarkers.java create mode 100644 mastodon/src/main/java/org/joinmastodon/android/events/AllNotificationsSeenEvent.java create mode 100644 mastodon/src/main/java/org/joinmastodon/android/events/NotificationReceivedEvent.java create mode 100644 mastodon/src/main/java/org/joinmastodon/android/model/Markers.java create mode 100644 mastodon/src/main/res/drawable/ic_fluent_alert_28_filled_badged.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_alert_28_regular_badged.xml create mode 100644 mastodon/src/main/res/drawable/ic_fluent_alert_28_selector_badged.xml diff --git a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java index 353e0d8fc..77b6112a5 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java +++ b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java @@ -23,6 +23,7 @@ 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.events.NotificationReceivedEvent; import org.joinmastodon.android.model.Account; import org.joinmastodon.android.model.NotificationAction; import org.joinmastodon.android.model.Preferences; @@ -85,6 +86,7 @@ public class PushNotificationReceiver extends BroadcastReceiver{ } String accountID=account.getID(); PushNotification pn=AccountSessionManager.getInstance().getAccount(accountID).getPushSubscriptionManager().decryptNotification(k, p, s); + E.post(new NotificationReceivedEvent(pn.notificationId+"")); new GetNotificationByID(pn.notificationId+"") .setCallback(new Callback<>(){ @Override diff --git a/mastodon/src/main/java/org/joinmastodon/android/api/ApiUtils.java b/mastodon/src/main/java/org/joinmastodon/android/api/ApiUtils.java index 8c588e468..a2cb79775 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/api/ApiUtils.java +++ b/mastodon/src/main/java/org/joinmastodon/android/api/ApiUtils.java @@ -11,7 +11,7 @@ public class ApiUtils{ //no instance } - public static > List enumSetToStrings(EnumSet e, Class cls){ +public static > List enumSetToStrings(EnumSet e, Class cls){ return e.stream().map(ev->{ try{ SerializedName annotation=cls.getField(ev.name()).getAnnotation(SerializedName.class); diff --git a/mastodon/src/main/java/org/joinmastodon/android/api/requests/markers/GetMarkers.java b/mastodon/src/main/java/org/joinmastodon/android/api/requests/markers/GetMarkers.java new file mode 100644 index 000000000..b7dd6536b --- /dev/null +++ b/mastodon/src/main/java/org/joinmastodon/android/api/requests/markers/GetMarkers.java @@ -0,0 +1,17 @@ +package org.joinmastodon.android.api.requests.markers; + +import org.joinmastodon.android.api.ApiUtils; +import org.joinmastodon.android.api.MastodonAPIRequest; +import org.joinmastodon.android.model.Marker; +import org.joinmastodon.android.model.Markers; + +import java.util.EnumSet; + +public class GetMarkers extends MastodonAPIRequest { + public GetMarkers(EnumSet timelines) { + super(HttpMethod.GET, "/markers", Markers.class); + for (String type : ApiUtils.enumSetToStrings(timelines, Marker.Type.class)){ + addQueryParameter("timeline[]", type); + } + } +} diff --git a/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSession.java b/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSession.java index e7fa19d9e..da32d9d1a 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSession.java +++ b/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSession.java @@ -7,6 +7,7 @@ import org.joinmastodon.android.api.StatusInteractionController; import org.joinmastodon.android.model.Account; import org.joinmastodon.android.model.Application; import org.joinmastodon.android.model.Filter; +import org.joinmastodon.android.model.Markers; import org.joinmastodon.android.model.Preferences; import org.joinmastodon.android.model.PushSubscription; import org.joinmastodon.android.model.Token; @@ -31,6 +32,7 @@ public class AccountSession{ public String pushAccountID; public Preferences preferences; public AccountActivationInfo activationInfo; + public Markers markers; private transient MastodonAPIController apiController; private transient StatusInteractionController statusInteractionController, remoteStatusInteractionController; private transient CacheController cacheController; diff --git a/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSessionManager.java b/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSessionManager.java index 1c3f6d808..465df2cfa 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSessionManager.java +++ b/mastodon/src/main/java/org/joinmastodon/android/api/session/AccountSessionManager.java @@ -25,6 +25,7 @@ import org.joinmastodon.android.api.requests.accounts.GetWordFilters; import org.joinmastodon.android.api.requests.instance.GetCustomEmojis; import org.joinmastodon.android.api.requests.accounts.GetOwnAccount; import org.joinmastodon.android.api.requests.instance.GetInstance; +import org.joinmastodon.android.api.requests.markers.GetMarkers; import org.joinmastodon.android.api.requests.oauth.CreateOAuthApp; import org.joinmastodon.android.events.EmojiUpdatedEvent; import org.joinmastodon.android.model.Account; @@ -33,6 +34,8 @@ import org.joinmastodon.android.model.Emoji; import org.joinmastodon.android.model.EmojiCategory; import org.joinmastodon.android.model.Filter; import org.joinmastodon.android.model.Instance; +import org.joinmastodon.android.model.Marker; +import org.joinmastodon.android.model.Markers; import org.joinmastodon.android.model.Preferences; import org.joinmastodon.android.model.Token; @@ -46,6 +49,7 @@ import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; +import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -255,6 +259,7 @@ public class AccountSessionManager{ // if(now-session.filtersLastUpdated>3600_000L){ updateSessionWordFilters(session); // } + updateSessionMarkers(session); } if(loadedInstances){ maybeUpdateCustomEmojis(domains); @@ -331,6 +336,21 @@ public class AccountSessionManager{ .exec(session.getID()); } + private void updateSessionMarkers(AccountSession session) { + new GetMarkers(EnumSet.allOf(Marker.Type.class)).setCallback(new Callback<>() { + @Override + public void onSuccess(Markers markers) { + session.markers = markers; + writeAccountsFile(); + } + + @Override + public void onError(ErrorResponse error) { + + } + }).exec(session.getID()); + } + public void updateInstanceInfo(String domain){ new GetInstance() .setCallback(new Callback<>(){ diff --git a/mastodon/src/main/java/org/joinmastodon/android/events/AllNotificationsSeenEvent.java b/mastodon/src/main/java/org/joinmastodon/android/events/AllNotificationsSeenEvent.java new file mode 100644 index 000000000..aded8546a --- /dev/null +++ b/mastodon/src/main/java/org/joinmastodon/android/events/AllNotificationsSeenEvent.java @@ -0,0 +1,4 @@ +package org.joinmastodon.android.events; + +public class AllNotificationsSeenEvent { +} diff --git a/mastodon/src/main/java/org/joinmastodon/android/events/NotificationReceivedEvent.java b/mastodon/src/main/java/org/joinmastodon/android/events/NotificationReceivedEvent.java new file mode 100644 index 000000000..0ea284f07 --- /dev/null +++ b/mastodon/src/main/java/org/joinmastodon/android/events/NotificationReceivedEvent.java @@ -0,0 +1,8 @@ +package org.joinmastodon.android.events; + +public class NotificationReceivedEvent { + public String id; + public NotificationReceivedEvent(String id) { + this.id = id; + } +} diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeFragment.java index 323fa60f5..02b6883c6 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeFragment.java @@ -16,21 +16,34 @@ import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; +import org.joinmastodon.android.E; import org.joinmastodon.android.R; +import org.joinmastodon.android.api.requests.notifications.GetNotifications; import org.joinmastodon.android.api.session.AccountSession; import org.joinmastodon.android.api.session.AccountSessionManager; +import org.joinmastodon.android.events.AllNotificationsSeenEvent; +import org.joinmastodon.android.events.NotificationReceivedEvent; import org.joinmastodon.android.fragments.discover.DiscoverFragment; import org.joinmastodon.android.model.Account; +import org.joinmastodon.android.model.Instance; +import org.joinmastodon.android.model.Notification; import org.joinmastodon.android.ui.AccountSwitcherSheet; import org.joinmastodon.android.ui.utils.UiUtils; import org.joinmastodon.android.ui.views.TabBar; import org.parceler.Parcels; import java.util.ArrayList; +import java.util.EnumSet; +import java.util.List; import androidx.annotation.IdRes; import androidx.annotation.Nullable; + +import com.squareup.otto.Subscribe; + import me.grishka.appkit.FragmentStackActivity; +import me.grishka.appkit.api.Callback; +import me.grishka.appkit.api.ErrorResponse; import me.grishka.appkit.fragments.AppKitFragment; import me.grishka.appkit.fragments.LoaderFragment; import me.grishka.appkit.fragments.OnBackPressedListener; @@ -48,6 +61,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; @@ -56,6 +70,7 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); + E.register(this); accountID=getArguments().getString("account"); setTitle(R.string.sk_app_name); @@ -108,6 +123,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); + updateNotificationBadge(); + if(savedInstanceState==null){ getChildFragmentManager().beginTransaction() .add(R.id.fragment_wrap, homeTabFragment) @@ -267,4 +285,49 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene if (notificationsFragment.isAdded()) getChildFragmentManager().putFragment(outState, "notificationsFragment", notificationsFragment); if (profileFragment.isAdded()) getChildFragmentManager().putFragment(outState, "profileFragment", profileFragment); } + + public void updateNotificationBadge() { + AccountSession session = AccountSessionManager.getInstance().getAccount(accountID); + Instance instance = AccountSessionManager.getInstance().getInstanceInfo(session.domain); + + new GetNotifications(null, 1, EnumSet.allOf(Notification.Type.class), instance.pleroma != null) + .setCallback(new Callback<>() { + @Override + public void onSuccess(List notifications) { + if (notifications.size() > 0) { + try { + long newestId = Long.parseLong(notifications.get(0).id); + long lastSeenId = Long.parseLong(session.markers.notifications.lastReadId); + System.out.println("NEWEST: " + newestId); + System.out.println("LAST SEEN: " + lastSeenId); + + setNotificationBadge(newestId > lastSeenId); + } catch (Exception ignored) { + setNotificationBadge(false); + } + } + } + + @Override + public void onError(ErrorResponse error) { + setNotificationBadge(false); + } + }).exec(accountID); + } + + public void setNotificationBadge(boolean badge) { + notificationTabIcon.setImageResource(badge + ? R.drawable.ic_fluent_alert_28_selector_badged + : R.drawable.ic_fluent_alert_28_selector); + } + + @Subscribe + public void onNotificationReceived(NotificationReceivedEvent notificationReceivedEvent) { + setNotificationBadge(true); + } + + @Subscribe + public void onAllNotificationsSeen(AllNotificationsSeenEvent allNotificationsSeenEvent) { + setNotificationBadge(false); + } } diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsListFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsListFragment.java index a95f061af..646311735 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsListFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsListFragment.java @@ -11,6 +11,7 @@ import org.joinmastodon.android.E; import org.joinmastodon.android.R; import org.joinmastodon.android.api.requests.markers.SaveMarkers; import org.joinmastodon.android.api.session.AccountSessionManager; +import org.joinmastodon.android.events.AllNotificationsSeenEvent; import org.joinmastodon.android.events.PollUpdatedEvent; import org.joinmastodon.android.events.RemoveAccountPostsEvent; import org.joinmastodon.android.model.Account; @@ -140,7 +141,11 @@ public class NotificationsListFragment extends BaseStatusListFragment + + + + + + + + + \ No newline at end of file diff --git a/mastodon/src/main/res/drawable/ic_fluent_alert_28_regular_badged.xml b/mastodon/src/main/res/drawable/ic_fluent_alert_28_regular_badged.xml new file mode 100644 index 000000000..831e895fa --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_alert_28_regular_badged.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/mastodon/src/main/res/drawable/ic_fluent_alert_28_selector_badged.xml b/mastodon/src/main/res/drawable/ic_fluent_alert_28_selector_badged.xml new file mode 100644 index 000000000..3457f1fb5 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_alert_28_selector_badged.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/mastodon/src/main/res/layout/tab_bar.xml b/mastodon/src/main/res/layout/tab_bar.xml index 2ad234cb5..70cd213c3 100644 --- a/mastodon/src/main/res/layout/tab_bar.xml +++ b/mastodon/src/main/res/layout/tab_bar.xml @@ -51,7 +51,6 @@ android:scaleType="center" android:contentDescription="@string/notifications" android:background="?android:selectableItemBackgroundBorderless" - android:tint="?android:colorPrimary" android:src="@drawable/ic_fluent_alert_28_selector"/> Date: Tue, 21 Mar 2023 00:55:11 +0100 Subject: [PATCH 103/111] bump version --- mastodon/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mastodon/build.gradle b/mastodon/build.gradle index 57c7901c1..ef759b6e2 100644 --- a/mastodon/build.gradle +++ b/mastodon/build.gradle @@ -9,8 +9,8 @@ android { applicationId "org.joinmastodon.android.sk" minSdk 23 targetSdk 33 - versionCode 79 - versionName "1.2.0+fork.79" + versionCode 80 + versionName "1.2.0+fork.80" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resConfigs "ar-rSA", "be-rBY", "bn-rBD", "bs-rBA", "ca-rES", "cs-rCZ", "da-rDK", "de-rDE", "el-rGR", "es-rES", "eu-rES", "fa-rIR", "fi-rFI", "fil-rPH", "fr-rFR", "ga-rIE", "gd-rGB", "gl-rES", "hi-rIN", "hr-rHR", "hu-rHU", "hy-rAM", "ig-rNG", "in-rID", "is-rIS", "it-rIT", "iw-rIL", "ja-rJP", "kab", "ko-rKR", "my-rMM", "nl-rNL", "no-rNO", "oc-rFR", "pl-rPL", "pt-rBR", "pt-rPT", "ro-rRO", "ru-rRU", "si-rLK", "sl-rSI", "sv-rSE", "th-rTH", "tr-rTR", "uk-rUA", "vi-rVN", "zh-rCN", "zh-rTW" } From 797642b972bb0ed664717f69a7920abbced18aec Mon Sep 17 00:00:00 2001 From: sk Date: Tue, 21 Mar 2023 09:56:44 +0100 Subject: [PATCH 104/111] fix profile fragment crash closes sk22#469 --- .../android/fragments/ProfileFragment.java | 1 + .../android/fragments/RecyclerFragment.java | 11 ++++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java index 7705b47c4..4cd713ff3 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java @@ -439,6 +439,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList toolbarTitleView.setTranslationY(titleTransY); toolbarSubtitleView.setTranslationY(titleTransY); } + RecyclerFragment.setRefreshLayoutColors(refreshLayout); } @Override diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/RecyclerFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/RecyclerFragment.java index b5e0923af..2dbc9650b 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/RecyclerFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/RecyclerFragment.java @@ -4,6 +4,8 @@ import android.content.Context; import android.os.Bundle; import android.view.View; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + import org.joinmastodon.android.R; import org.joinmastodon.android.ui.utils.UiUtils; @@ -25,7 +27,10 @@ public abstract class RecyclerFragment extends BaseRecyclerFragment { public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - Context ctx = getContext(); + if (refreshLayout != null) setRefreshLayoutColors(refreshLayout); + } + + public static void setRefreshLayoutColors(SwipeRefreshLayout l) { List colors = new ArrayList<>(Arrays.asList( R.color.primary_600, R.color.red_primary_600, @@ -33,13 +38,13 @@ public abstract class RecyclerFragment extends BaseRecyclerFragment { R.color.blue_primary_600, R.color.purple_600 )); - int primary = UiUtils.getThemeColorRes(ctx, R.attr.colorPrimary600); + int primary = UiUtils.getThemeColorRes(l.getContext(), R.attr.colorPrimary600); if (!colors.contains(primary)) colors.add(0, primary); int offset = colors.indexOf(primary); int[] sorted = new int[colors.size()]; for (int i = 0; i < colors.size(); i++) { sorted[i] = colors.get((i + offset) % colors.size()); } - refreshLayout.setColorSchemeResources(sorted); + l.setColorSchemeResources(sorted); } } From 58b000927a7a5d7df14f6f3c182fb771ce860ede Mon Sep 17 00:00:00 2001 From: sk Date: Tue, 21 Mar 2023 10:03:31 +0100 Subject: [PATCH 105/111] session-specific notification badge fix sk22#470 --- .../org/joinmastodon/android/PushNotificationReceiver.java | 2 +- .../android/events/NotificationReceivedEvent.java | 5 +++-- .../org/joinmastodon/android/fragments/HomeFragment.java | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java index 77b6112a5..b0466cb52 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java +++ b/mastodon/src/main/java/org/joinmastodon/android/PushNotificationReceiver.java @@ -86,7 +86,7 @@ public class PushNotificationReceiver extends BroadcastReceiver{ } String accountID=account.getID(); PushNotification pn=AccountSessionManager.getInstance().getAccount(accountID).getPushSubscriptionManager().decryptNotification(k, p, s); - E.post(new NotificationReceivedEvent(pn.notificationId+"")); + E.post(new NotificationReceivedEvent(accountID, pn.notificationId+"")); new GetNotificationByID(pn.notificationId+"") .setCallback(new Callback<>(){ @Override diff --git a/mastodon/src/main/java/org/joinmastodon/android/events/NotificationReceivedEvent.java b/mastodon/src/main/java/org/joinmastodon/android/events/NotificationReceivedEvent.java index 0ea284f07..7641a4bdb 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/events/NotificationReceivedEvent.java +++ b/mastodon/src/main/java/org/joinmastodon/android/events/NotificationReceivedEvent.java @@ -1,8 +1,9 @@ package org.joinmastodon.android.events; public class NotificationReceivedEvent { - public String id; - public NotificationReceivedEvent(String id) { + public String account, id; + public NotificationReceivedEvent(String account, String id) { + this.account = account; this.id = id; } } diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeFragment.java index 02b6883c6..967a89ee6 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeFragment.java @@ -323,7 +323,7 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene @Subscribe public void onNotificationReceived(NotificationReceivedEvent notificationReceivedEvent) { - setNotificationBadge(true); + if (notificationReceivedEvent.account.equals(accountID)) setNotificationBadge(true); } @Subscribe From e58aeec0979af3156eed7ec84c477be24554acbb Mon Sep 17 00:00:00 2001 From: sk Date: Tue, 21 Mar 2023 10:22:09 +0100 Subject: [PATCH 106/111] query notifications on load posts closes sk22#471 --- .../java/org/joinmastodon/android/fragments/HomeFragment.java | 3 --- .../joinmastodon/android/fragments/HomeTimelineFragment.java | 4 ++++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeFragment.java index 967a89ee6..97d8d78c6 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeFragment.java @@ -298,9 +298,6 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene try { long newestId = Long.parseLong(notifications.get(0).id); long lastSeenId = Long.parseLong(session.markers.notifications.lastReadId); - System.out.println("NEWEST: " + newestId); - System.out.println("LAST SEEN: " + lastSeenId); - setNotificationBadge(newestId > lastSeenId); } catch (Exception ignored) { setNotificationBadge(false); diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTimelineFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTimelineFragment.java index 60203b167..a77acd5f6 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTimelineFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeTimelineFragment.java @@ -166,6 +166,10 @@ public class HomeTimelineFragment extends StatusListFragment { } }) .exec(accountID); + + if (parent.getParentFragment() instanceof HomeFragment homeFragment) { + homeFragment.updateNotificationBadge(); + } } @Override From 5734b19d8c2ad85ce9a86c2322c55800cde5f66d Mon Sep 17 00:00:00 2001 From: sk Date: Tue, 21 Mar 2023 15:14:25 +0100 Subject: [PATCH 107/111] remove unused variable --- .../ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java index 282173f84..623252846 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java @@ -32,7 +32,7 @@ import me.grishka.appkit.imageloader.requests.ImageLoaderRequest; import me.grishka.appkit.utils.V; public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{ - private CharSequence text, compactText; + private CharSequence text; @DrawableRes private int icon; private StatusPrivacy visibility; From 0216e22fcc2c6175b8851d9289e15a223f877d54 Mon Sep 17 00:00:00 2001 From: sk Date: Tue, 21 Mar 2023 15:25:01 +0100 Subject: [PATCH 108/111] don't remove badge if loaded from cache --- .../org/joinmastodon/android/api/CacheController.java | 8 ++++---- .../android/fragments/NotificationsListFragment.java | 5 +++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/api/CacheController.java b/mastodon/src/main/java/org/joinmastodon/android/api/CacheController.java index 9609bfa34..a7a0ed78b 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/api/CacheController.java +++ b/mastodon/src/main/java/org/joinmastodon/android/api/CacheController.java @@ -128,7 +128,7 @@ public class CacheController{ }); } - public void getNotifications(String maxID, int count, boolean onlyMentions, boolean onlyPosts, boolean forceReload, Callback>> callback){ + public void getNotifications(String maxID, int count, boolean onlyMentions, boolean onlyPosts, boolean forceReload, Callback>> callback){ cancelDelayedClose(); databaseThread.postRunnable(()->{ try{ @@ -156,7 +156,7 @@ public class CacheController{ result.add(ntf); }while(cursor.moveToNext()); String _newMaxID=newMaxID; - uiHandler.post(()->callback.onSuccess(new PaginatedResponse<>(result, _newMaxID))); + uiHandler.post(()->callback.onSuccess(new CacheablePaginatedResponse<>(result, _newMaxID, true))); return; } }catch(IOException x){ @@ -168,7 +168,7 @@ public class CacheController{ .setCallback(new Callback<>(){ @Override public void onSuccess(List result){ - callback.onSuccess(new PaginatedResponse<>(result.stream().filter(ntf->{ + callback.onSuccess(new CacheablePaginatedResponse<>(result.stream().filter(ntf->{ if(ntf.status!=null){ for(Filter filter:filters){ if(filter.matches(ntf.status)){ @@ -177,7 +177,7 @@ public class CacheController{ } } return true; - }).collect(Collectors.toList()), result.isEmpty() ? null : result.get(result.size()-1).id)); + }).collect(Collectors.toList()), result.isEmpty() ? null : result.get(result.size()-1).id, false)); putNotifications(result, onlyMentions, onlyPosts, maxID==null); } diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsListFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsListFragment.java index 646311735..a0cad1855 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsListFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/NotificationsListFragment.java @@ -15,6 +15,7 @@ import org.joinmastodon.android.events.AllNotificationsSeenEvent; import org.joinmastodon.android.events.PollUpdatedEvent; import org.joinmastodon.android.events.RemoveAccountPostsEvent; import org.joinmastodon.android.model.Account; +import org.joinmastodon.android.model.CacheablePaginatedResponse; import org.joinmastodon.android.model.Filter; import org.joinmastodon.android.model.Notification; import org.joinmastodon.android.model.PaginatedResponse; @@ -128,7 +129,7 @@ public class NotificationsListFragment extends BaseStatusListFragment0 ? maxID : null, count, onlyMentions, onlyPosts, refreshing, new SimpleCallback<>(this){ @Override - public void onSuccess(PaginatedResponse> result){ + public void onSuccess(CacheablePaginatedResponse> result){ if (getActivity() == null) return; if(refreshing) relationships.clear(); @@ -140,7 +141,7 @@ public class NotificationsListFragment extends BaseStatusListFragment Date: Tue, 21 Mar 2023 15:56:44 +0100 Subject: [PATCH 109/111] full text can have emojis, too --- .../ReblogOrReplyLineStatusDisplayItem.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java index 623252846..696944029 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/ReblogOrReplyLineStatusDisplayItem.java @@ -38,17 +38,17 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{ private StatusPrivacy visibility; @DrawableRes private int iconEnd; - private CustomEmojiHelper emojiHelper=new CustomEmojiHelper(); + private CustomEmojiHelper emojiHelper=new CustomEmojiHelper(), fullTextEmojiHelper; private View.OnClickListener handleClick; boolean belowHeader, needBottomPadding; ReblogOrReplyLineStatusDisplayItem extra; - String fullText; + CharSequence fullText; public ReblogOrReplyLineStatusDisplayItem(String parentID, BaseStatusListFragment parentFragment, CharSequence text, List emojis, @DrawableRes int icon, StatusPrivacy visibility, @Nullable View.OnClickListener handleClick) { - this(parentID, parentFragment, text, emojis, icon, visibility, handleClick, null); + this(parentID, parentFragment, text, emojis, icon, visibility, handleClick, text); } - public ReblogOrReplyLineStatusDisplayItem(String parentID, BaseStatusListFragment parentFragment, CharSequence text, List emojis, @DrawableRes int icon, StatusPrivacy visibility, @Nullable View.OnClickListener handleClick, String fullText) { + public ReblogOrReplyLineStatusDisplayItem(String parentID, BaseStatusListFragment parentFragment, CharSequence text, List emojis, @DrawableRes int icon, StatusPrivacy visibility, @Nullable View.OnClickListener handleClick, CharSequence fullText) { super(parentID, parentFragment); SpannableStringBuilder ssb=new SpannableStringBuilder(text); HtmlParser.parseCustomEmoji(ssb, emojis); @@ -59,7 +59,15 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{ TypedValue outValue = new TypedValue(); context.getTheme().resolveAttribute(android.R.attr.selectableItemBackground, outValue, true); updateVisibility(visibility); - this.fullText = fullText; + + if (fullText != null) { + fullTextEmojiHelper = new CustomEmojiHelper(); + SpannableStringBuilder fullTextSsb = new SpannableStringBuilder(fullText); + HtmlParser.parseCustomEmoji(fullTextSsb, emojis); + this.fullText=fullTextSsb; + fullTextEmojiHelper.setText(fullTextSsb); + } + } public void updateVisibility(StatusPrivacy visibility) { From d1b53554ceb0bac2c72e3d7697745773d49c06a2 Mon Sep 17 00:00:00 2001 From: sk Date: Tue, 21 Mar 2023 15:59:40 +0100 Subject: [PATCH 110/111] bump version --- mastodon/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mastodon/build.gradle b/mastodon/build.gradle index ef759b6e2..14fb1192f 100644 --- a/mastodon/build.gradle +++ b/mastodon/build.gradle @@ -9,8 +9,8 @@ android { applicationId "org.joinmastodon.android.sk" minSdk 23 targetSdk 33 - versionCode 80 - versionName "1.2.0+fork.80" + versionCode 81 + versionName "1.2.0+fork.81" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resConfigs "ar-rSA", "be-rBY", "bn-rBD", "bs-rBA", "ca-rES", "cs-rCZ", "da-rDK", "de-rDE", "el-rGR", "es-rES", "eu-rES", "fa-rIR", "fi-rFI", "fil-rPH", "fr-rFR", "ga-rIE", "gd-rGB", "gl-rES", "hi-rIN", "hr-rHR", "hu-rHU", "hy-rAM", "ig-rNG", "in-rID", "is-rIS", "it-rIT", "iw-rIL", "ja-rJP", "kab", "ko-rKR", "my-rMM", "nl-rNL", "no-rNO", "oc-rFR", "pl-rPL", "pt-rBR", "pt-rPT", "ro-rRO", "ru-rRU", "si-rLK", "sl-rSI", "sv-rSE", "th-rTH", "tr-rTR", "uk-rUA", "vi-rVN", "zh-rCN", "zh-rTW" } From d2f295ef8815ab0338804da19a3e31fffa929e02 Mon Sep 17 00:00:00 2001 From: sk22 Date: Tue, 21 Mar 2023 16:03:35 +0100 Subject: [PATCH 111/111] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 902a0bea6..417609784 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@ On the Fediverse, it’s quite common for people to pin posts they want others t [apt.izzysoft.de/fdroid/index/apk/org.joinmastodon.android.sk](https://apt.izzysoft.de/fdroid/index/apk/org.joinmastodon.android.sk) -Get it on IzzyOnDroid +Get it on IzzyOnDroid Note that you'll need to add Izzy's F-Droid repository to your F-Droid app first: