From 80513bff8219c1ec5262147d6fe6b6fe0daf5da5 Mon Sep 17 00:00:00 2001 From: Gibran Chevalley Date: Tue, 13 Aug 2024 16:23:48 +0200 Subject: [PATCH 01/14] Add main screen fab --- .../ui/components/MainScreenFab.kt | 30 ++++++++ .../ui/components/SwissTransferFab.kt | 73 +++++++++++++++++++ .../swisstransfer/ui/icons/app/Add.kt | 65 +++++++++++++++++ .../ui/screen/main/MainNavHost.kt | 2 + .../ui/screen/main/sent/SentScreen.kt | 32 +++++++- .../swisstransfer/ui/theme/Shapes.kt | 1 + 6 files changed, 199 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/com/infomaniak/swisstransfer/ui/components/MainScreenFab.kt create mode 100644 app/src/main/java/com/infomaniak/swisstransfer/ui/components/SwissTransferFab.kt create mode 100644 app/src/main/java/com/infomaniak/swisstransfer/ui/icons/app/Add.kt diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/components/MainScreenFab.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/components/MainScreenFab.kt new file mode 100644 index 000000000..39349fd8d --- /dev/null +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/components/MainScreenFab.kt @@ -0,0 +1,30 @@ +/* + * 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.components + +import androidx.compose.material3.adaptive.navigationsuite.NavigationSuiteType +import androidx.compose.runtime.Composable +import com.infomaniak.swisstransfer.ui.screen.main.LocalNavType + +@Composable +fun MainScreenFab(navigateToNewTransfer: () -> Unit) { + if (LocalNavType.current == NavigationSuiteType.NavigationBar) { + SwissTransferFab(onClick = navigateToNewTransfer) + } +} diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/components/SwissTransferFab.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/components/SwissTransferFab.kt new file mode 100644 index 000000000..5c2f5b30c --- /dev/null +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/components/SwissTransferFab.kt @@ -0,0 +1,73 @@ +/* + * 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.components + +import android.content.res.Configuration +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CornerBasedShape +import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.Icon +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.infomaniak.swisstransfer.R +import com.infomaniak.swisstransfer.ui.icons.AppIcons +import com.infomaniak.swisstransfer.ui.icons.app.Add +import com.infomaniak.swisstransfer.ui.theme.Shapes +import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme + +@Composable +fun SwissTransferFab(modifier: Modifier = Modifier, fabType: FabType = FabType.NORMAL, onClick: () -> Unit) { + FloatingActionButton( + modifier = modifier.let { + if (fabType == FabType.BIG) it.size(80.dp) else it + }, + onClick = onClick, + containerColor = SwissTransferTheme.materialColors.primary, + contentColor = SwissTransferTheme.materialColors.onPrimary, + shape = fabType.shape, + ) { + Icon(imageVector = AppIcons.Add, contentDescription = stringResource(id = R.string.sentTitle)) + } +} + +enum class FabType(val shape: CornerBasedShape) { + NORMAL(Shapes.medium), + BIG(Shapes.large), +} + +@Preview +@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES or Configuration.UI_MODE_TYPE_NORMAL) +@Composable +private fun SwissTransferFabPreview() { + SwissTransferTheme { + SwissTransferFab(onClick = {}) + } +} + +@Preview +@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES or Configuration.UI_MODE_TYPE_NORMAL) +@Composable +private fun SwissTransferFabBigPreview() { + SwissTransferTheme { + SwissTransferFab(fabType = FabType.BIG, onClick = {}) + } +} diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/app/Add.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/app/Add.kt new file mode 100644 index 000000000..a60af7e80 --- /dev/null +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/icons/app/Add.kt @@ -0,0 +1,65 @@ +package com.infomaniak.swisstransfer.ui.icons.app + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.size +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.Round +import androidx.compose.ui.graphics.StrokeJoin +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.Add: ImageVector + get() { + if (_add != null) { + return _add!! + } + _add = Builder( + name = "Add", + defaultWidth = 24.0.dp, + defaultHeight = 24.0.dp, + viewportWidth = 24.0f, + viewportHeight = 24.0f + ).apply { + group { + path( + fill = null, + stroke = SolidColor(Color(0xFF9f9f9f)), + strokeLineWidth = 2.0f, + strokeLineCap = Round, + strokeLineJoin = StrokeJoin.Round, + strokeLineMiter = 4.0f, + pathFillType = NonZero + ) { + moveTo(1.5f, 12.0f) + horizontalLineToRelative(21.0f) + moveTo(12.0f, 1.5f) + verticalLineToRelative(21.0f) + } + } + }.build() + return _add!! + } + +private var _add: ImageVector? = null + +@Preview +@Composable +private fun Preview() { + Box { + Image( + imageVector = AppIcons.Add, + contentDescription = null, + modifier = Modifier.size(250.dp) + ) + } +} 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 61604bfa7..5b9ca6b34 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 @@ -28,6 +28,7 @@ import androidx.navigation.compose.composable import androidx.navigation.toRoute import com.infomaniak.swisstransfer.ui.navigation.MainNavigation import com.infomaniak.swisstransfer.ui.navigation.MainNavigation.* +import com.infomaniak.swisstransfer.ui.navigation.NewTransferNavigation import com.infomaniak.swisstransfer.ui.screen.main.received.ReceivedScreen import com.infomaniak.swisstransfer.ui.screen.main.sent.SentScreen import com.infomaniak.swisstransfer.ui.screen.main.settings.SettingsScreenWrapper @@ -42,6 +43,7 @@ fun MainNavHost( composable { SentScreen( navigateToDetails = { navController.navigate(TransferDetailsDestination(it)) }, + navigateToNewTransfer = { navController.navigate(NewTransferNavigation.ImportFilesDestination) }, ) } composable { diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt index 937ea0cca..49ed33550 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt @@ -18,13 +18,37 @@ package com.infomaniak.swisstransfer.ui.screen.main.sent +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import com.infomaniak.swisstransfer.ui.screen.main.LocalNavType +import androidx.compose.ui.Modifier +import com.infomaniak.swisstransfer.ui.components.MainScreenFab +import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme +import com.infomaniak.swisstransfer.ui.utils.PreviewMobile +import com.infomaniak.swisstransfer.ui.utils.PreviewTablet @Composable -fun SentScreen(navigateToDetails: (transferId: Int) -> Unit) { - val navType = LocalNavType.current +fun SentScreen( + navigateToDetails: (transferId: Int) -> Unit, + navigateToNewTransfer: () -> Unit, +) { + Scaffold(floatingActionButton = { MainScreenFab(navigateToNewTransfer) }) { contentPadding -> + Text( + text = "Sent screen", + modifier = Modifier.padding(contentPadding), + ) + } +} - Text("Sent screen $navType") +@PreviewMobile +@PreviewTablet +@Composable +private fun SentScreenPreview() { + SwissTransferTheme { + SentScreen( + navigateToDetails = {}, + navigateToNewTransfer = {}, + ) + } } diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/theme/Shapes.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/theme/Shapes.kt index 5775df830..2e7adb22a 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/theme/Shapes.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/theme/Shapes.kt @@ -26,5 +26,6 @@ val Shapes = Shapes( extraSmall = RoundedCornerShape(4.dp), small = RoundedCornerShape(8.dp), medium = RoundedCornerShape(16.dp), + large = RoundedCornerShape(24.dp), extraLarge = RoundedCornerShape(50), ) From a72260d418ab2621709bd2eafac9ee6865baec1f Mon Sep 17 00:00:00 2001 From: Gibran Chevalley Date: Tue, 13 Aug 2024 16:47:53 +0200 Subject: [PATCH 02/14] Make fab navigate to new transfer activity --- .../swisstransfer/ui/screen/main/MainNavHost.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 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 5b9ca6b34..9ddacc9e0 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 @@ -18,17 +18,19 @@ package com.infomaniak.swisstransfer.ui.screen.main +import android.content.Intent import androidx.compose.foundation.layout.safeDrawingPadding import androidx.compose.material3.adaptive.WindowAdaptiveInfo import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.toRoute +import com.infomaniak.swisstransfer.ui.NewTransferActivity import com.infomaniak.swisstransfer.ui.navigation.MainNavigation import com.infomaniak.swisstransfer.ui.navigation.MainNavigation.* -import com.infomaniak.swisstransfer.ui.navigation.NewTransferNavigation import com.infomaniak.swisstransfer.ui.screen.main.received.ReceivedScreen import com.infomaniak.swisstransfer.ui.screen.main.sent.SentScreen import com.infomaniak.swisstransfer.ui.screen.main.settings.SettingsScreenWrapper @@ -39,11 +41,13 @@ fun MainNavHost( navController: NavHostController, windowAdaptiveInfo: WindowAdaptiveInfo, ) { + val context = LocalContext.current + NavHost(navController, MainNavigation.startDestination, modifier = Modifier.safeDrawingPadding()) { composable { SentScreen( navigateToDetails = { navController.navigate(TransferDetailsDestination(it)) }, - navigateToNewTransfer = { navController.navigate(NewTransferNavigation.ImportFilesDestination) }, + navigateToNewTransfer = { context.startActivity(Intent(context, NewTransferActivity::class.java)) }, ) } composable { From 58d2369418b3218016dc6c37ef150c64cedd502e Mon Sep 17 00:00:00 2001 From: Gibran Chevalley Date: Tue, 13 Aug 2024 16:53:58 +0200 Subject: [PATCH 03/14] Fix SentScreen preview --- .../ui/components/MainScreenFab.kt | 4 +-- .../ui/screen/main/sent/SentScreen.kt | 28 ++++++++++++++++--- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/components/MainScreenFab.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/components/MainScreenFab.kt index 39349fd8d..869e5c7de 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/components/MainScreenFab.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/components/MainScreenFab.kt @@ -23,8 +23,8 @@ import androidx.compose.runtime.Composable import com.infomaniak.swisstransfer.ui.screen.main.LocalNavType @Composable -fun MainScreenFab(navigateToNewTransfer: () -> Unit) { - if (LocalNavType.current == NavigationSuiteType.NavigationBar) { +fun MainScreenFab(navType: NavigationSuiteType, navigateToNewTransfer: () -> Unit) { + if (navType == NavigationSuiteType.NavigationBar) { SwissTransferFab(onClick = navigateToNewTransfer) } } diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt index 49ed33550..50a71576a 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt @@ -21,9 +21,11 @@ package com.infomaniak.swisstransfer.ui.screen.main.sent import androidx.compose.foundation.layout.padding import androidx.compose.material3.Scaffold import androidx.compose.material3.Text +import androidx.compose.material3.adaptive.navigationsuite.NavigationSuiteType import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import com.infomaniak.swisstransfer.ui.components.MainScreenFab +import com.infomaniak.swisstransfer.ui.screen.main.LocalNavType import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme import com.infomaniak.swisstransfer.ui.utils.PreviewMobile import com.infomaniak.swisstransfer.ui.utils.PreviewTablet @@ -33,7 +35,15 @@ fun SentScreen( navigateToDetails: (transferId: Int) -> Unit, navigateToNewTransfer: () -> Unit, ) { - Scaffold(floatingActionButton = { MainScreenFab(navigateToNewTransfer) }) { contentPadding -> + TransferScreen(navType = LocalNavType.current, navigateToNewTransfer) +} + +@Composable +private fun TransferScreen( + navType: NavigationSuiteType, + navigateToNewTransfer: () -> Unit, +) { + Scaffold(floatingActionButton = { MainScreenFab(navType, navigateToNewTransfer) }) { contentPadding -> Text( text = "Sent screen", modifier = Modifier.padding(contentPadding), @@ -42,12 +52,22 @@ fun SentScreen( } @PreviewMobile +@Composable +private fun SentScreenMobilePreview() { + SwissTransferTheme { + TransferScreen( + NavigationSuiteType.NavigationBar, + navigateToNewTransfer = {}, + ) + } +} + @PreviewTablet @Composable -private fun SentScreenPreview() { +private fun SentScreenTabletPreview() { SwissTransferTheme { - SentScreen( - navigateToDetails = {}, + TransferScreen( + NavigationSuiteType.NavigationRail, navigateToNewTransfer = {}, ) } From d6c35023b01438f4f46b0e71b6140303ede29719 Mon Sep 17 00:00:00 2001 From: Gibran Chevalley Date: Wed, 14 Aug 2024 10:47:50 +0200 Subject: [PATCH 04/14] Correctly split MainScreenFab and SwissTransferFab --- .../ui/components/MainScreenFab.kt | 38 ++++++++++++++++--- .../ui/components/SwissTransferFab.kt | 20 ++++++---- .../ui/screen/main/MainNavHost.kt | 6 --- .../ui/screen/main/sent/SentScreen.kt | 13 ++++--- 4 files changed, 52 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/components/MainScreenFab.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/components/MainScreenFab.kt index 869e5c7de..4ac9aae24 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/components/MainScreenFab.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/components/MainScreenFab.kt @@ -18,13 +18,41 @@ package com.infomaniak.swisstransfer.ui.components -import androidx.compose.material3.adaptive.navigationsuite.NavigationSuiteType +import android.content.Intent +import androidx.compose.material3.FloatingActionButtonDefaults +import androidx.compose.material3.FloatingActionButtonElevation import androidx.compose.runtime.Composable -import com.infomaniak.swisstransfer.ui.screen.main.LocalNavType +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import com.infomaniak.swisstransfer.ui.NewTransferActivity @Composable -fun MainScreenFab(navType: NavigationSuiteType, navigateToNewTransfer: () -> Unit) { - if (navType == NavigationSuiteType.NavigationBar) { - SwissTransferFab(onClick = navigateToNewTransfer) +fun MainScreenFab( + modifier: Modifier = Modifier, + mainScreenFabType: MainScreenFabType +) { + val context = LocalContext.current + SwissTransferFab( + modifier = modifier, + fabType = mainScreenFabType.fabType, + elevation = mainScreenFabType.elevation(), + onClick = { context.startActivity(Intent(context, NewTransferActivity::class.java)) }, + ) +} + +enum class MainScreenFabType(val fabType: FabType, private val defaultElevation: Dp?) { + BOTTOM_BAR(FabType.NORMAL, null), + EMPTY_STATE(FabType.BIG, null), + NAVIGATION_RAIL(FabType.NORMAL, 0.dp); + + @Composable + fun elevation(): FloatingActionButtonElevation { + return if (defaultElevation != null) { + FloatingActionButtonDefaults.elevation(defaultElevation = 0.dp) + } else { + FloatingActionButtonDefaults.elevation() + } } } diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/components/SwissTransferFab.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/components/SwissTransferFab.kt index 5c2f5b30c..a74b3548d 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/components/SwissTransferFab.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/components/SwissTransferFab.kt @@ -22,30 +22,33 @@ import android.content.res.Configuration import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.CornerBasedShape import androidx.compose.material3.FloatingActionButton +import androidx.compose.material3.FloatingActionButtonDefaults +import androidx.compose.material3.FloatingActionButtonElevation import androidx.compose.material3.Icon import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.infomaniak.swisstransfer.R import com.infomaniak.swisstransfer.ui.icons.AppIcons import com.infomaniak.swisstransfer.ui.icons.app.Add import com.infomaniak.swisstransfer.ui.theme.Shapes import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme @Composable -fun SwissTransferFab(modifier: Modifier = Modifier, fabType: FabType = FabType.NORMAL, onClick: () -> Unit) { +fun SwissTransferFab( + modifier: Modifier = Modifier, + fabType: FabType = FabType.NORMAL, + elevation: FloatingActionButtonElevation = FloatingActionButtonDefaults.elevation(), + onClick: () -> Unit, +) { FloatingActionButton( - modifier = modifier.let { - if (fabType == FabType.BIG) it.size(80.dp) else it - }, + modifier = modifier.let { if (fabType == FabType.BIG) it.size(80.dp) else it }, onClick = onClick, containerColor = SwissTransferTheme.materialColors.primary, - contentColor = SwissTransferTheme.materialColors.onPrimary, shape = fabType.shape, + elevation = elevation, ) { - Icon(imageVector = AppIcons.Add, contentDescription = stringResource(id = R.string.sentTitle)) + Icon(imageVector = AppIcons.Add, contentDescription = "TODO") } } @@ -54,6 +57,7 @@ enum class FabType(val shape: CornerBasedShape) { BIG(Shapes.large), } + @Preview @Preview(uiMode = Configuration.UI_MODE_NIGHT_YES or Configuration.UI_MODE_TYPE_NORMAL) @Composable 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 9ddacc9e0..61604bfa7 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 @@ -18,17 +18,14 @@ package com.infomaniak.swisstransfer.ui.screen.main -import android.content.Intent import androidx.compose.foundation.layout.safeDrawingPadding import androidx.compose.material3.adaptive.WindowAdaptiveInfo import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalContext import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.toRoute -import com.infomaniak.swisstransfer.ui.NewTransferActivity import com.infomaniak.swisstransfer.ui.navigation.MainNavigation import com.infomaniak.swisstransfer.ui.navigation.MainNavigation.* import com.infomaniak.swisstransfer.ui.screen.main.received.ReceivedScreen @@ -41,13 +38,10 @@ fun MainNavHost( navController: NavHostController, windowAdaptiveInfo: WindowAdaptiveInfo, ) { - val context = LocalContext.current - NavHost(navController, MainNavigation.startDestination, modifier = Modifier.safeDrawingPadding()) { composable { SentScreen( navigateToDetails = { navController.navigate(TransferDetailsDestination(it)) }, - navigateToNewTransfer = { context.startActivity(Intent(context, NewTransferActivity::class.java)) }, ) } composable { diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt index 50a71576a..62d86cc01 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt @@ -25,6 +25,7 @@ import androidx.compose.material3.adaptive.navigationsuite.NavigationSuiteType import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import com.infomaniak.swisstransfer.ui.components.MainScreenFab +import com.infomaniak.swisstransfer.ui.components.MainScreenFabType import com.infomaniak.swisstransfer.ui.screen.main.LocalNavType import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme import com.infomaniak.swisstransfer.ui.utils.PreviewMobile @@ -33,17 +34,19 @@ import com.infomaniak.swisstransfer.ui.utils.PreviewTablet @Composable fun SentScreen( navigateToDetails: (transferId: Int) -> Unit, - navigateToNewTransfer: () -> Unit, ) { - TransferScreen(navType = LocalNavType.current, navigateToNewTransfer) + TransferScreen(navType = LocalNavType.current) } @Composable private fun TransferScreen( navType: NavigationSuiteType, - navigateToNewTransfer: () -> Unit, ) { - Scaffold(floatingActionButton = { MainScreenFab(navType, navigateToNewTransfer) }) { contentPadding -> + Scaffold( + floatingActionButton = { + if (navType == NavigationSuiteType.NavigationBar) MainScreenFab(mainScreenFabType = MainScreenFabType.BOTTOM_BAR) + } + ) { contentPadding -> Text( text = "Sent screen", modifier = Modifier.padding(contentPadding), @@ -57,7 +60,6 @@ private fun SentScreenMobilePreview() { SwissTransferTheme { TransferScreen( NavigationSuiteType.NavigationBar, - navigateToNewTransfer = {}, ) } } @@ -68,7 +70,6 @@ private fun SentScreenTabletPreview() { SwissTransferTheme { TransferScreen( NavigationSuiteType.NavigationRail, - navigateToNewTransfer = {}, ) } } From ad21676aca82b7d964e759ebdd2c655bec15b0a5 Mon Sep 17 00:00:00 2001 From: Gibran Chevalley Date: Wed, 14 Aug 2024 13:30:30 +0200 Subject: [PATCH 05/14] Add empty sent transfer screen --- .../ui/screen/main/sent/SentScreen.kt | 54 ++++++++++++++++++- .../ui/screen/main/sent/SentViewModel.kt | 25 +++++++++ 2 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentViewModel.kt diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt index 62d86cc01..2c4dff0e0 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt @@ -18,15 +18,21 @@ package com.infomaniak.swisstransfer.ui.screen.main.sent -import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.* import androidx.compose.material3.Scaffold +import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.material3.adaptive.navigationsuite.NavigationSuiteType import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.lifecycle.viewmodel.compose.viewModel import com.infomaniak.swisstransfer.ui.components.MainScreenFab import com.infomaniak.swisstransfer.ui.components.MainScreenFabType import com.infomaniak.swisstransfer.ui.screen.main.LocalNavType +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 @@ -35,7 +41,40 @@ import com.infomaniak.swisstransfer.ui.utils.PreviewTablet fun SentScreen( navigateToDetails: (transferId: Int) -> Unit, ) { - TransferScreen(navType = LocalNavType.current) + val viewmodel = viewModel() + if (viewmodel.transfers.isNotEmpty()) { + TransferScreen(navType = LocalNavType.current) + } else { + EmptyScreen() + } +} + +@Composable +fun EmptyScreen() { + Column( + modifier = Modifier.fillMaxSize(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + ) { + val maxWidth = 300.dp + Text( + modifier = Modifier.widthIn(max = maxWidth), + text = "Notre histoire commence ici", + style = SwissTransferTheme.typography.specificMedium32, + textAlign = TextAlign.Center, + ) + Text( + modifier = Modifier + .widthIn(max = maxWidth) + .padding(top = Margin.Medium), + text = "Fait ton premier transfert !", + style = SwissTransferTheme.typography.bodyRegular + ) + MainScreenFab( + modifier = Modifier.padding(top = Margin.ExtraLarge), + mainScreenFabType = MainScreenFabType.EMPTY_STATE, + ) + } } @Composable @@ -73,3 +112,14 @@ private fun SentScreenTabletPreview() { ) } } + +@PreviewMobile +@PreviewTablet +@Composable +private fun SentScreenPreview() { + SwissTransferTheme { + Surface { + SentScreen({}) + } + } +} diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentViewModel.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentViewModel.kt new file mode 100644 index 000000000..e7a403b84 --- /dev/null +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentViewModel.kt @@ -0,0 +1,25 @@ +/* + * 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.sent + +import androidx.lifecycle.ViewModel + +class SentViewModel: ViewModel() { + val transfers = emptyList() +} From ae1c791ac782a96bac46a31dc1853b4654fcf270 Mon Sep 17 00:00:00 2001 From: Gibran Chevalley Date: Wed, 14 Aug 2024 14:12:43 +0200 Subject: [PATCH 06/14] Add string ressources and clean code --- .../ui/screen/main/sent/SentScreen.kt | 45 ++++++++++--------- app/src/main/res/values-de/strings.xml | 3 ++ app/src/main/res/values-es/strings.xml | 3 ++ app/src/main/res/values-fr/strings.xml | 3 ++ app/src/main/res/values-it/strings.xml | 3 ++ app/src/main/res/values/strings.xml | 3 ++ 6 files changed, 40 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt index 2c4dff0e0..8d9dafde2 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt @@ -26,9 +26,11 @@ import androidx.compose.material3.adaptive.navigationsuite.NavigationSuiteType import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel +import com.infomaniak.swisstransfer.R import com.infomaniak.swisstransfer.ui.components.MainScreenFab import com.infomaniak.swisstransfer.ui.components.MainScreenFabType import com.infomaniak.swisstransfer.ui.screen.main.LocalNavType @@ -42,10 +44,18 @@ fun SentScreen( navigateToDetails: (transferId: Int) -> Unit, ) { val viewmodel = viewModel() - if (viewmodel.transfers.isNotEmpty()) { - TransferScreen(navType = LocalNavType.current) - } else { + SentScreen( + isEmpty = viewmodel.transfers.isEmpty(), + navType = LocalNavType.current, + ) +} + +@Composable +private fun SentScreen(isEmpty: Boolean, navType: NavigationSuiteType) { + if (isEmpty) { EmptyScreen() + } else { + TransferScreen(navType) } } @@ -59,7 +69,7 @@ fun EmptyScreen() { val maxWidth = 300.dp Text( modifier = Modifier.widthIn(max = maxWidth), - text = "Notre histoire commence ici", + text = stringResource(id = R.string.sentEmptyTitle), style = SwissTransferTheme.typography.specificMedium32, textAlign = TextAlign.Center, ) @@ -67,7 +77,7 @@ fun EmptyScreen() { modifier = Modifier .widthIn(max = maxWidth) .padding(top = Margin.Medium), - text = "Fait ton premier transfert !", + text = stringResource(id = R.string.firstTransferDescription), style = SwissTransferTheme.typography.bodyRegular ) MainScreenFab( @@ -97,29 +107,24 @@ private fun TransferScreen( @Composable private fun SentScreenMobilePreview() { SwissTransferTheme { - TransferScreen( - NavigationSuiteType.NavigationBar, - ) + Surface { + SentScreen( + isEmpty = true, + navType = NavigationSuiteType.NavigationBar, + ) + } } } @PreviewTablet @Composable private fun SentScreenTabletPreview() { - SwissTransferTheme { - TransferScreen( - NavigationSuiteType.NavigationRail, - ) - } -} - -@PreviewMobile -@PreviewTablet -@Composable -private fun SentScreenPreview() { SwissTransferTheme { Surface { - SentScreen({}) + SentScreen( + isEmpty = true, + navType = NavigationSuiteType.NavigationRail, + ) } } } diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 3ed730b9a..d93235ceb 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -16,7 +16,10 @@ ~ along with this program. If not, see . --> + New transfer + Make your first transfer! Received + Our story begins here Sent Settings diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 3ed730b9a..d93235ceb 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -16,7 +16,10 @@ ~ along with this program. If not, see . --> + New transfer + Make your first transfer! Received + Our story begins here Sent Settings diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index c9b45e348..1506968a2 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -16,7 +16,10 @@ ~ along with this program. If not, see . --> + Nouveau transfert + Fais ton premier transfert ! Recu + Notre histoire commence ici Envoyé Paramètres diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 3ed730b9a..d93235ceb 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -16,7 +16,10 @@ ~ along with this program. If not, see . --> + New transfer + Make your first transfer! Received + Our story begins here Sent Settings diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 65215d957..45f00150a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -19,7 +19,10 @@ SwissTransfer + New transfer + Make your first transfer! Received + Our story begins here Sent Settings From 4be1f1638b9bf2b71029310ae67cf74d72b80e95 Mon Sep 17 00:00:00 2001 From: Gibran Chevalley Date: Wed, 14 Aug 2024 14:18:01 +0200 Subject: [PATCH 07/14] Add MainScreenFab to the navigation rail --- .../main/components/AppNavigationSuiteScaffold.kt | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/components/AppNavigationSuiteScaffold.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/components/AppNavigationSuiteScaffold.kt index 4a4baf198..366cf932d 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 @@ -19,8 +19,6 @@ package com.infomaniak.swisstransfer.ui.screen.main.components import androidx.compose.foundation.layout.* -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Add import androidx.compose.material3.* import androidx.compose.material3.adaptive.navigationsuite.NavigationSuite import androidx.compose.material3.adaptive.navigationsuite.NavigationSuiteScaffold @@ -29,6 +27,8 @@ import androidx.compose.material3.adaptive.navigationsuite.NavigationSuiteType import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource +import com.infomaniak.swisstransfer.ui.components.MainScreenFab +import com.infomaniak.swisstransfer.ui.components.MainScreenFabType import com.infomaniak.swisstransfer.ui.navigation.MainNavigation import com.infomaniak.swisstransfer.ui.navigation.NavigationItem import com.infomaniak.swisstransfer.ui.theme.Margin @@ -116,9 +116,10 @@ private fun AppNavigationRail( ) { NavigationRail( header = { - FloatingActionButton(onClick = {}, modifier = Modifier.padding(bottom = Margin.Large)) { - Icon(Icons.Default.Add, contentDescription = null) - } + MainScreenFab( + modifier = Modifier.padding(vertical = Margin.Large), + mainScreenFabType = MainScreenFabType.NAVIGATION_RAIL, + ) }, containerColor = SwissTransferTheme.colors.navigationItemBackground ) { @@ -142,4 +143,4 @@ private fun NavigationIcon(isNavigationBar: Boolean, navigationItem: NavigationI @Composable private fun NavigationLabel(navigationItem: NavigationItem) { Text(stringResource(navigationItem.label)) -} \ No newline at end of file +} From 3738a326a8042335494cc528c5358de6fac89b27 Mon Sep 17 00:00:00 2001 From: Gibran Chevalley Date: Wed, 14 Aug 2024 14:32:26 +0200 Subject: [PATCH 08/14] Add fab in ReceivedScreen --- .../ui/screen/main/received/ReceivedScreen.kt | 47 ++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/received/ReceivedScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/received/ReceivedScreen.kt index 032c1b136..fa0539fd5 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/received/ReceivedScreen.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/received/ReceivedScreen.kt @@ -18,10 +18,55 @@ package com.infomaniak.swisstransfer.ui.screen.main.received +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Surface import androidx.compose.material3.Text +import androidx.compose.material3.adaptive.navigationsuite.NavigationSuiteType import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import com.infomaniak.swisstransfer.ui.components.MainScreenFab +import com.infomaniak.swisstransfer.ui.components.MainScreenFabType +import com.infomaniak.swisstransfer.ui.screen.main.LocalNavType +import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme +import com.infomaniak.swisstransfer.ui.utils.PreviewMobile +import com.infomaniak.swisstransfer.ui.utils.PreviewTablet @Composable fun ReceivedScreen(navigateToDetails: (transferId: Int) -> Unit) { - Text("Received screen") + ReceivedScreen(navType = LocalNavType.current) +} + +@Composable +private fun ReceivedScreen(navType: NavigationSuiteType) { + Scaffold( + floatingActionButton = { + if (navType == NavigationSuiteType.NavigationBar) MainScreenFab(mainScreenFabType = MainScreenFabType.BOTTOM_BAR) + } + ) { contentPadding -> + Text( + text = "Received screen", + modifier = Modifier.padding(contentPadding), + ) + } +} + +@PreviewMobile +@Composable +private fun ReceivedScreenMobilePreview() { + SwissTransferTheme { + Surface { + ReceivedScreen(navType = NavigationSuiteType.NavigationBar) + } + } +} + +@PreviewTablet +@Composable +private fun ReceivedScreenTabletPreview() { + SwissTransferTheme { + Surface { + ReceivedScreen(navType = NavigationSuiteType.NavigationRail) + } + } } From eac6800363ebe1fc2ef6d3de1983d1d51d02275a Mon Sep 17 00:00:00 2001 From: Gibran Chevalley Date: Thu, 15 Aug 2024 10:08:13 +0200 Subject: [PATCH 09/14] Rename MainScreenFab to NewTransferFab --- .../components/{MainScreenFab.kt => NewTransferFab.kt} | 10 +++++----- .../main/components/AppNavigationSuiteScaffold.kt | 8 ++++---- .../ui/screen/main/received/ReceivedScreen.kt | 6 +++--- .../swisstransfer/ui/screen/main/sent/SentScreen.kt | 10 +++++----- 4 files changed, 17 insertions(+), 17 deletions(-) rename app/src/main/java/com/infomaniak/swisstransfer/ui/components/{MainScreenFab.kt => NewTransferFab.kt} (88%) diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/components/MainScreenFab.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/components/NewTransferFab.kt similarity index 88% rename from app/src/main/java/com/infomaniak/swisstransfer/ui/components/MainScreenFab.kt rename to app/src/main/java/com/infomaniak/swisstransfer/ui/components/NewTransferFab.kt index 4ac9aae24..7070aa565 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/components/MainScreenFab.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/components/NewTransferFab.kt @@ -29,20 +29,20 @@ import androidx.compose.ui.unit.dp import com.infomaniak.swisstransfer.ui.NewTransferActivity @Composable -fun MainScreenFab( +fun NewTransferFab( modifier: Modifier = Modifier, - mainScreenFabType: MainScreenFabType + newTransferFabType: NewTransferFabType ) { val context = LocalContext.current SwissTransferFab( modifier = modifier, - fabType = mainScreenFabType.fabType, - elevation = mainScreenFabType.elevation(), + fabType = newTransferFabType.fabType, + elevation = newTransferFabType.elevation(), onClick = { context.startActivity(Intent(context, NewTransferActivity::class.java)) }, ) } -enum class MainScreenFabType(val fabType: FabType, private val defaultElevation: Dp?) { +enum class NewTransferFabType(val fabType: FabType, private val defaultElevation: Dp?) { BOTTOM_BAR(FabType.NORMAL, null), EMPTY_STATE(FabType.BIG, null), NAVIGATION_RAIL(FabType.NORMAL, 0.dp); 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 366cf932d..0ef2d6d04 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 @@ -27,8 +27,8 @@ import androidx.compose.material3.adaptive.navigationsuite.NavigationSuiteType import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource -import com.infomaniak.swisstransfer.ui.components.MainScreenFab -import com.infomaniak.swisstransfer.ui.components.MainScreenFabType +import com.infomaniak.swisstransfer.ui.components.NewTransferFab +import com.infomaniak.swisstransfer.ui.components.NewTransferFabType import com.infomaniak.swisstransfer.ui.navigation.MainNavigation import com.infomaniak.swisstransfer.ui.navigation.NavigationItem import com.infomaniak.swisstransfer.ui.theme.Margin @@ -116,9 +116,9 @@ private fun AppNavigationRail( ) { NavigationRail( header = { - MainScreenFab( + NewTransferFab( modifier = Modifier.padding(vertical = Margin.Large), - mainScreenFabType = MainScreenFabType.NAVIGATION_RAIL, + newTransferFabType = NewTransferFabType.NAVIGATION_RAIL, ) }, containerColor = SwissTransferTheme.colors.navigationItemBackground diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/received/ReceivedScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/received/ReceivedScreen.kt index fa0539fd5..ce5155265 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/received/ReceivedScreen.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/received/ReceivedScreen.kt @@ -25,8 +25,8 @@ import androidx.compose.material3.Text import androidx.compose.material3.adaptive.navigationsuite.NavigationSuiteType import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import com.infomaniak.swisstransfer.ui.components.MainScreenFab -import com.infomaniak.swisstransfer.ui.components.MainScreenFabType +import com.infomaniak.swisstransfer.ui.components.NewTransferFab +import com.infomaniak.swisstransfer.ui.components.NewTransferFabType import com.infomaniak.swisstransfer.ui.screen.main.LocalNavType import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme import com.infomaniak.swisstransfer.ui.utils.PreviewMobile @@ -41,7 +41,7 @@ fun ReceivedScreen(navigateToDetails: (transferId: Int) -> Unit) { private fun ReceivedScreen(navType: NavigationSuiteType) { Scaffold( floatingActionButton = { - if (navType == NavigationSuiteType.NavigationBar) MainScreenFab(mainScreenFabType = MainScreenFabType.BOTTOM_BAR) + if (navType == NavigationSuiteType.NavigationBar) NewTransferFab(newTransferFabType = NewTransferFabType.BOTTOM_BAR) } ) { contentPadding -> Text( diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt index 8d9dafde2..62589639f 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt @@ -31,8 +31,8 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel import com.infomaniak.swisstransfer.R -import com.infomaniak.swisstransfer.ui.components.MainScreenFab -import com.infomaniak.swisstransfer.ui.components.MainScreenFabType +import com.infomaniak.swisstransfer.ui.components.NewTransferFab +import com.infomaniak.swisstransfer.ui.components.NewTransferFabType import com.infomaniak.swisstransfer.ui.screen.main.LocalNavType import com.infomaniak.swisstransfer.ui.theme.Margin import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme @@ -80,9 +80,9 @@ fun EmptyScreen() { text = stringResource(id = R.string.firstTransferDescription), style = SwissTransferTheme.typography.bodyRegular ) - MainScreenFab( + NewTransferFab( modifier = Modifier.padding(top = Margin.ExtraLarge), - mainScreenFabType = MainScreenFabType.EMPTY_STATE, + newTransferFabType = NewTransferFabType.EMPTY_STATE, ) } } @@ -93,7 +93,7 @@ private fun TransferScreen( ) { Scaffold( floatingActionButton = { - if (navType == NavigationSuiteType.NavigationBar) MainScreenFab(mainScreenFabType = MainScreenFabType.BOTTOM_BAR) + if (navType == NavigationSuiteType.NavigationBar) NewTransferFab(newTransferFabType = NewTransferFabType.BOTTOM_BAR) } ) { contentPadding -> Text( From 2cde4b22c5b667a3550fa865e5218ed7a582edfb Mon Sep 17 00:00:00 2001 From: Gibran Chevalley Date: Thu, 15 Aug 2024 10:15:21 +0200 Subject: [PATCH 10/14] Add generic launchActivity extension --- .../ui/components/NewTransferFab.kt | 4 +-- .../swisstransfer/ui/utils/ContextExt.kt | 30 +++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/infomaniak/swisstransfer/ui/utils/ContextExt.kt diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/components/NewTransferFab.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/components/NewTransferFab.kt index 7070aa565..73cb73bf5 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/components/NewTransferFab.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/components/NewTransferFab.kt @@ -18,7 +18,6 @@ package com.infomaniak.swisstransfer.ui.components -import android.content.Intent import androidx.compose.material3.FloatingActionButtonDefaults import androidx.compose.material3.FloatingActionButtonElevation import androidx.compose.runtime.Composable @@ -27,6 +26,7 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.infomaniak.swisstransfer.ui.NewTransferActivity +import com.infomaniak.swisstransfer.ui.utils.launchActivity @Composable fun NewTransferFab( @@ -38,7 +38,7 @@ fun NewTransferFab( modifier = modifier, fabType = newTransferFabType.fabType, elevation = newTransferFabType.elevation(), - onClick = { context.startActivity(Intent(context, NewTransferActivity::class.java)) }, + onClick = { context.launchActivity(NewTransferActivity::class) }, ) } diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/utils/ContextExt.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/utils/ContextExt.kt new file mode 100644 index 000000000..c30aa7321 --- /dev/null +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/utils/ContextExt.kt @@ -0,0 +1,30 @@ +/* + * 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.utils + +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.os.Bundle +import kotlin.reflect.KClass + + +fun Context.launchActivity(kClass: KClass, options: Bundle? = null) { + startActivity(Intent(this, kClass.java), options) +} From 8733f9b7077998a0e44af5c028a48294717f981f Mon Sep 17 00:00:00 2001 From: Gibran Chevalley Date: Thu, 15 Aug 2024 10:19:20 +0200 Subject: [PATCH 11/14] Use actual defined defaultElevation in NewTransferFabType --- .../infomaniak/swisstransfer/ui/components/NewTransferFab.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/components/NewTransferFab.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/components/NewTransferFab.kt index 73cb73bf5..51ebd35c3 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/components/NewTransferFab.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/components/NewTransferFab.kt @@ -50,7 +50,7 @@ enum class NewTransferFabType(val fabType: FabType, private val defaultElevation @Composable fun elevation(): FloatingActionButtonElevation { return if (defaultElevation != null) { - FloatingActionButtonDefaults.elevation(defaultElevation = 0.dp) + FloatingActionButtonDefaults.elevation(defaultElevation) } else { FloatingActionButtonDefaults.elevation() } From ccef994fc9aa1cdf105f7ca34449594e7a82b9dd Mon Sep 17 00:00:00 2001 From: Gibran Chevalley Date: Thu, 15 Aug 2024 10:24:06 +0200 Subject: [PATCH 12/14] Add new transfer fab content description --- .../swisstransfer/ui/components/SwissTransferFab.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/components/SwissTransferFab.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/components/SwissTransferFab.kt index a74b3548d..5bf88dd2d 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/components/SwissTransferFab.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/components/SwissTransferFab.kt @@ -27,8 +27,10 @@ import androidx.compose.material3.FloatingActionButtonElevation import androidx.compose.material3.Icon import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import com.infomaniak.swisstransfer.R import com.infomaniak.swisstransfer.ui.icons.AppIcons import com.infomaniak.swisstransfer.ui.icons.app.Add import com.infomaniak.swisstransfer.ui.theme.Shapes @@ -48,7 +50,10 @@ fun SwissTransferFab( shape = fabType.shape, elevation = elevation, ) { - Icon(imageVector = AppIcons.Add, contentDescription = "TODO") + Icon( + imageVector = AppIcons.Add, + contentDescription = stringResource(id = R.string.contentDescriptionCreateNewTransferButton), + ) } } From 4e46d2eb25a993ad7ec05219579adcc5ed8c7169 Mon Sep 17 00:00:00 2001 From: Gibran Chevalley Date: Thu, 15 Aug 2024 11:34:43 +0200 Subject: [PATCH 13/14] Fix margins --- .../ui/screen/main/components/AppNavigationSuiteScaffold.kt | 2 +- .../swisstransfer/ui/screen/main/sent/SentScreen.kt | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/components/AppNavigationSuiteScaffold.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/components/AppNavigationSuiteScaffold.kt index 0ef2d6d04..663b0e5bc 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 @@ -117,7 +117,7 @@ private fun AppNavigationRail( NavigationRail( header = { NewTransferFab( - modifier = Modifier.padding(vertical = Margin.Large), + modifier = Modifier.padding(vertical = Margin.Medium), newTransferFabType = NewTransferFabType.NAVIGATION_RAIL, ) }, diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt index 62589639f..b4322a703 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt @@ -73,10 +73,9 @@ fun EmptyScreen() { style = SwissTransferTheme.typography.specificMedium32, textAlign = TextAlign.Center, ) + Spacer(modifier = Modifier.height(Margin.Medium)) Text( - modifier = Modifier - .widthIn(max = maxWidth) - .padding(top = Margin.Medium), + modifier = Modifier.widthIn(max = maxWidth), text = stringResource(id = R.string.firstTransferDescription), style = SwissTransferTheme.typography.bodyRegular ) From b84f03c145c432d743c66b05ef9a76c099bfbc86 Mon Sep 17 00:00:00 2001 From: Gibran Chevalley Date: Thu, 15 Aug 2024 11:50:15 +0200 Subject: [PATCH 14/14] Already define a compose state and a "loading" status for the screen --- .../ui/screen/main/sent/SentScreen.kt | 17 +++++++++++------ .../ui/screen/main/sent/SentViewModel.kt | 8 ++++++-- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt index b4322a703..a46b20ebb 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt @@ -24,11 +24,13 @@ import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.material3.adaptive.navigationsuite.NavigationSuiteType import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel import com.infomaniak.swisstransfer.R import com.infomaniak.swisstransfer.ui.components.NewTransferFab @@ -42,17 +44,20 @@ import com.infomaniak.swisstransfer.ui.utils.PreviewTablet @Composable fun SentScreen( navigateToDetails: (transferId: Int) -> Unit, + sentViewModel: SentViewModel = viewModel(), ) { - val viewmodel = viewModel() + val transfers by sentViewModel.transfers.collectAsStateWithLifecycle() SentScreen( - isEmpty = viewmodel.transfers.isEmpty(), + transfers = transfers, navType = LocalNavType.current, ) } @Composable -private fun SentScreen(isEmpty: Boolean, navType: NavigationSuiteType) { - if (isEmpty) { +private fun SentScreen(transfers: List?, navType: NavigationSuiteType) { + if (transfers == null) return + + if (transfers.isEmpty()) { EmptyScreen() } else { TransferScreen(navType) @@ -108,7 +113,7 @@ private fun SentScreenMobilePreview() { SwissTransferTheme { Surface { SentScreen( - isEmpty = true, + transfers = emptyList(), navType = NavigationSuiteType.NavigationBar, ) } @@ -121,7 +126,7 @@ private fun SentScreenTabletPreview() { SwissTransferTheme { Surface { SentScreen( - isEmpty = true, + transfers = emptyList(), navType = NavigationSuiteType.NavigationRail, ) } diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentViewModel.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentViewModel.kt index e7a403b84..51e431c74 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentViewModel.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentViewModel.kt @@ -19,7 +19,11 @@ package com.infomaniak.swisstransfer.ui.screen.main.sent import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.stateIn -class SentViewModel: ViewModel() { - val transfers = emptyList() +class SentViewModel : ViewModel() { + val transfers = flow> { emit(emptyList()) }.stateIn(viewModelScope, SharingStarted.Eagerly, null) }