Skip to content

Commit eafb70e

Browse files
committed
Allow revoking quotes
1 parent 932ece3 commit eafb70e

File tree

5 files changed

+134
-4
lines changed

5 files changed

+134
-4
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.joinmastodon.android.api.requests.statuses;
2+
3+
import org.joinmastodon.android.api.MastodonAPIRequest;
4+
import org.joinmastodon.android.model.Status;
5+
6+
public class RevokeStatusQuote extends MastodonAPIRequest<Status>{
7+
public RevokeStatusQuote(String id, String quoteID){
8+
super(HttpMethod.POST, "/statuses/"+id+"/quotes/"+quoteID+"/revoke", Status.class);
9+
setRequestBody(new Object());
10+
}
11+
}

mastodon/src/main/java/org/joinmastodon/android/fragments/BaseNotificationsListFragment.java

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,12 @@
44
import android.view.LayoutInflater;
55
import android.view.View;
66

7+
import com.squareup.otto.Subscribe;
8+
9+
import org.joinmastodon.android.E;
710
import org.joinmastodon.android.R;
811
import org.joinmastodon.android.api.session.AccountSessionManager;
12+
import org.joinmastodon.android.events.StatusUpdatedEvent;
913
import org.joinmastodon.android.model.Account;
1014
import org.joinmastodon.android.model.NotificationType;
1115
import org.joinmastodon.android.model.Status;
@@ -27,6 +31,19 @@
2731
public abstract class BaseNotificationsListFragment extends BaseStatusListFragment<NotificationViewModel>{
2832
protected String maxID;
2933
protected View endMark;
34+
private EventListener eventListener=new EventListener();
35+
36+
@Override
37+
public void onCreate(Bundle savedInstanceState){
38+
super.onCreate(savedInstanceState);
39+
E.register(eventListener);
40+
}
41+
42+
@Override
43+
public void onDestroy(){
44+
super.onDestroy();
45+
E.unregister(eventListener);
46+
}
3047

3148
@Override
3249
protected List<StatusDisplayItem> buildDisplayItems(NotificationViewModel n){
@@ -155,4 +172,60 @@ protected View onCreateFooterView(LayoutInflater inflater){
155172
endMark.setVisibility(View.GONE);
156173
return v;
157174
}
175+
176+
public class EventListener{
177+
@Subscribe
178+
public void onStatusUpdated(StatusUpdatedEvent ev){
179+
Status status=ev.status;
180+
181+
ArrayList<NotificationViewModel> statusesForDisplayItems=new ArrayList<>();
182+
for(int i=0;i<data.size();i++){
183+
NotificationViewModel nvm=data.get(i);
184+
if(nvm.status==null)
185+
continue;
186+
Status s=nvm.status;
187+
if(s.id.equals(status.id)){
188+
nvm.status=status;
189+
statusesForDisplayItems.add(nvm);
190+
}
191+
}
192+
for(int i=0;i<preloadedData.size();i++){
193+
NotificationViewModel nvm=preloadedData.get(i);
194+
if(nvm.status!=null && nvm.status.id.equals(status.id)){
195+
nvm.status=status;
196+
}
197+
}
198+
199+
if(statusesForDisplayItems.isEmpty())
200+
return;
201+
202+
for(NotificationViewModel s:statusesForDisplayItems){
203+
int i=0;
204+
for(StatusDisplayItem item:displayItems){
205+
if(item.parentID.equals(s.getID())){
206+
int start=i;
207+
for(;i<displayItems.size();i++){
208+
if(!displayItems.get(i).parentID.equals(s.getID()))
209+
break;
210+
}
211+
List<StatusDisplayItem> postItems=displayItems.subList(start, i);
212+
postItems.clear();
213+
postItems.addAll(buildDisplayItems(s));
214+
int oldSize=i-start, newSize=postItems.size();
215+
if(oldSize==newSize){
216+
adapter.notifyItemRangeChanged(start, newSize);
217+
}else if(oldSize<newSize){
218+
adapter.notifyItemRangeChanged(start, oldSize);
219+
adapter.notifyItemRangeInserted(start+oldSize, newSize-oldSize);
220+
}else{
221+
adapter.notifyItemRangeChanged(start, newSize);
222+
adapter.notifyItemRangeRemoved(start+newSize, oldSize-newSize);
223+
}
224+
break;
225+
}
226+
i++;
227+
}
228+
}
229+
}
230+
}
158231
}

mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/HeaderStatusDisplayItem.java

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,23 +21,28 @@
2121
import android.widget.TextView;
2222
import android.widget.Toast;
2323

24+
import org.joinmastodon.android.E;
2425
import org.joinmastodon.android.GlobalUserPreferences;
2526
import org.joinmastodon.android.R;
2627
import org.joinmastodon.android.api.requests.statuses.GetStatusSourceText;
28+
import org.joinmastodon.android.api.requests.statuses.RevokeStatusQuote;
2729
import org.joinmastodon.android.api.requests.statuses.SetStatusConversationMuted;
2830
import org.joinmastodon.android.api.requests.statuses.SetStatusInteractionPolicies;
2931
import org.joinmastodon.android.api.requests.statuses.SetStatusPinned;
3032
import org.joinmastodon.android.api.session.AccountSessionManager;
33+
import org.joinmastodon.android.events.StatusUpdatedEvent;
3134
import org.joinmastodon.android.fragments.AddAccountToListsFragment;
3235
import org.joinmastodon.android.fragments.ComposeFragment;
3336
import org.joinmastodon.android.fragments.NotificationsListFragment;
3437
import org.joinmastodon.android.fragments.ProfileFragment;
3538
import org.joinmastodon.android.fragments.report.ReportReasonChoiceFragment;
3639
import org.joinmastodon.android.model.Account;
3740
import org.joinmastodon.android.model.Attachment;
41+
import org.joinmastodon.android.model.Quote;
3842
import org.joinmastodon.android.model.Relationship;
3943
import org.joinmastodon.android.model.Status;
4044
import org.joinmastodon.android.model.StatusPrivacy;
45+
import org.joinmastodon.android.ui.M3AlertDialogBuilder;
4146
import org.joinmastodon.android.ui.OutlineProviders;
4247
import org.joinmastodon.android.ui.Snackbar;
4348
import org.joinmastodon.android.ui.sheets.ComposerVisibilitySheet;
@@ -268,6 +273,29 @@ public void onError(ErrorResponse error){
268273
return false;
269274
});
270275
sheet.show();
276+
}else if(id==R.id.remove_quote){
277+
new M3AlertDialogBuilder(activity)
278+
.setTitle(R.string.remove_quote_confirm_title)
279+
.setMessage(R.string.remove_quote_confirm)
280+
.setPositiveButton(R.string.remove_quote_button, (dlg, which)->{
281+
new RevokeStatusQuote(item.status.quote.quotedStatus.id, item.status.id)
282+
.setCallback(new Callback<>(){
283+
@Override
284+
public void onSuccess(Status result){
285+
item.status.quote=result.quote;
286+
E.post(new StatusUpdatedEvent(item.status));
287+
}
288+
289+
@Override
290+
public void onError(ErrorResponse error){
291+
error.showToast(activity);
292+
}
293+
})
294+
.wrapProgress(activity, R.string.loading, true)
295+
.exec(item.accountID);
296+
})
297+
.setNegativeButton(R.string.cancel, null)
298+
.show();
271299
}
272300
return true;
273301
});
@@ -356,6 +384,7 @@ private void updateOptionsMenu(){
356384
MenuItem bookmark=menu.findItem(R.id.bookmark);
357385
MenuItem pin=menu.findItem(R.id.pin);
358386
MenuItem muteConversation=menu.findItem(R.id.mute_conversation);
387+
MenuItem removeQuote=menu.findItem(R.id.remove_quote);
359388
if(item.status!=null){
360389
bookmark.setVisible(true);
361390
bookmark.setTitle(item.status.bookmarked ? R.string.remove_bookmark : R.string.add_bookmark);
@@ -366,21 +395,33 @@ private void updateOptionsMenu(){
366395
}else{
367396
bookmark.setVisible(false);
368397
pin.setVisible(false);
398+
removeQuote.setVisible(false);
369399
}
370400
if(isOwnPost){
371401
mute.setVisible(false);
372402
block.setVisible(false);
373403
report.setVisible(false);
374404
follow.setVisible(false);
405+
removeQuote.setVisible(false);
375406
}else{
376407
mute.setVisible(true);
377408
block.setVisible(true);
378409
report.setVisible(true);
410+
411+
String truncatedName=account.displayName.length()>20 ? (account.displayName.substring(0, 15)+"…") : account.displayName;
412+
379413
follow.setVisible(relationship==null || relationship.following || (!relationship.blocking && !relationship.blockedBy && !relationship.domainBlocking && !relationship.muting));
380-
mute.setTitle(item.context.getString(relationship!=null && relationship.muting ? R.string.unmute_user : R.string.mute_user, account.displayName));
381-
block.setTitle(item.context.getString(relationship!=null && relationship.blocking ? R.string.unblock_user : R.string.block_user, account.displayName));
382-
report.setTitle(item.context.getString(R.string.report_user, account.displayName));
383-
follow.setTitle(item.context.getString(relationship!=null && relationship.following ? R.string.unfollow_user : R.string.follow_user, account.displayName));
414+
mute.setTitle(item.context.getString(relationship!=null && relationship.muting ? R.string.unmute_user : R.string.mute_user, truncatedName));
415+
block.setTitle(item.context.getString(relationship!=null && relationship.blocking ? R.string.unblock_user : R.string.block_user, truncatedName));
416+
report.setTitle(item.context.getString(R.string.report_user, truncatedName));
417+
follow.setTitle(item.context.getString(relationship!=null && relationship.following ? R.string.unfollow_user : R.string.follow_user, truncatedName));
418+
419+
if(item.status.quote!=null && item.status.quote.quotedStatus!=null && AccountSessionManager.getInstance().isSelf(item.accountID, item.status.quote.quotedStatus.account)){
420+
removeQuote.setVisible(true);
421+
removeQuote.setTitle(item.context.getString(R.string.remove_quote, truncatedName));
422+
}else{
423+
removeQuote.setVisible(false);
424+
}
384425
}
385426
if(item.status.muted!=null){
386427
muteConversation.setVisible(isOwnPost || item.callbacks instanceof NotificationsListFragment);

mastodon/src/main/res/menu/post.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
<group android:id="@+id/menu_group2">
1616
<item android:id="@+id/add_to_list" android:title="@string/add_user_to_list"/>
1717
<item android:id="@+id/follow" android:title="@string/follow_user"/>
18+
<item android:id="@+id/remove_quote"/>
1819
<item android:id="@+id/mute" android:title="@string/mute_user"/>
1920
<item android:id="@+id/block" android:title="@string/block_user"/>
2021
<item android:id="@+id/report" android:title="@string/report_user"/>

mastodon/src/main/res/values/strings.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -917,4 +917,8 @@
917917
<item quantity="one">%,d quote</item>
918918
<item quantity="other">%,d quotes</item>
919919
</plurals>
920+
<string name="remove_quote">Remove my post from %s\'s post</string>
921+
<string name="remove_quote_confirm_title">Remove post?</string>
922+
<string name="remove_quote_confirm">This action cannot be undone.</string>
923+
<string name="remove_quote_button">Remove post</string>
920924
</resources>

0 commit comments

Comments
 (0)