Quote when composing

This commit is contained in:
Thomas 2025-08-23 17:27:06 +02:00
parent 5accc101f7
commit cc5f18beec
11 changed files with 80 additions and 14 deletions

View file

@ -156,6 +156,7 @@ public class ComposeActivity extends BaseActivity implements ComposeAdapter.Mana
private Uri photoFileUri;
private ScheduledStatus scheduledStatus;
private String visibility;
private String quote_approval_policy;
private Account accountMention;
private String statusReplyId;
private Account mentionBooster;
@ -287,7 +288,7 @@ public class ComposeActivity extends BaseActivity implements ComposeAdapter.Mana
statusList.addAll(0, context.ancestors);
statusList.add(initialStatus);
statusList.add(statusDraft.statusDraftList.get(0));
composeAdapter = new ComposeAdapter(statusList, context.ancestors.size(), account, accountMention, visibility, editMessageId);
composeAdapter = new ComposeAdapter(statusList, context.ancestors.size(), account, accountMention, visibility, quote_approval_policy, editMessageId);
composeAdapter.mediaDescriptionCallBack = this;
composeAdapter.promptDraftListener = this;
composeAdapter.manageDrafts = this;
@ -526,6 +527,10 @@ public class ComposeActivity extends BaseActivity implements ComposeAdapter.Mana
} else if (visibility == null && Helper.getCurrentAccount(ComposeActivity.this) != null && Helper.getCurrentAccount(ComposeActivity.this).mastodon_account != null && Helper.getCurrentAccount(ComposeActivity.this).mastodon_account.source != null) {
visibility = Helper.getCurrentAccount(ComposeActivity.this).mastodon_account.source.privacy;
}
if (quote_approval_policy == null && Helper.getCurrentAccount(ComposeActivity.this) != null && Helper.getCurrentAccount(ComposeActivity.this).mastodon_account != null && Helper.getCurrentAccount(ComposeActivity.this).mastodon_account.source != null) {
quote_approval_policy = Helper.getCurrentAccount(ComposeActivity.this).mastodon_account.source.quote_authorizations;
}
if(setMentionBooster) {
mentionBooster = (Account) b.getSerializable(Helper.ARG_MENTION_BOOSTER);
} else {
@ -569,6 +574,7 @@ public class ComposeActivity extends BaseActivity implements ComposeAdapter.Mana
status.sensitive = scheduledStatus.params.sensitive;
status.spoiler_text = scheduledStatus.params.spoiler_text;
status.visibility = scheduledStatus.params.visibility;
status.quote_approval_policy = scheduledStatus.params.quote_approval_policy;
statuses.add(status);
statusDraft.statusDraftList = statuses;
}
@ -636,7 +642,7 @@ public class ComposeActivity extends BaseActivity implements ComposeAdapter.Mana
}
int statusCount = statusList.size();
statusList.addAll(statusDraft.statusDraftList);
composeAdapter = new ComposeAdapter(statusList, statusCount, account, accountMention, visibility, editMessageId);
composeAdapter = new ComposeAdapter(statusList, statusCount, account, accountMention, visibility, quote_approval_policy, editMessageId);
composeAdapter.mediaDescriptionCallBack = this;
composeAdapter.manageDrafts = this;
composeAdapter.promptDraftListener = this;
@ -709,7 +715,7 @@ public class ComposeActivity extends BaseActivity implements ComposeAdapter.Mana
}
//StatusDraftList at this point should only have one element
statusList.addAll(statusDraftList);
composeAdapter = new ComposeAdapter(statusList, statusCount, account, accountMention, visibility, editMessageId);
composeAdapter = new ComposeAdapter(statusList, statusCount, account, accountMention, visibility, quote_approval_policy, editMessageId);
composeAdapter.mediaDescriptionCallBack = this;
composeAdapter.manageDrafts = this;
composeAdapter.promptDraftListener = this;
@ -724,7 +730,7 @@ public class ComposeActivity extends BaseActivity implements ComposeAdapter.Mana
statusDraftList.get(0).quote_id = statusQuoted.id;
//StatusDraftList at this point should only have one element
statusList.addAll(statusDraftList);
composeAdapter = new ComposeAdapter(statusList, statusCount, account, accountMention, visibility, editMessageId);
composeAdapter = new ComposeAdapter(statusList, statusCount, account, accountMention, visibility, quote_approval_policy, editMessageId);
composeAdapter.mediaDescriptionCallBack = this;
composeAdapter.manageDrafts = this;
composeAdapter.promptDraftListener = this;
@ -734,7 +740,7 @@ public class ComposeActivity extends BaseActivity implements ComposeAdapter.Mana
} else {
//Compose without replying
statusList.addAll(statusDraftList);
composeAdapter = new ComposeAdapter(statusList, 0, account, accountMention, visibility, editMessageId);
composeAdapter = new ComposeAdapter(statusList, 0, account, accountMention, visibility,quote_approval_policy, editMessageId);
composeAdapter.mediaDescriptionCallBack = this;
composeAdapter.manageDrafts = this;
composeAdapter.promptDraftListener = this;

View file

@ -64,6 +64,8 @@ public interface MastodonStatusesService {
@Field("spoiler_text") String spoiler_text,
@Field("visibility") String visibility,
@Field("language") String language,
@Field("quote_approval_policy") String quote_approval_policy,
@Field("quoted_status_id") String quoted_status_id,
@Field("quote_id") String quote_id,
@Field("content_type") String content_type,
@Field("local_only") Boolean local_only

View file

@ -42,6 +42,8 @@ public class ScheduledStatus implements Serializable {
public String spoiler_text;
@SerializedName("visibility")
public String visibility;
@SerializedName("quote_approval_policy")
public String quote_approval_policy;
@SerializedName("scheduled_at")
public Date scheduled_at;
@SerializedName("poll")

View file

@ -22,6 +22,8 @@ import java.util.List;
public class Source implements Serializable {
@SerializedName("privacy")
public String privacy;
@SerializedName("quote_authorizations")
public String quote_authorizations;
@SerializedName("sensitive")
public boolean sensitive;
@SerializedName("language")
@ -36,6 +38,8 @@ public class Source implements Serializable {
public static class SourceParams implements Serializable {
@SerializedName("privacy")
public String privacy;
@SerializedName("quote_authorizations")
public String quote_authorizations;
@SerializedName("sensitive")
public boolean sensitive;
@SerializedName("language")

View file

@ -55,10 +55,13 @@ public class Status implements Serializable, Cloneable {
public String text;
@SerializedName("quote_id")
public String quote_id;
@SerializedName("content_type")
public String content_type;
@SerializedName("visibility")
public String visibility;
@SerializedName("quote_approval_policy")
public String quote_approval_policy;
@SerializedName("language")
public String language;
@SerializedName("uri")

View file

@ -33,10 +33,15 @@ public class StatusParams implements Serializable {
public String in_reply_to_id;
@SerializedName("sensitive")
public Boolean sensitive;
@SerializedName("spoiler_text")
public String spoiler_text;
@SerializedName("visibility")
public String visibility;
@SerializedName("quote_approval_policy")
public String quote_approval_policy;
@SerializedName("quoted_status_id")
public String quoted_status_id;
@SerializedName("language")
public String language;
@SerializedName("media_attributes")

View file

@ -572,6 +572,22 @@ public class MastodonHelper {
HEADER
}
public enum quote_visibility {
@SerializedName("PUBLIC")
PUBLIC("public"),
@SerializedName("FOLLOWERS")
FOLLOWERS("followers"),
@SerializedName("NOBODY")
NOBODY("nobody");
private final String value;
quote_visibility(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
public enum visibility {
@SerializedName("PUBLIC")
PUBLIC("public"),

View file

@ -261,7 +261,7 @@ public class ComposeWorker extends Worker {
if (dataPost.scheduledDate == null) {
if (dataPost.statusEditId == null) {
statusCall = mastodonStatusesService.createStatus(null, dataPost.token, statuses.get(i).text, attachmentIds, poll_options, poll_expire_in,
poll_multiple, poll_hide_totals, statuses.get(i).quote_id == null ? in_reply_to_status : null, statuses.get(i).sensitive, statuses.get(i).spoilerChecked ? statuses.get(i).spoiler_text : null, statuses.get(i).visibility.toLowerCase(), statuses.get(i).language, statuses.get(i).quote_id, statuses.get(i).content_type, statuses.get(i).local_only);
poll_multiple, poll_hide_totals, statuses.get(i).quote_id == null ? in_reply_to_status : null, statuses.get(i).sensitive, statuses.get(i).spoilerChecked ? statuses.get(i).spoiler_text : null, statuses.get(i).visibility.toLowerCase(), statuses.get(i).language, statuses.get(i).quote_approval_policy.toLowerCase(), statuses.get(i).quote_id, statuses.get(i).quote_id, statuses.get(i).content_type, statuses.get(i).local_only);
} else { //Status is edited
StatusParams statusParams = new StatusParams();
statusParams.status = statuses.get(i).text;
@ -277,6 +277,8 @@ public class ComposeWorker extends Worker {
statusParams.sensitive = statuses.get(i).sensitive;
statusParams.spoiler_text = statuses.get(i).spoilerChecked ? statuses.get(i).spoiler_text : null;
statusParams.visibility = statuses.get(i).visibility.toLowerCase();
statusParams.quoted_status_id = statuses.get(i).quote_id.toLowerCase();
statusParams.quote_approval_policy = statuses.get(i).quote_approval_policy.toLowerCase();
statusParams.language = statuses.get(i).language;
statusParams.media_attributes = media_attributes;
statusCall = mastodonStatusesService.updateStatus(null, dataPost.token,

View file

@ -167,6 +167,7 @@ public class ComposeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
private final int TYPE_NORMAL = 0;
private final BaseAccount account;
private final String visibility;
private final String quote_approval_policy;
private final Account mentionedAccount;
private final String editMessageId;
public ManageDrafts manageDrafts;
@ -182,12 +183,13 @@ public class ComposeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
private boolean splitChoiceDone = false;
public ComposeAdapter(List<Status> statusList, int statusCount, BaseAccount account, Account mentionedAccount, String visibility, String editMessageId) {
public ComposeAdapter(List<Status> statusList, int statusCount, BaseAccount account, Account mentionedAccount, String visibility, String quote_approval_policy, String editMessageId) {
this.statusList = statusList;
this.statusCount = statusCount;
this.account = account;
this.mentionedAccount = mentionedAccount;
this.visibility = visibility;
this.quote_approval_policy = quote_approval_policy;
this.editMessageId = editMessageId;
}
@ -1624,6 +1626,9 @@ public class ComposeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
if (visibility != null && statusDraft.visibility == null) {
statusDraft.visibility = visibility;
}
if(quote_approval_policy != null && statusDraft.quote_approval_policy == null) {
statusDraft.quote_approval_policy = quote_approval_policy;
}
boolean unlistedReplies = sharedpreferences.getBoolean(context.getString(R.string.SET_UNLISTED_REPLIES), true);
if (statusDraft.visibility == null) {
if (position > 0) {
@ -1639,7 +1644,9 @@ public class ComposeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
} else if (!unlisted_changed && position > 0 && position == statusCount && unlistedReplies && statusDraft.visibility.equalsIgnoreCase("public") && statusList.size() > 1) {
statusDraft.visibility = "unlisted";
}
if( statusDraft.quote_approval_policy == null) { //Set a default value
statusDraft.quote_approval_policy = MastodonHelper.quote_visibility.PUBLIC.name();
}
switch (statusDraft.visibility.toLowerCase()) {
case "public" -> {
holder.binding.buttonVisibility.setIconResource(R.drawable.ic_compose_visibility_public);
@ -1663,6 +1670,24 @@ public class ComposeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
}
}
switch (statusDraft.quote_approval_policy.toLowerCase()) {
case "public" -> {
holder.binding.buttonQuoteApprovalPolicy.setIconResource(R.drawable.ic_compose_visibility_public);
statusDraft.quote_approval_policy = MastodonHelper.quote_visibility.PUBLIC.name();
}
case "followers" -> {
holder.binding.buttonQuoteApprovalPolicy.setIconResource(R.drawable.ic_baseline_people_alt_24);
statusDraft.quote_approval_policy = MastodonHelper.quote_visibility.FOLLOWERS.name();
}
case "nobody" -> {
holder.binding.buttonQuoteApprovalPolicy.setIconResource(R.drawable.ic_baseline_block_24);
statusDraft.quote_approval_policy = MastodonHelper.quote_visibility.NOBODY.name();
}
}
holder.binding.visibilityPanel.setOnTouchListener((view, motionEvent) -> true);
holder.binding.buttonCloseAttachmentPanel.setOnClickListener(v -> holder.binding.attachmentChoicesPanel.setVisibility(View.GONE));
holder.binding.buttonVisibility.setOnClickListener(v -> {
@ -1706,17 +1731,17 @@ public class ComposeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
holder.binding.buttonQuoteApprovalPolicyNoOne.setOnClickListener(v -> {
holder.binding.quoteApprovalPolicyPanel.setVisibility(View.GONE);
holder.binding.buttonQuoteApprovalPolicy.setIconResource(R.drawable.ic_baseline_block_24);
// Todo: statusDraft.visibility = nobody
statusDraft.quote_approval_policy = MastodonHelper.quote_visibility.NOBODY.name();
});
holder.binding.buttonQuoteApprovalPolicyFollowersOnly.setOnClickListener(v -> {
holder.binding.quoteApprovalPolicyPanel.setVisibility(View.GONE);
holder.binding.buttonQuoteApprovalPolicy.setIconResource(R.drawable.ic_baseline_people_alt_24);
// Todo: statusDraft.visibility = followers
statusDraft.quote_approval_policy = MastodonHelper.quote_visibility.FOLLOWERS.name();
});
holder.binding.buttonQuoteApprovalPolicyAnyone.setOnClickListener(v -> {
holder.binding.quoteApprovalPolicyPanel.setVisibility(View.GONE);
holder.binding.buttonQuoteApprovalPolicy.setIconResource(R.drawable.ic_compose_visibility_public);
// Todo: statusDraft.visibility = public
statusDraft.quote_approval_policy = MastodonHelper.quote_visibility.PUBLIC.name();
});
if (statusDraft.spoilerChecked || statusDraft.spoiler_text != null && !statusDraft.spoiler_text.trim().isEmpty()) {

View file

@ -188,6 +188,7 @@ public class StatusesVM extends AndroidViewModel {
String spoiler_text,
String visibility,
String language,
String quote_approval_policy,
String quote_id,
String content_type,
Boolean local_only) {
@ -195,7 +196,7 @@ public class StatusesVM extends AndroidViewModel {
statusMutableLiveData = new MutableLiveData<>();
new Thread(() -> {
Call<Status> statusCall = mastodonStatusesService.createStatus(idempotency_Key, token, text, media_ids, poll_options, poll_expire_in,
poll_multiple, poll_hide_totals, in_reply_to_id, sensitive, spoiler_text, visibility, language, quote_id, content_type, local_only);
poll_multiple, poll_hide_totals, in_reply_to_id, sensitive, spoiler_text, visibility, language, quote_approval_policy, quote_id, quote_id, content_type, local_only);
Status status = null;
if (statusCall != null) {
try {

View file

@ -2046,7 +2046,7 @@ public class PeertubeActivity extends BasePeertubeActivity implements CommentLis
viewModelComment.comment(ADD_COMMENT, peertube.getId(), null, commentStr).observe(PeertubeActivity.this, apiResponse1 -> manageVIewPostActions(ADD_COMMENT, 0, apiResponse1));
} else {//Remote account is posting a message
StatusesVM statusesVM = new ViewModelProvider(PeertubeActivity.this).get(StatusesVM.class);
statusesVM.postStatus(currentInstance, currentToken, null, commentStr, null, null, null, null, null, status.id, false, null, "public", null, null, null, null).observe(PeertubeActivity.this, this::manageVIewPostActionsMastodon);
statusesVM.postStatus(currentInstance, currentToken, null, commentStr, null, null, null, null, null, status.id, false, null, "public", null, null, null, null, null).observe(PeertubeActivity.this, this::manageVIewPostActionsMastodon);
}
binding.addCommentWrite.setText("");
}
@ -2058,7 +2058,7 @@ public class PeertubeActivity extends BasePeertubeActivity implements CommentLis
viewModelComment.comment(REPLY, peertube.getId(), comment.getId(), commentView).observe(PeertubeActivity.this, apiResponse1 -> manageVIewPostActions(REPLY, position, apiResponse1));
} else {//Remote account is posting a message
StatusesVM statusesVM = new ViewModelProvider(PeertubeActivity.this).get(StatusesVM.class);
statusesVM.postStatus(currentInstance, currentToken, null, commentView, null, null, null, null, null, status.id, false, null, "public", null, null, null, null).observe(PeertubeActivity.this, this::manageVIewPostActionsMastodon);
statusesVM.postStatus(currentInstance, currentToken, null, commentView, null, null, null, null, null, status.id, false, null, "public", null, null, null, null, null).observe(PeertubeActivity.this, this::manageVIewPostActionsMastodon);
}
binding.addCommentWrite.setText("");
}