Skip to content

Commit 5378b89

Browse files
committed
cleaning up the TaskDetailsPresenter
1 parent 854826e commit 5378b89

File tree

6 files changed

+78
-81
lines changed

6 files changed

+78
-81
lines changed

todoapp/app/src/main/java/com/example/android/architecture/blueprints/todoapp/addedittask/AddEditTaskPresenter.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public class AddEditTaskPresenter implements AddEditTaskContract.Presenter,
3939
private static final int TASK_QUERY = 2;
4040

4141
@NonNull
42-
private TasksOperations tasksOperations;
42+
private TasksOperations mTasksOperations;
4343

4444
@NonNull
4545
private AddEditTaskContract.View mAddTaskView;
@@ -55,7 +55,7 @@ public AddEditTaskPresenter(@Nullable String taskId, @NonNull TasksOperations ta
5555
@NonNull AddEditTaskContract.View addTaskView, @NonNull TaskLoader taskLoader,
5656
@NonNull LoaderManager loaderManager) {
5757
mTaskId = taskId;
58-
tasksOperations = checkNotNull(tasksOperations);
58+
mTasksOperations = checkNotNull(tasksOperations);
5959
mAddTaskView = checkNotNull(addTaskView);
6060
mTaskLoader = checkNotNull(taskLoader);
6161
mLoaderManager = checkNotNull(loaderManager, "loaderManager cannot be null!");
@@ -74,14 +74,14 @@ public void createTask(String title, String description) {
7474
if (newTask.isEmpty()) {
7575
mAddTaskView.showEmptyTaskError();
7676
} else {
77-
tasksOperations.saveTask(newTask);
77+
mTasksOperations.saveTask(newTask);
7878
mAddTaskView.showTasksList();
7979
}
8080
}
8181

8282
@Override
8383
public void updateTask(String taskId, String title, String description) {
84-
tasksOperations.saveTask(new Task(title, description, taskId));
84+
mTasksOperations.saveTask(new Task(title, description, taskId));
8585
mAddTaskView.showTasksList(); // After an edit, go back to the list.
8686
}
8787

todoapp/app/src/main/java/com/example/android/architecture/blueprints/todoapp/data/source/TasksOperations.java

Lines changed: 50 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,11 @@ public class TasksOperations implements LoaderManager.LoaderCallbacks<Cursor> {
1616

1717
private static TasksOperations INSTANCE;
1818

19-
private final static int TASKS_QUERY = 1;
19+
private final static int TASKS_LOADER = 1;
20+
private final static int TASK_LOADER = 2;
21+
2022
public final static String KEY_TASK_FILTER = BuildConfig.APPLICATION_ID + "TASK_FILTER";
23+
public final static String KEY_TASK_ID = BuildConfig.APPLICATION_ID + "TASK_ID";
2124

2225
private final LoaderProvider mLoaderProvider;
2326
private final LoaderManager mLoaderManager;
@@ -40,10 +43,23 @@ private TasksOperations(LoaderProvider mLoaderProvider, LoaderManager mLoaderMan
4043

4144
public void getTasks(Bundle extras, GetTasksCallback callback) {
4245
this.callback = callback;
43-
if (mLoaderManager.getLoader(TASKS_QUERY) == null) {
44-
mLoaderManager.initLoader(TASKS_QUERY, extras, this);
46+
if (mLoaderManager.getLoader(TASKS_LOADER) == null) {
47+
mLoaderManager.initLoader(TASKS_LOADER, extras, this);
4548
} else {
46-
mLoaderManager.restartLoader(TASKS_QUERY, extras, this);
49+
mLoaderManager.restartLoader(TASKS_LOADER, extras, this);
50+
}
51+
}
52+
53+
public void getTask(String taskId, GetTasksCallback callback) {
54+
this.callback = callback;
55+
56+
Bundle bundle = new Bundle();
57+
bundle.putSerializable(TasksOperations.KEY_TASK_ID, taskId);
58+
59+
if (mLoaderManager.getLoader(TASK_LOADER) == null) {
60+
mLoaderManager.initLoader(TASK_LOADER, null, this);
61+
} else {
62+
mLoaderManager.restartLoader(TASK_LOADER, null, this);
4763
}
4864
}
4965

@@ -54,6 +70,9 @@ public void completeTask(Task task) {
5470
public void completeTask(String completedTaskId) {
5571
try {
5672
ContentValues values = new ContentValues();
73+
values.put(TasksPersistenceContract.TaskEntry.COLUMN_NAME_ENTRY_ID, newTask.getId());
74+
values.put(TasksPersistenceContract.TaskEntry.COLUMN_NAME_TITLE, newTask.getTitle());
75+
values.put(TasksPersistenceContract.TaskEntry.COLUMN_NAME_DESCRIPTION, newTask.getDescription());
5776
values.put(TasksPersistenceContract.TaskEntry.COLUMN_NAME_COMPLETED, true);
5877

5978
String selection = TasksPersistenceContract.TaskEntry.COLUMN_NAME_ENTRY_ID + " LIKE ?";
@@ -101,20 +120,41 @@ public void deleteAllTasks() {
101120
}
102121
}
103122

104-
public Task getTask(String id) {
105-
return null;
123+
public void saveTask(Task newTask) {
124+
ContentValues values = new ContentValues();
125+
values.put(TasksPersistenceContract.TaskEntry.COLUMN_NAME_ENTRY_ID, newTask.getId());
126+
values.put(TasksPersistenceContract.TaskEntry.COLUMN_NAME_TITLE, newTask.getTitle());
127+
values.put(TasksPersistenceContract.TaskEntry.COLUMN_NAME_DESCRIPTION, newTask.getDescription());
128+
values.put(TasksPersistenceContract.TaskEntry.COLUMN_NAME_COMPLETED, newTask.isCompleted() ? 1 : 0);
129+
mContentResolver.insert(TasksPersistenceContract.TaskEntry.buildTasksUri(), values);
130+
}
131+
132+
public void deleteTask(String taskId) {
133+
String selection = TasksPersistenceContract.TaskEntry.COLUMN_NAME_ENTRY_ID + " LIKE ?";
134+
String[] selectionArgs = {taskId};
135+
136+
mContentResolver.delete(TasksPersistenceContract.TaskEntry.buildTasksUri(), selection, selectionArgs);
106137
}
107138

108139
@Override
109140
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
110-
TasksFilterType tasksFilterType = (TasksFilterType) args.getSerializable(KEY_TASK_FILTER);
111-
return mLoaderProvider.createFilteredTasksLoader(tasksFilterType);
141+
switch (id) {
142+
case TASKS_LOADER:
143+
TasksFilterType tasksFilterType = (TasksFilterType) args.getSerializable(KEY_TASK_FILTER);
144+
return mLoaderProvider.createFilteredTasksLoader(tasksFilterType);
145+
break;
146+
case TASK_LOADER:
147+
String taskId = args.getString(KEY_TASK_ID);
148+
return mLoaderProvider.createTaskLoader(taskId);
149+
break;
150+
}
151+
112152
}
113153

114154
@Override
115155
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
116156
if (data != null) {
117-
callback.onTasksLoaded(data);
157+
callback.onDataLoaded(data);
118158
} else {
119159
callback.onDataNotAvailable();
120160
}
@@ -125,25 +165,8 @@ public void onLoaderReset(Loader<Cursor> loader) {
125165

126166
}
127167

128-
public void saveTask(Task newTask) {
129-
ContentValues values = new ContentValues();
130-
values.put(TasksPersistenceContract.TaskEntry.COLUMN_NAME_ENTRY_ID, newTask.getId());
131-
values.put(TasksPersistenceContract.TaskEntry.COLUMN_NAME_TITLE, newTask.getTitle());
132-
values.put(TasksPersistenceContract.TaskEntry.COLUMN_NAME_DESCRIPTION, newTask.getDescription());
133-
values.put(TasksPersistenceContract.TaskEntry.COLUMN_NAME_COMPLETED, newTask.isCompleted() ? 1 : 0);
134-
mContentResolver.insert(TasksPersistenceContract.TaskEntry.buildTasksUri(), values);
135-
}
136-
137-
public void deleteTask(String taskId) {
138-
String selection = TasksPersistenceContract.TaskEntry.COLUMN_NAME_ENTRY_ID + " LIKE ?";
139-
String[] selectionArgs = {taskId};
140-
141-
mContentResolver.delete(TasksPersistenceContract.TaskEntry.buildTasksUri(), selection, selectionArgs);
142-
}
143-
144168
public interface GetTasksCallback {
145-
void onTasksLoaded(Cursor data);
146-
169+
void onDataLoaded(Cursor data);
147170
void onDataNotAvailable();
148171
}
149172
}

todoapp/app/src/main/java/com/example/android/architecture/blueprints/todoapp/taskdetail/TaskDetailActivity.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,9 @@
1616

1717
package com.example.android.architecture.blueprints.todoapp.taskdetail;
1818

19-
import android.database.Cursor;
2019
import android.os.Bundle;
2120
import android.support.annotation.VisibleForTesting;
2221
import android.support.test.espresso.IdlingResource;
23-
import android.support.v4.content.Loader;
2422
import android.support.v7.app.ActionBar;
2523
import android.support.v7.app.AppCompatActivity;
2624
import android.support.v7.widget.Toolbar;
@@ -67,16 +65,14 @@ protected void onCreate(Bundle savedInstanceState) {
6765

6866
// Create the presenter
6967
LoaderProvider loaderProvider = new LoaderProvider(getApplicationContext());
70-
Loader<Cursor> taskLoader = loaderProvider.createTaskLoader(taskId);
7168
TasksOperations tasksOperations = TasksOperations.getInstance(loaderProvider, getSupportLoaderManager(), getContentResolver());
7269

7370
// Create the presenter
7471
new TaskDetailPresenter(
7572
taskId,
7673
tasksOperations,
77-
taskDetailFragment,
78-
taskLoader,
79-
getSupportLoaderManager()
74+
loaderProvider,
75+
taskDetailFragment
8076
);
8177
}
8278

todoapp/app/src/main/java/com/example/android/architecture/blueprints/todoapp/taskdetail/TaskDetailPresenter.java

Lines changed: 18 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -17,56 +17,44 @@
1717
package com.example.android.architecture.blueprints.todoapp.taskdetail;
1818

1919
import android.database.Cursor;
20-
import android.os.Bundle;
2120
import android.support.annotation.NonNull;
22-
import android.support.annotation.Nullable;
23-
import android.support.v4.app.LoaderManager;
24-
import android.support.v4.content.Loader;
2521

2622
import com.example.android.architecture.blueprints.todoapp.data.Task;
23+
import com.example.android.architecture.blueprints.todoapp.data.source.LoaderProvider;
2724
import com.example.android.architecture.blueprints.todoapp.data.source.TasksOperations;
28-
import com.example.android.architecture.blueprints.todoapp.data.source.TasksRepository;
2925

3026
import static com.google.common.base.Preconditions.checkNotNull;
3127

3228
/**
3329
* Listens to user actions from the UI ({@link TaskDetailFragment}), retrieves the data and updates
3430
* the UI as required.
3531
*/
36-
public class TaskDetailPresenter implements TaskDetailContract.Presenter,
37-
LoaderManager.LoaderCallbacks<Cursor> {
38-
39-
private static final int TASK_QUERY = 3;
32+
public class TaskDetailPresenter implements TaskDetailContract.Presenter, TasksOperations.GetTasksCallback {
4033

4134
private TaskDetailContract.View mTaskDetailView;
35+
private LoaderProvider mLoaderProvider;
4236

43-
private Loader<Cursor> mLoaderProvider;
44-
45-
private LoaderManager mLoaderManager;
46-
47-
@Nullable
37+
private Task mTask;
4838
private String mTaskId;
4939

5040
@NonNull
5141
private final TasksOperations mTasksOperations;
5242

53-
public TaskDetailPresenter(@Nullable String taskId,
43+
public TaskDetailPresenter(@NonNull String taskId,
5444
@NonNull TasksOperations tasksOperations,
55-
@NonNull TaskDetailContract.View taskDetailView,
56-
@NonNull Loader<Cursor> loaderProvider,
57-
@NonNull LoaderManager loaderManager) {
58-
mTaskId = taskId;
45+
@NonNull LoaderProvider loaderProvider,
46+
@NonNull TaskDetailContract.View taskDetailView) {
47+
mTaskId = checkNotNull(taskId, "taskId cannot be null!");
5948
mTasksOperations = checkNotNull(tasksOperations, "tasksOperations cannot be null!");
60-
mTaskDetailView = checkNotNull(taskDetailView, "taskDetailView cannot be null!");
6149
mLoaderProvider = checkNotNull(loaderProvider, "loader provider cannot be null!");
62-
mLoaderManager = checkNotNull(loaderManager, "loaderManager cannot be null!");
63-
50+
mTaskDetailView = checkNotNull(taskDetailView, "taskDetailView cannot be null!");
6451
mTaskDetailView.setPresenter(this);
6552
}
6653

6754
@Override
6855
public void start() {
69-
mLoaderManager.initLoader(TASK_QUERY, null, this);
56+
mTaskDetailView.setLoadingIndicator(true);
57+
mTasksOperations.getTask(mTaskId, this);
7058
}
7159

7260
@Override
@@ -104,10 +92,10 @@ public void activateTask() {
10492
}
10593

10694
private void showTask(Cursor data) {
107-
Task task = Task.from(data);
95+
mTask = Task.from(data);
10896

109-
String title = task.getTitle();
110-
String description = task.getDescription();
97+
String title = mTask.getTitle();
98+
String description = mTask.getDescription();
11199

112100
if (title != null && title.isEmpty()) {
113101
mTaskDetailView.hideTitle();
@@ -120,21 +108,12 @@ private void showTask(Cursor data) {
120108
} else {
121109
mTaskDetailView.showDescription(description);
122110
}
123-
mTaskDetailView.showCompletionStatus(task.isCompleted());
111+
mTaskDetailView.showCompletionStatus(mTask.isCompleted());
124112
mTaskDetailView.setLoadingIndicator(false);
125113
}
126114

127115
@Override
128-
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
129-
if (mTaskId == null) {
130-
return null;
131-
}
132-
mTaskDetailView.setLoadingIndicator(true);
133-
return mLoaderProvider;
134-
}
135-
136-
@Override
137-
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
116+
public void onDataLoaded(Cursor data) {
138117
if (data != null && data.moveToLast()) {
139118
showTask(data);
140119
} else {
@@ -143,8 +122,7 @@ public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
143122
}
144123

145124
@Override
146-
public void onLoaderReset(Loader<Cursor> loader) {
147-
// no-op
125+
public void onDataNotAvailable() {
126+
mTaskDetailView.showMissingTask();
148127
}
149-
150128
}

todoapp/app/src/main/java/com/example/android/architecture/blueprints/todoapp/tasks/TasksPresenter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public void start() {
6666
}
6767

6868
@Override
69-
public void onTasksLoaded(Cursor data) {
69+
public void onDataLoaded(Cursor data) {
7070
mTasksView.setLoadingIndicator(false);
7171
if (data.getCount() > 0) {
7272
// Show the list of tasks

todoapp/app/src/test/java/com/example/android/architecture/blueprints/todoapp/tasks/TasksPresenterTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ public void loadAllTasksFromRepositoryAndLoadIntoView() {
9595
TaskFilter taskFilter = new TaskFilter(mBundle);
9696

9797
mTasksPresenter.setFiltering(taskFilter);
98-
mTasksPresenter.onTasksLoaded(mAllTasksCursor);
98+
mTasksPresenter.onDataLoaded(mAllTasksCursor);
9999

100100
// Then progress indicator is hidden and all tasks are shown in UI
101101
verify(mTasksView).setLoadingIndicator(false);
@@ -110,7 +110,7 @@ public void loadActiveTasksFromRepositoryAndLoadIntoView() {
110110

111111
// When the loader finishes with tasks and filter is set to active
112112
mTasksPresenter.setFiltering(taskFilter);
113-
mTasksPresenter.onTasksLoaded(mActiveTasksCursor);
113+
mTasksPresenter.onDataLoaded(mActiveTasksCursor);
114114

115115
// Then progress indicator is hidden and active tasks are shown in UI
116116
verify(mTasksView).setLoadingIndicator(false);
@@ -125,7 +125,7 @@ public void loadCompletedTasksFromRepositoryAndLoadIntoView() {
125125

126126
// When the loader finishes with tasks and filter is set to completed
127127
mTasksPresenter.setFiltering(taskFilter);
128-
mTasksPresenter.onTasksLoaded(mCompletedTasksCursor);
128+
mTasksPresenter.onDataLoaded(mCompletedTasksCursor);
129129

130130
// Then progress indicator is hidden and completed tasks are shown in UI
131131
verify(mTasksView).setLoadingIndicator(false);

0 commit comments

Comments
 (0)