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 7ecee30f3..7ff7b536b 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/HomeFragment.java @@ -21,6 +21,7 @@ import org.joinmastodon.android.R; import org.joinmastodon.android.api.session.AccountSession; import org.joinmastodon.android.api.session.AccountSessionManager; import org.joinmastodon.android.fragments.discover.DiscoverFragment; +import org.joinmastodon.android.fragments.discover.SearchFragment; import org.joinmastodon.android.model.Account; import org.joinmastodon.android.ui.AccountSwitcherSheet; import org.joinmastodon.android.ui.utils.UiUtils; @@ -202,7 +203,9 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene private void onTabSelected(@IdRes int tab){ Fragment newFragment=fragmentForTab(tab); if(tab==currentTab){ - if(newFragment instanceof ScrollableToTop scrollable) + if (tab == R.id.tab_search) + searchFragment.onSelect(); + else if(newFragment instanceof ScrollableToTop scrollable) scrollable.scrollToTop(); return; } diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/IsOnTop.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/IsOnTop.java new file mode 100644 index 000000000..3b1c999e9 --- /dev/null +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/IsOnTop.java @@ -0,0 +1,11 @@ +package org.joinmastodon.android.fragments; + +import androidx.recyclerview.widget.RecyclerView; + +public interface IsOnTop { + boolean isOnTop(); + + default boolean isRecyclerViewOnTop(RecyclerView list) { + return !list.canScrollVertically(-1); + } +} 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 fb95db010..aca7f18c2 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 @@ -15,6 +15,7 @@ import android.widget.TextView; import org.joinmastodon.android.R; 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.ScrollableToTop; import org.joinmastodon.android.model.Account; @@ -48,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{ +public class DiscoverAccountsFragment extends BaseRecyclerFragment implements ScrollableToTop, IsOnTop { private String accountID; private Map relationships=Collections.emptyMap(); private GetAccountRelationships relationshipsRequest; @@ -137,6 +138,11 @@ public class DiscoverAccountsFragment extends BaseRecyclerFragment implements ImageLoaderRecyclerAdapter{ public AccountsAdapter(){ diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/DiscoverFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/DiscoverFragment.java index a975f37bb..67f7b7a69 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/DiscoverFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/DiscoverFragment.java @@ -1,7 +1,6 @@ package org.joinmastodon.android.fragments.discover; import android.app.Fragment; -import android.app.FragmentTransaction; import android.os.Build; import android.os.Bundle; import android.text.Editable; @@ -20,6 +19,7 @@ import android.widget.TextView; import org.joinmastodon.android.GlobalUserPreferences; import org.joinmastodon.android.R; +import org.joinmastodon.android.fragments.IsOnTop; import org.joinmastodon.android.fragments.ScrollableToTop; import org.joinmastodon.android.ui.SimpleViewHolder; import org.joinmastodon.android.ui.tabs.TabLayout; @@ -36,7 +36,7 @@ import me.grishka.appkit.fragments.BaseRecyclerFragment; import me.grishka.appkit.fragments.OnBackPressedListener; import me.grishka.appkit.utils.V; -public class DiscoverFragment extends AppKitFragment implements ScrollableToTop, OnBackPressedListener{ +public class DiscoverFragment extends AppKitFragment implements ScrollableToTop, OnBackPressedListener, IsOnTop { private TabLayout tabLayout; private ViewPager2 pager; @@ -227,6 +227,23 @@ public class DiscoverFragment extends AppKitFragment implements ScrollableToTop, } } + @Override + public boolean isOnTop() { + return searchActive ? searchFragment.isOnTop() + : ((IsOnTop)getFragmentForPage(pager.getCurrentItem())).isOnTop(); + } + + public void onSelect() { + if (isOnTop()) selectSearch(); + else scrollToTop(); + } + + private void selectSearch() { + searchEdit.requestFocus(); + onSearchEditFocusChanged(searchEdit, true); + getActivity().getSystemService(InputMethodManager.class).showSoftInput(searchEdit, 0); + } + public void loadData(){ if(hashtagsFragment!=null && !hashtagsFragment.loaded && !hashtagsFragment.dataLoading) hashtagsFragment.loadData(); 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 9e5f65aeb..50f695282 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 @@ -10,6 +10,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.ScrollableToTop; import org.joinmastodon.android.model.Card; import org.joinmastodon.android.ui.DividerItemDecoration; @@ -34,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{ +public class DiscoverNewsFragment extends BaseRecyclerFragment implements ScrollableToTop, IsOnTop { private String accountID; private List imageRequests=Collections.emptyList(); private DiscoverInfoBannerHelper bannerHelper=new DiscoverInfoBannerHelper(DiscoverInfoBannerHelper.BannerType.TRENDING_LINKS); @@ -81,6 +82,11 @@ public class DiscoverNewsFragment extends BaseRecyclerFragment implements smoothScrollRecyclerViewToTop(list); } + @Override + public boolean isOnTop() { + return isRecyclerViewOnTop(list); + } + private class LinksAdapter extends UsableRecyclerView.Adapter implements ImageLoaderRecyclerAdapter{ public LinksAdapter(){ super(imgLoader); diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/DiscoverPostsFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/DiscoverPostsFragment.java index ebf8b7620..34fdcc968 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/DiscoverPostsFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/DiscoverPostsFragment.java @@ -4,6 +4,7 @@ import android.os.Bundle; import android.view.View; import org.joinmastodon.android.api.requests.trends.GetTrendingStatuses; +import org.joinmastodon.android.fragments.IsOnTop; import org.joinmastodon.android.fragments.StatusListFragment; import org.joinmastodon.android.model.Status; import org.joinmastodon.android.ui.utils.DiscoverInfoBannerHelper; @@ -12,7 +13,7 @@ import java.util.List; import me.grishka.appkit.api.SimpleCallback; -public class DiscoverPostsFragment extends StatusListFragment{ +public class DiscoverPostsFragment extends StatusListFragment implements IsOnTop { private DiscoverInfoBannerHelper bannerHelper=new DiscoverInfoBannerHelper(DiscoverInfoBannerHelper.BannerType.TRENDING_POSTS); @Override @@ -31,4 +32,9 @@ public class DiscoverPostsFragment extends StatusListFragment{ super.onViewCreated(view, savedInstanceState); bannerHelper.maybeAddBanner(contentWrap); } + + @Override + public boolean isOnTop() { + return isRecyclerViewOnTop(list); + } } diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/SearchFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/SearchFragment.java index 86451742e..ee31f63be 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/SearchFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/SearchFragment.java @@ -11,6 +11,7 @@ import org.joinmastodon.android.R; import org.joinmastodon.android.api.requests.search.GetSearchResults; import org.joinmastodon.android.api.session.AccountSessionManager; import org.joinmastodon.android.fragments.BaseStatusListFragment; +import org.joinmastodon.android.fragments.IsOnTop; import org.joinmastodon.android.fragments.ProfileFragment; import org.joinmastodon.android.fragments.ThreadFragment; import org.joinmastodon.android.model.Account; @@ -37,11 +38,10 @@ 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.api.SimpleCallback; import me.grishka.appkit.utils.MergeRecyclerAdapter; import me.grishka.appkit.utils.V; -public class SearchFragment extends BaseStatusListFragment{ +public class SearchFragment extends BaseStatusListFragment implements IsOnTop { private String currentQuery; private List prevDisplayItems; private EnumSet currentFilter=EnumSet.allOf(SearchResult.Type.class); @@ -299,6 +299,11 @@ public class SearchFragment extends BaseStatusListFragment{ } } + @Override + public boolean isOnTop() { + return isRecyclerViewOnTop(list); + } + @FunctionalInterface public interface ProgressVisibilityListener{ void onProgressVisibilityChanged(boolean visible); 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 091f3d0bf..26f345693 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 @@ -7,6 +7,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.ScrollableToTop; import org.joinmastodon.android.model.Hashtag; import org.joinmastodon.android.ui.DividerItemDecoration; @@ -23,7 +24,7 @@ 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{ +public class TrendingHashtagsFragment extends BaseRecyclerFragment implements ScrollableToTop, IsOnTop { private String accountID; private DiscoverInfoBannerHelper bannerHelper=new DiscoverInfoBannerHelper(DiscoverInfoBannerHelper.BannerType.TRENDING_HASHTAGS); @@ -66,6 +67,11 @@ public class TrendingHashtagsFragment extends BaseRecyclerFragment impl smoothScrollRecyclerViewToTop(list); } + @Override + public boolean isOnTop() { + return isRecyclerViewOnTop(list); + } + private class HashtagsAdapter extends RecyclerView.Adapter{ @NonNull @Override