From 5db44cbf9ddf4cef0ab9375e5f7cc13c2e51443f Mon Sep 17 00:00:00 2001 From: sk Date: Thu, 19 Oct 2023 01:01:53 +0200 Subject: [PATCH] don't save bidi-safe string in account also support custom emoji in account switcher closes sk22#859 --- .../org/joinmastodon/android/AudioPlayerService.java | 2 +- .../android/fragments/ComposeFragment.java | 8 ++++---- .../android/fragments/FollowRequestsListFragment.java | 5 ++--- .../joinmastodon/android/fragments/HomeFragment.java | 2 +- .../android/fragments/ProfileFragment.java | 4 ++-- .../android/fragments/ThreadFragment.java | 2 +- .../fragments/discover/DiscoverAccountsFragment.java | 4 ++-- .../onboarding/OnboardingProfileSetupFragment.java | 1 - .../java/org/joinmastodon/android/model/Account.java | 5 ++++- .../android/model/viewmodel/AccountViewModel.java | 4 ++-- .../joinmastodon/android/ui/AccountSwitcherSheet.java | 7 ++++--- .../ui/displayitems/AccountCardStatusDisplayItem.java | 6 ++---- .../ui/displayitems/HeaderStatusDisplayItem.java | 2 +- .../NotificationHeaderStatusDisplayItem.java | 3 +-- .../android/ui/displayitems/StatusDisplayItem.java | 11 ++++------- .../org/joinmastodon/android/ui/utils/UiUtils.java | 8 ++++---- 16 files changed, 35 insertions(+), 39 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/AudioPlayerService.java b/mastodon/src/main/java/org/joinmastodon/android/AudioPlayerService.java index d7b185642..067446d3e 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/AudioPlayerService.java +++ b/mastodon/src/main/java/org/joinmastodon/android/AudioPlayerService.java @@ -266,7 +266,7 @@ public class AudioPlayerService extends Service{ private void updateNotification(boolean dismissable, boolean removeNotification){ Notification.Builder bldr=new Notification.Builder(this) .setSmallIcon(R.drawable.ic_ntf_logo) - .setContentTitle(status.account.displayName) + .setContentTitle(status.account.getDisplayName()) .setContentText(HtmlParser.strip(status.content)) .setOngoing(!dismissable) .setShowWhen(false) 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 5ea2d7ff8..f036bdf4a 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java @@ -326,7 +326,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr selfUsername=view.findViewById(R.id.self_username); selfAvatar=view.findViewById(R.id.self_avatar); selfExtraText=view.findViewById(R.id.self_extra_text); - HtmlParser.setTextWithCustomEmoji(selfName, self.displayName, self.emojis); + HtmlParser.setTextWithCustomEmoji(selfName, self.getDisplayName(), self.emojis); selfUsername.setText('@'+self.username+'@'+instanceDomain); if(self.avatar!=null) ViewImageLoader.load(selfAvatar, null, new UrlImageLoaderRequest(self.avatar)); @@ -665,7 +665,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr moreBtn.setBackground(null); TextView name = view.findViewById(R.id.name); - name.setText(HtmlParser.parseCustomEmoji(status.account.displayName, status.account.emojis)); + name.setText(HtmlParser.parseCustomEmoji(status.account.getDisplayName(), status.account.emojis)); UiUtils.loadCustomEmojiInTextView(name); String time = status==null || status.editedAt==null @@ -699,7 +699,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr .setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, V.dp(16))); } - replyText.setText(getString(quote!=null? R.string.sk_quoting_user : R.string.in_reply_to, status.account.displayName)); + replyText.setText(getString(quote!=null? R.string.sk_quoting_user : R.string.in_reply_to, status.account.getDisplayName())); int visibilityNameRes = switch (status.visibility) { case PUBLIC -> R.string.visibility_public; case UNLISTED -> R.string.sk_visibility_unlisted; @@ -707,7 +707,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr case DIRECT -> R.string.visibility_private; case LOCAL -> R.string.sk_local_only; }; - replyText.setContentDescription(getString(R.string.in_reply_to, status.account.displayName) + ", " + getString(visibilityNameRes)); + replyText.setContentDescription(getString(R.string.in_reply_to, status.account.getDisplayName()) + ", " + getString(visibilityNameRes)); replyText.setOnClickListener(v->{ scrollView.smoothScrollTo(0, 0); }); 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 37faab2bc..0750be8e4 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/FollowRequestsListFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/FollowRequestsListFragment.java @@ -20,7 +20,6 @@ import org.joinmastodon.android.api.requests.accounts.GetFollowRequests; import org.joinmastodon.android.api.session.AccountSessionManager; import org.joinmastodon.android.model.Account; import org.joinmastodon.android.model.HeaderPaginationList; -import org.joinmastodon.android.model.Instance; import org.joinmastodon.android.model.Relationship; import org.joinmastodon.android.ui.OutlineProviders; import org.joinmastodon.android.ui.text.HtmlParser; @@ -366,9 +365,9 @@ public class FollowRequestsListFragment extends MastodonRecyclerFragment options=new ArrayList<>(); for(AccountSession session:AccountSessionManager.getInstance().getLoggedInAccounts()){ - options.add(session.self.displayName+"\n("+session.self.username+"@"+session.domain+")"); + options.add(session.self.getDisplayName()+"\n("+session.self.username+"@"+session.domain+")"); } new AccountSwitcherSheet(getActivity(), this).show(); return true; 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 8ed09b1dc..fd30387ba 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java @@ -621,14 +621,14 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList @SuppressLint("SetTextI18n") private void bindHeaderView(){ - setTitle(account.displayName); + setTitle(account.getDisplayName()); setSubtitle(getResources().getQuantityString(R.plurals.x_posts, (int)(account.statusesCount%1000), account.statusesCount)); ViewImageLoader.load(avatar, null, new UrlImageLoaderRequest( TextUtils.isEmpty(account.avatar) ? getSession().getDefaultAvatarUrl() : GlobalUserPreferences.playGifs ? account.avatar : account.avatarStatic, V.dp(100), V.dp(100))); ViewImageLoader.load(cover, null, new UrlImageLoaderRequest(GlobalUserPreferences.playGifs ? account.header : account.headerStatic, 1000, 1000)); - SpannableStringBuilder ssb=new SpannableStringBuilder(account.displayName); + SpannableStringBuilder ssb=new SpannableStringBuilder(account.getDisplayName()); if(AccountSessionManager.get(accountID).getLocalPreferences().customEmojiInNames) HtmlParser.parseCustomEmoji(ssb, account.emojis); name.setText(ssb); 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 993f136ba..580153f1c 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ThreadFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ThreadFragment.java @@ -64,7 +64,7 @@ public class ThreadFragment extends StatusListFragment implements ProvidesAssist knownAccounts.put(inReplyToAccount.id, inReplyToAccount); data.add(mainStatus); onAppendItems(Collections.singletonList(mainStatus)); - setTitle(HtmlParser.parseCustomEmoji(getString(R.string.post_from_user, mainStatus.account.displayName), mainStatus.account.emojis)); + setTitle(HtmlParser.parseCustomEmoji(getString(R.string.post_from_user, mainStatus.account.getDisplayName()), mainStatus.account.emojis)); transitionFinished = getArguments().getBoolean("noTransition", false); } 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 dead031d0..d7194bbf3 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 @@ -330,9 +330,9 @@ public class DiscoverAccountsFragment extends MastodonRecyclerFragment R.string.user_followed_you; 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 1e21bbed4..31f3b8425 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 @@ -15,7 +15,6 @@ import android.view.ViewGroup; import androidx.annotation.NonNull; -import org.joinmastodon.android.GlobalUserPreferences; import org.joinmastodon.android.R; import org.joinmastodon.android.api.session.AccountLocalPreferences; import org.joinmastodon.android.api.session.AccountSessionManager; @@ -30,7 +29,6 @@ import org.joinmastodon.android.model.Account; import org.joinmastodon.android.model.Attachment; import org.joinmastodon.android.model.DisplayItemsParent; import org.joinmastodon.android.model.LegacyFilter; -import org.joinmastodon.android.model.FilterAction; import org.joinmastodon.android.model.FilterContext; import org.joinmastodon.android.model.FilterResult; import org.joinmastodon.android.model.Notification; @@ -41,7 +39,6 @@ import org.joinmastodon.android.ui.PhotoLayoutHelper; import org.joinmastodon.android.ui.text.HtmlParser; import org.joinmastodon.android.ui.utils.UiUtils; import org.joinmastodon.android.ui.viewholders.AccountViewHolder; -import org.joinmastodon.android.utils.StatusFilterPredicate; import org.parceler.Parcels; import java.util.ArrayList; @@ -142,11 +139,11 @@ public abstract class StatusDisplayItem{ String parentID = parent.getID(); String text = threadReply ? fragment.getString(R.string.sk_show_thread) : account == null ? fragment.getString(R.string.sk_in_reply) - : status.reblog != null ? account.displayName - : fragment.getString(R.string.in_reply_to, account.displayName); + : status.reblog != null ? account.getDisplayName() + : fragment.getString(R.string.in_reply_to, account.getDisplayName()); 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); + : fragment.getString(R.string.in_reply_to, account.getDisplayName()); return new ReblogOrReplyLineStatusDisplayItem( parentID, fragment, text, account == null ? List.of() : account.emojis, R.drawable.ic_fluent_arrow_reply_20sp_filled, null, null, fullText, status @@ -176,7 +173,7 @@ public abstract class StatusDisplayItem{ if(status.reblog!=null){ boolean isOwnPost = AccountSessionManager.getInstance().isSelf(fragment.getAccountID(), status.account); - String text=fragment.getString(R.string.user_boosted, status.account.displayName); + String text=fragment.getString(R.string.user_boosted, status.account.getDisplayName()); items.add(new ReblogOrReplyLineStatusDisplayItem(parentID, fragment, text, status.account.emojis, R.drawable.ic_fluent_arrow_repeat_all_20sp_filled, isOwnPost ? status.visibility : null, i->{ args.putParcelable("profileAccount", Parcels.wrap(status.account)); Nav.go(fragment.getActivity(), ProfileFragment.class, args); 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 b9a7901d8..29210f2f3 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 @@ -480,7 +480,7 @@ public class UiUtils { public static void confirmToggleBlockUser(Activity activity, String accountID, Account account, boolean currentlyBlocked, Consumer resultCallback) { showConfirmationAlert(activity, activity.getString(currentlyBlocked ? R.string.confirm_unblock_title : R.string.confirm_block_title), - activity.getString(currentlyBlocked ? R.string.confirm_unblock : R.string.confirm_block, account.displayName), + activity.getString(currentlyBlocked ? R.string.confirm_unblock : R.string.confirm_block, account.getDisplayName()), activity.getString(currentlyBlocked ? R.string.do_unblock : R.string.do_block), R.drawable.ic_fluent_person_prohibited_28_regular, () -> { @@ -508,7 +508,7 @@ public class UiUtils { public static void confirmSoftBlockUser(Activity activity, String accountID, Account account, Consumer resultCallback) { showConfirmationAlert(activity, activity.getString(R.string.sk_remove_follower), - activity.getString(R.string.sk_remove_follower_confirm, account.displayName), + activity.getString(R.string.sk_remove_follower_confirm, account.getDisplayName()), activity.getString(R.string.sk_do_remove_follower), R.drawable.ic_fluent_person_delete_24_regular, () -> new SetAccountBlocked(account.id, true).setCallback(new Callback<>() { @@ -566,7 +566,7 @@ public class UiUtils { params.setMargins(0, V.dp(-12), 0, 0); durationView.setLayoutParams(params); Button button=durationView.findViewById(R.id.button); - ((TextView) durationView.findViewById(R.id.message)).setText(context.getString(R.string.confirm_mute, account.displayName)); + ((TextView) durationView.findViewById(R.id.message)).setText(context.getString(R.string.confirm_mute, account.getDisplayName())); AtomicReference muteDuration=new AtomicReference<>(Duration.ZERO); @@ -600,7 +600,7 @@ public class UiUtils { new M3AlertDialogBuilder(context) .setTitle(context.getString(currentlyMuted ? R.string.confirm_unmute_title : R.string.confirm_mute_title)) - .setMessage(currentlyMuted ? context.getString(R.string.confirm_unmute, account.displayName) : null) + .setMessage(currentlyMuted ? context.getString(R.string.confirm_unmute, account.getDisplayName()) : null) .setView(currentlyMuted ? null : durationView) .setPositiveButton(context.getString(currentlyMuted ? R.string.do_unmute : R.string.do_mute), (dlg, i)->{ new SetAccountMuted(account.id, !currentlyMuted, muteDuration.get().getSeconds())