Skip to content

Commit

Permalink
Add realm save for validity period, downloads limit and email language
Browse files Browse the repository at this point in the history
  • Loading branch information
tevincent committed Aug 27, 2024
1 parent 3801e50 commit aa85023
Show file tree
Hide file tree
Showing 7 changed files with 117 additions and 35 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ fun MainNavHost(
navController: NavHostController,
windowAdaptiveInfo: WindowAdaptiveInfo,
currentDestination: MainNavigation,
isBarNavigation: Boolean
) {
NavHost(
navController = navController,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,13 @@ import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Surface
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import com.infomaniak.multiplatform_swisstransfer.common.models.DownloadLimit
import com.infomaniak.swisstransfer.R
import com.infomaniak.swisstransfer.ui.components.SwissTransferTobAppBar
import com.infomaniak.swisstransfer.ui.components.TopAppBarButton
Expand All @@ -39,7 +42,11 @@ import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme
import com.infomaniak.swisstransfer.ui.utils.PreviewMobile

@Composable
fun SettingsDownloadsLimitScreen(navigateBack: (() -> Unit)?) {
fun SettingsDownloadsLimitScreen(
downloadLimit: DownloadLimit,
navigateBack: (() -> Unit)?,
onDownloadLimitChange: (DownloadLimit) -> Unit
) {
Scaffold(topBar = {
val canDisplayBackButton = navigateBack?.let { TopAppBarButton.backButton(navigateBack) }
SwissTransferTobAppBar(R.string.settingsOptionDownloadLimit, navigationMenu = canDisplayBackButton)
Expand All @@ -51,13 +58,17 @@ fun SettingsDownloadsLimitScreen(navigateBack: (() -> Unit)?) {
) {
SettingTitle(titleRes = R.string.settingsDownloadsLimitTitle)

val (selectedItem, setSelectedItem) = rememberSaveable { mutableIntStateOf(0) } // TODO: Use DataStore or Realm
SingleSelectOptions(DownloadsLimit.entries, { selectedItem }, setSelectedItem)
var selectedItem by rememberSaveable { mutableIntStateOf(DownloadLimit.entries.indexOf(downloadLimit)) }
SingleSelectOptions(DownloadsLimitOption.entries, { selectedItem }, {
selectedItem = it
val selectedDownloadLimit = DownloadLimit.entries[it]
onDownloadLimitChange(selectedDownloadLimit)
})
}
}
}

enum class DownloadsLimit(
enum class DownloadsLimitOption(
override val title: @Composable () -> String,
override val imageVector: ImageVector? = null,
override val imageVectorResId: Int? = null,
Expand All @@ -73,7 +84,11 @@ enum class DownloadsLimit(
private fun SettingsThemeScreenPreview() {
SwissTransferTheme {
Surface {
SettingsDownloadsLimitScreen {}
SettingsDownloadsLimitScreen(
downloadLimit = DownloadLimit.TWOHUNDREDFIFTY,
navigateBack = {},
onDownloadLimitChange = {}
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,14 @@ import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Surface
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.pluralStringResource
import com.infomaniak.multiplatform_swisstransfer.common.models.ValidityPeriod
import com.infomaniak.swisstransfer.R
import com.infomaniak.swisstransfer.ui.components.SwissTransferTobAppBar
import com.infomaniak.swisstransfer.ui.components.TopAppBarButton
Expand All @@ -40,7 +43,11 @@ import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme
import com.infomaniak.swisstransfer.ui.utils.PreviewMobile

@Composable
fun SettingsValidityPeriodScreen(navigateBack: (() -> Unit)?) {
fun SettingsValidityPeriodScreen(
validityPeriod: ValidityPeriod? = ValidityPeriod.THIRTY,
navigateBack: (() -> Unit)?,
onValidityPeriodChange: (ValidityPeriod) -> Unit
) {
Scaffold(topBar = {
val canDisplayBackButton = navigateBack?.let { TopAppBarButton.backButton(navigateBack) }
SwissTransferTobAppBar(R.string.settingsOptionValidityPeriod, navigationMenu = canDisplayBackButton)
Expand All @@ -52,13 +59,17 @@ fun SettingsValidityPeriodScreen(navigateBack: (() -> Unit)?) {
) {
SettingTitle(titleRes = R.string.settingsValidityPeriodTitle)

val (selectedItem, setSelectedItem) = rememberSaveable { mutableIntStateOf(0) } // TODO: Use DataStore or Realm
SingleSelectOptions(ValidityPeriod.entries, { selectedItem }, setSelectedItem)
var selectedItem by rememberSaveable { mutableIntStateOf(ValidityPeriod.entries.indexOf(validityPeriod)) }
SingleSelectOptions(ValidityPeriodOption.entries, { selectedItem }, {
selectedItem = it
val selectedValidityPeriod = ValidityPeriod.entries[it]
onValidityPeriodChange(selectedValidityPeriod)
})
}
}
}

enum class ValidityPeriod(
enum class ValidityPeriodOption(
override val title: @Composable () -> String,
override val imageVector: ImageVector? = null,
override val imageVectorResId: Int? = null,
Expand All @@ -74,7 +85,7 @@ enum class ValidityPeriod(
private fun SettingsThemeScreenPreview() {
SwissTransferTheme {
Surface {
SettingsValidityPeriodScreen {}
SettingsValidityPeriodScreen(navigateBack = {}, onValidityPeriodChange = {})
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,14 @@ import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Surface
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.stringResource
import com.infomaniak.multiplatform_swisstransfer.common.models.EmailLanguage
import com.infomaniak.swisstransfer.R
import com.infomaniak.swisstransfer.ui.components.SwissTransferTobAppBar
import com.infomaniak.swisstransfer.ui.components.TopAppBarButton
Expand All @@ -40,7 +43,11 @@ import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme
import com.infomaniak.swisstransfer.ui.utils.PreviewMobile

@Composable
fun SettingsEmailLanguageScreen(navigateBack: (() -> Unit)?) {
fun SettingsEmailLanguageScreen(
emailLanguage: EmailLanguage,
navigateBack: (() -> Unit)?,
onEmailLanguageChange: (EmailLanguage) -> Unit
) {
Scaffold(topBar = {
val canDisplayBackButton = navigateBack?.let { TopAppBarButton.backButton(navigateBack) }
SwissTransferTobAppBar(R.string.settingsOptionEmailLanguage, navigationMenu = canDisplayBackButton)
Expand All @@ -52,13 +59,17 @@ fun SettingsEmailLanguageScreen(navigateBack: (() -> Unit)?) {
) {
SettingTitle(titleRes = R.string.settingsEmailLanguageTitle)

val (selectedItem, setSelectedItem) = rememberSaveable { mutableIntStateOf(0) } // TODO: Use DataStore or Realm
SingleSelectOptions(EmailLanguage.entries, { selectedItem }, setSelectedItem)
var selectedItem by rememberSaveable { mutableIntStateOf(EmailLanguage.entries.indexOf(emailLanguage)) }
SingleSelectOptions(EmailLanguageOption.entries, { selectedItem }, {
selectedItem = it
val selectedEmailLanguage = EmailLanguage.entries[it]
onEmailLanguageChange(selectedEmailLanguage)
})
}
}
}

enum class EmailLanguage(
enum class EmailLanguageOption(
override val title: @Composable () -> String,
override val imageVector: ImageVector? = null,
override val imageVectorResId: Int? = null
Expand All @@ -75,7 +86,7 @@ enum class EmailLanguage(
private fun SettingsThemeScreenPreview() {
SwissTransferTheme {
Surface {
SettingsEmailLanguageScreen {}
SettingsEmailLanguageScreen(emailLanguage = EmailLanguage.FRENCH, navigateBack = {}, onEmailLanguageChange = {})
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,10 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.res.pluralStringResource
import androidx.compose.ui.res.stringResource
import com.infomaniak.multiplatform_swisstransfer.common.interfaces.appSettings.AppSettings
import com.infomaniak.multiplatform_swisstransfer.common.models.DownloadLimit
import com.infomaniak.multiplatform_swisstransfer.common.models.EmailLanguage
import com.infomaniak.multiplatform_swisstransfer.common.models.Theme
import com.infomaniak.multiplatform_swisstransfer.database.models.setting.Language
import com.infomaniak.multiplatform_swisstransfer.common.models.ValidityPeriod
import com.infomaniak.swisstransfer.BuildConfig
import com.infomaniak.swisstransfer.R
import com.infomaniak.swisstransfer.ui.components.BrandTobAppBar
Expand Down Expand Up @@ -75,7 +77,7 @@ fun SettingsScreen(
titleRes = R.string.settingsOptionTheme,
isSelected = { selectedSetting == THEME },
icon = AppIcons.PaintbrushPalette,
description = (appSettings?.theme ?: Theme.SYSTEM).getString(),
description = appSettings?.theme?.getString(),
CHEVRON
) {
onItemClick(THEME)
Expand All @@ -97,7 +99,7 @@ fun SettingsScreen(
titleRes = R.string.settingsOptionValidityPeriod,
isSelected = { selectedSetting == VALIDITY_PERIOD },
icon = AppIcons.FileBadgeArrowDown,
description = "TODO",
description = appSettings?.validityPeriod?.getString(),
endIcon = CHEVRON,
) {
onItemClick(VALIDITY_PERIOD)
Expand All @@ -106,7 +108,7 @@ fun SettingsScreen(
titleRes = R.string.settingsOptionDownloadLimit,
isSelected = { selectedSetting == DOWNLOAD_LIMIT },
icon = AppIcons.Clock,
description = "TODO",
description = appSettings?.downloadLimit?.getString(),
endIcon = CHEVRON,
) {
onItemClick(DOWNLOAD_LIMIT)
Expand All @@ -115,7 +117,7 @@ fun SettingsScreen(
titleRes = R.string.settingsOptionEmailLanguage,
isSelected = { selectedSetting == EMAIL_LANGUAGE },
icon = AppIcons.SpeechBubble,
description = "TODO",
description = appSettings?.emailLanguage?.getString(),
endIcon = CHEVRON,
) {
onItemClick(EMAIL_LANGUAGE)
Expand Down Expand Up @@ -143,27 +145,36 @@ fun SettingsScreen(
}

@Composable
private fun Theme.getString(): String {
private fun Theme?.getString(): String {
return when (this) {
Theme.SYSTEM -> stringResource(R.string.settingsOptionThemeSystem)
Theme.DARK -> stringResource(R.string.settingsOptionThemeDark)
Theme.LIGHT -> stringResource(R.string.settingsOptionThemeLight)
else -> ""
}
}

@Composable
private fun getValidityPeriodString(validityPeriod: Int): String {
return pluralStringResource(R.plurals.settingsValidityPeriodValue, validityPeriod, validityPeriod)
private fun ValidityPeriod?.getString(): String {
return if (this == null) {
""
} else {
pluralStringResource(R.plurals.settingsValidityPeriodValue, value, value)
}
}

@Composable
private fun Language.getEmailLanguageString(): String {
private fun DownloadLimit?.getString() = if (this == null) "" else value.toString()

@Composable
private fun EmailLanguage?.getString(): String {
return when (this) {
Language.ENGLISH -> stringResource(R.string.settingsEmailLanguageValueEnglish)
Language.FRENCH -> stringResource(R.string.settingsEmailLanguageValueFrench)
Language.GERMAN -> stringResource(R.string.settingsEmailLanguageValueGerman)
Language.ITALIAN -> stringResource(R.string.settingsEmailLanguageValueItalian)
Language.SPANISH -> stringResource(R.string.settingsEmailLanguageValueSpanish)
EmailLanguage.ENGLISH -> stringResource(R.string.settingsEmailLanguageValueEnglish)
EmailLanguage.FRENCH -> stringResource(R.string.settingsEmailLanguageValueFrench)
EmailLanguage.GERMAN -> stringResource(R.string.settingsEmailLanguageValueGerman)
EmailLanguage.ITALIAN -> stringResource(R.string.settingsEmailLanguageValueItalian)
EmailLanguage.SPANISH -> stringResource(R.string.settingsEmailLanguageValueSpanish)
else -> ""
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,10 @@ import androidx.compose.ui.res.stringResource
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.infomaniak.multiplatform_swisstransfer.common.interfaces.appSettings.AppSettings
import com.infomaniak.multiplatform_swisstransfer.common.models.DownloadLimit
import com.infomaniak.multiplatform_swisstransfer.common.models.EmailLanguage
import com.infomaniak.multiplatform_swisstransfer.common.models.Theme
import com.infomaniak.multiplatform_swisstransfer.common.models.ValidityPeriod
import com.infomaniak.swisstransfer.R
import com.infomaniak.swisstransfer.extensions.goToPlayStore
import com.infomaniak.swisstransfer.extensions.openAppNotificationSettings
Expand Down Expand Up @@ -106,12 +109,29 @@ private fun DetailPane(
val navigateBack: (() -> Unit)? = if (navigator.canNavigateBack()) navigateBackCallback else null

when (destination) {
THEME -> SettingsThemeScreen(appSettings?.theme ?: Theme.SYSTEM, navigateBack) {
settingsViewModel.setTheme(it)
THEME -> {
SettingsThemeScreen(appSettings?.theme ?: Theme.SYSTEM, navigateBack) {
settingsViewModel.setTheme(it)
}
}
VALIDITY_PERIOD -> {
val validityPeriod = appSettings?.validityPeriod ?: ValidityPeriod.THIRTY
SettingsValidityPeriodScreen(validityPeriod, navigateBack) {
settingsViewModel.setValidityPeriod(it)
}
}
DOWNLOAD_LIMIT -> {
val downloadLimit = appSettings?.downloadLimit ?: DownloadLimit.TWOHUNDREDFIFTY
SettingsDownloadsLimitScreen(downloadLimit, navigateBack) {
settingsViewModel.setDownloadLimit(it)
}
}
EMAIL_LANGUAGE -> {
val emailLanguage = appSettings?.emailLanguage ?: EmailLanguage.FRENCH
SettingsEmailLanguageScreen(emailLanguage, navigateBack) {
settingsViewModel.setEmailLanguage(it)
}
}
VALIDITY_PERIOD -> SettingsValidityPeriodScreen(navigateBack)
DOWNLOAD_LIMIT -> SettingsDownloadsLimitScreen(navigateBack)
EMAIL_LANGUAGE -> SettingsEmailLanguageScreen(navigateBack)
NOTIFICATIONS,
DISCOVER_INFOMANIAK,
SHARE_IDEAS,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,10 @@ package com.infomaniak.swisstransfer.ui.screen.main.settings
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.infomaniak.multiplatform_swisstransfer.SwissTransferInjection
import com.infomaniak.multiplatform_swisstransfer.common.models.DownloadLimit
import com.infomaniak.multiplatform_swisstransfer.common.models.EmailLanguage
import com.infomaniak.multiplatform_swisstransfer.common.models.Theme
import com.infomaniak.multiplatform_swisstransfer.common.models.ValidityPeriod
import com.infomaniak.swisstransfer.di.IoDispatcher
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.CoroutineDispatcher
Expand All @@ -41,4 +44,16 @@ class SettingsViewModel @Inject constructor(
fun setTheme(theme: Theme) = viewModelScope.launch(ioDispatcher) {
appSettingsManager.setTheme(theme)
}

fun setValidityPeriod(validityPeriod: ValidityPeriod) = viewModelScope.launch(ioDispatcher) {
appSettingsManager.setValidityPeriod(validityPeriod)
}

fun setDownloadLimit(downloadLimit: DownloadLimit) = viewModelScope.launch(ioDispatcher) {
appSettingsManager.setDownloadLimit(downloadLimit)
}

fun setEmailLanguage(emailLanguage: EmailLanguage) = viewModelScope.launch(ioDispatcher) {
appSettingsManager.setEmailLanguage(emailLanguage)
}
}

0 comments on commit aa85023

Please sign in to comment.