feat(StatusDisplayItem): hide statuses with quotes of muted/blocked
accounts Hides Statuses with non-official quotes of accounts that are blocked/muted. This is equivalent to how misskey handles muted quotes. Closes https://github.com/LucasGGamerM/moshidon/issues/488.
This commit is contained in:
parent
55259f103d
commit
dbef984908
2 changed files with 76 additions and 31 deletions
|
@ -9,6 +9,7 @@ import android.graphics.Rect;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.util.Pair;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.view.WindowInsets;
|
import android.view.WindowInsets;
|
||||||
|
@ -709,26 +710,17 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateStatusWithQuote(DisplayItemsParent parent) {
|
public void updateStatusWithQuote(DisplayItemsParent parent) {
|
||||||
int startIndex=-1;
|
Pair<Integer, Integer> items=findAllItemsOfParent(parent);
|
||||||
int endIndex=-1;
|
if (items==null)
|
||||||
for(int i=0; i<displayItems.size(); i++){
|
|
||||||
StatusDisplayItem item = displayItems.get(i);
|
|
||||||
if(item.parentID.equals(parent.getID())) {
|
|
||||||
startIndex= startIndex==-1 ? i : startIndex;
|
|
||||||
endIndex=i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (startIndex==-1 || endIndex==-1)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Only StatusListFragments/NotificationsListFragments can display status with quotes
|
// Only StatusListFragments/NotificationsListFragments can display status with quotes
|
||||||
assert (this instanceof StatusListFragment) || (this instanceof NotificationsListFragment);
|
assert (this instanceof StatusListFragment) || (this instanceof NotificationsListFragment);
|
||||||
List<StatusDisplayItem> oldItems = displayItems.subList(startIndex, endIndex+1);
|
List<StatusDisplayItem> oldItems = displayItems.subList(items.first, items.second+1);
|
||||||
List<StatusDisplayItem> newItems=this.buildDisplayItems((T) parent);
|
List<StatusDisplayItem> newItems=this.buildDisplayItems((T) parent);
|
||||||
int prevSize=oldItems.size();
|
int prevSize=oldItems.size();
|
||||||
oldItems.clear();
|
oldItems.clear();
|
||||||
displayItems.addAll(startIndex, newItems);
|
displayItems.addAll(items.first, newItems);
|
||||||
|
|
||||||
// Update the cache
|
// Update the cache
|
||||||
final CacheController cache=AccountSessionManager.get(accountID).getCacheController();
|
final CacheController cache=AccountSessionManager.get(accountID).getCacheController();
|
||||||
|
@ -738,8 +730,19 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
|
||||||
cache.updateNotification((Notification) parent);
|
cache.updateNotification((Notification) parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
adapter.notifyItemRangeRemoved(startIndex, prevSize);
|
adapter.notifyItemRangeRemoved(items.first, prevSize);
|
||||||
adapter.notifyItemRangeInserted(startIndex, newItems.size());
|
adapter.notifyItemRangeInserted(items.first, newItems.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeStatus(DisplayItemsParent parent) {
|
||||||
|
Pair<Integer, Integer> items=findAllItemsOfParent(parent);
|
||||||
|
if (items==null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
List<StatusDisplayItem> statusDisplayItems = displayItems.subList(items.first, items.second+1);
|
||||||
|
int prevSize=statusDisplayItems.size();
|
||||||
|
statusDisplayItems.clear();
|
||||||
|
adapter.notifyItemRangeRemoved(items.first, prevSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onVisibilityIconClick(HeaderStatusDisplayItem.Holder holder) {
|
public void onVisibilityIconClick(HeaderStatusDisplayItem.Holder holder) {
|
||||||
|
@ -943,6 +946,23 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
protected Pair<Integer, Integer> findAllItemsOfParent(DisplayItemsParent parent){
|
||||||
|
int startIndex=-1;
|
||||||
|
int endIndex=-1;
|
||||||
|
for(int i=0; i<displayItems.size(); i++){
|
||||||
|
StatusDisplayItem item = displayItems.get(i);
|
||||||
|
if(item.parentID.equals(parent.getID())) {
|
||||||
|
startIndex= startIndex==-1 ? i : startIndex;
|
||||||
|
endIndex=i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(startIndex==-1 || endIndex==-1)
|
||||||
|
return null;
|
||||||
|
return Pair.create(startIndex, endIndex);
|
||||||
|
}
|
||||||
|
|
||||||
protected <I extends StatusDisplayItem, H extends StatusDisplayItem.Holder<I>> List<H> findAllHoldersOfType(String id, Class<H> type){
|
protected <I extends StatusDisplayItem, H extends StatusDisplayItem.Holder<I>> List<H> findAllHoldersOfType(String id, Class<H> type){
|
||||||
ArrayList<H> holders=new ArrayList<>();
|
ArrayList<H> holders=new ArrayList<>();
|
||||||
for(int i=0;i<list.getChildCount();i++){
|
for(int i=0;i<list.getChildCount();i++){
|
||||||
|
|
|
@ -17,6 +17,7 @@ import android.view.ViewGroup;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
import org.joinmastodon.android.R;
|
import org.joinmastodon.android.R;
|
||||||
|
import org.joinmastodon.android.api.requests.accounts.GetAccountRelationships;
|
||||||
import org.joinmastodon.android.api.requests.search.GetSearchResults;
|
import org.joinmastodon.android.api.requests.search.GetSearchResults;
|
||||||
import org.joinmastodon.android.api.session.AccountLocalPreferences;
|
import org.joinmastodon.android.api.session.AccountLocalPreferences;
|
||||||
import org.joinmastodon.android.api.session.AccountSessionManager;
|
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||||
|
@ -35,6 +36,7 @@ import org.joinmastodon.android.model.FilterResult;
|
||||||
import org.joinmastodon.android.model.LegacyFilter;
|
import org.joinmastodon.android.model.LegacyFilter;
|
||||||
import org.joinmastodon.android.model.Notification;
|
import org.joinmastodon.android.model.Notification;
|
||||||
import org.joinmastodon.android.model.Poll;
|
import org.joinmastodon.android.model.Poll;
|
||||||
|
import org.joinmastodon.android.model.Relationship;
|
||||||
import org.joinmastodon.android.model.ScheduledStatus;
|
import org.joinmastodon.android.model.ScheduledStatus;
|
||||||
import org.joinmastodon.android.model.SearchResults;
|
import org.joinmastodon.android.model.SearchResults;
|
||||||
import org.joinmastodon.android.model.Status;
|
import org.joinmastodon.android.model.Status;
|
||||||
|
@ -428,15 +430,39 @@ public abstract class StatusDisplayItem{
|
||||||
return;
|
return;
|
||||||
String quoteURL=matcher.group();
|
String quoteURL=matcher.group();
|
||||||
|
|
||||||
if (UiUtils.looksLikeFediverseUrl(quoteURL)) {
|
if (!UiUtils.looksLikeFediverseUrl(quoteURL))
|
||||||
|
return;
|
||||||
|
|
||||||
new GetSearchResults(quoteURL, GetSearchResults.Type.STATUSES, true, null, 0, 0).setCallback(new Callback<>(){
|
new GetSearchResults(quoteURL, GetSearchResults.Type.STATUSES, true, null, 0, 0).setCallback(new Callback<>(){
|
||||||
@Override
|
@Override
|
||||||
public void onSuccess(SearchResults results){
|
public void onSuccess(SearchResults results){
|
||||||
AccountSessionManager.get(accountID).filterStatuses(results.statuses, filterContext);
|
AccountSessionManager.get(accountID).filterStatuses(results.statuses, filterContext);
|
||||||
if (!results.statuses.isEmpty()){
|
if (results.statuses.isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
Status quote=results.statuses.get(0);
|
||||||
|
new GetAccountRelationships(Collections.singletonList(quote.account.id))
|
||||||
|
.setCallback(new Callback<>(){
|
||||||
|
@Override
|
||||||
|
public void onSuccess(List<Relationship> relationships){
|
||||||
|
if(relationships.isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
Relationship relationship=relationships.get(0);
|
||||||
|
if(relationship.domainBlocking || relationship.muting || relationship.blocking) {
|
||||||
|
// do not show posts that are quoting a muted/blocked user
|
||||||
|
fragment.removeStatus(status);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
status.quote=results.statuses.get(0);
|
status.quote=results.statuses.get(0);
|
||||||
fragment.updateStatusWithQuote(status);
|
fragment.updateStatusWithQuote(status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onError(ErrorResponse error){}
|
||||||
|
})
|
||||||
|
.exec(accountID);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -445,7 +471,6 @@ public abstract class StatusDisplayItem{
|
||||||
}
|
}
|
||||||
}).exec(accountID);
|
}).exec(accountID);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
public enum Type{
|
public enum Type{
|
||||||
HEADER,
|
HEADER,
|
||||||
|
|
Loading…
Add table
Reference in a new issue