From 3801e50e5d9f459d7836c29e132a73b1e5d67d4d Mon Sep 17 00:00:00 2001 From: Vincent TE Date: Tue, 27 Aug 2024 15:22:51 +0200 Subject: [PATCH] Modification after rebase --- .../ui/screen/main/MainNavHost.kt | 2 +- .../ui/screen/main/settings/SettingsScreen.kt | 74 +++++++++---------- .../main/settings/SettingsScreenWrapper.kt | 27 +++++-- .../main/settings/SettingsThemeScreen.kt | 10 ++- 4 files changed, 63 insertions(+), 50 deletions(-) diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainNavHost.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainNavHost.kt index 524e5d44ec..6f40386b6e 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainNavHost.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainNavHost.kt @@ -65,7 +65,7 @@ fun MainNavHost( ) } composable { - SettingsScreenWrapper(navController, windowAdaptiveInfo, isBarNavigation) + SettingsScreenWrapper(windowAdaptiveInfo) } } } diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsScreen.kt index 180d33494b..df005caee7 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsScreen.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsScreen.kt @@ -29,9 +29,11 @@ import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalContext 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.Theme +import com.infomaniak.multiplatform_swisstransfer.database.models.setting.Language import com.infomaniak.swisstransfer.BuildConfig import com.infomaniak.swisstransfer.R import com.infomaniak.swisstransfer.ui.components.BrandTobAppBar @@ -47,45 +49,12 @@ import com.infomaniak.swisstransfer.ui.theme.Margin import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme import com.infomaniak.swisstransfer.ui.utils.PreviewMobile -private fun openUrl(context: Context, url: String) { - context.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url))) -} - -private fun goToPlayStore(context: Context) { - try { - context.startActivity( - Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=${context.packageName}")) - ) - } catch (_: ActivityNotFoundException) { - context.startActivity( - Intent( - Intent.ACTION_VIEW, - Uri.parse("https://play.google.com/store/apps/details?id=${context.packageName}") - ) - ) - } -} - -fun openAppNotificationSettings(context: Context) { - val packageName = context.packageName - val appUid = context.applicationInfo.uid - Intent().apply { - when { - Build.VERSION.SDK_INT >= Build.VERSION_CODES.O -> { - action = Settings.ACTION_APP_NOTIFICATION_SETTINGS - putExtra(Settings.EXTRA_APP_PACKAGE, packageName) - } - else -> { - action = "Settings.ACTION_APP_NOTIFICATION_SETTINGS" - putExtra("app_package", packageName) - putExtra("app_uid", appUid) - } - } - }.also { context.startActivity(it) } -} - @Composable -fun SettingsScreen(onItemClick: (SettingsOptionScreens) -> Unit, getSelectedSetting: () -> SettingsOptionScreens?) { +fun SettingsScreen( + onItemClick: (SettingsOptionScreens) -> Unit, + getSelectedSetting: () -> SettingsOptionScreens?, + appSettings: AppSettings? = null +) { val selectedSetting = getSelectedSetting() Scaffold(topBar = { BrandTobAppBar() }) { paddingsValue -> @@ -106,7 +75,7 @@ fun SettingsScreen(onItemClick: (SettingsOptionScreens) -> Unit, getSelectedSett titleRes = R.string.settingsOptionTheme, isSelected = { selectedSetting == THEME }, icon = AppIcons.PaintbrushPalette, - description = "TODO", + description = (appSettings?.theme ?: Theme.SYSTEM).getString(), CHEVRON ) { onItemClick(THEME) @@ -173,6 +142,31 @@ fun SettingsScreen(onItemClick: (SettingsOptionScreens) -> Unit, getSelectedSett } } +@Composable +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) + } +} + +@Composable +private fun getValidityPeriodString(validityPeriod: Int): String { + return pluralStringResource(R.plurals.settingsValidityPeriodValue, validityPeriod, validityPeriod) +} + +@Composable +private fun Language.getEmailLanguageString(): 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) + } +} + enum class SettingsOptionScreens { THEME, NOTIFICATIONS, VALIDITY_PERIOD, DOWNLOAD_LIMIT, EMAIL_LANGUAGE, diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsScreenWrapper.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsScreenWrapper.kt index 6c27c6aef6..b2bb1eb1b1 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsScreenWrapper.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsScreenWrapper.kt @@ -37,6 +37,10 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext 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.Theme import com.infomaniak.swisstransfer.R import com.infomaniak.swisstransfer.extensions.goToPlayStore import com.infomaniak.swisstransfer.extensions.openAppNotificationSettings @@ -49,17 +53,21 @@ import com.infomaniak.swisstransfer.ui.utils.PreviewTablet @OptIn(ExperimentalMaterial3AdaptiveApi::class) @Composable -fun SettingsScreenWrapper(windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfo()) { +fun SettingsScreenWrapper( + windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfo(), + settingsViewModel: SettingsViewModel = hiltViewModel(), +) { + val appSettings by settingsViewModel.appSettingsFlow.collectAsStateWithLifecycle(null) TwoPaneScaffold( windowAdaptiveInfo, - listPane = { ListPane(this) }, - detailPane = { DetailPane(this) } + listPane = { ListPane(this, appSettings) }, + detailPane = { DetailPane(settingsViewModel, this, appSettings) } ) } @OptIn(ExperimentalMaterial3AdaptiveApi::class) @Composable -private fun ListPane(navigator: ThreePaneScaffoldNavigator) { +private fun ListPane(navigator: ThreePaneScaffoldNavigator, appSettings: AppSettings?) { val context = LocalContext.current val aboutURL = stringResource(R.string.urlAbout) val userReportURL = stringResource(R.string.urlUserReportAndroid) @@ -78,12 +86,17 @@ private fun ListPane(navigator: ThreePaneScaffoldNavigator) { +private fun DetailPane( + settingsViewModel: SettingsViewModel, + navigator: ThreePaneScaffoldNavigator, + appSettings: AppSettings? +) { var lastSelectedScreen by rememberSaveable { mutableStateOf(null) } val destination = navigator.currentDestination?.content ?: lastSelectedScreen @@ -93,7 +106,9 @@ private fun DetailPane(navigator: ThreePaneScaffoldNavigator Unit)? = if (navigator.canNavigateBack()) navigateBackCallback else null when (destination) { - THEME -> SettingsThemeScreen(navigateBack) + THEME -> SettingsThemeScreen(appSettings?.theme ?: Theme.SYSTEM, navigateBack) { + settingsViewModel.setTheme(it) + } VALIDITY_PERIOD -> SettingsValidityPeriodScreen(navigateBack) DOWNLOAD_LIMIT -> SettingsDownloadsLimitScreen(navigateBack) EMAIL_LANGUAGE -> SettingsEmailLanguageScreen(navigateBack) diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsThemeScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsThemeScreen.kt index d8f058e378..83b5ee8ecc 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsThemeScreen.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsThemeScreen.kt @@ -47,7 +47,7 @@ import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme import com.infomaniak.swisstransfer.ui.utils.PreviewMobile @Composable -fun SettingsThemeScreen(navigateBack: (() -> Unit)?) { +fun SettingsThemeScreen(theme: Theme, navigateBack: (() -> Unit)?, onThemeUpdate: (Theme) -> Unit) { Scaffold(topBar = { val canDisplayBackButton = navigateBack?.let { TopAppBarButton.backButton(navigateBack) } SwissTransferTobAppBar(R.string.settingsOptionTheme, navigationMenu = canDisplayBackButton) @@ -59,8 +59,12 @@ fun SettingsThemeScreen(navigateBack: (() -> Unit)?) { ) { SettingTitle(titleRes = R.string.settingsThemeTitle) - var selectedItem by rememberSaveable { mutableIntStateOf(0) } // TODO: Use DataStore or Realm - SingleSelectOptions(ThemeOption.entries, { selectedItem }, { selectedItem = it }) + var selectedItem by rememberSaveable { mutableIntStateOf(theme.indexOf()) } + SingleSelectOptions(ThemeOption.entries, { selectedItem }, { + selectedItem = it + val selectedTheme = Theme.entries[it] + onThemeUpdate(selectedTheme) + }) } } }