diff --git a/app/src/main/java/com/pixelized/rplexicon/model/Quest.kt b/app/src/main/java/com/pixelized/rplexicon/model/Quest.kt index 56ef3a8..e61757d 100644 --- a/app/src/main/java/com/pixelized/rplexicon/model/Quest.kt +++ b/app/src/main/java/com/pixelized/rplexicon/model/Quest.kt @@ -21,5 +21,6 @@ data class QuestEntry( val groupReward: String?, val individualReward: String?, val description: String, + val images: List, val background: Uri?, ) \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/repository/data/lexicon/QuestRepository.kt b/app/src/main/java/com/pixelized/rplexicon/repository/data/lexicon/QuestRepository.kt index d66e2f5..591d9cf 100644 --- a/app/src/main/java/com/pixelized/rplexicon/repository/data/lexicon/QuestRepository.kt +++ b/app/src/main/java/com/pixelized/rplexicon/repository/data/lexicon/QuestRepository.kt @@ -37,7 +37,6 @@ class QuestRepository @Inject constructor( private suspend fun updateData(data: ValueRange) { val questEntries = questParser.parse(value = data) val questMap = questEntries.groupBy { it.title } - val quests = questMap.keys.mapIndexed { index, item -> Quest( id = index, diff --git a/app/src/main/java/com/pixelized/rplexicon/repository/parser/QuestParser.kt b/app/src/main/java/com/pixelized/rplexicon/repository/parser/QuestParser.kt index d2cf969..e65dc7c 100644 --- a/app/src/main/java/com/pixelized/rplexicon/repository/parser/QuestParser.kt +++ b/app/src/main/java/com/pixelized/rplexicon/repository/parser/QuestParser.kt @@ -3,79 +3,66 @@ package com.pixelized.rplexicon.repository.parser import com.google.api.services.sheets.v4.model.ValueRange import com.pixelized.rplexicon.model.QuestEntry -import com.pixelized.rplexicon.utilitary.extentions.local.checkSheetStructure -import com.pixelized.rplexicon.utilitary.extentions.sheet -import com.pixelized.rplexicon.utilitary.extentions.toUriOrNull import javax.inject.Inject -class QuestParser @Inject constructor() { - - fun parse(value: ValueRange): List { - val sheet = value.values.sheet() - lateinit var structure: Map - - return sheet?.mapIndexedNotNull { index, item -> - when { - index == 0 -> { - structure = item.checkSheetStructure(model = COLUMNS) - null - } - - item is List<*> -> { - val title = item.getOrNull(structure.title) as? String - val subtitle = item.getOrNull(structure.subtitle) as? String? - val complete = item.getOrNull(structure.complete) as? String? - val questGiver = item.getOrNull(structure.questGiver) as? String? - val area = item.getOrNull(structure.area) as? String? - val groupReward = item.getOrNull(structure.groupReward) as? String? - val individualReward = item.getOrNull(structure.individualReward) as? String? - val description = item.getOrNull(structure.description) as? String - val background = item.getOrNull(structure.background) as? String? +class QuestParser @Inject constructor( + private val imageParser: PortraitParser +) { + fun parse(value: ValueRange): List = parserScope { + val quest = mutableListOf() + value.forEachRow { index, item -> + when (index) { + 0 -> updateStructure(row = item, columns = COLUMNS) + else -> { + val title = item.parse(TITLE) + val description = item.parse(DESCRIPTION) if (title?.isNotEmpty() == true && description?.isNotEmpty() == true) { - QuestEntry( + val entry = QuestEntry( sheetIndex = index, title = title, - subtitle = subtitle?.takeIf { it.isNotBlank() }, - complete = complete.equals("TRUE", ignoreCase = true), - questGiver = questGiver?.takeIf { it.isNotBlank() }, - area = area?.takeIf { it.isNotBlank() }, - groupReward = groupReward?.takeIf { it.isNotBlank() }, - individualReward = individualReward?.takeIf { it.isNotBlank() }, + subtitle = item.parse(SUB_TITLE), + complete = item.parseBool(COMPLETED) ?: false, + questGiver = item.parse(QUEST_GIVER), + area = item.parse(AREA), + groupReward = item.parse(GROUP_REWARD), + individualReward = item.parse(INDIVIDUAL_REWARD), description = description, - background = background?.toUriOrNull(), + images = imageParser.parse(item.parse(IMAGE)), + background = item.parseUri(BACKGROUND), ) - } else { - null + quest.add(entry) } } - - else -> null } - } ?: emptyList() + } + + quest } - private val Map.title: Int get() = getValue(COLUMNS[0]) - private val Map.subtitle: Int get() = getValue(COLUMNS[1]) - private val Map.complete: Int get() = getValue(COLUMNS[2]) - private val Map.questGiver: Int get() = getValue(COLUMNS[3]) - private val Map.area: Int get() = getValue(COLUMNS[4]) - private val Map.groupReward: Int get() = getValue(COLUMNS[5]) - private val Map.individualReward: Int get() = getValue(COLUMNS[6]) - private val Map.description: Int get() = getValue(COLUMNS[7]) - private val Map.background: Int get() = getValue(COLUMNS[8]) - companion object { + private const val TITLE = "Titre" + private const val SUB_TITLE = "Sous Titre" + private const val COMPLETED = "Compléter" + private const val QUEST_GIVER = "Commanditaire" + private const val AREA = "Lieu" + private const val GROUP_REWARD = "Récompense de groupe" + private const val INDIVIDUAL_REWARD = "Récompense individuelle" + private const val DESCRIPTION = "Description" + private const val IMAGE = "Image" + private const val BACKGROUND = "fond" // TODO + private val COLUMNS = listOf( - "Titre", - "Sous Titre", - "Compléter", - "Commanditaire", - "Lieu", - "Récompense de groupe", - "Récompense individuelle", - "Description", - "fond" + TITLE, + SUB_TITLE, + COMPLETED, + QUEST_GIVER, + AREA, + GROUP_REWARD, + INDIVIDUAL_REWARD, + DESCRIPTION, + IMAGE, + BACKGROUND, ) } } \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/repository/parser/SheetParserScope.kt b/app/src/main/java/com/pixelized/rplexicon/repository/parser/SheetParserScope.kt index b02ad1d..55230f3 100644 --- a/app/src/main/java/com/pixelized/rplexicon/repository/parser/SheetParserScope.kt +++ b/app/src/main/java/com/pixelized/rplexicon/repository/parser/SheetParserScope.kt @@ -1,5 +1,7 @@ package com.pixelized.rplexicon.repository.parser +import android.net.Uri +import androidx.core.net.toUri import com.google.api.services.sheets.v4.model.ValueRange import com.pixelized.rplexicon.utilitary.extentions.local.checkSheetStructure import com.pixelized.rplexicon.utilitary.extentions.sheet @@ -34,4 +36,10 @@ class SheetParserScope { fun List<*>.parseInt(column: String): Int? = parse(column)?.toIntOrNull() + + fun List<*>.parseBool(column: String): Boolean? = + parse(column)?.equals("TRUE", ignoreCase = true) + + fun List<*>.parseUri(column: String): Uri? = + parse(column)?.takeIf { it.isNotBlank() }?.toUri() } \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/detail/LocationDetail.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/detail/LocationDetail.kt index 50cb690..4e132ae 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/detail/LocationDetail.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/location/detail/LocationDetail.kt @@ -368,16 +368,6 @@ private fun LocationContent( style = MaterialTheme.typography.headlineSmall, text = item.value.name, ) - Image( - modifier = Modifier - .height(24.dp) - .graphicsLayer { rotationZ = 180f }, - painter = painterResource(id = R.drawable.art_divider_1), - contentScale = ContentScale.FillWidth, - alignment = Alignment.Center, - colorFilter = ColorFilter.tint(color = MaterialTheme.colorScheme.onSurface), - contentDescription = null, - ) } HorizontalPager( 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 1782b6c..dbc1c77 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 @@ -2,18 +2,19 @@ package com.pixelized.rplexicon.ui.screens.quest.detail import android.content.res.Configuration import android.net.Uri -import androidx.compose.foundation.Image import androidx.compose.foundation.ScrollState import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyRow +import androidx.compose.foundation.lazy.items import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.ExperimentalMaterial3Api @@ -28,18 +29,14 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.Stable import androidx.compose.runtime.State import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.rotate import androidx.compose.ui.draw.shadow import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.ColorFilter -import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow @@ -49,16 +46,19 @@ import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import com.pixelized.rplexicon.R +import com.pixelized.rplexicon.ui.composable.AsyncImage import com.pixelized.rplexicon.ui.composable.BackgroundImage +import com.pixelized.rplexicon.ui.composable.FullScreenImageHandler +import com.pixelized.rplexicon.ui.composable.FullScreenImageViewModel import com.pixelized.rplexicon.ui.navigation.LocalScreenNavHost import com.pixelized.rplexicon.ui.navigation.screens.navigateToLexiconDetail import com.pixelized.rplexicon.ui.navigation.screens.navigateToLocationDetail import com.pixelized.rplexicon.ui.theme.LexiconTheme import com.pixelized.rplexicon.utilitary.LOS_FULL import com.pixelized.rplexicon.utilitary.LOS_HOLLOW +import com.pixelized.rplexicon.utilitary.extentions.annotateWithDropCap import com.pixelized.rplexicon.utilitary.extentions.lexicon import com.pixelized.rplexicon.utilitary.extentions.scrollOffset -import java.lang.Integer.min @Stable data class QuestDetailUio( @@ -70,82 +70,22 @@ data class QuestDetailUio( ) { @Stable data class QuestStep( - val subtitle: String?, + val subtitle: String? = null, val giverId: Int? = null, - val giver: String?, + val giver: String? = null, val placeId: Int? = null, - val place: String?, - val globalReward: String?, - val individualReward: String?, + val place: String? = null, + val globalReward: String? = null, + val individualReward: String? = null, + val images: List = emptyList(), val description: String, ) } -@Stable -data class AnnotatedQuestDetailUio( - val title: String, - val completed: Boolean, - val background: Uri?, - val steps: List, -) { - @Stable - data class AnnotatedQuestStep( - val subtitle: String?, - val giverId: Int?, - val giver: String?, - val placeId: Int?, - val place: String?, - val individualReward: String?, - val globalReward: String?, - val description: AnnotatedString, - ) -} - -@Composable -@Stable -private fun QuestDetailUio.annotate(): AnnotatedQuestDetailUio { - val annotatedSteps = steps.map { it.annotate() } - return remember { - AnnotatedQuestDetailUio( - completed = completed, - title = title, - background = background, - steps = annotatedSteps, - ) - } -} - -@Composable -@Stable -private fun QuestDetailUio.QuestStep.annotate(): AnnotatedQuestDetailUio.AnnotatedQuestStep { - val typography = MaterialTheme.lexicon.typography - - return remember { - AnnotatedQuestDetailUio.AnnotatedQuestStep( - subtitle = subtitle, - giverId = giverId, - giver = giver, - placeId = placeId, - place = place, - globalReward = globalReward, - individualReward = individualReward, - description = AnnotatedString( - text = description, - spanStyles = listOf( - AnnotatedString.Range( - item = typography.bodyDropCapSpan, - start = 0, - end = min(1, description.length), - ) - ) - ), - ) - } -} - @Composable fun QuestDetailScreen( viewModel: QuestDetailViewModel = hiltViewModel(), + imageViewModel: FullScreenImageViewModel = hiltViewModel(), ) { val screen = LocalScreenNavHost.current @@ -156,6 +96,11 @@ fun QuestDetailScreen( onBack = { screen.popBackStack() }, onGiver = { screen.navigateToLexiconDetail(id = it) }, onLocation = { screen.navigateToLocationDetail(id = it) }, + onImage = { imageViewModel.showDetail(it) } + ) + + FullScreenImageHandler( + viewModel = imageViewModel, ) } } @@ -169,8 +114,9 @@ private fun QuestDetailContent( onBack: () -> Unit, onGiver: (Int) -> Unit, onLocation: (Int) -> Unit, + onImage: (Uri) -> Unit, ) { - val annotatedQuest = item.value.annotate() + val quest = item.value Scaffold( modifier = modifier, @@ -203,9 +149,9 @@ private fun QuestDetailContent( ) { BackgroundImage( modifier = Modifier.matchParentSize(), - model = annotatedQuest.background, + model = quest.background, ) - if (annotatedQuest.completed) { + if (quest.completed) { Text( modifier = Modifier .align(Alignment.TopEnd) @@ -213,7 +159,7 @@ private fun QuestDetailContent( .rotate(degrees = 12f), style = MaterialTheme.lexicon.typography.stamp, color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.35f), - text = "Completed", + text = stringResource(id = R.string.quest_detail_completed), ) } } @@ -221,80 +167,55 @@ private fun QuestDetailContent( modifier = Modifier .verticalScroll(state) .padding( - top = when (annotatedQuest.background) { - null -> 16.dp + top = when { + quest.background == null && quest.completed -> 96.dp + quest.background == null -> 16.dp else -> MaterialTheme.lexicon.dimens.detailPadding }, - end = 16.dp, bottom = 16.dp, - start = 16.dp, ), + verticalArrangement = Arrangement.spacedBy(space = 16.dp), ) { - Column { - Text( - modifier = Modifier.fillMaxWidth(), - textAlign = TextAlign.Center, - style = MaterialTheme.typography.displaySmall, - text = annotatedQuest.title, - ) - Image( - modifier = Modifier - .height(24.dp) - .graphicsLayer { rotationZ = 180f } - .align(Alignment.CenterHorizontally), - painter = painterResource(id = R.drawable.art_divider_1), - contentScale = ContentScale.FillWidth, - alignment = Alignment.Center, - colorFilter = ColorFilter.tint(color = MaterialTheme.colorScheme.onSurface), - contentDescription = null, - ) - } + Text( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp) + .padding(bottom = 16.dp), + textAlign = TextAlign.Center, + style = MaterialTheme.typography.headlineLarge, + text = quest.title.annotateWithDropCap( + style = MaterialTheme.lexicon.typography.headlineLargeDropCap, + ), + ) - annotatedQuest.steps.forEach { quest -> + quest.steps.forEach { quest -> Column( - verticalArrangement = Arrangement.spacedBy(16.dp), + verticalArrangement = Arrangement.spacedBy(8.dp), ) { quest.subtitle?.let { subtitle -> - Row( + Text( modifier = Modifier - .fillMaxWidth() - .padding(top = 64.dp), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.Center, - ) { - Image( - modifier = Modifier.graphicsLayer { rotationY = 180f }, - painter = painterResource(id = R.drawable.art_clip_1), - contentScale = ContentScale.FillWidth, - alignment = Alignment.Center, - colorFilter = ColorFilter.tint(color = MaterialTheme.colorScheme.onSurface), - contentDescription = null, - ) - Text( - modifier = Modifier - .weight(weight = 1f, fill = false) - .padding(horizontal = 8.dp), - style = MaterialTheme.typography.titleLarge, - textAlign = TextAlign.Center, - overflow = TextOverflow.Ellipsis, - maxLines = 3, - text = subtitle, - ) - Image( - painter = painterResource(id = R.drawable.art_clip_1), - contentScale = ContentScale.FillWidth, - alignment = Alignment.Center, - colorFilter = ColorFilter.tint(color = MaterialTheme.colorScheme.onSurface), - contentDescription = null, - ) - } + .padding(horizontal = 16.dp) + .padding(top = 16.dp), + style = MaterialTheme.typography.titleLarge, + textAlign = TextAlign.Center, + overflow = TextOverflow.Ellipsis, + maxLines = 3, + text = subtitle.annotateWithDropCap( + style = MaterialTheme.lexicon.typography.titleLargeDropCap, + ), + ) } + quest.giver?.let { Column( - modifier = Modifier.clickable( - enabled = quest.giverId != null, - onClick = { quest.giverId?.let { onGiver(it) } } - ) + modifier = Modifier + .fillMaxWidth() + .clickable( + enabled = quest.giverId != null, + onClick = { quest.giverId?.let { onGiver(it) } } + ) + .padding(horizontal = 16.dp) ) { Text( style = MaterialTheme.typography.titleMedium, @@ -310,12 +231,16 @@ private fun QuestDetailContent( ) } } + quest.place?.let { Column( - modifier = Modifier.clickable( - enabled = quest.placeId != null, - onClick = { quest.placeId?.let { onLocation(it) } } - ) + modifier = Modifier + .fillMaxWidth() + .clickable( + enabled = quest.placeId != null, + onClick = { quest.placeId?.let { onLocation(it) } } + ) + .padding(horizontal = 16.dp), ) { Text( style = MaterialTheme.typography.titleMedium, @@ -331,8 +256,11 @@ private fun QuestDetailContent( ) } } + quest.globalReward?.let { - Column { + Column( + modifier = Modifier.padding(horizontal = 16.dp), + ) { Text( style = MaterialTheme.typography.titleMedium, fontWeight = FontWeight.Bold, @@ -340,12 +268,15 @@ private fun QuestDetailContent( ) Text( style = MaterialTheme.typography.bodyMedium, - text = it, + text = "$LOS_HOLLOW $it", ) } } + quest.individualReward?.let { - Column { + Column( + modifier = Modifier.padding(horizontal = 16.dp), + ) { Text( style = MaterialTheme.typography.titleMedium, fontWeight = FontWeight.Bold, @@ -353,15 +284,35 @@ private fun QuestDetailContent( ) Text( style = MaterialTheme.typography.bodyMedium, - text = it, + text = "$LOS_HOLLOW $it", ) } } Text( + modifier = Modifier.padding(horizontal = 16.dp), style = MaterialTheme.typography.bodyMedium, - text = quest.description, + text = quest.description.annotateWithDropCap( + style = MaterialTheme.lexicon.typography.bodyMediumDropCap, + ), ) + + if (quest.images.isNotEmpty()) { + LazyRow( + contentPadding = PaddingValues(horizontal = 16.dp), + horizontalArrangement = Arrangement.spacedBy(8.dp), + ) { + items(items = quest.images) { + AsyncImage( + modifier = Modifier + .clickable { onImage(it) } + .height(height = 160.dp), + contentScale = ContentScale.FillHeight, + model = it, + ) + } + } + } } } } @@ -383,6 +334,7 @@ private fun QuestDetailPreview( onBack = { }, onGiver = { }, onLocation = { }, + onImage = { }, ) } } @@ -402,15 +354,11 @@ private class QuestDetailPreviewProvider : PreviewParameterProvider - _items.value = items.map { item -> - QuestItemUio( - id = item.id, - title = item.title, - complete = item.entries.all { it.complete }, - ) - }.sortedBy { it.title } + val quest = items + .map { item -> + QuestItemUio( + id = item.id, + title = item.title, + complete = item.entries.all { it.complete }, + ) + } + .sortedBy { it.title } + .sortedBy { it.complete } + + withContext(Dispatchers.Main) { + _items.value = quest + } } } - launch { + launch(Dispatchers.IO) { update(force = false) } } } suspend fun update(force: Boolean) { - _isLoading.value = true + withContext(context = Dispatchers.Main) { + _isLoading.value = true + } try { if (force || repository.lastSuccessFullUpdate.shouldUpdate()) { repository.fetchQuests() @@ -64,9 +75,11 @@ class QuestListViewModel @Inject constructor( Log.e(TAG, exception.message, exception) _error.emit(FetchErrorUio.Default) } - // clean the laoding state + // clean the loading state finally { - _isLoading.value = false + withContext(context = Dispatchers.Main) { + _isLoading.value = false + } } } diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/theme/dimen/LexiconDimens.kt b/app/src/main/java/com/pixelized/rplexicon/ui/theme/dimen/LexiconDimens.kt index ad9308d..6ea9967 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/theme/dimen/LexiconDimens.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/theme/dimen/LexiconDimens.kt @@ -39,7 +39,7 @@ data class LexiconDimens( fun lexiconDimen( density: Density, itemHeight: Dp = 52.dp, - detailPadding: Dp = 248.dp, + detailPadding: Dp = 320.dp, itemListPadding: PaddingValues = PaddingValues( top = 8.dp, bottom = 8.dp + 16.dp + 56.dp + 16.dp, diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/theme/typography/LexiconTypography.kt b/app/src/main/java/com/pixelized/rplexicon/ui/theme/typography/LexiconTypography.kt index a1d23ce..bac1e13 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/theme/typography/LexiconTypography.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/theme/typography/LexiconTypography.kt @@ -28,18 +28,43 @@ class LexiconTypography( val stamp: TextStyle = base.headlineLarge.copy( fontFamily = stampFontFamily, ), + @Deprecated("") val bodyDropCap: TextStyle = base.headlineLarge.copy( fontFamily = zallFontFamily, baselineShift = BaselineShift(-0.1f), letterSpacing = (-3).sp ), + @Deprecated("") val titleDropCap: TextStyle = base.displayMedium.copy( fontFamily = zallFontFamily, baselineShift = BaselineShift(-0.1f), letterSpacing = (-4).sp ), + @Deprecated("") val bodyDropCapSpan: SpanStyle = bodyDropCap.toSpanStyle(), + @Deprecated("") val titleDropCapSpan: SpanStyle = titleDropCap.toSpanStyle(), + + val bodyMediumDropCap: SpanStyle = base.bodyMedium.toDropCapSpan( + sizeRatio = 1.8f, + ), + + val titleLargeDropCap: SpanStyle = base.titleLarge.toDropCapSpan( + sizeRatio = 1.4f, + ), + + val headlineLargeDropCap: SpanStyle = base.headlineLarge.toDropCapSpan( + sizeRatio = 1.2f, + ), ) +private fun TextStyle.toDropCapSpan( + sizeRatio : Float, +): SpanStyle { + return copy( + fontFamily = zallFontFamily, + fontSize = fontSize * sizeRatio, + ).toSpanStyle() +} + fun lexiconTypography() = LexiconTypography() \ No newline at end of file diff --git a/app/src/main/res/drawable/art_clip_1.xml b/app/src/main/res/drawable/art_clip_1.xml deleted file mode 100644 index 480a2ee..0000000 --- a/app/src/main/res/drawable/art_clip_1.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/art_divider_1.xml b/app/src/main/res/drawable/art_divider_1.xml deleted file mode 100644 index 9fbbdc5..0000000 --- a/app/src/main/res/drawable/art_divider_1.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 3db528f..2b19304 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -78,6 +78,7 @@ Mots clés : Détails de quête + Complétée Commanditaire : Lieu : Récompense individuelle : diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1bdf2e6..db5cbeb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -78,6 +78,7 @@ Tags: Quest details + Completed Quest giver: Area: Individual reward: