package com.novoda.todoapp.task.edit.presenter; import com.google.common.base.Optional; import com.novoda.data.SyncedData; import com.novoda.event.DataObserver; import com.novoda.todoapp.navigation.Navigator; import com.novoda.todoapp.task.data.model.Id; import com.novoda.todoapp.task.data.model.Task; import com.novoda.todoapp.task.edit.displayer.TaskEditActionListener; import com.novoda.todoapp.task.edit.displayer.TaskEditDisplayer; import com.novoda.todoapp.tasks.service.TasksService; import rx.subscriptions.CompositeSubscription; public class TaskEditPresenter { private final Id taskId; private final TasksService tasksService; private final TaskEditDisplayer taskDisplayer; private final Navigator navigator; private CompositeSubscription subscriptions = new CompositeSubscription(); public TaskEditPresenter( Id taskId, TasksService tasksService, TaskEditDisplayer taskDisplayer, Navigator navigator ) { this.taskId = taskId; this.tasksService = tasksService; this.taskDisplayer = taskDisplayer; this.navigator = navigator; } public void startPresenting() { taskDisplayer.attach(taskEditActionListener); subscriptions.add( tasksService.getTask(taskId) .subscribe(taskObserver) ); } public void stopPresenting() { taskDisplayer.detach(taskEditActionListener); subscriptions.clear(); subscriptions = new CompositeSubscription(); } final TaskEditActionListener taskEditActionListener = new TaskEditActionListener() { @Override public void save(Optional<String> title, Optional<String> description) { if (title.or(description).isPresent()) { Task task = Task.builder() .id(taskId) .title(title) .description(description) .build(); tasksService.save(task).call(); navigator.back(); } else { taskDisplayer.showEmptyTaskError(); } } }; private final DataObserver<SyncedData<Task>> taskObserver = new DataObserver<SyncedData<Task>>() { @Override public void onNext(SyncedData<Task> syncedData) { taskDisplayer.display(syncedData); } }; }