Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit fc50a19e authored by David Luhmer's avatar David Luhmer Committed by GitHub
Browse files

Merge pull request #528 from p1gp1g/rxjava3

Support rxjava3 return type
parents 9cc29c4c 67a56364
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -113,6 +113,7 @@ dependencies {
    api 'com.google.code.gson:gson:2.10.1'

    implementation 'io.reactivex.rxjava2:rxjava:2.2.21'
    implementation 'io.reactivex.rxjava3:rxjava:3.1.5'

    implementation 'commons-io:commons-io:2.11.0'

+12 −0
Original line number Diff line number Diff line
@@ -119,6 +119,18 @@ public class NextcloudAPI {
        });
    }

    public <T> io.reactivex.rxjava3.core.Observable<ParsedResponse<T>> performRequestObservableV3(final Type type, final NextcloudRequest request) {
        return io.reactivex.rxjava3.core.Observable.fromPublisher( s -> {
            try {
                final 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 performRequestV2(final @NonNull Type type, NextcloudRequest request) throws Exception {
        Log.d(TAG, "performRequestV2() called with: type = [" + type + "], request = [" + request + "]");
        final Response response = performNetworkRequestV2(request);
+21 −5
Original line number Diff line number Diff line
@@ -179,22 +179,34 @@ public class NextcloudRetrofitServiceMethod<T> {
        if(this.returnType instanceof ParameterizedType) {
            ParameterizedType type = (ParameterizedType) returnType;
            Type ownerType = type.getRawType();
            if(ownerType == Observable.class) {
            if(ownerType == Observable.class || ownerType == io.reactivex.rxjava3.core.Observable.class) {
                Type typeArgument = type.getActualTypeArguments()[0];
                Log.d(TAG, "invoke call to api using observable " + typeArgument);

                // Streaming
                if(typeArgument == ResponseBody.class) {
                    if(ownerType == Observable.class) {
                        return (T) Observable.fromCallable(() -> Okhttp3Helper.getResponseBodyFromRequestV2(nextcloudAPI, request));
                    } else {
                        return (T) io.reactivex.rxjava3.core.Observable.fromCallable(() -> Okhttp3Helper.getResponseBodyFromRequestV2(nextcloudAPI, request));
                    }
                } else if (typeArgument instanceof ParameterizedType) {
                    ParameterizedType innerType = (ParameterizedType) typeArgument;
                    Type innerOwnerType = innerType.getRawType();
                    if(innerOwnerType == ParsedResponse.class) {
                        if(ownerType == Observable.class) {
                            return (T) nextcloudAPI.performRequestObservableV2(innerType.getActualTypeArguments()[0], request);
                        } else {
                            return (T) nextcloudAPI.performRequestObservableV3(innerType.getActualTypeArguments()[0], request);
                        }
                    }
                }
                //fallback
                if(ownerType == Observable.class) {
                    return (T) nextcloudAPI.performRequestObservableV2(typeArgument, request).map(r -> r.getResponse());
                } else {
                    return (T) nextcloudAPI.performRequestObservableV3(typeArgument, request).map(r -> r.getResponse());
                }

            } else if(ownerType == Call.class) {
                Type typeArgument = type.getActualTypeArguments()[0];
@@ -202,8 +214,12 @@ public class NextcloudRetrofitServiceMethod<T> {
            }
        } else if (this.returnType == Observable.class) {
            return (T) nextcloudAPI.performRequestObservableV2(Object.class, request).map(r -> r.getResponse());
        } else if (this.returnType == io.reactivex.rxjava3.core.Observable.class) {
            return (T) nextcloudAPI.performRequestObservableV3(Object.class, request).map(r -> r.getResponse());
        } else if (this.returnType == Completable.class) {
            return (T) ReactivexHelper.wrapInCompletable(nextcloudAPI, request);
        } else if (this.returnType == io.reactivex.rxjava3.core.Completable.class) {
            return (T) ReactivexHelper.wrapInCompletableV3(nextcloudAPI, request);
        }

        return nextcloudAPI.performRequestV2(this.returnType, request);
+4 −0
Original line number Diff line number Diff line
@@ -32,5 +32,9 @@ public final class ReactivexHelper {
        return Completable.fromAction(() -> nextcloudAPI.performRequestV2(Void.class, request));
    }

    public static io.reactivex.rxjava3.core.Completable wrapInCompletableV3(final NextcloudAPI nextcloudAPI, final NextcloudRequest request) {
        return io.reactivex.rxjava3.core.Completable.fromAction(() -> nextcloudAPI.performRequestV2(Void.class, request));
    }

}