From 3972ab207ce18b6be5eb436c0b0563ea73bfe238 Mon Sep 17 00:00:00 2001 From: Grishka Date: Mon, 11 Mar 2024 13:18:45 +0300 Subject: [PATCH] New post notifications (AND-151) --- .../requests/accounts/SetAccountFollowed.java | 4 +-- .../android/fragments/ProfileFragment.java | 30 +++++++++++++++++-- .../OnboardingFollowSuggestionsFragment.java | 2 +- .../fragments/report/ReportDoneFragment.java | 3 +- .../android/ui/utils/UiUtils.java | 8 +---- .../ui/viewholders/AccountViewHolder.java | 5 +--- mastodon/src/main/res/menu/profile.xml | 9 +++++- mastodon/src/main/res/values/strings.xml | 5 ++++ 8 files changed, 46 insertions(+), 20 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/api/requests/accounts/SetAccountFollowed.java b/mastodon/src/main/java/org/joinmastodon/android/api/requests/accounts/SetAccountFollowed.java index e38479f18..1799120a9 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/api/requests/accounts/SetAccountFollowed.java +++ b/mastodon/src/main/java/org/joinmastodon/android/api/requests/accounts/SetAccountFollowed.java @@ -4,10 +4,10 @@ import org.joinmastodon.android.api.MastodonAPIRequest; import org.joinmastodon.android.model.Relationship; public class SetAccountFollowed extends MastodonAPIRequest{ - public SetAccountFollowed(String id, boolean followed, boolean showReblogs){ + public SetAccountFollowed(String id, boolean followed, boolean showReblogs, boolean notify){ super(HttpMethod.POST, "/accounts/"+id+"/"+(followed ? "follow" : "unfollow"), Relationship.class); if(followed) - setRequestBody(new Request(showReblogs, null)); + setRequestBody(new Request(showReblogs, notify)); else setRequestBody(new Object()); } 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 700548b31..32dee77b3 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ProfileFragment.java @@ -20,7 +20,6 @@ import android.os.Build; import android.os.Bundle; import android.text.SpannableString; import android.text.SpannableStringBuilder; -import android.text.SpannedString; import android.text.TextUtils; import android.text.style.ForegroundColorSpan; import android.text.style.ImageSpan; @@ -29,7 +28,6 @@ import android.transition.Fade; import android.transition.Transition; import android.transition.TransitionManager; import android.transition.TransitionSet; -import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -67,6 +65,7 @@ import org.joinmastodon.android.ui.M3AlertDialogBuilder; import org.joinmastodon.android.ui.OutlineProviders; import org.joinmastodon.android.ui.SimpleViewHolder; import org.joinmastodon.android.ui.SingleImagePhotoViewerListener; +import org.joinmastodon.android.ui.Snackbar; import org.joinmastodon.android.ui.photoviewer.PhotoViewer; import org.joinmastodon.android.ui.sheets.DecentralizationExplainerSheet; import org.joinmastodon.android.ui.tabs.TabLayout; @@ -635,6 +634,13 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList menu.findItem(R.id.block_domain).setVisible(false); menu.findItem(R.id.add_to_list).setVisible(relationship.following); + if(relationship.following){ + MenuItem notifications=menu.findItem(R.id.notifications); + notifications.setVisible(true); + notifications.setIcon(relationship.notifying ? R.drawable.ic_notifications_fill1_24px : R.drawable.ic_notifications_24px); + notifications.setTitle(getString(relationship.notifying ? R.string.disable_new_post_notifications : R.string.enable_new_post_notifications, account.getDisplayUsername())); + } + if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.P && !UiUtils.isEMUI()){ menu.setGroupDividerEnabled(true); } @@ -663,7 +669,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList updateRelationship(); }, this::updateRelationship); }else if(id==R.id.hide_boosts){ - new SetAccountFollowed(account.id, true, !relationship.showingReblogs) + new SetAccountFollowed(account.id, true, !relationship.showingReblogs, relationship.notifying) .setCallback(new Callback<>(){ @Override public void onSuccess(Relationship result){ @@ -693,6 +699,24 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList args.putString("account", accountID); args.putParcelable("targetAccount", Parcels.wrap(account)); Nav.go(getActivity(), AddAccountToListsFragment.class, args); + }else if(id==R.id.notifications){ + new SetAccountFollowed(account.id, true, relationship.showingReblogs, !relationship.notifying) + .setCallback(new Callback<>(){ + @Override + public void onSuccess(Relationship result){ + updateRelationship(result); + new Snackbar.Builder(getActivity()) + .setText(result.notifying ? R.string.new_post_notifications_enabled : R.string.new_post_notifications_disabled) + .show(); + } + + @Override + public void onError(ErrorResponse error){ + error.showToast(getActivity()); + } + }) + .wrapProgress(getActivity(), R.string.loading, false) + .exec(accountID); } return true; } diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/onboarding/OnboardingFollowSuggestionsFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/onboarding/OnboardingFollowSuggestionsFragment.java index ea8741356..dc9f946e4 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/onboarding/OnboardingFollowSuggestionsFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/onboarding/OnboardingFollowSuggestionsFragment.java @@ -133,7 +133,7 @@ public class OnboardingFollowSuggestionsFragment extends BaseAccountListFragment } numRunningFollowRequests++; String id=accountIdsToFollow.remove(0); - new SetAccountFollowed(id, true, true) + new SetAccountFollowed(id, true, true, false) .setCallback(new Callback<>(){ @Override public void onSuccess(Relationship result){ diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/report/ReportDoneFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/report/ReportDoneFragment.java index 64c13d87d..eea647654 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/report/ReportDoneFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/report/ReportDoneFragment.java @@ -34,7 +34,6 @@ import me.grishka.appkit.api.Callback; import me.grishka.appkit.api.ErrorResponse; import me.grishka.appkit.imageloader.ViewImageLoader; import me.grishka.appkit.imageloader.requests.UrlImageLoaderRequest; -import me.grishka.appkit.utils.CubicBezierInterpolator; import me.grishka.appkit.utils.V; public class ReportDoneFragment extends MastodonToolbarFragment{ @@ -177,7 +176,7 @@ public class ReportDoneFragment extends MastodonToolbarFragment{ } private void onUnfollowClick(){ - new SetAccountFollowed(reportAccount.id, false, false) + new SetAccountFollowed(reportAccount.id, false, false, false) .setCallback(new Callback<>(){ @Override public void onSuccess(Relationship result){ diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java b/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java index c616ff44e..10df920cc 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java @@ -26,8 +26,6 @@ import android.os.SystemClock; import android.os.ext.SdkExtensions; import android.provider.MediaStore; import android.provider.OpenableColumns; -import android.system.ErrnoException; -import android.system.Os; import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.TextUtils; @@ -37,7 +35,6 @@ import android.transition.ChangeScroll; import android.transition.Fade; import android.transition.TransitionManager; import android.transition.TransitionSet; -import android.util.Log; import android.view.Gravity; import android.view.LayoutInflater; import android.view.Menu; @@ -47,17 +44,14 @@ import android.view.ViewGroup; import android.view.WindowInsets; import android.webkit.MimeTypeMap; import android.widget.Button; -import android.widget.FrameLayout; import android.widget.PopupMenu; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; -import android.widget.Toolbar; import org.joinmastodon.android.E; import org.joinmastodon.android.FileProvider; import org.joinmastodon.android.GlobalUserPreferences; -import org.joinmastodon.android.MainActivity; import org.joinmastodon.android.MastodonApp; import org.joinmastodon.android.R; import org.joinmastodon.android.api.requests.accounts.SetAccountBlocked; @@ -590,7 +584,7 @@ public class UiUtils{ }else{ Runnable action=()->{ progressCallback.accept(true); - new SetAccountFollowed(account.id, !relationship.following && !relationship.requested, true) + new SetAccountFollowed(account.id, !relationship.following && !relationship.requested, true, false) .setCallback(new Callback<>(){ @Override public void onSuccess(Relationship result){ diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/viewholders/AccountViewHolder.java b/mastodon/src/main/java/org/joinmastodon/android/ui/viewholders/AccountViewHolder.java index 81f09569e..980fa506e 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/viewholders/AccountViewHolder.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/viewholders/AccountViewHolder.java @@ -3,8 +3,6 @@ package org.joinmastodon.android.ui.viewholders; import android.annotation.SuppressLint; import android.app.Activity; import android.app.Fragment; -import android.app.ProgressDialog; -import android.content.Intent; import android.content.res.ColorStateList; import android.graphics.drawable.Animatable; import android.graphics.drawable.Drawable; @@ -15,7 +13,6 @@ import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.widget.Button; import android.widget.CheckBox; import android.widget.ImageButton; import android.widget.ImageView; @@ -254,7 +251,7 @@ public class AccountViewHolder extends BindableViewHolder impl bindRelationship(); }, this::updateRelationship); }else if(id==R.id.hide_boosts){ - new SetAccountFollowed(account.id, true, !relationship.showingReblogs) + new SetAccountFollowed(account.id, true, !relationship.showingReblogs, relationship.notifying) .setCallback(new Callback<>(){ @Override public void onSuccess(Relationship result){ diff --git a/mastodon/src/main/res/menu/profile.xml b/mastodon/src/main/res/menu/profile.xml index 2321e2395..52c04c014 100644 --- a/mastodon/src/main/res/menu/profile.xml +++ b/mastodon/src/main/res/menu/profile.xml @@ -1,5 +1,12 @@ - + + + diff --git a/mastodon/src/main/res/values/strings.xml b/mastodon/src/main/res/values/strings.xml index 00fa3b4a1..43dfa0c90 100644 --- a/mastodon/src/main/res/values/strings.xml +++ b/mastodon/src/main/res/values/strings.xml @@ -720,4 +720,9 @@ Unpin from profile Post has been pinned Post has been unpinned + + Notify me when %s posts + Stop notifying me when %s posts + You’ll get notifications for new posts. + You’ll no longer get notifications for new posts. \ No newline at end of file