From 89c7a13c59f4d1e8a80f1de11c37a8267db6cbca Mon Sep 17 00:00:00 2001 From: Grishka Date: Mon, 25 Apr 2022 22:27:18 +0300 Subject: [PATCH] Add info banners in discover sub-tabs --- .../fragments/discover/DiscoverFragment.java | 20 +++--- .../discover/DiscoverNewsFragment.java | 3 + .../discover/DiscoverPostsFragment.java | 12 ++++ .../discover/LocalTimelineFragment.java | 12 ++++ .../discover/TrendingHashtagsFragment.java | 3 + .../ui/utils/DiscoverInfoBannerHelper.java | 64 +++++++++++++++++++ .../main/res/layout/discover_info_banner.xml | 34 ++++++++++ mastodon/src/main/res/values/strings.xml | 6 +- 8 files changed, 143 insertions(+), 11 deletions(-) create mode 100644 mastodon/src/main/java/org/joinmastodon/android/ui/utils/DiscoverInfoBannerHelper.java create mode 100644 mastodon/src/main/res/layout/discover_info_banner.xml 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 e3a616ae..60e29d7d 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 @@ -77,9 +77,9 @@ public class DiscoverFragment extends AppKitFragment implements ScrollableToTop, FrameLayout tabView=new FrameLayout(getActivity()); tabView.setId(switch(i){ case 0 -> R.id.discover_posts; - case 1 -> R.id.discover_local_timeline; - case 2 -> R.id.discover_hashtags; - case 3 -> R.id.discover_news; + case 1 -> R.id.discover_hashtags; + case 2 -> R.id.discover_news; + case 3 -> R.id.discover_local_timeline; case 4 -> R.id.discover_users; default -> throw new IllegalStateException("Unexpected value: "+i); }); @@ -139,10 +139,10 @@ public class DiscoverFragment extends AppKitFragment implements ScrollableToTop, @Override public void onConfigureTab(@NonNull TabLayout.Tab tab, int position){ tab.setText(switch(position){ - case 0 -> R.string.trending_posts; - case 1 -> R.string.local_timeline; - case 2 -> R.string.hashtags; - case 3 -> R.string.news; + case 0 -> R.string.posts; + case 1 -> R.string.hashtags; + case 2 -> R.string.news; + case 3 -> R.string.local_timeline; case 4 -> R.string.for_you; default -> throw new IllegalStateException("Unexpected value: "+position); }); @@ -255,9 +255,9 @@ public class DiscoverFragment extends AppKitFragment implements ScrollableToTop, private Fragment getFragmentForPage(int page){ return switch(page){ case 0 -> postsFragment; - case 1 -> localTimelineFragment; - case 2 -> hashtagsFragment; - case 3 -> newsFragment; + case 1 -> hashtagsFragment; + case 2 -> newsFragment; + case 3 -> localTimelineFragment; case 4 -> accountsFragment; default -> throw new IllegalStateException("Unexpected value: "+page); }; 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 494d007e..9e5f65ae 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 @@ -15,6 +15,7 @@ import org.joinmastodon.android.model.Card; import org.joinmastodon.android.ui.DividerItemDecoration; import org.joinmastodon.android.ui.OutlineProviders; import org.joinmastodon.android.ui.drawables.BlurhashCrossfadeDrawable; +import org.joinmastodon.android.ui.utils.DiscoverInfoBannerHelper; import org.joinmastodon.android.ui.utils.UiUtils; import java.util.Collections; @@ -36,6 +37,7 @@ import me.grishka.appkit.views.UsableRecyclerView; public class DiscoverNewsFragment extends BaseRecyclerFragment implements ScrollableToTop{ private String accountID; private List imageRequests=Collections.emptyList(); + private DiscoverInfoBannerHelper bannerHelper=new DiscoverInfoBannerHelper(DiscoverInfoBannerHelper.BannerType.TRENDING_LINKS); public DiscoverNewsFragment(){ super(10); @@ -71,6 +73,7 @@ public class DiscoverNewsFragment extends BaseRecyclerFragment implements public void onViewCreated(View view, Bundle savedInstanceState){ super.onViewCreated(view, savedInstanceState); list.addItemDecoration(new DividerItemDecoration(getActivity(), R.attr.colorPollVoted, 1, 0, 0)); + bannerHelper.maybeAddBanner(contentWrap); } @Override 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 8b6cb2c0..c79b5120 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 @@ -1,14 +1,20 @@ package org.joinmastodon.android.fragments.discover; +import android.os.Bundle; +import android.view.View; + import org.joinmastodon.android.api.requests.trends.GetTrendingStatuses; import org.joinmastodon.android.fragments.StatusListFragment; import org.joinmastodon.android.model.Status; +import org.joinmastodon.android.ui.utils.DiscoverInfoBannerHelper; import java.util.List; import me.grishka.appkit.api.SimpleCallback; public class DiscoverPostsFragment extends StatusListFragment{ + private DiscoverInfoBannerHelper bannerHelper=new DiscoverInfoBannerHelper(DiscoverInfoBannerHelper.BannerType.TRENDING_POSTS); + @Override protected void doLoadData(int offset, int count){ currentRequest=new GetTrendingStatuses(count) @@ -19,4 +25,10 @@ public class DiscoverPostsFragment extends StatusListFragment{ } }).exec(accountID); } + + @Override + public void onViewCreated(View view, Bundle savedInstanceState){ + super.onViewCreated(view, savedInstanceState); + bannerHelper.maybeAddBanner(contentWrap); + } } diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/LocalTimelineFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/LocalTimelineFragment.java index 830651f8..03ac1a3c 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/LocalTimelineFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/discover/LocalTimelineFragment.java @@ -1,14 +1,20 @@ package org.joinmastodon.android.fragments.discover; +import android.os.Bundle; +import android.view.View; + import org.joinmastodon.android.api.requests.timelines.GetPublicTimeline; import org.joinmastodon.android.fragments.StatusListFragment; import org.joinmastodon.android.model.Status; +import org.joinmastodon.android.ui.utils.DiscoverInfoBannerHelper; import java.util.List; import me.grishka.appkit.api.SimpleCallback; public class LocalTimelineFragment extends StatusListFragment{ + private DiscoverInfoBannerHelper bannerHelper=new DiscoverInfoBannerHelper(DiscoverInfoBannerHelper.BannerType.LOCAL_TIMELINE); + @Override protected void doLoadData(int offset, int count){ currentRequest=new GetPublicTimeline(true, false, refreshing ? null : getMaxID(), count) @@ -20,4 +26,10 @@ public class LocalTimelineFragment extends StatusListFragment{ }) .exec(accountID); } + + @Override + public void onViewCreated(View view, Bundle savedInstanceState){ + super.onViewCreated(view, savedInstanceState); + bannerHelper.maybeAddBanner(contentWrap); + } } 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 6408e1e1..bcb3d744 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 @@ -10,6 +10,7 @@ import org.joinmastodon.android.api.requests.trends.GetTrendingHashtags; import org.joinmastodon.android.fragments.ScrollableToTop; import org.joinmastodon.android.model.Hashtag; import org.joinmastodon.android.ui.DividerItemDecoration; +import org.joinmastodon.android.ui.utils.DiscoverInfoBannerHelper; import org.joinmastodon.android.ui.utils.UiUtils; import org.joinmastodon.android.ui.views.HashtagChartView; @@ -24,6 +25,7 @@ import me.grishka.appkit.views.UsableRecyclerView; public class TrendingHashtagsFragment extends BaseRecyclerFragment implements ScrollableToTop{ private String accountID; + private DiscoverInfoBannerHelper bannerHelper=new DiscoverInfoBannerHelper(DiscoverInfoBannerHelper.BannerType.TRENDING_HASHTAGS); public TrendingHashtagsFragment(){ super(10); @@ -56,6 +58,7 @@ public class TrendingHashtagsFragment extends BaseRecyclerFragment impl public void onViewCreated(View view, Bundle savedInstanceState){ super.onViewCreated(view, savedInstanceState); list.addItemDecoration(new DividerItemDecoration(getActivity(), R.attr.colorPollVoted, .5f, 16, 16)); + bannerHelper.maybeAddBanner(contentWrap); } @Override diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/utils/DiscoverInfoBannerHelper.java b/mastodon/src/main/java/org/joinmastodon/android/ui/utils/DiscoverInfoBannerHelper.java new file mode 100644 index 00000000..60b22217 --- /dev/null +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/utils/DiscoverInfoBannerHelper.java @@ -0,0 +1,64 @@ +package org.joinmastodon.android.ui.utils; + +import android.app.Activity; +import android.content.Context; +import android.content.SharedPreferences; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; +import android.widget.TextView; + +import org.joinmastodon.android.MastodonApp; +import org.joinmastodon.android.R; + +import me.grishka.appkit.utils.CubicBezierInterpolator; + +public class DiscoverInfoBannerHelper{ + private View banner; + private final BannerType type; + + public DiscoverInfoBannerHelper(BannerType type){ + this.type=type; + } + + private SharedPreferences getPrefs(){ + return MastodonApp.context.getSharedPreferences("onboarding", Context.MODE_PRIVATE); + } + + public void maybeAddBanner(FrameLayout view){ + if(!getPrefs().getBoolean("bannerHidden_"+type, false)){ + ((Activity)view.getContext()).getLayoutInflater().inflate(R.layout.discover_info_banner, view); + banner=view.findViewById(R.id.discover_info_banner); + view.findViewById(R.id.banner_dismiss).setOnClickListener(this::onDismissClick); + TextView text=view.findViewById(R.id.banner_text); + text.setText(switch(type){ + case TRENDING_POSTS -> R.string.trending_posts_info_banner; + case TRENDING_HASHTAGS -> R.string.trending_hashtags_info_banner; + case TRENDING_LINKS -> R.string.trending_links_info_banner; + case LOCAL_TIMELINE -> R.string.local_timeline_info_banner; + }); + } + } + + private void onDismissClick(View v){ + if(banner==null) + return; + View _banner=banner; + banner.animate() + .alpha(0) + .setDuration(200) + .setInterpolator(CubicBezierInterpolator.DEFAULT) + .withEndAction(()->((ViewGroup)_banner.getParent()).removeView(_banner)) + .start(); + getPrefs().edit().putBoolean("bannerHidden_"+type, true).apply(); + banner=null; + } + + public enum BannerType{ + TRENDING_POSTS, + TRENDING_HASHTAGS, + TRENDING_LINKS, + LOCAL_TIMELINE, +// ACCOUNTS + } +} diff --git a/mastodon/src/main/res/layout/discover_info_banner.xml b/mastodon/src/main/res/layout/discover_info_banner.xml new file mode 100644 index 00000000..9f993993 --- /dev/null +++ b/mastodon/src/main/res/layout/discover_info_banner.xml @@ -0,0 +1,34 @@ + + + + + + + + \ No newline at end of file diff --git a/mastodon/src/main/res/values/strings.xml b/mastodon/src/main/res/values/strings.xml index 12bb4564..a0f88b16 100644 --- a/mastodon/src/main/res/values/strings.xml +++ b/mastodon/src/main/res/values/strings.xml @@ -307,5 +307,9 @@ Downloading… There\'s no app to handle this action Community - Trending + These are the posts gaining traction in your corner of Mastodon. + These are the hashtags gaining traction in your corner of Mastodon. + These are the news stories being shared the most in your corner of Mastodon. + These are the most recent posts by the people who use the same Mastodon server as you. + Dismiss \ No newline at end of file