From 24837e504d8636743d899a1d9c90714a847dad10 Mon Sep 17 00:00:00 2001 From: Vincent TE Date: Tue, 27 Aug 2024 14:07:36 +0200 Subject: [PATCH] Refacto --- .../settings/SettingsDownloadsLimitScreen.kt | 12 +- .../SettingsDurationValidityScreen.kt | 11 +- .../settings/SettingsEmailLanguageScreen.kt | 8 +- .../ui/screen/main/settings/SettingsScreen.kt | 95 ++------------- .../main/settings/SettingsScreenWrapper.kt | 110 ++++++++++++++++++ .../main/settings/SettingsThemeScreen.kt | 11 +- 6 files changed, 145 insertions(+), 102 deletions(-) create mode 100644 app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsScreenWrapper.kt 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 99416c2fda..6026ec848a 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 @@ -19,8 +19,10 @@ package com.infomaniak.swisstransfer.ui.screen.main.settings import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Scaffold import androidx.compose.material3.Surface import androidx.compose.runtime.Composable import androidx.compose.runtime.mutableIntStateOf @@ -39,11 +41,15 @@ import com.infomaniak.swisstransfer.ui.utils.PreviewTablet @Composable fun SettingsDownloadsLimitScreen(navigateBack: (() -> Unit)?) { - Column { + Scaffold(topBar = { val canDisplayBackButton = navigateBack?.let { TopAppBarButton.backButton(navigateBack) } SwissTransferTobAppBar(R.string.settingsOptionDownloadLimit, navigationMenu = canDisplayBackButton) - - Column(modifier = Modifier.verticalScroll(rememberScrollState())) { + }) { paddingsValue -> + Column( + modifier = Modifier + .verticalScroll(rememberScrollState()) + .padding(paddingsValue) + ) { SettingTitle(titleRes = R.string.settingsDownloadsLimitTitle) val (selectedItem, setSelectedItem) = rememberSaveable { mutableIntStateOf(0) } // TODO: Use DataStore or Realm 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 5471ec6fd3..1f1c58365d 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 @@ -19,8 +19,10 @@ package com.infomaniak.swisstransfer.ui.screen.main.settings import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Scaffold import androidx.compose.material3.Surface import androidx.compose.runtime.Composable import androidx.compose.runtime.mutableIntStateOf @@ -40,12 +42,13 @@ import com.infomaniak.swisstransfer.ui.utils.PreviewTablet @Composable fun SettingsValidityPeriodScreen(navigateBack: (() -> Unit)?) { - Column { + Scaffold(topBar = { val canDisplayBackButton = navigateBack?.let { TopAppBarButton.backButton(navigateBack) } SwissTransferTobAppBar(R.string.settingsOptionValidityPeriod, navigationMenu = canDisplayBackButton) - - Column(modifier = Modifier.verticalScroll(rememberScrollState())) { - + }) { paddingsValue -> + Column(modifier = Modifier + .verticalScroll(rememberScrollState()) + .padding(paddingsValue)) { SettingTitle(titleRes = R.string.settingsValidityPeriodTitle) val (selectedItem, setSelectedItem) = rememberSaveable { mutableIntStateOf(0) } // TODO: Use DataStore or Realm 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 fc0549c50c..0311f31ef9 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 @@ -19,8 +19,10 @@ package com.infomaniak.swisstransfer.ui.screen.main.settings import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Scaffold import androidx.compose.material3.Surface import androidx.compose.runtime.Composable import androidx.compose.runtime.mutableIntStateOf @@ -40,11 +42,11 @@ import com.infomaniak.swisstransfer.ui.utils.PreviewTablet @Composable fun SettingsEmailLanguageScreen(navigateBack: (() -> Unit)?) { - Column { + Scaffold(topBar = { val canDisplayBackButton = navigateBack?.let { TopAppBarButton.backButton(navigateBack) } SwissTransferTobAppBar(R.string.settingsOptionEmailLanguage, navigationMenu = canDisplayBackButton) - - Column(modifier = Modifier.verticalScroll(rememberScrollState())) { + }) { paddingsValue -> + Column(modifier = Modifier.verticalScroll(rememberScrollState()).padding(paddingsValue)) { SettingTitle(titleRes = R.string.settingsEmailLanguageTitle) val (selectedItem, setSelectedItem) = rememberSaveable { mutableIntStateOf(0) } // TODO: Use DataStore or Realm 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 0a1cfcd307..05bfe5fb2e 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 @@ -18,33 +18,20 @@ package com.infomaniak.swisstransfer.ui.screen.main.settings -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.selection.selectableGroup import androidx.compose.foundation.verticalScroll import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold import androidx.compose.material3.Surface import androidx.compose.material3.Text -import androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi -import androidx.compose.material3.adaptive.WindowAdaptiveInfo -import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo -import androidx.compose.material3.adaptive.layout.ListDetailPaneScaffoldRole -import androidx.compose.material3.adaptive.navigation.ThreePaneScaffoldNavigator import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.saveable.rememberSaveable -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import com.infomaniak.swisstransfer.R -import com.infomaniak.swisstransfer.extensions.goToPlayStore -import com.infomaniak.swisstransfer.extensions.openAppNotificationSettings -import com.infomaniak.swisstransfer.extensions.openUrl import com.infomaniak.swisstransfer.ui.components.BrandTobAppBar -import com.infomaniak.swisstransfer.ui.components.TwoPaneScaffold import com.infomaniak.swisstransfer.ui.icons.AppIcons import com.infomaniak.swisstransfer.ui.icons.app.* import com.infomaniak.swisstransfer.ui.screen.main.settings.SettingsOptionScreens.* @@ -58,76 +45,16 @@ import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme import com.infomaniak.swisstransfer.ui.utils.PreviewMobile import com.infomaniak.swisstransfer.ui.utils.PreviewTablet -@OptIn(ExperimentalMaterial3AdaptiveApi::class) @Composable -fun SettingsScreenWrapper(windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfo()) { - TwoPaneScaffold( - windowAdaptiveInfo, - listPane = { ListPane(this) }, - detailPane = { DetailPane(this) } - ) -} - -@OptIn(ExperimentalMaterial3AdaptiveApi::class) -@Composable -private fun ListPane(navigator: ThreePaneScaffoldNavigator) { - 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 }, - ) -} - -@OptIn(ExperimentalMaterial3AdaptiveApi::class) -@Composable -private fun DetailPane(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(navigateBack) - VALIDITY_PERIOD -> SettingsValidityPeriodScreen(navigateBack) - DOWNLOAD_LIMIT -> SettingsDownloadsLimitScreen(navigateBack) - EMAIL_LANGUAGE -> SettingsEmailLanguageScreen(navigateBack) - NOTIFICATIONS, - DISCOVER_INFOMANIAK, - SHARE_IDEAS, - GIVE_FEEDBACK -> Unit - null -> NoSelectionEmptyState() - } -} - -@Composable -private fun SettingsScreen(onItemClick: (SettingsOptionScreens) -> Unit, getSelectedSetting: () -> SettingsOptionScreens?) { +fun SettingsScreen(onItemClick: (SettingsOptionScreens) -> Unit, getSelectedSetting: () -> SettingsOptionScreens?) { val selectedSetting = getSelectedSetting() - - Column { - BrandTobAppBar() - + Scaffold(topBar = { BrandTobAppBar() }) { paddingsValue -> Column( modifier = Modifier .verticalScroll(rememberScrollState()) - .selectableGroup(), + .selectableGroup() + .padding(paddingsValue), ) { Text( modifier = Modifier.padding(horizontal = Margin.Medium, vertical = Margin.Large), @@ -207,14 +134,6 @@ private fun SettingsScreen(onItemClick: (SettingsOptionScreens) -> Unit, getSele } } -// 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) - } -} - 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 new file mode 100644 index 0000000000..0b4ce53262 --- /dev/null +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsScreenWrapper.kt @@ -0,0 +1,110 @@ +/* + * 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.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.Text +import androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi +import androidx.compose.material3.adaptive.WindowAdaptiveInfo +import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo +import androidx.compose.material3.adaptive.layout.ListDetailPaneScaffoldRole +import androidx.compose.material3.adaptive.navigation.ThreePaneScaffoldNavigator +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import com.infomaniak.swisstransfer.R +import com.infomaniak.swisstransfer.extensions.goToPlayStore +import com.infomaniak.swisstransfer.extensions.openAppNotificationSettings +import com.infomaniak.swisstransfer.extensions.openUrl +import com.infomaniak.swisstransfer.ui.components.TwoPaneScaffold +import com.infomaniak.swisstransfer.ui.screen.main.settings.SettingsOptionScreens.* +import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme + +@OptIn(ExperimentalMaterial3AdaptiveApi::class) +@Composable +fun SettingsScreenWrapper(windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfo()) { + TwoPaneScaffold( + windowAdaptiveInfo, + listPane = { ListPane(this) }, + detailPane = { DetailPane(this) } + ) +} + +@OptIn(ExperimentalMaterial3AdaptiveApi::class) +@Composable +private fun ListPane(navigator: ThreePaneScaffoldNavigator) { + 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 }, + ) +} + +@OptIn(ExperimentalMaterial3AdaptiveApi::class) +@Composable +private fun DetailPane(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(navigateBack) + VALIDITY_PERIOD -> SettingsValidityPeriodScreen(navigateBack) + DOWNLOAD_LIMIT -> SettingsDownloadsLimitScreen(navigateBack) + EMAIL_LANGUAGE -> SettingsEmailLanguageScreen(navigateBack) + 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) + } +} 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 f2315b5d6b..5f0701d0e8 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 @@ -19,8 +19,10 @@ package com.infomaniak.swisstransfer.ui.screen.main.settings import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState 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 @@ -46,12 +48,13 @@ import com.infomaniak.swisstransfer.ui.utils.PreviewTablet @Composable fun SettingsThemeScreen(navigateBack: (() -> Unit)?) { - Column { + Scaffold(topBar = { val canDisplayBackButton = navigateBack?.let { TopAppBarButton.backButton(navigateBack) } SwissTransferTobAppBar(R.string.settingsOptionTheme, navigationMenu = canDisplayBackButton) - - Column(modifier = Modifier.verticalScroll(rememberScrollState())) { - + }) { paddingsValue -> + Column(modifier = Modifier + .verticalScroll(rememberScrollState()) + .padding(paddingsValue)) { SettingTitle(titleRes = R.string.settingsThemeTitle) var selectedItem by rememberSaveable { mutableIntStateOf(0) } // TODO: Use DataStore or Realm