diff --git a/mastodon/build.gradle b/mastodon/build.gradle index f8785f92..4939669e 100644 --- a/mastodon/build.gradle +++ b/mastodon/build.gradle @@ -9,7 +9,7 @@ android { applicationId "org.joinmastodon.android" minSdk 23 targetSdk 33 - versionCode 86 + versionCode 87 versionName "2.4.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resConfigs "ar-rSA", "be-rBY", "bn-rBD", "bs-rBA", "ca-rES", "cs-rCZ", "da-rDK", "de-rDE", "el-rGR", "es-rES", "eu-rES", "fa-rIR", "fi-rFI", "fil-rPH", "fr-rFR", "ga-rIE", "gd-rGB", "gl-rES", "hi-rIN", "hr-rHR", "hu-rHU", "hy-rAM", "ig-rNG", "in-rID", "is-rIS", "it-rIT", "iw-rIL", "ja-rJP", "ka-rGE", "kab", "ko-rKR", "lt-rLT", "my-rMM", "nl-rNL", "no-rNO", "oc-rFR", "pl-rPL", "pt-rBR", "pt-rPT", "ro-rRO", "ru-rRU", "si-rLK", "sl-rSI", "sv-rSE", "th-rTH", "tr-rTR", "uk-rUA", "ur-rIN", "vi-rVN", "zh-rCN", "zh-rTW" diff --git a/mastodon/src/main/java/org/joinmastodon/android/api/requests/statuses/SetStatusPinned.java b/mastodon/src/main/java/org/joinmastodon/android/api/requests/statuses/SetStatusPinned.java new file mode 100644 index 00000000..e7c55e63 --- /dev/null +++ b/mastodon/src/main/java/org/joinmastodon/android/api/requests/statuses/SetStatusPinned.java @@ -0,0 +1,11 @@ +package org.joinmastodon.android.api.requests.statuses; + +import org.joinmastodon.android.api.MastodonAPIRequest; +import org.joinmastodon.android.model.Status; + +public class SetStatusPinned extends MastodonAPIRequest{ + public SetStatusPinned(String id, boolean pinned){ + super(HttpMethod.POST, "/statuses/"+id+"/"+(pinned ? "pin" : "unpin"), Status.class); + setRequestBody(new Object()); + } +} diff --git a/mastodon/src/main/java/org/joinmastodon/android/model/Status.java b/mastodon/src/main/java/org/joinmastodon/android/model/Status.java index 2cfb2506..955f5c9c 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/model/Status.java +++ b/mastodon/src/main/java/org/joinmastodon/android/model/Status.java @@ -60,7 +60,7 @@ public class Status extends BaseModel implements DisplayItemsParent{ public boolean reblogged; public boolean muted; public boolean bookmarked; - public boolean pinned; + public Boolean pinned; public transient boolean spoilerRevealed; public transient boolean hasGapAfter; diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/HeaderStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/HeaderStatusDisplayItem.java index be696f47..d4d5b49f 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/HeaderStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/HeaderStatusDisplayItem.java @@ -25,6 +25,7 @@ import org.joinmastodon.android.GlobalUserPreferences; import org.joinmastodon.android.R; import org.joinmastodon.android.api.requests.accounts.GetAccountRelationships; import org.joinmastodon.android.api.requests.statuses.GetStatusSourceText; +import org.joinmastodon.android.api.requests.statuses.SetStatusPinned; import org.joinmastodon.android.api.session.AccountSessionManager; import org.joinmastodon.android.fragments.AddAccountToListsFragment; import org.joinmastodon.android.fragments.BaseStatusListFragment; @@ -36,6 +37,7 @@ import org.joinmastodon.android.model.Attachment; import org.joinmastodon.android.model.Relationship; import org.joinmastodon.android.model.Status; import org.joinmastodon.android.ui.OutlineProviders; +import org.joinmastodon.android.ui.Snackbar; import org.joinmastodon.android.ui.text.HtmlParser; import org.joinmastodon.android.ui.utils.CustomEmojiHelper; import org.joinmastodon.android.ui.utils.UiUtils; @@ -208,6 +210,24 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{ }else if(id==R.id.copy_link){ activity.getSystemService(ClipboardManager.class).setPrimaryClip(ClipData.newPlainText(null, item.status.url)); UiUtils.maybeShowTextCopiedToast(activity); + }else if(id==R.id.pin){ + new SetStatusPinned(item.status.id, !item.status.pinned) + .setCallback(new Callback<>(){ + @Override + public void onSuccess(Status result){ + item.status.pinned=!item.status.pinned; + new Snackbar.Builder(activity) + .setText(item.status.pinned ? R.string.post_pinned : R.string.post_unpinned) + .show(); + } + + @Override + public void onError(ErrorResponse error){ + error.showToast(activity); + } + }) + .wrapProgress(activity, R.string.loading, true) + .exec(item.accountID); } return true; }); @@ -293,11 +313,17 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{ MenuItem report=menu.findItem(R.id.report); MenuItem follow=menu.findItem(R.id.follow); MenuItem bookmark=menu.findItem(R.id.bookmark); + MenuItem pin=menu.findItem(R.id.pin); if(item.status!=null){ bookmark.setVisible(true); bookmark.setTitle(item.status.bookmarked ? R.string.remove_bookmark : R.string.add_bookmark); + pin.setVisible(item.status.pinned!=null); + if(item.status.pinned!=null){ + pin.setTitle(item.status.pinned ? R.string.unpin_post : R.string.pin_post); + } }else{ bookmark.setVisible(false); + pin.setVisible(false); } if(isOwnPost){ mute.setVisible(false); diff --git a/mastodon/src/main/res/menu/post.xml b/mastodon/src/main/res/menu/post.xml index f9687e3b..628150d9 100644 --- a/mastodon/src/main/res/menu/post.xml +++ b/mastodon/src/main/res/menu/post.xml @@ -2,6 +2,7 @@ + diff --git a/mastodon/src/main/res/values/strings.xml b/mastodon/src/main/res/values/strings.xml index 71e7d30e..00fa3b4a 100644 --- a/mastodon/src/main/res/values/strings.xml +++ b/mastodon/src/main/res/values/strings.xml @@ -716,4 +716,8 @@ Home Explore Profile + Pin on profile + Unpin from profile + Post has been pinned + Post has been unpinned \ No newline at end of file