diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 68740ea..95766eb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -16,7 +16,7 @@ android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" - android:supportsRtl="true" + android:supportsRtl="false" android:theme="@style/Theme.Lexicon.NoActionBar" tools:targetApi="31"> diff --git a/app/src/main/java/com/pixelized/rplexicon/MainApplication.kt b/app/src/main/java/com/pixelized/rplexicon/MainApplication.kt index caa5815..c4e9c4c 100644 --- a/app/src/main/java/com/pixelized/rplexicon/MainApplication.kt +++ b/app/src/main/java/com/pixelized/rplexicon/MainApplication.kt @@ -20,7 +20,7 @@ class MainApplication : Application(), ImageLoaderFactory { .diskCache { DiskCache.Builder() .directory(applicationContext.cacheDir.resolve("image_cache")) - .maxSizeBytes(size = 150.Mo) + .maxSizeBytes(size = 250.Mo) .build() } .crossfade(true) diff --git a/app/src/main/java/com/pixelized/rplexicon/business/SearchUseCase.kt b/app/src/main/java/com/pixelized/rplexicon/business/SearchUseCase.kt index 9cc0186..628d7b6 100644 --- a/app/src/main/java/com/pixelized/rplexicon/business/SearchUseCase.kt +++ b/app/src/main/java/com/pixelized/rplexicon/business/SearchUseCase.kt @@ -14,7 +14,7 @@ import com.pixelized.rplexicon.ui.theme.typography.LexiconTypography import com.pixelized.rplexicon.utilitary.annotate import com.pixelized.rplexicon.utilitary.dropCapRegex import com.pixelized.rplexicon.utilitary.extentions.local.label -import com.pixelized.rplexicon.utilitary.extentions.prefix +import com.pixelized.rplexicon.utilitary.extentions.string.prefix import com.pixelized.rplexicon.utilitary.extractSentenceRegex import com.pixelized.rplexicon.utilitary.extractWordRegex import com.pixelized.rplexicon.utilitary.highlightRegex diff --git a/app/src/main/java/com/pixelized/rplexicon/data/model/Attack.kt b/app/src/main/java/com/pixelized/rplexicon/data/model/Attack.kt index 1e12c5f..7d362ed 100644 --- a/app/src/main/java/com/pixelized/rplexicon/data/model/Attack.kt +++ b/app/src/main/java/com/pixelized/rplexicon/data/model/Attack.kt @@ -12,7 +12,6 @@ data class Attack( val damage: Throw?, val script: Script?, val icon: Uri?, - val alterations: List, ) { enum class Type(val key: String) { PHYSICAL_MELEE_ATTACK("Mêlée"), diff --git a/app/src/main/java/com/pixelized/rplexicon/data/parser/AttackParser.kt b/app/src/main/java/com/pixelized/rplexicon/data/parser/AttackParser.kt index f692f95..cddceed 100644 --- a/app/src/main/java/com/pixelized/rplexicon/data/parser/AttackParser.kt +++ b/app/src/main/java/com/pixelized/rplexicon/data/parser/AttackParser.kt @@ -38,7 +38,6 @@ class AttackParser @Inject constructor( script = row.parse(column = SCRIPT)?.let { scriptParser.parse(it) }, hit = throwParser.parse(value = row.parse(column = HIT)), damage = throwParser.parse(value = row.parse(column = DAMAGE)), - alterations = row.parseList(column = ALTERATION), ) actions .getOrPut(characterSheet.name) { mutableListOf() } @@ -65,7 +64,6 @@ class AttackParser @Inject constructor( private val RANGE = column("Portée") private val HIT = column("Touché") private val DAMAGE = column("Dommage") - private val ALTERATION = column("Altérations") private val ICON = column("Icone") private val SCRIPT = column("Script") private val COLUMNS @@ -76,7 +74,6 @@ class AttackParser @Inject constructor( RANGE, HIT, DAMAGE, - ALTERATION, SCRIPT, ICON ) diff --git a/app/src/main/java/com/pixelized/rplexicon/data/parser/IllustrationParser.kt b/app/src/main/java/com/pixelized/rplexicon/data/parser/IllustrationParser.kt index 5e8ca4f..a6b1224 100644 --- a/app/src/main/java/com/pixelized/rplexicon/data/parser/IllustrationParser.kt +++ b/app/src/main/java/com/pixelized/rplexicon/data/parser/IllustrationParser.kt @@ -1,7 +1,7 @@ package com.pixelized.rplexicon.data.parser import android.net.Uri -import com.pixelized.rplexicon.utilitary.extentions.toUriOrNull +import com.pixelized.rplexicon.utilitary.extentions.string.toUriOrNull import javax.inject.Inject class IllustrationParser @Inject constructor() { diff --git a/app/src/main/java/com/pixelized/rplexicon/data/parser/QuestParser.kt b/app/src/main/java/com/pixelized/rplexicon/data/parser/QuestParser.kt index 624bf9d..c41ad09 100644 --- a/app/src/main/java/com/pixelized/rplexicon/data/parser/QuestParser.kt +++ b/app/src/main/java/com/pixelized/rplexicon/data/parser/QuestParser.kt @@ -6,7 +6,7 @@ import com.pixelized.rplexicon.data.database.quest.QuestDataDbo import com.pixelized.rplexicon.data.database.quest.QuestDbo import com.pixelized.rplexicon.data.model.Quest import com.pixelized.rplexicon.data.model.QuestEntry -import com.pixelized.rplexicon.utilitary.extentions.toUriOrNull +import com.pixelized.rplexicon.utilitary.extentions.string.toUriOrNull import javax.inject.Inject class QuestParser @Inject constructor( diff --git a/app/src/main/java/com/pixelized/rplexicon/data/parser/map/LocationParser.kt b/app/src/main/java/com/pixelized/rplexicon/data/parser/map/LocationParser.kt index a91496c..4e01013 100644 --- a/app/src/main/java/com/pixelized/rplexicon/data/parser/map/LocationParser.kt +++ b/app/src/main/java/com/pixelized/rplexicon/data/parser/map/LocationParser.kt @@ -5,7 +5,7 @@ import com.pixelized.rplexicon.data.database.location.LocationDbo import com.pixelized.rplexicon.data.database.location.WorldDbo import com.pixelized.rplexicon.data.model.Location import com.pixelized.rplexicon.data.parser.IllustrationParser -import com.pixelized.rplexicon.utilitary.extentions.toUriOrNull +import com.pixelized.rplexicon.utilitary.extentions.string.toUriOrNull import javax.inject.Inject class LocationParser @Inject constructor( diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/navigation/screens/ComposableCharacterSheet.kt b/app/src/main/java/com/pixelized/rplexicon/ui/navigation/screens/ComposableCharacterSheet.kt index c5490f8..3606a60 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/navigation/screens/ComposableCharacterSheet.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/navigation/screens/ComposableCharacterSheet.kt @@ -10,7 +10,7 @@ import androidx.navigation.navArgument import com.pixelized.rplexicon.ui.navigation.NavigationAnimation import com.pixelized.rplexicon.ui.navigation.animatedComposable import com.pixelized.rplexicon.ui.screens.character.CharacterSheetScreen -import com.pixelized.rplexicon.utilitary.extentions.ARG +import com.pixelized.rplexicon.utilitary.extentions.string.ARG private const val ROUTE = "characterSheet" private const val CHARACTER_SHEET_NAME = "id" diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/navigation/screens/ComposableLexiconDetail.kt b/app/src/main/java/com/pixelized/rplexicon/ui/navigation/screens/ComposableLexiconDetail.kt index 120f221..ffa90bd 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/navigation/screens/ComposableLexiconDetail.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/navigation/screens/ComposableLexiconDetail.kt @@ -11,7 +11,7 @@ import androidx.navigation.navArgument import com.pixelized.rplexicon.ui.navigation.NavigationAnimation import com.pixelized.rplexicon.ui.navigation.animatedComposable import com.pixelized.rplexicon.ui.screens.lexicon.detail.LexiconDetailScreen -import com.pixelized.rplexicon.utilitary.extentions.ARG +import com.pixelized.rplexicon.utilitary.extentions.string.ARG private const val ROUTE = "LexiconDetail" private const val ARG_ID = "id" diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/navigation/screens/ComposableLexiconSearch.kt b/app/src/main/java/com/pixelized/rplexicon/ui/navigation/screens/ComposableLexiconSearch.kt index d3c9714..59ccee0 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/navigation/screens/ComposableLexiconSearch.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/navigation/screens/ComposableLexiconSearch.kt @@ -11,7 +11,7 @@ import androidx.navigation.navArgument import com.pixelized.rplexicon.ui.navigation.NavigationAnimation import com.pixelized.rplexicon.ui.navigation.animatedComposable import com.pixelized.rplexicon.ui.screens.search.SearchScreen -import com.pixelized.rplexicon.utilitary.extentions.ARG +import com.pixelized.rplexicon.utilitary.extentions.string.ARG private const val ROUTE = "search" private const val ARG_ENABLE_LEXICON = "ARG_ENABLE_LEXICON" diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/navigation/screens/ComposableLocationDetail.kt b/app/src/main/java/com/pixelized/rplexicon/ui/navigation/screens/ComposableLocationDetail.kt index 234bb50..3d395f3 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/navigation/screens/ComposableLocationDetail.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/navigation/screens/ComposableLocationDetail.kt @@ -11,7 +11,7 @@ import androidx.navigation.navArgument import com.pixelized.rplexicon.ui.navigation.NavigationAnimation import com.pixelized.rplexicon.ui.navigation.animatedComposable import com.pixelized.rplexicon.ui.screens.location.detail.LocationDetailScreen -import com.pixelized.rplexicon.utilitary.extentions.ARG +import com.pixelized.rplexicon.utilitary.extentions.string.ARG private const val ROUTE = "LocationDetail" private const val ARG_ID = "id" diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/navigation/screens/ComposableQuestDetail.kt b/app/src/main/java/com/pixelized/rplexicon/ui/navigation/screens/ComposableQuestDetail.kt index 794eae4..ca927f6 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/navigation/screens/ComposableQuestDetail.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/navigation/screens/ComposableQuestDetail.kt @@ -11,7 +11,7 @@ import androidx.navigation.navArgument import com.pixelized.rplexicon.ui.navigation.NavigationAnimation import com.pixelized.rplexicon.ui.navigation.animatedComposable import com.pixelized.rplexicon.ui.screens.quest.detail.QuestDetailScreen -import com.pixelized.rplexicon.utilitary.extentions.ARG +import com.pixelized.rplexicon.utilitary.extentions.string.ARG private const val ROUTE = "QuestDetail" private const val ARG_ID = "id" diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/navigation/screens/ComposableSpellDetail.kt b/app/src/main/java/com/pixelized/rplexicon/ui/navigation/screens/ComposableSpellDetail.kt index 46709c2..ec19593 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/navigation/screens/ComposableSpellDetail.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/navigation/screens/ComposableSpellDetail.kt @@ -10,7 +10,7 @@ import androidx.navigation.navArgument import com.pixelized.rplexicon.ui.navigation.NavigationAnimation import com.pixelized.rplexicon.ui.navigation.animatedComposable import com.pixelized.rplexicon.ui.screens.spell.SpellDetailScreen -import com.pixelized.rplexicon.utilitary.extentions.ARG +import com.pixelized.rplexicon.utilitary.extentions.string.ARG private const val ROUTE = "spellDetail" private const val ARG_SPELL = "spell" diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/factory/AttackUioFactory.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/factory/AttackUioFactory.kt index 3314e00..1f60d80 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/factory/AttackUioFactory.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/factory/AttackUioFactory.kt @@ -6,6 +6,7 @@ import com.pixelized.rplexicon.data.model.CharacterSheet import com.pixelized.rplexicon.data.model.Property import com.pixelized.rplexicon.data.model.alteration.Alteration import com.pixelized.rplexicon.ui.screens.character.composable.actions.AttackUio +import com.pixelized.rplexicon.utilitary.extentions.string.attackIcon import com.pixelized.rplexicon.utilitary.extentions.icon import com.pixelized.rplexicon.utilitary.extentions.modifier import com.pixelized.rplexicon.utilitary.extentions.toLabel @@ -74,7 +75,7 @@ class AttackUioFactory @Inject constructor() { return AttackUio( id = attack, - icon = attack.icon, + icon = attack.icon ?: attack.title.attackIcon(), name = attack.title, type = when (attack.type) { Attack.Type.PHYSICAL_MELEE_ATTACK -> R.string.attack_type_melee diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/factory/SkillFactoryUioFactory.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/factory/SkillFactoryUioFactory.kt index 23f8def..ed06492 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/factory/SkillFactoryUioFactory.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/factory/SkillFactoryUioFactory.kt @@ -11,6 +11,7 @@ import com.pixelized.rplexicon.utilitary.extentions.local.base import com.pixelized.rplexicon.utilitary.extentions.local.primary import com.pixelized.rplexicon.utilitary.extentions.local.secondary import com.pixelized.rplexicon.utilitary.extentions.modifier +import com.pixelized.rplexicon.utilitary.extentions.string.skillIcon import com.pixelized.rplexicon.utilitary.extentions.toLabel import javax.inject.Inject @@ -44,7 +45,7 @@ class SkillFactoryUioFactory @Inject constructor( val modifier = effectModifier + effectFlat SkillItemUio( - icon = skill.icon, + icon = skill.icon ?: skill.name.skillIcon(), label = skill.name, translate = description?.original, rest = skill.rest, diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/factory/SpellUioFactory.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/factory/SpellUioFactory.kt index 95aadfd..8c1ed56 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/factory/SpellUioFactory.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/factory/SpellUioFactory.kt @@ -8,6 +8,7 @@ import com.pixelized.rplexicon.data.repository.character.DescriptionRepository import com.pixelized.rplexicon.ui.screens.character.composable.actions.SpellUio import com.pixelized.rplexicon.utilitary.extentions.icon import com.pixelized.rplexicon.utilitary.extentions.modifier +import com.pixelized.rplexicon.utilitary.extentions.string.spellIcon import com.pixelized.rplexicon.utilitary.extentions.toLabel import javax.inject.Inject @@ -95,7 +96,7 @@ class SpellUioFactory @Inject constructor( } } return SpellUio( - icon = assignedSpell.spell.icon, + icon = assignedSpell.spell.icon ?: assignedSpell.spell.name.spellIcon(), school = assignedSpell.spell.school, name = assignedSpell.spell.name, translated = descriptionRepository.getDescription(name = assignedSpell.spell.name)?.original, diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/actions/AttacksViewModel.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/actions/AttacksViewModel.kt index 4ac53ac..612b42f 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/actions/AttacksViewModel.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/actions/AttacksViewModel.kt @@ -20,6 +20,7 @@ import com.pixelized.rplexicon.ui.screens.character.factory.AttackUioFactory import com.pixelized.rplexicon.utilitary.extentions.local.toStatus import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -50,7 +51,7 @@ class AttacksViewModel @Inject constructor( .combine(activeAlterationRepository.getActiveAssignedAlterations(character = character)) { _, alterations -> struct.alterations = alterations.toStatus() } - .collect { + .collectLatest { val (sheet, actions, alterations) = struct if (sheet != null) { val attacks = actions.map { action -> diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/actions/HeaderViewModel.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/actions/HeaderViewModel.kt index 2113363..d7d58fe 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/actions/HeaderViewModel.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/actions/HeaderViewModel.kt @@ -28,6 +28,7 @@ import com.pixelized.rplexicon.utilitary.extentions.local.toStatus import com.pixelized.rplexicon.utilitary.extentions.modifier import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -71,7 +72,7 @@ class HeaderViewModel @Inject constructor( .combine(firebaseRepository.getCharacter(character = character)) { _, fire -> struct.fire = fire } - .collect { + .collectLatest { val (sheet, status, fire) = struct if (sheet != null) { val headerCategories = SheetHeaderData( @@ -99,7 +100,9 @@ class HeaderViewModel @Inject constructor( fireData.value = headerValues } } else { - launch { characterRepository.fetchCharacterSheet() } + launch(context = Dispatchers.Default) { + characterRepository.fetchCharacterSheet() + } } } } diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/actions/ObjectsViewModel.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/actions/ObjectsViewModel.kt index 3894ab5..e5c360e 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/actions/ObjectsViewModel.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/actions/ObjectsViewModel.kt @@ -10,6 +10,7 @@ import com.pixelized.rplexicon.data.repository.character.DescriptionRepository import com.pixelized.rplexicon.data.repository.character.ObjectActionRepository import com.pixelized.rplexicon.ui.navigation.screens.characterSheetArgument import com.pixelized.rplexicon.ui.screens.character.composable.actions.ObjectItemUio +import com.pixelized.rplexicon.utilitary.extentions.string.objectIcon import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -36,7 +37,7 @@ class ObjectsViewModel @Inject constructor( val data = objects[character]?.map { ObjectItemUio( prefix = it.prefix, - icon = it.icon, + icon = it.icon ?: "${it.prefix ?: ""}${it.name}".objectIcon(), name = it.name, original = descriptionRepository.getDescription(name = it.name)?.original, effect = it.effect, diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/actions/SkillsViewModel.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/actions/SkillsViewModel.kt index e5f2d92..5d34ec0 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/actions/SkillsViewModel.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/actions/SkillsViewModel.kt @@ -20,6 +20,7 @@ import com.pixelized.rplexicon.ui.screens.character.composable.actions.SkillItem import com.pixelized.rplexicon.ui.screens.character.factory.SkillFactoryUioFactory import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -58,7 +59,7 @@ class SkillsViewModel @Inject constructor( .combine(firebaseRepository.getCharacter(character = character)) { _, fire -> data.fire = fire } - .collect { + .collectLatest { val (character, fire, values) = data // Filter out passive skills, theses are display in the Proficiency Page. val skills = skillFactory.convert( diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/actions/SpellsViewModel.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/actions/SpellsViewModel.kt index 5d16539..c198d17 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/actions/SpellsViewModel.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/actions/SpellsViewModel.kt @@ -31,6 +31,7 @@ import com.pixelized.rplexicon.utilitary.extentions.modifier import com.pixelized.rplexicon.utilitary.extentions.signLabel import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -71,7 +72,7 @@ class SpellsViewModel @Inject constructor( characterFire = fire struct.also { it.fire = fire } } - .collect { data -> + .collectLatest { data -> val spells = spellBookUseCase.toSpells( character = data.sheets[characterName], fire = data.fire, diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/alteration/AlterationViewModel.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/alteration/AlterationViewModel.kt index d7638bd..263964a 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/alteration/AlterationViewModel.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/character/pages/alteration/AlterationViewModel.kt @@ -23,6 +23,7 @@ import com.pixelized.rplexicon.ui.screens.rolls.factory.AlterationFactory import com.pixelized.rplexicon.utilitary.extentions.context import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -62,7 +63,7 @@ class AlterationViewModel @Inject constructor( .combine(activeAlterationRepository.getActiveAssignedAlterations(character)) { _, actives -> data.actives = actives.associate { it.name to true } } - .collect { + .collectLatest { val (sheet, descriptions, alterations, actives) = data val uio = alterations .groupBy { alteration -> alteration.source } diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/detail/LexiconDetailScreen.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/detail/LexiconDetailScreen.kt index c243677..0e64203 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/detail/LexiconDetailScreen.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/detail/LexiconDetailScreen.kt @@ -62,7 +62,7 @@ import com.pixelized.rplexicon.utilitary.annotate import com.pixelized.rplexicon.utilitary.dropCapRegex import com.pixelized.rplexicon.utilitary.extentions.lexicon import com.pixelized.rplexicon.utilitary.extentions.modifier.scrollOffset -import com.pixelized.rplexicon.utilitary.extentions.searchCriterion +import com.pixelized.rplexicon.utilitary.extentions.string.searchCriterion import com.pixelized.rplexicon.utilitary.highlightRegex import com.pixelized.rplexicon.utilitary.styleWith diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/detail/LocationDetailScreen.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/detail/LocationDetailScreen.kt index 3169950..58541f1 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/detail/LocationDetailScreen.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/detail/LocationDetailScreen.kt @@ -90,7 +90,7 @@ import com.pixelized.rplexicon.utilitary.annotateWithDropCap import com.pixelized.rplexicon.utilitary.dropCapRegex import com.pixelized.rplexicon.utilitary.extentions.lexicon import com.pixelized.rplexicon.utilitary.extentions.modifier.scrollOffset -import com.pixelized.rplexicon.utilitary.extentions.searchCriterion +import com.pixelized.rplexicon.utilitary.extentions.string.searchCriterion import com.pixelized.rplexicon.utilitary.highlightRegex import com.pixelized.rplexicon.utilitary.styleWith import kotlinx.coroutines.CoroutineScope diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/quest/detail/QuestDetailScreen.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/quest/detail/QuestDetailScreen.kt index eac6230..7cf6737 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/quest/detail/QuestDetailScreen.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/quest/detail/QuestDetailScreen.kt @@ -68,7 +68,7 @@ import com.pixelized.rplexicon.utilitary.annotate import com.pixelized.rplexicon.utilitary.dropCapRegex import com.pixelized.rplexicon.utilitary.extentions.lexicon import com.pixelized.rplexicon.utilitary.extentions.modifier.scrollOffset -import com.pixelized.rplexicon.utilitary.extentions.searchCriterion +import com.pixelized.rplexicon.utilitary.extentions.string.searchCriterion import com.pixelized.rplexicon.utilitary.highlightRegex import com.pixelized.rplexicon.utilitary.styleWith diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/rolls/factory/AlterationFactory.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/rolls/factory/AlterationFactory.kt index 567a719..0daa13f 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/rolls/factory/AlterationFactory.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/rolls/factory/AlterationFactory.kt @@ -9,6 +9,7 @@ import com.pixelized.rplexicon.data.repository.character.AlterationRepository import com.pixelized.rplexicon.data.repository.character.SkillRepository import com.pixelized.rplexicon.data.repository.character.SpellRepository import com.pixelized.rplexicon.ui.screens.character.composable.actions.AlterationItemUio +import com.pixelized.rplexicon.utilitary.extentions.string.alterationIcon import kotlinx.coroutines.flow.firstOrNull import javax.inject.Inject @@ -25,7 +26,7 @@ class AlterationFactory @Inject constructor( ): List { return alterations.map { AlterationItemUio( - icon = it.icon, + icon = it.icon ?: it.name.alterationIcon(), label = it.name, source = it.source, subLabel = description[it.name]?.original, diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/search/SearchViewModel.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/search/SearchViewModel.kt index 1288394..ee3b3d8 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/search/SearchViewModel.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/search/SearchViewModel.kt @@ -26,7 +26,7 @@ import com.pixelized.rplexicon.ui.composable.form.TextFieldUio import com.pixelized.rplexicon.ui.navigation.screens.searchArgument import com.pixelized.rplexicon.ui.screens.search.item.SearchItemUio import com.pixelized.rplexicon.utilitary.extentions.lexicon -import com.pixelized.rplexicon.utilitary.extentions.searchCriterion +import com.pixelized.rplexicon.utilitary.extentions.string.searchCriterion import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/spell/SpellDetailScreen.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/spell/SpellDetailScreen.kt index 4fc3589..2abc12f 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/spell/SpellDetailScreen.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/spell/SpellDetailScreen.kt @@ -51,7 +51,7 @@ import com.pixelized.rplexicon.utilitary.annotate import com.pixelized.rplexicon.utilitary.dropCapRegex import com.pixelized.rplexicon.utilitary.extentions.lexicon import com.pixelized.rplexicon.utilitary.extentions.modifier.scrollOffset -import com.pixelized.rplexicon.utilitary.extentions.searchCriterion +import com.pixelized.rplexicon.utilitary.extentions.string.searchCriterion import com.pixelized.rplexicon.utilitary.highlightRegex import com.pixelized.rplexicon.utilitary.styleWith diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/summary/pages/statistic/StatisticViewModel.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/summary/pages/statistic/StatisticViewModel.kt index 01b12f8..365fa69 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/summary/pages/statistic/StatisticViewModel.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/summary/pages/statistic/StatisticViewModel.kt @@ -17,6 +17,7 @@ import com.pixelized.rplexicon.utilitary.extentions.context import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job +import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -43,7 +44,7 @@ class StatisticViewModel @Inject constructor( fun showDetail(dice: ClassHeaderSummaryUio.Dice) { detailJob?.cancel() detailJob = viewModelScope.launch(Dispatchers.IO) { - firebaseRepository.getThrows().collect { + firebaseRepository.getThrows().collectLatest { val card = it.details[dice.characterName]?.let { throws -> throwCardFactory.convert(throws = throws) } diff --git a/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/string/StringEx+Icon.kt b/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/string/StringEx+Icon.kt new file mode 100644 index 0000000..8255486 --- /dev/null +++ b/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/string/StringEx+Icon.kt @@ -0,0 +1,239 @@ +package com.pixelized.rplexicon.utilitary.extentions.string + +import android.net.Uri +import com.pixelized.rplexicon.R +import com.pixelized.rplexicon.utilitary.extentions.uri + +fun String.attackIcon(): Uri? { + return ResourcesCache.attacks[this]?.uri?.toUriOrNull() +} + +fun String.objectIcon(): Uri? { + return ResourcesCache.objects[this]?.uri?.toUriOrNull() +} + +fun String.alterationIcon(): Uri? { + return ResourcesCache.alterations[this]?.uri?.toUriOrNull() +} + +fun String.skillIcon(): Uri? { + return ResourcesCache.skills[this]?.uri?.toUriOrNull() +} + +fun String.spellIcon(): Uri? { + return ResourcesCache.spells[this]?.uri?.toUriOrNull() +} + +private object ResourcesCache { + val alterations = hashMapOf( + "Arme enflammée" to R.drawable.icbg_flaming_blade, + "Critique" to R.drawable.icbg_frenzied_strike, + "Esquiver" to R.drawable.icbg_uncanny_dodge, + "Aspect de la bête" to R.drawable.icbg_aspect_of_the_beast_bear, + "Attaque téméraire" to R.drawable.icbg_reckless_attack, + "Défense sans armure" to R.drawable.icbg_unarmoured_defence_barbarian, + "Instinct sauvage" to R.drawable.icbg_feral_instinct, + "Rage" to R.drawable.icbg_rage_bear_heart, + "Déplacement rapide" to R.drawable.icbg_fast_movement, + "Sens du danger" to R.drawable.icbg_danger_sense, + "Attaques sauvages" to R.drawable.icbg_savage_attacks, + "Dé de supériorité - d6" to R.drawable.icbg_generic_control, + "Dé de supériorité - d8" to R.drawable.icbg_generic_control, + "Inspiration bardique" to R.drawable.icbg_bardic_inspiration, + "Touche à tout" to R.drawable.icbg_jack_of_all_trades, + "Aide" to R.drawable.icbg_aid, + "Assistance" to R.drawable.icbg_guidance, + "Bénédiction" to R.drawable.icbg_bless, + "Discours motivant" to R.drawable.icbg_heroism, + "Frappes épouvantables" to R.drawable.icbg_bolt_of_celestial_light, + "Style de combat: Archerie" to R.drawable.icbg_brace_ranged, + "Volonté astucieuse" to R.drawable.icbg_cutting_words_passive_feature, + "Frappe du zéphyr" to R.drawable.icbg_step_of_the_wind_dash, + "Marque du chasseur" to R.drawable.icbg_hunters_mark, + "Arme magique" to R.drawable.icbg_magic_weapon, + "Passage sans trace" to R.drawable.icbg_pass_without_trace, + "Tireur d'élite" to R.drawable.icbg_crossbow_expert_wounding, + "Forme sauvage : Loup" to R.drawable.icbg_wild_shape_wolf, + "Odorat et ouïe aiguisés" to R.drawable.icbg_wild_shape_wolf, + "Tactique de groupe" to R.drawable.icbg_pack_tactics, + "Forme sauvage : Chat" to R.drawable.icbg_wild_shape_cat, + "Ouïe aiguisés" to R.drawable.icbg_wild_shape_cat, + "Dague" to R.drawable.icbg_dagger_unfaded, + "Hache de guerre en argent" to R.drawable.icbg_battleaxe_plus_one_unfaded, + "Bouclier" to R.drawable.icbg_studded_shield_unfaded, + "Cape de protection" to R.drawable.icbg_cloak_of_protection_unfaded, + "Armure d'écailles" to R.drawable.icbg_scale_mail_unfaded, + "Armure de cuir" to R.drawable.icbg_leather_armour_rogue_unfaded, + "Avantage" to R.drawable.ic_advantage, + "Désavantage" to R.drawable.ic_disadvantage, + "Emphase" to R.drawable.ic_emphase, + "Touché par le néant" to R.drawable.icbg_partial_ceremorphosis, + "Amateurisme retrouvé" to R.drawable.icbg_iron_mind, + "Morsure de vampire" to R.drawable.icbg_bite, + "Abri (partiel)" to R.drawable.icbg_patient_defence, + "Abri (important)" to R.drawable.icbg_multiattack_defense, + "Abri (total)" to R.drawable.icbg_protection_from_missiles, + ) + + val attacks = hashMapOf( + "Hache de guerre en argent" to R.drawable.icbg_reckless_attack, + "Hache de guerre en argent (2 mains)" to R.drawable.icbg_reckless_attack, + "Dague" to R.drawable.icbg_main_hand_attack, + "Masse d'armes" to R.drawable.icbg_main_hand_attack, + "Attaque à mains nues" to R.drawable.icbg_unarmed_strike, + "Arme improvisée" to R.drawable.icbg_improvised_melee_weapon, + "Lancé de javelot" to R.drawable.icbg_throw_weapon, + "Lancé de dague" to R.drawable.icbg_throw_weapon, + "Masse d'armes" to R.drawable.icbg_main_hand_attack, + "Arme improvisée" to R.drawable.icbg_improvised_melee_weapon, + "Epée courte argentée" to R.drawable.icbg_main_hand_attack, + "Epée courte (main gauche)" to R.drawable.icbg_off_hand_attack_melee, + "Arc long" to R.drawable.icbg_ranged_attack, + "Arme improvisée" to R.drawable.icbg_improvised_melee_weapon, + "Morsure" to R.drawable.icbg_bite_wolf, + "Griffer" to R.drawable.icbg_claws_cat, + "Dague" to R.drawable.icbg_main_hand_attack, + "Dague (main gauche)" to R.drawable.icbg_off_hand_attack_melee, + "Arbalète légère" to R.drawable.icbg_ranged_attack, + "Arme improvisée" to R.drawable.icbg_improvised_melee_weapon, + "Rapière" to R.drawable.icbg_main_hand_attack, + "Épée courte (main gauche)" to R.drawable.icbg_off_hand_attack_melee, + "Arme improvisée" to R.drawable.icbg_improvised_melee_weapon, + "Arbalète légère" to R.drawable.icbg_ranged_attack, + "Arbalète de poing" to R.drawable.icbg_ranged_attack, + "Arbalète de poing (main gauche)" to R.drawable.icbg_off_hand_attack_ranged, + ) + + val objects = hashMapOf( + "Parchemin de Bénédiction" to R.drawable.icbg_scroll_of_bless_unfaded, + "Parchemin d'Arme spirituelle" to R.drawable.icbg_book_signedtradebisa_unfaded, + "Potion de guérison" to R.drawable.icbg_pot_potion_of_healing_unfaded, + "Eau bénite" to R.drawable.icbg_grn_holy_water_unfaded, + "Baies nourricières" to R.drawable.icbg_food_goodberry_unfaded, + ) + + val skills = hashMapOf( + "Dé de vie (Barbare)" to R.drawable.icbg_bolstering_magic_boon, + "Dé de vie (Guerrier)" to R.drawable.icbg_bolstering_magic_boon, + "Dé de vie (Rodeur)" to R.drawable.icbg_bolstering_magic_boon, + "Dé de vie (Druide)" to R.drawable.icbg_bolstering_magic_boon, + "Dé de vie" to R.drawable.icbg_bolstering_magic_boon, + "Inspiration" to R.drawable.icbg_indomitable, + "Touché par le néant" to R.drawable.icbg_partial_ceremorphosis, + "C'était inévitable" to R.drawable.icbg_ancient_grudges, + "Rage" to R.drawable.icbg_rage_bear_heart, + "Endurance implacable" to R.drawable.icbg_relentless_endurance, + "Vision dans le noir (Orc)" to R.drawable.icbg_darkvision, + "Menaçant" to R.drawable.icbg_intimidating_presence, + "Attaques sauvages" to R.drawable.icbg_savage_attacks, + "Défense sans armure" to R.drawable.icbg_unarmoured_defence_barbarian, + "Sens du danger" to R.drawable.icbg_danger_sense, + "Second souffle" to R.drawable.icbg_second_wind, + "Technique supérieur" to R.drawable.icbg_wild_magic_teleport_activate_barbarian, + "Dé de supériorité - d6" to R.drawable.icbg_generic_control, + "Croc-en-jambe" to R.drawable.icbg_trip_attack_melee, + "Conduit divin" to R.drawable.icbg_divine_intervention_sunder_the_heretical, + "Illumination protectrice" to R.drawable.icbg_warding_bond_icon, + "Renvoi des morts-vivants" to R.drawable.icbg_turn_undead, + "Radiance de l'aube" to R.drawable.icbg_break_of_dawn, + "Forme sauvage" to R.drawable.icbg_wild_shape, + "Ennemi juré" to R.drawable.icbg_mortal_reminder, + "Explorateur né" to R.drawable.icbg_forest, + "Ascendance féerique" to R.drawable.icbg_draconic_ancestry_copper_acid, + "Cachette naturelle" to R.drawable.icbg_naturally_stealthy, + "Vigilance primitive (variante)" to R.drawable.icbg_bestial_fury, + "Vision dans le noir (Elfe)" to R.drawable.icbg_darkvision, + "Transe" to R.drawable.icbg_focused_conjuration, + "Attaque supplémentaire" to R.drawable.icbg_extra_attack, + "Apanage de la Noblesse" to R.drawable.icbg_natures_ward, + "Druidique" to R.drawable.icbg_class_druid_badge, + "Appel de familier" to R.drawable.icbg_find_familiar_cat, + "Détection de la magie" to R.drawable.icbg_generic_psychic, + "Vision dans le noir (Tieffelin)" to R.drawable.icbg_darkvision, + "Résistance infernale." to R.drawable.icbg_hellish_resistance, + "Ascendance infernale" to R.drawable.icbg_draconic_ancestry_brass_fire, + "Décharge déchirante" to R.drawable.icbg_agonising_blast, + "Vision occulte" to R.drawable.icbg_generic_psychic, + "Sombre présage" to R.drawable.icbg_hex_charisma, + "Malédiction" to R.drawable.icbg_hex_charisma, + "Ténèbres" to R.drawable.icbg_darkvision_spell, + "Représailles infernales" to R.drawable.icbg_hellish_rebuke, + "Inspiration" to R.drawable.icbg_indomitable, + "Inspiration bardique" to R.drawable.icbg_bardic_inspiration, + "Représentation envoûtante" to R.drawable.icbg_psionic_suggestion_hush, + "Apparence inspirante" to R.drawable.icbg_magic_initiate_bard, + "Chant reposant" to R.drawable.icbg_song_of_rest, + "Fléau" to R.drawable.icbg_bane_spell, + "Foulée brumeuse" to R.drawable.icbg_misty_step, + "Amateurisme retrouvé" to R.drawable.icbg_iron_mind, + "Vision dans le noir (Elfe)" to R.drawable.icbg_darkvision, + "Ascendance féerique" to R.drawable.icbg_draconic_ancestry_copper_acid, + "Source d'inspiration" to R.drawable.icbg_bardic_defence, + "Touche à tout" to R.drawable.icbg_jack_of_all_trades, + ) + + val spells = hashMapOf( + "Aide" to R.drawable.icbg_aid, + "Alarme" to R.drawable.icbg_command_halt, + "Appel de familier" to R.drawable.icbg_find_familiar_cat, + "Arme spirituelle" to R.drawable.icbg_spiritual_weapon_maul, + "Armure d'Agathys" to R.drawable.icbg_armour_of_agathys, + "Assistance" to R.drawable.icbg_guidance, + "Bénédiction" to R.drawable.icbg_bless, + "Charme-personne" to R.drawable.icbg_charm_person, + "Communication avec les animaux" to R.drawable.icbg_speak_with_animals, + "Contact glacial" to R.drawable.icbg_bone_chill, + "Décharge occulte" to R.drawable.icbg_eldritch_blast, + "Détection de la magie" to R.drawable.icbg_generic_psychic, + "Espièglerie de Nathair" to R.drawable.icbg_tashas_hideous_laughter, + "Esprits gardiens" to R.drawable.icbg_spirit_guardians, + "Flamme sacrée" to R.drawable.icbg_sacred_flame, + "Fléau" to R.drawable.icbg_bane_spell, + "Foulée brumeuse" to R.drawable.icbg_misty_step, + "Frappe du zéphyr" to R.drawable.icbg_step_of_the_wind_dash, + "Illusion mineure" to R.drawable.icbg_minor_illusion, + "Image silencieuse" to R.drawable.icbg_blink, + "Immobilisation de personne" to R.drawable.icbg_hold_person, + "Injonction" to R.drawable.icbg_command_flee, + "Invisibilité" to R.drawable.icbg_invisibility, + "Lueurs féeriques" to R.drawable.icbg_faerie_fire, + "Lumière" to R.drawable.icbg_light, + "Main de mage" to R.drawable.icbg_mage_hand, + "Mains brûlantes" to R.drawable.icbg_burning_hands, + "Marque du chasseur" to R.drawable.icbg_hunters_mark, + "Message" to R.drawable.icbg_levitate, + "Moquerie cruelle" to R.drawable.icbg_vicious_mockery, + "Nuée de dagues" to R.drawable.icbg_cloud_of_daggers, + "Prière de guérison" to R.drawable.icbg_prayer_of_healing, + "Rayon ardent" to R.drawable.icbg_scorching_ray, + "Restauration partielle" to R.drawable.icbg_lesser_restoration, + "Sanctuaire" to R.drawable.icbg_sanctuary, + "Sens animal" to R.drawable.icbg_animal_friendship, + "Silence" to R.drawable.icbg_silence, + "Soins" to R.drawable.icbg_cure_wounds, + "Sommeil" to R.drawable.icbg_sleep, + "Sphère de feu" to R.drawable.icbg_flaming_sphere, + "Stabilisation" to R.drawable.icbg_help, + "Suggestion" to R.drawable.icbg_command_approach, + "Thaumaturgie" to R.drawable.icbg_thaumaturgy, + "Vague tonnante" to R.drawable.icbg_thunderwave, + "Passage sans trace" to R.drawable.icbg_pass_without_trace, + "Croissance d'épines" to R.drawable.icbg_spike_growth, + "Arme magique" to R.drawable.icbg_magic_weapon, + "Baies nourricières" to R.drawable.icbg_goodberry, + "Frappe piègeuse" to R.drawable.icbg_ensnaring_strike_ranged, + "Petite hutte de Léomund" to R.drawable.icbg_globe_of_invulnerability, + "Communication avec les plantes" to R.drawable.icbg_plant_growth, + "Boule de feu" to R.drawable.icbg_fireball, + "Lumière du jour" to R.drawable.icbg_daylight_sphere, + "Aura de vitalité" to R.drawable.icbg_healing_radiance, + "Malédiction" to R.drawable.icbg_hex_charisma, + "Toucher du vampire" to R.drawable.icbg_vampiric_touch, + "Amis" to R.drawable.icbg_friends, + "Discours motivant" to R.drawable.icbg_heroism, + "Ténèbres" to R.drawable.icbg_darkvision_spell, + "Représailles infernales" to R.drawable.icbg_hellish_rebuke, + "Mot de guérison" to R.drawable.icbg_healing_word, + "Façonnage de l'eau" to R.drawable.icbg_create_water, + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/StringEx.kt b/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/string/StringEx.kt similarity index 92% rename from app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/StringEx.kt rename to app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/string/StringEx.kt index 73c4a39..17ab238 100644 --- a/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/StringEx.kt +++ b/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/string/StringEx.kt @@ -1,4 +1,4 @@ -package com.pixelized.rplexicon.utilitary.extentions +package com.pixelized.rplexicon.utilitary.extentions.string import android.net.Uri import androidx.compose.runtime.Stable diff --git a/app/src/main/res/drawable/ic_advantage.webp b/app/src/main/res/drawable/ic_advantage.webp new file mode 100644 index 0000000..f4919b9 Binary files /dev/null and b/app/src/main/res/drawable/ic_advantage.webp differ diff --git a/app/src/main/res/drawable/ic_class_bard_24.xml b/app/src/main/res/drawable/ic_class_bard_24.xml index c944854..643eb8c 100644 --- a/app/src/main/res/drawable/ic_class_bard_24.xml +++ b/app/src/main/res/drawable/ic_class_bard_24.xml @@ -1,3 +1,4 @@ +