From 07cc826fa60a2ea82bccfae2860b945b13370bac Mon Sep 17 00:00:00 2001 From: Vincent TE Date: Wed, 21 Aug 2024 16:30:17 +0200 Subject: [PATCH 01/10] Add url in strings and handle external action --- .../ui/screen/main/settings/SettingsScreen.kt | 9 +++++++++ 1 file changed, 9 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 d2ac70cd7..4e0c6a2a9 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,6 +18,12 @@ package com.infomaniak.swisstransfer.ui.screen.main.settings +import android.content.ActivityNotFoundException +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.provider.Settings import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize @@ -65,6 +71,9 @@ import com.infomaniak.swisstransfer.ui.utils.PreviewTablet fun SettingsScreenWrapper( windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfo(), ) { + val context = LocalContext.current + val aboutURL = stringResource(R.string.urlAbout) + val userReportURL = stringResource(R.string.urlUserReportAndroid) TwoPaneScaffold( windowAdaptiveInfo, listPane = { ListPane(this) }, From 66fd5d5efd4bb3c24e569e994447b752b330f85c Mon Sep 17 00:00:00 2001 From: Vincent TE Date: Thu, 22 Aug 2024 08:27:34 +0200 Subject: [PATCH 02/10] Add email language settings UI --- .../ui/icons/illu/EnglishFlag.kt | 196 ++++++++++++++++++ .../swisstransfer/ui/icons/illu/FrenchFlag.kt | 104 ++++++++++ .../swisstransfer/ui/icons/illu/GermanFlag.kt | 86 ++++++++ .../ui/icons/illu/ItalianFlag.kt | 88 ++++++++ 4 files changed, 474 insertions(+) create mode 100644 app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/EnglishFlag.kt create mode 100644 app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/FrenchFlag.kt create mode 100644 app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/GermanFlag.kt create mode 100644 app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/ItalianFlag.kt diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/EnglishFlag.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/EnglishFlag.kt new file mode 100644 index 000000000..fb935b1d0 --- /dev/null +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/EnglishFlag.kt @@ -0,0 +1,196 @@ +package com.infomaniak.swisstransfer.ui.icons.illu + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.PathFillType.Companion.NonZero +import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.graphics.StrokeCap.Companion.Butt +import androidx.compose.ui.graphics.StrokeJoin.Companion.Miter +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.graphics.vector.ImageVector.Builder +import androidx.compose.ui.graphics.vector.group +import androidx.compose.ui.graphics.vector.path +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.infomaniak.swisstransfer.ui.icons.AppIcons + +val AppIcons.EnglishFlag: ImageVector + get() { + if (_englishFlag != null) { + return _englishFlag!! + } + _englishFlag = Builder( + name = "EnglishFlag", + defaultWidth = 24.0.dp, + defaultHeight = 24.0.dp, + viewportWidth = 24.0f, + viewportHeight = 24.0f + ).apply { + group { + path( + fill = SolidColor(Color(0xFF0B5394)), stroke = null, strokeLineWidth = + 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = + 4.0f, pathFillType = NonZero + ) { + moveTo(1.333f, 3.0f) + horizontalLineToRelative(21.334f) + arcTo(1.333f, 1.333f, 0.0f, false, true, 24.0f, 4.333f) + verticalLineToRelative(15.334f) + arcTo(1.333f, 1.333f, 0.0f, false, true, 22.667f, 21.0f) + horizontalLineTo(1.333f) + arcTo(1.333f, 1.333f, 0.0f, false, true, 0.0f, 19.667f) + verticalLineTo(4.333f) + arcTo(1.333f, 1.333f, 0.0f, false, true, 1.333f, 3.0f) + close() + } + path( + fill = SolidColor(Color(0xFFFFFFFF)), stroke = null, strokeLineWidth = + 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = + 4.0f, pathFillType = NonZero + ) { + moveTo(12.0f, 11.667f) + lineTo(24.0f, 3.0f) + verticalLineToRelative(3.333f) + lineToRelative(-6.667f, 4.0f) + close() + } + path( + fill = SolidColor(Color(0xFFD0142C)), stroke = null, strokeLineWidth = + 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = + 4.0f, pathFillType = NonZero + ) { + moveTo(14.667f, 10.334f) + lineTo(24.0f, 3.667f) + verticalLineTo(5.0f) + lineToRelative(-8.0f, 5.334f) + close() + } + path( + fill = SolidColor(Color(0xFFFFFFFF)), stroke = null, strokeLineWidth = + 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = + 4.0f, pathFillType = NonZero + ) { + moveTo(12.0f, 13.667f) + lineTo(0.0f, 22.334f) + verticalLineToRelative(-3.333f) + lineToRelative(6.667f, -4.0f) + close() + } + path( + fill = SolidColor(Color(0xFFD0142C)), stroke = null, strokeLineWidth = + 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = + 4.0f, pathFillType = NonZero + ) { + moveTo(9.333f, 15.0f) + lineTo(0.0f, 21.667f) + verticalLineToRelative(-1.333f) + lineTo(8.0f, 15.0f) + close() + } + path( + fill = SolidColor(Color(0xFFFFFFFF)), stroke = null, strokeLineWidth = + 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = + 4.0f, pathFillType = NonZero + ) { + moveTo(12.0f, 11.667f) + lineTo(0.0f, 3.0f) + verticalLineToRelative(3.333f) + lineToRelative(6.667f, 4.0f) + close() + } + path( + fill = SolidColor(Color(0xFFD0142C)), stroke = null, strokeLineWidth = + 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = + 4.0f, pathFillType = NonZero + ) { + moveTo(9.333f, 10.334f) + lineTo(0.0f, 3.667f) + verticalLineTo(5.0f) + lineToRelative(8.0f, 5.334f) + close() + } + path( + fill = SolidColor(Color(0xFFFFFFFF)), stroke = null, strokeLineWidth = + 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = + 4.0f, pathFillType = NonZero + ) { + moveTo(12.0f, 13.667f) + lineToRelative(12.0f, 8.667f) + verticalLineToRelative(-3.333f) + lineToRelative(-6.667f, -4.0f) + close() + } + path( + fill = SolidColor(Color(0xFFD0142C)), stroke = null, strokeLineWidth = + 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = + 4.0f, pathFillType = NonZero + ) { + moveTo(14.667f, 15.0f) + lineTo(24.0f, 21.667f) + verticalLineToRelative(-1.333f) + lineTo(16.0f, 15.0f) + close() + } + path( + fill = SolidColor(Color(0xFFFFFFFF)), stroke = null, strokeLineWidth = + 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = + 4.0f, pathFillType = NonZero + ) { + moveTo(0.0f, 15.0f) + verticalLineTo(9.667f) + horizontalLineToRelative(24.0f) + verticalLineTo(15.0f) + close() + } + path( + fill = SolidColor(Color(0xFFFFFFFF)), stroke = null, strokeLineWidth = + 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = + 4.0f, pathFillType = NonZero + ) { + moveTo(9.333f, 3.0f) + horizontalLineToRelative(5.333f) + verticalLineToRelative(18.667f) + horizontalLineTo(9.333f) + close() + } + path( + fill = SolidColor(Color(0xFFD0142C)), stroke = null, strokeLineWidth = + 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = + 4.0f, pathFillType = NonZero + ) { + moveTo(10.667f, 3.0f) + horizontalLineToRelative(2.667f) + verticalLineToRelative(18.667f) + horizontalLineToRelative(-2.667f) + close() + } + path( + fill = SolidColor(Color(0xFFD0142C)), stroke = null, strokeLineWidth = + 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = + 4.0f, pathFillType = NonZero + ) { + moveTo(0.0f, 13.667f) + verticalLineTo(11.0f) + horizontalLineToRelative(24.0f) + verticalLineToRelative(2.667f) + close() + } + } + } + .build() + return _englishFlag!! + } + +private var _englishFlag: ImageVector? = null + +@Preview +@Composable +private fun Preview() { + Box(modifier = Modifier.padding(12.dp)) { + Image(imageVector = AppIcons.EnglishFlag, contentDescription = "") + } +} diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/FrenchFlag.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/FrenchFlag.kt new file mode 100644 index 000000000..860625789 --- /dev/null +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/FrenchFlag.kt @@ -0,0 +1,104 @@ +package com.infomaniak.swisstransfer.ui.icons.illu + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.PathFillType.Companion.NonZero +import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.graphics.StrokeCap.Companion.Butt +import androidx.compose.ui.graphics.StrokeJoin.Companion.Miter +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.graphics.vector.ImageVector.Builder +import androidx.compose.ui.graphics.vector.group +import androidx.compose.ui.graphics.vector.path +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.infomaniak.swisstransfer.ui.icons.AppIcons + +val AppIcons.FrenchFlag: ImageVector + get() { + if (_frenchFlag != null) { + return _frenchFlag!! + } + _frenchFlag = Builder( + name = "FrenchFlag", + defaultWidth = 24.0.dp, + defaultHeight = 24.0.dp, + viewportWidth = 24.0f, + viewportHeight = 24.0f + ).apply { + group { + path( + fill = SolidColor(Color(0xFF0B5394)), stroke = null, strokeLineWidth = + 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = + 4.0f, pathFillType = NonZero + ) { + moveTo(1.333f, 3.0f) + horizontalLineToRelative(21.334f) + arcTo(1.333f, 1.333f, 0.0f, false, true, 24.0f, 4.333f) + verticalLineToRelative(15.334f) + arcTo(1.333f, 1.333f, 0.0f, false, true, 22.667f, 21.0f) + horizontalLineTo(1.333f) + arcTo(1.333f, 1.333f, 0.0f, false, true, 0.0f, 19.667f) + verticalLineTo(4.333f) + arcTo(1.333f, 1.333f, 0.0f, false, true, 1.333f, 3.0f) + close() + } + path( + fill = SolidColor(Color(0xFFE70E0E)), stroke = null, strokeLineWidth = + 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = + 4.0f, pathFillType = NonZero + ) { + moveTo(1.333f, 3.0f) + horizontalLineToRelative(21.334f) + arcTo(1.333f, 1.333f, 0.0f, false, true, 24.0f, 4.333f) + verticalLineToRelative(16.001f) + arcToRelative(1.333f, 1.333f, 0.0f, false, true, -1.333f, 1.333f) + horizontalLineTo(1.333f) + arcTo(1.333f, 1.333f, 0.0f, false, true, 0.0f, 20.334f) + verticalLineTo(4.333f) + arcTo(1.333f, 1.333f, 0.0f, false, true, 1.333f, 3.0f) + close() + } + path( + fill = SolidColor(Color(0xFF0B5394)), stroke = null, strokeLineWidth = + 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = + 4.0f, pathFillType = NonZero + ) { + moveTo(0.0f, 4.333f) + curveTo(0.0f, 3.597f, 0.597f, 3.0f, 1.333f, 3.0f) + horizontalLineTo(8.0f) + verticalLineToRelative(18.667f) + horizontalLineTo(1.333f) + arcTo(1.333f, 1.333f, 0.0f, false, true, 0.0f, 20.333f) + close() + } + path( + fill = SolidColor(Color(0xFFFFFFFF)), stroke = null, strokeLineWidth = + 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = + 4.0f, pathFillType = NonZero + ) { + moveTo(8.0f, 3.0f) + horizontalLineToRelative(8.0f) + verticalLineToRelative(18.667f) + horizontalLineTo(8.0f) + close() + } + } + } + .build() + return _frenchFlag!! + } + +private var _frenchFlag: ImageVector? = null + +@Preview +@Composable +private fun Preview() { + Box(modifier = Modifier.padding(12.dp)) { + Image(imageVector = AppIcons.FrenchFlag, contentDescription = "") + } +} diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/GermanFlag.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/GermanFlag.kt new file mode 100644 index 000000000..90ca661a8 --- /dev/null +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/GermanFlag.kt @@ -0,0 +1,86 @@ +package com.infomaniak.swisstransfer.ui.icons.illu + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.PathFillType.Companion.NonZero +import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.graphics.StrokeCap.Companion.Butt +import androidx.compose.ui.graphics.StrokeJoin.Companion.Miter +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.graphics.vector.ImageVector.Builder +import androidx.compose.ui.graphics.vector.group +import androidx.compose.ui.graphics.vector.path +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.infomaniak.swisstransfer.ui.icons.AppIcons + +val AppIcons.GermanFlag: ImageVector + get() { + if (_germanFlag != null) { + return _germanFlag!! + } + _germanFlag = Builder( + name = "GermanFlag", + defaultWidth = 24.0.dp, + defaultHeight = 24.0.dp, + viewportWidth = 24.0f, + viewportHeight = 24.0f + ).apply { + group { + path( + fill = SolidColor(Color(0xFFE70E0E)), stroke = null, strokeLineWidth = + 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = + 4.0f, pathFillType = NonZero + ) { + moveTo(1.333f, 3.0f) + horizontalLineToRelative(21.334f) + arcTo(1.333f, 1.333f, 0.0f, false, true, 24.0f, 4.333f) + verticalLineToRelative(15.334f) + arcTo(1.333f, 1.333f, 0.0f, false, true, 22.667f, 21.0f) + horizontalLineTo(1.333f) + arcTo(1.333f, 1.333f, 0.0f, false, true, 0.0f, 19.667f) + verticalLineTo(4.333f) + arcTo(1.333f, 1.333f, 0.0f, false, true, 1.333f, 3.0f) + close() + } + path( + fill = SolidColor(Color(0xFF000000)), stroke = null, strokeLineWidth = + 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = + 4.0f, pathFillType = NonZero + ) { + moveTo(0.0f, 3.0f) + horizontalLineToRelative(24.0f) + verticalLineToRelative(6.0f) + horizontalLineTo(0.0f) + close() + } + path( + fill = SolidColor(Color(0xFFFDDA25)), stroke = null, strokeLineWidth = + 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = + 4.0f, pathFillType = NonZero + ) { + moveTo(0.0f, 15.667f) + horizontalLineToRelative(24.0f) + verticalLineToRelative(6.0f) + horizontalLineTo(0.0f) + close() + } + } + } + .build() + return _germanFlag!! + } + +private var _germanFlag: ImageVector? = null + +@Preview +@Composable +private fun Preview() { + Box(modifier = Modifier.padding(12.dp)) { + Image(imageVector = AppIcons.GermanFlag, contentDescription = "") + } +} diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/ItalianFlag.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/ItalianFlag.kt new file mode 100644 index 000000000..37dca29be --- /dev/null +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/ItalianFlag.kt @@ -0,0 +1,88 @@ +package com.infomaniak.swisstransfer.ui.icons.illu + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.PathFillType.Companion.NonZero +import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.graphics.StrokeCap.Companion.Butt +import androidx.compose.ui.graphics.StrokeJoin.Companion.Miter +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.graphics.vector.ImageVector.Builder +import androidx.compose.ui.graphics.vector.group +import androidx.compose.ui.graphics.vector.path +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.infomaniak.swisstransfer.ui.icons.AppIcons + +val AppIcons.ItalianFlag: ImageVector + get() { + if (_italianFlag != null) { + return _italianFlag!! + } + _italianFlag = Builder( + name = "ItalianFlag", + defaultWidth = 24.0.dp, + defaultHeight = 24.0.dp, + viewportWidth = 24.0f, + viewportHeight = 24.0f + ).apply { + group { + path( + fill = SolidColor(Color(0xFFE70E0E)), stroke = null, strokeLineWidth = + 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = + 4.0f, pathFillType = NonZero + ) { + moveTo(1.333f, 3.0f) + horizontalLineToRelative(21.334f) + arcTo(1.333f, 1.333f, 0.0f, false, true, 24.0f, 4.333f) + verticalLineToRelative(15.334f) + arcTo(1.333f, 1.333f, 0.0f, false, true, 22.667f, 21.0f) + horizontalLineTo(1.333f) + arcTo(1.333f, 1.333f, 0.0f, false, true, 0.0f, 19.667f) + verticalLineTo(4.333f) + arcTo(1.333f, 1.333f, 0.0f, false, true, 1.333f, 3.0f) + close() + } + path( + fill = SolidColor(Color(0xFF128D4E)), stroke = null, strokeLineWidth = + 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = + 4.0f, pathFillType = NonZero + ) { + moveTo(0.0f, 4.333f) + curveTo(0.0f, 3.597f, 0.597f, 3.0f, 1.333f, 3.0f) + horizontalLineTo(8.0f) + verticalLineToRelative(18.667f) + horizontalLineTo(1.333f) + arcTo(1.333f, 1.333f, 0.0f, false, true, 0.0f, 20.333f) + close() + } + path( + fill = SolidColor(Color(0xFFFFFFFF)), stroke = null, strokeLineWidth = + 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = + 4.0f, pathFillType = NonZero + ) { + moveTo(8.0f, 3.0f) + horizontalLineToRelative(8.0f) + verticalLineToRelative(18.667f) + horizontalLineTo(8.0f) + close() + } + } + } + .build() + return _italianFlag!! + } + +private var _italianFlag: ImageVector? = null + +@Preview +@Composable +private fun Preview() { + Box(modifier = Modifier.padding(12.dp)) { + Image(imageVector = AppIcons.ItalianFlag, contentDescription = "") + } +} From cef80ec8e7de6363b5d751c202e60a498d515453 Mon Sep 17 00:00:00 2001 From: Vincent TE Date: Fri, 23 Aug 2024 10:44:59 +0200 Subject: [PATCH 03/10] Add brand app bar and top app bar --- .../swisstransfer/ui/components/TwoPaneScaffold.kt | 6 +++++- .../swisstransfer/ui/screen/main/MainNavHost.kt | 6 ++---- .../swisstransfer/ui/screen/main/MainScaffold.kt | 8 ++++---- .../infomaniak/swisstransfer/ui/screen/main/MainScreen.kt | 4 ++-- .../screen/main/components/AppNavigationSuiteScaffold.kt | 4 ++-- .../screen/main/settings/SettingsDownloadsLimitScreen.kt | 8 ++++++-- .../main/settings/SettingsDurationValidityScreen.kt | 8 ++++++-- .../screen/main/settings/SettingsEmailLanguageScreen.kt | 6 ++++-- .../ui/screen/main/settings/SettingsScreen.kt | 7 +++++++ .../ui/screen/main/settings/SettingsThemeScreen.kt | 8 ++++++-- 10 files changed, 44 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/components/TwoPaneScaffold.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/components/TwoPaneScaffold.kt index a7ec7dd95..c69719e60 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/components/TwoPaneScaffold.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/components/TwoPaneScaffold.kt @@ -28,6 +28,7 @@ import androidx.compose.material3.adaptive.navigation.ThreePaneScaffoldNavigator import androidx.compose.material3.adaptive.navigation.rememberListDetailPaneScaffoldNavigator import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp import androidx.window.core.layout.WindowHeightSizeClass /** @@ -58,7 +59,10 @@ fun TwoPaneScaffold( else -> paneScaffoldDirective.maxHorizontalPartitions } val navigator = rememberListDetailPaneScaffoldNavigator( - scaffoldDirective = paneScaffoldDirective.copy(maxHorizontalPartitions) + scaffoldDirective = paneScaffoldDirective.copy( + maxHorizontalPartitions = maxHorizontalPartitions, + horizontalPartitionSpacerSize = 0.dp + ) ) BackHandler(navigator.canNavigateBack()) { 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 1313e6d2f..524e5d44e 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 @@ -22,10 +22,8 @@ import androidx.compose.animation.EnterTransition import androidx.compose.animation.ExitTransition import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut -import androidx.compose.foundation.layout.safeDrawingPadding import androidx.compose.material3.adaptive.WindowAdaptiveInfo import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable @@ -42,11 +40,11 @@ fun MainNavHost( navController: NavHostController, windowAdaptiveInfo: WindowAdaptiveInfo, currentDestination: MainNavigation, + isBarNavigation: Boolean ) { NavHost( navController = navController, startDestination = MainNavigation.startDestination, - modifier = Modifier.safeDrawingPadding(), enterTransition = { if (currentDestination.enableTransition) fadeIn() else EnterTransition.None }, exitTransition = { if (currentDestination.enableTransition) fadeOut() else ExitTransition.None }, ) { @@ -67,7 +65,7 @@ fun MainNavHost( ) } 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 4bd3fd1be..de8c55475 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 @@ -42,7 +42,7 @@ fun MainScaffold( navController: NavHostController, currentDestination: MainNavigation, windowAdaptiveInfo: WindowAdaptiveInfo, - content: @Composable () -> Unit = {}, + content: @Composable (Boolean) -> Unit = {}, ) { val navType by rememberNavType(currentDestination, windowAdaptiveInfo) @@ -57,15 +57,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(1f)) { - 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 d4cfc4ec3..e49ad21d5 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 @@ -44,8 +44,8 @@ fun MainScreen() { } } - MainScaffold(navController, currentDestination, windowAdaptiveInfo) { - MainNavHost(navController, windowAdaptiveInfo, currentDestination) + MainScaffold(navController, currentDestination, windowAdaptiveInfo) { isBarNavigation -> + MainNavHost(navController, windowAdaptiveInfo, currentDestination, 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 62550053a..c33fb1bfc 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 @@ -60,7 +60,7 @@ fun AppNavigationSuiteScaffold( navigationItems: List, currentDestination: MainNavigation, navigateToSelectedItem: (MainNavigation) -> Unit, - content: @Composable () -> Unit, + content: @Composable (Boolean) -> Unit, ) { Surface(color = SwissTransferTheme.materialColors.background) { NavigationSuiteScaffoldLayout( @@ -88,7 +88,7 @@ fun AppNavigationSuiteScaffold( } ) ) { - content() + content(layoutType == NavigationSuiteType.NavigationBar) } } } 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 a6ae36a71..969809865 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 @@ -28,6 +28,8 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector import com.infomaniak.swisstransfer.R +import com.infomaniak.swisstransfer.ui.components.SwissTransferTobAppBar +import com.infomaniak.swisstransfer.ui.components.TopAppBarButton import com.infomaniak.swisstransfer.ui.screen.main.settings.components.SettingOption import com.infomaniak.swisstransfer.ui.screen.main.settings.components.SettingTitle import com.infomaniak.swisstransfer.ui.screen.main.settings.components.SingleSelectOptions @@ -36,8 +38,10 @@ import com.infomaniak.swisstransfer.ui.utils.PreviewMobile import com.infomaniak.swisstransfer.ui.utils.PreviewTablet @Composable -fun SettingsDownloadsLimitScreen() { +fun SettingsDownloadsLimitScreen(navigateBack: () -> Unit) { Column(modifier = Modifier.verticalScroll(rememberScrollState())) { + SwissTransferTobAppBar(R.string.settingsOptionDownloadLimit, navigationMenu = TopAppBarButton.backButton(navigateBack)) + SettingTitle(titleRes = R.string.settingsDownloadsLimitTitle) val (selectedItem, setSelectedItem) = rememberSaveable { mutableIntStateOf(0) } // TODO: Use DataStore or Realm @@ -62,7 +66,7 @@ enum class DownloadsLimit( private fun SettingsThemeScreenPreview() { SwissTransferTheme { Surface { - SettingsDownloadsLimitScreen() + SettingsDownloadsLimitScreen{} } } } 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 f2cedc951..8bfd3fdf2 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 @@ -29,6 +29,8 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.pluralStringResource import com.infomaniak.swisstransfer.R +import com.infomaniak.swisstransfer.ui.components.SwissTransferTobAppBar +import com.infomaniak.swisstransfer.ui.components.TopAppBarButton import com.infomaniak.swisstransfer.ui.screen.main.settings.components.SettingOption import com.infomaniak.swisstransfer.ui.screen.main.settings.components.SettingTitle import com.infomaniak.swisstransfer.ui.screen.main.settings.components.SingleSelectOptions @@ -37,8 +39,10 @@ import com.infomaniak.swisstransfer.ui.utils.PreviewMobile import com.infomaniak.swisstransfer.ui.utils.PreviewTablet @Composable -fun SettingsValidityPeriodScreen() { +fun SettingsValidityPeriodScreen(navigateBack: () -> Unit) { Column(modifier = Modifier.verticalScroll(rememberScrollState())) { + SwissTransferTobAppBar(R.string.settingsOptionValidityPeriod, navigationMenu = TopAppBarButton.backButton(navigateBack)) + SettingTitle(titleRes = R.string.settingsValidityPeriodTitle) val (selectedItem, setSelectedItem) = rememberSaveable { mutableIntStateOf(0) } // TODO: Use DataStore or Realm @@ -63,7 +67,7 @@ enum class ValidityPeriod( private fun SettingsThemeScreenPreview() { SwissTransferTheme { Surface { - SettingsValidityPeriodScreen() + SettingsValidityPeriodScreen{} } } } 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 ce6d7ffdc..8613b2609 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 @@ -37,8 +37,10 @@ import com.infomaniak.swisstransfer.ui.utils.PreviewMobile import com.infomaniak.swisstransfer.ui.utils.PreviewTablet @Composable -fun SettingsEmailLanguageScreen() { +fun SettingsEmailLanguageScreen(navigateBack: () -> Unit) { Column(modifier = Modifier.verticalScroll(rememberScrollState())) { + SwissTransferTobAppBar(R.string.settingsOptionEmailLanguage, navigationMenu = TopAppBarButton.backButton(navigateBack)) + SettingTitle(titleRes = R.string.settingsEmailLanguageTitle) val (selectedItem, setSelectedItem) = rememberSaveable { mutableIntStateOf(0) } // TODO: Use DataStore or Realm @@ -64,7 +66,7 @@ enum class EmailLanguage( private fun SettingsThemeScreenPreview() { SwissTransferTheme { Surface { - SettingsEmailLanguageScreen() + SettingsEmailLanguageScreen{} } } } 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 4e0c6a2a9..32865ae94 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 @@ -48,10 +48,12 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource +import androidx.navigation.NavHostController 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.* @@ -69,7 +71,9 @@ import com.infomaniak.swisstransfer.ui.utils.PreviewTablet @OptIn(ExperimentalMaterial3AdaptiveApi::class) @Composable fun SettingsScreenWrapper( + navController: NavHostController? = null, windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfo(), + isBarNavigation: Boolean = false ) { val context = LocalContext.current val aboutURL = stringResource(R.string.urlAbout) @@ -135,6 +139,9 @@ private fun SettingsScreen(onItemClick: (SettingsOptionScreens) -> Unit, getSele .verticalScroll(rememberScrollState()) .selectableGroup(), ) { + + BrandTobAppBar() + Text( modifier = Modifier.padding(horizontal = Margin.Medium, vertical = Margin.Large), text = stringResource(R.string.settingsTitle), 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 66759eb8b..cb82b7734 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,8 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.stringResource import com.infomaniak.swisstransfer.R +import com.infomaniak.swisstransfer.ui.components.SwissTransferTobAppBar +import com.infomaniak.swisstransfer.ui.components.TopAppBarButton import com.infomaniak.swisstransfer.ui.icons.AppIcons import com.infomaniak.swisstransfer.ui.icons.app.BlackAndWhiteCircle import com.infomaniak.swisstransfer.ui.icons.app.BlackCircle @@ -43,8 +45,10 @@ import com.infomaniak.swisstransfer.ui.utils.PreviewMobile import com.infomaniak.swisstransfer.ui.utils.PreviewTablet @Composable -fun SettingsThemeScreen() { +fun SettingsThemeScreen(navigateBack: () -> Unit) { Column(modifier = Modifier.verticalScroll(rememberScrollState())) { + SwissTransferTobAppBar(R.string.settingsOptionTheme, navigationMenu = TopAppBarButton.backButton(navigateBack)) + SettingTitle(titleRes = R.string.settingsThemeTitle) var selectedItem by rememberSaveable { mutableIntStateOf(0) } // TODO: Use DataStore or Realm @@ -68,7 +72,7 @@ enum class ThemeOption( private fun SettingsThemeScreenPreview() { SwissTransferTheme { Surface { - SettingsThemeScreen() + SettingsThemeScreen {} } } } From 96bdd4cbf4efc7dc9ed5cb781f509c5cbda2b73c Mon Sep 17 00:00:00 2001 From: Vincent TE Date: Mon, 26 Aug 2024 09:50:38 +0200 Subject: [PATCH 04/10] Remove back button if we're in tablet mode --- .../screen/main/settings/SettingsDownloadsLimitScreen.kt | 7 ++++--- .../screen/main/settings/SettingsDurationValidityScreen.kt | 7 ++++--- .../ui/screen/main/settings/SettingsEmailLanguageScreen.kt | 7 ++++--- .../ui/screen/main/settings/SettingsThemeScreen.kt | 5 +++-- 4 files changed, 15 insertions(+), 11 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 969809865..3d53e61c1 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 @@ -38,9 +38,10 @@ import com.infomaniak.swisstransfer.ui.utils.PreviewMobile import com.infomaniak.swisstransfer.ui.utils.PreviewTablet @Composable -fun SettingsDownloadsLimitScreen(navigateBack: () -> Unit) { +fun SettingsDownloadsLimitScreen(navigateBack: (() -> Unit)?) { Column(modifier = Modifier.verticalScroll(rememberScrollState())) { - SwissTransferTobAppBar(R.string.settingsOptionDownloadLimit, navigationMenu = TopAppBarButton.backButton(navigateBack)) + val canDisplayBackButton = navigateBack?.let { TopAppBarButton.backButton(navigateBack) } + SwissTransferTobAppBar(R.string.settingsOptionDownloadLimit, navigationMenu = canDisplayBackButton) SettingTitle(titleRes = R.string.settingsDownloadsLimitTitle) @@ -66,7 +67,7 @@ enum class DownloadsLimit( private fun SettingsThemeScreenPreview() { SwissTransferTheme { Surface { - SettingsDownloadsLimitScreen{} + SettingsDownloadsLimitScreen {} } } } 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 8bfd3fdf2..1c1a3b150 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 @@ -39,9 +39,10 @@ import com.infomaniak.swisstransfer.ui.utils.PreviewMobile import com.infomaniak.swisstransfer.ui.utils.PreviewTablet @Composable -fun SettingsValidityPeriodScreen(navigateBack: () -> Unit) { +fun SettingsValidityPeriodScreen(navigateBack: (() -> Unit)?) { Column(modifier = Modifier.verticalScroll(rememberScrollState())) { - SwissTransferTobAppBar(R.string.settingsOptionValidityPeriod, navigationMenu = TopAppBarButton.backButton(navigateBack)) + val canDisplayBackButton = navigateBack?.let { TopAppBarButton.backButton(navigateBack) } + SwissTransferTobAppBar(R.string.settingsOptionValidityPeriod, navigationMenu = canDisplayBackButton) SettingTitle(titleRes = R.string.settingsValidityPeriodTitle) @@ -67,7 +68,7 @@ enum class ValidityPeriod( private fun SettingsThemeScreenPreview() { SwissTransferTheme { Surface { - SettingsValidityPeriodScreen{} + SettingsValidityPeriodScreen {} } } } 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 8613b2609..9fc8e1738 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 @@ -37,9 +37,10 @@ import com.infomaniak.swisstransfer.ui.utils.PreviewMobile import com.infomaniak.swisstransfer.ui.utils.PreviewTablet @Composable -fun SettingsEmailLanguageScreen(navigateBack: () -> Unit) { +fun SettingsEmailLanguageScreen(navigateBack: (() -> Unit)?) { Column(modifier = Modifier.verticalScroll(rememberScrollState())) { - SwissTransferTobAppBar(R.string.settingsOptionEmailLanguage, navigationMenu = TopAppBarButton.backButton(navigateBack)) + val canDisplayBackButton = navigateBack?.let { TopAppBarButton.backButton(navigateBack) } + SwissTransferTobAppBar(R.string.settingsOptionEmailLanguage, navigationMenu = canDisplayBackButton) SettingTitle(titleRes = R.string.settingsEmailLanguageTitle) @@ -66,7 +67,7 @@ enum class EmailLanguage( private fun SettingsThemeScreenPreview() { SwissTransferTheme { Surface { - SettingsEmailLanguageScreen{} + SettingsEmailLanguageScreen {} } } } 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 cb82b7734..9b7a7139e 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 @@ -45,9 +45,10 @@ import com.infomaniak.swisstransfer.ui.utils.PreviewMobile import com.infomaniak.swisstransfer.ui.utils.PreviewTablet @Composable -fun SettingsThemeScreen(navigateBack: () -> Unit) { +fun SettingsThemeScreen(navigateBack: (() -> Unit)?) { Column(modifier = Modifier.verticalScroll(rememberScrollState())) { - SwissTransferTobAppBar(R.string.settingsOptionTheme, navigationMenu = TopAppBarButton.backButton(navigateBack)) + val canDisplayBackButton = navigateBack?.let { TopAppBarButton.backButton(navigateBack) } + SwissTransferTobAppBar(R.string.settingsOptionTheme, navigationMenu = canDisplayBackButton) SettingTitle(titleRes = R.string.settingsThemeTitle) From d2b7480262dd6fa4cd8e9fd158b6cda567b59dac Mon Sep 17 00:00:00 2001 From: Vincent TE Date: Tue, 27 Aug 2024 13:18:55 +0200 Subject: [PATCH 05/10] Fix merge --- .../main/settings/SettingsEmailLanguageScreen.kt | 2 ++ .../ui/screen/main/settings/SettingsScreen.kt | 11 +++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) 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 9fc8e1738..d05e68f30 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 @@ -29,6 +29,8 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.stringResource import com.infomaniak.swisstransfer.R +import com.infomaniak.swisstransfer.ui.components.SwissTransferTobAppBar +import com.infomaniak.swisstransfer.ui.components.TopAppBarButton import com.infomaniak.swisstransfer.ui.screen.main.settings.components.SettingOption import com.infomaniak.swisstransfer.ui.screen.main.settings.components.SettingTitle import com.infomaniak.swisstransfer.ui.screen.main.settings.components.SingleSelectOptions 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 32865ae94..6af59f3c8 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 @@ -117,11 +117,14 @@ private fun DetailPane(navigator: ThreePaneScaffoldNavigator Unit = { navigator.navigateBack() } + val navigateBack: (() -> Unit)? = if (navigator.canNavigateBack()) navigateBackCallback else null + when (destination) { - THEME -> SettingsThemeScreen() - VALIDITY_PERIOD -> SettingsValidityPeriodScreen() - DOWNLOAD_LIMIT -> SettingsDownloadsLimitScreen() - EMAIL_LANGUAGE -> SettingsEmailLanguageScreen() + THEME -> SettingsThemeScreen(navigateBack) + VALIDITY_PERIOD -> SettingsValidityPeriodScreen(navigateBack) + DOWNLOAD_LIMIT -> SettingsDownloadsLimitScreen(navigateBack) + EMAIL_LANGUAGE -> SettingsEmailLanguageScreen(navigateBack) NOTIFICATIONS, DISCOVER_INFOMANIAK, SHARE_IDEAS, From 27d325427565e2bd2d0a434f0191a72afeffe7b7 Mon Sep 17 00:00:00 2001 From: Vincent TE Date: Tue, 27 Aug 2024 13:38:48 +0200 Subject: [PATCH 06/10] Change how we add the top bar to avoid this one to be scrollable --- .../ui/screen/main/MainNavHost.kt | 3 +- .../ui/screen/main/MainScreen.kt | 4 +- .../settings/SettingsDownloadsLimitScreen.kt | 10 +- .../SettingsDurationValidityScreen.kt | 11 +- .../settings/SettingsEmailLanguageScreen.kt | 10 +- .../ui/screen/main/settings/SettingsScreen.kt | 171 ++++++++---------- .../main/settings/SettingsThemeScreen.kt | 11 +- 7 files changed, 107 insertions(+), 113 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 524e5d44e..c8f4c4a86 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 @@ -40,7 +40,6 @@ fun MainNavHost( navController: NavHostController, windowAdaptiveInfo: WindowAdaptiveInfo, currentDestination: MainNavigation, - isBarNavigation: Boolean ) { NavHost( navController = navController, @@ -65,7 +64,7 @@ fun MainNavHost( ) } composable { - SettingsScreenWrapper(navController, windowAdaptiveInfo, isBarNavigation) + SettingsScreenWrapper(windowAdaptiveInfo) } } } 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 e49ad21d5..d4cfc4ec3 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 @@ -44,8 +44,8 @@ fun MainScreen() { } } - MainScaffold(navController, currentDestination, windowAdaptiveInfo) { isBarNavigation -> - MainNavHost(navController, windowAdaptiveInfo, currentDestination, isBarNavigation) + MainScaffold(navController, currentDestination, windowAdaptiveInfo) { + MainNavHost(navController, windowAdaptiveInfo, currentDestination) } } 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 3d53e61c1..99416c2fd 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 @@ -39,14 +39,16 @@ import com.infomaniak.swisstransfer.ui.utils.PreviewTablet @Composable fun SettingsDownloadsLimitScreen(navigateBack: (() -> Unit)?) { - Column(modifier = Modifier.verticalScroll(rememberScrollState())) { + Column { val canDisplayBackButton = navigateBack?.let { TopAppBarButton.backButton(navigateBack) } SwissTransferTobAppBar(R.string.settingsOptionDownloadLimit, navigationMenu = canDisplayBackButton) - SettingTitle(titleRes = R.string.settingsDownloadsLimitTitle) + Column(modifier = Modifier.verticalScroll(rememberScrollState())) { + SettingTitle(titleRes = R.string.settingsDownloadsLimitTitle) - val (selectedItem, setSelectedItem) = rememberSaveable { mutableIntStateOf(0) } // TODO: Use DataStore or Realm - SingleSelectOptions(DownloadsLimit.entries, { selectedItem }, setSelectedItem) + val (selectedItem, setSelectedItem) = rememberSaveable { mutableIntStateOf(0) } // TODO: Use DataStore or Realm + SingleSelectOptions(DownloadsLimit.entries, { selectedItem }, setSelectedItem) + } } } 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 1c1a3b150..5471ec6fd 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 @@ -40,14 +40,17 @@ import com.infomaniak.swisstransfer.ui.utils.PreviewTablet @Composable fun SettingsValidityPeriodScreen(navigateBack: (() -> Unit)?) { - Column(modifier = Modifier.verticalScroll(rememberScrollState())) { + Column { val canDisplayBackButton = navigateBack?.let { TopAppBarButton.backButton(navigateBack) } SwissTransferTobAppBar(R.string.settingsOptionValidityPeriod, navigationMenu = canDisplayBackButton) - SettingTitle(titleRes = R.string.settingsValidityPeriodTitle) + Column(modifier = Modifier.verticalScroll(rememberScrollState())) { - val (selectedItem, setSelectedItem) = rememberSaveable { mutableIntStateOf(0) } // TODO: Use DataStore or Realm - SingleSelectOptions(ValidityPeriod.entries, { selectedItem }, setSelectedItem) + SettingTitle(titleRes = R.string.settingsValidityPeriodTitle) + + val (selectedItem, setSelectedItem) = rememberSaveable { mutableIntStateOf(0) } // TODO: Use DataStore or Realm + SingleSelectOptions(ValidityPeriod.entries, { selectedItem }, setSelectedItem) + } } } 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 d05e68f30..fc0549c50 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 @@ -40,14 +40,16 @@ import com.infomaniak.swisstransfer.ui.utils.PreviewTablet @Composable fun SettingsEmailLanguageScreen(navigateBack: (() -> Unit)?) { - Column(modifier = Modifier.verticalScroll(rememberScrollState())) { + Column { val canDisplayBackButton = navigateBack?.let { TopAppBarButton.backButton(navigateBack) } SwissTransferTobAppBar(R.string.settingsOptionEmailLanguage, navigationMenu = canDisplayBackButton) - SettingTitle(titleRes = R.string.settingsEmailLanguageTitle) + Column(modifier = Modifier.verticalScroll(rememberScrollState())) { + SettingTitle(titleRes = R.string.settingsEmailLanguageTitle) - val (selectedItem, setSelectedItem) = rememberSaveable { mutableIntStateOf(0) } // TODO: Use DataStore or Realm - SingleSelectOptions(EmailLanguage.entries, { selectedItem }, setSelectedItem) + val (selectedItem, setSelectedItem) = rememberSaveable { mutableIntStateOf(0) } // TODO: Use DataStore or Realm + SingleSelectOptions(EmailLanguage.entries, { selectedItem }, setSelectedItem) + } } } 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 6af59f3c8..0a1cfcd30 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,16 +18,7 @@ package com.infomaniak.swisstransfer.ui.screen.main.settings -import android.content.ActivityNotFoundException -import android.content.Context -import android.content.Intent -import android.net.Uri -import android.os.Build -import android.provider.Settings -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.* import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.selection.selectableGroup import androidx.compose.foundation.verticalScroll @@ -48,7 +39,6 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource -import androidx.navigation.NavHostController import com.infomaniak.swisstransfer.R import com.infomaniak.swisstransfer.extensions.goToPlayStore import com.infomaniak.swisstransfer.extensions.openAppNotificationSettings @@ -70,14 +60,7 @@ import com.infomaniak.swisstransfer.ui.utils.PreviewTablet @OptIn(ExperimentalMaterial3AdaptiveApi::class) @Composable -fun SettingsScreenWrapper( - navController: NavHostController? = null, - windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfo(), - isBarNavigation: Boolean = false -) { - val context = LocalContext.current - val aboutURL = stringResource(R.string.urlAbout) - val userReportURL = stringResource(R.string.urlUserReportAndroid) +fun SettingsScreenWrapper(windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfo()) { TwoPaneScaffold( windowAdaptiveInfo, listPane = { ListPane(this) }, @@ -137,88 +120,90 @@ private fun DetailPane(navigator: ThreePaneScaffoldNavigator Unit, getSelectedSetting: () -> SettingsOptionScreens?) { val selectedSetting = getSelectedSetting() - Column( - modifier = Modifier - .verticalScroll(rememberScrollState()) - .selectableGroup(), - ) { + Column { BrandTobAppBar() - Text( - modifier = Modifier.padding(horizontal = Margin.Medium, vertical = Margin.Large), - text = stringResource(R.string.settingsTitle), - style = SwissTransferTheme.typography.h1, - ) - - SettingTitle(R.string.settingsCategoryGeneral) - SettingItem( - titleRes = R.string.settingsOptionTheme, - isSelected = { selectedSetting == THEME }, - icon = AppIcons.PaintbrushPalette, - description = "TODO", - CHEVRON + Column( + modifier = Modifier + .verticalScroll(rememberScrollState()) + .selectableGroup(), ) { - onItemClick(THEME) - } - SettingItem( - titleRes = R.string.settingsOptionNotifications, - isSelected = { selectedSetting == NOTIFICATIONS }, - icon = AppIcons.Bell, - description = "TODO", - endIcon = OPEN_OUTSIDE, - ) { - onItemClick(NOTIFICATIONS) - } - - SettingDivider() + Text( + modifier = Modifier.padding(horizontal = Margin.Medium, vertical = Margin.Large), + text = stringResource(R.string.settingsTitle), + style = SwissTransferTheme.typography.h1, + ) + + SettingTitle(R.string.settingsCategoryGeneral) + SettingItem( + titleRes = R.string.settingsOptionTheme, + isSelected = { selectedSetting == THEME }, + icon = AppIcons.PaintbrushPalette, + description = "TODO", + CHEVRON + ) { + onItemClick(THEME) + } + SettingItem( + titleRes = R.string.settingsOptionNotifications, + isSelected = { selectedSetting == NOTIFICATIONS }, + icon = AppIcons.Bell, + description = "TODO", + endIcon = OPEN_OUTSIDE, + ) { + onItemClick(NOTIFICATIONS) + } - SettingTitle(R.string.settingsCategoryDefaultSettings) - SettingItem( - titleRes = R.string.settingsOptionValidityPeriod, - isSelected = { selectedSetting == VALIDITY_PERIOD }, - icon = AppIcons.FileBadgeArrowDown, - description = "TODO", - endIcon = CHEVRON, - ) { - onItemClick(VALIDITY_PERIOD) - } - SettingItem( - titleRes = R.string.settingsOptionDownloadLimit, - isSelected = { selectedSetting == DOWNLOAD_LIMIT }, - icon = AppIcons.Clock, - description = "TODO", - endIcon = CHEVRON, - ) { - onItemClick(DOWNLOAD_LIMIT) - } - SettingItem( - titleRes = R.string.settingsOptionEmailLanguage, - isSelected = { selectedSetting == EMAIL_LANGUAGE }, - icon = AppIcons.SpeechBubble, - description = "TODO", - endIcon = CHEVRON, - ) { - onItemClick(EMAIL_LANGUAGE) - } + SettingDivider() + + SettingTitle(R.string.settingsCategoryDefaultSettings) + SettingItem( + titleRes = R.string.settingsOptionValidityPeriod, + isSelected = { selectedSetting == VALIDITY_PERIOD }, + icon = AppIcons.FileBadgeArrowDown, + description = "TODO", + endIcon = CHEVRON, + ) { + onItemClick(VALIDITY_PERIOD) + } + SettingItem( + titleRes = R.string.settingsOptionDownloadLimit, + isSelected = { selectedSetting == DOWNLOAD_LIMIT }, + icon = AppIcons.Clock, + description = "TODO", + endIcon = CHEVRON, + ) { + onItemClick(DOWNLOAD_LIMIT) + } + SettingItem( + titleRes = R.string.settingsOptionEmailLanguage, + isSelected = { selectedSetting == EMAIL_LANGUAGE }, + icon = AppIcons.SpeechBubble, + description = "TODO", + endIcon = CHEVRON, + ) { + onItemClick(EMAIL_LANGUAGE) + } - SettingDivider() + SettingDivider() - SettingTitle(R.string.settingsCategoryAbout) - SettingItem( - R.string.settingsOptionDiscoverInfomaniak, - { selectedSetting == DISCOVER_INFOMANIAK }, - endIcon = OPEN_OUTSIDE - ) { - onItemClick(DISCOVER_INFOMANIAK) - } - SettingItem(R.string.settingsOptionShareIdeas, { selectedSetting == SHARE_IDEAS }, endIcon = OPEN_OUTSIDE) { - onItemClick(SHARE_IDEAS) - } - SettingItem(R.string.settingsOptionGiveFeedback, { selectedSetting == GIVE_FEEDBACK }, endIcon = OPEN_OUTSIDE) { - onItemClick(GIVE_FEEDBACK) + SettingTitle(R.string.settingsCategoryAbout) + SettingItem( + R.string.settingsOptionDiscoverInfomaniak, + { selectedSetting == DISCOVER_INFOMANIAK }, + endIcon = OPEN_OUTSIDE + ) { + onItemClick(DISCOVER_INFOMANIAK) + } + SettingItem(R.string.settingsOptionShareIdeas, { selectedSetting == SHARE_IDEAS }, endIcon = OPEN_OUTSIDE) { + onItemClick(SHARE_IDEAS) + } + SettingItem(R.string.settingsOptionGiveFeedback, { selectedSetting == GIVE_FEEDBACK }, endIcon = OPEN_OUTSIDE) { + onItemClick(GIVE_FEEDBACK) + } + SettingItem(R.string.version, isSelected = { false }, description = "0.0.1", onClick = null) } - SettingItem(R.string.version, isSelected = { false }, description = "0.0.1", onClick = null) } } 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 9b7a7139e..f2315b5d6 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,14 +46,17 @@ import com.infomaniak.swisstransfer.ui.utils.PreviewTablet @Composable fun SettingsThemeScreen(navigateBack: (() -> Unit)?) { - Column(modifier = Modifier.verticalScroll(rememberScrollState())) { + Column { val canDisplayBackButton = navigateBack?.let { TopAppBarButton.backButton(navigateBack) } SwissTransferTobAppBar(R.string.settingsOptionTheme, navigationMenu = canDisplayBackButton) - SettingTitle(titleRes = R.string.settingsThemeTitle) + Column(modifier = Modifier.verticalScroll(rememberScrollState())) { - var selectedItem by rememberSaveable { mutableIntStateOf(0) } // TODO: Use DataStore or Realm - SingleSelectOptions(ThemeOption.entries, { selectedItem }, { selectedItem = it }) + SettingTitle(titleRes = R.string.settingsThemeTitle) + + var selectedItem by rememberSaveable { mutableIntStateOf(0) } // TODO: Use DataStore or Realm + SingleSelectOptions(ThemeOption.entries, { selectedItem }, { selectedItem = it }) + } } } From f033376902bdf38428bbe23079ae864ed930c978 Mon Sep 17 00:00:00 2001 From: Vincent TE Date: Tue, 27 Aug 2024 13:39:46 +0200 Subject: [PATCH 07/10] Remove unused files --- .../ui/icons/illu/EnglishFlag.kt | 196 ------------------ .../swisstransfer/ui/icons/illu/FrenchFlag.kt | 104 ---------- .../swisstransfer/ui/icons/illu/GermanFlag.kt | 86 -------- .../ui/icons/illu/ItalianFlag.kt | 88 -------- 4 files changed, 474 deletions(-) delete mode 100644 app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/EnglishFlag.kt delete mode 100644 app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/FrenchFlag.kt delete mode 100644 app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/GermanFlag.kt delete mode 100644 app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/ItalianFlag.kt diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/EnglishFlag.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/EnglishFlag.kt deleted file mode 100644 index fb935b1d0..000000000 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/EnglishFlag.kt +++ /dev/null @@ -1,196 +0,0 @@ -package com.infomaniak.swisstransfer.ui.icons.illu - -import androidx.compose.foundation.Image -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.padding -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.PathFillType.Companion.NonZero -import androidx.compose.ui.graphics.SolidColor -import androidx.compose.ui.graphics.StrokeCap.Companion.Butt -import androidx.compose.ui.graphics.StrokeJoin.Companion.Miter -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.graphics.vector.ImageVector.Builder -import androidx.compose.ui.graphics.vector.group -import androidx.compose.ui.graphics.vector.path -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import com.infomaniak.swisstransfer.ui.icons.AppIcons - -val AppIcons.EnglishFlag: ImageVector - get() { - if (_englishFlag != null) { - return _englishFlag!! - } - _englishFlag = Builder( - name = "EnglishFlag", - defaultWidth = 24.0.dp, - defaultHeight = 24.0.dp, - viewportWidth = 24.0f, - viewportHeight = 24.0f - ).apply { - group { - path( - fill = SolidColor(Color(0xFF0B5394)), stroke = null, strokeLineWidth = - 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = - 4.0f, pathFillType = NonZero - ) { - moveTo(1.333f, 3.0f) - horizontalLineToRelative(21.334f) - arcTo(1.333f, 1.333f, 0.0f, false, true, 24.0f, 4.333f) - verticalLineToRelative(15.334f) - arcTo(1.333f, 1.333f, 0.0f, false, true, 22.667f, 21.0f) - horizontalLineTo(1.333f) - arcTo(1.333f, 1.333f, 0.0f, false, true, 0.0f, 19.667f) - verticalLineTo(4.333f) - arcTo(1.333f, 1.333f, 0.0f, false, true, 1.333f, 3.0f) - close() - } - path( - fill = SolidColor(Color(0xFFFFFFFF)), stroke = null, strokeLineWidth = - 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = - 4.0f, pathFillType = NonZero - ) { - moveTo(12.0f, 11.667f) - lineTo(24.0f, 3.0f) - verticalLineToRelative(3.333f) - lineToRelative(-6.667f, 4.0f) - close() - } - path( - fill = SolidColor(Color(0xFFD0142C)), stroke = null, strokeLineWidth = - 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = - 4.0f, pathFillType = NonZero - ) { - moveTo(14.667f, 10.334f) - lineTo(24.0f, 3.667f) - verticalLineTo(5.0f) - lineToRelative(-8.0f, 5.334f) - close() - } - path( - fill = SolidColor(Color(0xFFFFFFFF)), stroke = null, strokeLineWidth = - 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = - 4.0f, pathFillType = NonZero - ) { - moveTo(12.0f, 13.667f) - lineTo(0.0f, 22.334f) - verticalLineToRelative(-3.333f) - lineToRelative(6.667f, -4.0f) - close() - } - path( - fill = SolidColor(Color(0xFFD0142C)), stroke = null, strokeLineWidth = - 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = - 4.0f, pathFillType = NonZero - ) { - moveTo(9.333f, 15.0f) - lineTo(0.0f, 21.667f) - verticalLineToRelative(-1.333f) - lineTo(8.0f, 15.0f) - close() - } - path( - fill = SolidColor(Color(0xFFFFFFFF)), stroke = null, strokeLineWidth = - 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = - 4.0f, pathFillType = NonZero - ) { - moveTo(12.0f, 11.667f) - lineTo(0.0f, 3.0f) - verticalLineToRelative(3.333f) - lineToRelative(6.667f, 4.0f) - close() - } - path( - fill = SolidColor(Color(0xFFD0142C)), stroke = null, strokeLineWidth = - 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = - 4.0f, pathFillType = NonZero - ) { - moveTo(9.333f, 10.334f) - lineTo(0.0f, 3.667f) - verticalLineTo(5.0f) - lineToRelative(8.0f, 5.334f) - close() - } - path( - fill = SolidColor(Color(0xFFFFFFFF)), stroke = null, strokeLineWidth = - 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = - 4.0f, pathFillType = NonZero - ) { - moveTo(12.0f, 13.667f) - lineToRelative(12.0f, 8.667f) - verticalLineToRelative(-3.333f) - lineToRelative(-6.667f, -4.0f) - close() - } - path( - fill = SolidColor(Color(0xFFD0142C)), stroke = null, strokeLineWidth = - 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = - 4.0f, pathFillType = NonZero - ) { - moveTo(14.667f, 15.0f) - lineTo(24.0f, 21.667f) - verticalLineToRelative(-1.333f) - lineTo(16.0f, 15.0f) - close() - } - path( - fill = SolidColor(Color(0xFFFFFFFF)), stroke = null, strokeLineWidth = - 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = - 4.0f, pathFillType = NonZero - ) { - moveTo(0.0f, 15.0f) - verticalLineTo(9.667f) - horizontalLineToRelative(24.0f) - verticalLineTo(15.0f) - close() - } - path( - fill = SolidColor(Color(0xFFFFFFFF)), stroke = null, strokeLineWidth = - 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = - 4.0f, pathFillType = NonZero - ) { - moveTo(9.333f, 3.0f) - horizontalLineToRelative(5.333f) - verticalLineToRelative(18.667f) - horizontalLineTo(9.333f) - close() - } - path( - fill = SolidColor(Color(0xFFD0142C)), stroke = null, strokeLineWidth = - 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = - 4.0f, pathFillType = NonZero - ) { - moveTo(10.667f, 3.0f) - horizontalLineToRelative(2.667f) - verticalLineToRelative(18.667f) - horizontalLineToRelative(-2.667f) - close() - } - path( - fill = SolidColor(Color(0xFFD0142C)), stroke = null, strokeLineWidth = - 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = - 4.0f, pathFillType = NonZero - ) { - moveTo(0.0f, 13.667f) - verticalLineTo(11.0f) - horizontalLineToRelative(24.0f) - verticalLineToRelative(2.667f) - close() - } - } - } - .build() - return _englishFlag!! - } - -private var _englishFlag: ImageVector? = null - -@Preview -@Composable -private fun Preview() { - Box(modifier = Modifier.padding(12.dp)) { - Image(imageVector = AppIcons.EnglishFlag, contentDescription = "") - } -} diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/FrenchFlag.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/FrenchFlag.kt deleted file mode 100644 index 860625789..000000000 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/FrenchFlag.kt +++ /dev/null @@ -1,104 +0,0 @@ -package com.infomaniak.swisstransfer.ui.icons.illu - -import androidx.compose.foundation.Image -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.padding -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.PathFillType.Companion.NonZero -import androidx.compose.ui.graphics.SolidColor -import androidx.compose.ui.graphics.StrokeCap.Companion.Butt -import androidx.compose.ui.graphics.StrokeJoin.Companion.Miter -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.graphics.vector.ImageVector.Builder -import androidx.compose.ui.graphics.vector.group -import androidx.compose.ui.graphics.vector.path -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import com.infomaniak.swisstransfer.ui.icons.AppIcons - -val AppIcons.FrenchFlag: ImageVector - get() { - if (_frenchFlag != null) { - return _frenchFlag!! - } - _frenchFlag = Builder( - name = "FrenchFlag", - defaultWidth = 24.0.dp, - defaultHeight = 24.0.dp, - viewportWidth = 24.0f, - viewportHeight = 24.0f - ).apply { - group { - path( - fill = SolidColor(Color(0xFF0B5394)), stroke = null, strokeLineWidth = - 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = - 4.0f, pathFillType = NonZero - ) { - moveTo(1.333f, 3.0f) - horizontalLineToRelative(21.334f) - arcTo(1.333f, 1.333f, 0.0f, false, true, 24.0f, 4.333f) - verticalLineToRelative(15.334f) - arcTo(1.333f, 1.333f, 0.0f, false, true, 22.667f, 21.0f) - horizontalLineTo(1.333f) - arcTo(1.333f, 1.333f, 0.0f, false, true, 0.0f, 19.667f) - verticalLineTo(4.333f) - arcTo(1.333f, 1.333f, 0.0f, false, true, 1.333f, 3.0f) - close() - } - path( - fill = SolidColor(Color(0xFFE70E0E)), stroke = null, strokeLineWidth = - 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = - 4.0f, pathFillType = NonZero - ) { - moveTo(1.333f, 3.0f) - horizontalLineToRelative(21.334f) - arcTo(1.333f, 1.333f, 0.0f, false, true, 24.0f, 4.333f) - verticalLineToRelative(16.001f) - arcToRelative(1.333f, 1.333f, 0.0f, false, true, -1.333f, 1.333f) - horizontalLineTo(1.333f) - arcTo(1.333f, 1.333f, 0.0f, false, true, 0.0f, 20.334f) - verticalLineTo(4.333f) - arcTo(1.333f, 1.333f, 0.0f, false, true, 1.333f, 3.0f) - close() - } - path( - fill = SolidColor(Color(0xFF0B5394)), stroke = null, strokeLineWidth = - 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = - 4.0f, pathFillType = NonZero - ) { - moveTo(0.0f, 4.333f) - curveTo(0.0f, 3.597f, 0.597f, 3.0f, 1.333f, 3.0f) - horizontalLineTo(8.0f) - verticalLineToRelative(18.667f) - horizontalLineTo(1.333f) - arcTo(1.333f, 1.333f, 0.0f, false, true, 0.0f, 20.333f) - close() - } - path( - fill = SolidColor(Color(0xFFFFFFFF)), stroke = null, strokeLineWidth = - 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = - 4.0f, pathFillType = NonZero - ) { - moveTo(8.0f, 3.0f) - horizontalLineToRelative(8.0f) - verticalLineToRelative(18.667f) - horizontalLineTo(8.0f) - close() - } - } - } - .build() - return _frenchFlag!! - } - -private var _frenchFlag: ImageVector? = null - -@Preview -@Composable -private fun Preview() { - Box(modifier = Modifier.padding(12.dp)) { - Image(imageVector = AppIcons.FrenchFlag, contentDescription = "") - } -} diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/GermanFlag.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/GermanFlag.kt deleted file mode 100644 index 90ca661a8..000000000 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/GermanFlag.kt +++ /dev/null @@ -1,86 +0,0 @@ -package com.infomaniak.swisstransfer.ui.icons.illu - -import androidx.compose.foundation.Image -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.padding -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.PathFillType.Companion.NonZero -import androidx.compose.ui.graphics.SolidColor -import androidx.compose.ui.graphics.StrokeCap.Companion.Butt -import androidx.compose.ui.graphics.StrokeJoin.Companion.Miter -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.graphics.vector.ImageVector.Builder -import androidx.compose.ui.graphics.vector.group -import androidx.compose.ui.graphics.vector.path -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import com.infomaniak.swisstransfer.ui.icons.AppIcons - -val AppIcons.GermanFlag: ImageVector - get() { - if (_germanFlag != null) { - return _germanFlag!! - } - _germanFlag = Builder( - name = "GermanFlag", - defaultWidth = 24.0.dp, - defaultHeight = 24.0.dp, - viewportWidth = 24.0f, - viewportHeight = 24.0f - ).apply { - group { - path( - fill = SolidColor(Color(0xFFE70E0E)), stroke = null, strokeLineWidth = - 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = - 4.0f, pathFillType = NonZero - ) { - moveTo(1.333f, 3.0f) - horizontalLineToRelative(21.334f) - arcTo(1.333f, 1.333f, 0.0f, false, true, 24.0f, 4.333f) - verticalLineToRelative(15.334f) - arcTo(1.333f, 1.333f, 0.0f, false, true, 22.667f, 21.0f) - horizontalLineTo(1.333f) - arcTo(1.333f, 1.333f, 0.0f, false, true, 0.0f, 19.667f) - verticalLineTo(4.333f) - arcTo(1.333f, 1.333f, 0.0f, false, true, 1.333f, 3.0f) - close() - } - path( - fill = SolidColor(Color(0xFF000000)), stroke = null, strokeLineWidth = - 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = - 4.0f, pathFillType = NonZero - ) { - moveTo(0.0f, 3.0f) - horizontalLineToRelative(24.0f) - verticalLineToRelative(6.0f) - horizontalLineTo(0.0f) - close() - } - path( - fill = SolidColor(Color(0xFFFDDA25)), stroke = null, strokeLineWidth = - 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = - 4.0f, pathFillType = NonZero - ) { - moveTo(0.0f, 15.667f) - horizontalLineToRelative(24.0f) - verticalLineToRelative(6.0f) - horizontalLineTo(0.0f) - close() - } - } - } - .build() - return _germanFlag!! - } - -private var _germanFlag: ImageVector? = null - -@Preview -@Composable -private fun Preview() { - Box(modifier = Modifier.padding(12.dp)) { - Image(imageVector = AppIcons.GermanFlag, contentDescription = "") - } -} diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/ItalianFlag.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/ItalianFlag.kt deleted file mode 100644 index 37dca29be..000000000 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/illu/ItalianFlag.kt +++ /dev/null @@ -1,88 +0,0 @@ -package com.infomaniak.swisstransfer.ui.icons.illu - -import androidx.compose.foundation.Image -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.padding -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.PathFillType.Companion.NonZero -import androidx.compose.ui.graphics.SolidColor -import androidx.compose.ui.graphics.StrokeCap.Companion.Butt -import androidx.compose.ui.graphics.StrokeJoin.Companion.Miter -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.graphics.vector.ImageVector.Builder -import androidx.compose.ui.graphics.vector.group -import androidx.compose.ui.graphics.vector.path -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import com.infomaniak.swisstransfer.ui.icons.AppIcons - -val AppIcons.ItalianFlag: ImageVector - get() { - if (_italianFlag != null) { - return _italianFlag!! - } - _italianFlag = Builder( - name = "ItalianFlag", - defaultWidth = 24.0.dp, - defaultHeight = 24.0.dp, - viewportWidth = 24.0f, - viewportHeight = 24.0f - ).apply { - group { - path( - fill = SolidColor(Color(0xFFE70E0E)), stroke = null, strokeLineWidth = - 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = - 4.0f, pathFillType = NonZero - ) { - moveTo(1.333f, 3.0f) - horizontalLineToRelative(21.334f) - arcTo(1.333f, 1.333f, 0.0f, false, true, 24.0f, 4.333f) - verticalLineToRelative(15.334f) - arcTo(1.333f, 1.333f, 0.0f, false, true, 22.667f, 21.0f) - horizontalLineTo(1.333f) - arcTo(1.333f, 1.333f, 0.0f, false, true, 0.0f, 19.667f) - verticalLineTo(4.333f) - arcTo(1.333f, 1.333f, 0.0f, false, true, 1.333f, 3.0f) - close() - } - path( - fill = SolidColor(Color(0xFF128D4E)), stroke = null, strokeLineWidth = - 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = - 4.0f, pathFillType = NonZero - ) { - moveTo(0.0f, 4.333f) - curveTo(0.0f, 3.597f, 0.597f, 3.0f, 1.333f, 3.0f) - horizontalLineTo(8.0f) - verticalLineToRelative(18.667f) - horizontalLineTo(1.333f) - arcTo(1.333f, 1.333f, 0.0f, false, true, 0.0f, 20.333f) - close() - } - path( - fill = SolidColor(Color(0xFFFFFFFF)), stroke = null, strokeLineWidth = - 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = - 4.0f, pathFillType = NonZero - ) { - moveTo(8.0f, 3.0f) - horizontalLineToRelative(8.0f) - verticalLineToRelative(18.667f) - horizontalLineTo(8.0f) - close() - } - } - } - .build() - return _italianFlag!! - } - -private var _italianFlag: ImageVector? = null - -@Preview -@Composable -private fun Preview() { - Box(modifier = Modifier.padding(12.dp)) { - Image(imageVector = AppIcons.ItalianFlag, contentDescription = "") - } -} From ccc11999471af05f38606f8a912902a144205be8 Mon Sep 17 00:00:00 2001 From: Vincent TE Date: Tue, 27 Aug 2024 14:07:36 +0200 Subject: [PATCH 08/10] Refacto --- .../settings/SettingsDownloadsLimitScreen.kt | 12 +- .../SettingsDurationValidityScreen.kt | 13 +- .../settings/SettingsEmailLanguageScreen.kt | 10 +- .../ui/screen/main/settings/SettingsScreen.kt | 99 ++------------ .../main/settings/SettingsScreenWrapper.kt | 125 ++++++++++++++++++ .../main/settings/SettingsThemeScreen.kt | 13 +- 6 files changed, 167 insertions(+), 105 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 99416c2fd..6026ec848 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 5471ec6fd..81bc191f7 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,15 @@ 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 fc0549c50..b9e914d08 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,13 @@ 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 0a1cfcd30..0127de3de 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.* @@ -56,78 +43,17 @@ import com.infomaniak.swisstransfer.ui.screen.main.settings.components.SettingTi import com.infomaniak.swisstransfer.ui.theme.Margin 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 +133,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, @@ -222,12 +140,11 @@ enum class SettingsOptionScreens { } @PreviewMobile -@PreviewTablet @Composable private fun SettingsScreenPreview() { SwissTransferTheme { Surface(color = MaterialTheme.colorScheme.background) { - SettingsScreenWrapper() + SettingsScreen(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 new file mode 100644 index 000000000..6c27c6aef --- /dev/null +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsScreenWrapper.kt @@ -0,0 +1,125 @@ +/* + * 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.MaterialTheme +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.TwoPaneScaffold +import com.infomaniak.swisstransfer.ui.screen.main.settings.SettingsOptionScreens.* +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() + } +} + +// 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() + } + } +} 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 f2315b5d6..57b7bbc75 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,15 @@ 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 From 2b6bad6d94f465e130d53ee095e92db7e9bae463 Mon Sep 17 00:00:00 2001 From: Vincent TE Date: Tue, 27 Aug 2024 14:18:44 +0200 Subject: [PATCH 09/10] Add dynamic version name --- app/build.gradle.kts | 5 +++++ .../swisstransfer/ui/screen/main/MainScaffold.kt | 8 ++++---- .../screen/main/components/AppNavigationSuiteScaffold.kt | 4 ++-- .../ui/screen/main/settings/SettingsScreen.kt | 3 ++- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 9b2abe070..d336e429b 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -34,6 +34,11 @@ android { proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") } } + + buildFeatures { + buildConfig = true + } + compileOptions { sourceCompatibility = javaVersion targetCompatibility = javaVersion 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 de8c55475..4bd3fd1be 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 @@ -42,7 +42,7 @@ fun MainScaffold( navController: NavHostController, currentDestination: MainNavigation, windowAdaptiveInfo: WindowAdaptiveInfo, - content: @Composable (Boolean) -> Unit = {}, + content: @Composable () -> Unit = {}, ) { val navType by rememberNavType(currentDestination, windowAdaptiveInfo) @@ -57,15 +57,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(1f)) { - content(it) + content() } HorizontalDivider() } 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 c33fb1bfc..62550053a 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 @@ -60,7 +60,7 @@ fun AppNavigationSuiteScaffold( navigationItems: List, currentDestination: MainNavigation, navigateToSelectedItem: (MainNavigation) -> Unit, - content: @Composable (Boolean) -> Unit, + content: @Composable () -> Unit, ) { Surface(color = SwissTransferTheme.materialColors.background) { NavigationSuiteScaffoldLayout( @@ -88,7 +88,7 @@ fun AppNavigationSuiteScaffold( } ) ) { - content(layoutType == NavigationSuiteType.NavigationBar) + content() } } } 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 0127de3de..cf2956028 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 @@ -30,6 +30,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource +import com.infomaniak.swisstransfer.BuildConfig import com.infomaniak.swisstransfer.R import com.infomaniak.swisstransfer.ui.components.BrandTobAppBar import com.infomaniak.swisstransfer.ui.icons.AppIcons @@ -128,7 +129,7 @@ fun SettingsScreen(onItemClick: (SettingsOptionScreens) -> Unit, getSelectedSett SettingItem(R.string.settingsOptionGiveFeedback, { selectedSetting == GIVE_FEEDBACK }, endIcon = OPEN_OUTSIDE) { onItemClick(GIVE_FEEDBACK) } - SettingItem(R.string.version, isSelected = { false }, description = "0.0.1", onClick = null) + SettingItem(R.string.version, isSelected = { false }, description = BuildConfig.VERSION_NAME, onClick = null) } } } From 7e5e5f272f91e7fa4970fd84674daf6da92d86eb Mon Sep 17 00:00:00 2001 From: Vincent TE Date: Tue, 27 Aug 2024 14:29:05 +0200 Subject: [PATCH 10/10] Remove unnecessary PreviewTablet --- .../main/settings/SettingsDownloadsLimitScreen.kt | 2 -- .../main/settings/SettingsDurationValidityScreen.kt | 2 -- .../main/settings/SettingsEmailLanguageScreen.kt | 10 +++++----- .../ui/screen/main/settings/SettingsThemeScreen.kt | 2 -- 4 files changed, 5 insertions(+), 11 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 6026ec848..931a60579 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 @@ -37,7 +37,6 @@ import com.infomaniak.swisstransfer.ui.screen.main.settings.components.SettingTi import com.infomaniak.swisstransfer.ui.screen.main.settings.components.SingleSelectOptions import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme import com.infomaniak.swisstransfer.ui.utils.PreviewMobile -import com.infomaniak.swisstransfer.ui.utils.PreviewTablet @Composable fun SettingsDownloadsLimitScreen(navigateBack: (() -> Unit)?) { @@ -70,7 +69,6 @@ enum class DownloadsLimit( } @PreviewMobile -@PreviewTablet @Composable private fun SettingsThemeScreenPreview() { SwissTransferTheme { 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 81bc191f7..6566ce6f8 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 @@ -38,7 +38,6 @@ import com.infomaniak.swisstransfer.ui.screen.main.settings.components.SettingTi import com.infomaniak.swisstransfer.ui.screen.main.settings.components.SingleSelectOptions import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme import com.infomaniak.swisstransfer.ui.utils.PreviewMobile -import com.infomaniak.swisstransfer.ui.utils.PreviewTablet @Composable fun SettingsValidityPeriodScreen(navigateBack: (() -> Unit)?) { @@ -71,7 +70,6 @@ enum class ValidityPeriod( } @PreviewMobile -@PreviewTablet @Composable private fun SettingsThemeScreenPreview() { SwissTransferTheme { 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 b9e914d08..26fdd768d 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 @@ -38,7 +38,6 @@ import com.infomaniak.swisstransfer.ui.screen.main.settings.components.SettingTi import com.infomaniak.swisstransfer.ui.screen.main.settings.components.SingleSelectOptions import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme import com.infomaniak.swisstransfer.ui.utils.PreviewMobile -import com.infomaniak.swisstransfer.ui.utils.PreviewTablet @Composable fun SettingsEmailLanguageScreen(navigateBack: (() -> Unit)?) { @@ -46,9 +45,11 @@ fun SettingsEmailLanguageScreen(navigateBack: (() -> Unit)?) { val canDisplayBackButton = navigateBack?.let { TopAppBarButton.backButton(navigateBack) } SwissTransferTobAppBar(R.string.settingsOptionEmailLanguage, navigationMenu = canDisplayBackButton) }) { paddingsValue -> - Column(modifier = Modifier - .verticalScroll(rememberScrollState()) - .padding(paddingsValue)) { + Column( + modifier = Modifier + .verticalScroll(rememberScrollState()) + .padding(paddingsValue) + ) { SettingTitle(titleRes = R.string.settingsEmailLanguageTitle) val (selectedItem, setSelectedItem) = rememberSaveable { mutableIntStateOf(0) } // TODO: Use DataStore or Realm @@ -70,7 +71,6 @@ enum class EmailLanguage( } @PreviewMobile -@PreviewTablet @Composable private fun SettingsThemeScreenPreview() { SwissTransferTheme { 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 57b7bbc75..6760d87cc 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 @@ -44,7 +44,6 @@ import com.infomaniak.swisstransfer.ui.screen.main.settings.components.SettingTi import com.infomaniak.swisstransfer.ui.screen.main.settings.components.SingleSelectOptions import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme import com.infomaniak.swisstransfer.ui.utils.PreviewMobile -import com.infomaniak.swisstransfer.ui.utils.PreviewTablet @Composable fun SettingsThemeScreen(navigateBack: (() -> Unit)?) { @@ -76,7 +75,6 @@ enum class ThemeOption( } @PreviewMobile -@PreviewTablet @Composable private fun SettingsThemeScreenPreview() { SwissTransferTheme {