Add `moderation_warning` notifications (AND-175)
This commit is contained in:
parent
9e201f3c00
commit
1dc9adafc7
|
@ -282,6 +282,8 @@ public class CacheController{
|
||||||
group.mostRecentNotificationId=group.pageMaxId=group.pageMinId=n.id;
|
group.mostRecentNotificationId=group.pageMaxId=group.pageMinId=n.id;
|
||||||
group.latestPageNotificationAt=n.createdAt;
|
group.latestPageNotificationAt=n.createdAt;
|
||||||
group.sampleAccountIds=List.of(n.account.id);
|
group.sampleAccountIds=List.of(n.account.id);
|
||||||
|
group.event=n.event;
|
||||||
|
group.moderationWarning=n.moderationWarning;
|
||||||
if(n.status!=null)
|
if(n.status!=null)
|
||||||
group.statusId=n.status.id;
|
group.statusId=n.status.id;
|
||||||
NotificationViewModel nvm=new NotificationViewModel();
|
NotificationViewModel nvm=new NotificationViewModel();
|
||||||
|
|
|
@ -36,7 +36,7 @@ public abstract class BaseNotificationsListFragment extends BaseStatusListFragme
|
||||||
else
|
else
|
||||||
titleItem=null;
|
titleItem=null;
|
||||||
}else{
|
}else{
|
||||||
if(n.notification.type==NotificationType.SEVERED_RELATIONSHIPS)
|
if(n.notification.type==NotificationType.SEVERED_RELATIONSHIPS || n.notification.type==NotificationType.MODERATION_WARNING)
|
||||||
titleItem=new NotificationWithButtonStatusDisplayItem(n.getID(), this, n, accountID);
|
titleItem=new NotificationWithButtonStatusDisplayItem(n.getID(), this, n, accountID);
|
||||||
else
|
else
|
||||||
titleItem=new NotificationHeaderStatusDisplayItem(n.getID(), this, n, accountID);
|
titleItem=new NotificationHeaderStatusDisplayItem(n.getID(), this, n, accountID);
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
package org.joinmastodon.android.model;
|
||||||
|
|
||||||
|
import com.google.gson.annotations.SerializedName;
|
||||||
|
|
||||||
|
import org.joinmastodon.android.api.RequiredField;
|
||||||
|
import org.parceler.Parcel;
|
||||||
|
|
||||||
|
@Parcel
|
||||||
|
public class AccountWarning extends BaseModel{
|
||||||
|
@RequiredField
|
||||||
|
public String id;
|
||||||
|
@RequiredField
|
||||||
|
public Action action=Action.NONE;
|
||||||
|
public String text;
|
||||||
|
|
||||||
|
public enum Action{
|
||||||
|
@SerializedName("none")
|
||||||
|
NONE,
|
||||||
|
@SerializedName("disable")
|
||||||
|
DISABLE,
|
||||||
|
@SerializedName("mark_statuses_as_sensitive")
|
||||||
|
MARK_STATUSES_AS_SENSITIVE,
|
||||||
|
@SerializedName("delete_statuses")
|
||||||
|
DELETE_STATUSES,
|
||||||
|
@SerializedName("sensitive")
|
||||||
|
SENSITIVE,
|
||||||
|
@SerializedName("silence")
|
||||||
|
SILENCE,
|
||||||
|
@SerializedName("suspend")
|
||||||
|
SUSPEND
|
||||||
|
}
|
||||||
|
}
|
|
@ -19,6 +19,7 @@ public class Notification extends BaseModel implements DisplayItemsParent{
|
||||||
public Account account;
|
public Account account;
|
||||||
public Status status;
|
public Status status;
|
||||||
public RelationshipSeveranceEvent event;
|
public RelationshipSeveranceEvent event;
|
||||||
|
public AccountWarning moderationWarning;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void postprocess() throws ObjectValidationException{
|
public void postprocess() throws ObjectValidationException{
|
||||||
|
@ -34,7 +35,9 @@ public class Notification extends BaseModel implements DisplayItemsParent{
|
||||||
event=null;
|
event=null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(type!=NotificationType.SEVERED_RELATIONSHIPS && account==null){
|
if(moderationWarning!=null)
|
||||||
|
moderationWarning.postprocess();
|
||||||
|
if(type!=NotificationType.SEVERED_RELATIONSHIPS && type!=NotificationType.MODERATION_WARNING && account==null){
|
||||||
throw new ObjectValidationException("account must be present for type "+type);
|
throw new ObjectValidationException("account must be present for type "+type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,7 @@ public class NotificationGroup extends BaseModel{
|
||||||
public List<String> sampleAccountIds;
|
public List<String> sampleAccountIds;
|
||||||
public String statusId;
|
public String statusId;
|
||||||
public RelationshipSeveranceEvent event;
|
public RelationshipSeveranceEvent event;
|
||||||
// TODO moderation_warning
|
public AccountWarning moderationWarning;
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -36,7 +36,9 @@ public class NotificationGroup extends BaseModel{
|
||||||
event=null;
|
event=null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(type!=NotificationType.SEVERED_RELATIONSHIPS && sampleAccountIds.isEmpty()){
|
if(moderationWarning!=null)
|
||||||
|
moderationWarning.postprocess();
|
||||||
|
if(type!=NotificationType.SEVERED_RELATIONSHIPS && type!=NotificationType.MODERATION_WARNING && sampleAccountIds.isEmpty()){
|
||||||
throw new ObjectValidationException("sample_account_ids must be present for type "+type);
|
throw new ObjectValidationException("sample_account_ids must be present for type "+type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,9 @@ public enum NotificationType{
|
||||||
@SerializedName("update")
|
@SerializedName("update")
|
||||||
UPDATE,
|
UPDATE,
|
||||||
@SerializedName("severed_relationships")
|
@SerializedName("severed_relationships")
|
||||||
SEVERED_RELATIONSHIPS;
|
SEVERED_RELATIONSHIPS,
|
||||||
|
@SerializedName("moderation_warning")
|
||||||
|
MODERATION_WARNING;
|
||||||
|
|
||||||
public boolean canBeGrouped(){
|
public boolean canBeGrouped(){
|
||||||
return this==REBLOG || this==FAVORITE;
|
return this==REBLOG || this==FAVORITE;
|
||||||
|
|
|
@ -13,6 +13,7 @@ import android.widget.TextView;
|
||||||
import org.joinmastodon.android.R;
|
import org.joinmastodon.android.R;
|
||||||
import org.joinmastodon.android.api.session.AccountSessionManager;
|
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||||
import org.joinmastodon.android.fragments.BaseStatusListFragment;
|
import org.joinmastodon.android.fragments.BaseStatusListFragment;
|
||||||
|
import org.joinmastodon.android.model.AccountWarning;
|
||||||
import org.joinmastodon.android.model.NotificationType;
|
import org.joinmastodon.android.model.NotificationType;
|
||||||
import org.joinmastodon.android.model.RelationshipSeveranceEvent;
|
import org.joinmastodon.android.model.RelationshipSeveranceEvent;
|
||||||
import org.joinmastodon.android.model.viewmodel.NotificationViewModel;
|
import org.joinmastodon.android.model.viewmodel.NotificationViewModel;
|
||||||
|
@ -29,9 +30,9 @@ public class NotificationWithButtonStatusDisplayItem extends StatusDisplayItem{
|
||||||
public NotificationWithButtonStatusDisplayItem(String parentID, BaseStatusListFragment<?> parentFragment, NotificationViewModel notification, String accountID){
|
public NotificationWithButtonStatusDisplayItem(String parentID, BaseStatusListFragment<?> parentFragment, NotificationViewModel notification, String accountID){
|
||||||
super(parentID, parentFragment);
|
super(parentID, parentFragment);
|
||||||
this.notification=notification;
|
this.notification=notification;
|
||||||
|
String localDomain=AccountSessionManager.get(accountID).domain;
|
||||||
if(notification.notification.type==NotificationType.SEVERED_RELATIONSHIPS){
|
if(notification.notification.type==NotificationType.SEVERED_RELATIONSHIPS){
|
||||||
RelationshipSeveranceEvent event=notification.notification.event;
|
RelationshipSeveranceEvent event=notification.notification.event;
|
||||||
String localDomain=AccountSessionManager.get(accountID).domain;
|
|
||||||
if(event!=null){
|
if(event!=null){
|
||||||
text=switch(event.type){
|
text=switch(event.type){
|
||||||
case ACCOUNT_SUSPENSION -> replacePlaceholdersWithBoldStrings(parentFragment.getString(R.string.relationship_severance_account_suspension,
|
case ACCOUNT_SUSPENSION -> replacePlaceholdersWithBoldStrings(parentFragment.getString(R.string.relationship_severance_account_suspension,
|
||||||
|
@ -48,6 +49,23 @@ public class NotificationWithButtonStatusDisplayItem extends StatusDisplayItem{
|
||||||
}
|
}
|
||||||
buttonText=parentFragment.getString(R.string.relationship_severance_learn_more);
|
buttonText=parentFragment.getString(R.string.relationship_severance_learn_more);
|
||||||
buttonAction=()->UiUtils.launchWebBrowser(parentFragment.getActivity(), "https://"+localDomain+"/severed_relationships");
|
buttonAction=()->UiUtils.launchWebBrowser(parentFragment.getActivity(), "https://"+localDomain+"/severed_relationships");
|
||||||
|
}else if(notification.notification.type==NotificationType.MODERATION_WARNING){
|
||||||
|
AccountWarning warning=notification.notification.moderationWarning;
|
||||||
|
if(warning!=null){
|
||||||
|
text=parentFragment.getString(switch(warning.action){
|
||||||
|
case NONE -> R.string.moderation_warning_action_none;
|
||||||
|
case DISABLE -> R.string.moderation_warning_action_disable;
|
||||||
|
case MARK_STATUSES_AS_SENSITIVE -> R.string.moderation_warning_action_mark_statuses_as_sensitive;
|
||||||
|
case DELETE_STATUSES -> R.string.moderation_warning_action_delete_statuses;
|
||||||
|
case SENSITIVE -> R.string.moderation_warning_action_sensitive;
|
||||||
|
case SILENCE -> R.string.moderation_warning_action_silence;
|
||||||
|
case SUSPEND -> R.string.moderation_warning_action_suspend;
|
||||||
|
});
|
||||||
|
buttonAction=()->UiUtils.launchWebBrowser(parentFragment.getActivity(), "https://"+localDomain+"/disputes/strikes/"+warning.id);
|
||||||
|
}else{
|
||||||
|
text="???";
|
||||||
|
}
|
||||||
|
buttonText=parentFragment.getString(R.string.moderation_warning_learn_more);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,6 +104,7 @@ public class NotificationWithButtonStatusDisplayItem extends StatusDisplayItem{
|
||||||
public void onBind(NotificationWithButtonStatusDisplayItem item){
|
public void onBind(NotificationWithButtonStatusDisplayItem item){
|
||||||
icon.setImageResource(switch(item.notification.notification.type){
|
icon.setImageResource(switch(item.notification.notification.type){
|
||||||
case SEVERED_RELATIONSHIPS -> R.drawable.ic_heart_broken_fill1_24px;
|
case SEVERED_RELATIONSHIPS -> R.drawable.ic_heart_broken_fill1_24px;
|
||||||
|
case MODERATION_WARNING -> R.drawable.ic_gavel_24px;
|
||||||
default -> throw new IllegalStateException("Unexpected value: " + item.notification.notification.type);
|
default -> throw new IllegalStateException("Unexpected value: " + item.notification.notification.type);
|
||||||
});
|
});
|
||||||
icon.setImageTintList(ColorStateList.valueOf(UiUtils.getThemeColor(itemView.getContext(), R.attr.colorM3Outline)));
|
icon.setImageTintList(ColorStateList.valueOf(UiUtils.getThemeColor(itemView.getContext(), R.attr.colorM3Outline)));
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="960"
|
||||||
|
android:viewportHeight="960">
|
||||||
|
<path
|
||||||
|
android:fillColor="@android:color/white"
|
||||||
|
android:pathData="M160,840L160,760L640,760L640,840L160,840ZM386,646L160,420L244,334L472,560L386,646ZM640,392L414,164L500,80L726,306L640,392ZM824,800L302,278L358,222L880,744L824,800Z"/>
|
||||||
|
</vector>
|
|
@ -808,4 +808,12 @@
|
||||||
<!-- %1$s is the domain that was blocked, %2$,d is the follower count, %3$s is the `x_accounts` plural string -->
|
<!-- %1$s is the domain that was blocked, %2$,d is the follower count, %3$s is the `x_accounts` plural string -->
|
||||||
<string name="relationship_severance_user_domain_block">You have blocked %1$s, removing %2$,d of your followers and %3$s you follow.</string>
|
<string name="relationship_severance_user_domain_block">You have blocked %1$s, removing %2$,d of your followers and %3$s you follow.</string>
|
||||||
<string name="relationship_severance_learn_more">Learn more</string>
|
<string name="relationship_severance_learn_more">Learn more</string>
|
||||||
|
<string name="moderation_warning_action_none">Your account has received a moderation warning.</string>
|
||||||
|
<string name="moderation_warning_action_disable">Your account has been disabled.</string>
|
||||||
|
<string name="moderation_warning_action_mark_statuses_as_sensitive">Some of your posts have been marked as sensitive.</string>
|
||||||
|
<string name="moderation_warning_action_delete_statuses">Some of your posts have been removed.</string>
|
||||||
|
<string name="moderation_warning_action_sensitive">Your posts will be marked as sensitive from now on.</string>
|
||||||
|
<string name="moderation_warning_action_silence">Your account has been limited.</string>
|
||||||
|
<string name="moderation_warning_action_suspend">Your account has been suspended.</string>
|
||||||
|
<string name="moderation_warning_learn_more">Learn more</string>
|
||||||
</resources>
|
</resources>
|
Loading…
Reference in New Issue