mirror of
https://github.com/sudoxnym/habitica-android.git
synced 2026-04-14 19:56:32 +00:00
tiny tiny fixes
This commit is contained in:
parent
f66eeb94e7
commit
b96ed25002
37 changed files with 128 additions and 72 deletions
|
|
@ -36,7 +36,7 @@ class TaskRepository @Inject constructor(
|
|||
if (direction == TaskDirection.UP) {
|
||||
task.counterUp = task.counterUp?.plus(1) ?: 1
|
||||
} else {
|
||||
task.counterUp = task.counterDown?.plus(1) ?: 1
|
||||
task.counterDown = task.counterDown?.plus(1) ?: 1
|
||||
}
|
||||
} else if (task.type == TaskType.DAILY) {
|
||||
if (direction == TaskDirection.UP) {
|
||||
|
|
|
|||
|
|
@ -29,6 +29,5 @@ class UserRepository @Inject constructor(
|
|||
suspend fun revive() = apiClient.revive()
|
||||
suspend fun runCron() {
|
||||
apiClient.runCron()
|
||||
retrieveUser()
|
||||
}
|
||||
}
|
||||
|
|
@ -94,11 +94,11 @@ open class Task constructor(): Parcelable {
|
|||
|
||||
val streakString: String?
|
||||
get() {
|
||||
return if (counterUp != null && (counterUp ?: 0) > 0 && counterDown != null && (counterDown ?: 0) > 0) {
|
||||
return if ((counterUp ?: 0) > 0 && (counterDown ?: 0) > 0) {
|
||||
"+" + counterUp.toString() + " | -" + counterDown?.toString()
|
||||
} else if (counterUp != null && (counterUp ?: 0) > 0) {
|
||||
} else if ((counterUp ?: 0) > 0) {
|
||||
"+" + counterUp.toString()
|
||||
} else if (counterDown != null && (counterDown ?: 0) > 0) {
|
||||
} else if ((counterDown ?: 0) > 0) {
|
||||
"-" + counterDown.toString()
|
||||
} else if ((streak ?: 0) > 0) {
|
||||
return streak.toString()
|
||||
|
|
@ -323,9 +323,9 @@ open class Task constructor(): Parcelable {
|
|||
this.down = `in`.readValue(Boolean::class.java.classLoader) as? Boolean ?: false
|
||||
this.completed = `in`.readByte().toInt() != 0
|
||||
this.checklist = listOf()
|
||||
`in`.readList(this.checklist as List<*>, ChecklistItem::class.java.classLoader)
|
||||
`in`.readList(this.checklist as List<ChecklistItem>, ChecklistItem::class.java.classLoader)
|
||||
this.reminders = listOf()
|
||||
`in`.readList(this.reminders as MutableList<Any?>, RemindersItem::class.java.classLoader)
|
||||
`in`.readList(this.reminders as List<RemindersItem>, RemindersItem::class.java.classLoader)
|
||||
this.frequency = Frequency.from(`in`.readString() ?: "")
|
||||
this.everyX = `in`.readValue(Int::class.java.classLoader) as? Int ?: 1
|
||||
this.daysOfMonthString = `in`.readString()
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@ class AvatarActivity: BaseActivity<ActivityAvatarBinding, AvatarViewModel>() {
|
|||
windowManager.currentWindowMetrics.bounds.right
|
||||
)
|
||||
} else {
|
||||
@Suppress("DEPRECATION")
|
||||
max(windowManager.defaultDisplay.width, windowManager.defaultDisplay.height)
|
||||
}
|
||||
var factor = (maxSize / 46f) / 3f
|
||||
|
|
|
|||
|
|
@ -110,8 +110,8 @@ class LoginActivity: BaseActivity<ActivityLoginBinding, LoginViewModel>() {
|
|||
val alert = AlertDialog.Builder(this).create()
|
||||
alert.setTitle(R.string.login_validation_error_title)
|
||||
alert.setMessage(message)
|
||||
alert.setButton(AlertDialog.BUTTON_NEUTRAL, getString(R.string.ok)) { alert, _ ->
|
||||
alert.dismiss()
|
||||
alert.setButton(AlertDialog.BUTTON_NEUTRAL, getString(R.string.ok)) { thisAlert, _ ->
|
||||
thisAlert.dismiss()
|
||||
}
|
||||
alert.show()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,7 +18,11 @@ import dagger.hilt.android.AndroidEntryPoint
|
|||
@AndroidEntryPoint
|
||||
class MainActivity : BaseActivity<ActivityMainBinding, MainViewModel>() {
|
||||
override val viewModel: MainViewModel by viewModels()
|
||||
private val adapter = HubAdapter()
|
||||
private val adapter = HubAdapter().apply {
|
||||
onRefresh = {
|
||||
viewModel.retrieveFullUserData()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
binding = ActivityMainBinding.inflate(layoutInflater)
|
||||
|
|
|
|||
|
|
@ -59,6 +59,7 @@ class RYAActivity : BaseActivity<ActivityRyaBinding, RYAViewModel>() {
|
|||
taskBinding.root.setOnClickListener {
|
||||
viewModel.tappedTask(task)
|
||||
}
|
||||
holder.onTaskScore = { viewModel.tappedTask(task) }
|
||||
val layoutParams = taskBinding.chip.layoutParams as FrameLayout.LayoutParams
|
||||
layoutParams.marginStart = 0
|
||||
layoutParams.marginEnd = 0
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ class TaskFormActivity : BaseActivity<ActivityTaskFormBinding, TaskFormViewModel
|
|||
binding = ActivityTaskFormBinding.inflate(layoutInflater)
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
binding.editText.setOnEditorActionListener { _, actionId, event ->
|
||||
binding.editText.setOnEditorActionListener { _, actionId, _ ->
|
||||
if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE) {
|
||||
if (binding.editText.text?.isNotEmpty() == true) {
|
||||
binding.editTaskWrapper.isVisible = false
|
||||
|
|
|
|||
|
|
@ -54,13 +54,15 @@ class TaskListActivity : BaseActivity<ActivityTasklistBinding, TaskListViewModel
|
|||
)
|
||||
)
|
||||
onRefresh = {
|
||||
viewModel.retrieveTasks()
|
||||
viewModel.retrieveFullUserData()
|
||||
}
|
||||
}
|
||||
|
||||
viewModel.tasks.observe(this) {
|
||||
adapter.data = it
|
||||
adapter.title = getTitle(it.size)
|
||||
}
|
||||
viewModel.taskCount.observe(this) {
|
||||
adapter.title = getTitle(it)
|
||||
}
|
||||
|
||||
adapter.onTaskScore = {
|
||||
|
|
@ -111,6 +113,8 @@ class TaskListActivity : BaseActivity<ActivityTasklistBinding, TaskListViewModel
|
|||
putExtra("task_id", task.id)
|
||||
})
|
||||
return
|
||||
} else if (task.up != true && task.down != ) {
|
||||
return
|
||||
} else {
|
||||
direction = if (task.up == true) TaskDirection.UP else TaskDirection.DOWN
|
||||
}
|
||||
|
|
@ -152,7 +156,7 @@ class TaskListActivity : BaseActivity<ActivityTasklistBinding, TaskListViewModel
|
|||
}
|
||||
adapter.title = getTitle(null)
|
||||
adapter.onRefresh = {
|
||||
viewModel.retrieveTasks()
|
||||
viewModel.retrieveFullUserData()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -29,6 +29,8 @@ import kotlin.time.toDuration
|
|||
class TaskResultActivity : BaseActivity<ActivityTaskResultBinding, TaskResultViewModel>() {
|
||||
override val viewModel: TaskResultViewModel by viewModels()
|
||||
|
||||
private var secondsToShow = 2
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
binding = ActivityTaskResultBinding.inflate(layoutInflater)
|
||||
super.onCreate(savedInstanceState)
|
||||
|
|
@ -43,7 +45,7 @@ class TaskResultActivity : BaseActivity<ActivityTaskResultBinding, TaskResultVie
|
|||
}
|
||||
|
||||
lifecycleScope.launch {
|
||||
delay(5.toDuration(DurationUnit.SECONDS))
|
||||
delay(secondsToShow.toDuration(DurationUnit.SECONDS))
|
||||
finish()
|
||||
}
|
||||
}
|
||||
|
|
@ -75,7 +77,7 @@ class TaskResultActivity : BaseActivity<ActivityTaskResultBinding, TaskResultVie
|
|||
)
|
||||
chips.add(chip)
|
||||
}
|
||||
if ((viewModel.result?.manaDelta ?: 0.0) > 0.0) {
|
||||
if ((viewModel.result?.manaDelta ?: 0.0) != 0.0) {
|
||||
val chip = TaskRewardChip(this)
|
||||
chip.set(
|
||||
viewModel.result?.manaDelta,
|
||||
|
|
@ -105,6 +107,7 @@ class TaskResultActivity : BaseActivity<ActivityTaskResultBinding, TaskResultVie
|
|||
if (chips.size > 4 && hasDrop || (chips.size > 5 && !hasDrop)) {
|
||||
chips = chips.subList(0, if (hasDrop) 4 else 5)
|
||||
}
|
||||
secondsToShow = chips.size
|
||||
chips.forEach {
|
||||
binding.gridLayout.addView(it)
|
||||
it.size = chipSize
|
||||
|
|
@ -158,7 +161,12 @@ class TaskResultActivity : BaseActivity<ActivityTaskResultBinding, TaskResultVie
|
|||
if (viewModel.result?.drop?.key != null) {
|
||||
val type = viewModel.result?.drop?.type
|
||||
val key = viewModel.result?.drop?.key
|
||||
elements.add(getString(R.string.some_x, type))
|
||||
elements.add(when (type) {
|
||||
"Food" -> getString(R.string.some_food)
|
||||
"Egg" -> getString(R.string.an_egg)
|
||||
"HatchingPotion" -> getString(R.string.a_potion)
|
||||
else -> getString(R.string.some_x, type)
|
||||
})
|
||||
dropBinding.imageView.loadImage("Pet_" + type + "_" + key)
|
||||
}
|
||||
dropBinding.textView.text = when (elements.size) {
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ import com.habitrpg.wearos.habitica.ui.viewHolders.HubViewHolder
|
|||
|
||||
class HubAdapter: RecyclerView.Adapter<RecyclerView.ViewHolder>() {
|
||||
var title: String = ""
|
||||
var onRefresh: (() -> Unit)? = null
|
||||
var data: List<MenuItem> = listOf()
|
||||
set(value) {
|
||||
field = value
|
||||
|
|
@ -30,6 +31,7 @@ class HubAdapter: RecyclerView.Adapter<RecyclerView.ViewHolder>() {
|
|||
holder.bind(getItemAt(position - 1))
|
||||
} else if (holder is HeaderViewHolder){
|
||||
holder.bind(title)
|
||||
holder.itemView.setOnClickListener { onRefresh?.invoke() }
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ package com.habitrpg.wearos.habitica.ui.adapters
|
|||
|
||||
import android.view.ViewGroup
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.habitrpg.android.habitica.databinding.RowHeaderBinding
|
||||
import com.habitrpg.android.habitica.databinding.RowSectionHeaderBinding
|
||||
import com.habitrpg.common.habitica.extensions.layoutInflater
|
||||
import com.habitrpg.wearos.habitica.models.tasks.Task
|
||||
import com.habitrpg.wearos.habitica.ui.viewHolders.HeaderSectionViewHolder
|
||||
|
|
@ -20,7 +20,7 @@ open class TaskListAdapter(): RecyclerView.Adapter<RecyclerView.ViewHolder>() {
|
|||
}
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
|
||||
val inflater = parent.context.layoutInflater
|
||||
return HeaderSectionViewHolder(RowHeaderBinding.inflate(inflater, parent, false).root)
|
||||
return HeaderSectionViewHolder(RowSectionHeaderBinding.inflate(inflater, parent, false).root)
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
package com.habitrpg.wearos.habitica.ui.viewmodels
|
||||
|
||||
import androidx.lifecycle.asLiveData
|
||||
import com.habitrpg.wearos.habitica.data.repositories.TaskRepository
|
||||
import com.habitrpg.wearos.habitica.data.repositories.UserRepository
|
||||
import com.habitrpg.wearos.habitica.managers.LoadingManager
|
||||
import com.habitrpg.wearos.habitica.util.ExceptionHandlerBuilder
|
||||
|
|
@ -10,9 +11,11 @@ import javax.inject.Inject
|
|||
@HiltViewModel
|
||||
class AvatarViewModel @Inject constructor(
|
||||
userRepository: UserRepository,
|
||||
taskRepository: TaskRepository,
|
||||
exceptionBuilder: ExceptionHandlerBuilder, loadingManager: LoadingManager
|
||||
) : BaseViewModel(
|
||||
userRepository,
|
||||
taskRepository,
|
||||
exceptionBuilder, loadingManager
|
||||
) {
|
||||
var user = userRepository.getUser().asLiveData()
|
||||
|
|
|
|||
|
|
@ -2,16 +2,29 @@ package com.habitrpg.wearos.habitica.ui.viewmodels
|
|||
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import com.habitrpg.wearos.habitica.data.repositories.TaskRepository
|
||||
import com.habitrpg.wearos.habitica.data.repositories.UserRepository
|
||||
import com.habitrpg.wearos.habitica.managers.LoadingManager
|
||||
import com.habitrpg.wearos.habitica.models.DisplayedError
|
||||
import com.habitrpg.wearos.habitica.util.ErrorPresenter
|
||||
import com.habitrpg.wearos.habitica.util.ExceptionHandlerBuilder
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
open class BaseViewModel(
|
||||
val userRepository: UserRepository,
|
||||
val taskRepository: TaskRepository,
|
||||
val exceptionBuilder: ExceptionHandlerBuilder,
|
||||
val loadingManager: LoadingManager
|
||||
): ViewModel(), ErrorPresenter {
|
||||
override val errorValues = MutableLiveData<DisplayedError>()
|
||||
|
||||
fun retrieveFullUserData() {
|
||||
viewModelScope.launch(exceptionBuilder.userFacing(this)) {
|
||||
loadingManager.startLoading()
|
||||
val user = userRepository.retrieveUser(true)
|
||||
taskRepository.retrieveTasks(user?.tasksOrder, true)
|
||||
loadingManager.endLoading()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
package com.habitrpg.wearos.habitica.ui.viewmodels
|
||||
|
||||
import com.habitrpg.wearos.habitica.data.repositories.TaskRepository
|
||||
import com.habitrpg.wearos.habitica.data.repositories.UserRepository
|
||||
import com.habitrpg.wearos.habitica.managers.LoadingManager
|
||||
import com.habitrpg.wearos.habitica.util.ExceptionHandlerBuilder
|
||||
|
|
@ -8,8 +9,9 @@ import javax.inject.Inject
|
|||
|
||||
@HiltViewModel
|
||||
class FaintViewModel @Inject constructor(userRepository: UserRepository,
|
||||
taskRepository: TaskRepository,
|
||||
exceptionBuilder: ExceptionHandlerBuilder, loadingManager: LoadingManager
|
||||
) : BaseViewModel(userRepository, exceptionBuilder, loadingManager) {
|
||||
) : BaseViewModel(userRepository, taskRepository, exceptionBuilder, loadingManager) {
|
||||
suspend fun revive() {
|
||||
userRepository.revive()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,9 +17,9 @@ import javax.inject.Inject
|
|||
class HabitDrectionViewModel @Inject constructor(
|
||||
savedStateHandle: SavedStateHandle,
|
||||
userRepository: UserRepository,
|
||||
val taskRepository: TaskRepository,
|
||||
taskRepository: TaskRepository,
|
||||
exceptionBuilder: ExceptionHandlerBuilder, loadingManager: LoadingManager
|
||||
) : BaseViewModel(userRepository, exceptionBuilder, loadingManager) {
|
||||
) : BaseViewModel(userRepository, taskRepository, exceptionBuilder, loadingManager) {
|
||||
val taskID = savedStateHandle.get<String>("task_id")
|
||||
val task = taskRepository.getTask(taskID).asLiveData()
|
||||
|
||||
|
|
|
|||
|
|
@ -15,7 +15,6 @@ import com.google.android.gms.auth.api.signin.GoogleSignInOptions
|
|||
import com.google.android.gms.common.ConnectionResult
|
||||
import com.google.android.gms.common.GoogleApiAvailability
|
||||
import com.google.android.gms.common.GooglePlayServicesUtil
|
||||
import com.google.android.gms.common.Scopes
|
||||
import com.google.android.gms.common.UserRecoverableException
|
||||
import com.google.android.gms.common.api.ApiException
|
||||
import com.google.android.gms.tasks.Task
|
||||
|
|
@ -25,6 +24,7 @@ import com.habitrpg.common.habitica.models.auth.UserAuthResponse
|
|||
import com.habitrpg.common.habitica.models.auth.UserAuthSocial
|
||||
import com.habitrpg.common.habitica.models.auth.UserAuthSocialTokens
|
||||
import com.habitrpg.wearos.habitica.data.ApiClient
|
||||
import com.habitrpg.wearos.habitica.data.repositories.TaskRepository
|
||||
import com.habitrpg.wearos.habitica.data.repositories.UserRepository
|
||||
import com.habitrpg.wearos.habitica.managers.LoadingManager
|
||||
import com.habitrpg.wearos.habitica.util.ExceptionHandlerBuilder
|
||||
|
|
@ -39,11 +39,12 @@ import javax.inject.Inject
|
|||
|
||||
@HiltViewModel
|
||||
class LoginViewModel @Inject constructor(userRepository: UserRepository,
|
||||
taskRepository: TaskRepository,
|
||||
exceptionBuilder: ExceptionHandlerBuilder,
|
||||
val keyHelper: KeyHelper?,
|
||||
val sharedPreferences: SharedPreferences,
|
||||
val apiClient: ApiClient, loadingManager: LoadingManager
|
||||
) : BaseViewModel(userRepository, exceptionBuilder, loadingManager) {
|
||||
) : BaseViewModel(userRepository, taskRepository, exceptionBuilder, loadingManager) {
|
||||
lateinit var onLoginCompleted: () -> Unit
|
||||
|
||||
fun handleGoogleLogin(
|
||||
|
|
@ -62,7 +63,6 @@ class LoginViewModel @Inject constructor(userRepository: UserRepository,
|
|||
task: Task<GoogleSignInAccount>,
|
||||
recoverFromPlayServicesErrorResult: ActivityResultLauncher<Intent>?,
|
||||
) {
|
||||
val scopesString = Scopes.PROFILE + " " + Scopes.EMAIL
|
||||
viewModelScope.launch(exceptionBuilder.userFacing(this)) {
|
||||
val account = async {
|
||||
try {
|
||||
|
|
|
|||
|
|
@ -11,9 +11,9 @@ import javax.inject.Inject
|
|||
@HiltViewModel
|
||||
class MainViewModel @Inject constructor(
|
||||
userRepository: UserRepository,
|
||||
private val taskRepository: TaskRepository,
|
||||
taskRepository: TaskRepository,
|
||||
exceptionBuilder: ExceptionHandlerBuilder, loadingManager: LoadingManager
|
||||
) : BaseViewModel(userRepository, exceptionBuilder, loadingManager) {
|
||||
) : BaseViewModel(userRepository, taskRepository, exceptionBuilder, loadingManager) {
|
||||
val taskCounts = taskRepository.getActiveTaskCounts().asLiveData()
|
||||
val user = userRepository.getUser().asLiveData()
|
||||
}
|
||||
|
|
@ -18,9 +18,9 @@ import javax.inject.Inject
|
|||
@HiltViewModel
|
||||
class RYAViewModel @Inject constructor(
|
||||
userRepository: UserRepository,
|
||||
val taskRepository: TaskRepository,
|
||||
taskRepository: TaskRepository,
|
||||
exceptionBuilder: ExceptionHandlerBuilder, loadingManager: LoadingManager
|
||||
) : BaseViewModel(userRepository, exceptionBuilder, loadingManager) {
|
||||
) : BaseViewModel(userRepository, taskRepository, exceptionBuilder, loadingManager) {
|
||||
val tasks = MutableLiveData<List<Task>>()
|
||||
|
||||
private val tasksToComplete = mutableListOf<Task>()
|
||||
|
|
@ -55,7 +55,8 @@ class RYAViewModel @Inject constructor(
|
|||
taskRepository.scoreTask(null, task, TaskDirection.UP)
|
||||
}
|
||||
userRepository.runCron()
|
||||
userRepository.retrieveUser()
|
||||
val user = userRepository.retrieveUser(true)
|
||||
taskRepository.retrieveTasks(user?.tasksOrder, true)
|
||||
function(true)
|
||||
loadingManager.endLoading()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,12 +14,12 @@ import javax.inject.Inject
|
|||
|
||||
@HiltViewModel
|
||||
class SettingsViewModel @Inject constructor(userRepository: UserRepository,
|
||||
private val taskRepository: TaskRepository,
|
||||
taskRepository: TaskRepository,
|
||||
exceptionBuilder: ExceptionHandlerBuilder,
|
||||
private val apiClient: ApiClient,
|
||||
private val sharedPreferences: SharedPreferences,
|
||||
loadingManager: LoadingManager
|
||||
) : BaseViewModel(userRepository, exceptionBuilder, loadingManager) {
|
||||
) : BaseViewModel(userRepository, taskRepository, exceptionBuilder, loadingManager) {
|
||||
|
||||
fun logout() {
|
||||
sharedPreferences.edit {
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ import com.google.android.gms.wearable.MessageClient
|
|||
import com.google.android.gms.wearable.MessageEvent
|
||||
import com.habitrpg.common.habitica.helpers.KeyHelper
|
||||
import com.habitrpg.wearos.habitica.data.ApiClient
|
||||
import com.habitrpg.wearos.habitica.data.repositories.TaskRepository
|
||||
import com.habitrpg.wearos.habitica.data.repositories.UserRepository
|
||||
import com.habitrpg.wearos.habitica.managers.LoadingManager
|
||||
import com.habitrpg.wearos.habitica.util.ExceptionHandlerBuilder
|
||||
|
|
@ -16,11 +17,12 @@ import javax.inject.Inject
|
|||
|
||||
@HiltViewModel
|
||||
class SplashViewModel @Inject constructor(userRepository: UserRepository,
|
||||
taskRepository: TaskRepository,
|
||||
exceptionBuilder: ExceptionHandlerBuilder,
|
||||
val apiClient: ApiClient,
|
||||
val sharedPreferences: SharedPreferences,
|
||||
val keyHelper: KeyHelper?, loadingManager: LoadingManager
|
||||
) : BaseViewModel(userRepository, exceptionBuilder, loadingManager), MessageClient.OnMessageReceivedListener {
|
||||
) : BaseViewModel(userRepository, taskRepository, exceptionBuilder, loadingManager), MessageClient.OnMessageReceivedListener {
|
||||
lateinit var onLoginCompleted: (Boolean) -> Unit
|
||||
val hasAuthentication: Boolean
|
||||
get() {
|
||||
|
|
@ -34,7 +36,9 @@ class SplashViewModel @Inject constructor(userRepository: UserRepository,
|
|||
}
|
||||
|
||||
private fun authDataReceived(event: MessageEvent) {
|
||||
viewModelScope.launch(exceptionBuilder.silent()) {
|
||||
viewModelScope.launch(exceptionBuilder.silent {
|
||||
onLoginCompleted(false)
|
||||
}) {
|
||||
val (userID, apiKey) = String(event.data).split(":")
|
||||
try {
|
||||
saveTokens(apiKey, userID)
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ package com.habitrpg.wearos.habitica.ui.viewmodels
|
|||
|
||||
import androidx.lifecycle.LiveData
|
||||
import androidx.lifecycle.asLiveData
|
||||
import com.habitrpg.wearos.habitica.data.repositories.TaskRepository
|
||||
import com.habitrpg.wearos.habitica.data.repositories.UserRepository
|
||||
import com.habitrpg.wearos.habitica.managers.LoadingManager
|
||||
import com.habitrpg.wearos.habitica.models.user.User
|
||||
|
|
@ -11,8 +12,9 @@ import javax.inject.Inject
|
|||
|
||||
@HiltViewModel
|
||||
class StatsViewModel @Inject constructor(userRepository: UserRepository,
|
||||
taskRepository: TaskRepository,
|
||||
exceptionBuilder: ExceptionHandlerBuilder, loadingManager: LoadingManager
|
||||
) : BaseViewModel(userRepository, exceptionBuilder, loadingManager) {
|
||||
) : BaseViewModel(userRepository, taskRepository, exceptionBuilder, loadingManager) {
|
||||
|
||||
var user: LiveData<User> = userRepository.getUser().asLiveData()
|
||||
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ class TaskDetailViewModel @Inject constructor(
|
|||
taskRepository: TaskRepository,
|
||||
userRepository: UserRepository,
|
||||
exceptionBuilder: ExceptionHandlerBuilder, loadingManager: LoadingManager
|
||||
) : BaseViewModel(userRepository, exceptionBuilder, loadingManager) {
|
||||
) : BaseViewModel(userRepository, taskRepository, exceptionBuilder, loadingManager) {
|
||||
val taskID = savedStateHandle.get<String>("task_id")
|
||||
val task = taskRepository.getTask(taskID).asLiveData()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,9 +13,9 @@ import javax.inject.Inject
|
|||
@HiltViewModel
|
||||
class TaskFormViewModel @Inject constructor(
|
||||
userRepository: UserRepository,
|
||||
val taskRepository: TaskRepository,
|
||||
taskRepository: TaskRepository,
|
||||
exceptionBuilder: ExceptionHandlerBuilder, loadingManager: LoadingManager
|
||||
) : BaseViewModel(userRepository, exceptionBuilder, loadingManager) {
|
||||
) : BaseViewModel(userRepository, taskRepository, exceptionBuilder, loadingManager) {
|
||||
suspend fun saveTask(text: CharSequence?, taskType: TaskType?) {
|
||||
if (text?.isNotBlank() != true || taskType == null) {
|
||||
return
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
package com.habitrpg.wearos.habitica.ui.viewmodels
|
||||
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.lifecycle.SavedStateHandle
|
||||
import androidx.lifecycle.asLiveData
|
||||
import androidx.lifecycle.viewModelScope
|
||||
|
|
@ -20,21 +21,27 @@ import javax.inject.Inject
|
|||
@HiltViewModel
|
||||
class TaskListViewModel @Inject constructor(
|
||||
savedStateHandle: SavedStateHandle,
|
||||
private val taskRepository: TaskRepository,
|
||||
taskRepository: TaskRepository,
|
||||
userRepository: UserRepository,
|
||||
exceptionBuilder: ExceptionHandlerBuilder, loadingManager: LoadingManager
|
||||
) : BaseViewModel(userRepository, exceptionBuilder, loadingManager) {
|
||||
) : BaseViewModel(userRepository, taskRepository, exceptionBuilder, loadingManager) {
|
||||
val taskType = TaskType.from(savedStateHandle.get<String>("task_type"))
|
||||
val taskCount = MutableLiveData(0)
|
||||
val tasks = taskRepository.getTasks(taskType ?: TaskType.HABIT)
|
||||
.map {
|
||||
if (taskType == TaskType.DAILY || taskType == TaskType.TODO) {
|
||||
val taskList: MutableList<Any> = it.sortedBy { it.completed }.toMutableList()
|
||||
val taskList: MutableList<Any> = it.filter { it.isDue == true || it.type == TaskType.TODO }.sortedBy { it.completed }.toMutableList()
|
||||
val firstCompletedIndex = taskList.indexOfFirst { it is Task && it.completed }
|
||||
if (firstCompletedIndex >= 0) {
|
||||
// since this is the index of the first completed task, this is also the number of incomplete tasks
|
||||
taskCount.value = firstCompletedIndex
|
||||
taskList.add(firstCompletedIndex, "Done today")
|
||||
} else {
|
||||
taskCount.value = taskList.size
|
||||
}
|
||||
taskList
|
||||
} else {
|
||||
taskCount.value = it.size
|
||||
it
|
||||
}
|
||||
}
|
||||
|
|
@ -52,13 +59,4 @@ class TaskListViewModel @Inject constructor(
|
|||
onResult(result)
|
||||
}
|
||||
}
|
||||
|
||||
fun retrieveTasks() {
|
||||
viewModelScope.launch(exceptionBuilder.userFacing(this)) {
|
||||
loadingManager.startLoading()
|
||||
val user = userRepository.retrieveUser(true)
|
||||
taskRepository.retrieveTasks(user?.tasksOrder, true)
|
||||
loadingManager.endLoading()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -2,6 +2,7 @@ package com.habitrpg.wearos.habitica.ui.viewmodels
|
|||
|
||||
import androidx.lifecycle.SavedStateHandle
|
||||
import com.habitrpg.common.habitica.models.responses.TaskScoringResult
|
||||
import com.habitrpg.wearos.habitica.data.repositories.TaskRepository
|
||||
import com.habitrpg.wearos.habitica.data.repositories.UserRepository
|
||||
import com.habitrpg.wearos.habitica.managers.LoadingManager
|
||||
import com.habitrpg.wearos.habitica.util.ExceptionHandlerBuilder
|
||||
|
|
@ -9,12 +10,15 @@ import dagger.hilt.android.lifecycle.HiltViewModel
|
|||
import javax.inject.Inject
|
||||
|
||||
@HiltViewModel
|
||||
class TaskResultViewModel @Inject constructor(savedStateHandle: SavedStateHandle, userRepository: UserRepository,
|
||||
class TaskResultViewModel @Inject constructor(
|
||||
savedStateHandle: SavedStateHandle,
|
||||
taskRepository: TaskRepository,
|
||||
userRepository: UserRepository,
|
||||
exceptionBuilder: ExceptionHandlerBuilder, loadingManager: LoadingManager
|
||||
) : BaseViewModel(userRepository, exceptionBuilder, loadingManager) {
|
||||
) : BaseViewModel(userRepository, taskRepository, exceptionBuilder, loadingManager) {
|
||||
val hasDrop: Boolean
|
||||
get() {
|
||||
return result?.drop?.key?.isNotBlank() == true // || (result?.questItemsFound ?: 0) > 0
|
||||
}
|
||||
get() {
|
||||
return result?.drop?.key?.isNotBlank() == true // || (result?.questItemsFound ?: 0) > 0
|
||||
}
|
||||
val result = savedStateHandle.get<TaskScoringResult>("result")
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,9 +9,10 @@ import javax.inject.Inject
|
|||
|
||||
@ViewModelScoped
|
||||
class ExceptionHandlerBuilder @Inject constructor(val loadingManager: LoadingManager) {
|
||||
fun silent(): CoroutineExceptionHandler {
|
||||
fun silent(handler: ((Throwable) -> Unit)? = null): CoroutineExceptionHandler {
|
||||
return CoroutineExceptionHandler { context, throwable ->
|
||||
Log.e(context.toString(), "Error: ${throwable.cause}", throwable)
|
||||
handler?.invoke(throwable)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@
|
|||
android:text="@string/day_start"
|
||||
android:fontFamily="sans-serif-medium"
|
||||
android:gravity="center"
|
||||
android:layout_marginHorizontal="@dimen/spacing_medium"
|
||||
android:layout_marginHorizontal="12dp"
|
||||
android:layout_marginBottom="10dp"/>
|
||||
<TextView
|
||||
android:id="@+id/description_view"
|
||||
|
|
|
|||
|
|
@ -62,7 +62,7 @@
|
|||
android:orientation="vertical">
|
||||
<include
|
||||
android:id="@+id/header"
|
||||
layout="@layout/row_header" />
|
||||
layout="@layout/row_section_header" />
|
||||
<EditText
|
||||
android:id="@+id/edit_text"
|
||||
android:layout_width="match_parent"
|
||||
|
|
@ -80,7 +80,7 @@
|
|||
android:gravity="center"
|
||||
android:layout_marginTop="20dp"
|
||||
android:layout_marginBottom="12dp"
|
||||
android:textSize="14sp"
|
||||
style="@style/Text.Body1"
|
||||
android:textColor="@color/watch_purple_200"
|
||||
android:text="@string/task_type" />
|
||||
<LinearLayout
|
||||
|
|
@ -95,6 +95,9 @@
|
|||
style="@style/Chip.NoPadding"
|
||||
android:gravity="start|center_vertical"
|
||||
android:paddingHorizontal="20dp"
|
||||
android:textColor="@color/white"
|
||||
android:fontFamily="sans-serif-medium"
|
||||
android:textSize="14sp"
|
||||
android:text="@string/todo" />
|
||||
<TextView
|
||||
android:id="@+id/daily_button"
|
||||
|
|
@ -103,6 +106,9 @@
|
|||
style="@style/Chip.NoPadding"
|
||||
android:gravity="start|center_vertical"
|
||||
android:paddingHorizontal="20dp"
|
||||
android:textColor="@color/white"
|
||||
android:fontFamily="sans-serif-medium"
|
||||
android:textSize="14sp"
|
||||
android:text="@string/daily" />
|
||||
<TextView
|
||||
android:id="@+id/habit_button"
|
||||
|
|
@ -111,6 +117,9 @@
|
|||
style="@style/Chip.NoPadding"
|
||||
android:gravity="start|center_vertical"
|
||||
android:paddingHorizontal="20dp"
|
||||
android:textColor="@color/white"
|
||||
android:fontFamily="sans-serif-medium"
|
||||
android:textSize="14sp"
|
||||
android:text="@string/habit" />
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
<LinearLayout
|
||||
android:id="@+id/chip"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_height="52dp"
|
||||
style="@style/Chip">
|
||||
<FrameLayout
|
||||
android:id="@+id/checkbox_wrapper"
|
||||
|
|
|
|||
|
|
@ -2,11 +2,10 @@
|
|||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
android:layout_height="wrap_content">
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_height="52dp"
|
||||
style="@style/Chip">
|
||||
<FrameLayout
|
||||
android:id="@+id/habit_button"
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
android:layout_height="wrap_content">
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_height="52dp"
|
||||
style="@style/Chip">
|
||||
<com.habitrpg.wearos.habitica.ui.views.TaskTextView
|
||||
android:id="@+id/title"
|
||||
|
|
|
|||
|
|
@ -12,5 +12,5 @@
|
|||
android:layout_gravity="center"
|
||||
android:textColor="@color/watch_purple_200"
|
||||
tools:text="Header Text"
|
||||
style="@style/Text.Body1" />
|
||||
style="@style/Text.Body1"/>
|
||||
</FrameLayout>
|
||||
|
|
@ -2,13 +2,11 @@
|
|||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
android:layout_height="wrap_content">
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_height="52dp"
|
||||
style="@style/Chip">
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/checkbox_wrapper"
|
||||
android:layout_width="34dp"
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@
|
|||
<dimen name="inner_frame_layout_padding">5dp</dimen>
|
||||
<dimen name="row_text_size">16sp</dimen>
|
||||
<dimen name="row_padding_horizontal">10dp</dimen>
|
||||
<dimen name="row_padding_vertical">9dp</dimen>
|
||||
<dimen name="row_padding_vertical">6dp</dimen>
|
||||
<dimen name="row_side_spacing">10dp</dimen>
|
||||
<dimen name="row_spacing">2dp</dimen>
|
||||
</resources>
|
||||
|
|
@ -25,11 +25,14 @@
|
|||
<string name="start_new_day">Start new day</string>
|
||||
<string name="check_off_yesterday">Check off any you did yesterday:</string>
|
||||
<string name="task_type">Task Type</string>
|
||||
<string name="task_title_hint">Task title...</string>
|
||||
<string name="task_title_hint">Task title…</string>
|
||||
<string name="save">Save</string>
|
||||
<string name="sync_data">Sync Data</string>
|
||||
<string name="hide_task_rewards">Hide task rewards</string>
|
||||
<string name="version_info">Version %1$s (%2$d)</string>
|
||||
<string name="log_out_of_habitica">Log out of Habitica?</string>
|
||||
<string name="no_tasks">Create a %s to add to this list</string>
|
||||
<string name="an_egg">an Egg</string>
|
||||
<string name="a_potion">a Potion</string>
|
||||
<string name="some_food">Some Food</string>
|
||||
</resources>
|
||||
|
|
@ -14,7 +14,7 @@
|
|||
<item name="android:foreground">@drawable/touch_feedback</item>
|
||||
</style>
|
||||
|
||||
<style name="Chip.NoPadding">
|
||||
<style name="Chip.NoPadding" parent="Chip">
|
||||
<item name="android:layout_marginHorizontal">0dp</item>
|
||||
</style>
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue