From a6124cbe79d73d16de8f387fe106e4526c583388 Mon Sep 17 00:00:00 2001 From: "Andres Gomez, Thomas (ITDV RL)" Date: Mon, 10 Jun 2024 09:23:48 +0200 Subject: [PATCH] Add a settings screen. --- app/build.gradle.kts | 3 + .../com/pixelized/rplexicon/MainActivity.kt | 42 ++--- .../com/pixelized/rplexicon/ThemeViewModel.kt | 52 ++++++ .../rplexicon/data/model/LexiconConfig.kt | 1 + .../firebase/RemoteConfigRepository.kt | 4 + .../preferences/PreferencesRepository.kt | 47 ++++++ .../edit/HandleHitPointEditDialog.kt | 1 + .../ui/composable/images/BackgroundImage.kt | 6 +- .../ui/composable/rememberAnimatedShadow.kt | 22 +++ .../rplexicon/ui/navigation/ScreenNavHost.kt | 4 +- .../navigation/screens/ComposableSettings.kt | 28 ++++ .../authentication/AuthenticationScreen.kt | 10 +- .../authentication/AuthenticationViewModel.kt | 14 +- .../screens/character/CharacterSheetScreen.kt | 1 - .../ui/screens/landing/LandingItem.kt | 1 + .../ui/screens/landing/LandingScreen.kt | 63 +++++++- .../ui/screens/landing/LandingViewModel.kt | 26 +++ .../rplexicon/ui/screens/rolls/RollOverlay.kt | 6 + .../ui/screens/rolls/composable/ThrowsCard.kt | 11 +- .../ui/screens/settings/SettingsScreen.kt | 150 ++++++++++++++++++ .../settings/composable/ButtonPreference.kt | 84 ++++++++++ .../settings/composable/SwitchPreference.kt | 81 ++++++++++ .../com/pixelized/rplexicon/ui/theme/Theme.kt | 51 +++--- .../extentions/modifier/ModifierEx.kt | 7 +- .../icbg_item_foundry_misc_gear_a.png | Bin 0 -> 45801 bytes .../icbg_portrait_of_a_tiefling_unfaded.png | Bin 0 -> 33868 bytes app/src/main/res/values-fr/strings.xml | 8 + app/src/main/res/values/strings.xml | 8 + 28 files changed, 668 insertions(+), 63 deletions(-) create mode 100644 app/src/main/java/com/pixelized/rplexicon/ThemeViewModel.kt create mode 100644 app/src/main/java/com/pixelized/rplexicon/data/repository/preferences/PreferencesRepository.kt create mode 100644 app/src/main/java/com/pixelized/rplexicon/ui/navigation/screens/ComposableSettings.kt create mode 100644 app/src/main/java/com/pixelized/rplexicon/ui/screens/settings/SettingsScreen.kt create mode 100644 app/src/main/java/com/pixelized/rplexicon/ui/screens/settings/composable/ButtonPreference.kt create mode 100644 app/src/main/java/com/pixelized/rplexicon/ui/screens/settings/composable/SwitchPreference.kt create mode 100644 app/src/main/res/drawable/icbg_item_foundry_misc_gear_a.png create mode 100644 app/src/main/res/drawable/icbg_portrait_of_a_tiefling_unfaded.png diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 7ef7610..1bc83ce 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -161,6 +161,9 @@ dependencies { implementation("androidx.room:room-ktx:2.6.1") ksp("androidx.room:room-compiler:2.6.1") + // DataStore + implementation("androidx.datastore:datastore-preferences:1.1.1") + // Image implementation("io.coil-kt:coil-compose:2.6.0") } diff --git a/app/src/main/java/com/pixelized/rplexicon/MainActivity.kt b/app/src/main/java/com/pixelized/rplexicon/MainActivity.kt index b2a26e8..4b4883b 100644 --- a/app/src/main/java/com/pixelized/rplexicon/MainActivity.kt +++ b/app/src/main/java/com/pixelized/rplexicon/MainActivity.kt @@ -6,7 +6,6 @@ import androidx.activity.ComponentActivity import androidx.activity.compose.BackHandler import androidx.activity.compose.setContent import androidx.activity.viewModels -import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.navigationBarsPadding @@ -57,6 +56,7 @@ val LocalRollOverlay = compositionLocalOf { @AndroidEntryPoint class MainActivity : ComponentActivity() { + private val themeViewModel: ThemeViewModel by viewModels() private val launcherViewModel: LauncherViewModel by viewModels() private val rollViewModel: RollOverlayViewModel by viewModels() @@ -72,16 +72,18 @@ class MainActivity : ComponentActivity() { } setContent { - LexiconTheme { - val snack = remember { SnackbarHostState() } - val overlay = rememberBlurredRollOverlayHostState( - viewModel = rollViewModel, - ) + val snack = remember { SnackbarHostState() } + val overlay = rememberBlurredRollOverlayHostState( + viewModel = rollViewModel, + ) - CompositionLocalProvider( - LocalActivity provides this, - LocalSnack provides snack, - LocalRollOverlay provides overlay, + CompositionLocalProvider( + LocalActivity provides this, + LocalSnack provides snack, + LocalRollOverlay provides overlay, + ) { + LexiconTheme( + isDarkTheme = themeViewModel.useDarkTheme.value ) { Scaffold( contentWindowInsets = NO_WINDOW_INSETS, @@ -106,7 +108,7 @@ class MainActivity : ComponentActivity() { } }, snackbarHost = { - val isDarkTheme = isSystemInDarkTheme() + val isDarkTheme = themeViewModel.useDarkTheme.value val elevation = remember { derivedStateOf { if (isDarkTheme) 2.dp else 0.dp } } @@ -145,15 +147,17 @@ class MainActivity : ComponentActivity() { } } ) - BackHandler(enabled = overlay.isOverlayVisible) { - overlay.hideOverlay() - } - } - HandleFetchError( - snack = snack, - errors = launcherViewModel.error, - ) + BackHandler( + enabled = overlay.isOverlayVisible, + onBack = { overlay.hideOverlay() }, + ) + + HandleFetchError( + snack = snack, + errors = launcherViewModel.error, + ) + } } } } diff --git a/app/src/main/java/com/pixelized/rplexicon/ThemeViewModel.kt b/app/src/main/java/com/pixelized/rplexicon/ThemeViewModel.kt new file mode 100644 index 0000000..8d0c834 --- /dev/null +++ b/app/src/main/java/com/pixelized/rplexicon/ThemeViewModel.kt @@ -0,0 +1,52 @@ +package com.pixelized.rplexicon + +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Stable +import androidx.compose.runtime.State +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.platform.LocalView +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.ViewModel +import com.pixelized.rplexicon.data.repository.preferences.PreferencesRepository +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject + +@HiltViewModel +class ThemeViewModel @Inject constructor( + private val preferencesRepository: PreferencesRepository, +) : ViewModel() { + + val useDarkTheme: State + @Composable + @Stable + get() { + val systemDarkTheme = isSystemInDarkTheme() + val useDarkTheme = preferencesRepository.useDarkThemeFlow.collectAsState( + initial = preferencesRepository.useDarkThemeFlow.value ?: systemDarkTheme + ) + return remember { + derivedStateOf { + useDarkTheme.value ?: systemDarkTheme + } + } + } + + suspend fun updateDarkThemeUsage(useDarkTheme: Boolean) { + preferencesRepository.updateUseDarkTheme(useDarkTheme = useDarkTheme) + } +} + +@Composable +@Stable +fun isInDarkTheme(): Boolean { + val view = LocalView.current + return if (view.isInEditMode) { + isSystemInDarkTheme() + } else { + val themeViewModel: ThemeViewModel = hiltViewModel() + themeViewModel.useDarkTheme.value + } +} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/data/model/LexiconConfig.kt b/app/src/main/java/com/pixelized/rplexicon/data/model/LexiconConfig.kt index 314d00b..6bb2902 100644 --- a/app/src/main/java/com/pixelized/rplexicon/data/model/LexiconConfig.kt +++ b/app/src/main/java/com/pixelized/rplexicon/data/model/LexiconConfig.kt @@ -7,4 +7,5 @@ data class LexiconConfig( val featureQuests: Boolean, val featureSummary: Boolean, val featureSearch: Boolean, + val featureOther: Boolean, ) \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/data/repository/firebase/RemoteConfigRepository.kt b/app/src/main/java/com/pixelized/rplexicon/data/repository/firebase/RemoteConfigRepository.kt index ecd905d..ddb9f55 100644 --- a/app/src/main/java/com/pixelized/rplexicon/data/repository/firebase/RemoteConfigRepository.kt +++ b/app/src/main/java/com/pixelized/rplexicon/data/repository/firebase/RemoteConfigRepository.kt @@ -24,6 +24,7 @@ class RemoteConfigRepository @Inject constructor() { featureQuests = DEFAULT[FEATURE_QUESTS] as Boolean, featureSummary = DEFAULT[FEATURE_SUMMARY] as Boolean, featureSearch = DEFAULT[FEATURE_SEARCH] as Boolean, + featureOther = DEFAULT[FEATURE_OTHER] as Boolean, ) ) val config: StateFlow get() = _config @@ -54,6 +55,7 @@ class RemoteConfigRepository @Inject constructor() { featureQuests = firebase.getBoolean(FEATURE_QUESTS), featureSummary = firebase.getBoolean(FEATURE_SUMMARY), featureSearch = firebase.getBoolean(FEATURE_SEARCH), + featureOther = firebase.getBoolean(FEATURE_OTHER), ) _config.value = config } @@ -70,6 +72,7 @@ class RemoteConfigRepository @Inject constructor() { private const val FEATURE_QUESTS = "feature_quests" private const val FEATURE_SUMMARY = "feature_summary" private const val FEATURE_SEARCH = "feature_search" + private const val FEATURE_OTHER = "feature_other" private val DEFAULT: HashMap = hashMapOf( FEATURE_ADVENTURE to false, @@ -78,6 +81,7 @@ class RemoteConfigRepository @Inject constructor() { FEATURE_QUESTS to false, FEATURE_SUMMARY to false, FEATURE_SEARCH to false, + FEATURE_OTHER to false, ) } } \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/data/repository/preferences/PreferencesRepository.kt b/app/src/main/java/com/pixelized/rplexicon/data/repository/preferences/PreferencesRepository.kt new file mode 100644 index 0000000..4cb8962 --- /dev/null +++ b/app/src/main/java/com/pixelized/rplexicon/data/repository/preferences/PreferencesRepository.kt @@ -0,0 +1,47 @@ +package com.pixelized.rplexicon.data.repository.preferences + +import android.content.Context +import androidx.datastore.preferences.core.booleanPreferencesKey +import androidx.datastore.preferences.core.edit +import androidx.datastore.preferences.core.emptyPreferences +import androidx.datastore.preferences.preferencesDataStore +import dagger.hilt.android.qualifiers.ApplicationContext +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.stateIn +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class PreferencesRepository @Inject constructor( + @ApplicationContext context: Context +) { + private val Context.dataStore by preferencesDataStore(name = "user_preferences") + private val dataStore = context.dataStore + + val useDarkThemeFlow: StateFlow = dataStore.data + .catch { + emit(emptyPreferences()) + }.map { preferences -> + preferences[PreferencesKeys.USE_DARK_THEME] + }.stateIn( + scope = CoroutineScope(Dispatchers.Default + Job()), + started = SharingStarted.Eagerly, + initialValue = false, + ) + + suspend fun updateUseDarkTheme(useDarkTheme: Boolean) { + dataStore.edit { preferences -> + preferences[PreferencesKeys.USE_DARK_THEME] = useDarkTheme + } + } + + object PreferencesKeys { + val USE_DARK_THEME = booleanPreferencesKey("use_dark_theme") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/composable/edit/HandleHitPointEditDialog.kt b/app/src/main/java/com/pixelized/rplexicon/ui/composable/edit/HandleHitPointEditDialog.kt index 87a40ec..51d952f 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/composable/edit/HandleHitPointEditDialog.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/composable/edit/HandleHitPointEditDialog.kt @@ -4,6 +4,7 @@ import android.content.res.Configuration.UI_MODE_NIGHT_NO import android.content.res.Configuration.UI_MODE_NIGHT_YES import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background +import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/composable/images/BackgroundImage.kt b/app/src/main/java/com/pixelized/rplexicon/ui/composable/images/BackgroundImage.kt index c9a05c2..b81c802 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/composable/images/BackgroundImage.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/composable/images/BackgroundImage.kt @@ -74,7 +74,7 @@ fun BackgroundImage( fun rememberSaturationFilter( saturation: Float = 0f, ): ColorFilter { - return remember { + return remember(saturation) { ColorFilter.colorMatrix( ColorMatrix().also { it.setToSaturation(saturation) } ) @@ -86,7 +86,7 @@ fun rememberBackgroundGradient( vararg gradients: Float, ): Brush { val colorScheme = MaterialTheme.colorScheme - return remember { + return remember(colorScheme) { Brush.verticalGradient( colors = gradients.map { colorScheme.surface.copy(alpha = it) } ) @@ -99,7 +99,7 @@ fun rememberBackgroundGradient( to: Float = 1.0f, ): Brush { val colorScheme = MaterialTheme.colorScheme - return remember { + return remember(colorScheme) { Brush.verticalGradient( colors = listOf( colorScheme.surface.copy(alpha = from), diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/composable/rememberAnimatedShadow.kt b/app/src/main/java/com/pixelized/rplexicon/ui/composable/rememberAnimatedShadow.kt index 0689e32..0ff30b4 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/composable/rememberAnimatedShadow.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/composable/rememberAnimatedShadow.kt @@ -1,6 +1,7 @@ package com.pixelized.rplexicon.ui.composable import androidx.compose.animation.core.animateDpAsState +import androidx.compose.foundation.ScrollState import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.grid.LazyGridState import androidx.compose.runtime.Composable @@ -50,4 +51,25 @@ fun rememberAnimatedShadow( targetValue = shadowTarget.value, label = "animated shadow", ) +} + +@Composable +fun rememberAnimatedShadow( + scrollState: ScrollState, + rest: Dp = 0.dp, + target: Dp = 4.dp, +): State { + val shadowTarget = remember(scrollState) { + derivedStateOf { + if (scrollState.value > 0) { + target + } else { + rest + } + } + } + return animateDpAsState( + targetValue = shadowTarget.value, + label = "animated shadow", + ) } \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/navigation/ScreenNavHost.kt b/app/src/main/java/com/pixelized/rplexicon/ui/navigation/ScreenNavHost.kt index 1dfc751..7466a63 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/navigation/ScreenNavHost.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/navigation/ScreenNavHost.kt @@ -10,9 +10,9 @@ import androidx.navigation.NavOptionsBuilder import androidx.navigation.compose.NavHost import androidx.navigation.compose.rememberNavController import com.pixelized.rplexicon.ui.navigation.screens.AUTHENTICATION_ROUTE -import com.pixelized.rplexicon.ui.navigation.screens.composableAdventureDetail import com.pixelized.rplexicon.ui.navigation.screens.composableAdventureBooks import com.pixelized.rplexicon.ui.navigation.screens.composableAdventureChapters +import com.pixelized.rplexicon.ui.navigation.screens.composableAdventureDetail import com.pixelized.rplexicon.ui.navigation.screens.composableAuthentication import com.pixelized.rplexicon.ui.navigation.screens.composableCharacterSheet import com.pixelized.rplexicon.ui.navigation.screens.composableLanding @@ -23,6 +23,7 @@ import com.pixelized.rplexicon.ui.navigation.screens.composableLocations import com.pixelized.rplexicon.ui.navigation.screens.composableQuestDetail import com.pixelized.rplexicon.ui.navigation.screens.composableQuests import com.pixelized.rplexicon.ui.navigation.screens.composableSearch +import com.pixelized.rplexicon.ui.navigation.screens.composableSettings import com.pixelized.rplexicon.ui.navigation.screens.composableSpellDetail import com.pixelized.rplexicon.ui.navigation.screens.composableSummary import com.pixelized.rplexicon.ui.navigation.screens.navigateToLanding @@ -66,6 +67,7 @@ fun ScreenNavHost( composableAdventureBooks() composableAdventureChapters() composableAdventureDetail() + composableSettings() } } } diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/navigation/screens/ComposableSettings.kt b/app/src/main/java/com/pixelized/rplexicon/ui/navigation/screens/ComposableSettings.kt new file mode 100644 index 0000000..ddac6fd --- /dev/null +++ b/app/src/main/java/com/pixelized/rplexicon/ui/navigation/screens/ComposableSettings.kt @@ -0,0 +1,28 @@ +package com.pixelized.rplexicon.ui.navigation.screens + +import androidx.navigation.NavGraphBuilder +import androidx.navigation.NavHostController +import androidx.navigation.NavOptionsBuilder +import com.pixelized.rplexicon.ui.navigation.NavigationAnimation +import com.pixelized.rplexicon.ui.navigation.animatedComposable +import com.pixelized.rplexicon.ui.screens.settings.SettingsScreen + +private val ROUTE = "settings" + +val SETTINGS_ROUTE = ROUTE + +fun NavGraphBuilder.composableSettings() { + animatedComposable( + route = SETTINGS_ROUTE, + animation = NavigationAnimation.Push, + ) { + SettingsScreen() + } +} + +fun NavHostController.navigateToSettings( + option: NavOptionsBuilder.() -> Unit = {}, +) { + val route = ROUTE + navigate(route = route, builder = option) +} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/authentication/AuthenticationScreen.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/authentication/AuthenticationScreen.kt index 968b454..8ebb5e7 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/authentication/AuthenticationScreen.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/authentication/AuthenticationScreen.kt @@ -32,6 +32,7 @@ import androidx.compose.runtime.Stable import androidx.compose.runtime.State import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -52,7 +53,6 @@ import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import androidx.credentials.exceptions.GetCredentialCancellationException -import androidx.credentials.exceptions.GetCredentialProviderConfigurationException import androidx.hilt.navigation.compose.hiltViewModel import com.pixelized.rplexicon.LocalActivity import com.pixelized.rplexicon.LocalSnack @@ -61,6 +61,7 @@ import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.ui.theme.colors.GoogleColorPalette import com.pixelized.rplexicon.utilitary.sensor.Gyroscope import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch import kotlin.math.E import kotlin.math.max import kotlin.math.min @@ -90,6 +91,7 @@ fun AuthenticationScreen( val context = LocalContext.current val snack = LocalSnack.current val activity = LocalActivity.current + val scope = rememberCoroutineScope() Surface { PartyBackground() @@ -101,7 +103,9 @@ fun AuthenticationScreen( .padding(all = 16.dp), version = versionVM.version, onGoogleSignIn = { - authenticationVM.signIn(activity = activity) + scope.launch { + authenticationVM.signIn(activity = activity) + } }, ) @@ -344,7 +348,7 @@ private fun animatedWeight( @Composable private fun rememberBackgroundGradient(): Brush { val colorScheme = MaterialTheme.colorScheme - return remember { + return remember(colorScheme) { Brush.verticalGradient( colors = listOf( colorScheme.surface.copy(alpha = 0.25f), diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/authentication/AuthenticationViewModel.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/authentication/AuthenticationViewModel.kt index 235fa8b..0b8b500 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/authentication/AuthenticationViewModel.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/authentication/AuthenticationViewModel.kt @@ -36,8 +36,8 @@ class AuthenticationViewModel @Inject constructor( AuthenticationStateUio.Initial ) - fun signIn(activity: Activity) { - viewModelScope.launch(Dispatchers.IO) { + suspend fun signIn(activity: Activity) { + withContext(Dispatchers.IO) { try { // create the credential manager val credentialManager = CredentialManager.create( @@ -101,4 +101,14 @@ class AuthenticationViewModel @Inject constructor( } } } + + suspend fun signOut() { + withContext(Dispatchers.IO) { + Firebase.auth.signOut() + + withContext(Dispatchers.Main) { + authenticationState.value = AuthenticationStateUio.Initial + } + } + } } \ No newline at end of file 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 7b2ab19..4f82d7b 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 @@ -58,7 +58,6 @@ import androidx.hilt.navigation.compose.hiltViewModel import com.pixelized.rplexicon.LocalRollOverlay import com.pixelized.rplexicon.NO_WINDOW_INSETS import com.pixelized.rplexicon.R -import com.pixelized.rplexicon.ui.composable.Handle import com.pixelized.rplexicon.ui.composable.KeepOnScreen import com.pixelized.rplexicon.ui.composable.Loader import com.pixelized.rplexicon.ui.composable.edit.HandleHitPointEditDialog diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/landing/LandingItem.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/landing/LandingItem.kt index 9a1dd7f..2dafc4e 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/landing/LandingItem.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/landing/LandingItem.kt @@ -58,6 +58,7 @@ data class LandingItemUio( QUEST, MAP, ADVENTURE, + OTHERS, } } diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/landing/LandingScreen.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/landing/LandingScreen.kt index af06096..cf1b25b 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/landing/LandingScreen.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/landing/LandingScreen.kt @@ -59,6 +59,7 @@ import com.pixelized.rplexicon.ui.navigation.screens.navigateToLexicon import com.pixelized.rplexicon.ui.navigation.screens.navigateToLocation import com.pixelized.rplexicon.ui.navigation.screens.navigateToQuestList import com.pixelized.rplexicon.ui.navigation.screens.navigateToSearch +import com.pixelized.rplexicon.ui.navigation.screens.navigateToSettings import com.pixelized.rplexicon.ui.navigation.screens.navigateToSummary import com.pixelized.rplexicon.ui.screens.authentication.VersionViewModel import com.pixelized.rplexicon.ui.screens.landing.LandingItemUio.Feature.ADVENTURE @@ -95,6 +96,7 @@ fun LandingScreen( characters = viewModel.characterSheets, tools = viewModel.toolFeatures, encyclopedia = viewModel.lexiconFeatures, + others = viewModel.otherFeatures, version = versionVM.version, onFeature = { when (it.feature) { @@ -130,6 +132,10 @@ fun LandingScreen( ADVENTURE -> { screen.navigateToAdventures() } + + LandingItemUio.Feature.OTHERS -> { + screen.navigateToSettings() + } } } ) @@ -150,6 +156,7 @@ private fun LandingContent( characters: State>>, tools: State>>, encyclopedia: State>>, + others: State>>, version: VersionViewModel.Version, onFeature: (LandingItemUio) -> Unit, ) { @@ -334,6 +341,44 @@ private fun LandingContent( } } + if (others.value.isNotEmpty()) { + Text( + modifier = Modifier.padding(top = sectionPadding), + style = MaterialTheme.typography.labelSmall, + fontStyle = FontStyle.Italic, + fontWeight = FontWeight.Light, + text = stringResource(id = R.string.landing__caterogy__other), + ) + } + others.value.forEach { group -> + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(space = 8.dp), + ) { + group.forEach { item -> + LandingItem( + modifier = Modifier + .weight(1f) + .aspectRatio(ratio = 1f), + imagePadding = PaddingValues( + top = 8.dp, + start = 16.dp, + end = 16.dp, + bottom = 24.dp, + ), + item = item, + backgroundFilter = null, + backgroundGradientFrom = 0.0f, + backgroundGradientTo = 0.5f, + onClick = { onFeature(item) }, + ) + } + repeat(3 - group.size) { + Spacer(modifier = Modifier.weight(1f)) + } + } + } + Text( modifier = Modifier .align(alignment = Alignment.End) @@ -383,8 +428,8 @@ private fun Modifier.magic(): Modifier = composed { } @Composable -@Preview(uiMode = UI_MODE_NIGHT_NO, heightDp = 1332) -@Preview(uiMode = UI_MODE_NIGHT_YES, heightDp = 1332) +@Preview(uiMode = UI_MODE_NIGHT_NO, heightDp = 1452) +@Preview(uiMode = UI_MODE_NIGHT_YES, heightDp = 1452) private fun LandingPreview() { LexiconTheme { Surface { @@ -484,6 +529,20 @@ private fun LandingPreview() { ), ) }, + others = remember { + mutableStateOf( + listOf( + listOf( + LandingItemUio( + feature = LandingItemUio.Feature.OTHERS, + title = "Settings", + subTitle = null, + icon = R.drawable.icbg_item_foundry_misc_gear_a, + ), + ) + ) + ) + }, version = VersionViewModel.Version(R.string.app_name, "0.0.0", "0", true), onFeature = { }, ) diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/landing/LandingViewModel.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/landing/LandingViewModel.kt index 8ebacd3..4cd4d2b 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/landing/LandingViewModel.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/landing/LandingViewModel.kt @@ -137,4 +137,30 @@ class LandingViewModel @Inject constructor( } }.collectAsState(initial = emptyList()) } + + val otherFeatures: State>> + @Composable + get() { + val context = LocalContext.current + return remember { + configRepository.config + .map { config -> + listOfNotNull( + when (config.featureOther) { + true -> LandingItemUio( + feature = LandingItemUio.Feature.OTHERS, + title = context.getString(R.string.settings__title), + subTitle = null, + icon = R.drawable.icbg_item_foundry_misc_gear_a, + ) + + else -> null + } + ) + } + .map { items -> + items.groupBy { items.indexOf(it) / 3 }.values.toList() + } + }.collectAsState(initial = emptyList()) + } } \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/rolls/RollOverlay.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/rolls/RollOverlay.kt index 263038b..c693afc 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/rolls/RollOverlay.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/rolls/RollOverlay.kt @@ -15,6 +15,7 @@ import androidx.compose.animation.slideOutVertically import androidx.compose.animation.togetherWith import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -84,6 +85,7 @@ import com.pixelized.rplexicon.ui.screens.rolls.composable.RollDiceUio import com.pixelized.rplexicon.ui.screens.rolls.composable.ThrowsCard import com.pixelized.rplexicon.ui.screens.rolls.composable.ThrowsCardUio import com.pixelized.rplexicon.ui.screens.rolls.preview.rememberRollAlterations +import com.pixelized.rplexicon.isInDarkTheme import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.utilitary.extentions.lexicon import kotlinx.coroutines.launch @@ -98,6 +100,7 @@ fun RollOverlay( RollOverlayContent( modifier = Modifier.fillMaxSize(), + isDarkTheme = isInDarkTheme(), drawer = drawer, dice = viewModel.dice, card = viewModel.card, @@ -145,6 +148,7 @@ fun RollOverlay( @Composable private fun RollOverlayContent( modifier: Modifier = Modifier, + isDarkTheme: Boolean, drawer: DrawerState, dice: State, card: State, @@ -321,6 +325,7 @@ private fun RollOverlayContent( modifier = Modifier .padding(bottom = if (enableDrawer.value) 32.dp else 0.dp) .padding(all = 16.dp), + isDarkTheme = isDarkTheme, throws = it, showDetail = showDetail, onClick = onCard, @@ -358,6 +363,7 @@ private fun RollOverlayPreview( Surface { RollOverlayContent( modifier = Modifier.fillMaxSize(), + isDarkTheme = isSystemInDarkTheme(), drawer = rememberDrawerState(initialValue = preview.drawer), dice = preview.dice, card = preview.card, diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/rolls/composable/ThrowsCard.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/rolls/composable/ThrowsCard.kt index cac2352..6a48f5b 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/rolls/composable/ThrowsCard.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/rolls/composable/ThrowsCard.kt @@ -11,7 +11,6 @@ import androidx.compose.animation.fadeOut import androidx.compose.animation.shrinkVertically import androidx.compose.foundation.clickable import androidx.compose.foundation.horizontalScroll -import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -52,6 +51,7 @@ import com.pixelized.rplexicon.R import com.pixelized.rplexicon.ui.agsl.dancingColor import com.pixelized.rplexicon.ui.agsl.rememberTimeState import com.pixelized.rplexicon.ui.screens.rolls.composable.ThrowsCardUio.Throw.Type +import com.pixelized.rplexicon.isInDarkTheme import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.utilitary.extentions.annotatedSpan import com.pixelized.rplexicon.utilitary.extentions.lexicon @@ -98,12 +98,12 @@ data class ThrowsCardUio( @Composable fun ThrowsCard( modifier: Modifier = Modifier, + isDarkTheme: Boolean = isInDarkTheme(), throws: ThrowsCardUio, showDetail: State, onClick: () -> Unit, ) { val density = LocalDensity.current - val isDarkMode = isSystemInDarkTheme() val colorScheme = MaterialTheme.colorScheme val typography = MaterialTheme.typography val highlight = remember { SpanStyle(color = colorScheme.primary) } @@ -118,10 +118,13 @@ fun ThrowsCard( Surface( modifier = modifier .fillMaxWidth() - .ddBorder(inner = inner, outline = remember { CutCornerShape(size = 16.dp) }) + .ddBorder( + inner = inner, + outline = remember { CutCornerShape(size = 16.dp) }, + ) .clip(shape = inner) .clickable(onClick = onClick), - tonalElevation = if (isDarkMode) 4.dp else 0.dp, + tonalElevation = if (isDarkTheme) 4.dp else 0.dp, ) { Column( modifier = Modifier diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/settings/SettingsScreen.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/settings/SettingsScreen.kt new file mode 100644 index 0000000..24d0a5e --- /dev/null +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/settings/SettingsScreen.kt @@ -0,0 +1,150 @@ +package com.pixelized.rplexicon.ui.screens.settings + +import android.content.res.Configuration.UI_MODE_NIGHT_NO +import android.content.res.Configuration.UI_MODE_NIGHT_YES +import androidx.compose.foundation.ScrollState +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.systemBarsPadding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.shadow +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.hilt.navigation.compose.hiltViewModel +import com.pixelized.rplexicon.R +import com.pixelized.rplexicon.ThemeViewModel +import com.pixelized.rplexicon.ui.composable.rememberAnimatedShadow +import com.pixelized.rplexicon.ui.navigation.LocalScreenNavHost +import com.pixelized.rplexicon.ui.navigation.rootOption +import com.pixelized.rplexicon.ui.navigation.screens.navigateToAuthentication +import com.pixelized.rplexicon.ui.screens.authentication.AuthenticationViewModel +import com.pixelized.rplexicon.ui.screens.settings.composable.ButtonPreference +import com.pixelized.rplexicon.ui.screens.settings.composable.SwitchPreference +import com.pixelized.rplexicon.ui.theme.LexiconTheme +import kotlinx.coroutines.launch + + +@Composable +fun SettingsScreen( + themeViewModel: ThemeViewModel = hiltViewModel(), + authenticationViewModel: AuthenticationViewModel = hiltViewModel(), +) { + val screen = LocalScreenNavHost.current + val scope = rememberCoroutineScope() + + Surface( + modifier = Modifier.fillMaxSize(), + ) { + SettingsContent( + modifier = Modifier + .fillMaxSize() + .systemBarsPadding(), + isInDarkTheme = themeViewModel.useDarkTheme.value, + onBack = { + screen.popBackStack() + }, + onThemeChange = { + scope.launch { + themeViewModel.updateDarkThemeUsage(useDarkTheme = it) + } + }, + onLogout = { + scope.launch { + authenticationViewModel.signOut() + screen.navigateToAuthentication(option = rootOption()) + } + }, + ) + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun SettingsContent( + modifier: Modifier = Modifier, + isInDarkTheme: Boolean, + scrollState: ScrollState = rememberScrollState(), + onBack: () -> Unit, + onThemeChange: (Boolean) -> Unit, + onLogout: () -> Unit, +) { + Scaffold( + modifier = modifier, + topBar = { + val shadow = rememberAnimatedShadow(scrollState = scrollState) + TopAppBar( + modifier = Modifier.shadow(elevation = shadow.value), + navigationIcon = { + IconButton(onClick = onBack) { + Icon( + painter = painterResource(id = R.drawable.ic_arrow_back_ios_new_24), + contentDescription = null + ) + } + }, + title = { + Text(text = stringResource(id = R.string.settings__title)) + }, + ) + }, + content = { paddings -> + Surface( + modifier = Modifier.verticalScroll(state = scrollState) + ) { + Column( + modifier = Modifier.padding(paddingValues = paddings), + verticalArrangement = Arrangement.spacedBy(8.dp), + ) { + ButtonPreference( + title = stringResource(id = R.string.settings__logout__title), + description = stringResource(id = R.string.settings__logout__description), + action = stringResource(id = R.string.settings__logout__action), + onClick = onLogout, + ) + + HorizontalDivider() + + SwitchPreference( + title = stringResource(id = R.string.settings__dark_theme__title), + description = stringResource(id = R.string.settings__dark_theme__description), + value = isInDarkTheme, + onCheckedChange = onThemeChange, + ) + + HorizontalDivider() + } + } + } + ) +} + +@Preview(uiMode = UI_MODE_NIGHT_NO) +@Preview(uiMode = UI_MODE_NIGHT_YES) +@Composable +private fun SettingsPreview() { + LexiconTheme { + SettingsContent( + modifier = Modifier.fillMaxSize(), + isInDarkTheme = false, + onBack = {}, + onThemeChange = {}, + onLogout = {}, + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/settings/composable/ButtonPreference.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/settings/composable/ButtonPreference.kt new file mode 100644 index 0000000..60189e4 --- /dev/null +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/settings/composable/ButtonPreference.kt @@ -0,0 +1,84 @@ +package com.pixelized.rplexicon.ui.screens.settings.composable + +import android.content.res.Configuration.UI_MODE_NIGHT_NO +import android.content.res.Configuration.UI_MODE_NIGHT_YES +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.IntrinsicSize +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.pixelized.rplexicon.R +import com.pixelized.rplexicon.ui.theme.LexiconTheme + +@Composable +fun ButtonPreference( + modifier: Modifier = Modifier, + paddingValues: PaddingValues = PaddingValues( + start = 16.dp, + end = 8.dp, + top = 8.dp, + bottom = 8.dp, + ), + title: String, + description: String, + action: String, + onClick: () -> Unit, +) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(paddingValues = paddingValues) + .height(IntrinsicSize.Min) + .then(other = modifier), + horizontalArrangement = Arrangement.spacedBy(space = 16.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Column( + modifier = Modifier.weight(weight = 1f), + ) { + Text( + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold, + text = title + ) + Text( + style = MaterialTheme.typography.labelLarge, + fontWeight = FontWeight.Light, + text = description + ) + } + + TextButton( + onClick = onClick, + ) { + Text(text = action) + } + } +} + +@Composable +@Preview(uiMode = UI_MODE_NIGHT_NO) +@Preview(uiMode = UI_MODE_NIGHT_YES) +private fun ButtonPreferencePreview() { + LexiconTheme { + ButtonPreference( + title = stringResource(id = R.string.settings__logout__title), + description = stringResource(id = R.string.settings__logout__description), + action = stringResource(id = R.string.settings__logout__action), + onClick = {}, + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/settings/composable/SwitchPreference.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/settings/composable/SwitchPreference.kt new file mode 100644 index 0000000..093dfb0 --- /dev/null +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/settings/composable/SwitchPreference.kt @@ -0,0 +1,81 @@ +package com.pixelized.rplexicon.ui.screens.settings.composable + + +import android.content.res.Configuration.UI_MODE_NIGHT_NO +import android.content.res.Configuration.UI_MODE_NIGHT_YES +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.IntrinsicSize +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Switch +import androidx.compose.material3.Text +import androidx.compose.material3.VerticalDivider +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.pixelized.rplexicon.ui.theme.LexiconTheme + +@Composable +fun SwitchPreference( + modifier: Modifier = Modifier, + paddingValues: PaddingValues = PaddingValues(horizontal = 16.dp, vertical = 8.dp), + title: String, + description: String, + value: Boolean, + onCheckedChange: (Boolean) -> Unit, +) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(paddingValues = paddingValues) + .height(IntrinsicSize.Min) + .then(other = modifier), + horizontalArrangement = Arrangement.spacedBy(space = 16.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Column( + modifier = Modifier.weight(weight = 1f), + ) { + Text( + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold, + text = title + ) + Text( + style = MaterialTheme.typography.labelLarge, + fontWeight = FontWeight.Light, + text = description + ) + } + + Switch( + checked = value, + onCheckedChange = onCheckedChange + ) + } +} + +@Preview(uiMode = UI_MODE_NIGHT_NO) +@Preview(uiMode = UI_MODE_NIGHT_YES) +@Composable +private fun TogglePreferencePreview() { + LexiconTheme { + Surface { + SwitchPreference( + title = "Title", + description = "description", + value = true, + onCheckedChange = { }, + ) + } + } +} diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/theme/Theme.kt b/app/src/main/java/com/pixelized/rplexicon/ui/theme/Theme.kt index e447206..8c1f85f 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/theme/Theme.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/theme/Theme.kt @@ -8,6 +8,7 @@ import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.SideEffect import androidx.compose.runtime.Stable import androidx.compose.runtime.compositionLocalOf +import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.remember import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.platform.LocalDensity @@ -40,12 +41,12 @@ data class LexiconTheme( @Composable fun LexiconTheme( - darkTheme: Boolean = isSystemInDarkTheme(), + isDarkTheme: Boolean = isSystemInDarkTheme(), content: @Composable () -> Unit ) { val density = LocalDensity.current - val lexiconTheme = remember(density) { - val colorScheme = when (darkTheme) { + val lexiconTheme = remember(density, isDarkTheme) { + val colorScheme = when (isDarkTheme) { true -> darkColorScheme() else -> lightColorScheme() } @@ -58,29 +59,29 @@ fun LexiconTheme( ) } - val view = LocalView.current - if (!view.isInEditMode) { - SideEffect { - val window = (view.context as Activity).window - window.statusBarColor = lexiconTheme.colorScheme.status.toArgb() - window.navigationBarColor = lexiconTheme.colorScheme.navigation.toArgb() - WindowCompat.getInsetsController(window, view).let { - it.isAppearanceLightStatusBars = !darkTheme - it.isAppearanceLightNavigationBars = !darkTheme - } - } - } + CompositionLocalProvider( + LocalLexiconTheme provides lexiconTheme, + ) { + val theme = LocalLexiconTheme.current + val view = LocalView.current - MaterialTheme( - colorScheme = lexiconTheme.colorScheme.base, - shapes = lexiconTheme.shapes.base, - typography = lexiconTheme.typography.base, - content = { - CompositionLocalProvider( - LocalLexiconTheme provides lexiconTheme, - ) { - content() + if (!view.isInEditMode) { + SideEffect { + val window = (view.context as Activity).window + window.statusBarColor = theme.colorScheme.status.toArgb() + window.navigationBarColor = theme.colorScheme.navigation.toArgb() + WindowCompat.getInsetsController(window, view).let { + it.isAppearanceLightStatusBars = !isDarkTheme + it.isAppearanceLightNavigationBars = !isDarkTheme + } } } - ) + + MaterialTheme( + colorScheme = theme.colorScheme.base, + typography = theme.typography.base, + shapes = theme.shapes.base, + content = content, + ) + } } \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/modifier/ModifierEx.kt b/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/modifier/ModifierEx.kt index 24e2dfc..96b7f8b 100644 --- a/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/modifier/ModifierEx.kt +++ b/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/modifier/ModifierEx.kt @@ -9,7 +9,6 @@ import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.gestures.detectTransformGestures import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding @@ -43,6 +42,7 @@ import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.google.accompanist.placeholder.PlaceholderHighlight import com.google.accompanist.placeholder.placeholder +import com.pixelized.rplexicon.isInDarkTheme import com.pixelized.rplexicon.utilitary.extentions.lexicon fun Modifier.placeholder( @@ -114,7 +114,7 @@ fun Modifier.ddBorder( inner: Shape, innerWidth: Dp = 1.dp, ): Modifier = composed { - val isDarkTheme = isSystemInDarkTheme() + val isDarkTheme = isInDarkTheme() val elevation = remember { derivedStateOf { if (isDarkTheme) 2.dp else 0.dp } } val colorScheme = MaterialTheme.lexicon.colorScheme this then Modifier @@ -147,7 +147,8 @@ fun Modifier.ddBorder( fun Modifier.lexiconShadow(): Modifier { return this then composed { - if (isSystemInDarkTheme()) { + val isDarkTheme = isInDarkTheme() + if (isDarkTheme) { val color = DividerDefaults.color drawWithContent { drawContent() diff --git a/app/src/main/res/drawable/icbg_item_foundry_misc_gear_a.png b/app/src/main/res/drawable/icbg_item_foundry_misc_gear_a.png new file mode 100644 index 0000000000000000000000000000000000000000..72b9040d6e97a50cb3ec440e13cf5d4c56c28b61 GIT binary patch literal 45801 zcmeAS@N?(olHy`uVBq!ia0y~yV3+{H9Bd2>4A0#j?O|gW!U_%O^81G%$F&IEGZ* zdh@ruM&^2@UZ4GQpZRZhzt}7ECV_SL3a`MuQIk}?JF9))+&SVWqyF)1?_-OdeZuO6 zZ*CO6cinXL<`KPbegZ5GOfLD|Z*yN+-nSQ9;LtT`ZuRAN&%aC8JTu;$dg@%|hkfUx z`49g8%+1PRwE0}*jj!(~zTRg1yQFOXc}sbQW8Lc|=6|-_|4r(_n_0=v<^G3p|K9(9 z>;Js;-}~c_{D1WNzZ&;X^BTVb-5Jm7-0nZyyz_L-f-`s1%`4vjs($d}>*@SYbN{DL z`|rn~l)v%+Y&qsVjFWDjzn3@n@3}jSPb;z+Ccd_NeqHu_`nvzG8JyPbmaA({{&!pN zzbr!u^Vj09f45iHE`FT8{mZVuJ1;%|_4?w>kFyz%Uab|+pXP9#nWN(O!So#)OJ;GO zx~Y5of3w4{^(+^98;X?;V)j4XvGK{wzvp6RDV(Xy7jyY@>wfKF!{W3)R)@EbI(Igh zJFuQ%=o0ups5U zd4~1;`p262tZQDsuRr&^|F6k8Y?JUAHDr+k{}+@f@C&CJKL2JCZ$ zrx(9FSCGMeebt7YN2H3sJ&#JgzS5?wS8C2ghwJm-vpxU$e&?Tb?**?97TcOLt_!u^ zeEh<8i{m<(d*^-TsBmWGY!NtRIiFEr@tk5o1`7)jS1}331KraX$`~=Qw=gL5rQYDX zH^Gc)-Bb4ia~$V0w^?$hw@lc{kXYO|+xGgM>iK`?JowMQAbZ+t)#EWA&P)|~vTJQg zbMe{Qer5*6lxMa^#d8!yj!*V_z~tf?$iT)IT$U@%pwJ=Y(#dgjvIfKQ2`rCZ$?-2+ zrsfkmIrWfc&TT`A;a5J}%Kti|Wy*QQwh3vf>@#n66@N3_ty&zR-R1D;`o3i|Y~>YQ9`pq8tveSJ zCny>eAmSP-8Y}L~xJoUsfU7|Afzqa(Tbwn`Rc9(q^%Lpvez1ct=k^@diL3`$A36v+ zY;HKjBb&xk@a#^?L~q9eh6d4{S9Q+CocsCawbH*6p)&hC4>A7uAIY$HZmJ2l5@$X` zTA8S(0)q%kikQPC8J^B}XFflj(=4D=bT0k8E`xxI=YwgfnhYj)7b`vJTro$GxusEn zDfFVIaub7IP=gV}GM&i{iK@QGWRz#?8{97QxnAmXyNuzPh4J+w#to6$T>?hGm19pa zI&~bjWM?i-+xLi}AWcPJcI8=%^7PP@kF}rFM1OvZd9hz2;J>8So3(om7CWk(yLoP% zki*F{`vO7)LPAnPAM`XA>J`0nQecvJ{%B79m7B$+Vf zpI^=9YD+vZYu(42&O165Eu31jGXCG?-}}7wjHbgB3!}0qlbPKCD@05~KN}b(Em;2gQNTS9S5?oJ zWM$<*cC*CGb9OVV@Zl)6NY`WNXga{^*zkIn04J;J5(O?LmW?YaEgN6%TCnXkM~|ga z@|l8}-WHGfI2LO(b)Jjp=d+k?%GF@*V3Mu#;eXymgNOhBiRAB&c|U(U#8AjKy zs*D1b3jzc}6`C{xF0MY&rOe$GzMx5lr$xDI)vLb8vwp@f%Ef-?Zdy@jAlkFKr+BKs z3x+8(L&Ht^Kfj#UkbRrccZ$*ce^=!9sLRRf+7_nlKM=v#HhcNUCniFj7R#0ktviKZ~HVY`E}pp7c2@7LYUfF1TLobt<|y$3H@x`K68_Xb)&-u z6@f3WXRUhKBdo^N zd8Ie!`Uzf*6P7%Exy=Wd(>yaWV*>QKH!btf;@s>}l_B);{=>{{MP>jq}y33v`%RxEKzU$_8zjrlBDy zS}^fslSF_DukTmi?z*3=pR;t{j@Vbjd0zBW0JEdVES7e|8`D~1>_S(pU%zUlhW6KG z#hp40lV;vGBY!1u7AyV+Nfd(wiHo8}9N%UAs0eQ$rt!$ocDy5~Ocm$58bw*2|0 zpAk0J4-5htE#W@}?A8lujfIPU+^Ubv zdHY|?Azz$huiXaA>j%rHY6J&J=C6=pZCI2Umw!T@Y*|9-j5f8|P; z&a}|mrf(%`Up!==9zE^zyz_rvrkB02({ZnL}BugK&i%y`f(7OtD0SDR31_V~%MXTjJlaBn@Gi}#3^?7^#+g}Cvwnu^5M4CbzBeG&VQ}q`w|w( zcA%cg{FgoJg&)rvj?7d&rKIRGFH+U1!zmy}b0HUdI77z51dq_vo4;qCuX$Fy z{cctE&;I%^wH!hMoj(G@q>}oc3WRbNgnoVSE&82C{m-f4y`3vpa_?FfE~NBBB6*fZ z$E;OVTb%TQ3$M>D-!gS7i_-c3pVB*~{0NAP?5g}6CCKHfa9T=ZDnlI0#MIq+YO@`S zi-T7z+N1Pl*ETIKC8L)iih|w8KZW^)x^OORkhkk+JFIcU{?Eeif4ALNf8AOmHPM6N zPU<=Zt)?|U49vuYIb2HCymh$V%KhZd&d=&Dj!enx;xt6K`W_n`yJN|)Xv>Rz53Wng zt@3Ma(}n*F6@J+>UifNWZCkLeob6nZ9A|@xa8W>jO5dkYhCs)MbAD!LXW6cM zoACPD+U?{31*;)^8Rh}?Qy4%xhi+sa|0xj(7Xt|9i&F&L{C$ zSU7psvZ|SHn}WD}1)WPvP2b5z=jj!miCMD8rl-|gY{9Z+QV$DQ7AZJiu2~Q=hf%=M zYO2!Z%a@sob2laZ+?0^)T?;8A5yF<|~|>HRbFqovE8xLcc0bKl|`c>$!>R)~(ZCr15IqVJ_Ci z3#|Lj9#k+omd3QrWzIr_;(6-(FWSGjv$10LmFfQj1pY=_UWjf?UpHee>$5lY6L?~J zLpx`LhPIrTQ{38+(IPOFE97d){8v|PRcHFJaX;It`)l?7UopKpTp97#*iL&a+M~qu z&Z$6$In$VLy}R4K2~U=)K7A)&|BV0Lk2mS|ueEh`znYnv{8+Vm_1{p@)O`sC3xW)u zY|gAGVe)ry){t?r5Mf-(v_ttoVMFBpgafY?9~KDA^l6KE^;X2^vRkC5!H$AD?}DN% zp_3_>Zti-T_M~WMgwiyPEnBvjy}9*~>so$Hr-K4R!{Nf%AAjRif;BaTc%&aXcyO@& zNy*A7np3cy+)S`ulkOpVeD8M)-XA zS)()CE7(!wV2t?27a~k``qxTwS`Nzwcqs<3ws0tH{=?3|;cPXRrQA2*VB`7q4kwDI zxa{HhQR?F^x#{H&jX*)wi3L9&{akxv-&@m)JyO@!#diDXv0Xm7XwxF5!;3F>_#R)_ z@id{YIYzB{CrT0fraaqaSyfjOq-cX zy}Z78rKx)lL}e>*DycX&_$-yYAW~_&S4*dRpN*$bLKK_IL}j5*3pef)+n6EKH`O(_ zl=IovD~eM+4jAw>SX4YXSRD`+$22{)QHH^9;>jlyy`MWc21sctK223UvPE~E_i_e@ zrF&+mx^y4bWS$}Db%Egt?!Wx3 z=k|*_yg-P@R_85Rrgv3THS=WjGqj4S&`JAbO90iV!9UKjf0eo5vdYc_N9(=BLc;Il^g+s_)Z6aH`7?Yzs(}#r<%mc&X z_)ePz#>Vzex}>0267O)n)tiGwNuztp!U?Af4xdn->b2pYc5T~v=?fe)zO{Xp>=9<; z%V5wxW8*%vID)|^GB9oaY~BM&EK1MsJQQ#_XTjo-&~vlcp+s5uzdeu7e$CE(cF!yF zX1(~T*cmy`_;h{EqBTL!3_Lci+S&JZ@f5CE%cce~3MHTM*ZkVKXaRSK!u$IB?D9KH zUKTz0+U)-DYu1OKs!u+7J~3v!Q~G@G23@}6WdSGBC!T-y;5+Mz?BXPmoE>@&J3L&q zf_+0Zljme@;%O8RIP}nnZT)fP$SDe)A}tI&Jadc#7QU!bY!Sa-p0gy_)5qUmQHD!- zw%=imC+qG0`>65yUQMv%lR55UHMt>EEFdzjbK=9oFJEIFH6oaNzjvG|eR1T@#B$bn^ zR%LHHZ7Imw`QvZh#X{NZg|X)((~FOF?mznNe(g_RhLXh<*X}61_-Z$AwOne$t0`O` ze%HuFPD_pbTH)fz*L>jlF20!SjEX7_npasIFSuy2oj$F-b=tIRyUu-%aUvR#vQ$($uG>eA`E*f0Xee{TqcbxZu7Z=J6Cz><*noq;B;kQ_~h%4tqbe}+#GF1 znqp6gm-IhdeJS*=cEG{x$TW{7i&QukxeK*?n0Wa3rSf|lRU@K-u9MniMo|u~w#E=E*3;V* zw1s?DpUAdkmndi8`|_Rt(6$(zm<=2+Q>51K`DOHn(OyYaaE^7g*y-@K0q=J`e|Idw zAYh*Pr<;w9irO!DPn>zWYSpTiBCSF{8^-zfAK&o%HtnnQZM$C!`Si@6l9)mi%DcmvY`XU4U=HfcF= zI96Bx{&WBL4|TgV5w3F|E);AJJn?()KZi`c>EW(gEG}BVShX_h=3nnT{;1~Zsnk+u z=kO1G?(dIpdg`qh&=sJ;@oZN?%=fIX(-w&Z+xnbtQaZiBI8($`^YI}Qo+C+yJpDaM z2?-2)_wKc*|7XJ|XVdYQ{adn@Rqv@&MNdAn?)mb``^N5adA*Xdh3`M5e)$@EtW)@S z;%zg%_=5AuTF%jzBlZxJ)*toLB&b|5G0-cUYZ@$0Sl^I$4J%8`- zKK}jx|MIVk+F0ZH`_i{-@8-Qb_#!1IVA|9UrIjrK9A{E{iqE+?J~6iZmE*Va!q=@i z|KFWn&wQbG(*9?^DxNi^A2WF#BIfG5AS5_cb;YSwudMohytMzd*nZ#NX}6_rP1lRO z8W10EY-)K@FYeu`Yg4XI30CrO+s6WVbYvS1@hE_&R|Nfn}sQjcdul^tF z9E&pZAOzbBs>tt=T3&&AD7kIYzU0U8ua+vn)9*HnjKn>#rTohnb(qzOPvF?%(fs ztKRIrqU)lh=%SR!^4IajEUwEY3tvVFs@&B1)M}%1y5+Ql#!`>v!7ps;<<$M=9ni1; z>HX&ZcKOGTg*kpWuUNI}NE0jf#endx<@dho<=ouF$`BA1)m5U_e0lk~2mb%RoWEd} zFV`ny+2H@@-ti4ZPq}_DGrD*wMHtjGIxRH#Q)kcO*pN6&LQd}Bg9`%Z=Gk`t`&YN* zvLr`{gMkQ>C_`&Q5G_jc`!yPg_( zUG(AR`F|(>&foiU*@LP7)a+TJ?1I<-$83KD?-Sd5glyNpFmf z8~GkioKtwbP(s^na{96NzI$HmXK}dhyaL(pg7-mZQQns zpY#9UTz=ou%uJ)jDQ?P(O2K^JVKUcGwt@S<%-X715PN4qy>Jah^P4Q&?Sx@_{m zf^XTfWfOc<1$+GtZqoVj*G|T&go9h`oV(Uk7aO_5i;i{&oOnLrbXtHAXVGmV4;wqr z=lU7FI?>yf_)Y9IFtSnjvDfO1Q{R`8^2bT#`XyKSwN^QA&)=Dy9O)YR!YTZ^=y6lt zg7)2KN_9_bS@bzaT=ZvTI5#Kg?ahxV2Y3(5|5s#~6+OFj@BVbX|1&r4TCj87>(wh( zbZ{`a`ldeJv;Obp>Gq~K$|D&zKm3{%6S_p{;L-ypK4@fTW(B|B_kCVky~Fi)d*83y z)n}@G>i7CDoT*P$FQl+;S|e~sGUs+$IF)*MLT&`Wv_D7Yz#bc*x<~f+YLe}p3h@*wnSVapYF+Zb*Vp&| z^Ec9veeqiTYG~+@_xu4~3MVG1L@iUj)u*cVD7fjZ#El(^xt_kIt_2w>6RK>qK4w{Q zvNgL*Hr3-WN^xy`chS()(orPTLE*vCCr>!yZf}-7zyE_y&`OoOTYES`~sXe{E3)a6E%DL?n8mjv2{QUOn z_j~16tx}rnr!>{?(T9nbJye!$%(*GFW!pJtv)PXI_3}!pi5yJ~x6Kx6a9u3zt+J7G z(ohKEIv4Y#D00y$BfYpct_Bfp2}^{!o_+u6ELijO_5VMM&#fy?=2@3FLrq_VXWH3k zJ09=oDHdore`SLpL(6>!p}n#3P4(prvGZ>i?`2)a^g*+05i3*OMfnepzt_Eg{QvRB zufWy{3YB|Fd2R2FmHn2}V>#>95oMB${+pE~}K*k%SUCk_`!7DbkA zsY>xD97P;fC_K3H)41a6)#-)L&SY-UkL|i&_kDL@Xk_!|=es`sSs!<>Q+V!&O63)+ zR=C^6H)KZN*!9)V$8~wZ$499q=Hbl(3POC&S4A>r@%eszbfoh#N9&;#D_1(-e;W7X zQ=|aX3prl7em2iZ4w|jGw+(ujk~U_h7)j2tF6W!}biu}rg0ix*5gU_KbuP0ci}}sp z*Q4D2J^AD$)f*cUnIC<$(7D}o|M}q`M=WaM^ljv1^)?5dNDI_>GV%1&2N8UG?DTi- z)>oET<#7B}?*}$zi|U7ePNvVV|K{p@{Xv9Usm$#yZy#mdG<(<+sZgUQk;dq9FR3Qq zJ049>Tyu{d=I@vt#BHp~wX4_zO-C*z{EpS*n=yIdWM*3uWd zE_8aR@Z8>dFsA%kC6lAb!V^X!zO5Po97e4U95TmSGiNRkcwk|cbKFUB{_z7B1YW*- zd2HL;+Xhy4eY(-_jx6rqCp=w`_fhNfcxRimgYVb7{hqWnVrz}lyxN+_aYqR=-vXS}F5x-*ZMEU*E)p7eagNL}x8) z3gU{r-tFh@*r3tH!R9RB%DL-!_q%s_Z*EsJJWdwY(9}J8Y3bV;*UjYnVjWE64s+}8 zYZE;^E#Yumug7vD<5xTiEr+(r?$C2q%s)^lvE#4Pi^&Ba_PsT z>HpsyEwPJrWsMV^+qbOfri}N}$$om%Q(FX>>b8C;oc8&{>opstGiOLMzP#S_VlBg$ zvL}^dHk<#+<%a#5GHu!~%k*p2_kZ6zer~RP^ylmI|7-7;# zodq)D4;Yep^qx;hmE7gdE~*i;ea1uu4wkMpO$%PU^j&^gL!z?i*%wI}%NiDE=ff2* zCaQ19y6Ssl=VyU)bKV_$q`G=z>gm5be!pWc_&sfH#HI>PuTx$dD=s?eL|o{q|9idO zQE946XeevW@uusK5ALbd?QmP1k&)4oyL-mGK1H*+4$jWnDxPg`cV(=|cTto!}odwW8(Ud=rPnb{BT?DPXwO*eDoyr=0LRJZ@>S+eG(gV}T!B{BE- zczLtjTP)X01-V)cO-(x^bl5y6b?p_exG3tV>1s5SNmc09t!WFFZR4!}&i}ur==Qm} z$&Cxdn>;3-T#~#kb!K0(wBBR2^qgfWvnJepb@P!$QQh4cMSrXtUbr#r3Ve~Y?$@qk z@10j_bTzriUcah5al`S~Ut7Y;*TmUc*~CorRon3PYV3{QuTEFII;p;~>adlJb(zFW zAGWyl;!}ctFgu>P7AnZJ!+8KS|NGCnb4@dEZ@+W?`r7+0QO~z`1aB<-{AK3io73ZJ?Y=(p-tV>N$D{Q^x}Rq? zH>n(JXIq~!r6|Bl!2d|$W#8Eo&pi|1XgOfvSfbUHqSWiLM8GQO21T+@H)DbMq8 zSi&Tx7t!(RmDHOX8)fb0^Y<8jiQm=3U;Dw?qI{e1#giH}b@FX(Z4Yjko$@+;;rjLd zjTb$0ZWh_^s{Z{^KmPx-xWgu*r%!2rtOz;zytpkha$U0Zky1-W4?!E(nh)kGf{Lzs zE-%iMw`@Ofe19i9r@6(CUvuW~oOb=|PaC1M-g^pui_zBdfgla7J!!t4c>fthlrD;Ri7e$%kt^RVY2AW z<(aeI-Qat-|NlPrU%!8A{raWnyh!O#qr$VTW{EjTLhb!B2XklVA6oSE^n@P&!$rC; zW|(}K~{9ZTx(qUz1y~lbb{o;!>iqBd0`yM~j+AYrd*)48g%}V*W{p^z` z2d`MO?#L(6(-S(>1LN;A2y`jC_d5sgonc-tIIsHO(;wUS|K59X<442a2VSpN|Ni!- zaoL|Ah062KFI=|lRK$(~$0y5X=Pz3O`PQeF4izie#Z3xHNl8rURr&{63$9P&%h~yu zZ_1Q5#sZz_eLRnalPzkWnZ(`xDYft4*Zic@x!WHuy#I@V@9n+TM(yT|oE!$l11p2o zAAWD$kaVxVTB}n)5l9mA9Nh-BBKc#-&mbdrwMEUETKK-&ngsgV#AM#o(DkuxY`$1Kks40uud#WD_llzHsdO z*t`Dld;UlK_FpAgnp0oAmp^)l_4LM~N_L@@nZLFF|9QG_ecfB_$*hYX7`+Q}vzT!@ z_VT8mM{Z1cx~nJM$a43>b#?(^VXI1G-!!RkX^4FKP-%OkWPVPTlIYaXhwHfKa_oL;s;kAZOi_Ukt1`m zD*eEM4JULiGQu^Vv+()wg_Fh)j z=Mzdwcvgq4U$ojf?CM<0dMjHCGaIK+%>)ZEu4zYOkJ-#AnjRq0q;O)B%F@(GwOP+X zT|BS3Hj1%0DzLaLnDQx!q5fKUN$>s_=0=b6ujGGl>-@x&Cv$2+i-5tiLk2yUN|Y@B z?*IQRf8P4FYv2EUX1>37)+?)?o}R<6KPpc2Sg>)SjCT0C2Ayt&mP4<hPP zbFeWRtd*&%(qFV@QB3TXl#Rz9u6xb>ONCucCa+Ljta!)UV~+!)1vu8OS#f38uIkP8 zpKhN2*4yu|y6^wq`3u(Vlic;pH8|NgC9>`M>!V-3n0$L{-H~C^_Uo5g#I){acK!$d ze!o9{+25|=I=|cz{`w!vcXmG2o3X4j#w=b&GSorkjjPI=gT?!QaK_vg`v2>5eQEpo z=c`XY=hk!-V7^nzJZss(*I!*s`pp++njkv+we_l2Cl!u->XLaTzkR6VDuIEskG zyuL1+XYjB1W1%zWmoU!c;>kzS_MSIloyf63&_S(1EofrVxsqo_{2X2yEHc(rYub0N z`QrTke?Uv2xbtCV38|e;%jZ?eoL$>nu%kD?f~Q`gA^WO+`x=i8I>O8S=O29VfI+V6 zh2oK9%{4I>8^hynG6qh$c<)|cjv4R#_~S?4t^4uxU)<&AA1|e7J=ECbVo`ih=Ge^F zOjC*i1r}t@66p2YDQ$i?43Pv&Xp%M+SuAYtd8Hy@XQD_?AgP(JN|a_{=bj@AG_>t-}`xP?1|LR z8ME!@hlF2$u=Dvm=ip#&vGef`$Br*!aC-Rpr-6k@Lx6@)_}Y5`e}C;${+pn;CocA? zY3Kykr3+5Q#R_g|dTo{Ixga3*==0B2f9GsY+GncIRd;(^`tBuXzi2$lSFQa48vWGL zc{V9s@aUY^!a2McdyKwt<`?ktli|aQ# zh1L5OFWMx-f2UqQY;ByVoRq{F`PVk{Chu?vbye*#-odBLBh%6x?AfwxmC3ZO-PzXH zLZ(lh{^-ZY$47gdZ#SrP-`J6;>~p#0{NqLkO}(;M7pv?=wMX5qZ;`aE`r>iS;8Txb zw+JVD^Jxnfr9&n@6{Yeq*Pkv6eBf{YIppiqf8Mul9AS{LW-tKpdcVFlPdGiz z`s9-%B6@Leo^4ts@NU-yTcb%UMWSZizH)8awpGdP{9lVsyV*_NtfKT{>e8uI!OqT4 z8rkJ{sLF6n=i%e!$(VI4BviS{Aziwt@UqGCZ+UZG>;LNgm3Y2O=fT=qyW+ogLad@J zT3vCz-x~_gCQZ{5R$a2vYPxIS79Z;sD_3cB2R*p+(s&G5?cl}$!>ub6mYL_GSHa9X{L~vA<5Y_RB zeA?#kiHpiRKhJ&sNv>bX;N2&skIxN!CRdvD7CU7andj#3{d=wN_WK=?)}^lm#B_3w zUU;C8bK5ntQk74pLbg5LzH8aCusfB{V_&>_bLe~BHyfr^Eu9xRb8c_r_22)#_CiSO zpBL)(iq_xc6uZUs6#VyoXD-lT|F@vOgGEAGnoUu!#P`_Kd2!3P?edDhV6{Ifsl=%G z^s(8qx8Es?{{43Qn)vN?wa0U{r|W0$d4BJ=S;_Y=d^~)7U#Cr-TBRw5xoE}dO)|6kj&c9~{(g4VhlSRw-Q0dhTD%c$ZWJgn<#1?td~1RVpr{Pzu<7qBxl*{RWEiNwNX?GaMBb_@zh-ty?^1WD<>x>^l?Ti&gk=9 zuym#5>FK)eS~Fb~1X==5B16 z*Z1f=U%}CG@yeB!clW$2ULJjZapN-PGpt$K+8;k@uTT0=BtNg_m1oK($uA}4j)AH^ zK0OLkeHJZR)6?7E;~aMxU?KUYqe0t}sbxuNiC$R8N zOJ!qZWXQm{;qYR@8a5@K@5CGGexFt({Ed) z_2bg?e_}Izq`u#;m!J1@ZTcUk6(t|O{?&|}HuLc=rKLfX9N z-6_B{h!u->lPkkz?*ek@N{Lpu)+DZkBj^jxW9u&mPla-J%v%0p1?^)5! zKQ}i&_s^L1PMme7)Utz|9S1FoWo|$0u{=BDR8QJMYKApWG{OVu`TUz;`{pd`PaE7 z`I^QmJzc7*q{@|Ykv(ui;!QS=hXSfi4<9Pl{JwqvXxG!#AI=#2KfHbarGPX) zw0FG!S8ZTs)z!RS{>ZAUs|C1NFI4`siF$ta@Tb(%8YpIMTUUp(W|3ddg0Hh*9|_pN z)b)n>xkyWZ#hJEst9O*VREn$rE5OF)_F-awjYvD+`{OS+t1EPJ@yXluob2>0DJfA9 z;!HaJEjMCMg<#m4*zWGR&mVqg-H>)xD#b|h&#UR@H80*^+57a`?5XbeJ|;w}P1lpL zs#Ef}NLO7LbbMosRxp3qmi4^zZOVi~wmjUWW^__S>Xr1xi0cf`M1-Ggu4HaLyjV^^ zYhBDvADiM=C6V8c&QqNKPTB3Cn}L9n+RVZkuOBqaSCxN$we{_B9e(kOJ^HJTvQuOKlzxTc`U%e{pW1qX+^mQ?EO3cm80i}$psfii8 znl@exwE4eUyzq6~*Bcuug{Q5JZWgcqXI%4t_kG9UU}dA3Jck+;LPC!pE0xYD4HaFx zN^AMSgbCB8PEiu+YbaKj>8BhKwQANjO|{9A8~5yS;%WDGcJG(7e_(awn(eOSnQVnI z%V*3w&zXK^=E@3{chdV558dZ-&SzB+WD(++$g$#B>^g=Cu8tR&?cy(N)X6@1NHw?L zrsV%L<8;3hA1g#Axd`&HUAPgTtrxq=<8{Q|OSkvstlYnBThlLQxsF8)(;4ON#-F+L zRHVoHf{AF4wS=7H0sguV&Ng2TSZ^%&r}XE?a(kDYDlT4LT>%$P_kOv<3!U2+RGWb2 zPGiOO5~`AfUYo69b}+EC?A-PT#1BRb64FxzJO|JjYp5Sw! zzwSqINXV53%Y0`Gc20Tp{{Or8>h+%<&-aPhS95g6oUWVue_PKF`217Hw&sZflcW5l zmns~JGv;(W`hEYuT;1!L>I>PJUf7f}-QM=TNhkPD?e*9jTRy7kL|*EfwJIxP7vJ%X z6VE^Q*y&=$>ltcjWY@TGq2QBZHl~FN*Vf;TnC6qR=AQTT^NqzT0H$B?Ipu`Xx9Af)`Uvu5#2N&Jt_asODe#Cn6 zhswvFAr*VA_Qc7y?CdFKznLSo@rH=b=|xPU0(~xNhs2JW^ewtPS8?*m21DuEztcf; zP&u~>)UD2ce{|yE;f#!&CXJ4cmct(^N?aBP?)h{|@yTb;HPPGUCTS$T-&YG7-q^H> z>qye&4wpj_+w*i6ZOp9sEB(JK!=zJPu73Kq#Jg=BsW*QNmV6<-)2VE_B&`C~DsAJ*kN z1f`tJU6uV||NGkgp|j7cD|GQ3Z19iSlffyr{!WYj|GU!*cjgOZUtfE?OLTR?qbHd) zU$x`k7RT~Au~hvms(<(3HT&oN->c=n$G&>KEcULrLg {uVNazLbcl`^g-A+;7k1 zJITPPinYB@&Mnkcb(1CY-B@u$(cZ+OET)+yQml&^0-9p<_>Vti5S^eMp%CKqdXHI1 z`1MA^bA7V57jNFad|S1vDPz{pJ-N}Wx3}e9FP&?ya^dQ|tD6=3rDuIA_AYtW#Q~P z*o6ZMN~(e^%yx6^%lVf3%{%nxnpr`6VoAjnAGKgV8`HOc9xkujzcDwid3y2ThZ`I% z#JArom5=-P)ceQL&H4#%XYuZM`s}uXC)dA6`gZO2-n}!7y}m+6yQTTzp;qqJe~osJ z{r|r?UsL`4?b44GGLtkMrm3DVI{NdRUrx;RMpN0<7w=zhZ%S+u5H28a`B#3Y^SHMZ&C32aqIfNe}|dbzwM8Rjn$NLJE$R2 zbd0A#=X&W|ONK-FT8+~2TSwz{am(OTxUh}t;^N7 z#5r39_*fMJ6y|##-loHKZbhP4hStf`TT_~nM+ z7X8>xU+MR{S3=G!ueQE6YuekM`R{GSJyItvSYk2V&qAj0{_}$m4k&EPzt8A7<-)yt ze2gNy%ilXCJKH|f&p3SG0mC0V$<^0%+_Y>v!{dI59&Bp{Ew%O34%u1x!;Ip|f177f_eNueu-|eao0&aUJDvK(xh!Wadur8}eE!4yohnsjQ8!)(JFN>$EPlRX zM($}PQST|Pf&w9)0?fOf1-dRuJ}tYwrXc4J)6yo^ce^IIa9!V+Fxze8y;uf~r3EvY zU9UN4GA?v|uWrG(lw}H+Kuc0UMaC1ZW5D=6Wqvo@k z!-E|~OQo}~t#OO>mHqbaZoh3cUqan$CX*}XNe>s9c}(hVUjN=%ZK|7!5aUvj)6?~x z-QC$)8XJt+H>oH-_`Y!WYb7OB)rh@CqDl`9R00ot-}l{D;2`63v1wcM9aB?z_x*e; zuQbtQL*n7IHSycy_Fbs7`z~Jpb7$f)hTEGST9|FloqfCSq-Bg2m(u-hx$b`^y34Ix zv1;9-<9;&juO=#ZI%vooyK#bJTmJ3Fv*veO(&yE&x%bH&{J8k|#*&voCpPh%i|t@) zROl+mk#5pC{G5BynmtmbTYYDl3j~6u2y*NTK76%fnjTel@I*>btCM2(6K>Yi20W(= zV#84V^6wGcrK@laQx(0;Li+fm}{bF#DJR9CZF zt>4LJE3WUfh^fX-UuQAHIT?erW&yT9frFfkijREO?5)tBA{5Z*v_NEA?!xbvR1K~l zeHHpTP%2Ytce%W8-Miv=i5I&nHX76?dcREWw{PY)hu^I8+)GnUckR+^ zYE+)svvB89F=b`u57nkuuA49T?8M(EZ{PfD*UyZ+*oM|_u?L^yfBgCJ@$vD?>s|*O z-ZHvHib?3#k*IBrv5v9)Jpx3BWLU3h>HhZ zR0=L6ZOK!cS!bp>H;C`D)`IQNjYN(%Pt`VWF7E&Rhx>L?@a5n<6SIeMR-3jr3A7!T ztCo3fo^xdBJ?|H9-@4j`H#l_ttz&9b*mP57+x}ltk1hw=eEgBj(dzW$BY%C5k5&8b zcYB0)y*fH`^Yen!XJ-e7#j6F**REs(r$-Mr;Rh|ucm zc}F&V6TPuDyZTY|{a?>26do*QRpvjvamQn;J7qcV3Zxe)aCEH_bewYI=)JgWS1yHY zOsi#&yZ24W;-P|`g0SSY)W=2lQ$war1I=8%u({uPcX#>XW!t0{7BDC+)p$}oA(c}= zL!x2XvapypyNtf{=GVPHa>$jt>EewoGfyu)>!g?;u`RG5_PU0|GSl1L97kpJxv%@x znVW0=_nq05pWDjFenx9?sGn3>N_jIH`PJJ~2l*Pg3ToBtPtnTk5 z!n!8%GGlvWLV=+Fv4^|(a*nsA?)vc4`-$@LKJ_;DcHRBwAD@0=)Rr1KE%!DXV`=W? z!jnGDCQLVsUlgQo`kj6%{l{%9q5LC_X+Gsjf=*8z6qZ!%t?N&|edyU)>GwT;{@3=^ z{U|MoeR1sG-F5?8OQzd}6Frt5P;>|k5pXgzFyYy+&k#AWOIGKABdg#d4Tl9x9H8;E z$4S>yr%W|XyxVsB;@!*X`!*Hdp7QkBgB@+UUPo9hX3pvni>vszbcRaDsr>)fs=xI0 zm0A?P(os8}d}2xQidCzcR8D>PU3(%exZ>T-_y(c2@B5zHa{So)Qd7t8ggw=}KN;M_Ce zba4O^8{c%%;sq+6&o-$Dx?Y=c{CVi&i<iLg9bbSS`8c`3QDh}pJ_f`JbC83dFu@CuGUUlIH6Q_ z`+=D2Obc00Z%W(sPF$6Dzt^1gFFzFiy}}*-z23G#V`6RG{3lm!?iFY((v92jV&P)< z{vW)`-J32cyn4NA;@PJcE|;^;6|XM%8Dt;B*5ZB2ApalJ6Yk0#XIfXSQfOjuR1jd{ zDopcL3EFYtW^Y@Y*%tlx2M#*Bf3E)iu6JiaOO4{`MZv*(5AO)F1{UbBSM$lw+Eef> zsqW_|(~9T9?=JBSJDqsuP(1)d8`w&B5vC4{ns5GA;bTW9|eksn*mP8+4eD_sPsG(QSV@ z%P(lAi1dIi8yei;ce9X47hsj#b~+&XcF&|qMSDJd z@^)VLxP#?RNzU;{dYc^*&VI3 ly!8w*JzkX$k-An1*JC{qCQLpe^YM@9+|EsIF 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 F2>^r0HC+Gz literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/icbg_portrait_of_a_tiefling_unfaded.png b/app/src/main/res/drawable/icbg_portrait_of_a_tiefling_unfaded.png new file mode 100644 index 0000000000000000000000000000000000000000..99f61b9d26c35dc993faf061dfaf8be0fb1028da GIT binary patch literal 33868 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 de personnage Encyclopédie Outils + Autre Histoires & Péripéties + + Paramêtres + Theme sombre + Utilise un fond noir pour économiser la batterie. + Authentification + Déconnectez vous de votre compte google. + Se déconnectez \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b47864f..da354c3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -50,6 +50,7 @@ Character\'s sheets Tools Encyclopedia + Other Brulkhai Léandre Nelia @@ -246,4 +247,11 @@ Game Master Stories & Adventures + + Settings + Dark theme + Use black background to save battery. + Authentication + Logout from your google account. + Logout \ No newline at end of file