This commit is contained in:
Grishka
2022-03-31 20:54:49 +03:00
parent c60bc253e5
commit 10655e4c98
20 changed files with 171 additions and 25 deletions

View File

@@ -0,0 +1,24 @@
package org.joinmastodon.android.api;
import com.google.gson.annotations.SerializedName;
import java.util.EnumSet;
import java.util.List;
import java.util.stream.Collectors;
public class ApiUtils{
private ApiUtils(){
//no instance
}
public static <E extends Enum<E>> List<String> enumSetToStrings(EnumSet<E> e, Class<E> cls){
return e.stream().map(ev->{
try{
SerializedName annotation=cls.getField(ev.name()).getAnnotation(SerializedName.class);
return annotation!=null ? annotation.value() : ev.name().toLowerCase();
}catch(NoSuchFieldException x){
throw new RuntimeException(x);
}
}).collect(Collectors.toList());
}
}

View File

@@ -129,7 +129,7 @@ public class CacheController{
Log.w(TAG, "getNotifications: corrupted notification object in database", x);
}
}
new GetNotifications(maxID, count, onlyMentions ? EnumSet.complementOf(EnumSet.of(Notification.Type.MENTION)): null)
new GetNotifications(maxID, count, onlyMentions ? EnumSet.of(Notification.Type.MENTION): EnumSet.allOf(Notification.Type.class))
.setCallback(new Callback<>(){
@Override
public void onSuccess(List<Notification> result){

View File

@@ -4,6 +4,7 @@ import android.app.Activity;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.net.Uri;
import android.util.Log;
import android.util.Pair;
import com.google.gson.reflect.TypeToken;
@@ -16,6 +17,7 @@ import org.joinmastodon.android.model.Token;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -27,6 +29,7 @@ import okhttp3.Call;
import okhttp3.RequestBody;
public abstract class MastodonAPIRequest<T> extends APIRequest<T>{
private static final String TAG="MastodonAPIRequest";
private String domain;
private AccountSession account;
@@ -41,6 +44,7 @@ public abstract class MastodonAPIRequest<T> extends APIRequest<T>{
boolean canceled;
Map<String, String> headers;
private ProgressDialog progressDialog;
protected boolean removeUnsupportedItems;
public MastodonAPIRequest(HttpMethod method, String path, Class<T> respClass){
this.path=path;
@@ -150,9 +154,29 @@ public abstract class MastodonAPIRequest<T> extends APIRequest<T>{
if(respObj instanceof BaseModel){
((BaseModel) respObj).postprocess();
}else if(respObj instanceof List){
for(Object item : ((List) respObj)){
if(item instanceof BaseModel)
((BaseModel) item).postprocess();
if(removeUnsupportedItems){
Iterator<?> itr=((List<?>) respObj).iterator();
while(itr.hasNext()){
Object item=itr.next();
if(item instanceof BaseModel){
try{
((BaseModel) item).postprocess();
}catch(ObjectValidationException x){
Log.w(TAG, "Removing invalid object from list", x);
itr.remove();
}
}
}
for(Object item:((List<?>) respObj)){
if(item instanceof BaseModel){
((BaseModel) item).postprocess();
}
}
}else{
for(Object item:((List<?>) respObj)){
if(item instanceof BaseModel)
((BaseModel) item).postprocess();
}
}
}
}

View File

@@ -3,6 +3,7 @@ package org.joinmastodon.android.api.requests.notifications;
import com.google.gson.annotations.SerializedName;
import com.google.gson.reflect.TypeToken;
import org.joinmastodon.android.api.ApiUtils;
import org.joinmastodon.android.api.MastodonAPIRequest;
import org.joinmastodon.android.model.Notification;
@@ -10,18 +11,20 @@ import java.util.EnumSet;
import java.util.List;
public class GetNotifications extends MastodonAPIRequest<List<Notification>>{
public GetNotifications(String maxID, int limit, EnumSet<Notification.Type> excludeTypes){
public GetNotifications(String maxID, int limit, EnumSet<Notification.Type> includeTypes){
super(HttpMethod.GET, "/notifications", new TypeToken<>(){});
if(maxID!=null)
addQueryParameter("max_id", maxID);
if(limit>0)
addQueryParameter("limit", ""+limit);
if(excludeTypes!=null){
for(Notification.Type nt:excludeTypes){
try{
addQueryParameter("exclude_types[]", nt.getDeclaringClass().getField(nt.name()).getAnnotation(SerializedName.class).value());
}catch(NoSuchFieldException ignore){}
if(includeTypes!=null){
for(String type:ApiUtils.enumSetToStrings(includeTypes, Notification.Type.class)){
addQueryParameter("types[]", type);
}
for(String type:ApiUtils.enumSetToStrings(EnumSet.complementOf(includeTypes), Notification.Type.class)){
addQueryParameter("exclude_types[]", type);
}
}
removeUnsupportedItems=true;
}
}