diff --git a/rxbolts2-applinks/src/main/java/rx/bolts2/AppLinkObservable.java b/rxbolts2-applinks/src/main/java/rx/bolts2/AppLinkObservable.java index 764c961..44b12ad 100644 --- a/rxbolts2-applinks/src/main/java/rx/bolts2/AppLinkObservable.java +++ b/rxbolts2-applinks/src/main/java/rx/bolts2/AppLinkObservable.java @@ -17,29 +17,44 @@ package rx.bolts2; import bolts.*; -import io.reactivex.Observable; +import io.reactivex.Single; +import io.reactivex.annotations.CheckReturnValue; +import io.reactivex.annotations.NonNull; public class AppLinkObservable { - public static Observable navigate(android.content.Context context, java.lang.String destinationUrl) { - return TaskObservable.defer(() -> AppLinkNavigation.navigateInBackground(context, destinationUrl)); + @CheckReturnValue + @NonNull + public static Single navigate(android.content.Context context, java.lang.String destinationUrl) { + return RxTask.single(() -> AppLinkNavigation.navigateInBackground(context, destinationUrl)); } - public static Observable navigate(android.content.Context context, java.lang.String destinationUrl, AppLinkResolver resolver) { - return TaskObservable.defer(() -> AppLinkNavigation.navigateInBackground(context, destinationUrl, resolver)); + @CheckReturnValue + @NonNull + public static Single navigate(android.content.Context context, java.lang.String destinationUrl, AppLinkResolver resolver) { + return RxTask.single(() -> AppLinkNavigation.navigateInBackground(context, destinationUrl, resolver)); } - public static Observable navigate(android.content.Context context, android.net.Uri destination) { - return TaskObservable.defer(() -> AppLinkNavigation.navigateInBackground(context, destination)); + @CheckReturnValue + @NonNull + public static Single navigate(android.content.Context context, android.net.Uri destination) { + return RxTask.single(() -> AppLinkNavigation.navigateInBackground(context, destination)); } - public static Observable navigate(android.content.Context context, android.net.Uri destination, AppLinkResolver resolver) { - return TaskObservable.defer(() -> AppLinkNavigation.navigateInBackground(context, destination, resolver)); + @CheckReturnValue + @NonNull + public static Single navigate(android.content.Context context, android.net.Uri destination, AppLinkResolver resolver) { + return RxTask.single(() -> AppLinkNavigation.navigateInBackground(context, destination, resolver)); } - public static Observable navigate(android.content.Context context, java.net.URL destination) { - return TaskObservable.defer(() -> AppLinkNavigation.navigateInBackground(context, destination)); + @CheckReturnValue + @NonNull + public static Single navigate(android.content.Context context, java.net.URL destination) { + return RxTask.single(() -> AppLinkNavigation.navigateInBackground(context, destination)); } - public static Observable navigate(android.content.Context context, java.net.URL destination, AppLinkResolver resolver) { - return TaskObservable.defer(() -> AppLinkNavigation.navigateInBackground(context, destination, resolver)); + @CheckReturnValue + @NonNull + public static Single navigate(android.content.Context context, java.net.URL destination, AppLinkResolver resolver) { + return RxTask.single(() -> AppLinkNavigation.navigateInBackground(context, destination, resolver)); } - - public static Observable getAppLink(AppLinkResolver resolver, android.net.Uri url) { - return TaskObservable.defer(() -> resolver.getAppLinkFromUrlInBackground(url)); + @CheckReturnValue + @NonNull + public static Single getAppLink(AppLinkResolver resolver, android.net.Uri url) { + return RxTask.single(() -> resolver.getAppLinkFromUrlInBackground(url)); } } diff --git a/rxbolts2-tasks/build.gradle b/rxbolts2-tasks/build.gradle index 8aa11b5..e493b87 100644 --- a/rxbolts2-tasks/build.gradle +++ b/rxbolts2-tasks/build.gradle @@ -35,7 +35,7 @@ repositories { } dependencies { - compile 'io.reactivex.rxjava2:rxjava:2.0.1' + compile 'io.reactivex.rxjava2:rxjava:2.0.8' compile 'com.parse.bolts:bolts-tasks:1.4.0' diff --git a/rxbolts2-tasks/src/main/java/rx/bolts2/RxTask.java b/rxbolts2-tasks/src/main/java/rx/bolts2/RxTask.java new file mode 100644 index 0000000..7b3bc96 --- /dev/null +++ b/rxbolts2-tasks/src/main/java/rx/bolts2/RxTask.java @@ -0,0 +1,166 @@ +/* + * Copyright (C) 2015 8tory, Inc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package rx.bolts2; + +import java.util.concurrent.Callable; + +import bolts.Task; +import io.reactivex.Completable; +import io.reactivex.Observable; +import io.reactivex.Single; +import io.reactivex.annotations.CheckReturnValue; +import io.reactivex.annotations.NonNull; + +/** + * Bolts2Rx + * Bolts.Task2Observable + * RxBolts + * RxTask + * BoltsObservable + * TaskObservable + */ +public class RxTask { + + @CheckReturnValue + @NonNull + public static Task forTask(@NonNull final Observable obs){ + return Task.callInBackground(() -> obs.blockingSingle()); // FIXME: null is not acceptable + } + + @CheckReturnValue + @NonNull + public static Task forTask(@NonNull final Single single){ + return Task.callInBackground(() -> single.blockingGet()); // FIXME: null is not acceptable + } + + //@CheckReturnValue + //@NonNull + //public static Task forTask(@NonNull final Completable completable){ + // return Task.callInBackground(() -> Task.forResult(completable.blockingAwait())); // FIXME: null is not acceptable + //} + + @CheckReturnValue + @NonNull + public static Observable observable(@NonNull final Task task) { + return Observable.create(emitter -> { + task.continueWith(t -> { + if (emitter.isDisposed()) return null; + + if (t.isCancelled()) { + // NOTICE: doOnUnsubscribe(() -> Observable.just(query) in outside + emitter.onComplete(); + } else if (t.isFaulted()) { + Throwable error = t.getError(); + emitter.onError(error); + } else { + R r = t.getResult(); + if (r != null) emitter.onNext(r); + emitter.onComplete(); + } + return null; + }); + }); + // TODO .doOnUnsubscribe(() -> task.setCancelled()); + } + + @NonNull + public static Completable completable(@NonNull final Task task) { + return Completable.create(emitter -> { + task.continueWith(t -> { + if (emitter.isDisposed()) return null; + + if (t.isCancelled()) { + // NOTICE: doOnUnsubscribe(() -> Observable.just(query) in outside + emitter.onComplete(); + } else if (t.isFaulted()) { + Throwable error = t.getError(); + emitter.onError(error); + } else { + t.getResult(); + emitter.onComplete(); + } + return null; + }); + }); + // TODO .doOnUnsubscribe(() -> task.setCancelled()); + } + + /** + * Please don't put the Task<Void> as parameter + * @param task + * @param + * @return + */ + @CheckReturnValue + @NonNull + public static Single single(@NonNull final Task task) { + return Single.create(emitter -> { + task.continueWith(t -> { + if (emitter.isDisposed()) return null; + + if (t.isCancelled()) { + emitter.onError(new RuntimeException("Cancelled task")); + } else if (t.isFaulted()) { + Throwable error = t.getError(); + emitter.onError(error); + } else { + R r = t.getResult(); + emitter.onSuccess(r); + } + return null; + }); + }); + // TODO .doOnUnsubscribe(() -> task.setCancelled()); + } + + /** + * Please use observable(Callable) instead of this for defer unless you know what are you doing + * Please don't put the Task<Void> as parameter + * @param task + * @param + * @return + */ + @CheckReturnValue + @NonNull + public static Observable observable(@NonNull final Callable> task) { + return Single.fromCallable(task).flatMapObservable(RxTask::observable); + } + + /** + * Please use single(Callable) instead of this for defer unless you know what are you doing + * Please don't put the Task<Void> as parameter + * @param task + * @param + * @return + */ + @CheckReturnValue + @NonNull + public static Single single(@NonNull final Callable> task) { + return Single.fromCallable(task).flatMap(RxTask::single); + } + + /** + * Please use single(Callable) instead of this for defer unless you know what are you doing + * @param task + * @param + * @return + */ + @NonNull + public static Completable completable(@NonNull final Callable> task) { + return Single.fromCallable(task).flatMapCompletable(RxTask::completable); + } +} diff --git a/rxbolts2-tasks/src/main/java/rx/bolts2/TaskObservable.java b/rxbolts2-tasks/src/main/java/rx/bolts2/TaskObservable.java deleted file mode 100644 index a19f6d6..0000000 --- a/rxbolts2-tasks/src/main/java/rx/bolts2/TaskObservable.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2015 8tory, Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package rx.bolts2; - -import java.util.concurrent.Callable; - -import bolts.Task; -import io.reactivex.Observable; - -/** - * Bolts2Rx - * Bolts.Task2Observable - * RxBolts - * RxTask - * BoltsObservable - * TaskObservable - */ -public class TaskObservable { - - public static Task forTask(final Observable obs){ - return Task.callInBackground(() -> obs.blockingSingle()); // FIXME: null is not acceptable - } - - public static Observable just(Task task) { - return Observable.create(emitter -> { - task.continueWith(t -> { - if (emitter.isDisposed()) return null; - - if (t.isCancelled()) { - // NOTICE: doOnUnsubscribe(() -> Observable.just(query) in outside - emitter.onComplete(); - } else if (t.isFaulted()) { - Throwable error = t.getError(); - emitter.onError(error); - } else { - R r = t.getResult(); - if (r != null) emitter.onNext(r); - emitter.onComplete(); - } - return null; - }); - }); - // TODO .doOnUnsubscribe(() -> task.setCancelled()); - } - - public static Observable just(Callable> task) { - return defer(task); - } - - public static Observable defer(Callable> task) { - return Observable.defer(() -> just(task.call())); - } -} diff --git a/rxbolts2-tasks/src/test/java/rx/bolts2/TaskObservableTests.java b/rxbolts2-tasks/src/test/java/rx/bolts2/TaskObservableTests.java index b7c04bb..4a522ea 100644 --- a/rxbolts2-tasks/src/test/java/rx/bolts2/TaskObservableTests.java +++ b/rxbolts2-tasks/src/test/java/rx/bolts2/TaskObservableTests.java @@ -29,12 +29,12 @@ public class TaskObservableTests { @Test - public void just() { - TaskObservable.just(Task.forResult(null)) + public void single() { + RxTask.single(Task.forResult(null)) .test() .assertError(NullPointerException.class); - TaskObservable.just(Task.forResult("hello")) + RxTask.single(Task.forResult("hello")) .test() .assertValue(check(v -> assertThat(v).isEqualTo("hello"))) .assertNoErrors() @@ -42,8 +42,33 @@ public void just() { } @Test - public void forTask() { - assertThat(TaskObservable.forTask(Observable.empty()).getResult()).isNull(); + public void completable() { + RxTask.completable(Task.forResult(null)) + .test() + .assertError(NullPointerException.class); + + RxTask.completable(Task.forResult("hello")) + .test() + .assertValue(check(v -> assertThat(v).isEqualTo("hello"))) + .assertNoErrors() + .assertComplete(); + } + @Test + public void observable() { + RxTask.observable(Task.forResult(null)) + .test() + .assertError(NullPointerException.class); + + RxTask.observable(Task.forResult("hello")) + .test() + .assertValue(check(v -> assertThat(v).isEqualTo("hello"))) + .assertNoErrors() + .assertComplete(); + } + + @Test + public void forTaskObservable() { + assertThat(RxTask.forTask(Observable.empty()).getResult()).isNull(); } public static Predicate check(Consumer consumer) { diff --git a/sonar-project.properties b/sonar-project.properties new file mode 100644 index 0000000..e69de29