Loading README.md +4 −0 Original line number Diff line number Diff line Loading @@ -189,6 +189,10 @@ public interface API { @GET("user") Observable<UserInfo> user(); // use ParsedResponse, in case you also need the response headers. Works currently only for Observable calls. @GET("user") Observable<ParsedResponse<UserInfo>> user(); @POST("feeds") Call<List<Feed>> createFeed(@Body Map<String, Object> feedMap); Loading src/main/java/com/nextcloud/android/sso/api/NextcloudAPI.java +27 −22 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import com.google.gson.Gson; import com.nextcloud.android.sso.aidl.NextcloudRequest; import com.nextcloud.android.sso.model.SingleSignOnAccount; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; Loading @@ -47,7 +48,6 @@ public class NextcloudAPI { private NetworkRequest networkRequest; private Gson gson; @Documented @Target(METHOD) @Retention(RUNTIME) Loading Loading @@ -91,17 +91,40 @@ public class NextcloudAPI { }); } public <T> Observable<ParsedResponse<T>> performRequestObservableV2(final Type type, final NextcloudRequest request) { return Observable.fromPublisher( s-> { try { Response response = performNetworkRequestV2(request); s.onNext(ParsedResponse.of(convertStreamToTargetEntity(response.getBody(), type), response.getPlainHeaders())); s.onComplete(); } catch (Exception e) { s.onError(e); } }); } public <T> T performRequest(final @NonNull Type type, NextcloudRequest request) throws Exception { Log.d(TAG, "performRequest() called with: type = [" + type + "], request = [" + request + "]"); return convertStreamToTargetEntity(performNetworkRequest(request), type); } public <T> T performRequestV2(final @NonNull Type type, NextcloudRequest request) throws Exception { Log.d(TAG, "performRequestV2() called with: type = [" + type + "], request = [" + request + "]"); Response response = performNetworkRequestV2(request); return convertStreamToTargetEntity(response.getBody(), type); } private <T> T convertStreamToTargetEntity(InputStream inputStream, Type targetEntity) throws IOException { T result = null; try (InputStream os = performNetworkRequest(request); try (InputStream os = inputStream; Reader targetReader = new InputStreamReader(os)) { if (type != Void.class) { result = gson.fromJson(targetReader, type); if (targetEntity != Void.class) { result = gson.fromJson(targetReader, targetEntity); /* if (result != null) { Log.d(TAG, result.toString()); } */ } } return result; Loading @@ -119,24 +142,6 @@ public class NextcloudAPI { return networkRequest.performNetworkRequest(request, request.getBodyAsStream()); } public Response performRequestV2(final @NonNull Type type, NextcloudRequest request) throws Exception { Log.d(TAG, "performRequestV2() called with: type = [" + type + "], request = [" + request + "]"); Response result = null; Response response = performNetworkRequestV2(request); Reader targetReader = new InputStreamReader(response.getBody()); if (type != Void.class) { result = gson.fromJson(targetReader, type); if (result != null) { Log.d(TAG, result.toString()); } } return result; } /** * The InputStreams needs to be closed after reading from it * Loading src/main/java/com/nextcloud/android/sso/api/NextcloudRetrofitServiceMethod.java +11 −4 Original line number Diff line number Diff line Loading @@ -179,20 +179,27 @@ public class NextcloudRetrofitServiceMethod<T> { // Streaming if(typeArgument == ResponseBody.class) { return (T) Observable.just(Okhttp3Helper.getResponseBodyFromRequest(nextcloudAPI, request)); } else { return (T) nextcloudAPI.performRequestObservable(typeArgument, request); } else if (typeArgument instanceof ParameterizedType) { ParameterizedType innerType = (ParameterizedType) typeArgument; Type innerOwnerType = innerType.getRawType(); if(innerOwnerType == ParsedResponse.class) { return (T) nextcloudAPI.performRequestObservableV2(innerType.getActualTypeArguments()[0], request); } } //fallback return (T) nextcloudAPI.performRequestObservableV2(typeArgument, request).map(r -> r.getResponse()); } else if(ownerType == Call.class) { Type typeArgument = type.getActualTypeArguments()[0]; return (T) Retrofit2Helper.WrapInCall(nextcloudAPI, request, typeArgument); } } else if(this.returnType == Observable.class) { return (T) nextcloudAPI.performRequestObservable(Object.class, request); return (T) nextcloudAPI.performRequestObservableV2(Object.class, request).map(r -> r.getResponse()); } else if (this.returnType == Completable.class) { return (T) ReactivexHelper.wrapInCompletable(nextcloudAPI, request); } return nextcloudAPI.performRequest(this.returnType, request); return nextcloudAPI.performRequestV2(this.returnType, request); } private void addHeader(NextcloudRequest.Builder rBuilder, String key, Object value) { Loading src/main/java/com/nextcloud/android/sso/api/ParsedResponse.java 0 → 100644 +35 −0 Original line number Diff line number Diff line package com.nextcloud.android.sso.api; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; public class ParsedResponse <T> { private T response; private Map<String, String> headers = new HashMap<>(); public ParsedResponse(T response, ArrayList<AidlNetworkRequest.PlainHeader> headers) { this.response = response; if (headers!= null) { for (AidlNetworkRequest.PlainHeader header : headers) { this.headers.put(header.getName(), header.getValue()); } } } public static <T> ParsedResponse<T> of(T data) { return new ParsedResponse<>(data, null); } public static <T> ParsedResponse<T> of(T data, ArrayList<AidlNetworkRequest.PlainHeader> headers) { return new ParsedResponse<T>(data, headers); } public T getResponse() { return response; } public Map<String, String> getHeaders() { return headers; } } src/main/java/com/nextcloud/android/sso/helper/Okhttp3Helper.java +1 −1 Original line number Diff line number Diff line Loading @@ -49,7 +49,7 @@ public final class Okhttp3Helper { InputStream os = nextcloudAPI.performNetworkRequestV2(request).getBody(); return ResponseBody.create(null, 0, new BufferedSourceSSO(os)); } catch (Exception e) { Log.e(TAG, "[getResponseBodyFromRequest] encountered a problem", e); Log.e(TAG, "[getResponseBodyFromRequestV2] encountered a problem", e); } return ResponseBody.create(null, ""); } Loading Loading
README.md +4 −0 Original line number Diff line number Diff line Loading @@ -189,6 +189,10 @@ public interface API { @GET("user") Observable<UserInfo> user(); // use ParsedResponse, in case you also need the response headers. Works currently only for Observable calls. @GET("user") Observable<ParsedResponse<UserInfo>> user(); @POST("feeds") Call<List<Feed>> createFeed(@Body Map<String, Object> feedMap); Loading
src/main/java/com/nextcloud/android/sso/api/NextcloudAPI.java +27 −22 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import com.google.gson.Gson; import com.nextcloud.android.sso.aidl.NextcloudRequest; import com.nextcloud.android.sso.model.SingleSignOnAccount; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; Loading @@ -47,7 +48,6 @@ public class NextcloudAPI { private NetworkRequest networkRequest; private Gson gson; @Documented @Target(METHOD) @Retention(RUNTIME) Loading Loading @@ -91,17 +91,40 @@ public class NextcloudAPI { }); } public <T> Observable<ParsedResponse<T>> performRequestObservableV2(final Type type, final NextcloudRequest request) { return Observable.fromPublisher( s-> { try { Response response = performNetworkRequestV2(request); s.onNext(ParsedResponse.of(convertStreamToTargetEntity(response.getBody(), type), response.getPlainHeaders())); s.onComplete(); } catch (Exception e) { s.onError(e); } }); } public <T> T performRequest(final @NonNull Type type, NextcloudRequest request) throws Exception { Log.d(TAG, "performRequest() called with: type = [" + type + "], request = [" + request + "]"); return convertStreamToTargetEntity(performNetworkRequest(request), type); } public <T> T performRequestV2(final @NonNull Type type, NextcloudRequest request) throws Exception { Log.d(TAG, "performRequestV2() called with: type = [" + type + "], request = [" + request + "]"); Response response = performNetworkRequestV2(request); return convertStreamToTargetEntity(response.getBody(), type); } private <T> T convertStreamToTargetEntity(InputStream inputStream, Type targetEntity) throws IOException { T result = null; try (InputStream os = performNetworkRequest(request); try (InputStream os = inputStream; Reader targetReader = new InputStreamReader(os)) { if (type != Void.class) { result = gson.fromJson(targetReader, type); if (targetEntity != Void.class) { result = gson.fromJson(targetReader, targetEntity); /* if (result != null) { Log.d(TAG, result.toString()); } */ } } return result; Loading @@ -119,24 +142,6 @@ public class NextcloudAPI { return networkRequest.performNetworkRequest(request, request.getBodyAsStream()); } public Response performRequestV2(final @NonNull Type type, NextcloudRequest request) throws Exception { Log.d(TAG, "performRequestV2() called with: type = [" + type + "], request = [" + request + "]"); Response result = null; Response response = performNetworkRequestV2(request); Reader targetReader = new InputStreamReader(response.getBody()); if (type != Void.class) { result = gson.fromJson(targetReader, type); if (result != null) { Log.d(TAG, result.toString()); } } return result; } /** * The InputStreams needs to be closed after reading from it * Loading
src/main/java/com/nextcloud/android/sso/api/NextcloudRetrofitServiceMethod.java +11 −4 Original line number Diff line number Diff line Loading @@ -179,20 +179,27 @@ public class NextcloudRetrofitServiceMethod<T> { // Streaming if(typeArgument == ResponseBody.class) { return (T) Observable.just(Okhttp3Helper.getResponseBodyFromRequest(nextcloudAPI, request)); } else { return (T) nextcloudAPI.performRequestObservable(typeArgument, request); } else if (typeArgument instanceof ParameterizedType) { ParameterizedType innerType = (ParameterizedType) typeArgument; Type innerOwnerType = innerType.getRawType(); if(innerOwnerType == ParsedResponse.class) { return (T) nextcloudAPI.performRequestObservableV2(innerType.getActualTypeArguments()[0], request); } } //fallback return (T) nextcloudAPI.performRequestObservableV2(typeArgument, request).map(r -> r.getResponse()); } else if(ownerType == Call.class) { Type typeArgument = type.getActualTypeArguments()[0]; return (T) Retrofit2Helper.WrapInCall(nextcloudAPI, request, typeArgument); } } else if(this.returnType == Observable.class) { return (T) nextcloudAPI.performRequestObservable(Object.class, request); return (T) nextcloudAPI.performRequestObservableV2(Object.class, request).map(r -> r.getResponse()); } else if (this.returnType == Completable.class) { return (T) ReactivexHelper.wrapInCompletable(nextcloudAPI, request); } return nextcloudAPI.performRequest(this.returnType, request); return nextcloudAPI.performRequestV2(this.returnType, request); } private void addHeader(NextcloudRequest.Builder rBuilder, String key, Object value) { Loading
src/main/java/com/nextcloud/android/sso/api/ParsedResponse.java 0 → 100644 +35 −0 Original line number Diff line number Diff line package com.nextcloud.android.sso.api; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; public class ParsedResponse <T> { private T response; private Map<String, String> headers = new HashMap<>(); public ParsedResponse(T response, ArrayList<AidlNetworkRequest.PlainHeader> headers) { this.response = response; if (headers!= null) { for (AidlNetworkRequest.PlainHeader header : headers) { this.headers.put(header.getName(), header.getValue()); } } } public static <T> ParsedResponse<T> of(T data) { return new ParsedResponse<>(data, null); } public static <T> ParsedResponse<T> of(T data, ArrayList<AidlNetworkRequest.PlainHeader> headers) { return new ParsedResponse<T>(data, headers); } public T getResponse() { return response; } public Map<String, String> getHeaders() { return headers; } }
src/main/java/com/nextcloud/android/sso/helper/Okhttp3Helper.java +1 −1 Original line number Diff line number Diff line Loading @@ -49,7 +49,7 @@ public final class Okhttp3Helper { InputStream os = nextcloudAPI.performNetworkRequestV2(request).getBody(); return ResponseBody.create(null, 0, new BufferedSourceSSO(os)); } catch (Exception e) { Log.e(TAG, "[getResponseBodyFromRequest] encountered a problem", e); Log.e(TAG, "[getResponseBodyFromRequestV2] encountered a problem", e); } return ResponseBody.create(null, ""); } Loading