Add description update feature, reduce update frequence.

This commit is contained in:
Thomas Andres Gomez 2023-10-10 11:16:59 +02:00
parent c95360d9f1
commit 4ac1dedfb3
3 changed files with 40 additions and 4 deletions

View file

@ -5,6 +5,9 @@ package com.pixelized.rplexicon.ui.screens.character
import android.content.res.Configuration
import androidx.activity.compose.BackHandler
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.clickable
import androidx.compose.foundation.combinedClickable
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.BoxScope
import androidx.compose.foundation.layout.Column
@ -26,6 +29,7 @@ import androidx.compose.material.pullrefresh.PullRefreshState
import androidx.compose.material.pullrefresh.pullRefresh
import androidx.compose.material.pullrefresh.rememberPullRefreshState
import androidx.compose.material.rememberModalBottomSheetState
import androidx.compose.material.ripple.rememberRipple
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
@ -33,14 +37,17 @@ import androidx.compose.material3.Scaffold
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.material3.minimumInteractiveComponentSize
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.shadow
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.semantics.Role
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
@ -113,6 +120,9 @@ fun CharacterSheetScreen(
onRefresh = {
scope.launch { viewModel.update(force = true) }
},
onFullRefresh = {
scope.launch { viewModel.update(force = true, full = true) }
},
onBack = {
screen.popBackStack()
},
@ -192,6 +202,7 @@ private fun CharacterSheetContent(
sheetState: ModalBottomSheetState,
refreshState: PullRefreshState,
onRefresh: () -> Unit,
onFullRefresh: () -> Unit,
name: String,
onBack: () -> Unit,
loader: @Composable BoxScope.() -> Unit,
@ -217,7 +228,18 @@ private fun CharacterSheetContent(
}
},
actions = {
IconButton(onClick = onRefresh) {
Box(
modifier = Modifier
.minimumInteractiveComponentSize()
.combinedClickable(
onClick = onRefresh,
onLongClick = onFullRefresh,
role = Role.Button,
interactionSource = remember { MutableInteractionSource() },
indication = rememberRipple(bounded = false)
),
contentAlignment = Alignment.Center
) {
Icon(
imageVector = Icons.Default.Refresh,
contentDescription = null,
@ -299,6 +321,7 @@ private fun CharacterScreenPreview(
name = "Brulkhai",
onBack = { },
onRefresh = { },
onFullRefresh = { },
loader = { },
proficiencies = { ProficiencyPreview() },
actions = { ActionPagePreview() },

View file

@ -10,6 +10,7 @@ import com.pixelized.rplexicon.repository.authentication.FirebaseRepository
import com.pixelized.rplexicon.repository.data.ActionRepository
import com.pixelized.rplexicon.repository.data.AlterationRepository
import com.pixelized.rplexicon.repository.data.CharacterSheetRepository
import com.pixelized.rplexicon.repository.data.DescriptionRepository
import com.pixelized.rplexicon.repository.data.SkillRepository
import com.pixelized.rplexicon.repository.data.SpellRepository
import com.pixelized.rplexicon.ui.composable.error.FetchErrorUio
@ -26,6 +27,7 @@ import javax.inject.Inject
@HiltViewModel
class CharacterSheetViewModel @Inject constructor(
private val characterRepository: CharacterSheetRepository,
private val descriptionRepository: DescriptionRepository,
private val alterationRepository: AlterationRepository,
private val actionRepository: ActionRepository,
private val spellRepository: SpellRepository,
@ -54,7 +56,7 @@ class CharacterSheetViewModel @Inject constructor(
}
}
suspend fun update(force: Boolean) = coroutineScope {
suspend fun update(force: Boolean, full: Boolean = false) = coroutineScope {
_isLoading.value = true
val characters = async {
try {
@ -67,7 +69,18 @@ class CharacterSheetViewModel @Inject constructor(
Log.e(TAG, exception.message, exception)
}
}
awaitAll(characters)
val description = async {
try {
if (full && (force || characterRepository.lastSuccessFullUpdate.shouldUpdate())) {
descriptionRepository.fetchDescription()
} else {
Unit
}
} catch (exception: Exception) {
Log.e(TAG, exception.message, exception)
}
}
awaitAll(characters, description)
val alterations = async {
try {
if (force || alterationRepository.lastSuccessFullUpdate.shouldUpdate()) {

View file

@ -9,7 +9,7 @@ value class Update(private val value: Long) {
}
companion object {
private const val DELTA = 5 * 60 * 1000
private const val DELTA = 24 * 60 * 60 * 1000 // 1 jour
val INITIAL = Update(0)