diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/CharacterSheetScreen.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/CharacterSheetScreen.kt index 353cf66..ff67c9d 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/CharacterSheetScreen.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/CharacterSheetScreen.kt @@ -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() }, diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/CharacterSheetViewModel.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/CharacterSheetViewModel.kt index 18ece32..13a8e00 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/CharacterSheetViewModel.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/CharacterSheetViewModel.kt @@ -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()) { diff --git a/app/src/main/java/com/pixelized/rplexicon/utilitary/Update.kt b/app/src/main/java/com/pixelized/rplexicon/utilitary/Update.kt index d9f7501..f00fa22 100644 --- a/app/src/main/java/com/pixelized/rplexicon/utilitary/Update.kt +++ b/app/src/main/java/com/pixelized/rplexicon/utilitary/Update.kt @@ -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)