Add info banners in discover sub-tabs

This commit is contained in:
Grishka 2022-04-25 22:27:18 +03:00
parent 3c9670bbaa
commit 89c7a13c59
8 changed files with 143 additions and 11 deletions

View File

@ -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);
};

View File

@ -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<Card> implements ScrollableToTop{
private String accountID;
private List<ImageLoaderRequest> 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<Card> 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

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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<Hashtag> 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<Hashtag> 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

View File

@ -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
}
}

View File

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/discover_info_banner"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:elevation="1dp"
android:outlineProvider="background"
android:background="?colorWindowBackground">
<TextView
android:id="@+id/banner_text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
android:textAppearance="@style/m3_body_large"
tools:text="@string/trending_posts_info_banner"/>
<ImageButton
android:id="@+id/banner_dismiss"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_margin="8dp"
android:src="@drawable/ic_fluent_dismiss_circle_24_filled"
android:tint="?android:textColorSecondary"
android:contentDescription="@string/dismiss"
android:background="?android:selectableItemBackgroundBorderless"/>
</LinearLayout>

View File

@ -307,5 +307,9 @@
<string name="downloading">Downloading…</string>
<string name="no_app_to_handle_action">There\'s no app to handle this action</string>
<string name="local_timeline">Community</string>
<string name="trending_posts">Trending</string>
<string name="trending_posts_info_banner">These are the posts gaining traction in your corner of Mastodon.</string>
<string name="trending_hashtags_info_banner">These are the hashtags gaining traction in your corner of Mastodon.</string>
<string name="trending_links_info_banner">These are the news stories being shared the most in your corner of Mastodon.</string>
<string name="local_timeline_info_banner">These are the most recent posts by the people who use the same Mastodon server as you.</string>
<string name="dismiss">Dismiss</string>
</resources>