Last active
September 14, 2019 12:48
-
-
Save ininmm/0409d134e33695daa685ed439157da5b to your computer and use it in GitHub Desktop.
TasksLocalDataSource
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class TasksLocalDataSource @Inject constructor( | |
private val tasksDao: TasksDao, | |
private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO | |
) : TasksDataSource { | |
override suspend fun getTasks(): Result<List<Task>> = withContext(ioDispatcher) { | |
return@withContext try { | |
Success(tasksDao.getTasks()) | |
} catch (e: Exception) { | |
e.printStackTrace() | |
Error(e) | |
} | |
} | |
override suspend fun getTask(taskId: String): Result<Task> = withContext(ioDispatcher) { | |
try { | |
val task = tasksDao.getTaskById(taskId) | |
if (task != null) { | |
return@withContext Success(task) | |
} else { | |
return@withContext Error(NullPointerException("Task not found!")) | |
} | |
} catch (e: Exception) { | |
e.printStackTrace() | |
return@withContext Error(e) | |
} | |
} | |
override suspend fun saveTask(task: Task) = withContext<Unit>(ioDispatcher) { | |
tasksDao.insertTask(task) | |
} | |
override suspend fun completeTask(task: Task) = withContext(ioDispatcher) { | |
tasksDao.updateComplete(task.id, true) | |
} | |
override suspend fun completeTask(taskId: String) { | |
tasksDao.updateComplete(taskId, true) | |
} | |
override suspend fun activateTask(task: Task) = withContext(ioDispatcher) { | |
tasksDao.updateComplete(task.id, false) | |
} | |
override suspend fun activateTask(taskId: String) { | |
tasksDao.updateComplete(taskId, false) | |
} | |
override suspend fun cleanCompleteTasks() = withContext<Unit>(ioDispatcher) { | |
tasksDao.deleteCompletedTasks() | |
} | |
override suspend fun deleteAllTasks() = withContext(ioDispatcher) { | |
tasksDao.deleteTasks() | |
} | |
override suspend fun deleteTask(taskId: String) = withContext<Unit>(ioDispatcher) { | |
tasksDao.deleteTaskById(taskId) | |
} | |
} | |
object TasksRemoteDataSource : TasksDataSource { | |
private const val SERVICE_LATENCY_IN_MILLS = 2000L | |
private var TASKS_SERVICE_DATA = LinkedHashMap<String, Task>(2) | |
init { | |
addTask("Build tower in Pisa", "Ground looks good, no foundation work required.") | |
addTask("Finish bridge in Tacoma", "Found awesome girders at half the cost.") | |
} | |
private fun addTask(title: String, description: String) { | |
val newTask = Task(title, description) | |
TASKS_SERVICE_DATA[newTask.id] = newTask | |
} | |
override suspend fun getTasks(): Result<List<Task>> { | |
// 模擬 API 等待一段時間後回應 | |
val tasks = TASKS_SERVICE_DATA.values.toList() | |
delay(SERVICE_LATENCY_IN_MILLS) | |
return Success(tasks) | |
} | |
override suspend fun getTask(taskId: String): Result<Task> { | |
delay(SERVICE_LATENCY_IN_MILLS) | |
TASKS_SERVICE_DATA[taskId]?.let { | |
return Success(it) | |
} | |
return Error(NullPointerException("Task not found.")) | |
} | |
override suspend fun saveTask(task: Task) { | |
TASKS_SERVICE_DATA[task.id] = task | |
} | |
override suspend fun completeTask(task: Task) { | |
val completedTask = Task(task.title, task.description, true, task.id) | |
TASKS_SERVICE_DATA[task.id] = completedTask | |
} | |
override suspend fun completeTask(taskId: String) { | |
// fixme : Not required | |
} | |
override suspend fun activateTask(task: Task) { | |
val activeTask = Task(task.title, task.description, false, task.id) | |
TASKS_SERVICE_DATA[task.id] = activeTask | |
} | |
override suspend fun activateTask(taskId: String) { | |
// fixme : Not required | |
} | |
override suspend fun cleanCompleteTasks() { | |
TASKS_SERVICE_DATA = TASKS_SERVICE_DATA.filterValues { | |
!it.isCompleted | |
} as LinkedHashMap<String, Task> | |
} | |
override suspend fun deleteAllTasks() { | |
TASKS_SERVICE_DATA.clear() | |
} | |
override suspend fun deleteTask(taskId: String) { | |
TASKS_SERVICE_DATA.remove(taskId) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment