package com.novoda.todoapp.tasks.service; import com.novoda.data.SyncedData; import com.novoda.event.Event; import com.novoda.todoapp.task.data.model.Id; import com.novoda.todoapp.task.data.model.Task; import com.novoda.todoapp.tasks.data.model.Tasks; import rx.Observable; import rx.Subscriber; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action0; import rx.schedulers.Schedulers; public class TasksServiceAsync implements TasksService { private final TasksService tasksService; public TasksServiceAsync(TasksService tasksService) { this.tasksService = tasksService; } @Override public Observable<Tasks> getTasks() { return tasksService.getTasks() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } @Override public Observable<Event<Tasks>> getTasksEvents() { return tasksService.getTasksEvents() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } @Override public Observable<Tasks> getCompletedTasks() { return tasksService.getCompletedTasks() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } @Override public Observable<Event<Tasks>> getCompletedTasksEvents() { return tasksService.getCompletedTasksEvents() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } @Override public Observable<Tasks> getActiveTasks() { return tasksService.getActiveTasks() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } @Override public Observable<Event<Tasks>> getActiveTasksEvents() { return tasksService.getActiveTasksEvents() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } @Override public Observable<SyncedData<Task>> getTask(Id taskId) { return tasksService.getTask(taskId) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } @Override public Action0 refreshTasks() { return asAsyncAction(tasksService.refreshTasks()); } @Override public Action0 clearCompletedTasks() { return asAsyncAction(tasksService.clearCompletedTasks()); } @Override public Action0 deleteAllTasks() { return asAsyncAction(tasksService.deleteAllTasks()); } @Override public Action0 complete(Task task) { return asAsyncAction(tasksService.complete(task)); } @Override public Action0 activate(Task task) { return asAsyncAction(tasksService.activate(task)); } @Override public Action0 save(Task task) { return asAsyncAction(tasksService.save(task)); } private static Action0 asAsyncAction(final Action0 action0) { return new Action0() { @Override public void call() { asObservable(action0) .subscribeOn(Schedulers.io()) .subscribe(); } }; } private static Observable<Void> asObservable(final Action0 action0) { return Observable.create(new Observable.OnSubscribe<Void>() { @Override public void call(Subscriber<? super Void> subscriber) { action0.call(); subscriber.onCompleted(); } }); } }