Implement post notifications button
This commit is contained in:
parent
ae50e618c0
commit
b166ca705e
|
@ -4,10 +4,10 @@ import org.joinmastodon.android.api.MastodonAPIRequest;
|
||||||
import org.joinmastodon.android.model.Relationship;
|
import org.joinmastodon.android.model.Relationship;
|
||||||
|
|
||||||
public class SetAccountFollowed extends MastodonAPIRequest<Relationship>{
|
public class SetAccountFollowed extends MastodonAPIRequest<Relationship>{
|
||||||
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);
|
super(HttpMethod.POST, "/accounts/"+id+"/"+(followed ? "follow" : "unfollow"), Relationship.class);
|
||||||
if(followed)
|
if(followed)
|
||||||
setRequestBody(new Request(showReblogs, null));
|
setRequestBody(new Request(showReblogs, notify));
|
||||||
else
|
else
|
||||||
setRequestBody(new Object());
|
setRequestBody(new Object());
|
||||||
}
|
}
|
||||||
|
|
|
@ -99,6 +99,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||||
private View avatarBorder;
|
private View avatarBorder;
|
||||||
private TextView name, username, bio, followersCount, followersLabel, followingCount, followingLabel, postsCount, postsLabel;
|
private TextView name, username, bio, followersCount, followersLabel, followingCount, followingLabel, postsCount, postsLabel;
|
||||||
private ProgressBarButton actionButton;
|
private ProgressBarButton actionButton;
|
||||||
|
private Button notifyButton;
|
||||||
private ViewPager2 pager;
|
private ViewPager2 pager;
|
||||||
private NestedRecyclerScrollView scrollView;
|
private NestedRecyclerScrollView scrollView;
|
||||||
private AccountTimelineFragment postsFragment, postsWithRepliesFragment, mediaFragment;
|
private AccountTimelineFragment postsFragment, postsWithRepliesFragment, mediaFragment;
|
||||||
|
@ -181,6 +182,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||||
postsLabel=content.findViewById(R.id.posts_label);
|
postsLabel=content.findViewById(R.id.posts_label);
|
||||||
postsBtn=content.findViewById(R.id.posts_btn);
|
postsBtn=content.findViewById(R.id.posts_btn);
|
||||||
actionButton=content.findViewById(R.id.profile_action_btn);
|
actionButton=content.findViewById(R.id.profile_action_btn);
|
||||||
|
notifyButton=content.findViewById(R.id.notify_btn);
|
||||||
pager=content.findViewById(R.id.pager);
|
pager=content.findViewById(R.id.pager);
|
||||||
scrollView=content.findViewById(R.id.scroller);
|
scrollView=content.findViewById(R.id.scroller);
|
||||||
tabbar=content.findViewById(R.id.tabbar);
|
tabbar=content.findViewById(R.id.tabbar);
|
||||||
|
@ -256,6 +258,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||||
});
|
});
|
||||||
|
|
||||||
actionButton.setOnClickListener(this::onActionButtonClick);
|
actionButton.setOnClickListener(this::onActionButtonClick);
|
||||||
|
notifyButton.setOnClickListener(this::onNotifyButtonClick);
|
||||||
avatar.setOnClickListener(this::onAvatarClick);
|
avatar.setOnClickListener(this::onAvatarClick);
|
||||||
cover.setOnClickListener(this::onCoverClick);
|
cover.setOnClickListener(this::onCoverClick);
|
||||||
refreshLayout.setOnRefreshListener(this);
|
refreshLayout.setOnRefreshListener(this);
|
||||||
|
@ -454,6 +457,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||||
|
|
||||||
if(AccountSessionManager.getInstance().isSelf(accountID, account)){
|
if(AccountSessionManager.getInstance().isSelf(accountID, account)){
|
||||||
actionButton.setText(R.string.edit_profile);
|
actionButton.setText(R.string.edit_profile);
|
||||||
|
notifyButton.setVisibility(View.GONE);
|
||||||
}else{
|
}else{
|
||||||
actionButton.setVisibility(View.GONE);
|
actionButton.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
|
@ -566,7 +570,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||||
updateRelationship();
|
updateRelationship();
|
||||||
});
|
});
|
||||||
}else if(id==R.id.hide_boosts){
|
}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<>(){
|
.setCallback(new Callback<>(){
|
||||||
@Override
|
@Override
|
||||||
public void onSuccess(Relationship result){
|
public void onSuccess(Relationship result){
|
||||||
|
@ -614,6 +618,8 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||||
UiUtils.setRelationshipToActionButton(relationship, actionButton);
|
UiUtils.setRelationshipToActionButton(relationship, actionButton);
|
||||||
actionProgress.setIndeterminateTintList(actionButton.getTextColors());
|
actionProgress.setIndeterminateTintList(actionButton.getTextColors());
|
||||||
followsYouView.setVisibility(relationship.followedBy ? View.VISIBLE : View.GONE);
|
followsYouView.setVisibility(relationship.followedBy ? View.VISIBLE : View.GONE);
|
||||||
|
notifyButton.setVisibility(relationship.following ? View.VISIBLE : View.GONE);
|
||||||
|
notifyButton.setSelected(relationship.notifying);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onScrollChanged(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY){
|
private void onScrollChanged(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY){
|
||||||
|
@ -847,6 +853,10 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
|
||||||
return Collections.singletonList(att);
|
return Collections.singletonList(att);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void onNotifyButtonClick(View v) {
|
||||||
|
UiUtils.performToggleAccountNotifications(getActivity(), account, accountID, relationship, actionButton, this::updateRelationship);
|
||||||
|
}
|
||||||
|
|
||||||
private void onAvatarClick(View v){
|
private void onAvatarClick(View v){
|
||||||
if(isInEditMode){
|
if(isInEditMode){
|
||||||
startImagePicker(AVATAR_RESULT);
|
startImagePicker(AVATAR_RESULT);
|
||||||
|
|
|
@ -353,7 +353,7 @@ public abstract class BaseAccountListFragment extends BaseRecyclerFragment<BaseA
|
||||||
bindRelationship();
|
bindRelationship();
|
||||||
});
|
});
|
||||||
}else if(id==R.id.hide_boosts){
|
}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<>(){
|
.setCallback(new Callback<>(){
|
||||||
@Override
|
@Override
|
||||||
public void onSuccess(Relationship result){
|
public void onSuccess(Relationship result){
|
||||||
|
|
|
@ -125,7 +125,7 @@ public class ReportDoneFragment extends MastodonToolbarFragment{
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onUnfollowClick(){
|
private void onUnfollowClick(){
|
||||||
new SetAccountFollowed(reportAccount.id, false, false)
|
new SetAccountFollowed(reportAccount.id, false, false, false)
|
||||||
.setCallback(new Callback<>(){
|
.setCallback(new Callback<>(){
|
||||||
@Override
|
@Override
|
||||||
public void onSuccess(Relationship result){
|
public void onSuccess(Relationship result){
|
||||||
|
|
|
@ -11,7 +11,6 @@ import android.content.res.TypedArray;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.graphics.Canvas;
|
import android.graphics.Canvas;
|
||||||
import android.graphics.Typeface;
|
|
||||||
import android.graphics.drawable.BitmapDrawable;
|
import android.graphics.drawable.BitmapDrawable;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.graphics.drawable.InsetDrawable;
|
import android.graphics.drawable.InsetDrawable;
|
||||||
|
@ -435,6 +434,22 @@ public class UiUtils{
|
||||||
ta.recycle();
|
ta.recycle();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void performToggleAccountNotifications(Activity activity, Account account, String accountID, Relationship relationship, Button button, Consumer<Relationship> resultCallback) {
|
||||||
|
new SetAccountFollowed(account.id, true, relationship.showingReblogs, !relationship.notifying)
|
||||||
|
.setCallback(new Callback<>() {
|
||||||
|
@Override
|
||||||
|
public void onSuccess(Relationship result) {
|
||||||
|
resultCallback.accept(result);
|
||||||
|
Toast.makeText(activity, activity.getString(result.notifying ? R.string.user_post_notifications_on : R.string.user_post_notifications_off, '@'+account.username), Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onError(ErrorResponse error) {
|
||||||
|
error.showToast(activity);
|
||||||
|
}
|
||||||
|
}).exec(accountID);
|
||||||
|
}
|
||||||
|
|
||||||
public static void performAccountAction(Activity activity, Account account, String accountID, Relationship relationship, Button button, Consumer<Boolean> progressCallback, Consumer<Relationship> resultCallback){
|
public static void performAccountAction(Activity activity, Account account, String accountID, Relationship relationship, Button button, Consumer<Boolean> progressCallback, Consumer<Relationship> resultCallback){
|
||||||
if(relationship.blocking){
|
if(relationship.blocking){
|
||||||
confirmToggleBlockUser(activity, accountID, account, true, resultCallback);
|
confirmToggleBlockUser(activity, accountID, account, true, resultCallback);
|
||||||
|
@ -442,7 +457,7 @@ public class UiUtils{
|
||||||
confirmToggleMuteUser(activity, accountID, account, true, resultCallback);
|
confirmToggleMuteUser(activity, accountID, account, true, resultCallback);
|
||||||
}else{
|
}else{
|
||||||
progressCallback.accept(true);
|
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<>(){
|
.setCallback(new Callback<>(){
|
||||||
@Override
|
@Override
|
||||||
public void onSuccess(Relationship result){
|
public void onSuccess(Relationship result){
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||||
|
<path android:pathData="M9.042 19.003h5.916c-0.238 1.418-1.472 2.498-2.958 2.498-1.486 0-2.72-1.08-2.958-2.498zm2.958-17c4.142 0 7.5 3.359 7.5 7.5v4l1.418 3.16c0.055 0.122 0.084 0.254 0.084 0.389 0 0.524-0.426 0.95-0.95 0.95h-16.1c-0.134 0-0.266-0.029-0.388-0.083-0.479-0.215-0.693-0.777-0.479-1.256l1.415-3.16V9.49l0.005-0.25C4.644 5.211 7.955 2.004 12 2.004z" android:fillColor="@color/fluent_default_icon_tint"/>
|
||||||
|
</vector>
|
|
@ -0,0 +1,3 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
|
||||||
|
<path android:pathData="M12 1.996c4.05 0 7.357 3.195 7.496 7.25l0.004 0.25v4.097l1.38 3.156c0.07 0.158 0.105 0.329 0.105 0.5 0 0.691-0.56 1.25-1.25 1.25L15 18.502c0 1.657-1.343 3-3 3-1.598 0-2.904-1.249-2.995-2.823L9 18.499H4.275c-0.171 0-0.34-0.034-0.498-0.103-0.633-0.275-0.924-1.01-0.649-1.644L4.5 13.594V9.496c0-4.155 3.352-7.5 7.5-7.5zM13.5 18.5l-3 0.002c0 0.829 0.672 1.5 1.5 1.5 0.78 0 1.42-0.595 1.493-1.355L13.5 18.5zM12 3.496c-3.32 0-6 2.674-6 6v4.41L4.656 17h14.697L18 13.907V9.509l-0.003-0.225C17.885 6.05 15.242 3.496 12 3.496z" android:fillColor="@color/fluent_default_icon_tint"/>
|
||||||
|
</vector>
|
|
@ -0,0 +1,8 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--~ Copyright (c) 2022. ~ Microsoft Corporation. All rights reserved.-->
|
||||||
|
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item android:drawable="@drawable/ic_fluent_alert_24_filled" android:state_activated="true"/>
|
||||||
|
<item android:drawable="@drawable/ic_fluent_alert_24_filled" android:state_checked="true"/>
|
||||||
|
<item android:drawable="@drawable/ic_fluent_alert_24_filled" android:state_selected="true"/>
|
||||||
|
<item android:drawable="@drawable/ic_fluent_alert_24_regular"/>
|
||||||
|
</selector>
|
|
@ -166,31 +166,46 @@
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<FrameLayout
|
<LinearLayout
|
||||||
android:id="@+id/profile_action_btn_wrap"
|
android:id="@+id/profile_action_btn_wrap"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_alignParentEnd="true"
|
|
||||||
android:layout_below="@id/profile_counters"
|
android:layout_below="@id/profile_counters"
|
||||||
android:padding="16dp"
|
android:layout_alignParentEnd="true"
|
||||||
android:clipToPadding="false">
|
android:clipToPadding="false"
|
||||||
|
android:padding="16dp">
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/notify_btn"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginRight="8dp"
|
||||||
|
android:paddingHorizontal="8dp"
|
||||||
|
android:drawableStart="@drawable/ic_fluent_alert_24_selector"
|
||||||
|
style="@style/Widget.Mastodon.Button.Secondary_LightOnDark" />
|
||||||
|
|
||||||
|
<FrameLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
<org.joinmastodon.android.ui.views.ProgressBarButton
|
<org.joinmastodon.android.ui.views.ProgressBarButton
|
||||||
android:id="@+id/profile_action_btn"
|
android:id="@+id/profile_action_btn"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
tools:text="Edit Profile"/>
|
tools:text="Edit Profile" />
|
||||||
|
|
||||||
<ProgressBar
|
<ProgressBar
|
||||||
android:id="@+id/action_progress"
|
android:id="@+id/action_progress"
|
||||||
|
style="?android:progressBarStyleSmall"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="center"
|
android:layout_gravity="center"
|
||||||
android:indeterminate="true"
|
|
||||||
style="?android:progressBarStyleSmall"
|
|
||||||
android:elevation="10dp"
|
android:elevation="10dp"
|
||||||
android:outlineProvider="none"
|
android:indeterminate="true"
|
||||||
android:indeterminateTint="?colorButtonText"
|
android:indeterminateTint="?colorButtonText"
|
||||||
android:visibility="gone"/>
|
android:outlineProvider="none"
|
||||||
|
android:visibility="gone" />
|
||||||
</FrameLayout>
|
</FrameLayout>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/name"
|
android:id="@+id/name"
|
||||||
|
|
|
@ -284,6 +284,8 @@
|
||||||
<string name="open_in_browser">Beitrag im Browser öffnen</string>
|
<string name="open_in_browser">Beitrag im Browser öffnen</string>
|
||||||
<string name="hide_boosts_from_user">Verberge geteilte Beiträge von %s</string>
|
<string name="hide_boosts_from_user">Verberge geteilte Beiträge von %s</string>
|
||||||
<string name="show_boosts_from_user">Zeige geteilte Beiträge von %s</string>
|
<string name="show_boosts_from_user">Zeige geteilte Beiträge von %s</string>
|
||||||
|
<string name="user_post_notifications_on">Benachrichtigungen über neue Beiträge von %s aktiviert</string>
|
||||||
|
<string name="user_post_notifications_off">Benachrichtigungen über neue Beiträge von %s deaktiviert</string>
|
||||||
<string name="signup_reason">Weshalb möchtest du beitreten?</string>
|
<string name="signup_reason">Weshalb möchtest du beitreten?</string>
|
||||||
<string name="signup_reason_note">Dies wird uns dabei helfen, deine Anmeldungsanfrage besser zu verarbeiten.</string>
|
<string name="signup_reason_note">Dies wird uns dabei helfen, deine Anmeldungsanfrage besser zu verarbeiten.</string>
|
||||||
<string name="clear">Löschen</string>
|
<string name="clear">Löschen</string>
|
||||||
|
|
|
@ -290,6 +290,8 @@
|
||||||
<string name="open_in_browser">Open in browser</string>
|
<string name="open_in_browser">Open in browser</string>
|
||||||
<string name="hide_boosts_from_user">Hide reblogs from %s</string>
|
<string name="hide_boosts_from_user">Hide reblogs from %s</string>
|
||||||
<string name="show_boosts_from_user">Show reblogs from %s</string>
|
<string name="show_boosts_from_user">Show reblogs from %s</string>
|
||||||
|
<string name="user_post_notifications_on">Notifying about posts by %s</string>
|
||||||
|
<string name="user_post_notifications_off">No longer notifying about posts by %s</string>
|
||||||
<string name="signup_reason">why do you want to join?</string>
|
<string name="signup_reason">why do you want to join?</string>
|
||||||
<string name="signup_reason_note">This will help us review your application.</string>
|
<string name="signup_reason_note">This will help us review your application.</string>
|
||||||
<string name="clear">Clear</string>
|
<string name="clear">Clear</string>
|
||||||
|
|
Loading…
Reference in New Issue