Skip to content

Commit 854826e

Browse files
committed
moving al to the operations class
1 parent 1dcffea commit 854826e

File tree

9 files changed

+108
-58
lines changed

9 files changed

+108
-58
lines changed

todoapp/app/src/androidTest/java/com/example/android/architecture/blueprints/todoapp/data/TasksLocalDataSourceTest.java

Lines changed: 75 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,17 @@
1616

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

19+
import android.content.ContentValues;
20+
import android.database.Cursor;
1921
import android.support.test.InstrumentationRegistry;
2022
import android.support.test.runner.AndroidJUnit4;
2123
import android.test.suitebuilder.annotation.LargeTest;
2224

2325
import com.example.android.architecture.blueprints.todoapp.data.source.TasksDataSource;
2426
import com.example.android.architecture.blueprints.todoapp.data.source.local.TasksLocalDataSource;
27+
import com.example.android.architecture.blueprints.todoapp.data.source.local.TasksPersistenceContract;
2528

29+
import java.util.ArrayList;
2630
import java.util.List;
2731

2832
import org.junit.After;
@@ -77,7 +81,7 @@ public void saveTask_retrievesTask() {
7781
mLocalDataSource.saveTask(newTask);
7882

7983
// Then the task can be retrieved from the persistent repository
80-
assertThat(mLocalDataSource.getTask(newTask.getId()), is(newTask));
84+
assertThat(Task.from(mLocalDataSource.getTask(newTask.getId())), is(newTask));
8185
}
8286

8387
@Test
@@ -86,27 +90,45 @@ public void completeTask_retrievedTaskIsComplete() {
8690
TasksDataSource.GetTaskCallback callback = mock(TasksDataSource.GetTaskCallback.class);
8791
// Given a new task in the persistent repository
8892
final Task newTask = new Task(TITLE, "");
93+
94+
// And it's representative content values
95+
ContentValues values = new ContentValues();
96+
values.put(TasksPersistenceContract.TaskEntry.COLUMN_NAME_ENTRY_ID, newTask.getId());
97+
values.put(TasksPersistenceContract.TaskEntry.COLUMN_NAME_TITLE, newTask.getTitle());
98+
values.put(TasksPersistenceContract.TaskEntry.COLUMN_NAME_DESCRIPTION, newTask.getDescription());
99+
values.put(TasksPersistenceContract.TaskEntry.COLUMN_NAME_COMPLETED, newTask.isCompleted() ? 1 : 0);
100+
101+
String[] selectionArgs = {newTask.getId()};
102+
89103
mLocalDataSource.saveTask(newTask);
90104

91105
// When completed in the persistent repository
92-
mLocalDataSource.completeTask(newTask);
106+
mLocalDataSource.updateTask(values, selectionArgs);
93107

94-
// Then the task can be retrieved from the persistent repository and is complete
95-
96-
assertThat(mLocalDataSource.getTask(newTask.getId()), is(newTask));
97-
assertThat(mLocalDataSource.getTask(newTask.getId()).isCompleted(), is(true));
108+
// Then the task can be retrieved from the persistent repository and is completed
109+
assertThat(Task.from(mLocalDataSource.getTask(newTask.getId())), is(newTask));
110+
assertThat(Task.from(mLocalDataSource.getTask(newTask.getId())).isCompleted(), is(true));
98111
}
99112

