package com.novoda.todoapp.task.presenter; 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.displayer.TaskActionListener; import com.novoda.todoapp.task.displayer.TaskDisplayer; import com.novoda.todoapp.tasks.service.TasksService; import rx.subscriptions.CompositeSubscription; public class TaskPresenter { private final Id taskId; private final TasksService tasksService; private final TaskDisplayer taskDisplayer; private final Navigator navigator; private CompositeSubscription subscriptions = new CompositeSubscription(); public TaskPresenter( Id taskId, TasksService tasksService, TaskDisplayer taskDisplayer, Navigator navigator ) { this.taskId = taskId; this.tasksService = tasksService; this.taskDisplayer = taskDisplayer; this.navigator = navigator; } public void startPresenting() { taskDisplayer.attach(taskActionListener); subscriptions.add( tasksService.getTask(taskId) .subscribe(taskObserver) ); } public void stopPresenting() { taskDisplayer.detach(taskActionListener); subscriptions.clear(); subscriptions = new CompositeSubscription(); } final TaskActionListener taskActionListener = new TaskActionListener() { @Override public void toggleCompletion(Task task) { if (task.isCompleted()) { tasksService.activate(task).call(); } else { tasksService.complete(task).call(); } } @Override public void onEditSelected(Task task) { navigator.toTaskEdit(task); } }; private final DataObserver<SyncedData<Task>> taskObserver = new DataObserver<SyncedData<Task>>() { @Override public void onNext(SyncedData<Task> syncedData) { taskDisplayer.display(syncedData); } }; }