diff --git a/app/schemas/com.todoroo.astrid.dao.Database/59.json b/app/schemas/com.todoroo.astrid.dao.Database/59.json new file mode 100644 index 000000000..16c832d02 --- /dev/null +++ b/app/schemas/com.todoroo.astrid.dao.Database/59.json @@ -0,0 +1,903 @@ +{ + "formatVersion": 1, + "database": { + "version": 59, + "identityHash": "1320507f7cf294e38cdd2d22d1ce4496", + "entities": [ + { + "tableName": "notification", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `task` INTEGER NOT NULL, `timestamp` INTEGER NOT NULL, `type` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "uid", + "columnName": "uid", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "taskId", + "columnName": "task", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "timestamp", + "columnName": "timestamp", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "uid" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_notification_task", + "unique": true, + "columnNames": [ + "task" + ], + "createSql": "CREATE UNIQUE INDEX `index_notification_task` ON `${TABLE_NAME}` (`task`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "tagdata", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT, `remoteId` TEXT, `name` TEXT, `color` INTEGER, `tagOrdering` TEXT)", + "fields": [ + { + "fieldPath": "id", + "columnName": "_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "remoteId", + "columnName": "remoteId", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "color", + "columnName": "color", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "tagOrdering", + "columnName": "tagOrdering", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "_id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "userActivity", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT, `remoteId` TEXT, `message` TEXT, `picture` TEXT, `target_id` TEXT, `created_at` INTEGER)", + "fields": [ + { + "fieldPath": "id", + "columnName": "_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "remoteId", + "columnName": "remoteId", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "message", + "columnName": "message", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "picture", + "columnName": "picture", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "targetId", + "columnName": "target_id", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "created", + "columnName": "created_at", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "_id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "task_attachments", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT, `remoteId` TEXT, `task_id` TEXT, `name` TEXT, `path` TEXT, `content_type` TEXT)", + "fields": [ + { + "fieldPath": "id", + "columnName": "_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "remoteId", + "columnName": "remoteId", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "taskId", + "columnName": "task_id", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "path", + "columnName": "path", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "contentType", + "columnName": "content_type", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "_id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "task_list_metadata", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT, `remoteId` TEXT, `tag_uuid` TEXT, `filter` TEXT, `task_ids` TEXT)", + "fields": [ + { + "fieldPath": "id", + "columnName": "_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "remoteId", + "columnName": "remoteId", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "tagUuid", + "columnName": "tag_uuid", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "filter", + "columnName": "filter", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "taskIds", + "columnName": "task_ids", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "_id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "tasks", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT, `title` TEXT, `importance` INTEGER, `dueDate` INTEGER, `hideUntil` INTEGER, `created` INTEGER, `modified` INTEGER, `completed` INTEGER, `deleted` INTEGER, `notes` TEXT, `estimatedSeconds` INTEGER, `elapsedSeconds` INTEGER, `timerStart` INTEGER, `notificationFlags` INTEGER, `notifications` INTEGER, `lastNotified` INTEGER, `snoozeTime` INTEGER, `recurrence` TEXT, `repeatUntil` INTEGER, `calendarUri` TEXT, `remoteId` TEXT)", + "fields": [ + { + "fieldPath": "id", + "columnName": "_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "priority", + "columnName": "importance", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "dueDate", + "columnName": "dueDate", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "hideUntil", + "columnName": "hideUntil", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "created", + "columnName": "created", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "modified", + "columnName": "modified", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "completed", + "columnName": "completed", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "deleted", + "columnName": "deleted", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "notes", + "columnName": "notes", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "estimatedSeconds", + "columnName": "estimatedSeconds", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "elapsedSeconds", + "columnName": "elapsedSeconds", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "timerStart", + "columnName": "timerStart", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "notificationFlags", + "columnName": "notificationFlags", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "notifications", + "columnName": "notifications", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "lastNotified", + "columnName": "lastNotified", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "snoozeTime", + "columnName": "snoozeTime", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "recurrence", + "columnName": "recurrence", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "repeatUntil", + "columnName": "repeatUntil", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "calendarUri", + "columnName": "calendarUri", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "remoteId", + "columnName": "remoteId", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "_id" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "t_rid", + "unique": true, + "columnNames": [ + "remoteId" + ], + "createSql": "CREATE UNIQUE INDEX `t_rid` ON `${TABLE_NAME}` (`remoteId`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "alarms", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `task` INTEGER NOT NULL, `time` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "task", + "columnName": "task", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "time", + "columnName": "time", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "_id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "locations", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `task` INTEGER NOT NULL, `name` TEXT, `latitude` REAL NOT NULL, `longitude` REAL NOT NULL, `radius` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "task", + "columnName": "task", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "latitude", + "columnName": "latitude", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "longitude", + "columnName": "longitude", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "radius", + "columnName": "radius", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "_id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "tags", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `task` INTEGER NOT NULL, `name` TEXT, `tag_uid` TEXT, `task_uid` TEXT)", + "fields": [ + { + "fieldPath": "id", + "columnName": "_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "task", + "columnName": "task", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "tagUid", + "columnName": "tag_uid", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "taskUid", + "columnName": "task_uid", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "_id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "google_tasks", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `task` INTEGER NOT NULL, `remote_id` TEXT, `list_id` TEXT, `parent` INTEGER NOT NULL, `indent` INTEGER NOT NULL, `order` INTEGER NOT NULL, `remote_order` INTEGER NOT NULL, `last_sync` INTEGER NOT NULL, `deleted` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "task", + "columnName": "task", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "remoteId", + "columnName": "remote_id", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "listId", + "columnName": "list_id", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "parent", + "columnName": "parent", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "indent", + "columnName": "indent", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "order", + "columnName": "order", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "remoteOrder", + "columnName": "remote_order", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lastSync", + "columnName": "last_sync", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deleted", + "columnName": "deleted", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "_id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "filters", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `title` TEXT, `sql` TEXT, `values` TEXT, `criterion` TEXT)", + "fields": [ + { + "fieldPath": "id", + "columnName": "_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "sql", + "columnName": "sql", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "values", + "columnName": "values", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "criterion", + "columnName": "criterion", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "_id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "google_task_lists", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `account` TEXT, `remote_id` TEXT, `title` TEXT, `remote_order` INTEGER NOT NULL, `last_sync` INTEGER NOT NULL, `deleted` INTEGER NOT NULL, `color` INTEGER)", + "fields": [ + { + "fieldPath": "id", + "columnName": "_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "account", + "columnName": "account", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "remoteId", + "columnName": "remote_id", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "remoteOrder", + "columnName": "remote_order", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lastSync", + "columnName": "last_sync", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deleted", + "columnName": "deleted", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "color", + "columnName": "color", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "_id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "caldav_calendar", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `account` TEXT, `uuid` TEXT, `name` TEXT, `color` INTEGER NOT NULL, `ctag` TEXT, `url` TEXT)", + "fields": [ + { + "fieldPath": "id", + "columnName": "_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "account", + "columnName": "account", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "uuid", + "columnName": "uuid", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "color", + "columnName": "color", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "ctag", + "columnName": "ctag", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "_id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "caldav_tasks", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `task` INTEGER NOT NULL, `calendar` TEXT, `object` TEXT, `remote_id` TEXT, `etag` TEXT, `last_sync` INTEGER NOT NULL, `deleted` INTEGER NOT NULL, `vtodo` TEXT)", + "fields": [ + { + "fieldPath": "id", + "columnName": "_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "task", + "columnName": "task", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "calendar", + "columnName": "calendar", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "object", + "columnName": "object", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "remoteId", + "columnName": "remote_id", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "etag", + "columnName": "etag", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "lastSync", + "columnName": "last_sync", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "deleted", + "columnName": "deleted", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "vtodo", + "columnName": "vtodo", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "_id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "caldav_account", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `uuid` TEXT, `name` TEXT, `url` TEXT, `username` TEXT, `password` TEXT)", + "fields": [ + { + "fieldPath": "id", + "columnName": "_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "uuid", + "columnName": "uuid", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "username", + "columnName": "username", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "password", + "columnName": "password", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "_id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "google_task_accounts", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `account` TEXT)", + "fields": [ + { + "fieldPath": "id", + "columnName": "_id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "account", + "columnName": "account", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "_id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + } + ], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"1320507f7cf294e38cdd2d22d1ce4496\")" + ] + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/org/tasks/makers/GtaskListMaker.java b/app/src/androidTest/java/org/tasks/makers/GtaskListMaker.java index 8dcbedadd..b8739d366 100644 --- a/app/src/androidTest/java/org/tasks/makers/GtaskListMaker.java +++ b/app/src/androidTest/java/org/tasks/makers/GtaskListMaker.java @@ -11,6 +11,7 @@ import org.tasks.data.GoogleTaskList; public class GtaskListMaker { public static final Property ID = newProperty(); + public static final Property ACCOUNT = newProperty(); public static final Property REMOTE_ID = newProperty(); public static final Property LAST_SYNC = newProperty(); public static final Property NAME = newProperty(); @@ -22,6 +23,7 @@ public class GtaskListMaker { { setDeleted(0L); setId(lookup.valueOf(GtaskListMaker.ID, 0L)); + setAccount(lookup.valueOf(ACCOUNT, "account")); setRemoteId(lookup.valueOf(REMOTE_ID, "1")); setTitle(lookup.valueOf(NAME, "Default")); setRemoteOrder(lookup.valueOf(ORDER, 0)); diff --git a/app/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksIndentActionTest.java b/app/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksIndentActionTest.java index ee278288a..399862949 100644 --- a/app/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksIndentActionTest.java +++ b/app/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksIndentActionTest.java @@ -18,8 +18,10 @@ import javax.inject.Inject; import org.junit.Test; import org.junit.runner.RunWith; import org.tasks.data.GoogleTask; +import org.tasks.data.GoogleTaskAccount; import org.tasks.data.GoogleTaskDao; import org.tasks.data.GoogleTaskList; +import org.tasks.data.GoogleTaskListDao; import org.tasks.injection.InjectingTestCase; import org.tasks.injection.TestComponent; @@ -28,6 +30,7 @@ import org.tasks.injection.TestComponent; public class GtasksIndentActionTest extends InjectingTestCase { @Inject GtasksListService gtasksListService; + @Inject GoogleTaskListDao googleTaskListDao; @Inject GtasksTaskListUpdater gtasksTaskListUpdater; @Inject TaskDao taskDao; @Inject GoogleTaskDao googleTaskDao; @@ -159,9 +162,11 @@ public class GtasksIndentActionTest extends InjectingTestCase { list.setId("list"); list.setTitle("Test Tasks"); items.add(list); - gtasksListService.updateLists(items); + GoogleTaskAccount account = new GoogleTaskAccount("account"); + googleTaskListDao.insert(account); + gtasksListService.updateLists(account, items); - storeList = gtasksListService.getLists().get(0); + storeList = googleTaskListDao.getActiveLists("account").get(0); } @Override @@ -199,4 +204,5 @@ public class GtasksIndentActionTest extends InjectingTestCase { taskDao.createNew(task); return task; } + } diff --git a/app/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksListServiceTest.java b/app/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksListServiceTest.java index 73059a9a5..303886faf 100644 --- a/app/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksListServiceTest.java +++ b/app/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksListServiceTest.java @@ -22,6 +22,7 @@ import javax.inject.Inject; import org.junit.Test; import org.junit.runner.RunWith; import org.tasks.LocalBroadcastManager; +import org.tasks.data.GoogleTaskAccount; import org.tasks.data.GoogleTaskDao; import org.tasks.data.GoogleTaskList; import org.tasks.data.GoogleTaskListDao; @@ -87,7 +88,7 @@ public class GtasksListServiceTest extends InjectingTestCase { assertEquals( singletonList(newGtaskList(with(ID, 2L), with(REMOTE_ID, "2"))), - googleTaskListDao.getActiveLists()); + googleTaskListDao.getActiveLists("account")); } @Test @@ -122,6 +123,8 @@ public class GtasksListServiceTest extends InjectingTestCase { } private void setLists(TaskList... list) { - gtasksListService.updateLists(asList(list)); + GoogleTaskAccount account = new GoogleTaskAccount("account"); + googleTaskListDao.insert(account); + gtasksListService.updateLists(account, asList(list)); } } diff --git a/app/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksMetadataServiceTest.java b/app/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksMetadataServiceTest.java index 40f70537a..6ef51d75b 100644 --- a/app/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksMetadataServiceTest.java +++ b/app/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksMetadataServiceTest.java @@ -5,17 +5,12 @@ */ package com.todoroo.astrid.gtasks; -import static android.support.test.InstrumentationRegistry.getTargetContext; import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.assertNull; -import android.content.Context; import android.support.test.runner.AndroidJUnit4; import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.data.Task; -import dagger.Module; -import dagger.Provides; -import dagger.Subcomponent; import javax.inject.Inject; import org.junit.Test; import org.junit.runner.RunWith; @@ -23,7 +18,6 @@ import org.tasks.data.GoogleTask; import org.tasks.data.GoogleTaskDao; import org.tasks.injection.InjectingTestCase; import org.tasks.injection.TestComponent; -import org.tasks.preferences.Preferences; @SuppressWarnings("nls") @RunWith(AndroidJUnit4.class) @@ -36,7 +30,7 @@ public class GtasksMetadataServiceTest extends InjectingTestCase { @Override protected void inject(TestComponent component) { - component.plus(new GtasksMetadataServiceTestModule(getTargetContext())).inject(this); + component.inject(this); } @Test @@ -94,30 +88,4 @@ public class GtasksMetadataServiceTest extends InjectingTestCase { taskDao.createNew(task); return task; } - - @Subcomponent(modules = GtasksMetadataServiceTest.GtasksMetadataServiceTestModule.class) - public interface GtasksMetadataServiceTestComponent { - - void inject(GtasksMetadataServiceTest gtasksMetadataServiceTest); - } - - @Module - public class GtasksMetadataServiceTestModule { - - private final GtasksTestPreferenceService service; - - public GtasksMetadataServiceTestModule(Context context) { - service = new GtasksTestPreferenceService(new Preferences(context, null)); - } - - @Provides - public GtasksTestPreferenceService getGtasksTestPreferenceService() { - return service; - } - - @Provides - public GtasksPreferenceService getGtasksPreferenceService() { - return service; - } - } } diff --git a/app/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksTaskListUpdaterTest.java b/app/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksTaskListUpdaterTest.java index ea7cb32ef..a063d7d5d 100644 --- a/app/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksTaskListUpdaterTest.java +++ b/app/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksTaskListUpdaterTest.java @@ -19,8 +19,10 @@ import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.tasks.data.GoogleTask; +import org.tasks.data.GoogleTaskAccount; import org.tasks.data.GoogleTaskDao; import org.tasks.data.GoogleTaskList; +import org.tasks.data.GoogleTaskListDao; import org.tasks.injection.InjectingTestCase; import org.tasks.injection.TestComponent; @@ -34,6 +36,7 @@ public class GtasksTaskListUpdaterTest extends InjectingTestCase { @Inject GtasksListService gtasksListService; @Inject TaskDao taskDao; @Inject GoogleTaskDao googleTaskDao; + @Inject GoogleTaskListDao googleTaskListDao; @Test public void testBasicParentComputation() { @@ -149,7 +152,9 @@ public class GtasksTaskListUpdaterTest extends InjectingTestCase { list.setId("1"); list.setTitle("Tim's Tasks"); items.add(list); - gtasksListService.updateLists(items); + GoogleTaskAccount account = new GoogleTaskAccount("account"); + googleTaskListDao.insert(account); + gtasksListService.updateLists(account, items); } @Override @@ -162,7 +167,7 @@ public class GtasksTaskListUpdaterTest extends InjectingTestCase { } private void createParentSiblingMaps() { - for (GoogleTaskList list : gtasksListService.getLists()) { + for (GoogleTaskList list : googleTaskListDao.getActiveLists("account")) { gtasksTaskListUpdater.updateParentSiblingMapsFor(list); } } diff --git a/app/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksTaskMovingTest.java b/app/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksTaskMovingTest.java index ef6328a86..0fff940e6 100644 --- a/app/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksTaskMovingTest.java +++ b/app/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksTaskMovingTest.java @@ -18,8 +18,10 @@ import javax.inject.Inject; import org.junit.Test; import org.junit.runner.RunWith; import org.tasks.data.GoogleTask; +import org.tasks.data.GoogleTaskAccount; import org.tasks.data.GoogleTaskDao; import org.tasks.data.GoogleTaskList; +import org.tasks.data.GoogleTaskListDao; import org.tasks.injection.InjectingTestCase; import org.tasks.injection.TestComponent; @@ -33,6 +35,7 @@ public class GtasksTaskMovingTest extends InjectingTestCase { @Inject GtasksTaskListUpdater gtasksTaskListUpdater; @Inject TaskDao taskDao; @Inject GoogleTaskDao googleTaskDao; + @Inject GoogleTaskListDao googleTaskListDao; private Task A, B, C, D, E, F; private GoogleTaskList list; @@ -265,9 +268,11 @@ public class GtasksTaskMovingTest extends InjectingTestCase { taskList.setId("1"); taskList.setTitle("Tim's Tasks"); items.add(taskList); - gtasksListService.updateLists(items); + GoogleTaskAccount account = new GoogleTaskAccount("account"); + googleTaskListDao.insert(account); + gtasksListService.updateLists(account, items); - list = gtasksListService.getLists().get(0); + list = googleTaskListDao.getActiveLists("account").get(0); } @Override diff --git a/app/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksTestPreferenceService.java b/app/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksTestPreferenceService.java deleted file mode 100644 index 57fdf4199..000000000 --- a/app/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksTestPreferenceService.java +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) 2012 Todoroo Inc - * - *

See the file "LICENSE" for the full license governing this code. - */ -package com.todoroo.astrid.gtasks; - -import org.tasks.preferences.Preferences; - -public class GtasksTestPreferenceService extends GtasksPreferenceService { - - public GtasksTestPreferenceService(Preferences preferences) { - super(preferences); - } - - @Override - public long getLastSyncDate() { - return 0L; - } -} diff --git a/app/src/androidTestGoogleplay/java/org/tasks/injection/TestComponent.java b/app/src/androidTestGoogleplay/java/org/tasks/injection/TestComponent.java index afb9f1d35..719c996c1 100644 --- a/app/src/androidTestGoogleplay/java/org/tasks/injection/TestComponent.java +++ b/app/src/androidTestGoogleplay/java/org/tasks/injection/TestComponent.java @@ -22,9 +22,6 @@ import org.tasks.jobs.BackupServiceTests; @Component(modules = TestModule.class) public interface TestComponent { - GtasksMetadataServiceTest.GtasksMetadataServiceTestComponent plus( - GtasksMetadataServiceTest.GtasksMetadataServiceTestModule gtasksMetadataServiceTestModule); - void inject(GtasksIndentActionTest gtasksIndentActionTest); void inject(GtasksTaskMovingTest gtasksTaskMovingTest); @@ -54,4 +51,6 @@ public interface TestComponent { void inject(AlarmJobServiceTest alarmServiceTest); void inject(RepeatTaskHelperTest repeatTaskHelperTest); + + void inject(GtasksMetadataServiceTest gtasksMetadataServiceTest); } diff --git a/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java b/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java index 56423b25a..aea440a94 100644 --- a/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java +++ b/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java @@ -41,7 +41,6 @@ import com.todoroo.astrid.api.CustomFilter; import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.core.BuiltInFilterExposer; import com.todoroo.astrid.data.Task; -import com.todoroo.astrid.gtasks.GtasksPreferenceService; import com.todoroo.astrid.gtasks.GtasksSubtaskListFragment; import com.todoroo.astrid.service.TaskCreator; import com.todoroo.astrid.service.TaskDeleter; @@ -95,7 +94,6 @@ public class TaskListFragment extends InjectingFragment @Inject TaskDeleter taskDeleter; @Inject @ForActivity Context context; @Inject Preferences preferences; - @Inject GtasksPreferenceService gtasksPreferenceService; @Inject DialogBuilder dialogBuilder; @Inject CheckBoxes checkBoxes; @Inject TaskCreator taskCreator; @@ -414,7 +412,7 @@ public class TaskListFragment extends InjectingFragment // TODO: compare indents in diff callback, then animate this loadTaskListContent(!(this instanceof GtasksSubtaskListFragment)); - setSyncOngoing(gtasksPreferenceService.isOngoing()); + setSyncOngoing(preferences.isSyncOngoing()); } /* diff --git a/app/src/main/java/com/todoroo/astrid/adapter/FilterAdapter.java b/app/src/main/java/com/todoroo/astrid/adapter/FilterAdapter.java index fd34096c4..8856a30c1 100644 --- a/app/src/main/java/com/todoroo/astrid/adapter/FilterAdapter.java +++ b/app/src/main/java/com/todoroo/astrid/adapter/FilterAdapter.java @@ -20,7 +20,6 @@ import android.support.v4.content.ContextCompat; import android.support.v4.content.res.ResourcesCompat; import android.support.v4.graphics.drawable.DrawableCompat; import android.support.v4.util.Pair; -import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -28,11 +27,9 @@ import android.widget.ArrayAdapter; import android.widget.CheckedTextView; import android.widget.ImageView; import android.widget.TextView; -import com.google.common.base.Strings; import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.FilterListItem; import com.todoroo.astrid.core.CustomFilterActivity; -import com.todoroo.astrid.gtasks.GtasksPreferenceService; import java.util.ArrayList; import java.util.List; import javax.inject.Inject; @@ -43,6 +40,7 @@ import org.tasks.billing.Inventory; import org.tasks.billing.PurchaseActivity; import org.tasks.caldav.CaldavCalendarSettingsActivity; import org.tasks.data.CaldavAccount; +import org.tasks.data.GoogleTaskAccount; import org.tasks.filters.FilterCounter; import org.tasks.filters.FilterProvider; import org.tasks.filters.NavigationDrawerAction; @@ -50,7 +48,6 @@ import org.tasks.filters.NavigationDrawerSeparator; import org.tasks.filters.NavigationDrawerSubheader; import org.tasks.locale.Locale; import org.tasks.preferences.BasicPreferences; -import org.tasks.preferences.Preferences; import org.tasks.themes.Theme; import org.tasks.themes.ThemeCache; import org.tasks.ui.NavigationDrawerFragment; @@ -68,7 +65,6 @@ public class FilterAdapter extends ArrayAdapter { private final Theme theme; private final Locale locale; private final Inventory inventory; - private final Preferences preferences; private final FilterListUpdateReceiver filterListUpdateReceiver = new FilterListUpdateReceiver(); private final List items = new ArrayList<>(); private final LayoutInflater inflater; @@ -84,8 +80,7 @@ public class FilterAdapter extends ArrayAdapter { Theme theme, ThemeCache themeCache, Locale locale, - Inventory inventory, - Preferences preferences) { + Inventory inventory) { super(activity, 0); this.filterProvider = filterProvider; this.filterCounter = filterCounter; @@ -93,7 +88,6 @@ public class FilterAdapter extends ArrayAdapter { this.theme = theme; this.locale = locale; this.inventory = inventory; - this.preferences = preferences; this.inflater = theme.getLayoutInflater(activity); this.themeCache = themeCache; } @@ -230,8 +224,7 @@ public class FilterAdapter extends ArrayAdapter { return getView(position, convertView, parent); } - private void addSubMenu( - final int titleResource, List filters, boolean hideIfEmpty) { + private void addSubMenu(final int titleResource, List filters, boolean hideIfEmpty) { addSubMenu(activity.getResources().getString(titleResource), filters, hideIfEmpty); } @@ -264,19 +257,12 @@ public class FilterAdapter extends ArrayAdapter { item.icon = R.drawable.ic_cloud_off_black_24dp; add(item); - String googleTaskTitle = preferences.getStringValue(GtasksPreferenceService.PREF_USER_NAME); - if (Strings.isNullOrEmpty(googleTaskTitle)) { - googleTaskTitle = activity.getResources().getString(R.string.gtasks_GPr_header); + for (Pair> filters : filterProvider.getGoogleTaskFilters()) { + addSubMenu(filters.first.getAccount(), filters.second, true); } - addSubMenu(googleTaskTitle, filterProvider.getGoogleTaskFilters(), true); for (Pair> filters : filterProvider.getCaldavFilters()) { - CaldavAccount account = filters.first; - String caldavTitle = account.getName(); - if (TextUtils.isEmpty(caldavTitle)) { - caldavTitle = activity.getString(R.string.CalDAV); - } - addSubMenu(caldavTitle, filters.second, true); + addSubMenu(filters.first.getName(), filters.second, true); } notifyDataSetChanged(); @@ -309,31 +295,24 @@ public class FilterAdapter extends ArrayAdapter { NavigationDrawerFragment.REQUEST_NEW_LIST)); } - List googleTaskFilters = filterProvider.getGoogleTaskFilters(); - if (!googleTaskFilters.isEmpty()) { - String title = preferences.getStringValue(GtasksPreferenceService.PREF_USER_NAME); - if (Strings.isNullOrEmpty(title)) { - title = activity.getResources().getString(R.string.gtasks_GPr_header); - } - addSubMenu(title, googleTaskFilters, true); + for (Pair> filters : filterProvider.getGoogleTaskFilters()) { + GoogleTaskAccount account = filters.first; + addSubMenu(account.getAccount(), filters.second, !navigationDrawer); if (navigationDrawer) { add( new NavigationDrawerAction( activity.getResources().getString(R.string.new_list), R.drawable.ic_add_24dp, - new Intent(activity, GoogleTaskListSettingsActivity.class), + new Intent(activity, GoogleTaskListSettingsActivity.class) + .putExtra(GoogleTaskListSettingsActivity.EXTRA_ACCOUNT, account), NavigationDrawerFragment.REQUEST_NEW_GTASK_LIST)); } } for (Pair> filters : filterProvider.getCaldavFilters()) { CaldavAccount account = filters.first; - String title = account.getName(); - if (TextUtils.isEmpty(title)) { - title = activity.getString(R.string.CalDAV); - } - addSubMenu(title, filters.second, !navigationDrawer); + addSubMenu(account.getName(), filters.second, !navigationDrawer); if (navigationDrawer) { add( diff --git a/app/src/main/java/com/todoroo/astrid/dao/Database.java b/app/src/main/java/com/todoroo/astrid/dao/Database.java index 2a88f7a77..7594aa2b0 100644 --- a/app/src/main/java/com/todoroo/astrid/dao/Database.java +++ b/app/src/main/java/com/todoroo/astrid/dao/Database.java @@ -21,6 +21,7 @@ import org.tasks.data.CaldavTask; import org.tasks.data.Filter; import org.tasks.data.FilterDao; import org.tasks.data.GoogleTask; +import org.tasks.data.GoogleTaskAccount; import org.tasks.data.GoogleTaskDao; import org.tasks.data.GoogleTaskList; import org.tasks.data.GoogleTaskListDao; @@ -56,9 +57,10 @@ import timber.log.Timber; GoogleTaskList.class, CaldavCalendar.class, CaldavTask.class, - CaldavAccount.class + CaldavAccount.class, + GoogleTaskAccount.class }, - version = 58 + version = 59 ) public abstract class Database extends RoomDatabase { diff --git a/app/src/main/java/com/todoroo/astrid/gtasks/GtasksFilterExposer.java b/app/src/main/java/com/todoroo/astrid/gtasks/GtasksFilterExposer.java index 730e34fcd..39b09deb0 100644 --- a/app/src/main/java/com/todoroo/astrid/gtasks/GtasksFilterExposer.java +++ b/app/src/main/java/com/todoroo/astrid/gtasks/GtasksFilterExposer.java @@ -6,13 +6,18 @@ package com.todoroo.astrid.gtasks; import static com.google.common.collect.Lists.newArrayList; +import static com.google.common.collect.Lists.transform; import static java.util.Collections.emptyList; +import android.support.v4.util.Pair; import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.GtasksFilter; +import java.util.ArrayList; import java.util.List; import javax.inject.Inject; +import org.tasks.data.GoogleTaskAccount; import org.tasks.data.GoogleTaskList; +import org.tasks.data.GoogleTaskListDao; import org.tasks.sync.SyncAdapters; /** @@ -24,22 +29,20 @@ public class GtasksFilterExposer { private final GtasksListService gtasksListService; private final SyncAdapters syncAdapters; + private final GoogleTaskListDao googleTaskListDao; @Inject - public GtasksFilterExposer(GtasksListService gtasksListService, SyncAdapters syncAdapters) { + public GtasksFilterExposer(GtasksListService gtasksListService, SyncAdapters syncAdapters, GoogleTaskListDao googleTaskListDao) { this.gtasksListService = gtasksListService; this.syncAdapters = syncAdapters; + this.googleTaskListDao = googleTaskListDao; } - public List getFilters() { - // if we aren't logged in (or we are logged in to astrid.com), don't expose features - if (!syncAdapters.isGoogleTaskSyncEnabled()) { - return emptyList(); - } - - List listFilters = newArrayList(); - for (GoogleTaskList list : gtasksListService.getLists()) { - listFilters.add(filterFromList(list)); + public List>> getFilters() { + List>> listFilters = newArrayList(); + for (GoogleTaskAccount account : googleTaskListDao.getAccounts()) { + List lists = googleTaskListDao.getActiveLists(account.getAccount()); + listFilters.add(new Pair<>(account, transform(lists, GtasksFilter::new))); } return listFilters; } diff --git a/app/src/main/java/com/todoroo/astrid/gtasks/GtasksListService.java b/app/src/main/java/com/todoroo/astrid/gtasks/GtasksListService.java index cd2ad990c..f9a8b5297 100644 --- a/app/src/main/java/com/todoroo/astrid/gtasks/GtasksListService.java +++ b/app/src/main/java/com/todoroo/astrid/gtasks/GtasksListService.java @@ -17,6 +17,7 @@ import java.util.List; import java.util.Set; import javax.inject.Inject; import org.tasks.LocalBroadcastManager; +import org.tasks.data.GoogleTaskAccount; import org.tasks.data.GoogleTaskDao; import org.tasks.data.GoogleTaskList; import org.tasks.data.GoogleTaskListDao; @@ -44,10 +45,6 @@ public class GtasksListService { this.taskDao = taskDao; } - public List getLists() { - return googleTaskListDao.getActiveLists(); - } - public GoogleTaskList getList(long id) { return googleTaskListDao.getById(id); } @@ -57,8 +54,8 @@ public class GtasksListService { * * @param remoteLists remote information about your lists */ - public synchronized void updateLists(List remoteLists) { - List lists = getLists(); + public synchronized void updateLists(GoogleTaskAccount account, List remoteLists) { + List lists = googleTaskListDao.getActiveLists(account.getAccount()); Set previousLists = new HashSet<>(); for (GoogleTaskList list : lists) { @@ -79,9 +76,16 @@ public class GtasksListService { String title = remote.getTitle(); if (local == null) { - Timber.d("Adding new gtask list %s", title); - local = new GoogleTaskList(); - local.setRemoteId(id); + GoogleTaskList byRemoteId = googleTaskListDao.findExistingList(id); + if (byRemoteId != null) { + byRemoteId.setAccount(account.getAccount()); + local = byRemoteId; + } else { + Timber.d("Adding new gtask list %s", title); + local = new GoogleTaskList(); + local.setAccount(account.getAccount()); + local.setRemoteId(id); + } } local.setTitle(title); @@ -126,11 +130,6 @@ public class GtasksListService { } public GoogleTaskList getList(String listId) { - for (GoogleTaskList list : getLists()) { - if (list != null && list.getRemoteId().equals(listId)) { - return list; - } - } - return null; + return googleTaskListDao.getByRemoteId(listId); } } diff --git a/app/src/main/java/com/todoroo/astrid/gtasks/GtasksPreferenceService.java b/app/src/main/java/com/todoroo/astrid/gtasks/GtasksPreferenceService.java deleted file mode 100644 index e094984d6..000000000 --- a/app/src/main/java/com/todoroo/astrid/gtasks/GtasksPreferenceService.java +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Copyright (c) 2012 Todoroo Inc - * - *

See the file "LICENSE" for the full license governing this code. - */ -package com.todoroo.astrid.gtasks; - -import com.todoroo.andlib.utility.DateUtilities; -import javax.inject.Inject; -import org.tasks.preferences.Preferences; - -/** - * Methods for working with GTasks preferences - * - * @author timsu - */ -public class GtasksPreferenceService { - - private static final String IDENTIFIER = "gtasks"; // $NON-NLS-1$ - public static final String PREF_USER_NAME = IDENTIFIER + "_user"; // $NON-NLS-1$ - private static final String PREF_LAST_SYNC = "_last_sync"; // $NON-NLS-1$ - private final Preferences preferences; - - @Inject - public GtasksPreferenceService(Preferences preferences) { - this.preferences = preferences; - } - - public String getUserName() { - return preferences.getStringValue(PREF_USER_NAME); - } - - public void setUserName(String userName) { - preferences.setString(PREF_USER_NAME, userName); - } - - /** @return Last Successful Sync Date, or 0 */ - public long getLastSyncDate() { - return preferences.getLong(IDENTIFIER + PREF_LAST_SYNC, 0); - } - - /** Deletes Last Successful Sync Date */ - public void clearLastSyncDate() { - preferences.clear(IDENTIFIER + PREF_LAST_SYNC); - } - - /** Set Last Successful Sync Date */ - public void recordSuccessfulSync() { - preferences.setLong(IDENTIFIER + PREF_LAST_SYNC, DateUtilities.now() + 1000); - } - - public boolean isOngoing() { - return preferences.isSyncOngoing(); - } -} diff --git a/app/src/main/java/com/todoroo/astrid/gtasks/GtasksTaskListUpdater.java b/app/src/main/java/com/todoroo/astrid/gtasks/GtasksTaskListUpdater.java index dfc6c38bc..037ea81a0 100644 --- a/app/src/main/java/com/todoroo/astrid/gtasks/GtasksTaskListUpdater.java +++ b/app/src/main/java/com/todoroo/astrid/gtasks/GtasksTaskListUpdater.java @@ -58,8 +58,8 @@ public class GtasksTaskListUpdater { gtasksSyncService.iterateThroughList(listId, iterator, 0, false); } - private void onMovedOrIndented(GoogleTask googleTask) { - gtasksSyncService.triggerMoveForMetadata(googleTask); + private void onMovedOrIndented(GoogleTaskList googleTaskList, GoogleTask googleTask) { + gtasksSyncService.triggerMoveForMetadata(googleTaskList, googleTask); } // --- used during synchronization @@ -176,7 +176,7 @@ public class GtasksTaskListUpdater { saveAndUpdateModifiedDate(googleTask); }); - onMovedOrIndented(getTaskMetadata(targetTaskId)); + onMovedOrIndented(list, getTaskMetadata(targetTaskId)); } /** @@ -242,7 +242,7 @@ public class GtasksTaskListUpdater { } traverseTreeAndWriteValues(list, root, new AtomicLong(0), -1); - onMovedOrIndented(getTaskMetadata(targetTaskId)); + onMovedOrIndented(list, getTaskMetadata(targetTaskId)); } // --- task moving @@ -273,7 +273,7 @@ public class GtasksTaskListUpdater { } saveAndUpdateModifiedDate(googleTask); if (parentChanged) { - onMovedOrIndented(googleTask); + onMovedOrIndented(list, googleTask); } } diff --git a/app/src/main/java/com/todoroo/astrid/gtasks/api/GtasksInvoker.java b/app/src/main/java/com/todoroo/astrid/gtasks/api/GtasksInvoker.java index b956e23db..a75ee5aea 100644 --- a/app/src/main/java/com/todoroo/astrid/gtasks/api/GtasksInvoker.java +++ b/app/src/main/java/com/todoroo/astrid/gtasks/api/GtasksInvoker.java @@ -13,15 +13,12 @@ import com.google.api.services.tasks.TasksScopes; import com.google.api.services.tasks.model.Task; import com.google.api.services.tasks.model.TaskList; import com.google.api.services.tasks.model.TaskLists; -import com.todoroo.astrid.gtasks.GtasksPreferenceService; import java.io.IOException; import java.util.Collections; -import javax.inject.Inject; import org.tasks.BuildConfig; +import org.tasks.data.GoogleTaskAccount; import org.tasks.gtasks.GoogleTasksUnsuccessfulResponseHandler; import org.tasks.gtasks.PlayServices; -import org.tasks.injection.ApplicationScope; -import org.tasks.injection.ForApplication; import timber.log.Timber; /** @@ -30,32 +27,23 @@ import timber.log.Timber; * * @author Sam Bosley */ -@ApplicationScope public class GtasksInvoker { private final GoogleAccountCredential credential; private final PlayServices playServices; private final Tasks service; - @Inject - public GtasksInvoker( - @ForApplication Context context, - GtasksPreferenceService preferenceService, - PlayServices playServices) { - credential = - GoogleAccountCredential.usingOAuth2(context, Collections.singletonList(TasksScopes.TASKS)); + public GtasksInvoker(Context context, PlayServices playServices, String account) { this.playServices = playServices; - setUserName(preferenceService.getUserName()); + credential = + GoogleAccountCredential.usingOAuth2(context, Collections.singletonList(TasksScopes.TASKS)) + .setSelectedAccountName(account); service = new Tasks.Builder(new NetHttpTransport(), new JacksonFactory(), credential) .setApplicationName(String.format("Tasks/%s", BuildConfig.VERSION_NAME)) .build(); } - public void setUserName(String username) { - credential.setSelectedAccountName(username); - } - public TaskLists allGtaskLists(String pageToken) throws IOException { return execute(service.tasklists().list().setPageToken(pageToken)); } diff --git a/app/src/main/java/com/todoroo/astrid/gtasks/auth/GtasksLoginActivity.java b/app/src/main/java/com/todoroo/astrid/gtasks/auth/GtasksLoginActivity.java index 385cd19ed..38b689203 100644 --- a/app/src/main/java/com/todoroo/astrid/gtasks/auth/GtasksLoginActivity.java +++ b/app/src/main/java/com/todoroo/astrid/gtasks/auth/GtasksLoginActivity.java @@ -10,10 +10,10 @@ import android.content.Intent; import android.os.Bundle; import android.widget.Toast; import com.todoroo.andlib.utility.DialogUtilities; -import com.todoroo.astrid.gtasks.GtasksPreferenceService; -import com.todoroo.astrid.gtasks.api.GtasksInvoker; import javax.inject.Inject; import org.tasks.R; +import org.tasks.data.GoogleTaskAccount; +import org.tasks.data.GoogleTaskListDao; import org.tasks.dialogs.DialogBuilder; import org.tasks.gtasks.GoogleAccountManager; import org.tasks.gtasks.PlayServices; @@ -30,26 +30,20 @@ public class GtasksLoginActivity extends InjectingAppCompatActivity { public static final int RC_REQUEST_OAUTH = 10987; private static final int RC_CHOOSE_ACCOUNT = 10988; - @Inject GtasksPreferenceService gtasksPreferenceService; @Inject DialogBuilder dialogBuilder; @Inject GoogleAccountManager accountManager; - @Inject GtasksInvoker gtasksInvoker; @Inject PlayServices playServices; + @Inject GoogleTaskListDao googleTaskListDao; private String accountName; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - final String existingUsername = gtasksPreferenceService.getUserName(); - if (existingUsername != null && accountManager.hasAccount(existingUsername)) { - getAuthToken(existingUsername); - } else { - Intent chooseAccountIntent = - android.accounts.AccountManager.newChooseAccountIntent( - null, null, new String[] {"com.google"}, false, null, null, null, null); - startActivityForResult(chooseAccountIntent, RC_CHOOSE_ACCOUNT); - } + Intent chooseAccountIntent = + android.accounts.AccountManager.newChooseAccountIntent( + null, null, new String[] {"com.google"}, false, null, null, null, null); + startActivityForResult(chooseAccountIntent, RC_CHOOSE_ACCOUNT); } @Override @@ -71,9 +65,12 @@ public class GtasksLoginActivity extends InjectingAppCompatActivity { new AuthResultHandler() { @Override public void authenticationSuccessful(String accountName) { - gtasksPreferenceService.setUserName(accountName); - gtasksInvoker.setUserName(accountName); - setResult(RESULT_OK); + if (googleTaskListDao.getAccount(accountName) == null) { + GoogleTaskAccount googleTaskAccount = new GoogleTaskAccount(); + googleTaskAccount.setAccount(accountName); + googleTaskListDao.insert(googleTaskAccount); + setResult(RESULT_OK); + } finish(); DialogUtilities.dismissDialog(GtasksLoginActivity.this, pd); } diff --git a/app/src/main/java/com/todoroo/astrid/gtasks/sync/GtasksSyncService.java b/app/src/main/java/com/todoroo/astrid/gtasks/sync/GtasksSyncService.java index 66c07ac3a..d26b1412b 100644 --- a/app/src/main/java/com/todoroo/astrid/gtasks/sync/GtasksSyncService.java +++ b/app/src/main/java/com/todoroo/astrid/gtasks/sync/GtasksSyncService.java @@ -5,12 +5,12 @@ */ package com.todoroo.astrid.gtasks.sync; +import android.content.Context; import android.text.TextUtils; import com.google.api.client.googleapis.extensions.android.gms.auth.UserRecoverableAuthIOException; import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.data.Task; -import com.todoroo.astrid.gtasks.GtasksPreferenceService; import com.todoroo.astrid.gtasks.GtasksTaskListUpdater; import com.todoroo.astrid.gtasks.api.GtasksInvoker; import com.todoroo.astrid.gtasks.api.MoveRequest; @@ -24,44 +24,53 @@ import javax.inject.Inject; import org.tasks.analytics.Tracker; import org.tasks.data.GoogleTask; import org.tasks.data.GoogleTaskDao; +import org.tasks.data.GoogleTaskList; +import org.tasks.data.GoogleTaskListDao; import org.tasks.gtasks.GtaskSyncAdapterHelper; +import org.tasks.gtasks.PlayServices; import org.tasks.injection.ApplicationScope; +import org.tasks.injection.ForApplication; +import org.tasks.preferences.Preferences; import timber.log.Timber; @ApplicationScope public class GtasksSyncService { + private final Context context; private final TaskDao taskDao; - private final GtasksPreferenceService gtasksPreferenceService; - private final GtasksInvoker gtasksInvoker; + private final Preferences preferences; private final LinkedBlockingQueue operationQueue = new LinkedBlockingQueue<>(); private final GtaskSyncAdapterHelper gtaskSyncAdapterHelper; private final Tracker tracker; private final GoogleTaskDao googleTaskDao; + private final PlayServices playServices; @Inject public GtasksSyncService( + @ForApplication Context context, TaskDao taskDao, - GtasksPreferenceService gtasksPreferenceService, - GtasksInvoker gtasksInvoker, + Preferences preferences, GtaskSyncAdapterHelper gtaskSyncAdapterHelper, Tracker tracker, - GoogleTaskDao googleTaskDao) { + GoogleTaskDao googleTaskDao, + GoogleTaskListDao googleTaskListDao, + PlayServices playServices) { + this.context = context; this.taskDao = taskDao; - this.gtasksPreferenceService = gtasksPreferenceService; - this.gtasksInvoker = gtasksInvoker; + this.preferences = preferences; this.gtaskSyncAdapterHelper = gtaskSyncAdapterHelper; this.tracker = tracker; this.googleTaskDao = googleTaskDao; + this.playServices = playServices; new OperationPushThread(operationQueue).start(); } - public void clearCompleted(String listId) { - operationQueue.offer(new ClearOp(listId)); + public void clearCompleted(GoogleTaskList googleTaskList) { + operationQueue.offer(new ClearOp(googleTaskList)); } - public void triggerMoveForMetadata(final GoogleTask googleTask) { + public void triggerMoveForMetadata(GoogleTaskList googleTaskList, GoogleTask googleTask) { if (googleTask == null) { return; } @@ -69,16 +78,14 @@ public class GtasksSyncService { googleTask.setSuppressSync(false); return; } - if (gtasksPreferenceService - .isOngoing()) // Don't try and sync changes that occur during a normal sync - { + if (preferences.isSyncOngoing()) { return; } if (!gtaskSyncAdapterHelper.isEnabled()) { return; } - operationQueue.offer(new MoveOp(googleTask)); + operationQueue.offer(new MoveOp(googleTaskList, googleTask)); } private void pushMetadataOnSave(GoogleTask model, GtasksInvoker invoker) throws IOException { @@ -154,34 +161,38 @@ public class GtasksSyncService { interface SyncOnSaveOperation { - void op(GtasksInvoker invoker) throws IOException; + void op() throws IOException; } private class MoveOp implements SyncOnSaveOperation { + private final GoogleTaskList googleTaskList; final GoogleTask googleTask; - MoveOp(GoogleTask googleTask) { + MoveOp(GoogleTaskList googleTaskList, GoogleTask googleTask) { + this.googleTaskList = googleTaskList; this.googleTask = googleTask; } @Override - public void op(GtasksInvoker invoker) throws IOException { + public void op() throws IOException { + GtasksInvoker invoker = new GtasksInvoker(context, playServices, googleTaskList.getAccount()); pushMetadataOnSave(googleTask, invoker); } } private class ClearOp implements SyncOnSaveOperation { - private final String listId; + private GoogleTaskList googleTaskList; - ClearOp(String listId) { - this.listId = listId; + ClearOp(GoogleTaskList googleTaskList) { + this.googleTaskList = googleTaskList; } @Override - public void op(GtasksInvoker invoker) throws IOException { - invoker.clearCompleted(listId); + public void op() throws IOException { + GtasksInvoker invoker = new GtasksInvoker(context, playServices, googleTaskList.getAccount()); + invoker.clearCompleted(googleTaskList.getRemoteId()); } } @@ -205,7 +216,7 @@ public class GtasksSyncService { continue; } try { - op.op(gtasksInvoker); + op.op(); } catch (UserRecoverableAuthIOException ignored) { } catch (IOException e) { diff --git a/app/src/main/java/com/todoroo/astrid/service/StartupService.java b/app/src/main/java/com/todoroo/astrid/service/StartupService.java index b9e2f86ae..2cb9eb4bc 100644 --- a/app/src/main/java/com/todoroo/astrid/service/StartupService.java +++ b/app/src/main/java/com/todoroo/astrid/service/StartupService.java @@ -5,10 +5,11 @@ */ package com.todoroo.astrid.service; +import static com.google.common.base.Strings.isNullOrEmpty; + import android.content.Context; import android.database.sqlite.SQLiteException; import android.os.Environment; -import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableListMultimap; import com.google.common.collect.ListMultimap; @@ -26,6 +27,7 @@ import org.tasks.analytics.Tracker; import org.tasks.analytics.Tracking; import org.tasks.data.Filter; import org.tasks.data.FilterDao; +import org.tasks.data.GoogleTaskAccount; import org.tasks.data.GoogleTaskList; import org.tasks.data.GoogleTaskListDao; import org.tasks.data.Tag; @@ -43,7 +45,8 @@ public class StartupService { private static final int V4_8_0 = 380; private static final int V4_9_5 = 434; private static final int V5_3_0 = 491; - private static final int V5_3_1 = 501; + private static final int V6_0_beta_1 = 522; + private static final int V6_0_beta_2 = 523; private final Database database; private final Preferences preferences; @@ -119,9 +122,12 @@ public class StartupService { if (from < V5_3_0) { migrateFilters(); } - if (from < V5_3_1) { + if (from < V6_0_beta_1) { migrateDefaultSyncList(); } + if (from < V6_0_beta_2) { + migrateGoogleTaskAccount(); + } tracker.reportEvent(Tracking.Events.UPGRADE, Integer.toString(from)); } preferences.setCurrentVersion(to); @@ -166,8 +172,15 @@ public class StartupService { } private void migrateDefaultSyncList() { + String account = preferences.getStringValue("gtasks_user"); + if (isNullOrEmpty(account)) { + return; + } + String defaultGoogleTaskList = preferences.getStringValue("gtasks_defaultlist"); - if (!Strings.isNullOrEmpty(defaultGoogleTaskList)) { + if (isNullOrEmpty(defaultGoogleTaskList)) { + // TODO: look up default list + } else { GoogleTaskList googleTaskList = googleTaskListDao.getByRemoteId(defaultGoogleTaskList); if (googleTaskList != null) { defaultFilterProvider.setDefaultRemoteList(new GtasksFilter(googleTaskList)); @@ -175,6 +188,15 @@ public class StartupService { } } + private void migrateGoogleTaskAccount() { + String account = preferences.getStringValue("gtasks_user"); + if (!isNullOrEmpty(account)) { + GoogleTaskAccount googleTaskAccount = new GoogleTaskAccount(); + googleTaskAccount.setAccount(account); + googleTaskListDao.insert(googleTaskAccount); + } + } + private String migrate(String input) { return input .replaceAll( diff --git a/app/src/main/java/com/todoroo/astrid/service/SyncV2Service.java b/app/src/main/java/com/todoroo/astrid/service/SyncV2Service.java index 8f62ee46e..8d374b399 100644 --- a/app/src/main/java/com/todoroo/astrid/service/SyncV2Service.java +++ b/app/src/main/java/com/todoroo/astrid/service/SyncV2Service.java @@ -46,7 +46,7 @@ public class SyncV2Service { () -> { callback.started(); try { - gtasksSyncService.clearCompleted(list.getRemoteId()); + gtasksSyncService.clearCompleted(list); } finally { callback.finished(); } diff --git a/app/src/main/java/org/tasks/Tasks.java b/app/src/main/java/org/tasks/Tasks.java index 3c657104a..364e48144 100644 --- a/app/src/main/java/org/tasks/Tasks.java +++ b/app/src/main/java/org/tasks/Tasks.java @@ -1,7 +1,6 @@ package org.tasks; import com.jakewharton.threetenabp.AndroidThreeTen; -import com.todoroo.astrid.gtasks.GtasksPreferenceService; import com.todoroo.astrid.service.StartupService; import javax.inject.Inject; import org.tasks.analytics.Tracker; @@ -24,7 +23,6 @@ public class Tasks extends InjectingApplication { @Inject Badger badger; @Inject JobManager jobManager; @Inject JobCreator jobCreator; - @Inject GtasksPreferenceService gtasksPreferenceService; @Override public void onCreate() { diff --git a/app/src/main/java/org/tasks/activities/GoogleTaskListSettingsActivity.java b/app/src/main/java/org/tasks/activities/GoogleTaskListSettingsActivity.java index 9ca458e28..2ba45b062 100644 --- a/app/src/main/java/org/tasks/activities/GoogleTaskListSettingsActivity.java +++ b/app/src/main/java/org/tasks/activities/GoogleTaskListSettingsActivity.java @@ -27,6 +27,7 @@ import javax.inject.Inject; import org.tasks.R; import org.tasks.analytics.Tracker; import org.tasks.analytics.Tracking; +import org.tasks.data.GoogleTaskAccount; import org.tasks.data.GoogleTaskList; import org.tasks.data.GoogleTaskListDao; import org.tasks.dialogs.DialogBuilder; @@ -46,6 +47,7 @@ public class GoogleTaskListSettingsActivity extends ThemedInjectingAppCompatActi DeleteListDialog.DeleteListDialogCallback, RenameListDialog.RenameListDialogCallback { + public static final String EXTRA_ACCOUNT = "extra_account"; public static final String EXTRA_STORE_DATA = "extra_store_data"; public static final String ACTION_DELETED = "action_deleted"; public static final String ACTION_RELOAD = "action_reload"; @@ -82,10 +84,13 @@ public class GoogleTaskListSettingsActivity extends ThemedInjectingAppCompatActi setContentView(R.layout.activity_google_task_list_settings); ButterKnife.bind(this); - gtasksList = getIntent().getParcelableExtra(EXTRA_STORE_DATA); + Intent intent = getIntent(); + gtasksList = intent.getParcelableExtra(EXTRA_STORE_DATA); if (gtasksList == null) { isNewList = true; gtasksList = new GoogleTaskList(); + GoogleTaskAccount account = intent.getParcelableExtra(EXTRA_ACCOUNT); + gtasksList.setAccount(account.getAccount()); } if (savedInstanceState == null) { @@ -165,9 +170,9 @@ public class GoogleTaskListSettingsActivity extends ThemedInjectingAppCompatActi } if (isNewList) { - newCreateListDialog(newName).show(getSupportFragmentManager(), FRAG_TAG_CREATE_LIST_DIALOG); + newCreateListDialog(gtasksList.getAccount(), newName).show(getSupportFragmentManager(), FRAG_TAG_CREATE_LIST_DIALOG); } else if (nameChanged()) { - newRenameListDialog(gtasksList.getRemoteId(), newName) + newRenameListDialog(gtasksList, newName) .show(getSupportFragmentManager(), FRAG_TAG_RENAME_LIST_DIALOG); } else { if (colorChanged()) { @@ -204,7 +209,7 @@ public class GoogleTaskListSettingsActivity extends ThemedInjectingAppCompatActi .setPositiveButton( R.string.delete, (dialog, which) -> - newDeleteListDialog(gtasksList.getRemoteId()) + newDeleteListDialog(gtasksList) .show(getSupportFragmentManager(), FRAG_TAG_DELETE_LIST_DIALOG)) .setNegativeButton(android.R.string.cancel, null) .show(); diff --git a/app/src/main/java/org/tasks/analytics/Tracking.java b/app/src/main/java/org/tasks/analytics/Tracking.java index 227cf32b3..6c412df8d 100644 --- a/app/src/main/java/org/tasks/analytics/Tracking.java +++ b/app/src/main/java/org/tasks/analytics/Tracking.java @@ -16,7 +16,6 @@ public class Tracking { TIMER_START(R.string.tracking_category_timer, R.string.tracking_action_start), GTASK_ENABLED(R.string.tracking_category_google_tasks, R.string.tracking_action_on), GTASK_DISABLED(R.string.tracking_category_google_tasks, R.string.tracking_action_off), - GTASK_LOGOUT(R.string.tracking_category_google_tasks, R.string.tracking_action_clear), GTASK_NEW_LIST(R.string.tracking_category_google_tasks, R.string.tracking_action_new_list), GTASK_RENAME_LIST( R.string.tracking_category_google_tasks, R.string.tracking_action_rename_list), diff --git a/app/src/main/java/org/tasks/caldav/CaldavClient.java b/app/src/main/java/org/tasks/caldav/CaldavClient.java index 3061d8e79..4ee51b073 100644 --- a/app/src/main/java/org/tasks/caldav/CaldavClient.java +++ b/app/src/main/java/org/tasks/caldav/CaldavClient.java @@ -7,6 +7,7 @@ import static at.bitfire.dav4android.XmlUtils.NS_WEBDAV; import static java.util.Arrays.asList; import at.bitfire.dav4android.BasicDigestAuthHandler; +import at.bitfire.dav4android.DavCalendar; import at.bitfire.dav4android.DavResource; import at.bitfire.dav4android.PropertyCollection; import at.bitfire.dav4android.XmlUtils; @@ -158,18 +159,13 @@ class CaldavClient { Timber.d("%s does not support tasks", member); continue; } - Timber.d("Found %s", member); urls.add(member); } - if (urls.isEmpty()) { - throw new DisplayableException(R.string.caldav_no_supported_calendars); - } return urls; } public Completable deleteCollection() { - return Completable.fromAction(() -> - davResource.delete(null)) + return Completable.fromAction(() -> davResource.delete(null)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } diff --git a/app/src/main/java/org/tasks/data/GoogleTaskAccount.java b/app/src/main/java/org/tasks/data/GoogleTaskAccount.java new file mode 100644 index 000000000..7ae29ec86 --- /dev/null +++ b/app/src/main/java/org/tasks/data/GoogleTaskAccount.java @@ -0,0 +1,100 @@ +package org.tasks.data; + +import android.arch.persistence.room.ColumnInfo; +import android.arch.persistence.room.Entity; +import android.arch.persistence.room.Ignore; +import android.arch.persistence.room.PrimaryKey; +import android.os.Parcel; +import android.os.Parcelable; + +@Entity(tableName = "google_task_accounts") +public class GoogleTaskAccount implements Parcelable { + @PrimaryKey(autoGenerate = true) + @ColumnInfo(name = "_id") + private transient long id; + + @ColumnInfo(name = "account") + private String account; + + public GoogleTaskAccount() {} + + @Ignore + public GoogleTaskAccount(Parcel source) { + id = source.readLong(); + account = source.readString(); + } + + @Ignore + public GoogleTaskAccount(String account) { + this.account = account; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof GoogleTaskAccount)) { + return false; + } + + GoogleTaskAccount that = (GoogleTaskAccount) o; + + if (id != that.id) { + return false; + } + return account != null ? account.equals(that.account) : that.account == null; + } + + @Override + public int hashCode() { + int result = (int) (id ^ (id >>> 32)); + result = 31 * result + (account != null ? account.hashCode() : 0); + return result; + } + + @Override + public String toString() { + return "GoogleTaskAccount{" + "id=" + id + ", account='" + account + '\'' + '}'; + } + + public static final Creator CREATOR = + new Creator() { + @Override + public GoogleTaskAccount createFromParcel(Parcel source) { + return new GoogleTaskAccount(source); + } + + @Override + public GoogleTaskAccount[] newArray(int size) { + return new GoogleTaskAccount[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeLong(id); + dest.writeString(account); + } +} diff --git a/app/src/main/java/org/tasks/data/GoogleTaskDao.java b/app/src/main/java/org/tasks/data/GoogleTaskDao.java index b93bf506f..b337908a0 100644 --- a/app/src/main/java/org/tasks/data/GoogleTaskDao.java +++ b/app/src/main/java/org/tasks/data/GoogleTaskDao.java @@ -49,9 +49,6 @@ public interface GoogleTaskDao { @Query("SELECT * FROM google_tasks WHERE task = :taskId") List getAllByTaskId(long taskId); - @Query("DELETE FROM google_tasks") - void deleteAll(); - @Query("SELECT DISTINCT list_id FROM google_tasks WHERE deleted = 0 AND task IN (:tasks)") List getLists(List tasks); } diff --git a/app/src/main/java/org/tasks/data/GoogleTaskList.java b/app/src/main/java/org/tasks/data/GoogleTaskList.java index af05fe2a2..2ac0b6960 100644 --- a/app/src/main/java/org/tasks/data/GoogleTaskList.java +++ b/app/src/main/java/org/tasks/data/GoogleTaskList.java @@ -27,6 +27,9 @@ public class GoogleTaskList implements Parcelable { @ColumnInfo(name = "_id") private transient long id; + @ColumnInfo(name = "account") + private String account; + @ColumnInfo(name = "remote_id") private String remoteId; @@ -50,6 +53,7 @@ public class GoogleTaskList implements Parcelable { @Ignore public GoogleTaskList(Parcel parcel) { id = parcel.readLong(); + account = parcel.readString(); remoteId = parcel.readString(); title = parcel.readString(); remoteOrder = parcel.readInt(); @@ -66,6 +70,14 @@ public class GoogleTaskList implements Parcelable { this.id = id; } + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + public String getRemoteId() { return remoteId; } @@ -137,6 +149,9 @@ public class GoogleTaskList implements Parcelable { if (deleted != that.deleted) { return false; } + if (account != null ? !account.equals(that.account) : that.account != null) { + return false; + } if (remoteId != null ? !remoteId.equals(that.remoteId) : that.remoteId != null) { return false; } @@ -149,6 +164,7 @@ public class GoogleTaskList implements Parcelable { @Override public int hashCode() { int result = (int) (id ^ (id >>> 32)); + result = 31 * result + (account != null ? account.hashCode() : 0); result = 31 * result + (remoteId != null ? remoteId.hashCode() : 0); result = 31 * result + (title != null ? title.hashCode() : 0); result = 31 * result + remoteOrder; @@ -163,6 +179,9 @@ public class GoogleTaskList implements Parcelable { return "GoogleTaskList{" + "id=" + id + + ", account='" + + account + + '\'' + ", remoteId='" + remoteId + '\'' @@ -188,6 +207,7 @@ public class GoogleTaskList implements Parcelable { @Override public void writeToParcel(Parcel parcel, int i) { parcel.writeLong(id); + parcel.writeString(account); parcel.writeString(remoteId); parcel.writeString(title); parcel.writeInt(remoteOrder); diff --git a/app/src/main/java/org/tasks/data/GoogleTaskListDao.java b/app/src/main/java/org/tasks/data/GoogleTaskListDao.java index b16217fa1..bdee5333d 100644 --- a/app/src/main/java/org/tasks/data/GoogleTaskListDao.java +++ b/app/src/main/java/org/tasks/data/GoogleTaskListDao.java @@ -4,29 +4,48 @@ import android.arch.persistence.room.Dao; import android.arch.persistence.room.Insert; import android.arch.persistence.room.OnConflictStrategy; import android.arch.persistence.room.Query; +import android.arch.persistence.room.Update; import java.util.List; @Dao public interface GoogleTaskListDao { + @Query("SELECT * FROM google_task_accounts") + List getAccounts(); + + @Query("SELECT * FROM google_task_accounts WHERE account = :account COLLATE NOCASE LIMIT 1") + GoogleTaskAccount getAccount(String account); + @Query("SELECT * FROM google_task_lists WHERE _id = :id") GoogleTaskList getById(long id); - @Query("SELECT * FROM google_task_lists WHERE deleted = 0 ORDER BY title ASC") - List getActiveLists(); + @Query("SELECT * FROM google_task_lists WHERE account = :account AND deleted = 0 ORDER BY title ASC") + List getActiveLists(String account); @Query("SELECT * FROM google_task_lists WHERE remote_id = :remoteId LIMIT 1") GoogleTaskList getByRemoteId(String remoteId); + @Query("SELECT * FROM google_task_lists WHERE remote_id = :remoteId AND IFNULL(account, '') = '' LIMIT 1") + GoogleTaskList findExistingList(String remoteId); + @Query("SELECT * FROM google_task_lists") List getAll(); + @Query("SELECT * FROM google_task_lists WHERE deleted = 0") + List getAllActiveLists(); + @Insert(onConflict = OnConflictStrategy.REPLACE) long insertOrReplace(GoogleTaskList googleTaskList); @Insert void insert(GoogleTaskList googleTaskList); + @Insert + void insert(GoogleTaskAccount googleTaskAccount); + + @Update + void update(GoogleTaskList googleTaskList); + @Query("DELETE FROM google_task_lists WHERE _id = :id") void deleteById(long id); } diff --git a/app/src/main/java/org/tasks/db/Migrations.java b/app/src/main/java/org/tasks/db/Migrations.java index 966357392..0a1021b51 100644 --- a/app/src/main/java/org/tasks/db/Migrations.java +++ b/app/src/main/java/org/tasks/db/Migrations.java @@ -192,6 +192,17 @@ public class Migrations { } }; + private static final Migration MIGRATION_58_59 = + new Migration(58, 59) { + @Override + public void migrate(@NonNull SupportSQLiteDatabase database) { + database.execSQL( + "CREATE TABLE IF NOT EXISTS `google_task_accounts` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `account` TEXT)"); + database.execSQL( + "ALTER TABLE `google_task_lists` ADD COLUMN `account` TEXT"); + } + }; + public static final Migration[] MIGRATIONS = new Migration[] { MIGRATION_35_36, @@ -207,7 +218,8 @@ public class Migrations { MIGRATION_51_52, MIGRATION_52_53, MIGRATION_53_54, - MIGRATION_54_58 + MIGRATION_54_58, + MIGRATION_58_59 }; private static Migration NOOP(int from, int to) { diff --git a/app/src/main/java/org/tasks/filters/FilterCriteriaProvider.java b/app/src/main/java/org/tasks/filters/FilterCriteriaProvider.java index 6423c7887..48333b743 100644 --- a/app/src/main/java/org/tasks/filters/FilterCriteriaProvider.java +++ b/app/src/main/java/org/tasks/filters/FilterCriteriaProvider.java @@ -26,6 +26,7 @@ import javax.inject.Inject; import org.tasks.R; import org.tasks.data.GoogleTask; import org.tasks.data.GoogleTaskList; +import org.tasks.data.GoogleTaskListDao; import org.tasks.data.Tag; import org.tasks.data.TagData; import org.tasks.injection.ForApplication; @@ -42,8 +43,8 @@ public class FilterCriteriaProvider { private final Context context; private final TagService tagService; - private final GtasksListService gtasksListService; private final Resources r; + private final GoogleTaskListDao googleTaskListDao; private final SyncAdapters syncAdapters; @Inject @@ -51,13 +52,14 @@ public class FilterCriteriaProvider { @ForApplication Context context, TagService tagService, GtasksListService gtasksListService, - SyncAdapters syncAdapters) { + SyncAdapters syncAdapters, + GoogleTaskListDao googleTaskListDao) { this.context = context; this.tagService = tagService; - this.gtasksListService = gtasksListService; this.syncAdapters = syncAdapters; r = context.getResources(); + this.googleTaskListDao = googleTaskListDao; } public List getAll() { @@ -186,7 +188,7 @@ public class FilterCriteriaProvider { } private CustomFilterCriterion getGtasksFilterCriteria() { - List lists = gtasksListService.getLists(); + List lists = googleTaskListDao.getAllActiveLists(); String[] listNames = new String[lists.size()]; String[] listIds = new String[lists.size()]; diff --git a/app/src/main/java/org/tasks/filters/FilterProvider.java b/app/src/main/java/org/tasks/filters/FilterProvider.java index 303907402..fdff90f63 100644 --- a/app/src/main/java/org/tasks/filters/FilterProvider.java +++ b/app/src/main/java/org/tasks/filters/FilterProvider.java @@ -14,6 +14,7 @@ import java.util.Map; import javax.inject.Inject; import org.tasks.caldav.CaldavFilterExposer; import org.tasks.data.CaldavAccount; +import org.tasks.data.GoogleTaskAccount; public class FilterProvider { @@ -56,7 +57,7 @@ public class FilterProvider { return tagFilterExposer.getFilters(); } - public List getGoogleTaskFilters() { + public List>> getGoogleTaskFilters() { return gtasksFilterExposer.getFilters(); } diff --git a/app/src/main/java/org/tasks/gtasks/CreateListDialog.java b/app/src/main/java/org/tasks/gtasks/CreateListDialog.java index f86f9e7dd..4e6451886 100644 --- a/app/src/main/java/org/tasks/gtasks/CreateListDialog.java +++ b/app/src/main/java/org/tasks/gtasks/CreateListDialog.java @@ -3,6 +3,7 @@ package org.tasks.gtasks; import android.app.Activity; import android.app.Dialog; import android.app.ProgressDialog; +import android.content.Context; import android.os.AsyncTask; import android.os.Bundle; import android.support.annotation.NonNull; @@ -14,21 +15,26 @@ import javax.inject.Inject; import org.tasks.R; import org.tasks.dialogs.DialogBuilder; import org.tasks.injection.DialogFragmentComponent; +import org.tasks.injection.ForApplication; import org.tasks.injection.InjectingDialogFragment; import timber.log.Timber; public class CreateListDialog extends InjectingDialogFragment { + private static final String EXTRA_ACCOUNT = "extra_account"; private static final String EXTRA_NAME = "extra_name"; @Inject DialogBuilder dialogBuilder; - @Inject GtasksInvoker gtasksInvoker; + @Inject @ForApplication Context context; + @Inject PlayServices playServices; private CreateListDialogCallback callback; private ProgressDialog dialog; + private String account; private String name; - public static CreateListDialog newCreateListDialog(String name) { + public static CreateListDialog newCreateListDialog(String account, String name) { CreateListDialog dialog = new CreateListDialog(); Bundle args = new Bundle(); + args.putString(EXTRA_ACCOUNT, account); args.putString(EXTRA_NAME, name); dialog.setArguments(args); return dialog; @@ -39,6 +45,7 @@ public class CreateListDialog extends InjectingDialogFragment { super.onCreate(savedInstanceState); setRetainInstance(true); Bundle arguments = getArguments(); + account = arguments.getString(EXTRA_ACCOUNT); name = arguments.getString(EXTRA_NAME); dialog = dialogBuilder.newProgressDialog(R.string.creating_new_list); execute(); @@ -67,7 +74,7 @@ public class CreateListDialog extends InjectingDialogFragment { @Override protected TaskList doInBackground(Void... voids) { try { - return gtasksInvoker.createGtaskList(name); + return new GtasksInvoker(context, playServices, account).createGtaskList(name); } catch (IOException e) { Timber.e(e); return null; diff --git a/app/src/main/java/org/tasks/gtasks/DeleteListDialog.java b/app/src/main/java/org/tasks/gtasks/DeleteListDialog.java index 1ca8846c4..5fcd5ca31 100644 --- a/app/src/main/java/org/tasks/gtasks/DeleteListDialog.java +++ b/app/src/main/java/org/tasks/gtasks/DeleteListDialog.java @@ -3,6 +3,7 @@ package org.tasks.gtasks; import android.app.Activity; import android.app.Dialog; import android.app.ProgressDialog; +import android.content.Context; import android.os.AsyncTask; import android.os.Bundle; import android.support.annotation.NonNull; @@ -11,24 +12,27 @@ import com.todoroo.astrid.gtasks.api.GtasksInvoker; import java.io.IOException; import javax.inject.Inject; import org.tasks.R; +import org.tasks.data.GoogleTaskList; import org.tasks.dialogs.DialogBuilder; import org.tasks.injection.DialogFragmentComponent; +import org.tasks.injection.ForApplication; import org.tasks.injection.InjectingDialogFragment; import timber.log.Timber; public class DeleteListDialog extends InjectingDialogFragment { - private static final String EXTRA_ID = "extra_id"; + private static final String EXTRA_LIST = "extra_list"; + @Inject @ForApplication Context context; @Inject DialogBuilder dialogBuilder; - @Inject GtasksInvoker gtasksInvoker; + @Inject PlayServices playServices; private DeleteListDialogCallback callback; - private String id; + private GoogleTaskList googleTaskList; private ProgressDialog dialog; - public static DeleteListDialog newDeleteListDialog(String id) { + public static DeleteListDialog newDeleteListDialog(GoogleTaskList googleTaskList) { DeleteListDialog dialog = new DeleteListDialog(); Bundle args = new Bundle(); - args.putString(EXTRA_ID, id); + args.putParcelable(EXTRA_LIST, googleTaskList); dialog.setArguments(args); return dialog; } @@ -38,7 +42,7 @@ public class DeleteListDialog extends InjectingDialogFragment { super.onCreate(savedInstanceState); setRetainInstance(true); Bundle arguments = getArguments(); - id = arguments.getString(EXTRA_ID); + googleTaskList = arguments.getParcelable(EXTRA_LIST); dialog = dialogBuilder.newProgressDialog(R.string.deleting_list); execute(); } @@ -66,7 +70,8 @@ public class DeleteListDialog extends InjectingDialogFragment { @Override protected Boolean doInBackground(Void... voids) { try { - gtasksInvoker.deleteGtaskList(id); + new GtasksInvoker(context, playServices, googleTaskList.getAccount()) + .deleteGtaskList(googleTaskList.getRemoteId()); return true; } catch (IOException e) { Timber.e(e); diff --git a/app/src/main/java/org/tasks/gtasks/GoogleAccountManager.java b/app/src/main/java/org/tasks/gtasks/GoogleAccountManager.java index 878c44277..00f234824 100644 --- a/app/src/main/java/org/tasks/gtasks/GoogleAccountManager.java +++ b/app/src/main/java/org/tasks/gtasks/GoogleAccountManager.java @@ -7,7 +7,6 @@ import static java.util.Arrays.asList; import android.accounts.Account; import android.content.Context; import com.google.common.base.Strings; -import com.todoroo.astrid.gtasks.GtasksPreferenceService; import java.util.Collections; import java.util.List; import javax.inject.Inject; @@ -18,17 +17,14 @@ public class GoogleAccountManager { private final PermissionChecker permissionChecker; private final android.accounts.AccountManager accountManager; - private final GtasksPreferenceService gtasksPreferenceService; @Inject public GoogleAccountManager( @ForApplication Context context, - PermissionChecker permissionChecker, - GtasksPreferenceService gtasksPreferenceService) { + PermissionChecker permissionChecker) { this.permissionChecker = permissionChecker; accountManager = android.accounts.AccountManager.get(context); - this.gtasksPreferenceService = gtasksPreferenceService; } public List getAccounts() { @@ -45,10 +41,6 @@ public class GoogleAccountManager { : Collections.emptyList(); } - public Account getSelectedAccount() { - return getAccount(gtasksPreferenceService.getUserName()); - } - public Account getAccount(final String name) { if (Strings.isNullOrEmpty(name)) { return null; diff --git a/app/src/main/java/org/tasks/gtasks/GoogleTaskSynchronizer.java b/app/src/main/java/org/tasks/gtasks/GoogleTaskSynchronizer.java index 7727213c2..cee7c2ad0 100644 --- a/app/src/main/java/org/tasks/gtasks/GoogleTaskSynchronizer.java +++ b/app/src/main/java/org/tasks/gtasks/GoogleTaskSynchronizer.java @@ -19,7 +19,6 @@ import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.data.SyncFlags; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.gtasks.GtasksListService; -import com.todoroo.astrid.gtasks.GtasksPreferenceService; import com.todoroo.astrid.gtasks.GtasksTaskListUpdater; import com.todoroo.astrid.gtasks.api.GtasksApiUtilities; import com.todoroo.astrid.gtasks.api.GtasksInvoker; @@ -35,6 +34,7 @@ import javax.inject.Inject; import org.tasks.R; import org.tasks.analytics.Tracker; import org.tasks.data.GoogleTask; +import org.tasks.data.GoogleTaskAccount; import org.tasks.data.GoogleTaskDao; import org.tasks.data.GoogleTaskList; import org.tasks.data.GoogleTaskListDao; @@ -50,50 +50,47 @@ public class GoogleTaskSynchronizer { private static final String DEFAULT_LIST = "@default"; // $NON-NLS-1$ private final Context context; - private final GtasksPreferenceService gtasksPreferenceService; private final GoogleTaskListDao googleTaskListDao; private final GtasksSyncService gtasksSyncService; private final GtasksListService gtasksListService; private final GtasksTaskListUpdater gtasksTaskListUpdater; private final Preferences preferences; - private final GtasksInvoker gtasksInvoker; private final TaskDao taskDao; private final Tracker tracker; private final NotificationManager notificationManager; private final GoogleTaskDao googleTaskDao; private final TaskCreator taskCreator; private final DefaultFilterProvider defaultFilterProvider; + private final PlayServices playServices; @Inject public GoogleTaskSynchronizer( @ForApplication Context context, - GtasksPreferenceService gtasksPreferenceService, GoogleTaskListDao googleTaskListDao, GtasksSyncService gtasksSyncService, GtasksListService gtasksListService, GtasksTaskListUpdater gtasksTaskListUpdater, Preferences preferences, - GtasksInvoker gtasksInvoker, TaskDao taskDao, Tracker tracker, NotificationManager notificationManager, GoogleTaskDao googleTaskDao, TaskCreator taskCreator, - DefaultFilterProvider defaultFilterProvider) { + DefaultFilterProvider defaultFilterProvider, + PlayServices playServices) { this.context = context; - this.gtasksPreferenceService = gtasksPreferenceService; this.googleTaskListDao = googleTaskListDao; this.gtasksSyncService = gtasksSyncService; this.gtasksListService = gtasksListService; this.gtasksTaskListUpdater = gtasksTaskListUpdater; this.preferences = preferences; - this.gtasksInvoker = gtasksInvoker; this.taskDao = taskDao; this.tracker = tracker; this.notificationManager = notificationManager; this.googleTaskDao = googleTaskDao; this.taskCreator = taskCreator; this.defaultFilterProvider = defaultFilterProvider; + this.playServices = playServices; } public static void mergeDates(long remoteDueDate, Task local) { @@ -112,23 +109,20 @@ public class GoogleTaskSynchronizer { } public void sync() { - String account = gtasksPreferenceService.getUserName(); - if (TextUtils.isEmpty(account)) { - return; - } - Timber.d("%s: start sync", account); - try { - synchronize(); - gtasksPreferenceService.recordSuccessfulSync(); - } catch (UserRecoverableAuthIOException e) { - Timber.e(e); - sendNotification(context, e.getIntent()); - } catch (IOException e) { - Timber.e(e); - } catch (Exception e) { - tracker.reportException(e); - } finally { - Timber.d("%s: end sync", account); + for (GoogleTaskAccount account : googleTaskListDao.getAccounts()) { + Timber.d("%s: start sync", account); + try { + synchronize(account); + } catch (UserRecoverableAuthIOException e) { + Timber.e(e); + sendNotification(context, e.getIntent()); + } catch (IOException e) { + Timber.e(e); + } catch (Exception e) { + tracker.reportException(e); + } finally { + Timber.d("%s: end sync", account); + } } } @@ -150,8 +144,9 @@ public class GoogleTaskSynchronizer { notificationManager.notify(Constants.NOTIFICATION_SYNC_ERROR, builder, true, false, false); } - private void synchronize() throws IOException { - pushLocalChanges(); + private void synchronize(GoogleTaskAccount account) throws IOException { + GtasksInvoker gtasksInvoker = new GtasksInvoker(context, playServices, account.getAccount()); + pushLocalChanges(gtasksInvoker); List gtaskLists = new ArrayList<>(); String nextPageToken = null; @@ -166,7 +161,7 @@ public class GoogleTaskSynchronizer { } nextPageToken = remoteLists.getNextPageToken(); } while (nextPageToken != null); - gtasksListService.updateLists(gtaskLists); + gtasksListService.updateLists(account, gtaskLists); Filter defaultRemoteList = defaultFilterProvider.getDefaultRemoteList(); if (defaultRemoteList instanceof GtasksFilter) { GoogleTaskList list = @@ -176,11 +171,11 @@ public class GoogleTaskSynchronizer { } } for (final GoogleTaskList list : gtasksListService.getListsToUpdate(gtaskLists)) { - fetchAndApplyRemoteChanges(list); + fetchAndApplyRemoteChanges(gtasksInvoker, list); } } - private void pushLocalChanges() throws UserRecoverableAuthIOException { + private void pushLocalChanges(GtasksInvoker gtasksInvoker) throws UserRecoverableAuthIOException { List tasks = taskDao.getGoogleTasksToPush(); for (Task task : tasks) { try { @@ -193,7 +188,7 @@ public class GoogleTaskSynchronizer { } } - private void pushTask(Task task, GtasksInvoker invoker) throws IOException { + private void pushTask(Task task, GtasksInvoker gtasksInvoker) throws IOException { for (GoogleTask deleted : googleTaskDao.getDeletedByTaskId(task.getId())) { gtasksInvoker.deleteGtask(deleted.getListId(), deleted.getRemoteId()); googleTaskDao.delete(deleted); @@ -257,7 +252,7 @@ public class GoogleTaskSynchronizer { if (!newlyCreated) { try { - invoker.updateGtask(listId, remoteModel); + gtasksInvoker.updateGtask(listId, remoteModel); } catch (HttpNotFoundException e) { Timber.e(e); googleTaskDao.delete(gtasksMetadata); @@ -268,7 +263,7 @@ public class GoogleTaskSynchronizer { String priorSibling = gtasksSyncService.getRemoteSiblingId(listId, gtasksMetadata); com.google.api.services.tasks.model.Task created = - invoker.createGtask(listId, remoteModel, parent, priorSibling); + gtasksInvoker.createGtask(listId, remoteModel, parent, priorSibling); if (created != null) { // Update the metadata for the newly created task @@ -290,7 +285,7 @@ public class GoogleTaskSynchronizer { taskDao.save(task); } - private synchronized void fetchAndApplyRemoteChanges(GoogleTaskList list) + private synchronized void fetchAndApplyRemoteChanges(GtasksInvoker gtasksInvoker, GoogleTaskList list) throws UserRecoverableAuthIOException { String listId = list.getRemoteId(); long lastSyncDate = list.getLastSync(); diff --git a/app/src/main/java/org/tasks/gtasks/GtaskSyncAdapterHelper.java b/app/src/main/java/org/tasks/gtasks/GtaskSyncAdapterHelper.java index 4b26b375e..1371e3892 100644 --- a/app/src/main/java/org/tasks/gtasks/GtaskSyncAdapterHelper.java +++ b/app/src/main/java/org/tasks/gtasks/GtaskSyncAdapterHelper.java @@ -1,20 +1,19 @@ package org.tasks.gtasks; -import android.accounts.Account; import android.app.Activity; import javax.inject.Inject; import org.tasks.R; import org.tasks.analytics.Tracker; import org.tasks.analytics.Tracking; +import org.tasks.data.GoogleTaskListDao; import org.tasks.preferences.Preferences; public class GtaskSyncAdapterHelper { - private static final String AUTHORITY = "org.tasks"; - private final GoogleAccountManager accountManager; private final Preferences preferences; private final PlayServices playServices; + private final GoogleTaskListDao googleTaskListDao; private final Tracker tracker; @Inject @@ -22,25 +21,25 @@ public class GtaskSyncAdapterHelper { GoogleAccountManager accountManager, Preferences preferences, PlayServices playServices, + GoogleTaskListDao googleTaskListDao, Tracker tracker) { this.accountManager = accountManager; this.preferences = preferences; this.playServices = playServices; + this.googleTaskListDao = googleTaskListDao; this.tracker = tracker; } public boolean isEnabled() { - return preferences.getBoolean(R.string.sync_gtasks, false) - && playServices.isPlayServicesAvailable() - && getAccount() != null; + return hasAccounts() && playServices.isPlayServicesAvailable(); } - private Account getAccount() { - return accountManager.getSelectedAccount(); + private boolean hasAccounts() { + return !googleTaskListDao.getAccounts().isEmpty(); } public void checkPlayServices(Activity activity) { - if (preferences.getBoolean(R.string.sync_gtasks, false) + if (hasAccounts() && !playServices.refreshAndCheck() && !preferences.getBoolean(R.string.warned_play_services, false)) { preferences.setBoolean(R.string.warned_play_services, true); diff --git a/app/src/main/java/org/tasks/gtasks/RenameListDialog.java b/app/src/main/java/org/tasks/gtasks/RenameListDialog.java index 7bc94bf5f..283b4f8f5 100644 --- a/app/src/main/java/org/tasks/gtasks/RenameListDialog.java +++ b/app/src/main/java/org/tasks/gtasks/RenameListDialog.java @@ -3,6 +3,7 @@ package org.tasks.gtasks; import android.app.Activity; import android.app.Dialog; import android.app.ProgressDialog; +import android.content.Context; import android.os.AsyncTask; import android.os.Bundle; import android.support.annotation.NonNull; @@ -12,26 +13,29 @@ import com.todoroo.astrid.gtasks.api.GtasksInvoker; import java.io.IOException; import javax.inject.Inject; import org.tasks.R; +import org.tasks.data.GoogleTaskList; import org.tasks.dialogs.DialogBuilder; import org.tasks.injection.DialogFragmentComponent; +import org.tasks.injection.ForApplication; import org.tasks.injection.InjectingDialogFragment; import timber.log.Timber; public class RenameListDialog extends InjectingDialogFragment { private static final String EXTRA_NAME = "extra_name"; - private static final String EXTRA_ID = "extra_id"; + private static final String EXTRA_LIST = "extra_list"; + @Inject @ForApplication Context context; @Inject DialogBuilder dialogBuilder; - @Inject GtasksInvoker gtasksInvoker; + @Inject PlayServices playServices; private RenameListDialogCallback callback; private ProgressDialog dialog; - private String id; + private GoogleTaskList googleTaskList; private String name; - public static RenameListDialog newRenameListDialog(String id, String name) { + public static RenameListDialog newRenameListDialog(GoogleTaskList googleTaskList, String name) { RenameListDialog dialog = new RenameListDialog(); Bundle args = new Bundle(); - args.putString(EXTRA_ID, id); + args.putParcelable(EXTRA_LIST, googleTaskList); args.putString(EXTRA_NAME, name); dialog.setArguments(args); return dialog; @@ -42,7 +46,7 @@ public class RenameListDialog extends InjectingDialogFragment { super.onCreate(savedInstanceState); setRetainInstance(true); Bundle arguments = getArguments(); - id = arguments.getString(EXTRA_ID); + googleTaskList = arguments.getParcelable(EXTRA_LIST); name = arguments.getString(EXTRA_NAME); dialog = dialogBuilder.newProgressDialog(R.string.renaming_list); execute(); @@ -71,7 +75,8 @@ public class RenameListDialog extends InjectingDialogFragment { @Override protected TaskList doInBackground(Void... voids) { try { - return gtasksInvoker.renameGtaskList(id, name); + return new GtasksInvoker(context, playServices, googleTaskList.getAccount()) + .renameGtaskList(googleTaskList.getRemoteId(), name); } catch (IOException e) { Timber.e(e); return null; diff --git a/app/src/main/java/org/tasks/jobs/JobManager.java b/app/src/main/java/org/tasks/jobs/JobManager.java index 58d4a2f52..267d92eeb 100644 --- a/app/src/main/java/org/tasks/jobs/JobManager.java +++ b/app/src/main/java/org/tasks/jobs/JobManager.java @@ -12,6 +12,7 @@ import javax.annotation.Nullable; import javax.inject.Inject; import org.tasks.R; import org.tasks.data.CaldavDao; +import org.tasks.data.GoogleTaskListDao; import org.tasks.injection.ApplicationScope; import org.tasks.preferences.Preferences; import timber.log.Timber; @@ -30,15 +31,18 @@ public class JobManager { private final com.evernote.android.job.JobManager jobManager; private final Preferences preferences; private final CaldavDao caldavDao; + private final GoogleTaskListDao googleTaskListDao; @Inject public JobManager( com.evernote.android.job.JobManager jobManager, Preferences preferences, - CaldavDao caldavDao) { + CaldavDao caldavDao, + GoogleTaskListDao googleTaskListDao) { this.jobManager = jobManager; this.preferences = preferences; this.caldavDao = caldavDao; + this.googleTaskListDao = googleTaskListDao; } public void scheduleNotification(long time) { @@ -81,8 +85,7 @@ public class JobManager { : forceBackgroundEnabled; boolean accountsPresent = forceAccountPresent == null - ? (preferences.getBoolean(R.string.sync_gtasks, false) - || caldavDao.getAccounts().size() > 0) + ? (googleTaskListDao.getAccounts().size() > 0 || caldavDao.getAccounts().size() > 0) : forceAccountPresent; boolean onlyOnWifi = forceOnlyOnUnmetered == null diff --git a/app/src/main/java/org/tasks/sync/SynchronizationPreferences.java b/app/src/main/java/org/tasks/sync/SynchronizationPreferences.java index a879c9f2c..61c9f56ca 100644 --- a/app/src/main/java/org/tasks/sync/SynchronizationPreferences.java +++ b/app/src/main/java/org/tasks/sync/SynchronizationPreferences.java @@ -9,12 +9,9 @@ import static org.tasks.PermissionUtil.verifyPermissions; import android.content.Intent; import android.os.Bundle; -import android.preference.CheckBoxPreference; import android.preference.Preference; import android.preference.PreferenceCategory; import android.support.annotation.NonNull; -import com.todoroo.andlib.utility.DateUtilities; -import com.todoroo.astrid.gtasks.GtasksPreferenceService; import com.todoroo.astrid.gtasks.auth.GtasksLoginActivity; import javax.inject.Inject; import org.tasks.R; @@ -25,7 +22,9 @@ import org.tasks.billing.PurchaseActivity; import org.tasks.caldav.CaldavAccountSettingsActivity; import org.tasks.data.CaldavAccount; import org.tasks.data.CaldavDao; +import org.tasks.data.GoogleTaskAccount; import org.tasks.data.GoogleTaskDao; +import org.tasks.data.GoogleTaskListDao; import org.tasks.dialogs.DialogBuilder; import org.tasks.gtasks.GoogleAccountManager; import org.tasks.gtasks.GtaskSyncAdapterHelper; @@ -37,14 +36,17 @@ import org.tasks.preferences.ActivityPermissionRequestor; import org.tasks.preferences.PermissionChecker; import org.tasks.preferences.PermissionRequestor; import org.tasks.preferences.Preferences; +import timber.log.Timber; public class SynchronizationPreferences extends InjectingPreferenceActivity { + private static final String KEY_ADD_GOOGLE_TASKS = "add_google_tasks"; + private static final String KEY_ADD_CALDAV = "add_caldav"; private static final int REQUEST_LOGIN = 0; private static final int REQUEST_CALDAV_SETTINGS = 101; private static final int REQUEST_CALDAV_SUBSCRIBE = 102; + private static final int REQUEST_GOOGLE_TASKS_SUBSCRIBE = 103; - @Inject GtasksPreferenceService gtasksPreferenceService; @Inject ActivityPermissionRequestor permissionRequestor; @Inject PermissionChecker permissionChecker; @Inject Tracker tracker; @@ -53,6 +55,7 @@ public class SynchronizationPreferences extends InjectingPreferenceActivity { @Inject DialogBuilder dialogBuilder; @Inject SyncAdapters syncAdapters; @Inject GoogleTaskDao googleTaskDao; + @Inject GoogleTaskListDao googleTaskListDao; @Inject GoogleAccountManager googleAccountManager; @Inject Preferences preferences; @Inject JobManager jobManager; @@ -65,49 +68,52 @@ public class SynchronizationPreferences extends InjectingPreferenceActivity { addPreferencesFromResource(R.xml.preferences_synchronization); - PreferenceCategory caldavPreferences = (PreferenceCategory) findPreference(getString(R.string.CalDAV)); + PreferenceCategory caldavPreferences = + (PreferenceCategory) findPreference(getString(R.string.CalDAV)); for (CaldavAccount caldavAccount : caldavDao.getAccounts()) { Preference accountPreferences = new Preference(this); accountPreferences.setTitle(caldavAccount.getName()); accountPreferences.setSummary(caldavAccount.getUrl()); - accountPreferences.setOnPreferenceClickListener(preference -> { - Intent intent = new Intent(this, CaldavAccountSettingsActivity.class); - intent.putExtra(CaldavAccountSettingsActivity.EXTRA_CALDAV_DATA, caldavAccount); - startActivityForResult(intent, REQUEST_CALDAV_SETTINGS); - return false; - }); + accountPreferences.setOnPreferenceClickListener( + preference -> { + Intent intent = new Intent(this, CaldavAccountSettingsActivity.class); + intent.putExtra(CaldavAccountSettingsActivity.EXTRA_CALDAV_DATA, caldavAccount); + startActivityForResult(intent, REQUEST_CALDAV_SETTINGS); + return false; + }); caldavPreferences.addPreference(accountPreferences); } Preference addCaldavAccount = new Preference(this); - addCaldavAccount.setKey(getString(R.string.add_account)); + addCaldavAccount.setKey(KEY_ADD_CALDAV); addCaldavAccount.setTitle(R.string.add_account); caldavPreferences.addPreference(addCaldavAccount); - final CheckBoxPreference gtaskPreference = - (CheckBoxPreference) findPreference(getString(R.string.sync_gtasks)); - gtaskPreference.setChecked(syncAdapters.isGoogleTaskSyncEnabled()); - gtaskPreference.setOnPreferenceChangeListener( - (preference, newValue) -> { - if ((boolean) newValue) { + PreferenceCategory googleTaskPreferences = + (PreferenceCategory) findPreference(getString(R.string.gtasks_GPr_header)); + for (GoogleTaskAccount googleTaskAccount : googleTaskListDao.getAccounts()) { + String account = googleTaskAccount.getAccount(); + if (googleAccountManager.getAccount(account) == null) { + Timber.e("Can't access %s", account); + continue; + } + Preference accountPreferences = new Preference(this); + accountPreferences.setTitle(account); + accountPreferences.setOnPreferenceClickListener( + preference -> { if (!playServices.refreshAndCheck()) { playServices.resolve(SynchronizationPreferences.this); } else if (permissionRequestor.requestAccountPermissions()) { requestLogin(); } return false; - } else { - jobManager.updateBackgroundSync(); - tracker.reportEvent(Tracking.Events.GTASK_DISABLED); - return true; - } - }); - if (gtasksPreferenceService.getLastSyncDate() > 0) { - gtaskPreference.setSummary( - getString( - R.string.sync_status_success, - DateUtilities.getDateStringWithTime( - SynchronizationPreferences.this, gtasksPreferenceService.getLastSyncDate()))); + }); + googleTaskPreferences.addPreference(accountPreferences); } + Preference addGoogleTaskAccount = new Preference(this); + addGoogleTaskAccount.setKey(KEY_ADD_GOOGLE_TASKS); + addGoogleTaskAccount.setTitle(R.string.add_account); + googleTaskPreferences.addPreference(addGoogleTaskAccount); + findPreference(getString(R.string.p_background_sync_unmetered_only)) .setOnPreferenceChangeListener( (preference, o) -> { @@ -120,24 +126,6 @@ public class SynchronizationPreferences extends InjectingPreferenceActivity { jobManager.updateBackgroundSync(null, (Boolean) o, null); return true; }); - findPreference(getString(R.string.sync_SPr_forget_key)) - .setOnPreferenceClickListener( - preference -> { - dialogBuilder - .newMessageDialog(R.string.sync_forget_confirm) - .setPositiveButton( - android.R.string.ok, - (dialog, which) -> { - gtasksPreferenceService.clearLastSyncDate(); - gtasksPreferenceService.setUserName(null); - googleTaskDao.deleteAll(); - tracker.reportEvent(Tracking.Events.GTASK_LOGOUT); - gtaskPreference.setChecked(false); - }) - .setNegativeButton(android.R.string.cancel, null) - .show(); - return true; - }); } private void requestLogin() { @@ -149,28 +137,55 @@ public class SynchronizationPreferences extends InjectingPreferenceActivity { protected void onResume() { super.onResume(); - Preference addCaldavAccount = findPreference(R.string.add_account); + Preference addCaldavAccount = findPreference(KEY_ADD_CALDAV); + Preference addGoogleTasks = findPreference(KEY_ADD_GOOGLE_TASKS); if (inventory.hasPro()) { addCaldavAccount.setSummary(null); - addCaldavAccount.setOnPreferenceClickListener(preference -> { - addCaldavAccount(); - return false; - }); + addGoogleTasks.setSummary(null); + addCaldavAccount.setOnPreferenceClickListener( + preference -> { + addCaldavAccount(); + return false; + }); + addGoogleTasks.setOnPreferenceClickListener( + preference -> { + requestLogin(); + return false; + }); } else { addCaldavAccount.setSummary(R.string.requires_pro_subscription); - addCaldavAccount.setOnPreferenceClickListener(preference -> { - startActivityForResult(new Intent(this, PurchaseActivity.class), REQUEST_CALDAV_SUBSCRIBE); - return false; - }); + addCaldavAccount.setOnPreferenceClickListener( + preference -> { + startActivityForResult( + new Intent(this, PurchaseActivity.class), REQUEST_CALDAV_SUBSCRIBE); + return false; + }); + if (googleTaskListDao.getAccounts().isEmpty()) { + addGoogleTasks.setSummary(null); + addGoogleTasks.setOnPreferenceClickListener( + preference -> { + requestLogin(); + return false; + }); + } else { + addGoogleTasks.setSummary(R.string.requires_pro_subscription); + addGoogleTasks.setOnPreferenceClickListener( + preference -> { + startActivityForResult( + new Intent(this, PurchaseActivity.class), REQUEST_GOOGLE_TASKS_SUBSCRIBE); + return false; + }); + } } if (!permissionChecker.canAccessAccounts()) { - ((CheckBoxPreference) findPreference(getString(R.string.sync_gtasks))).setChecked(false); + // TODO: clear google task preference category } } private void addCaldavAccount() { - startActivityForResult(new Intent(this, CaldavAccountSettingsActivity.class), REQUEST_CALDAV_SETTINGS); + startActivityForResult( + new Intent(this, CaldavAccountSettingsActivity.class), REQUEST_CALDAV_SETTINGS); } @Override @@ -180,24 +195,32 @@ public class SynchronizationPreferences extends InjectingPreferenceActivity { if (enabled) { tracker.reportEvent(Tracking.Events.GTASK_ENABLED); jobManager.updateBackgroundSync(); + restart(); } - ((CheckBoxPreference) findPreference(getString(R.string.sync_gtasks))).setChecked(enabled); } else if (requestCode == REQUEST_CALDAV_SETTINGS) { if (resultCode == RESULT_OK) { jobManager.updateBackgroundSync(); - Intent intent = getIntent(); - finish(); - startActivity(intent); + restart(); } } else if (requestCode == REQUEST_CALDAV_SUBSCRIBE) { if (inventory.hasPro()) { addCaldavAccount(); } + } else if (requestCode == REQUEST_GOOGLE_TASKS_SUBSCRIBE) { + if (inventory.hasPro()) { + requestLogin(); + } } else { super.onActivityResult(requestCode, resultCode, data); } } + private void restart() { + Intent intent = getIntent(); + finish(); + startActivity(intent); + } + @Override public void onRequestPermissionsResult( int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 749240a61..bc438b737 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -129,10 +129,7 @@ غدا أمس إنتظر من فضلك... - آخر تحيين:\n%s تحيين في الخلفية - خروج - تسجيل الخروج/ مسح معلومات المزامنه؟ أظهر تواريخ الإستحقاق إظهار مربعات التعليم إظهار الهايدر diff --git a/app/src/main/res/values-bg-rBG/strings.xml b/app/src/main/res/values-bg-rBG/strings.xml index d3d294eb6..28738e0f5 100644 --- a/app/src/main/res/values-bg-rBG/strings.xml +++ b/app/src/main/res/values-bg-rBG/strings.xml @@ -300,11 +300,7 @@ Утре Вчера Моля, изчакайте... - Последна синхронизация:\n%s Синхронзиране във фонов режим - Излизане - Изчистване на всички данни от синхронзация - Изход/изчистване на данните от синхронизация? Покажи крайните дати Покажи отметки Покажи хедър diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index df6d8a82a..e5d2ab764 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -110,11 +110,7 @@ Demà Ahir Si us plau, espera... - Última sincronització:\n%s Sincronitzar en segon pla - Surt - Esborra tota la informació de sincronització - Tancar sessió / esborra la informació de sincronització? Codi font Contribuir traduccions Contacta amb el desenvolupador diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 5b3e20661..6c66bcffe 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -207,11 +207,7 @@ Zítra Včera Čekejte prosím... - Poslední synchronizace:\n%s Synchronizace na pozadí - Odhlásit se - Smazat všechny synchronizační data - Odhlásit se / vymazat synchronizační data? Ukázat data splnění Ukázat zaškrtávací políčka Zobraz záhlaví diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 341004a7f..8ea3a44bc 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -93,7 +93,5 @@ I går Vent venligst... Baggrunds Synk - Log af - Sletter al synkroniserings data Kildekode \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 4afe1a5d2..72c878f09 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -293,11 +293,7 @@ Morg. Gest. Bitte warten... - Letzte Synchronisierung:\n%s Hintergrund-Synchronisierung - Abmelden - Alle Synchronisationsdaten löschen - Ausloggen / Synchronisierte Daten löschen? Zeige Fälligkeitsdaten Checkboxen anzeigen Kopf anzeigen diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index e55d5ee53..0a74beb63 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -181,8 +181,6 @@ Αύριο Χθές Παρακαλώ περιμένετε... - Τελευταίος συγχρονισμός:\n%s Συγχρονισμός παρασκηνίου - Αποσύνδεση Δωρίστε \ No newline at end of file diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index e1e9865d9..bde0ff179 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -296,11 +296,7 @@ Mñna Ayer Por favor, espere... - Ultima sincronización:\n%s Sincronización en segundo plano - Cerrar sesión - Limpia todos los datos de la sincronización - Cerrar sesión/Limpiar datos de sincronización? Mostrar fechas de vencimiento Mostrar casillas de verificación Mostrar encabezado diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 21559446c..37e4b47ca 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -194,7 +194,6 @@ دیروز لطفا منتظر بمانید... سینک پیش زمینه - خروج از حساب کاربری نمایش تاریخ موعود نمایش محل تیک نمایش سربرگ diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 98887c17d..da13d5a79 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -301,11 +301,7 @@ Huominen Eilinen Ole hyvä ja odota... - Viimeisin synkronointi:\n%s Tausta synkronointi - Kirjaudu ulos - Tyhjennä kaikki synkronointidata - Kirjaudu ulos/tyhjennä synkronointidata Näytä määräpäivät Näytä valintaruudut Näytä otsikot diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 642d7b306..93ae3fea1 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -286,11 +286,7 @@ Demain Hier Veuillez patienter... - Dernière synchro. :\n%s Synchro. en arrière-plan - Se déconnecter - Supprimer définitivement toutes les données de synchronisation - Se déconnecter/supprimer définitivement toutes les données de synchronisation ? Montrer les dates échéantes Montrer les cases à cocher Montrer l\'en-tête diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index a5756a7cf..496fa6d7b 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -223,11 +223,7 @@ Mñna Ayer Por favor, espere... - Ultima sincronización:\n%s Sincronización en segundo plano - Cerrar sesión - Limpia todos los datos de la sincronización - Cerrar sesión/Limpiar datos de sincronización? Mostrar fechas de vencimiento Mostrar casillas de verificación Mostrar encabezado diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 5a62e3117..06ea0dd05 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -300,11 +300,7 @@ Holn Tegn Kérlek, várj... - Utolsó szinkronizáció:\n%s Szinkronizáció a háttérben - Kijelentkezés - Az összes szinkronizációs adat törlése - Kijelentkezés és szinkronizációs adatok törlése? Határidők megjelenítése Jelölőnégyzetek megjelenítése Fejléc megjelenítése diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 462900d78..40f33b081 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -297,11 +297,7 @@ Domani Ieri Attendi... - Ultima Sincronizzazione:\n%s Sincronizzazione eseguita in background - Esci - Cancella tutti i dati di sincronizzazione - Esci / cancella i file di sincronizzazione? Mostra scadenze Mostra caselle selezione Mostra intestazione diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 25e0a0674..5ff6d55e5 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -248,11 +248,7 @@ מחר אתמול אנא המתן... - סנכרון אחרון:\n%s סנכרון ברקע - התנתק - מסיר את כל נתוני הסנכרון - צא מהחשבון \\ הסר נתוני סנכרון? הצג תאריכי יעד הצג תיבות סימון הצג כותרת diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index f07c54a08..93c4c0e79 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -298,11 +298,7 @@ 明日 昨日 お待ちください - 前回の同期:\n%s バックグラウンド同期 - ログアウト - すべての同期データを消去します - ログアウトと同期データを消去しますか? 期限を表示 チェックボックスを表示 ヘッダーを表示 diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 8e8c01092..721660ae8 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -302,11 +302,7 @@ 내일 어제 잠시 기다리세요... - 마지막 동기화: \n%s 백그라운드 동기화 - 로그아웃 - 모든 동기화 자료 삭제 - 로그아웃 / 모든 동기화 데이터 삭제? 완료 예정일 표시 체크박스 표시 헤더 표시 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index d340f45dd..d78616a3e 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -297,11 +297,7 @@ Ryt Vakar Prašome palaukti... - Paskutinė sinchronizacija:\n%s Foninis sinchronizavimas - Atsijungti - Išvalo visą sinchronizacijos informaciją - Atsijungti/išvalyti sinchronizacijos informaciją? Rodyti pabaigos terminus Rodyti žymimus kvadratėlius Rodyti antraštę diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 0c04ab4be..662cd71e7 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -133,11 +133,7 @@ I morgen I går Vennligst vent... - Siste synkronisering:\n%s Bakgrunnssynkronisering - Logg ut - Sletter all synkroniseringsdata - Logg ut / slett synkroniseringsdata? Vis tidsfrister Vis avmerkingsbokser Vis innstillinger diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 3fa69351b..e299e14d8 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -296,11 +296,7 @@ mrgn gisteren Even geduld a.u.b. - Vorige:\n%s Achtergrond synchronisatie - Afmelden - Alle synchronisatie gegevens verwijderen - Afmelden / synchronisatie gegevens verwijderen? Toon eind datums Toon vinkboxjes Toon titel diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 41a1245ff..84f4db89d 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -276,11 +276,7 @@ jtr wcz Proszę czekać... - Ostatnia synchronizacja:\n%s Synchronizacja w tle - Wyloguj - Czyści wszystkie dane synchronizacji - Wyloguj / wyczyść dane synchronizacji? Pokaż terminy Pokaż przyciski wyboru Pokaż nagłówek diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index ece5a620a..0c6c8c8cb 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -220,11 +220,7 @@ amanhã ontem Por favor, aguarde... - Última sincronização:\n%s Sincronização em segundo plano - Desconectar - Limpar todos os dados de sincronização - Desconectar / limpar dados de sincronização? Mostrar vencimentos Mostrar tarefas ocultas Mostrar ocultas diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 7dbddbb51..731d8fbf2 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -298,11 +298,7 @@ Amanhã Ontem Por favor aguarde... - Última sincronização:\n%s Sincronização em segundo plano - Sair - Remove todos os dados de sincronização - Sair/limpar dados de sincronização? Mostrar datas limite Mostrar caixas de seleção Mostrar cabeçalho diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 5c8c81506..e3be578d4 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -298,11 +298,7 @@ Завт Вчера Пожалуйста, подождите… - Последняя синхр.:\n%s Фоновая синхр. - Выйти - Очищает все данные синхронизации - Выйти и очистить данные синхронизации? Показать даты Показать флажки Показать заголовок diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index c496379b5..f69ef0c34 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -298,11 +298,7 @@ Zajtra Včera Prosím čakaj... - Posledná synchronizácia:\n%s Synchronizácia na pozadí - Odhlásiť sa - Vymaže všetky údaje synchronizácie - Odhlásiť sa/vymazať údaje synchronizácie? Ukázať dátumy vypršania Ukázať zaškrtávacie políčka Ukázať záhlavia diff --git a/app/src/main/res/values-sl-rSI/strings.xml b/app/src/main/res/values-sl-rSI/strings.xml index 87151602a..46ca5c111 100644 --- a/app/src/main/res/values-sl-rSI/strings.xml +++ b/app/src/main/res/values-sl-rSI/strings.xml @@ -187,10 +187,6 @@ Jutr Včer Prosimo, počakajte... - Najnovejše usklajevanje:\n%s Usklajevanje v ozadju - Odjava - Zbriše vse usklajene podatke - Odjava/brisanje usklajenih podatkov? Donirajte \ No newline at end of file diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 3a29a937e..d9a775646 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -223,11 +223,7 @@ imorn Igår Var god vänta... - Synkroniserades senast:\n%s Bakgrundssynkronisering - Logga ut - Rensar alla synkroniseringsdata - Logga ut / rensa synkroniseringsdata? Visa förfallodatum Visa kryssrutor Visa rubrik diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index c2db01ee0..5b9f067c2 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -302,11 +302,7 @@ Yarın Dün Lütfen bekleyin... - Son eşzamanlama:\n%s Arka planda eşzamanla - Çıkış Yap - Tüm eşzamanlama verilerini temizle - Çıkış yap/eşzamanlama verisini temizle? Bitiş tarihlerini göster Onay kutularını göster Başlığı göster diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index cf234b99f..f29b97742 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -226,11 +226,7 @@ Звтр Вчр Будь ласка, зачекайте... - Остання синхр.:\n%s Фонова синхронізація - Вийти - Очищує всю синхронізовану інформацію - Вийти/очистити синхронізовану інофрмацію? Показувати дату виконання Показати галочки Показати заголовок diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index bef455cc2..0eaf5d389 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -297,11 +297,7 @@ 明天 昨天 请稍候... - 上次同步:\n%s 后台同步 - 登出 - 清除所有同步资料 - 登出/清除同步资料? 显示截止日期 显示复选框 显示标题 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 6dc00a570..6f05b4236 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -189,11 +189,7 @@ 明天 昨天 請稍候... - 上次同步:\n%s 後台同步 - 登出 - 清除所有同步資料 - 登出/清除同步資料? 顯示到期日 顯示核取方塊 顯示標頭 diff --git a/app/src/main/res/values/keys.xml b/app/src/main/res/values/keys.xml index 534a1f44b..867196ab4 100644 --- a/app/src/main/res/values/keys.xml +++ b/app/src/main/res/values/keys.xml @@ -149,10 +149,6 @@ p_end_at_deadline - - - sync_forget - @@ -187,7 +183,6 @@ TEA_ctrl_comments TEA_ctrl_gcal TEA_ctrl_gtask - sync_gtasks geolocation_radius geofence_responsiveness show_hidden_tasks @@ -242,7 +237,6 @@ Delete List On Off - Clear Clear completed Custom Preset diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 11de209a5..33be4863d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -669,20 +669,9 @@ File %1$s contained %2$s.\n\n - - Last sync:\n%s - Background sync - - Log out - - Clears all synchronization data - - - Log out/clear synchronization data? - Show due dates Show checkboxes Show header @@ -877,7 +866,6 @@ File %1$s contained %2$s.\n\n List notification Help Home set not found - Could not find any calendars with VTODO support Connection failed Only on unmetered connections Upgrade diff --git a/app/src/main/res/xml/preferences_synchronization.xml b/app/src/main/res/xml/preferences_synchronization.xml index 265b8a3fc..51f1e6129 100644 --- a/app/src/main/res/xml/preferences_synchronization.xml +++ b/app/src/main/res/xml/preferences_synchronization.xml @@ -6,21 +6,9 @@ - - - - - - - - +