From 98de4e75e0c7d06c212ca8569e9d4e8fadbfe0bd Mon Sep 17 00:00:00 2001 From: sk Date: Fri, 23 Dec 2022 22:56:18 +0100 Subject: [PATCH] implement open with other account as submenu --- .../android/fragments/SettingsFragment.java | 2 +- .../displayitems/HeaderStatusDisplayItem.java | 33 ++++++++++++++----- .../android/ui/utils/UiUtils.java | 26 ++++++++++++--- mastodon/src/main/res/menu/post.xml | 4 ++- mastodon/src/main/res/values/strings_sk.xml | 4 ++- 5 files changed, 53 insertions(+), 16 deletions(-) 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 6b50d5747..f590de406 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java @@ -220,7 +220,7 @@ public class SettingsFragment extends MastodonToolbarFragment{ items.add(new TextItem(R.string.sk_settings_filters, ()->UiUtils.launchWebBrowser(getActivity(), "https://"+session.domain+"/filters"), R.drawable.ic_fluent_open_24_regular)); items.add(new TextItem(R.string.sk_settings_auth, ()->UiUtils.launchWebBrowser(getActivity(), "https://"+session.domain+"/auth/edit"), R.drawable.ic_fluent_open_24_regular)); - String instanceName = instance != null && !instance.title.isBlank() ? instance.title : session.domain; + String instanceName = UiUtils.getInstanceName(accountID); items.add(new HeaderItem(instanceName)); items.add(new TextItem(R.string.sk_settings_rules, ()->UiUtils.launchWebBrowser(getActivity(), "https://"+session.domain+"/about"), R.drawable.ic_fluent_open_24_regular)); items.add(new TextItem(R.string.settings_tos, ()->UiUtils.launchWebBrowser(getActivity(), "https://"+session.domain+"/terms"), R.drawable.ic_fluent_open_24_regular)); diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/HeaderStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/HeaderStatusDisplayItem.java index 0b18bd2f2..ba2374caa 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/HeaderStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/HeaderStatusDisplayItem.java @@ -11,6 +11,7 @@ import android.text.SpannableStringBuilder; import android.text.TextUtils; import android.view.Menu; import android.view.MenuItem; +import android.view.SubMenu; import android.view.View; import android.view.ViewGroup; import android.view.ViewOutlineProvider; @@ -23,6 +24,7 @@ import org.joinmastodon.android.GlobalUserPreferences; import org.joinmastodon.android.R; import org.joinmastodon.android.api.requests.accounts.GetAccountRelationships; import org.joinmastodon.android.api.requests.statuses.GetStatusSourceText; +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; @@ -43,6 +45,7 @@ import org.parceler.Parcels; import java.time.Instant; import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; import me.grishka.appkit.Nav; import me.grishka.appkit.api.APIRequest; @@ -137,7 +140,12 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{ avatar.setOutlineProvider(roundCornersOutline); avatar.setClipToOutline(true); more.setOnClickListener(this::onMoreClick); - more.setOnLongClickListener((v) -> { openWithAccount(); return true; }); + more.setOnLongClickListener((v) -> { + PopupMenu popup = new PopupMenu(itemView.getContext(), v); + populateAccountsMenu(popup.getMenu()); + popup.show(); + return true; + }); visibility.setOnClickListener(v->item.parentFragment.onVisibilityIconClick(this)); deleteNotification.setOnClickListener(v->UiUtils.confirmDeleteNotification(activity, item.parentFragment.getAccountID(), item.notification, ()->{ if (item.parentFragment instanceof NotificationsListFragment fragment) { @@ -150,6 +158,13 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{ optionsMenu.setOnMenuItemClickListener(menuItem->{ Account account=item.user; int id=menuItem.getItemId(); + + SubMenu accountsMenu=id==R.id.open_with_account ? menuItem.getSubMenu() : null; + if (accountsMenu != null) { + accountsMenu.clear(); + populateAccountsMenu(accountsMenu); + } + if(id==R.id.edit || id==R.id.delete_and_redraft) { final Bundle args=new Bundle(); args.putString("account", item.parentFragment.getAccountID()); @@ -193,8 +208,6 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{ }else if(id==R.id.pin || id==R.id.unpin) { UiUtils.confirmPinPost(item.parentFragment.getActivity(), item.parentFragment.getAccountID(), item.status, !item.status.pinned, s -> { }); - }else if(id==R.id.open_with_account) { - openWithAccount(); }else if(id==R.id.mute){ UiUtils.confirmToggleMuteUser(item.parentFragment.getActivity(), item.parentFragment.getAccountID(), account, relationship!=null && relationship.muting, r->{}); }else if(id==R.id.block){ @@ -233,11 +246,15 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{ }); } - private void openWithAccount() { - UiUtils.pickAccount(item.parentFragment.getActivity(), (session, dialog) -> { - UiUtils.openURL(item.parentFragment.getActivity(), session.getID(), item.status.url); - return true; - }, R.string.sk_open_with_account); + private void populateAccountsMenu(Menu menu) { + List sessions=AccountSessionManager.getInstance().getLoggedInAccounts(); + sessions.stream().filter(s -> !s.getID().equals(item.accountID)).forEach(s -> { + String username = "@"+s.self.username+"@"+s.domain; + menu.add(username).setOnMenuItemClickListener(c->{ + UiUtils.openURL(item.parentFragment.getActivity(), s.getID(), item.status.url, false); + return true; + }); + }); } @Override 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 b1741b24e..57fd2025f 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 @@ -71,6 +71,7 @@ import org.joinmastodon.android.fragments.ProfileFragment; import org.joinmastodon.android.fragments.ThreadFragment; import org.joinmastodon.android.model.Account; import org.joinmastodon.android.model.Emoji; +import org.joinmastodon.android.model.Instance; import org.joinmastodon.android.model.ListTimeline; import org.joinmastodon.android.model.Notification; import org.joinmastodon.android.model.Relationship; @@ -748,9 +749,23 @@ public class UiUtils{ it.matches("^/o/[a-f0-9]+$"); } - public static void openURL(Context context, String accountID, String url){ + public static String getInstanceName(String accountID) { + AccountSession session = AccountSessionManager.getInstance().getAccount(accountID); + Instance instance = AccountSessionManager.getInstance().getInstanceInfo(session.domain); + return instance != null && !instance.title.isBlank() ? instance.title : session.domain; + } + + public static void openURL(Context context, String accountID, String url) { + openURL(context, accountID, url, true); + } + + public static void openURL(Context context, String accountID, String url, boolean launchBrowser){ Consumer transformDialogForLookup = dialog -> { - dialog.setTitle(R.string.sk_loading_fediverse_resource_title); + if (accountID != null) { + dialog.setTitle(context.getString(R.string.sk_loading_resource_on_instance_title, getInstanceName(accountID))); + } else { + dialog.setTitle(R.string.sk_loading_fediverse_resource_title); + } dialog.setButton(DialogInterface.BUTTON_NEGATIVE, context.getString(R.string.cancel), (d, which) -> d.cancel()); dialog.setButton(DialogInterface.BUTTON_POSITIVE, context.getString(R.string.open_in_browser), (d, which) -> { d.cancel(); @@ -775,7 +790,7 @@ public class UiUtils{ @Override public void onError(ErrorResponse error){ error.showToast(context); - launchWebBrowser(context, url); + if (launchBrowser) launchWebBrowser(context, url); } }) .wrapProgress((Activity)context, R.string.loading, true, transformDialogForLookup) @@ -795,14 +810,15 @@ public class UiUtils{ args.putParcelable("profileAccount", Parcels.wrap(results.accounts.get(0))); Nav.go((Activity) context, ProfileFragment.class, args); } else { - launchWebBrowser(context, url); + if (launchBrowser) launchWebBrowser(context, url); + else Toast.makeText(context, R.string.sk_resource_not_found, Toast.LENGTH_SHORT).show(); } } @Override public void onError(ErrorResponse error) { error.showToast(context); - launchWebBrowser(context, url); + if (launchBrowser) launchWebBrowser(context, url); } }) .wrapProgress((Activity)context, R.string.loading, true, transformDialogForLookup) diff --git a/mastodon/src/main/res/menu/post.xml b/mastodon/src/main/res/menu/post.xml index c12cdc619..c719e2294 100644 --- a/mastodon/src/main/res/menu/post.xml +++ b/mastodon/src/main/res/menu/post.xml @@ -1,11 +1,13 @@ + + + - diff --git a/mastodon/src/main/res/values/strings_sk.xml b/mastodon/src/main/res/values/strings_sk.xml index 469c7eeef..5f1953214 100644 --- a/mastodon/src/main/res/values/strings_sk.xml +++ b/mastodon/src/main/res/values/strings_sk.xml @@ -82,11 +82,13 @@ Hide translate button in timeline %s supports translation! %s does not appear to support translation. - Looking it up on the Fediverse… + Looking it up on the Fediverse + Looking it up on %s Undo reblog Reblog with visibility Post about this Hashtags you follow Copy link to post Open with other account + Resource could not be found \ No newline at end of file