From 8d2fd994d13c47bfe3ffe8906fcda8071fd6b379 Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Tue, 28 Jun 2022 17:44:45 +0200 Subject: [PATCH] Implement task sorting --- .../habitica/models/tasks/TasksOrder.kt | 9 +++++ wearos/build.gradle | 2 + .../wearos/habitica/MainApplication.kt | 11 ++++-- .../wearos/habitica/data/ApiClient.kt | 1 + .../data/repositories/TaskLocalRepository.kt | 37 ++++++++++++++----- .../data/repositories/TaskRepository.kt | 5 ++- .../data/repositories/UserRepository.kt | 3 +- .../wearos/habitica/models/user/User.kt | 2 + .../ui/viewmodels/SettingsViewModel.kt | 4 +- .../habitica/ui/viewmodels/SplashViewModel.kt | 4 +- .../ui/viewmodels/TaskListViewModel.kt | 3 +- 11 files changed, 59 insertions(+), 22 deletions(-) diff --git a/common/src/main/java/com/habitrpg/common/habitica/models/tasks/TasksOrder.kt b/common/src/main/java/com/habitrpg/common/habitica/models/tasks/TasksOrder.kt index 6b83bc3fc..501a45ac4 100644 --- a/common/src/main/java/com/habitrpg/common/habitica/models/tasks/TasksOrder.kt +++ b/common/src/main/java/com/habitrpg/common/habitica/models/tasks/TasksOrder.kt @@ -1,6 +1,15 @@ package com.habitrpg.common.habitica.models.tasks class TasksOrder { + fun positionOf(key: String, type: TaskType): Int { + return when (type) { + TaskType.HABIT -> habits.indexOf(key) + TaskType.DAILY -> dailys.indexOf(key) + TaskType.TODO -> todos.indexOf(key) + TaskType.REWARD -> rewards.indexOf(key) + } + } + var habits: List = listOf() var dailys: List = listOf() var todos: List = listOf() diff --git a/wearos/build.gradle b/wearos/build.gradle index ae270f26b..b4fd08bc1 100644 --- a/wearos/build.gradle +++ b/wearos/build.gradle @@ -79,6 +79,8 @@ dependencies { implementation "com.google.dagger:hilt-android:$daggerhilt_version" kapt "com.google.dagger:hilt-compiler:$daggerhilt_version" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" + } repositories { mavenCentral() diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/MainApplication.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/MainApplication.kt index d58da7d1c..fa5c92fd4 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/MainApplication.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/MainApplication.kt @@ -11,6 +11,7 @@ import com.habitrpg.wearos.habitica.ui.activities.BaseActivity import com.habitrpg.wearos.habitica.ui.activities.FaintActivity import com.habitrpg.wearos.habitica.ui.activities.RYAActivity import dagger.hilt.android.HiltAndroidApp +import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.MainScope import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.onEach @@ -42,9 +43,13 @@ class MainApplication : Application() { } }.collect() } - MainScope().launch { - userRepository.retrieveUser() - taskRepository.retrieveTasks() + if (userRepository.hasAuthentication) { + MainScope().launch(CoroutineExceptionHandler { coroutineContext, throwable -> + + }) { + val user = userRepository.retrieveUser() + taskRepository.retrieveTasks(user?.tasksOrder) + } } } } \ No newline at end of file diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/data/ApiClient.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/data/ApiClient.kt index 0642ff40a..5bee82645 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/data/ApiClient.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/data/ApiClient.kt @@ -161,4 +161,5 @@ class ApiClient @Inject constructor( process(apiService.scoreTask(id, direction)) suspend fun createTask(task: Task) = process(apiService.createTask(task)) + fun hasAuthentication() = hostConfig.hasAuthentication() } \ No newline at end of file diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/data/repositories/TaskLocalRepository.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/data/repositories/TaskLocalRepository.kt index f0ba3b420..d4ce7c5b3 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/data/repositories/TaskLocalRepository.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/data/repositories/TaskLocalRepository.kt @@ -3,6 +3,7 @@ package com.habitrpg.wearos.habitica.data.repositories import androidx.lifecycle.MutableLiveData import androidx.lifecycle.asFlow import com.habitrpg.common.habitica.models.tasks.TaskType +import com.habitrpg.common.habitica.models.tasks.TasksOrder import com.habitrpg.wearos.habitica.models.tasks.Task import com.habitrpg.wearos.habitica.models.tasks.TaskList import kotlinx.coroutines.flow.Flow @@ -28,24 +29,40 @@ class TaskLocalRepository @Inject constructor() { return tasks[type]?.asFlow() ?: emptyFlow() } - fun saveTasks(tasks: TaskList) { + fun saveTasks(tasks: TaskList, order: TasksOrder?) { val taskMap = mutableMapOf( - TaskType.HABIT to mutableListOf(), - TaskType.DAILY to mutableListOf(), - TaskType.TODO to mutableListOf(), - TaskType.REWARD to mutableListOf() + TaskType.HABIT to sortTasks(tasks.tasks, order?.habits ?: emptyList(), TaskType.HABIT), + TaskType.DAILY to sortTasks(tasks.tasks, order?.dailys ?: emptyList(), TaskType.DAILY), + TaskType.TODO to sortTasks(tasks.tasks, order?.todos ?: emptyList(), TaskType.TODO), + TaskType.REWARD to sortTasks(tasks.tasks, order?.rewards ?: emptyList(), TaskType.REWARD) ) - for (task in tasks.tasks) { - if (task.value.type != null) { - taskMap[task.value.type]?.add(task.value) - } - } for (type in taskMap) { this.tasks[type.key]?.value = type.value } taskCountHelperValue.value = Date().time } + private fun sortTasks(taskMap: MutableMap, taskOrder: List, type: TaskType): List { + val taskList = ArrayList() + var position = 0 + for (taskId in taskOrder) { + val task = taskMap[taskId] + if (task != null) { + task.position = position + taskList.add(task) + position++ + taskMap.remove(taskId) + } + } + for (task in taskMap.values) { + if (task.type != type) continue + task.position = position + taskList.add(task) + position++ + } + return taskList + } + fun updateTask(task: Task) { val oldList = tasks[task.type]?.value?.toMutableList() val index = oldList?.indexOfFirst { task.id == it.id } diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/data/repositories/TaskRepository.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/data/repositories/TaskRepository.kt index 3d3151334..363c584e3 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/data/repositories/TaskRepository.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/data/repositories/TaskRepository.kt @@ -3,6 +3,7 @@ package com.habitrpg.wearos.habitica.data.repositories import com.habitrpg.common.habitica.models.responses.TaskDirection import com.habitrpg.common.habitica.models.responses.TaskScoringResult import com.habitrpg.common.habitica.models.tasks.TaskType +import com.habitrpg.common.habitica.models.tasks.TasksOrder import com.habitrpg.wearos.habitica.data.ApiClient import com.habitrpg.wearos.habitica.models.tasks.Task import com.habitrpg.wearos.habitica.models.tasks.TaskList @@ -13,9 +14,9 @@ import javax.inject.Inject class TaskRepository @Inject constructor(val apiClient: ApiClient, val localRepository: TaskLocalRepository, val userLocalRepository: UserLocalRepository) { - suspend fun retrieveTasks(): TaskList? { + suspend fun retrieveTasks(order: TasksOrder?): TaskList? { val tasks = apiClient.getTasks() - tasks?.let { localRepository.saveTasks(tasks) } + tasks?.let { localRepository.saveTasks(tasks, order) } return tasks } fun getTasks(taskType: TaskType) = localRepository.getTasks(taskType) diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/data/repositories/UserRepository.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/data/repositories/UserRepository.kt index e3e3a80db..8e1ce645a 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/data/repositories/UserRepository.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/data/repositories/UserRepository.kt @@ -5,7 +5,8 @@ import com.habitrpg.wearos.habitica.models.user.User import javax.inject.Inject class UserRepository @Inject constructor(val apiClient: ApiClient, val localRepository: UserLocalRepository) { - + val hasAuthentication: Boolean + get() = apiClient.hasAuthentication() fun getUser() = localRepository.getUser() suspend fun retrieveUser(): User? { diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/user/User.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/user/User.kt index 551328668..2d7d75575 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/models/user/User.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/models/user/User.kt @@ -1,10 +1,12 @@ package com.habitrpg.wearos.habitica.models.user import com.habitrpg.common.habitica.models.Avatar +import com.habitrpg.common.habitica.models.tasks.TasksOrder import com.squareup.moshi.JsonClass @JsonClass(generateAdapter = true) class User: Avatar { + val tasksOrder: TasksOrder? = null val isDead: Boolean get() = (stats?.hp ?: 0.0) <= 0.0 override val currentMount: String? diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/SettingsViewModel.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/SettingsViewModel.kt index 7e7cb1d03..239b2c105 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/SettingsViewModel.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/SettingsViewModel.kt @@ -31,8 +31,8 @@ class SettingsViewModel @Inject constructor(userRepository: UserRepository, fun resyncData() { viewModelScope.launch(exceptionBuilder.userFacing(this)) { loadingManager.startLoading() - userRepository.retrieveUser() - taskRepository.retrieveTasks() + val user = userRepository.retrieveUser() + taskRepository.retrieveTasks(user?.tasksOrder) loadingManager.endLoading() } } diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/SplashViewModel.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/SplashViewModel.kt index 9536654e7..349219745 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/SplashViewModel.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/SplashViewModel.kt @@ -5,7 +5,6 @@ import androidx.core.content.edit import androidx.lifecycle.viewModelScope import com.google.android.gms.wearable.MessageClient import com.google.android.gms.wearable.MessageEvent -import com.habitrpg.common.habitica.api.HostConfig import com.habitrpg.common.habitica.helpers.KeyHelper import com.habitrpg.wearos.habitica.data.ApiClient import com.habitrpg.wearos.habitica.data.repositories.UserRepository @@ -18,7 +17,6 @@ import javax.inject.Inject @HiltViewModel class SplashViewModel @Inject constructor(userRepository: UserRepository, exceptionBuilder: ExceptionHandlerBuilder, - val hostConfig: HostConfig, val apiClient: ApiClient, val sharedPreferences: SharedPreferences, val keyHelper: KeyHelper?, loadingManager: LoadingManager @@ -26,7 +24,7 @@ class SplashViewModel @Inject constructor(userRepository: UserRepository, lateinit var onLoginCompleted: (Boolean) -> Unit val hasAuthentication: Boolean get() { - return hostConfig.hasAuthentication() + return apiClient.hasAuthentication() } override fun onMessageReceived(event: MessageEvent) { diff --git a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/TaskListViewModel.kt b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/TaskListViewModel.kt index 81b15c5f9..31a6313b1 100644 --- a/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/TaskListViewModel.kt +++ b/wearos/src/main/java/com/habitrpg/wearos/habitica/ui/viewmodels/TaskListViewModel.kt @@ -41,7 +41,8 @@ class TaskListViewModel @Inject constructor( fun retrieveTasks() { viewModelScope.launch(exceptionBuilder.userFacing(this)) { - taskRepository.retrieveTasks() + val user = userRepository.retrieveUser() + taskRepository.retrieveTasks(user?.tasksOrder) } } } \ No newline at end of file