Skip to content

Instantly share code, notes, and snippets.

@ininmm
Last active September 14, 2019 12:48
Show Gist options
  • Save ininmm/0409d134e33695daa685ed439157da5b to your computer and use it in GitHub Desktop.
Save ininmm/0409d134e33695daa685ed439157da5b to your computer and use it in GitHub Desktop.
TasksLocalDataSource
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