Improve user loading and RYA handling

This commit is contained in:
Phillip Thelen 2022-07-19 17:41:58 +02:00
parent 5e51bc2754
commit 9805fe3ecc
8 changed files with 45 additions and 12 deletions

View file

@ -1,2 +1,2 @@
NAME=4.0
CODE=4230
CODE=4240

View file

@ -12,9 +12,9 @@ import com.habitrpg.wearos.habitica.data.repositories.TaskRepository
import com.habitrpg.wearos.habitica.data.repositories.UserRepository
import com.habitrpg.wearos.habitica.ui.activities.BaseActivity
import com.habitrpg.wearos.habitica.ui.activities.FaintActivity
import com.habitrpg.wearos.habitica.ui.activities.MainActivity
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
@ -35,24 +35,17 @@ class MainApplication : Application() {
MainScope().launch {
userRepository.getUser().onEach {
if (it.isDead && BaseActivity.currentActivityClassName != FaintActivity::class.java.name) {
if (it.isDead && BaseActivity.currentActivityClassName == MainActivity::class.java.name) {
val intent = Intent(this@MainApplication, FaintActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)
} else if (it.needsCron && BaseActivity.currentActivityClassName != RYAActivity::class.java.name) {
} else if (it.needsCron && BaseActivity.currentActivityClassName == MainActivity::class.java.name) {
val intent = Intent(this@MainApplication, RYAActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)
}
}.collect()
}
if (userRepository.hasAuthentication) {
MainScope().launch(CoroutineExceptionHandler { _, _ ->
}) {
val user = userRepository.retrieveUser(true)
taskRepository.retrieveTasks(user?.tasksOrder, true)
}
}
logLaunch()
}

View file

@ -109,7 +109,7 @@ class TaskLocalRepository @Inject constructor() {
fun clearData() {
tasks.values.forEach {
it.value = null
it.value = emptyList()
}
taskCountHelperValue.value = 0
}

View file

@ -131,6 +131,11 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainViewModel>() {
}
}
override fun onResume() {
super.onResume()
viewModel.periodicUserRefresh()
}
private val openTaskForm = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
val taskType = result.data?.getStringExtra("task_type")?.let { TaskType.from(it) }

View file

@ -1,5 +1,6 @@
package com.habitrpg.wearos.habitica.ui.activities
import android.content.Intent
import android.os.Bundle
import android.widget.LinearLayout
import androidx.activity.viewModels
@ -52,6 +53,17 @@ class RYAActivity : BaseActivity<ActivityRyaBinding, RYAViewModel>() {
}
}
override fun onDestroy() {
if (!viewModel.hasRunCron) {
startActivity(
Intent(this, RYAActivity::class.java)
.apply {
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK)
})
}
super.onDestroy()
}
lateinit var startTime: Date
private fun runCron() {

View file

@ -9,7 +9,11 @@ import com.habitrpg.android.habitica.databinding.ActivitySplashBinding
import com.habitrpg.wearos.habitica.ui.viewmodels.SplashViewModel
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch
import kotlin.time.DurationUnit
import kotlin.time.toDuration
@AndroidEntryPoint
class SplashActivity: BaseActivity<ActivitySplashBinding, SplashViewModel>() {
@ -74,6 +78,11 @@ class SplashActivity: BaseActivity<ActivitySplashBinding, SplashViewModel>() {
stopAnimatingProgress()
}
binding.textView.isVisible = show
delay(90.toDuration(DurationUnit.SECONDS))
if (isActive) {
// the sync attempt has timed out
startLoginActivity()
}
}
}
}

View file

@ -6,7 +6,10 @@ import com.habitrpg.wearos.habitica.data.repositories.UserRepository
import com.habitrpg.wearos.habitica.managers.AppStateManager
import com.habitrpg.wearos.habitica.util.ExceptionHandlerBuilder
import dagger.hilt.android.lifecycle.HiltViewModel
import java.util.Date
import javax.inject.Inject
import kotlin.time.DurationUnit
import kotlin.time.toDuration
@HiltViewModel
class MainViewModel @Inject constructor(
@ -14,6 +17,15 @@ class MainViewModel @Inject constructor(
taskRepository: TaskRepository,
exceptionBuilder: ExceptionHandlerBuilder, appStateManager: AppStateManager
) : BaseViewModel(userRepository, taskRepository, exceptionBuilder, appStateManager) {
private var lastUserFetch = 0L
fun periodicUserRefresh() {
val now = Date().time
if ((now - lastUserFetch) > 5.toDuration(DurationUnit.MINUTES).inWholeMilliseconds) {
retrieveFullUserData()
lastUserFetch = now
}
}
val taskCounts = taskRepository.getActiveTaskCounts().asLiveData()
val user = userRepository.getUser().asLiveData()
}

View file

@ -21,6 +21,7 @@ class RYAViewModel @Inject constructor(
taskRepository: TaskRepository,
exceptionBuilder: ExceptionHandlerBuilder, appStateManager: AppStateManager
) : BaseViewModel(userRepository, taskRepository, exceptionBuilder, appStateManager) {
var hasRunCron: Boolean = false
val tasks = MutableLiveData<List<Task>>()
private val tasksToComplete = mutableListOf<Task>()
@ -55,6 +56,7 @@ class RYAViewModel @Inject constructor(
taskRepository.scoreTask(null, task, TaskDirection.UP)
}
userRepository.runCron()
hasRunCron = true
val user = userRepository.retrieveUser(true)
taskRepository.retrieveTasks(user?.tasksOrder, true)
function(true)