From a45b76e19ad6b735121054ca30215e36e38b04eb Mon Sep 17 00:00:00 2001 From: Vincent TE Date: Wed, 21 Aug 2024 16:30:17 +0200 Subject: [PATCH 01/20] Add url in strings and handle external action --- .../ui/screen/main/settings/SettingsScreen.kt | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) 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 4096f9b70..d2080512f 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 @@ -28,6 +28,7 @@ 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.stringResource import com.infomaniak.swisstransfer.BuildConfig import com.infomaniak.swisstransfer.R @@ -44,6 +45,43 @@ 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?) { From d31f81f6f454e174e7a1b075f26bbe6f7bd7d03b Mon Sep 17 00:00:00 2001 From: Vincent TE Date: Fri, 23 Aug 2024 10:44:59 +0200 Subject: [PATCH 02/20] Add brand app bar and top app bar --- .../swisstransfer/ui/screen/main/MainNavHost.kt | 3 ++- .../swisstransfer/ui/screen/main/MainScaffold.kt | 8 ++++---- .../infomaniak/swisstransfer/ui/screen/main/MainScreen.kt | 4 ++-- .../screen/main/components/AppNavigationSuiteScaffold.kt | 4 ++-- 4 files changed, 10 insertions(+), 9 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 d27404612..e793ca880 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 @@ -39,6 +39,7 @@ fun MainNavHost( navController: NavHostController, currentDestination: MainNavigation, windowAdaptiveInfo: WindowAdaptiveInfo, + isBarNavigation: Boolean, ) { NavHost( navController = navController, @@ -57,7 +58,7 @@ fun MainNavHost( TransferDetailsScreen(transferId = transferDetails.transferId) } composable { - SettingsScreenWrapper(windowAdaptiveInfo) + SettingsScreenWrapper(navController, windowAdaptiveInfo, isBarNavigation) } } } diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainScaffold.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainScaffold.kt index 218875b51..dd9e18bc5 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainScaffold.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainScaffold.kt @@ -41,7 +41,7 @@ fun MainScaffold( navController: NavHostController, currentDestination: MainNavigation, windowAdaptiveInfo: WindowAdaptiveInfo, - content: @Composable () -> Unit = {}, + content: @Composable (Boolean) -> Unit = {}, ) { val navType by rememberNavType(currentDestination, windowAdaptiveInfo) @@ -55,15 +55,15 @@ private fun MainScaffold( navType: NavigationSuiteType, currentDestination: MainNavigation, navigateToSelectedItem: (MainNavigation) -> Unit, - content: @Composable () -> Unit, + content: @Composable (Boolean) -> Unit, ) { AppNavigationSuiteScaffold(navType, NavigationItem.entries, currentDestination, navigateToSelectedItem) { if (navType == NavigationSuiteType.None) { - content() + content(it) } else { Column { Box(modifier = Modifier.weight(1.0f)) { - content() + content(it) } HorizontalDivider() } diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainScreen.kt index 717df5435..0f37aeda6 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainScreen.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainScreen.kt @@ -43,8 +43,8 @@ fun MainScreen() { } } - MainScaffold(navController, currentDestination, windowAdaptiveInfo) { - MainNavHost(navController, currentDestination, windowAdaptiveInfo) + MainScaffold(navController, currentDestination, windowAdaptiveInfo) { isBarNavigation -> + MainNavHost(navController, currentDestination, windowAdaptiveInfo, isBarNavigation) } } diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/components/AppNavigationSuiteScaffold.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/components/AppNavigationSuiteScaffold.kt index 7f5930dce..f93a8d676 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/components/AppNavigationSuiteScaffold.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/components/AppNavigationSuiteScaffold.kt @@ -59,7 +59,7 @@ fun AppNavigationSuiteScaffold( navigationItems: List, currentDestination: MainNavigation, navigateToSelectedItem: (MainNavigation) -> Unit, - content: @Composable () -> Unit, + content: @Composable (Boolean) -> Unit, ) { Surface(color = SwissTransferTheme.materialColors.background) { NavigationSuiteScaffoldLayout( @@ -87,7 +87,7 @@ fun AppNavigationSuiteScaffold( }, ), ) { - content() + content(layoutType == NavigationSuiteType.NavigationBar) } } } From c591c0c02e02a15f90422ebddf633a59c8fcea85 Mon Sep 17 00:00:00 2001 From: Vincent TE Date: Mon, 26 Aug 2024 17:11:27 +0200 Subject: [PATCH 03/20] Add base realm use for app settings theme --- app/build.gradle.kts | 5 +++ .../swisstransfer/di/ApplicationModule.kt | 17 ++++--- .../swisstransfer/ui/MainActivity.kt | 8 ++++ .../ui/screen/main/settings/SettingsScreen.kt | 1 + .../main/settings/SettingsThemeScreen.kt | 3 +- .../screen/main/settings/SettingsViewModel.kt | 44 +++++++++++++++++++ gradle/libs.versions.toml | 2 + settings.gradle.kts | 2 + 8 files changed, 76 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsViewModel.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index d336e429b..ada2fad65 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -83,6 +83,11 @@ dependencies { implementation(libs.androidx.adaptive.layout) implementation(libs.androidx.adaptive.navigation) + //SwissTransfer Libraries + implementation("com.github.infomaniak.multiplatform_swisstransfer:STCore:0.0.4-vte") + implementation("com.github.infomaniak.multiplatform_swisstransfer:STCommon:0.0.4-vte") + implementation("com.github.infomaniak.multiplatform_swisstransfer:STDatabase:0.0.4-vte") + // Compose preview tools implementation(libs.compose.ui.tooling.preview) debugImplementation(libs.compose.ui.tooling) diff --git a/app/src/main/java/com/infomaniak/swisstransfer/di/ApplicationModule.kt b/app/src/main/java/com/infomaniak/swisstransfer/di/ApplicationModule.kt index f31f2dfbe..2c6e1e8fb 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/di/ApplicationModule.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/di/ApplicationModule.kt @@ -17,11 +17,18 @@ */ package com.infomaniak.swisstransfer.di +import com.infomaniak.multiplatform_swisstransfer.SwissTransferInjection +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) object ApplicationModule { -// @Provides -// @Singleton -// fun providesSwissTransferInjection() { -// // TODO: Implement this method -// } + @Provides + @Singleton + fun providesSwissTransferInjection() = SwissTransferInjection() } diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/MainActivity.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/MainActivity.kt index 177e184ca..fa1ecb178 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/MainActivity.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/MainActivity.kt @@ -21,15 +21,23 @@ import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge +import androidx.lifecycle.lifecycleScope +import com.infomaniak.multiplatform_swisstransfer.SwissTransferInjection import com.infomaniak.swisstransfer.ui.screen.main.MainScreen import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.launch +import javax.inject.Inject @AndroidEntryPoint class MainActivity : ComponentActivity() { + @Inject + lateinit var swissTransferInjection: SwissTransferInjection + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + lifecycleScope.launch { swissTransferInjection.loadDefaultAccount() } enableEdgeToEdge() setContent { SwissTransferTheme { 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 d2080512f..e07a7a732 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,6 +29,7 @@ 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.swisstransfer.BuildConfig import com.infomaniak.swisstransfer.R 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 264b41815..60b85c409 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 @@ -31,6 +31,7 @@ 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.Theme import com.infomaniak.swisstransfer.R import com.infomaniak.swisstransfer.ui.components.SwissTransferTobAppBar import com.infomaniak.swisstransfer.ui.components.TopAppBarButton @@ -78,7 +79,7 @@ enum class ThemeOption( private fun SettingsThemeScreenPreview() { SwissTransferTheme { Surface { - SettingsThemeScreen {} + SettingsThemeScreen(Theme.SYSTEM, {}, {}) } } } diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsViewModel.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsViewModel.kt new file mode 100644 index 000000000..83e24615e --- /dev/null +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsViewModel.kt @@ -0,0 +1,44 @@ +/* + * Infomaniak SwissTransfer - Android + * Copyright (C) 2024 Infomaniak Network SA + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +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.Theme +import com.infomaniak.swisstransfer.di.IoDispatcher +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class SettingsViewModel @Inject constructor( + private val swissTransferInjection: SwissTransferInjection, + @IoDispatcher private val ioDispatcher: CoroutineDispatcher, +) : ViewModel() { + private val appSettingsManager + inline get() = swissTransferInjection.appSettingsManager + + val appSettingsFlow = appSettingsManager.appSettings + + fun setTheme(theme: Theme) = viewModelScope.launch(ioDispatcher) { + appSettingsManager.setTheme(theme) + } +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 545482f80..81e5e775f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -14,6 +14,7 @@ lifecycleRuntimeKtx = "2.8.4" material3Beta = "1.3.0-rc01" navigation = "2.8.0-rc01" serialization = "1.7.1" +database = "a5b5f3e8e6" [libraries] androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" } @@ -21,6 +22,7 @@ androidx-adaptive = { module = "androidx.compose.material3.adaptive:adaptive", v androidx-adaptive-layout = { module = "androidx.compose.material3.adaptive:adaptive-layout", version.ref = "adaptiveLayout" } androidx-adaptive-navigation = { module = "androidx.compose.material3.adaptive:adaptive-navigation", version.ref = "adaptiveLayout" } androidx-constraintlayout-compose = { module = "androidx.constraintlayout:constraintlayout-compose", version.ref = "constraintlayoutCompose" } +swisstransfer-database = { module = "com.github.Infomaniak.multiplatform-SwissTransfer:STDatabase", version.ref = "database" } androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" } compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" } diff --git a/settings.gradle.kts b/settings.gradle.kts index 90211f215..34d89f9e7 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -17,7 +17,9 @@ dependencyResolutionManagement { @Suppress("UnstableApiUsage") repositories { google() + mavenLocal() mavenCentral() + maven { url = uri("https://jitpack.io") } } } From 6c4df2233211ee4073a3a292d3dbb6e13baaf9a5 Mon Sep 17 00:00:00 2001 From: Vincent TE Date: Tue, 27 Aug 2024 15:22:51 +0200 Subject: [PATCH 04/20] Modification after rebase --- .../ui/screen/main/MainNavHost.kt | 2 +- .../ui/screen/main/settings/SettingsScreen.kt | 75 +++++++++---------- .../main/settings/SettingsScreenWrapper.kt | 27 +++++-- .../main/settings/SettingsThemeScreen.kt | 10 ++- 4 files changed, 63 insertions(+), 51 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 e793ca880..e4289072f 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 @@ -58,7 +58,7 @@ fun MainNavHost( TransferDetailsScreen(transferId = transferDetails.transferId) } 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 e07a7a732..ddc22ef69 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 @@ -28,9 +28,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 @@ -46,46 +48,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 +74,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(), endIcon = CHEVRON, onClick = { onItemClick(THEME) }, ) @@ -176,6 +144,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 bf2f824b6..e0427c070 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 @@ -36,6 +36,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.ui.components.TwoPaneScaffold import com.infomaniak.swisstransfer.ui.screen.main.settings.SettingsOptionScreens.* @@ -44,17 +48,21 @@ import com.infomaniak.swisstransfer.ui.utils.* @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 = 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) @@ -73,12 +81,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 @@ -88,7 +101,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 60b85c409..94f766b56 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 @@ -46,7 +46,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) @@ -58,8 +58,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) + }) } } } From 07b59f6b86e4501df648204d33852348787c3111 Mon Sep 17 00:00:00 2001 From: Vincent TE Date: Tue, 27 Aug 2024 17:00:54 +0200 Subject: [PATCH 05/20] Add realm save for validity period, downloads limit and email language --- .../ui/screen/main/MainNavHost.kt | 1 - .../settings/SettingsDownloadsLimitScreen.kt | 25 ++++++++--- .../SettingsDurationValidityScreen.kt | 21 +++++++--- .../settings/SettingsEmailLanguageScreen.kt | 21 +++++++--- .../ui/screen/main/settings/SettingsScreen.kt | 42 ++++++++++++------- .../main/settings/SettingsScreenWrapper.kt | 30 ++++++++++--- .../screen/main/settings/SettingsViewModel.kt | 15 +++++++ 7 files changed, 118 insertions(+), 37 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 e4289072f..d27404612 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 @@ -39,7 +39,6 @@ fun MainNavHost( navController: NavHostController, currentDestination: MainNavigation, windowAdaptiveInfo: WindowAdaptiveInfo, - isBarNavigation: Boolean, ) { NavHost( navController = navController, diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDownloadsLimitScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDownloadsLimitScreen.kt index 8196cc489..5d12bb591 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDownloadsLimitScreen.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDownloadsLimitScreen.kt @@ -24,10 +24,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 @@ -38,7 +41,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) @@ -50,13 +57,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, @@ -72,7 +83,11 @@ enum class DownloadsLimit( private fun SettingsThemeScreenPreview() { SwissTransferTheme { Surface { - SettingsDownloadsLimitScreen {} + SettingsDownloadsLimitScreen( + downloadLimit = DownloadLimit.TWOHUNDREDFIFTY, + navigateBack = {}, + onDownloadLimitChange = {} + ) } } } diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDurationValidityScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDurationValidityScreen.kt index 97df99f1f..41f77ac6a 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDurationValidityScreen.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDurationValidityScreen.kt @@ -24,11 +24,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 @@ -39,7 +42,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) @@ -51,13 +58,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, @@ -73,7 +84,7 @@ enum class ValidityPeriod( private fun SettingsThemeScreenPreview() { SwissTransferTheme { Surface { - SettingsValidityPeriodScreen {} + SettingsValidityPeriodScreen(navigateBack = {}, onValidityPeriodChange = {}) } } } diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsEmailLanguageScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsEmailLanguageScreen.kt index ca24a4268..48af88202 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsEmailLanguageScreen.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsEmailLanguageScreen.kt @@ -24,11 +24,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 @@ -39,7 +42,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) @@ -51,13 +58,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, @@ -74,7 +85,7 @@ enum class EmailLanguage( private fun SettingsThemeScreenPreview() { SwissTransferTheme { Surface { - SettingsEmailLanguageScreen {} + SettingsEmailLanguageScreen(emailLanguage = EmailLanguage.FRENCH, navigateBack = {}, onEmailLanguageChange = {}) } } } 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 ddc22ef69..83943ef6c 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 @@ -31,8 +31,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 @@ -74,10 +76,9 @@ fun SettingsScreen( titleRes = R.string.settingsOptionTheme, isSelected = { selectedSetting == THEME }, icon = AppIcons.PaintbrushPalette, - description = (appSettings?.theme ?: Theme.SYSTEM).getString(), + description = appSettings?.theme?.getString(), endIcon = CHEVRON, onClick = { onItemClick(THEME) }, - ) SettingItem( titleRes = R.string.settingsOptionNotifications, isSelected = { selectedSetting == NOTIFICATIONS }, @@ -92,8 +93,8 @@ fun SettingsScreen( SettingItem( titleRes = R.string.settingsOptionValidityPeriod, isSelected = { selectedSetting == VALIDITY_PERIOD }, - icon = AppIcons.ArrowDownFile, - description = "TODO", + icon = AppIcons.FileBadgeArrowDown, + description = appSettings?.validityPeriod?.getString(), endIcon = CHEVRON, onClick = { onItemClick(VALIDITY_PERIOD) }, ) @@ -101,7 +102,7 @@ fun SettingsScreen( titleRes = R.string.settingsOptionDownloadLimit, isSelected = { selectedSetting == DOWNLOAD_LIMIT }, icon = AppIcons.Clock, - description = "TODO", + description = appSettings?.downloadLimit?.getString(), endIcon = CHEVRON, onClick = { onItemClick(DOWNLOAD_LIMIT) }, ) @@ -109,7 +110,7 @@ fun SettingsScreen( titleRes = R.string.settingsOptionEmailLanguage, isSelected = { selectedSetting == EMAIL_LANGUAGE }, icon = AppIcons.SpeechBubble, - description = "TODO", + description = appSettings?.emailLanguage?.getString(), endIcon = CHEVRON, onClick = { onItemClick(EMAIL_LANGUAGE) }, ) @@ -145,27 +146,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 -> "" } } 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 e0427c070..d534980bf 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 @@ -39,7 +39,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.ui.components.TwoPaneScaffold import com.infomaniak.swisstransfer.ui.screen.main.settings.SettingsOptionScreens.* @@ -101,12 +104,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, diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsViewModel.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsViewModel.kt index 83e24615e..8f4551326 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsViewModel.kt @@ -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 @@ -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) + } } From 085b79d522389f2f29c8456aedca0ef85f329896 Mon Sep 17 00:00:00 2001 From: Vincent TE Date: Tue, 27 Aug 2024 17:53:18 +0200 Subject: [PATCH 06/20] Remove unnecessary boolean --- .../swisstransfer/ui/screen/main/MainScaffold.kt | 8 ++++---- .../infomaniak/swisstransfer/ui/screen/main/MainScreen.kt | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainScaffold.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainScaffold.kt index dd9e18bc5..218875b51 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainScaffold.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainScaffold.kt @@ -41,7 +41,7 @@ fun MainScaffold( navController: NavHostController, currentDestination: MainNavigation, windowAdaptiveInfo: WindowAdaptiveInfo, - content: @Composable (Boolean) -> Unit = {}, + content: @Composable () -> Unit = {}, ) { val navType by rememberNavType(currentDestination, windowAdaptiveInfo) @@ -55,15 +55,15 @@ private fun MainScaffold( navType: NavigationSuiteType, currentDestination: MainNavigation, navigateToSelectedItem: (MainNavigation) -> Unit, - content: @Composable (Boolean) -> Unit, + content: @Composable () -> Unit, ) { AppNavigationSuiteScaffold(navType, NavigationItem.entries, currentDestination, navigateToSelectedItem) { if (navType == NavigationSuiteType.None) { - content(it) + content() } else { Column { Box(modifier = Modifier.weight(1.0f)) { - content(it) + content() } HorizontalDivider() } diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainScreen.kt index 0f37aeda6..717df5435 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainScreen.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainScreen.kt @@ -43,8 +43,8 @@ fun MainScreen() { } } - MainScaffold(navController, currentDestination, windowAdaptiveInfo) { isBarNavigation -> - MainNavHost(navController, currentDestination, windowAdaptiveInfo, isBarNavigation) + MainScaffold(navController, currentDestination, windowAdaptiveInfo) { + MainNavHost(navController, currentDestination, windowAdaptiveInfo) } } From 9b4cfe8c62408bc1f66eb68fe32461915f128c76 Mon Sep 17 00:00:00 2001 From: Vincent TE Date: Wed, 28 Aug 2024 17:17:20 +0200 Subject: [PATCH 07/20] Rename realmKey to value and refactor code to use it --- .../swisstransfer/ui/screen/main/settings/SettingsScreen.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 83943ef6c..e1d7977e4 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 @@ -160,12 +160,13 @@ private fun ValidityPeriod?.getString(): String { return if (this == null) { "" } else { - pluralStringResource(R.plurals.settingsValidityPeriodValue, value, value) + val validityPeriodValue = value.toInt() + pluralStringResource(R.plurals.settingsValidityPeriodValue, validityPeriodValue, validityPeriodValue) } } @Composable -private fun DownloadLimit?.getString() = if (this == null) "" else value.toString() +private fun DownloadLimit?.getString() = if (this == null) "" else value @Composable private fun EmailLanguage?.getString(): String { From 1ba142ea59bb06265cbe27d95c6a9853e04b423e Mon Sep 17 00:00:00 2001 From: Vincent TE Date: Thu, 29 Aug 2024 14:04:14 +0200 Subject: [PATCH 08/20] Code review --- .../swisstransfer/ui/screen/main/settings/SettingsScreen.kt | 2 +- .../ui/screen/main/settings/SettingsThemeScreen.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 e1d7977e4..8957abe66 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 @@ -166,7 +166,7 @@ private fun ValidityPeriod?.getString(): String { } @Composable -private fun DownloadLimit?.getString() = if (this == null) "" else value +private fun DownloadLimit?.getString() = this?.value ?: "" @Composable private fun EmailLanguage?.getString(): String { 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 94f766b56..6f8479a17 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 @@ -58,7 +58,7 @@ fun SettingsThemeScreen(theme: Theme, navigateBack: (() -> Unit)?, onThemeUpdate ) { SettingTitle(titleRes = R.string.settingsThemeTitle) - var selectedItem by rememberSaveable { mutableIntStateOf(theme.indexOf()) } + var selectedItem by rememberSaveable { mutableIntStateOf(Theme.entries.indexOf(theme)) } SingleSelectOptions(ThemeOption.entries, { selectedItem }, { selectedItem = it val selectedTheme = Theme.entries[it] From 21ccb477fd4cdb95be6c1ccd3d526d91a9b28b00 Mon Sep 17 00:00:00 2001 From: Vincent TE Date: Thu, 29 Aug 2024 16:05:50 +0200 Subject: [PATCH 09/20] Update libs --- app/build.gradle.kts | 6 ++---- gradle/libs.versions.toml | 5 +++-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index ada2fad65..045fca544 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -83,10 +83,8 @@ dependencies { implementation(libs.androidx.adaptive.layout) implementation(libs.androidx.adaptive.navigation) - //SwissTransfer Libraries - implementation("com.github.infomaniak.multiplatform_swisstransfer:STCore:0.0.4-vte") - implementation("com.github.infomaniak.multiplatform_swisstransfer:STCommon:0.0.4-vte") - implementation("com.github.infomaniak.multiplatform_swisstransfer:STDatabase:0.0.4-vte") + implementation(libs.swisstransfer.database) + implementation(libs.swisstransfer.core) // Compose preview tools implementation(libs.compose.ui.tooling.preview) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 81e5e775f..c0404ed6d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -14,7 +14,7 @@ lifecycleRuntimeKtx = "2.8.4" material3Beta = "1.3.0-rc01" navigation = "2.8.0-rc01" serialization = "1.7.1" -database = "a5b5f3e8e6" +swisstransfer = "0.1.0" [libraries] androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" } @@ -22,7 +22,8 @@ androidx-adaptive = { module = "androidx.compose.material3.adaptive:adaptive", v androidx-adaptive-layout = { module = "androidx.compose.material3.adaptive:adaptive-layout", version.ref = "adaptiveLayout" } androidx-adaptive-navigation = { module = "androidx.compose.material3.adaptive:adaptive-navigation", version.ref = "adaptiveLayout" } androidx-constraintlayout-compose = { module = "androidx.constraintlayout:constraintlayout-compose", version.ref = "constraintlayoutCompose" } -swisstransfer-database = { module = "com.github.Infomaniak.multiplatform-SwissTransfer:STDatabase", version.ref = "database" } +swisstransfer-database = { module = "com.github.Infomaniak.multiplatform-SwissTransfer:STDatabase", version.ref = "swisstransfer" } +swisstransfer-core = { module = "com.github.Infomaniak.multiplatform-SwissTransfer:STCore", version.ref = "swisstransfer" } androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" } compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" } From b95b25e4048329ca33e13b8b56ab246a22617968 Mon Sep 17 00:00:00 2001 From: Vincent TE Date: Thu, 29 Aug 2024 16:13:53 +0200 Subject: [PATCH 10/20] Clean code --- .../screen/main/components/AppNavigationSuiteScaffold.kt | 4 ++-- .../main/settings/SettingsDurationValidityScreen.kt | 5 ++++- .../screen/main/settings/SettingsEmailLanguageScreen.kt | 6 +++++- .../ui/screen/main/settings/SettingsScreen.kt | 9 +++------ 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/components/AppNavigationSuiteScaffold.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/components/AppNavigationSuiteScaffold.kt index f93a8d676..7f5930dce 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/components/AppNavigationSuiteScaffold.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/components/AppNavigationSuiteScaffold.kt @@ -59,7 +59,7 @@ fun AppNavigationSuiteScaffold( navigationItems: List, currentDestination: MainNavigation, navigateToSelectedItem: (MainNavigation) -> Unit, - content: @Composable (Boolean) -> Unit, + content: @Composable () -> Unit, ) { Surface(color = SwissTransferTheme.materialColors.background) { NavigationSuiteScaffoldLayout( @@ -87,7 +87,7 @@ fun AppNavigationSuiteScaffold( }, ), ) { - content(layoutType == NavigationSuiteType.NavigationBar) + content() } } } diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDurationValidityScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDurationValidityScreen.kt index 41f77ac6a..0216aaa0c 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDurationValidityScreen.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDurationValidityScreen.kt @@ -84,7 +84,10 @@ enum class ValidityPeriodOption( private fun SettingsThemeScreenPreview() { SwissTransferTheme { Surface { - SettingsValidityPeriodScreen(navigateBack = {}, onValidityPeriodChange = {}) + SettingsValidityPeriodScreen( + navigateBack = {}, + onValidityPeriodChange = {} + ) } } } diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsEmailLanguageScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsEmailLanguageScreen.kt index 48af88202..62d595e99 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsEmailLanguageScreen.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsEmailLanguageScreen.kt @@ -85,7 +85,11 @@ enum class EmailLanguageOption( private fun SettingsThemeScreenPreview() { SwissTransferTheme { Surface { - SettingsEmailLanguageScreen(emailLanguage = EmailLanguage.FRENCH, navigateBack = {}, onEmailLanguageChange = {}) + SettingsEmailLanguageScreen( + emailLanguage = EmailLanguage.FRENCH, + navigateBack = {}, + onEmailLanguageChange = {} + ) } } } 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 8957abe66..361029d08 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 @@ -157,12 +157,9 @@ private fun Theme?.getString(): String { @Composable private fun ValidityPeriod?.getString(): String { - return if (this == null) { - "" - } else { - val validityPeriodValue = value.toInt() - pluralStringResource(R.plurals.settingsValidityPeriodValue, validityPeriodValue, validityPeriodValue) - } + return this?.value?.toInt()?.let { + pluralStringResource(R.plurals.settingsValidityPeriodValue, it, it) + } ?: "" } @Composable From 2c05de8917c3b0746be45fe34c89e75e96dfc671 Mon Sep 17 00:00:00 2001 From: Vincent TE Date: Fri, 30 Aug 2024 10:30:20 +0200 Subject: [PATCH 11/20] Code review --- app/build.gradle.kts | 1 - .../swisstransfer/ui/MainActivity.kt | 8 - .../swisstransfer/ui/MainApplication.kt | 15 +- .../settings/SettingsDownloadsLimitScreen.kt | 8 +- .../settings/SettingsEmailLanguageScreen.kt | 8 +- .../main/settings/SettingsScreenWrapper.kt | 162 +++++++++--------- .../main/settings/SettingsThemeScreen.kt | 14 +- ...een.kt => SettingsValidityPeriodScreen.kt} | 11 +- .../screen/main/settings/SettingsViewModel.kt | 3 +- gradle/libs.versions.toml | 1 - settings.gradle.kts | 4 +- 11 files changed, 120 insertions(+), 115 deletions(-) rename app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/{SettingsDurationValidityScreen.kt => SettingsValidityPeriodScreen.kt} (94%) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 045fca544..a4c75305b 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -83,7 +83,6 @@ dependencies { implementation(libs.androidx.adaptive.layout) implementation(libs.androidx.adaptive.navigation) - implementation(libs.swisstransfer.database) implementation(libs.swisstransfer.core) // Compose preview tools diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/MainActivity.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/MainActivity.kt index fa1ecb178..177e184ca 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/MainActivity.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/MainActivity.kt @@ -21,23 +21,15 @@ import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge -import androidx.lifecycle.lifecycleScope -import com.infomaniak.multiplatform_swisstransfer.SwissTransferInjection import com.infomaniak.swisstransfer.ui.screen.main.MainScreen import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme import dagger.hilt.android.AndroidEntryPoint -import kotlinx.coroutines.launch -import javax.inject.Inject @AndroidEntryPoint class MainActivity : ComponentActivity() { - @Inject - lateinit var swissTransferInjection: SwissTransferInjection - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - lifecycleScope.launch { swissTransferInjection.loadDefaultAccount() } enableEdgeToEdge() setContent { SwissTransferTheme { diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/MainApplication.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/MainApplication.kt index 18dcfc5f2..b372137f8 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/MainApplication.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/MainApplication.kt @@ -18,8 +18,21 @@ package com.infomaniak.swisstransfer.ui import android.app.Application +import androidx.lifecycle.DefaultLifecycleObserver +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.lifecycleScope +import com.infomaniak.multiplatform_swisstransfer.SwissTransferInjection import dagger.hilt.android.HiltAndroidApp +import kotlinx.coroutines.launch +import javax.inject.Inject @HiltAndroidApp -class MainApplication : Application() { +class MainApplication : Application(), DefaultLifecycleObserver { + + @Inject + lateinit var swissTransferInjection: SwissTransferInjection + + override fun onStart(owner: LifecycleOwner) { + owner.lifecycleScope.launch { swissTransferInjection.loadDefaultAccount() } + } } diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDownloadsLimitScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDownloadsLimitScreen.kt index 5d12bb591..3a54d5b63 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDownloadsLimitScreen.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDownloadsLimitScreen.kt @@ -57,10 +57,10 @@ fun SettingsDownloadsLimitScreen( ) { SettingTitle(titleRes = R.string.settingsDownloadsLimitTitle) - var selectedItem by rememberSaveable { mutableIntStateOf(DownloadLimit.entries.indexOf(downloadLimit)) } - SingleSelectOptions(DownloadsLimitOption.entries, { selectedItem }, { - selectedItem = it - val selectedDownloadLimit = DownloadLimit.entries[it] + var selectedItem by rememberSaveable { mutableIntStateOf(downloadLimit.ordinal) } + SingleSelectOptions(DownloadsLimitOption.entries, { selectedItem }, { position -> + selectedItem = position + val selectedDownloadLimit = DownloadLimit.entries[position] onDownloadLimitChange(selectedDownloadLimit) }) } diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsEmailLanguageScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsEmailLanguageScreen.kt index 62d595e99..7bf3b7ef3 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsEmailLanguageScreen.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsEmailLanguageScreen.kt @@ -58,10 +58,10 @@ fun SettingsEmailLanguageScreen( ) { SettingTitle(titleRes = R.string.settingsEmailLanguageTitle) - var selectedItem by rememberSaveable { mutableIntStateOf(EmailLanguage.entries.indexOf(emailLanguage)) } - SingleSelectOptions(EmailLanguageOption.entries, { selectedItem }, { - selectedItem = it - val selectedEmailLanguage = EmailLanguage.entries[it] + var selectedItem by rememberSaveable { mutableIntStateOf(emailLanguage.ordinal) } + SingleSelectOptions(EmailLanguageOption.entries, { selectedItem }, { position -> + selectedItem = position + val selectedEmailLanguage = EmailLanguage.entries[position] onEmailLanguageChange(selectedEmailLanguage) }) } 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 d534980bf..94b116eae 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 @@ -39,10 +39,6 @@ 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.ui.components.TwoPaneScaffold import com.infomaniak.swisstransfer.ui.screen.main.settings.SettingsOptionScreens.* @@ -56,100 +52,100 @@ fun SettingsScreenWrapper( settingsViewModel: SettingsViewModel = hiltViewModel(), ) { val appSettings by settingsViewModel.appSettingsFlow.collectAsStateWithLifecycle(null) - TwoPaneScaffold( - windowAdaptiveInfo = windowAdaptiveInfo, - listPane = { ListPane(this, appSettings) }, - detailPane = { DetailPane(settingsViewModel, this, appSettings) }, - ) -} + appSettings?.let { safeAppSettings -> + TwoPaneScaffold( + windowAdaptiveInfo = windowAdaptiveInfo, + listPane = { ListPane(this, safeAppSettings) }, + detailPane = { DetailPane(settingsViewModel, this, safeAppSettings) }, + } -@OptIn(ExperimentalMaterial3AdaptiveApi::class) -@Composable -private fun ListPane(navigator: ThreePaneScaffoldNavigator, appSettings: AppSettings?) { - val context = LocalContext.current - val aboutURL = stringResource(R.string.urlAbout) - val userReportURL = stringResource(R.string.urlUserReportAndroid) + @OptIn(ExperimentalMaterial3AdaptiveApi::class) + @Composable + private fun ListPane(navigator: ThreePaneScaffoldNavigator, appSettings: AppSettings) { + val context = LocalContext.current + val aboutURL = stringResource(R.string.urlAbout) + val userReportURL = stringResource(R.string.urlUserReportAndroid) - SettingsScreen( - onItemClick = { item -> - when (item) { - NOTIFICATIONS -> context.openAppNotificationSettings() - DISCOVER_INFOMANIAK -> context.openUrl(aboutURL) - SHARE_IDEAS -> context.openUrl(userReportURL) - GIVE_FEEDBACK -> context.goToPlayStore() - else -> { - // Navigate to the detail pane with the passed item - navigator.navigateTo(ListDetailPaneScaffoldRole.Detail, item) + SettingsScreen( + onItemClick = { item -> + when (item) { + NOTIFICATIONS -> context.openAppNotificationSettings() + DISCOVER_INFOMANIAK -> context.openUrl(aboutURL) + SHARE_IDEAS -> context.openUrl(userReportURL) + GIVE_FEEDBACK -> context.goToPlayStore() + else -> { + // Navigate to the detail pane with the passed item + navigator.navigateTo(ListDetailPaneScaffoldRole.Detail, item) + } } - } - }, - getSelectedSetting = { navigator.currentDestination?.content }, - appSettings - ) -} + }, + getSelectedSetting = { navigator.currentDestination?.content }, + appSettings + ) + } -@OptIn(ExperimentalMaterial3AdaptiveApi::class) -@Composable -private fun DetailPane( - settingsViewModel: SettingsViewModel, - navigator: ThreePaneScaffoldNavigator, - appSettings: AppSettings? -) { - var lastSelectedScreen by rememberSaveable { mutableStateOf(null) } + @OptIn(ExperimentalMaterial3AdaptiveApi::class) + @Composable + private fun DetailPane( + settingsViewModel: SettingsViewModel, + navigator: ThreePaneScaffoldNavigator, + appSettings: AppSettings + ) { + var lastSelectedScreen by rememberSaveable { mutableStateOf(null) } - val destination = navigator.currentDestination?.content ?: lastSelectedScreen - navigator.currentDestination?.content?.let { lastSelectedScreen = it } + val destination = navigator.currentDestination?.content ?: lastSelectedScreen + navigator.currentDestination?.content?.let { lastSelectedScreen = it } - val navigateBackCallback: () -> Unit = { navigator.navigateBack() } - val navigateBack: (() -> Unit)? = if (navigator.canNavigateBack()) navigateBackCallback else null + val navigateBackCallback: () -> Unit = { navigator.navigateBack() } + val navigateBack: (() -> Unit)? = if (navigator.canNavigateBack()) navigateBackCallback else null - when (destination) { - THEME -> { - SettingsThemeScreen(appSettings?.theme ?: Theme.SYSTEM, navigateBack) { - settingsViewModel.setTheme(it) + when (destination) { + THEME -> { + SettingsThemeScreen(appSettings.theme, navigateBack) { + settingsViewModel.setTheme(it) + } } - } - VALIDITY_PERIOD -> { - val validityPeriod = appSettings?.validityPeriod ?: ValidityPeriod.THIRTY - SettingsValidityPeriodScreen(validityPeriod, navigateBack) { - settingsViewModel.setValidityPeriod(it) + VALIDITY_PERIOD -> { + val validityPeriod = appSettings.validityPeriod + SettingsValidityPeriodScreen(validityPeriod, navigateBack) { + settingsViewModel.setValidityPeriod(it) + } } - } - DOWNLOAD_LIMIT -> { - val downloadLimit = appSettings?.downloadLimit ?: DownloadLimit.TWOHUNDREDFIFTY - SettingsDownloadsLimitScreen(downloadLimit, navigateBack) { - settingsViewModel.setDownloadLimit(it) + DOWNLOAD_LIMIT -> { + val downloadLimit = appSettings.downloadLimit + SettingsDownloadsLimitScreen(downloadLimit, navigateBack) { + settingsViewModel.setDownloadLimit(it) + } } - } - EMAIL_LANGUAGE -> { - val emailLanguage = appSettings?.emailLanguage ?: EmailLanguage.FRENCH - SettingsEmailLanguageScreen(emailLanguage, navigateBack) { - settingsViewModel.setEmailLanguage(it) + EMAIL_LANGUAGE -> { + val emailLanguage = appSettings.emailLanguage + SettingsEmailLanguageScreen(emailLanguage, navigateBack) { + settingsViewModel.setEmailLanguage(it) + } } + NOTIFICATIONS, + DISCOVER_INFOMANIAK, + SHARE_IDEAS, + GIVE_FEEDBACK -> Unit + null -> NoSelectionEmptyState() } - NOTIFICATIONS, - DISCOVER_INFOMANIAK, - SHARE_IDEAS, - GIVE_FEEDBACK -> Unit - null -> NoSelectionEmptyState() } -} -// Show the detail pane content if selected item is available -@Composable -private fun NoSelectionEmptyState() { - Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { - Text("Select a setting item", color = SwissTransferTheme.colors.secondaryTextColor) + // Show the detail pane content if selected item is available + @Composable + private fun NoSelectionEmptyState() { + Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { + Text("Select a setting item", color = SwissTransferTheme.colors.secondaryTextColor) + } } -} -@PreviewMobile -@PreviewTablet -@Composable -private fun SettingsScreenWrapperPreview() { - SwissTransferTheme { - Surface(color = MaterialTheme.colorScheme.background) { - SettingsScreenWrapper() + @PreviewMobile + @PreviewTablet + @Composable + private fun SettingsScreenWrapperPreview() { + SwissTransferTheme { + Surface(color = MaterialTheme.colorScheme.background) { + SettingsScreenWrapper() + } } } -} 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 6f8479a17..6809979ec 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 @@ -46,7 +46,11 @@ import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme import com.infomaniak.swisstransfer.ui.utils.PreviewMobile @Composable -fun SettingsThemeScreen(theme: Theme, navigateBack: (() -> Unit)?, onThemeUpdate: (Theme) -> 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) @@ -58,10 +62,10 @@ fun SettingsThemeScreen(theme: Theme, navigateBack: (() -> Unit)?, onThemeUpdate ) { SettingTitle(titleRes = R.string.settingsThemeTitle) - var selectedItem by rememberSaveable { mutableIntStateOf(Theme.entries.indexOf(theme)) } - SingleSelectOptions(ThemeOption.entries, { selectedItem }, { - selectedItem = it - val selectedTheme = Theme.entries[it] + var selectedItem by rememberSaveable { mutableIntStateOf(theme.ordinal) } + SingleSelectOptions(ThemeOption.entries, { selectedItem }, { position -> + selectedItem = position + val selectedTheme = Theme.entries[position] onThemeUpdate(selectedTheme) }) } diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDurationValidityScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsValidityPeriodScreen.kt similarity index 94% rename from app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDurationValidityScreen.kt rename to app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsValidityPeriodScreen.kt index 0216aaa0c..97ab386bd 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDurationValidityScreen.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsValidityPeriodScreen.kt @@ -43,7 +43,7 @@ import com.infomaniak.swisstransfer.ui.utils.PreviewMobile @Composable fun SettingsValidityPeriodScreen( - validityPeriod: ValidityPeriod? = ValidityPeriod.THIRTY, + validityPeriod: ValidityPeriod, navigateBack: (() -> Unit)?, onValidityPeriodChange: (ValidityPeriod) -> Unit ) { @@ -58,10 +58,10 @@ fun SettingsValidityPeriodScreen( ) { SettingTitle(titleRes = R.string.settingsValidityPeriodTitle) - var selectedItem by rememberSaveable { mutableIntStateOf(ValidityPeriod.entries.indexOf(validityPeriod)) } - SingleSelectOptions(ValidityPeriodOption.entries, { selectedItem }, { - selectedItem = it - val selectedValidityPeriod = ValidityPeriod.entries[it] + var selectedItem by rememberSaveable { mutableIntStateOf(validityPeriod.ordinal) } + SingleSelectOptions(ValidityPeriodOption.entries, { selectedItem }, { position -> + selectedItem = position + val selectedValidityPeriod = ValidityPeriod.entries[position] onValidityPeriodChange(selectedValidityPeriod) }) } @@ -85,6 +85,7 @@ private fun SettingsThemeScreenPreview() { SwissTransferTheme { Surface { SettingsValidityPeriodScreen( + validityPeriod = ValidityPeriod.THIRTY, navigateBack = {}, onValidityPeriodChange = {} ) diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsViewModel.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsViewModel.kt index 8f4551326..fe2cce813 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsViewModel.kt @@ -36,8 +36,7 @@ class SettingsViewModel @Inject constructor( private val swissTransferInjection: SwissTransferInjection, @IoDispatcher private val ioDispatcher: CoroutineDispatcher, ) : ViewModel() { - private val appSettingsManager - inline get() = swissTransferInjection.appSettingsManager + private val appSettingsManager inline get() = swissTransferInjection.appSettingsManager val appSettingsFlow = appSettingsManager.appSettings diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c0404ed6d..25a2b0d8e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -22,7 +22,6 @@ androidx-adaptive = { module = "androidx.compose.material3.adaptive:adaptive", v androidx-adaptive-layout = { module = "androidx.compose.material3.adaptive:adaptive-layout", version.ref = "adaptiveLayout" } androidx-adaptive-navigation = { module = "androidx.compose.material3.adaptive:adaptive-navigation", version.ref = "adaptiveLayout" } androidx-constraintlayout-compose = { module = "androidx.constraintlayout:constraintlayout-compose", version.ref = "constraintlayoutCompose" } -swisstransfer-database = { module = "com.github.Infomaniak.multiplatform-SwissTransfer:STDatabase", version.ref = "swisstransfer" } swisstransfer-core = { module = "com.github.Infomaniak.multiplatform-SwissTransfer:STCore", version.ref = "swisstransfer" } androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" } diff --git a/settings.gradle.kts b/settings.gradle.kts index 34d89f9e7..d2b5ff33c 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -17,7 +17,9 @@ dependencyResolutionManagement { @Suppress("UnstableApiUsage") repositories { google() - mavenLocal() + if (gradle.startParameter.taskNames.any { it.contains("Debug") }) { + mavenLocal() + } mavenCentral() maven { url = uri("https://jitpack.io") } } From e30402320b23ea3dad0b2db9716ecd1abae38df7 Mon Sep 17 00:00:00 2001 From: Vincent TE Date: Fri, 30 Aug 2024 10:44:05 +0200 Subject: [PATCH 12/20] Disable mavenLocal --- settings.gradle.kts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/settings.gradle.kts b/settings.gradle.kts index d2b5ff33c..37a59afac 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -17,9 +17,7 @@ dependencyResolutionManagement { @Suppress("UnstableApiUsage") repositories { google() - if (gradle.startParameter.taskNames.any { it.contains("Debug") }) { - mavenLocal() - } + //mavenLocal() TODO Do not put this in production mavenCentral() maven { url = uri("https://jitpack.io") } } From e08ffc07c07c7a03339615ec7c809399b5991815 Mon Sep 17 00:00:00 2001 From: Vincent TE Date: Fri, 30 Aug 2024 11:33:04 +0200 Subject: [PATCH 13/20] Code review --- .../swisstransfer/di/ApplicationModule.kt | 8 ++++++++ .../swisstransfer/ui/MainApplication.kt | 12 +++++++++--- .../ui/screen/main/settings/SettingsScreen.kt | 19 +++++++++++++------ gradle/libs.versions.toml | 2 +- 4 files changed, 31 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/infomaniak/swisstransfer/di/ApplicationModule.kt b/app/src/main/java/com/infomaniak/swisstransfer/di/ApplicationModule.kt index 2c6e1e8fb..5c867609e 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/di/ApplicationModule.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/di/ApplicationModule.kt @@ -22,6 +22,8 @@ import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.CoroutineScope import javax.inject.Singleton @Module @@ -31,4 +33,10 @@ object ApplicationModule { @Provides @Singleton fun providesSwissTransferInjection() = SwissTransferInjection() + + @Provides + @Singleton + fun providesGlobalCoroutineScope(@DefaultDispatcher defaultDispatcher: CoroutineDispatcher): CoroutineScope { + return CoroutineScope(defaultDispatcher) + } } diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/MainApplication.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/MainApplication.kt index b372137f8..b34dc6676 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/MainApplication.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/MainApplication.kt @@ -23,16 +23,22 @@ import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.lifecycleScope import com.infomaniak.multiplatform_swisstransfer.SwissTransferInjection import dagger.hilt.android.HiltAndroidApp +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import javax.inject.Inject @HiltAndroidApp -class MainApplication : Application(), DefaultLifecycleObserver { +class MainApplication : Application() { @Inject lateinit var swissTransferInjection: SwissTransferInjection - override fun onStart(owner: LifecycleOwner) { - owner.lifecycleScope.launch { swissTransferInjection.loadDefaultAccount() } + @Inject + lateinit var globalCoroutineScope: CoroutineScope + + override fun onCreate() { + super.onCreate() + globalCoroutineScope.launch { swissTransferInjection.loadDefaultAccount() } } } 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 361029d08..5f3a3be5a 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 @@ -54,7 +54,7 @@ import com.infomaniak.swisstransfer.ui.utils.PreviewMobile fun SettingsScreen( onItemClick: (SettingsOptionScreens) -> Unit, getSelectedSetting: () -> SettingsOptionScreens?, - appSettings: AppSettings? = null, + appSettings: AppSettings, ) { val selectedSetting = getSelectedSetting() @@ -76,7 +76,7 @@ fun SettingsScreen( titleRes = R.string.settingsOptionTheme, isSelected = { selectedSetting == THEME }, icon = AppIcons.PaintbrushPalette, - description = appSettings?.theme?.getString(), + description = appSettings.theme.getString(), endIcon = CHEVRON, onClick = { onItemClick(THEME) }, SettingItem( @@ -94,7 +94,7 @@ fun SettingsScreen( titleRes = R.string.settingsOptionValidityPeriod, isSelected = { selectedSetting == VALIDITY_PERIOD }, icon = AppIcons.FileBadgeArrowDown, - description = appSettings?.validityPeriod?.getString(), + description = appSettings.validityPeriod.getString(), endIcon = CHEVRON, onClick = { onItemClick(VALIDITY_PERIOD) }, ) @@ -102,7 +102,7 @@ fun SettingsScreen( titleRes = R.string.settingsOptionDownloadLimit, isSelected = { selectedSetting == DOWNLOAD_LIMIT }, icon = AppIcons.Clock, - description = appSettings?.downloadLimit?.getString(), + description = appSettings.downloadLimit.getString(), endIcon = CHEVRON, onClick = { onItemClick(DOWNLOAD_LIMIT) }, ) @@ -110,7 +110,7 @@ fun SettingsScreen( titleRes = R.string.settingsOptionEmailLanguage, isSelected = { selectedSetting == EMAIL_LANGUAGE }, icon = AppIcons.SpeechBubble, - description = appSettings?.emailLanguage?.getString(), + description = appSettings.emailLanguage.getString(), endIcon = CHEVRON, onClick = { onItemClick(EMAIL_LANGUAGE) }, ) @@ -183,12 +183,19 @@ enum class SettingsOptionScreens { DISCOVER_INFOMANIAK, SHARE_IDEAS, GIVE_FEEDBACK, } +private class DummyAppSettings( + override var theme: Theme = Theme.SYSTEM, + override var downloadLimit: DownloadLimit = DownloadLimit.TWOHUNDREDFIFTY, + override var emailLanguage: EmailLanguage = EmailLanguage.FRENCH, + override var validityPeriod: ValidityPeriod = ValidityPeriod.THIRTY, +) : AppSettings + @PreviewMobile @Composable private fun SettingsScreenPreview() { SwissTransferTheme { Surface(color = MaterialTheme.colorScheme.background) { - SettingsScreen(onItemClick = {}, getSelectedSetting = { null }) + SettingsScreen(onItemClick = {}, getSelectedSetting = { null }, DummyAppSettings()) } } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 25a2b0d8e..229e2ca7e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -14,7 +14,7 @@ lifecycleRuntimeKtx = "2.8.4" material3Beta = "1.3.0-rc01" navigation = "2.8.0-rc01" serialization = "1.7.1" -swisstransfer = "0.1.0" +swisstransfer = "0.1.1" [libraries] androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" } From 3cf1323ee494859e661561d1166a5f142867793a Mon Sep 17 00:00:00 2001 From: Abdourahamane Boinaidi Date: Tue, 3 Sep 2024 13:58:22 +0200 Subject: [PATCH 14/20] Refactor MainApplication --- .../java/com/infomaniak/swisstransfer/ui/MainApplication.kt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/MainApplication.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/MainApplication.kt index b34dc6676..ca2e2f661 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/MainApplication.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/MainApplication.kt @@ -18,13 +18,9 @@ package com.infomaniak.swisstransfer.ui import android.app.Application -import androidx.lifecycle.DefaultLifecycleObserver -import androidx.lifecycle.LifecycleOwner -import androidx.lifecycle.lifecycleScope import com.infomaniak.multiplatform_swisstransfer.SwissTransferInjection import dagger.hilt.android.HiltAndroidApp import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import javax.inject.Inject From a7e9e929e03ebbe9bc2075c0d6a9c50972cdf3de Mon Sep 17 00:00:00 2001 From: Abdourahamane Boinaidi Date: Tue, 3 Sep 2024 14:40:11 +0200 Subject: [PATCH 15/20] Refactor SettingsScreen --- .../ui/screen/main/settings/SettingsScreen.kt | 4 +- .../main/settings/SettingsScreenWrapper.kt | 76 +++++++++---------- 2 files changed, 38 insertions(+), 42 deletions(-) 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 5f3a3be5a..d3a47b030 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 @@ -52,9 +52,9 @@ import com.infomaniak.swisstransfer.ui.utils.PreviewMobile @Composable fun SettingsScreen( + appSettings: AppSettings, onItemClick: (SettingsOptionScreens) -> Unit, getSelectedSetting: () -> SettingsOptionScreens?, - appSettings: AppSettings, ) { val selectedSetting = getSelectedSetting() @@ -195,7 +195,7 @@ private class DummyAppSettings( private fun SettingsScreenPreview() { SwissTransferTheme { Surface(color = MaterialTheme.colorScheme.background) { - SettingsScreen(onItemClick = {}, getSelectedSetting = { null }, DummyAppSettings()) + SettingsScreen(appSettings = DummyAppSettings(), onItemClick = {}, getSelectedSetting = { null }) } } } 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 94b116eae..ee5f906e8 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 @@ -56,31 +56,7 @@ fun SettingsScreenWrapper( TwoPaneScaffold( windowAdaptiveInfo = windowAdaptiveInfo, listPane = { ListPane(this, safeAppSettings) }, - detailPane = { DetailPane(settingsViewModel, this, safeAppSettings) }, - } - - @OptIn(ExperimentalMaterial3AdaptiveApi::class) - @Composable - private fun ListPane(navigator: ThreePaneScaffoldNavigator, appSettings: AppSettings) { - val context = LocalContext.current - val aboutURL = stringResource(R.string.urlAbout) - val userReportURL = stringResource(R.string.urlUserReportAndroid) - - SettingsScreen( - onItemClick = { item -> - when (item) { - NOTIFICATIONS -> context.openAppNotificationSettings() - DISCOVER_INFOMANIAK -> context.openUrl(aboutURL) - SHARE_IDEAS -> context.openUrl(userReportURL) - GIVE_FEEDBACK -> context.goToPlayStore() - else -> { - // Navigate to the detail pane with the passed item - navigator.navigateTo(ListDetailPaneScaffoldRole.Detail, item) - } - } - }, - getSelectedSetting = { navigator.currentDestination?.content }, - appSettings + detailPane = { DetailPane(safeAppSettings, settingsViewModel, navigator = this) }, ) } @@ -93,23 +69,43 @@ fun SettingsScreenWrapper( ) { var lastSelectedScreen by rememberSaveable { mutableStateOf(null) } - val destination = navigator.currentDestination?.content ?: lastSelectedScreen - navigator.currentDestination?.content?.let { lastSelectedScreen = it } - - val navigateBackCallback: () -> Unit = { navigator.navigateBack() } - val navigateBack: (() -> Unit)? = if (navigator.canNavigateBack()) navigateBackCallback else null - - when (destination) { - THEME -> { - SettingsThemeScreen(appSettings.theme, navigateBack) { - settingsViewModel.setTheme(it) + SettingsScreen( + appSettings, + onItemClick = { item -> + when (item) { + NOTIFICATIONS -> context.openAppNotificationSettings() + DISCOVER_INFOMANIAK -> context.openUrl(aboutURL) + SHARE_IDEAS -> context.openUrl(userReportURL) + GIVE_FEEDBACK -> context.goToPlayStore() + else -> { + // Navigate to the detail pane with the passed item + navigator.navigateTo(ListDetailPaneScaffoldRole.Detail, item) } } - VALIDITY_PERIOD -> { - val validityPeriod = appSettings.validityPeriod - SettingsValidityPeriodScreen(validityPeriod, navigateBack) { - settingsViewModel.setValidityPeriod(it) - } + }, + getSelectedSetting = { navigator.currentDestination?.content }, + ) +} + +@OptIn(ExperimentalMaterial3AdaptiveApi::class) +@Composable +private fun DetailPane( + appSettings: AppSettings, + settingsViewModel: SettingsViewModel, + navigator: ThreePaneScaffoldNavigator, +) { + var lastSelectedScreen by rememberSaveable { mutableStateOf(null) } + + val destination = navigator.currentDestination?.content ?: lastSelectedScreen + navigator.currentDestination?.content?.let { lastSelectedScreen = it } + + val navigateBackCallback: () -> Unit = { navigator.navigateBack() } + val navigateBack: (() -> Unit)? = if (navigator.canNavigateBack()) navigateBackCallback else null + + when (destination) { + THEME -> { + SettingsThemeScreen(appSettings.theme, navigateBack) { + settingsViewModel.setTheme(it) } DOWNLOAD_LIMIT -> { val downloadLimit = appSettings.downloadLimit From 4c4a66407cdfe4899243973fe9ee854e030f0a70 Mon Sep 17 00:00:00 2001 From: Abdourahamane Boinaidi Date: Tue, 3 Sep 2024 14:55:58 +0200 Subject: [PATCH 16/20] Update app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDownloadsLimitScreen.kt Co-authored-by: Kevin Boulongne <1788629+KevinBoulongne@users.noreply.github.com> --- .../ui/screen/main/settings/SettingsDownloadsLimitScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDownloadsLimitScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDownloadsLimitScreen.kt index 3a54d5b63..04a2134f7 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDownloadsLimitScreen.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDownloadsLimitScreen.kt @@ -44,7 +44,7 @@ import com.infomaniak.swisstransfer.ui.utils.PreviewMobile fun SettingsDownloadsLimitScreen( downloadLimit: DownloadLimit, navigateBack: (() -> Unit)?, - onDownloadLimitChange: (DownloadLimit) -> Unit + onDownloadLimitChange: (DownloadLimit) -> Unit, ) { Scaffold(topBar = { val canDisplayBackButton = navigateBack?.let { TopAppBarButton.backButton(navigateBack) } From ece4058491f51951593e27b592d2e0e2b2694b14 Mon Sep 17 00:00:00 2001 From: Abdourahamane Boinaidi Date: Tue, 3 Sep 2024 14:58:32 +0200 Subject: [PATCH 17/20] Update app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsValidityPeriodScreen.kt Co-authored-by: Kevin Boulongne <1788629+KevinBoulongne@users.noreply.github.com> --- .../ui/screen/main/settings/SettingsValidityPeriodScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsValidityPeriodScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsValidityPeriodScreen.kt index 97ab386bd..694828587 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsValidityPeriodScreen.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsValidityPeriodScreen.kt @@ -45,7 +45,7 @@ import com.infomaniak.swisstransfer.ui.utils.PreviewMobile fun SettingsValidityPeriodScreen( validityPeriod: ValidityPeriod, navigateBack: (() -> Unit)?, - onValidityPeriodChange: (ValidityPeriod) -> Unit + onValidityPeriodChange: (ValidityPeriod) -> Unit, ) { Scaffold(topBar = { val canDisplayBackButton = navigateBack?.let { TopAppBarButton.backButton(navigateBack) } From 1b7793dece06ba2ca8a3a79b31e91dba29a27c05 Mon Sep 17 00:00:00 2001 From: Abdourahamane Boinaidi Date: Tue, 3 Sep 2024 14:58:40 +0200 Subject: [PATCH 18/20] Update app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsValidityPeriodScreen.kt Co-authored-by: Kevin Boulongne <1788629+KevinBoulongne@users.noreply.github.com> --- .../ui/screen/main/settings/SettingsValidityPeriodScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsValidityPeriodScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsValidityPeriodScreen.kt index 694828587..d49cc307d 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsValidityPeriodScreen.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsValidityPeriodScreen.kt @@ -87,7 +87,7 @@ private fun SettingsThemeScreenPreview() { SettingsValidityPeriodScreen( validityPeriod = ValidityPeriod.THIRTY, navigateBack = {}, - onValidityPeriodChange = {} + onValidityPeriodChange = {}, ) } } From ba6ef25f1872a7b7b39cc15cbe4c089c6f1bf735 Mon Sep 17 00:00:00 2001 From: Abdourahamane Boinaidi Date: Tue, 3 Sep 2024 15:08:11 +0200 Subject: [PATCH 19/20] Refactor DownloadLimitOption --- .../ui/screen/main/settings/SettingsDownloadsLimitScreen.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDownloadsLimitScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDownloadsLimitScreen.kt index 04a2134f7..ca4ed8d9e 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDownloadsLimitScreen.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDownloadsLimitScreen.kt @@ -58,7 +58,7 @@ fun SettingsDownloadsLimitScreen( SettingTitle(titleRes = R.string.settingsDownloadsLimitTitle) var selectedItem by rememberSaveable { mutableIntStateOf(downloadLimit.ordinal) } - SingleSelectOptions(DownloadsLimitOption.entries, { selectedItem }, { position -> + SingleSelectOptions(DownloadLimitOption.entries, { selectedItem }, { position -> selectedItem = position val selectedDownloadLimit = DownloadLimit.entries[position] onDownloadLimitChange(selectedDownloadLimit) @@ -67,7 +67,7 @@ fun SettingsDownloadsLimitScreen( } } -enum class DownloadsLimitOption( +enum class DownloadLimitOption( override val title: @Composable () -> String, override val imageVector: ImageVector? = null, override val imageVectorResId: Int? = null, From 7aebfde1a8140bc9cc6ee9221b5ade3d1e5fc451 Mon Sep 17 00:00:00 2001 From: Kevin Boulongne Date: Tue, 3 Sep 2024 15:42:30 +0200 Subject: [PATCH 20/20] Clean code --- .../settings/SettingsDownloadsLimitScreen.kt | 2 +- .../settings/SettingsEmailLanguageScreen.kt | 4 +- .../ui/screen/main/settings/SettingsScreen.kt | 3 +- .../main/settings/SettingsScreenWrapper.kt | 91 ++++++++++--------- .../main/settings/SettingsThemeScreen.kt | 4 +- .../screen/main/settings/SettingsViewModel.kt | 1 - settings.gradle.kts | 2 +- 7 files changed, 55 insertions(+), 52 deletions(-) diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDownloadsLimitScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDownloadsLimitScreen.kt index ca4ed8d9e..a4b0d71a1 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDownloadsLimitScreen.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDownloadsLimitScreen.kt @@ -86,7 +86,7 @@ private fun SettingsThemeScreenPreview() { SettingsDownloadsLimitScreen( downloadLimit = DownloadLimit.TWOHUNDREDFIFTY, navigateBack = {}, - onDownloadLimitChange = {} + onDownloadLimitChange = {}, ) } } diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsEmailLanguageScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsEmailLanguageScreen.kt index 7bf3b7ef3..3aa88b978 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsEmailLanguageScreen.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsEmailLanguageScreen.kt @@ -45,7 +45,7 @@ import com.infomaniak.swisstransfer.ui.utils.PreviewMobile fun SettingsEmailLanguageScreen( emailLanguage: EmailLanguage, navigateBack: (() -> Unit)?, - onEmailLanguageChange: (EmailLanguage) -> Unit + onEmailLanguageChange: (EmailLanguage) -> Unit, ) { Scaffold(topBar = { val canDisplayBackButton = navigateBack?.let { TopAppBarButton.backButton(navigateBack) } @@ -88,7 +88,7 @@ private fun SettingsThemeScreenPreview() { SettingsEmailLanguageScreen( emailLanguage = EmailLanguage.FRENCH, navigateBack = {}, - onEmailLanguageChange = {} + onEmailLanguageChange = {}, ) } } 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 d3a47b030..483fb0e5f 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 @@ -79,6 +79,7 @@ fun SettingsScreen( description = appSettings.theme.getString(), endIcon = CHEVRON, onClick = { onItemClick(THEME) }, + ) SettingItem( titleRes = R.string.settingsOptionNotifications, isSelected = { selectedSetting == NOTIFICATIONS }, @@ -93,7 +94,7 @@ fun SettingsScreen( SettingItem( titleRes = R.string.settingsOptionValidityPeriod, isSelected = { selectedSetting == VALIDITY_PERIOD }, - icon = AppIcons.FileBadgeArrowDown, + icon = AppIcons.ArrowDownFile, description = appSettings.validityPeriod.getString(), endIcon = CHEVRON, onClick = { onItemClick(VALIDITY_PERIOD) }, 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 ee5f906e8..432ef5234 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 @@ -59,15 +59,14 @@ fun SettingsScreenWrapper( detailPane = { DetailPane(safeAppSettings, settingsViewModel, navigator = this) }, ) } +} - @OptIn(ExperimentalMaterial3AdaptiveApi::class) - @Composable - private fun DetailPane( - settingsViewModel: SettingsViewModel, - navigator: ThreePaneScaffoldNavigator, - appSettings: AppSettings - ) { - var lastSelectedScreen by rememberSaveable { mutableStateOf(null) } +@OptIn(ExperimentalMaterial3AdaptiveApi::class) +@Composable +private fun ListPane(navigator: ThreePaneScaffoldNavigator, appSettings: AppSettings) { + val context = LocalContext.current + val aboutURL = stringResource(R.string.urlAbout) + val userReportURL = stringResource(R.string.urlUserReportAndroid) SettingsScreen( appSettings, @@ -103,45 +102,49 @@ private fun DetailPane( val navigateBack: (() -> Unit)? = if (navigator.canNavigateBack()) navigateBackCallback else null when (destination) { - THEME -> { - SettingsThemeScreen(appSettings.theme, navigateBack) { - settingsViewModel.setTheme(it) - } - DOWNLOAD_LIMIT -> { - val downloadLimit = appSettings.downloadLimit - SettingsDownloadsLimitScreen(downloadLimit, navigateBack) { - settingsViewModel.setDownloadLimit(it) - } - } - EMAIL_LANGUAGE -> { - val emailLanguage = appSettings.emailLanguage - SettingsEmailLanguageScreen(emailLanguage, navigateBack) { - settingsViewModel.setEmailLanguage(it) - } - } - NOTIFICATIONS, - DISCOVER_INFOMANIAK, - SHARE_IDEAS, - GIVE_FEEDBACK -> Unit - null -> NoSelectionEmptyState() - } + THEME -> SettingsThemeScreen( + theme = appSettings.theme, + navigateBack = navigateBack, + onThemeUpdate = settingsViewModel::setTheme, + ) + VALIDITY_PERIOD -> SettingsValidityPeriodScreen( + validityPeriod = appSettings.validityPeriod, + navigateBack = navigateBack, + onValidityPeriodChange = settingsViewModel::setValidityPeriod, + ) + DOWNLOAD_LIMIT -> SettingsDownloadsLimitScreen( + downloadLimit = appSettings.downloadLimit, + navigateBack = navigateBack, + onDownloadLimitChange = settingsViewModel::setDownloadLimit, + ) + EMAIL_LANGUAGE -> SettingsEmailLanguageScreen( + emailLanguage = appSettings.emailLanguage, + navigateBack = navigateBack, + onEmailLanguageChange = settingsViewModel::setEmailLanguage, + ) + NOTIFICATIONS, + DISCOVER_INFOMANIAK, + SHARE_IDEAS, + GIVE_FEEDBACK -> Unit + null -> NoSelectionEmptyState() } +} - // Show the detail pane content if selected item is available - @Composable - private fun NoSelectionEmptyState() { - Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { - Text("Select a setting item", color = SwissTransferTheme.colors.secondaryTextColor) - } +// Show the detail pane content if selected item is available +@Composable +private fun NoSelectionEmptyState() { + Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { + Text("Select a setting item", color = SwissTransferTheme.colors.secondaryTextColor) } +} - @PreviewMobile - @PreviewTablet - @Composable - private fun SettingsScreenWrapperPreview() { - SwissTransferTheme { - Surface(color = MaterialTheme.colorScheme.background) { - SettingsScreenWrapper() - } +@PreviewMobile +@PreviewTablet +@Composable +private fun SettingsScreenWrapperPreview() { + SwissTransferTheme { + Surface(color = MaterialTheme.colorScheme.background) { + SettingsScreenWrapper() } } +} 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 6809979ec..e30770521 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 @@ -49,7 +49,7 @@ import com.infomaniak.swisstransfer.ui.utils.PreviewMobile fun SettingsThemeScreen( theme: Theme, navigateBack: (() -> Unit)?, - onThemeUpdate: (Theme) -> Unit + onThemeUpdate: (Theme) -> Unit, ) { Scaffold(topBar = { val canDisplayBackButton = navigateBack?.let { TopAppBarButton.backButton(navigateBack) } @@ -87,7 +87,7 @@ enum class ThemeOption( private fun SettingsThemeScreenPreview() { SwissTransferTheme { Surface { - SettingsThemeScreen(Theme.SYSTEM, {}, {}) + SettingsThemeScreen(theme = Theme.SYSTEM, navigateBack = {}, onThemeUpdate = {}) } } } diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsViewModel.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsViewModel.kt index fe2cce813..2f647e85e 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsViewModel.kt @@ -15,7 +15,6 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ - package com.infomaniak.swisstransfer.ui.screen.main.settings import androidx.lifecycle.ViewModel diff --git a/settings.gradle.kts b/settings.gradle.kts index 37a59afac..1a80ad33d 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -17,7 +17,7 @@ dependencyResolutionManagement { @Suppress("UnstableApiUsage") repositories { google() - //mavenLocal() TODO Do not put this in production + // mavenLocal() // TODO Do not put this in production mavenCentral() maven { url = uri("https://jitpack.io") } }