From 7743de24d2d592690f6106637f28f43dad36e642 Mon Sep 17 00:00:00 2001 From: Thomas Date: Wed, 22 Mar 2023 17:32:27 +0100 Subject: [PATCH] Fix issue #831 - Filter messages in profiles --- .../mastodon/activities/ProfileActivity.java | 3 + .../timeline/FragmentMastodonTimeline.java | 7 ++ .../timeline/FragmentProfileTimeline.java | 82 +++++++++++++++++++ .../menu/option_filter_toots_account.xml | 18 ++++ .../metadata/android/en/changelogs/488.txt | 2 +- 5 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/menus/mastodon/menu/option_filter_toots_account.xml diff --git a/app/src/main/java/app/fedilab/android/mastodon/activities/ProfileActivity.java b/app/src/main/java/app/fedilab/android/mastodon/activities/ProfileActivity.java index 5d12a90fc..fc14056a1 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/activities/ProfileActivity.java +++ b/app/src/main/java/app/fedilab/android/mastodon/activities/ProfileActivity.java @@ -125,6 +125,8 @@ public class ProfileActivity extends BaseActivity { private String account_id; private String mention_str; private WellKnownNodeinfo.NodeInfo nodeInfo; + + private boolean checkRemotely; private final BroadcastReceiver broadcast_data = new BroadcastReceiver() { @Override @@ -225,6 +227,7 @@ public class ProfileActivity extends BaseActivity { followerTab.setText(getString(R.string.followers_cnt, Helper.withSuffix(account.followers_count))); } } + } } diff --git a/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline/FragmentMastodonTimeline.java b/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline/FragmentMastodonTimeline.java index ac24737e4..ad1e04ba6 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline/FragmentMastodonTimeline.java +++ b/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline/FragmentMastodonTimeline.java @@ -334,6 +334,12 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter. } } + public void goTop() { + if (binding != null && search == null) { + binding.recyclerView.scrollToPosition(0); + } + } + @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); @@ -404,6 +410,7 @@ public class FragmentMastodonTimeline extends Fragment implements StatusAdapter. statusReport = (Status) getArguments().getSerializable(Helper.ARG_STATUS_REPORT); } + //When visiting a profile without being authenticated if (checkRemotely) { String[] acctArray = accountTimeline.acct.split("@"); diff --git a/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline/FragmentProfileTimeline.java b/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline/FragmentProfileTimeline.java index ef3b1e323..52d8394bd 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline/FragmentProfileTimeline.java +++ b/app/src/main/java/app/fedilab/android/mastodon/ui/fragment/timeline/FragmentProfileTimeline.java @@ -16,18 +16,24 @@ package app.fedilab.android.mastodon.ui.fragment.timeline; import android.os.Bundle; import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.PopupMenu; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentTransaction; import com.google.android.material.tabs.TabLayout; import app.fedilab.android.R; import app.fedilab.android.databinding.FragmentProfileTimelinesBinding; import app.fedilab.android.mastodon.client.entities.api.Account; +import app.fedilab.android.mastodon.client.entities.app.Timeline; import app.fedilab.android.mastodon.helper.Helper; import app.fedilab.android.mastodon.ui.pageadapter.FedilabProfilePageAdapter; @@ -36,6 +42,7 @@ public class FragmentProfileTimeline extends Fragment { private Account account; private FragmentProfileTimelinesBinding binding; private boolean checkRemotely; + private boolean show_boosts = true, show_replies = true; public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -71,9 +78,84 @@ public class FragmentProfileTimeline extends Fragment { @Override public void onTabReselected(TabLayout.Tab tab) { + if (binding.viewpager.getAdapter() != null && binding.viewpager + .getAdapter() + .instantiateItem(binding.viewpager, binding.viewpager.getCurrentItem()) instanceof FragmentMastodonTimeline) { + FragmentMastodonTimeline fragmentMastodonTimeline = (FragmentMastodonTimeline) binding.viewpager + .getAdapter() + .instantiateItem(binding.viewpager, binding.viewpager.getCurrentItem()); + fragmentMastodonTimeline.goTop(); + } } }); + final LinearLayout tabStrip = (LinearLayout) binding.tabLayout.getChildAt(0); + tabStrip.getChildAt(0).setOnLongClickListener(v -> { + PopupMenu popup = new PopupMenu(requireActivity(), binding.tabLayout.getChildAt(0)); + popup.getMenuInflater() + .inflate(R.menu.option_filter_toots_account, popup.getMenu()); + Menu menu = popup.getMenu(); + + final MenuItem itemShowBoosts = menu.findItem(R.id.action_show_boosts); + final MenuItem itemShowReplies = menu.findItem(R.id.action_show_replies); + + itemShowBoosts.setChecked(show_boosts); + itemShowReplies.setChecked(show_replies); + + popup.setOnDismissListener(menu1 -> { + if (binding.viewpager.getAdapter() != null && binding.viewpager + .getAdapter() + .instantiateItem(binding.viewpager, binding.viewpager.getCurrentItem()) instanceof FragmentMastodonTimeline) { + FragmentMastodonTimeline fragmentMastodonTimeline = (FragmentMastodonTimeline) binding.viewpager + .getAdapter() + .instantiateItem(binding.viewpager, binding.viewpager.getCurrentItem()); + FragmentTransaction fragTransaction = getChildFragmentManager().beginTransaction(); + fragTransaction.detach(fragmentMastodonTimeline).commit(); + Bundle bundle = new Bundle(); + bundle.putSerializable(Helper.ARG_TIMELINE_TYPE, Timeline.TimeLineEnum.ACCOUNT_TIMELINE); + bundle.putSerializable(Helper.ARG_ACCOUNT, account); + bundle.putBoolean(Helper.ARG_SHOW_PINNED, true); + bundle.putBoolean(Helper.ARG_CHECK_REMOTELY, checkRemotely); + bundle.putBoolean(Helper.ARG_SHOW_REBLOGS, show_boosts); + bundle.putBoolean(Helper.ARG_SHOW_REPLIES, show_replies); + fragmentMastodonTimeline.setArguments(bundle); + FragmentTransaction fragTransaction2 = getChildFragmentManager().beginTransaction(); + fragTransaction2.attach(fragmentMastodonTimeline); + fragTransaction2.commit(); + fragmentMastodonTimeline.recreate(); + } + + }); + popup.setOnMenuItemClickListener(item -> { + item.setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); + item.setActionView(new View(requireActivity())); + item.setOnActionExpandListener(new MenuItem.OnActionExpandListener() { + @Override + public boolean onMenuItemActionExpand(MenuItem item) { + return false; + } + + @Override + public boolean onMenuItemActionCollapse(MenuItem item) { + return false; + } + }); + int itemId = item.getItemId(); + if (itemId == R.id.action_show_boosts) { + show_boosts = !show_boosts; + } else if (itemId == R.id.action_show_replies) { + show_replies = !show_replies; + } + if (binding.tabLayout.getTabAt(0) != null) + binding.tabLayout.getTabAt(0).select(); + itemShowReplies.setChecked(show_replies); + itemShowBoosts.setChecked(show_boosts); + return true; + }); + popup.show(); + return true; + }); + } diff --git a/app/src/main/res/menus/mastodon/menu/option_filter_toots_account.xml b/app/src/main/res/menus/mastodon/menu/option_filter_toots_account.xml new file mode 100644 index 000000000..078b9dd12 --- /dev/null +++ b/app/src/main/res/menus/mastodon/menu/option_filter_toots_account.xml @@ -0,0 +1,18 @@ + + + + + diff --git a/src/fdroid/fastlane/metadata/android/en/changelogs/488.txt b/src/fdroid/fastlane/metadata/android/en/changelogs/488.txt index 1e988c7c9..57f37e6e6 100644 --- a/src/fdroid/fastlane/metadata/android/en/changelogs/488.txt +++ b/src/fdroid/fastlane/metadata/android/en/changelogs/488.txt @@ -1,5 +1,5 @@ Added: - +- Filter messages in profiles (hide/show boosts or replies) via a long press on the tab Changed: - Some layout improvements for Peertube