From 4879d74f80c9ef5a1827f78ca2dabc2ddec4c18b Mon Sep 17 00:00:00 2001 From: sk Date: Thu, 22 Dec 2022 12:51:43 -0300 Subject: [PATCH] implement followed hashtags list closes sk22/megalodon#162 --- .../requests/tags/GetFollowedHashtags.java | 24 ++++ .../fragments/FollowedHashtagsFragment.java | 107 ++++++++++++++++++ .../fragments/ListTimelinesFragment.java | 13 +-- .../android/fragments/ProfileFragment.java | 4 + .../ic_fluent_number_symbol_24_regular.xml | 3 + .../{item_list_timeline.xml => item_text.xml} | 2 +- mastodon/src/main/res/menu/profile_own.xml | 1 + mastodon/src/main/res/values/strings_sk.xml | 45 ++++++-- 8 files changed, 177 insertions(+), 22 deletions(-) create mode 100644 mastodon/src/main/java/org/joinmastodon/android/api/requests/tags/GetFollowedHashtags.java create mode 100644 mastodon/src/main/java/org/joinmastodon/android/fragments/FollowedHashtagsFragment.java create mode 100644 mastodon/src/main/res/drawable/ic_fluent_number_symbol_24_regular.xml rename mastodon/src/main/res/layout/{item_list_timeline.xml => item_text.xml} (96%) diff --git a/mastodon/src/main/java/org/joinmastodon/android/api/requests/tags/GetFollowedHashtags.java b/mastodon/src/main/java/org/joinmastodon/android/api/requests/tags/GetFollowedHashtags.java new file mode 100644 index 000000000..c38d13f1e --- /dev/null +++ b/mastodon/src/main/java/org/joinmastodon/android/api/requests/tags/GetFollowedHashtags.java @@ -0,0 +1,24 @@ +package org.joinmastodon.android.api.requests.tags; + +import com.google.gson.reflect.TypeToken; + +import org.joinmastodon.android.api.MastodonAPIRequest; +import org.joinmastodon.android.api.requests.HeaderPaginationRequest; +import org.joinmastodon.android.model.Hashtag; + +import java.util.List; + +public class GetFollowedHashtags extends HeaderPaginationRequest { + public GetFollowedHashtags(String maxID, String minID, int limit, String sinceID){ + super(HttpMethod.GET, "/followed_tags", new TypeToken<>(){}); + if(maxID!=null) + addQueryParameter("max_id", maxID); + if(minID!=null) + addQueryParameter("min_id", minID); + if(sinceID!=null) + addQueryParameter("since_id", sinceID); + if(limit>0) + addQueryParameter("limit", ""+limit); + } +} + diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/FollowedHashtagsFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/FollowedHashtagsFragment.java new file mode 100644 index 000000000..933503f77 --- /dev/null +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/FollowedHashtagsFragment.java @@ -0,0 +1,107 @@ +package org.joinmastodon.android.fragments; + +import android.os.Bundle; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import org.joinmastodon.android.R; +import org.joinmastodon.android.api.requests.tags.GetFollowedHashtags; +import org.joinmastodon.android.model.Hashtag; +import org.joinmastodon.android.model.HeaderPaginationList; +import org.joinmastodon.android.ui.utils.UiUtils; + +import me.grishka.appkit.api.SimpleCallback; +import me.grishka.appkit.fragments.BaseRecyclerFragment; +import me.grishka.appkit.utils.BindableViewHolder; +import me.grishka.appkit.views.UsableRecyclerView; + +public class FollowedHashtagsFragment extends BaseRecyclerFragment implements ScrollableToTop { + private String nextMaxID; + private String accountId; + + public FollowedHashtagsFragment() { + super(20); + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + Bundle args=getArguments(); + accountId=args.getString("account"); + setTitle(R.string.sk_hashtags_you_follow); + } + + @Override + protected void onShown(){ + super.onShown(); + if(!getArguments().getBoolean("noAutoLoad") && !loaded && !dataLoading) + loadData(); + } + + @Override + protected void doLoadData(int offset, int count){ + currentRequest=new GetFollowedHashtags(offset==0 ? null : nextMaxID, null, count, null) + .setCallback(new SimpleCallback<>(this){ + @Override + public void onSuccess(HeaderPaginationList result){ + if(result.nextPageUri!=null) + nextMaxID=result.nextPageUri.getQueryParameter("max_id"); + else + nextMaxID=null; + onDataLoaded(result, nextMaxID!=null); + } + }) + .exec(accountId); + } + + @Override + protected RecyclerView.Adapter getAdapter() { + return new HashtagsAdapter(); + } + + @Override + public void scrollToTop() { + smoothScrollRecyclerViewToTop(list); + } + + private class HashtagsAdapter extends RecyclerView.Adapter{ + @NonNull + @Override + public HashtagViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){ + return new HashtagViewHolder(); + } + + @Override + public void onBindViewHolder(@NonNull HashtagViewHolder holder, int position) { + holder.bind(data.get(position)); + } + + @Override + public int getItemCount() { + return data.size(); + } + } + + private class HashtagViewHolder extends BindableViewHolder implements UsableRecyclerView.Clickable{ + private final TextView title; + + public HashtagViewHolder(){ + super(getActivity(), R.layout.item_text, list); + title=findViewById(R.id.title); + } + + @Override + public void onBind(Hashtag item) { + title.setText(item.name); + title.setCompoundDrawablesRelativeWithIntrinsicBounds(itemView.getContext().getDrawable(R.drawable.ic_fluent_number_symbol_24_regular), null, null, null); + } + + @Override + public void onClick() { + UiUtils.openHashtagTimeline(getActivity(), accountId, item.name, item.following); + } + } +} diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ListTimelinesFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ListTimelinesFragment.java index 96c567161..8f33eee01 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ListTimelinesFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ListTimelinesFragment.java @@ -1,14 +1,9 @@ package org.joinmastodon.android.fragments; import android.os.Bundle; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.widget.Button; import android.widget.CheckBox; -import android.widget.LinearLayout; import android.widget.TextView; import androidx.annotation.NonNull; @@ -23,17 +18,13 @@ import org.joinmastodon.android.model.ListTimeline; import org.joinmastodon.android.ui.utils.UiUtils; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; -import java.util.Map; -import me.grishka.appkit.api.ErrorResponse; import me.grishka.appkit.api.SimpleCallback; import me.grishka.appkit.fragments.BaseRecyclerFragment; import me.grishka.appkit.utils.BindableViewHolder; -import me.grishka.appkit.utils.V; import me.grishka.appkit.views.UsableRecyclerView; public class ListTimelinesFragment extends BaseRecyclerFragment implements ScrollableToTop { @@ -159,7 +150,7 @@ public class ListTimelinesFragment extends BaseRecyclerFragment im private final CheckBox listToggle; public ListViewHolder(){ - super(getActivity(), R.layout.item_list_timeline, list); + super(getActivity(), R.layout.item_text, list); title=findViewById(R.id.title); listToggle=findViewById(R.id.list_toggle); } @@ -167,8 +158,10 @@ public class ListTimelinesFragment extends BaseRecyclerFragment im @Override public void onBind(ListTimeline item) { title.setText(item.title); + title.setCompoundDrawablesRelativeWithIntrinsicBounds(itemView.getContext().getDrawable(R.drawable.ic_fluent_people_community_24_regular), null, null, null); if (profileAccountId != null) { Boolean checked = userInList.get(item.id); + listToggle.setVisibility(View.VISIBLE); listToggle.setChecked(userInList.containsKey(item.id) && checked != null && checked); listToggle.setOnClickListener(this::onClickToggle); } else { diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java index 35d293826..53dc5c636 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java @@ -624,6 +624,10 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList args.putString("profileAccount", profileAccountID); args.putString("profileDisplayUsername", account.getDisplayUsername()); Nav.go(getActivity(), ListTimelinesFragment.class, args); + }else if(id==R.id.followed_hashtags){ + Bundle args=new Bundle(); + args.putString("account", accountID); + Nav.go(getActivity(), FollowedHashtagsFragment.class, args); } return true; } diff --git a/mastodon/src/main/res/drawable/ic_fluent_number_symbol_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_number_symbol_24_regular.xml new file mode 100644 index 000000000..04cb30278 --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_number_symbol_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/layout/item_list_timeline.xml b/mastodon/src/main/res/layout/item_text.xml similarity index 96% rename from mastodon/src/main/res/layout/item_list_timeline.xml rename to mastodon/src/main/res/layout/item_text.xml index f3d25d7c3..e29875512 100644 --- a/mastodon/src/main/res/layout/item_list_timeline.xml +++ b/mastodon/src/main/res/layout/item_text.xml @@ -12,7 +12,6 @@ android:layout_height="wrap_content" android:layout_weight="1" android:paddingHorizontal="16dp" - android:drawableLeft="@drawable/ic_fluent_people_community_24_regular" android:drawableTint="?android:textColorSecondary" android:drawablePadding="16dp" android:textAppearance="@style/m3_title_medium" @@ -26,6 +25,7 @@ android:clickable="false" android:layout_width="wrap_content" android:layout_height="match_parent" + android:visibility="gone" android:paddingRight="16dp"/> diff --git a/mastodon/src/main/res/menu/profile_own.xml b/mastodon/src/main/res/menu/profile_own.xml index c8895bb83..4d5de8519 100644 --- a/mastodon/src/main/res/menu/profile_own.xml +++ b/mastodon/src/main/res/menu/profile_own.xml @@ -2,5 +2,6 @@ + \ No newline at end of file diff --git a/mastodon/src/main/res/values/strings_sk.xml b/mastodon/src/main/res/values/strings_sk.xml index 2df1e6726..496b4d7df 100644 --- a/mastodon/src/main/res/values/strings_sk.xml +++ b/mastodon/src/main/res/values/strings_sk.xml @@ -40,15 +40,15 @@ Show federated timeline Posts Post notifications - Color theme - System - Pink - Purple - Green - Blue - Brown - Red - Yellow + Color palette + System + Pink + Purple + Green + Blue + Brown + Red + Yellow Allow multiple choices Translate Show original @@ -63,5 +63,28 @@ example.social \@megalodon Disable swiping between tabs - Not supported on your device - + Set up profile + Posting preferences + Configure filters + Security settings + Rules + About the app + Donate + Delete notification + Delete notification + Are you sure you want to delete this notification? + Clear all notifications + Delete all + Are you sure you want to clear all notifications\? + Enable deleting notifications + Publish button text + Customize Publish button text + Hide translate button in timeline + %s supports translation! + %s does not appear to support translation. + Looking it up on the Fediverse… + Undo reblog + Reblog with visibility + Post about this + Hashtags you follow + \ No newline at end of file