100113
@Test
101114
public void activateTask_retrievedTaskIsActive() {
102-
103115
// Given a new completed task in the persistent repository
104116
final Task newTask = new Task(TITLE, "");
117+
118+
// And it's representative content values
119+
ContentValues values = new ContentValues();
120+
values.put(TasksPersistenceContract.TaskEntry.COLUMN_NAME_ENTRY_ID, newTask.getId());
121+
values.put(TasksPersistenceContract.TaskEntry.COLUMN_NAME_TITLE, newTask.getTitle());
122+
values.put(TasksPersistenceContract.TaskEntry.COLUMN_NAME_DESCRIPTION, newTask.getDescription());
123+
values.put(TasksPersistenceContract.TaskEntry.COLUMN_NAME_COMPLETED, newTask.isCompleted() ? 1 : 0);
124+
125+
String[] selectionArgs = {newTask.getId()};
126+
105127
mLocalDataSource.saveTask(newTask);
106-
mLocalDataSource.completeTask(newTask);
128+
mLocalDataSource.updateTask(values, selectionArgs);
107129

108130
// When activated in the persistent repository
109-
mLocalDataSource.activateTask(newTask);
131+
mLocalDataSource.updateTask(values, selectionArgs);
110132

111133
// Then the task can be retrieved from the persistent repository and is active
112134
mLocalDataSource.getTask(newTask.getId());
@@ -118,16 +140,41 @@ public void activateTask_retrievedTaskIsActive() {
118140
public void clearCompletedTask_taskNotRetrievable() {
119141
// Given 2 new completed tasks and 1 active task in the persistent repository
120142
final Task newTask1 = new Task(TITLE, "");
121-
mLocalDataSource.saveTask(newTask1);
122-
mLocalDataSource.completeTask(newTask1);
143+
144+
// And it's representative content values
145+
ContentValues task1Values = new ContentValues();
146+
task1Values.put(TasksPersistenceContract.TaskEntry.COLUMN_NAME_ENTRY_ID, newTask1.getId());
147+
task1Values.put(TasksPersistenceContract.TaskEntry.COLUMN_NAME_TITLE, newTask1.getTitle());
148+
task1Values.put(TasksPersistenceContract.TaskEntry.COLUMN_NAME_DESCRIPTION, newTask1.getDescription());
149+
task1Values.put(TasksPersistenceContract.TaskEntry.COLUMN_NAME_COMPLETED, newTask1.isCompleted() ? 1 : 0);
150+
151+
String[] task1SelectionArgs = {newTask1.getId()};
152+
123153
final Task newTask2 = new Task(TITLE2, "");
124-
mLocalDataSource.saveTask(newTask2);
125-
mLocalDataSource.completeTask(newTask2);
154+
// And it's representative content values
155+
ContentValues task2Values = new ContentValues();
156+
task1Values.put(TasksPersistenceContract.TaskEntry.COLUMN_NAME_ENTRY_ID, newTask2.getId());
157+
task1Values.put(TasksPersistenceContract.TaskEntry.COLUMN_NAME_TITLE, newTask2.getTitle());
158+
task1Values.put(TasksPersistenceContract.TaskEntry.COLUMN_NAME_DESCRIPTION, newTask2.getDescription());
159+
task1Values.put(TasksPersistenceContract.TaskEntry.COLUMN_NAME_COMPLETED, newTask2.isCompleted() ? 1 : 0);
160+
161+
String[] task2SelectionArgs = {newTask2.getId()};
162+
126163
final Task newTask3 = new Task(TITLE3, "");
164+
165+
mLocalDataSource.saveTask(newTask1);
166+
mLocalDataSource.updateTask(task1Values, task1SelectionArgs);
167+
168+
mLocalDataSource.saveTask(newTask2);
169+
mLocalDataSource.updateTask(task2Values, task2SelectionArgs);
170+
127171
mLocalDataSource.saveTask(newTask3);
128172

129173
// When completed tasks are cleared in the repository
130-
mLocalDataSource.clearCompletedTasks();
174+
String selection = TasksPersistenceContract.TaskEntry.COLUMN_NAME_COMPLETED + " LIKE ?";
175+
String[] selectionArgs = {"1"};
176+
177+
mLocalDataSource.clearCompletedTasks(selection, selectionArgs);
131178

132179
// Then the completed tasks cannot be retrieved and the active one can
133180
assertThat(mLocalDataSource.getTask(newTask1.getId()), is(isNull()));
@@ -145,8 +192,9 @@ public void deleteAllTasks_emptyListOfRetrievedTask() {
145192
mLocalDataSource.deleteAllTasks();
146193

147194
// Then the retrieved tasks is an empty list
148-
List<Task> tasks = mLocalDataSource.getTasks();
149-
assertEquals(tasks.size(), 0);
195+
Cursor cursor = mLocalDataSource.getTasks(null, null);
196+
assertNotNull(cursor);
197+
assertEquals(cursor.getCount(), 0);
150198
}
151199

152200
@Test
@@ -158,9 +206,17 @@ public void getTasks_retrieveSavedTasks() {
158206
mLocalDataSource.saveTask(newTask2);
159207

160208
// Then the tasks can be retrieved from the persistent repository
161-
List<Task> tasks = mLocalDataSource.getTasks();
162-
assertNotNull(tasks);
163-
assertTrue(tasks.size() >= 2);
209+
Cursor cursor = mLocalDataSource.getTasks(null, null);
210+
assertNotNull(cursor);
211+
assertTrue(cursor.getCount() >= 2);
212+
213+
List<Task> tasks = new ArrayList<>();
214+
if (cursor.moveToFirst()) {
215+
do {
216+
Task task = Task.from(cursor);
217+
tasks.add(task);
218+
} while (cursor.moveToNext());
219+
}
164220

165221
boolean newTask1IdFound = false;
166222
boolean newTask2IdFound = false;

todoapp/app/src/androidTest/java/com/example/android/architecture/blueprints/todoapp/tasks/TasksScreenTest.java

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,13 @@
1616

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

19-
import android.support.test.InstrumentationRegistry;
2019
import android.support.test.rule.ActivityTestRule;
2120
import android.support.test.runner.AndroidJUnit4;
2221
import android.test.suitebuilder.annotation.LargeTest;
2322
import android.text.TextUtils;
2423
import android.view.View;
2524
import android.widget.ListView;
2625

27-
import com.example.android.architecture.blueprints.todoapp.Injection;
2826
import com.example.android.architecture.blueprints.todoapp.R;
2927
import com.example.android.architecture.blueprints.todoapp.TestUtils;
3028
import com.example.android.architecture.blueprints.todoapp.data.source.TasksDataSource;
@@ -39,20 +37,10 @@
3937
import static android.support.test.InstrumentationRegistry.getTargetContext;
4038
import static android.support.test.espresso.Espresso.onView;
4139
import static android.support.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu;
42-
import static android.support.test.espresso.action.ViewActions.click;
43-
import static android.support.test.espresso.action.ViewActions.closeSoftKeyboard;
44-
import static android.support.test.espresso.action.ViewActions.replaceText;
45-
import static android.support.test.espresso.action.ViewActions.typeText;
40+
import static android.support.test.espresso.action.ViewActions.*;
4641
import static android.support.test.espresso.assertion.ViewAssertions.doesNotExist;
4742
import static android.support.test.espresso.assertion.ViewAssertions.matches;
48-
import static android.support.test.espresso.matcher.ViewMatchers.hasSibling;
49-
import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom;
50-
import static android.support.test.espresso.matcher.ViewMatchers.isChecked;
51-
import static android.support.test.espresso.matcher.ViewMatchers.isDescendantOfA;
52-
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
53-
import static android.support.test.espresso.matcher.ViewMatchers.withContentDescription;
54-
import static android.support.test.espresso.matcher.ViewMatchers.withId;
55-
import static android.support.test.espresso.matcher.ViewMatchers.withText;
43+
import static android.support.test.espresso.matcher.ViewMatchers.*;
5644
import static com.google.common.base.Preconditions.checkArgument;
5745
import static org.hamcrest.Matchers.allOf;
5846
import static org.hamcrest.core.IsNot.not;
@@ -87,9 +75,7 @@ public class TasksScreenTest {
8775
@Override
8876
protected void beforeActivityLaunched() {
8977
super.beforeActivityLaunched();
90-
// Doing this in @Before generates a race condition.
91-
Injection.provideTasksRepository(InstrumentationRegistry.getTargetContext())
92-
.deleteAllTasks();
78+
9379
}
9480
};
9581

todoapp/app/src/androidTestMock/java/com/example/android/architecture/blueprints/todoapp/statistics/StatisticsScreenTest.java

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import android.test.suitebuilder.annotation.LargeTest;
2424
import android.view.Gravity;
2525

26-
import com.example.android.architecture.blueprints.todoapp.Injection;
2726
import com.example.android.architecture.blueprints.todoapp.R;
2827
import com.example.android.architecture.blueprints.todoapp.data.FakeTasksRemoteDataSource;
2928
import com.example.android.architecture.blueprints.todoapp.data.Task;
@@ -38,9 +37,7 @@
3837
import org.junit.runner.RunWith;
3938

4039
import static android.support.test.espresso.Espresso.onView;
41-
import static android.support.test.espresso.action.ViewActions.click;
42-
import static android.support.test.espresso.action.ViewActions.closeSoftKeyboard;
43-
import static android.support.test.espresso.action.ViewActions.typeText;
40+
import static android.support.test.espresso.action.ViewActions.*;
4441
import static android.support.test.espresso.assertion.ViewAssertions.matches;
4542
import static android.support.test.espresso.contrib.DrawerActions.open;
4643
import static android.support.test.espresso.contrib.DrawerMatchers.isClosed;
@@ -63,8 +60,8 @@ public class StatisticsScreenTest {
6360

6461
/**
6562
* {@link ActivityTestRule} is a JUnit {@link Rule @Rule} to launch your activity under test.
66-
*
67-
* <p>
63+
* <p/>
64+
* <p/>
6865
* Rules are interceptors which are executed for each test method and are important building
6966
* blocks of Junit tests.
7067
*/
@@ -90,16 +87,15 @@ public class StatisticsScreenTest {
9087
protected void beforeActivityLaunched() {
9188
super.beforeActivityLaunched();
9289
// Doing this in @Before generates a race condition.
93-
Injection.provideTasksRepository(InstrumentationRegistry.getTargetContext())
94-
.deleteAllTasks();
90+
9591
}
9692
};
9793

9894
/**
9995
* Setup your test fixture with a fake task id. The {@link TaskDetailActivity} is started with
10096
* a particular task id, which is then loaded from the service API.
101-
*
102-
* <p>
97+
* <p/>
98+
* <p/>
10399
* Note that this test runs hermetically and is fully isolated using a fake implementation of
104100
* the service API. This is a great way to make your tests more reliable and faster at the same
105101
* time, since they are isolated from any outside dependencies.

todoapp/app/src/androidTestMock/java/com/example/android/architecture/blueprints/todoapp/taskdetail/TaskDetailScreenTest.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,10 @@
1616

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

19-
import android.support.test.InstrumentationRegistry;
2019
import android.support.test.rule.ActivityTestRule;
2120
import android.support.test.runner.AndroidJUnit4;
2221
import android.test.suitebuilder.annotation.LargeTest;
2322

24-
import com.example.android.architecture.blueprints.todoapp.Injection;
2523
import com.example.android.architecture.blueprints.todoapp.R;
2624
import com.example.android.architecture.blueprints.todoapp.TestUtils;
2725
import com.example.android.architecture.blueprints.todoapp.data.Task;
@@ -78,8 +76,7 @@ public class TaskDetailScreenTest {
7876
protected void beforeActivityLaunched() {
7977
super.beforeActivityLaunched();
8078
// Doing this in @Before generates a race condition.
81-
Injection.provideTasksRepository(InstrumentationRegistry.getTargetContext())
82-
.deleteAllTasks();
79+
8380
}
8481
};
8582

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import android.support.v7.app.AppCompatActivity;
2424
import android.support.v7.widget.Toolbar;
2525

26-
import com.example.android.architecture.blueprints.todoapp.Injection;
2726
import com.example.android.architecture.blueprints.todoapp.R;
2827
import com.example.android.architecture.blueprints.todoapp.data.source.LoaderProvider;
2928
import com.example.android.architecture.blueprints.todoapp.data.source.TaskLoader;
@@ -76,7 +75,7 @@ protected void onCreate(Bundle savedInstanceState) {
7675

7776
// Create the presenter
7877
LoaderProvider loaderProvider = new LoaderProvider(getApplicationContext());
79-
TasksOperations tasksOperations = new TasksOperations(loaderProvider, getSupportLoaderManager(), getContentResolver());
78+
TasksOperations tasksOperations = TasksOperations.getInstance(loaderProvider, getSupportLoaderManager(), getContentResolver());
8079

8180
// Create the presenter
8281
new AddEditTaskPresenter(

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414

1515
public class TasksOperations implements LoaderManager.LoaderCallbacks<Cursor> {
1616

17+
private static TasksOperations INSTANCE;
18+
1719
private final static int TASKS_QUERY = 1;
1820
public final static String KEY_TASK_FILTER = BuildConfig.APPLICATION_ID + "TASK_FILTER";
1921

@@ -23,7 +25,14 @@ public class TasksOperations implements LoaderManager.LoaderCallbacks<Cursor> {
2325

2426
private GetTasksCallback callback;
2527

26-
public TasksOperations(LoaderProvider mLoaderProvider, LoaderManager mLoaderManager, ContentResolver contentResolver) {
28+
public static TasksOperations getInstance(LoaderProvider mLoaderProvider, LoaderManager mLoaderManager, ContentResolver mContentResolver) {
29+
if (INSTANCE == null) {
30+
INSTANCE = new TasksOperations(mLoaderProvider, mLoaderManager, mContentResolver);
31+
}
32+
return INSTANCE;
33+
}
34+
35+
private TasksOperations(LoaderProvider mLoaderProvider, LoaderManager mLoaderManager, ContentResolver contentResolver) {
2736
this.mLoaderProvider = mLoaderProvider;
2837
this.mLoaderManager = mLoaderManager;
2938
this.mContentResolver = contentResolver;

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import android.support.v7.app.AppCompatActivity;
2626
import android.support.v7.widget.Toolbar;
2727

28-
import com.example.android.architecture.blueprints.todoapp.Injection;
2928
import com.example.android.architecture.blueprints.todoapp.R;
3029
import com.example.android.architecture.blueprints.todoapp.data.source.LoaderProvider;
3130
import com.example.android.architecture.blueprints.todoapp.data.source.TasksOperations;
@@ -69,7 +68,7 @@ protected void onCreate(Bundle savedInstanceState) {
6968
// Create the presenter
7069
LoaderProvider loaderProvider = new LoaderProvider(getApplicationContext());
7170
Loader<Cursor> taskLoader = loaderProvider.createTaskLoader(taskId);
72-
TasksOperations tasksOperations = new TasksOperations(loaderProvider, getSupportLoaderManager(), getContentResolver());
71+
TasksOperations tasksOperations = TasksOperations.getInstance(loaderProvider, getSupportLoaderManager(), getContentResolver());
7372

7473
// Create the presenter
7574
new TaskDetailPresenter(

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ protected void onCreate(Bundle savedInstanceState) {
7474

7575
// Create the presenter
7676
LoaderProvider loaderProvider = new LoaderProvider(getApplicationContext());
77-
TasksOperations tasksOperations = new TasksOperations(loaderProvider, getSupportLoaderManager(), getContentResolver());
77+
TasksOperations tasksOperations = TasksOperations.getInstance(loaderProvider, getSupportLoaderManager(), getContentResolver());
7878

7979
// Load previously saved state, if available.
8080
TaskFilter taskFilter = TaskFilter.from(TasksFilterType.ALL_TASKS);

todoapp/app/src/mock/java/com/example/android/architecture/blueprints/todoapp/Injection.java

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

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

19+
import android.content.ContentResolver;
1920
import android.content.Context;
2021
import android.support.annotation.NonNull;
22+
import android.support.v4.app.LoaderManager;
2123

2224
import com.example.android.architecture.blueprints.todoapp.data.FakeTasksRemoteDataSource;
25+
import com.example.android.architecture.blueprints.todoapp.data.source.LoaderProvider;
2326
import com.example.android.architecture.blueprints.todoapp.data.source.TasksDataSource;
27+
import com.example.android.architecture.blueprints.todoapp.data.source.TasksOperations;
2428
import com.example.android.architecture.blueprints.todoapp.data.source.local.TasksLocalDataSource;
2529

2630
import static com.google.common.base.Preconditions.checkNotNull;
@@ -32,11 +36,15 @@
3236
*/
3337
public class Injection {
3438

35-
public static TasksDataSource provideRemoteDataSource(){
39+
public static TasksOperations provideTasksOperations(LoaderProvider mLoaderProvider, LoaderManager mLoaderManager, ContentResolver mContentResolver) {
40+
return TasksOperations.getInstance(mLoaderProvider, mLoaderManager, mContentResolver);
41+
}
42+
43+
public static TasksDataSource provideRemoteDataSource() {
3644
return FakeTasksRemoteDataSource.getInstance();
3745
}
3846

39-
public static TasksLocalDataSource provideLocalDataSource(@NonNull Context context){
47+
public static TasksLocalDataSource provideLocalDataSource(@NonNull Context context) {
4048
checkNotNull(context);
4149
return TasksLocalDataSource.getInstance(context);
4250
}

0 commit comments

Comments
 (0)