package com.novoda.todoapp.tasks.data.source;
import com.google.common.collect.ImmutableList;
import com.novoda.data.SyncedData;
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 java.util.concurrent.TimeUnit;
import rx.Observable;
import rx.Subscriber;
import rx.functions.Func0;
import rx.schedulers.Schedulers;
public final class InMemoryLocalTaskDataSource implements LocalTasksDataSource {
private final int localDelay;
private final TimeUnit localDelayUnit;
private Tasks localTasks = Tasks.asSynced(
ImmutableList.<Task>of(
Task.builder()
.id(Id.from("42"))
.title("First Task")
.description("Hardcoded stuff")
.build(),
Task.builder()
.id(Id.from("24"))
.title("Second Task")
.description("Hardcoded stuff again")
.build()
),
System.currentTimeMillis()
);
public static LocalTasksDataSource newInstance() {
return new InMemoryLocalTaskDataSource(1, TimeUnit.SECONDS);
}
private InMemoryLocalTaskDataSource(int localDelay, TimeUnit localDelayUnit) {
this.localDelay = localDelay;
this.localDelayUnit = localDelayUnit;
}
@Override
public Observable<Tasks> getTasks() {
return Observable.defer(new Func0<Observable<Tasks>>() {
@Override
public Observable<Tasks> call() {
if (localTasks.isEmpty()) {
return Observable.empty();
} else {
return Observable.just(localTasks);
}
}
}).delay(localDelay, localDelayUnit, Schedulers.immediate());
}
@Override
public Observable<Tasks> saveTasks(final Tasks tasks) {
return Observable.create(new Observable.OnSubscribe<Tasks>() {
@Override
public void call(Subscriber<? super Tasks> subscriber) {
localTasks = tasks;
subscriber.onNext(localTasks);
subscriber.onCompleted();
}
}).delay(localDelay, localDelayUnit, Schedulers.immediate());
}
@Override
public Observable<SyncedData<Task>> saveTask(final SyncedData<Task> taskSyncedData) {
return Observable.create(new Observable.OnSubscribe<SyncedData<Task>>() {
@Override
public void call(Subscriber<? super SyncedData<Task>> subscriber) {
localTasks = localTasks.save(taskSyncedData);
subscriber.onNext(taskSyncedData);
subscriber.onCompleted();
}
}).delay(localDelay, localDelayUnit, Schedulers.immediate());
}
@Override
public Observable<Void> deleteAllTasks() {
return Observable.create(new Observable.OnSubscribe<Void>() {
@Override
public void call(Subscriber<? super Void> subscriber) {
localTasks = Tasks.empty();
subscriber.onCompleted();
}
}).delay(localDelay, localDelayUnit, Schedulers.immediate());
}
}