From c1137cf7b7b0997306e955dc78fc95e114f7effc Mon Sep 17 00:00:00 2001 From: sk Date: Fri, 11 Nov 2022 21:04:14 +0100 Subject: [PATCH] implement favorited posts list closes #4 --- .../api/requests/accounts/GetFavourites.java | 49 +++++++++++++++++++ .../fragments/FavoritesListFragment.java | 46 +++++++++++++++++ .../android/fragments/ProfileFragment.java | 6 +++ mastodon/src/main/res/menu/profile.xml | 1 + .../src/main/res/values-de-rDE/strings.xml | 1 + mastodon/src/main/res/values/strings.xml | 1 + 6 files changed, 104 insertions(+) create mode 100644 mastodon/src/main/java/org/joinmastodon/android/api/requests/accounts/GetFavourites.java create mode 100644 mastodon/src/main/java/org/joinmastodon/android/fragments/FavoritesListFragment.java diff --git a/mastodon/src/main/java/org/joinmastodon/android/api/requests/accounts/GetFavourites.java b/mastodon/src/main/java/org/joinmastodon/android/api/requests/accounts/GetFavourites.java new file mode 100644 index 000000000..6323a2127 --- /dev/null +++ b/mastodon/src/main/java/org/joinmastodon/android/api/requests/accounts/GetFavourites.java @@ -0,0 +1,49 @@ +package org.joinmastodon.android.api.requests.accounts; + +import com.google.gson.reflect.TypeToken; + +import org.joinmastodon.android.api.MastodonAPIRequest; +import org.joinmastodon.android.model.Status; + +import java.io.IOException; +import java.util.List; + +import okhttp3.Response; + +public class GetFavourites extends MastodonAPIRequest>{ + private String maxId; + + public GetFavourites(String maxID, String minID, int limit){ + super(HttpMethod.GET, "/favourites", new TypeToken<>(){}); + if(maxID!=null) + addQueryParameter("max_id", maxID); + if(minID!=null) + addQueryParameter("min_id", minID); + if(limit>0) + addQueryParameter("limit", ""+limit); + } + + @Override + public void validateAndPostprocessResponse(List respObj, Response httpResponse) throws IOException { + super.validateAndPostprocessResponse(respObj, httpResponse); + // ; rel="next", + // ; rel="prev" + String link=httpResponse.header("link"); + // parsing link header by hand; using a library would be cleaner + // (also, the functionality should be part of the max id logics and implemented in MastodonAPIRequest) + if(link==null) return; + String maxIdEq="max_id="; + for(String s : link.split(",")) { + if(s.contains("rel=\"next\"")) { + int start=s.indexOf(maxIdEq)+maxIdEq.length(); + int end=s.indexOf('>'); + if(start<0 || start>end) return; + this.maxId=s.substring(start, end); + } + } + } + + public String getMaxId() { + return maxId; + } +} diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/FavoritesListFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/FavoritesListFragment.java new file mode 100644 index 000000000..7a1d18bf5 --- /dev/null +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/FavoritesListFragment.java @@ -0,0 +1,46 @@ +package org.joinmastodon.android.fragments; + +import android.os.Bundle; +import org.joinmastodon.android.R; +import org.joinmastodon.android.api.requests.accounts.GetFavourites; +import org.joinmastodon.android.api.session.AccountSession; +import org.joinmastodon.android.api.session.AccountSessionManager; +import org.joinmastodon.android.model.Status; + +import java.util.List; + +import me.grishka.appkit.api.SimpleCallback; + +public class FavoritesListFragment extends StatusListFragment{ + + private String accountID; + private String lastMaxId=null; + + @Override + public void onCreate(Bundle savedInstanceState){ + super.onCreate(savedInstanceState); + accountID=getArguments().getString("account"); + AccountSession session=AccountSessionManager.getInstance().getAccount(accountID); + setTitle(R.string.favorited_posts); + } + + @Override + protected void onShown(){ + super.onShown(); + if(!getArguments().getBoolean("noAutoLoad") && !loaded && !dataLoading) + loadData(); + } + + @Override + protected void doLoadData(int offset, int count) { + GetFavourites b=new GetFavourites(offset>0 ? lastMaxId : null, null, count); + currentRequest=b.setCallback(new SimpleCallback<>(this){ + @Override + public void onSuccess(List result){ + onDataLoaded(result, b.getMaxId()!=null); + lastMaxId=b.getMaxId(); + } + }) + .exec(accountID); + } +} 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 5040c2f8b..da8ae53d2 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java @@ -526,6 +526,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList MenuItem item=menu.getItem(i); item.setVisible(item.getItemId()==R.id.share); } + menu.findItem(R.id.favorites_list).setVisible(true); return; } menu.findItem(R.id.mute).setTitle(getString(relationship.muting ? R.string.unmute_user : R.string.mute_user, account.getDisplayUsername())); @@ -549,6 +550,11 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_TEXT, account.url); startActivity(Intent.createChooser(intent, item.getTitle())); + }else if(id==R.id.favorites_list) { + Bundle args=new Bundle(); + args.putString("account", accountID); + args.putParcelable("profileAccount", Parcels.wrap(account)); + Nav.go(getActivity(), FavoritesListFragment.class, args); }else if(id==R.id.mute){ confirmToggleMuted(); }else if(id==R.id.block){ diff --git a/mastodon/src/main/res/menu/profile.xml b/mastodon/src/main/res/menu/profile.xml index e140a5339..cf357d293 100644 --- a/mastodon/src/main/res/menu/profile.xml +++ b/mastodon/src/main/res/menu/profile.xml @@ -7,4 +7,5 @@ + \ No newline at end of file diff --git a/mastodon/src/main/res/values-de-rDE/strings.xml b/mastodon/src/main/res/values-de-rDE/strings.xml index 0c19347fb..f1e7b2ac5 100644 --- a/mastodon/src/main/res/values-de-rDE/strings.xml +++ b/mastodon/src/main/res/values-de-rDE/strings.xml @@ -377,4 +377,5 @@ Download (%s) Installieren + Favorisierte Beiträge diff --git a/mastodon/src/main/res/values/strings.xml b/mastodon/src/main/res/values/strings.xml index 2ee4d9975..cf3b24de4 100644 --- a/mastodon/src/main/res/values/strings.xml +++ b/mastodon/src/main/res/values/strings.xml @@ -387,4 +387,5 @@ Mastodon and your privacy Although the Mastodon app does not collect any data, the server you sign up through may have a different policy. Take a minute to review and agree to the Mastodon app privacy policy and your server\'s privacy policy. I Agree + Favorited posts \ No newline at end of file