From cee42e7758c393c90e1997dae72da2253bae8ed1 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Thu, 13 Apr 2023 23:58:29 +0200 Subject: [PATCH 1/8] now takes viewmodel and open function. Also uses viewmodel functions --- .../drawer}/DrawerComposable.kt | 35 ++++++++++--------- .../studeez/screens/drawer/DrawerViewModel.kt | 22 ++++++++++++ .../navbar}/NavigationBarComposable.kt | 0 .../screens/navbar/NavigationBarViewModel.kt | 4 +++ 4 files changed, 44 insertions(+), 17 deletions(-) rename app/src/main/java/be/ugent/sel/studeez/{common/composable => screens/drawer}/DrawerComposable.kt (79%) create mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/drawer/DrawerViewModel.kt rename app/src/main/java/be/ugent/sel/studeez/{common/composable => screens/navbar}/NavigationBarComposable.kt (100%) create mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/navbar/NavigationBarViewModel.kt diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/DrawerComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/drawer/DrawerComposable.kt similarity index 79% rename from app/src/main/java/be/ugent/sel/studeez/common/composable/DrawerComposable.kt rename to app/src/main/java/be/ugent/sel/studeez/screens/drawer/DrawerComposable.kt index 2a484b1..0e3b2c9 100644 --- a/app/src/main/java/be/ugent/sel/studeez/common/composable/DrawerComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/drawer/DrawerComposable.kt @@ -1,4 +1,4 @@ -package be.ugent.sel.studeez.common.composable +package be.ugent.sel.studeez.screens.drawer import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* @@ -12,16 +12,17 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.vectorResource -import androidx.compose.ui.tooling.preview.Preview +import androidx.hilt.navigation.compose.hiltViewModel import be.ugent.sel.studeez.R import be.ugent.sel.studeez.resources -import be.ugent.sel.studeez.ui.theme.StudeezTheme @Composable fun Drawer( - onLogoutClick: () -> Unit + openAndPopUp: (String, String) -> Unit, + viewModel: DrawerViewModel = hiltViewModel() ) { + Column(modifier = Modifier.fillMaxSize()) { DrawerEntry( icon = Icons.Default.Home, @@ -33,26 +34,26 @@ fun Drawer( icon = ImageVector.vectorResource(id = R.drawable.ic_timer), text = resources().getString(R.string.timers) ) { - // TODO Go to timers + viewModel.onTimersClick(openAndPopUp) } DrawerEntry( icon = Icons.Default.Settings, text = resources().getString(R.string.settings) ) { - // TODO Go to settings + viewModel.onSettingsClick(openAndPopUp) } DrawerEntry( icon = ImageVector.vectorResource(id = R.drawable.ic_logout), text = resources().getString(R.string.log_out) ) { - onLogoutClick() + viewModel.onLogoutClick(openAndPopUp) } DrawerEntry( icon = Icons.Outlined.Info, text = resources().getString(R.string.about) ) { - // TODO Go to about + viewModel.onAboutClick(openAndPopUp) } } } @@ -78,12 +79,12 @@ fun DrawerEntry( } } -@Preview -@Composable -fun DrawerPreview() { - StudeezTheme { - Drawer( - {} - ) - } -} \ No newline at end of file +//@Preview +//@Composable +//fun DrawerPreview() { +// StudeezTheme { +// Drawer( +// {} +// ) +// } +//} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/drawer/DrawerViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/drawer/DrawerViewModel.kt new file mode 100644 index 0000000..a8173f8 --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/drawer/DrawerViewModel.kt @@ -0,0 +1,22 @@ +package be.ugent.sel.studeez.screens.drawer + +import be.ugent.sel.studeez.domain.AccountDAO +import be.ugent.sel.studeez.domain.LogService +import be.ugent.sel.studeez.navigation.StudeezDestinations +import be.ugent.sel.studeez.screens.StudeezViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject + +@HiltViewModel +class PrimaryScreenViewModel @Inject constructor( + private val accountDAO: AccountDAO, + logService: LogService +) : StudeezViewModel(logService) { + + fun onLogoutClick(openAndPopup: (String, String) -> Unit) { + launchCatching { + accountDAO.signOut() + openAndPopup(StudeezDestinations.LOGIN_SCREEN, StudeezDestinations.HOME_SCREEN) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/NavigationBarComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/navbar/NavigationBarComposable.kt similarity index 100% rename from app/src/main/java/be/ugent/sel/studeez/common/composable/NavigationBarComposable.kt rename to app/src/main/java/be/ugent/sel/studeez/screens/navbar/NavigationBarComposable.kt diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/navbar/NavigationBarViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/navbar/NavigationBarViewModel.kt new file mode 100644 index 0000000..45db344 --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/navbar/NavigationBarViewModel.kt @@ -0,0 +1,4 @@ +package be.ugent.sel.studeez.screens.navbar + +class NavigationBarViewModel { +} \ No newline at end of file From 4e9aab73c2f86ee0e8d4010981bd757ab99b76c2 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Thu, 13 Apr 2023 23:59:18 +0200 Subject: [PATCH 2/8] Drawer now has a viewModel for each clickable function --- .../studeez/screens/drawer/DrawerViewModel.kt | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/drawer/DrawerViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/drawer/DrawerViewModel.kt index a8173f8..8eb4945 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/drawer/DrawerViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/drawer/DrawerViewModel.kt @@ -8,7 +8,7 @@ import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject @HiltViewModel -class PrimaryScreenViewModel @Inject constructor( +class DrawerViewModel @Inject constructor( private val accountDAO: AccountDAO, logService: LogService ) : StudeezViewModel(logService) { @@ -19,4 +19,20 @@ class PrimaryScreenViewModel @Inject constructor( openAndPopup(StudeezDestinations.LOGIN_SCREEN, StudeezDestinations.HOME_SCREEN) } } -} \ No newline at end of file + + fun onHomeButtonClick(openAndPopup: (String, String) -> Unit) { + // TODO + } + + fun onTimersClick(openAndPopup: (String, String) -> Unit) { + // TODO + } + + fun onSettingsClick(openAndPopup: (String, String) -> Unit) { + // TODO + } + + fun onAboutClick(openAndPopup: (String, String) -> Unit) { + // TODO + } +} From 71a42a28e25e37e46566098b8f9a7c5efc54130e Mon Sep 17 00:00:00 2001 From: lbarraga Date: Fri, 14 Apr 2023 00:00:16 +0200 Subject: [PATCH 3/8] openAndPopUp function as argument for prim. screen --- .../main/java/be/ugent/sel/studeez/screens/home/HomeScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/home/HomeScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/home/HomeScreen.kt index d3c1275..db0be1a 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/home/HomeScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/home/HomeScreen.kt @@ -16,7 +16,7 @@ fun HomeScreen( ) { PrimaryScreenTemplate( title = resources().getString(R.string.home), - onLogoutClick = { viewModel.onLogoutClick(openAndPopUp) } + openAndPopUp = openAndPopUp ) { BasicButton(R.string.start_session, Modifier.basicButton()) { viewModel.onStartSessionClick(openAndPopUp) From f5940e47438e557ab376f09f00bcf42926db1c97 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Fri, 14 Apr 2023 00:00:46 +0200 Subject: [PATCH 4/8] now takes viewmodel and open function. Also uses viewmodel functions --- .../screens/navbar/NavigationBarComposable.kt | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/navbar/NavigationBarComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/navbar/NavigationBarComposable.kt index 61964eb..fb4b2a3 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/navbar/NavigationBarComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/navbar/NavigationBarComposable.kt @@ -1,4 +1,4 @@ -package be.ugent.sel.studeez.common.composable +package be.ugent.sel.studeez.screens.navbar import androidx.compose.material.BottomNavigation import androidx.compose.material.BottomNavigationItem @@ -12,10 +12,14 @@ import androidx.compose.material.icons.outlined.DateRange import androidx.compose.runtime.Composable import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.hilt.navigation.compose.hiltViewModel import be.ugent.sel.studeez.ui.theme.StudeezTheme @Composable -fun NavigationBar() { +fun NavigationBar( + popUpAndOpen: (String, String) -> Unit, + viewModel: NavigationBarViewModel = hiltViewModel() +) { // TODO Pass functions and new screens. // TODO Pass which screen is selected. // TODO Disabled -> HIGH/MEDIUM_EMPHASIS if the page is implemented @@ -26,14 +30,14 @@ fun NavigationBar() { icon = { Icon(imageVector = Icons.Default.List, "Home") }, label = { Text(text = "Home") }, selected = false, // TODO - onClick = { /* TODO */ } + onClick = { viewModel.onHomeClick(popUpAndOpen) } ) BottomNavigationItem( icon = { Icon(imageVector = Icons.Default.Check, "Tasks") }, label = { Text(text = "Tasks") }, selected = false, // TODO - onClick = { /* TODO */ } + onClick = { viewModel.onTasksClick(popUpAndOpen) } ) // Hack to space the entries in the navigation bar, make space for fab @@ -43,21 +47,21 @@ fun NavigationBar() { icon = { Icon(imageVector = Icons.Outlined.DateRange, "Sessions") }, label = { Text(text = "Sessions") }, selected = false, // TODO - onClick = { /* TODO */ } + onClick = { viewModel.onSessionsClick(popUpAndOpen) } ) BottomNavigationItem( icon = { Icon(imageVector = Icons.Default.Person, "Profile") }, label = { Text(text = "Profile") }, selected = false, // TODO - onClick = { /* TODO */ } + onClick = { viewModel.onProfileClick(popUpAndOpen) } ) } } -@Preview(showBackground = true) -@Composable -fun NavigationBarPreview() { - StudeezTheme { NavigationBar() } -} \ No newline at end of file +//@Preview(showBackground = true) +//@Composable +//fun NavigationBarPreview() { +// StudeezTheme { NavigationBar() } +//} \ No newline at end of file From a5df9cf1910113d27b53e7cd793b6cccfba3d75b Mon Sep 17 00:00:00 2001 From: lbarraga Date: Fri, 14 Apr 2023 00:01:20 +0200 Subject: [PATCH 5/8] navbar now has a viewModel for each clickable function --- .../screens/navbar/NavigationBarViewModel.kt | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/navbar/NavigationBarViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/navbar/NavigationBarViewModel.kt index 45db344..57ae686 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/navbar/NavigationBarViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/navbar/NavigationBarViewModel.kt @@ -1,4 +1,31 @@ package be.ugent.sel.studeez.screens.navbar -class NavigationBarViewModel { +import be.ugent.sel.studeez.domain.AccountDAO +import be.ugent.sel.studeez.domain.LogService +import be.ugent.sel.studeez.navigation.StudeezDestinations +import be.ugent.sel.studeez.screens.StudeezViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject + +@HiltViewModel +class NavigationBarViewModel @Inject constructor( + private val accountDAO: AccountDAO, + logService: LogService +) : StudeezViewModel(logService) { + + fun onHomeClick(openAndPopup: (String, String) -> Unit) { + // TODO + } + + fun onTasksClick(openAndPopup: (String, String) -> Unit) { + // TODO + } + + fun onSessionsClick(openAndPopup: (String, String) -> Unit) { + // TODO + } + + fun onProfileClick(openAndPopup: (String, String) -> Unit) { + // TODO + } } \ No newline at end of file From 373d7281fe0446e67e1e2a42f7869b4f0fa968cf Mon Sep 17 00:00:00 2001 From: lbarraga Date: Fri, 14 Apr 2023 00:02:31 +0200 Subject: [PATCH 6/8] openAndPopUp needs to be passed down to navbar and drawer --- .../composable/PrimaryScreenComposable.kt | 32 +++++++++---------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/PrimaryScreenComposable.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/PrimaryScreenComposable.kt index 3c7eeb8..9dc92f2 100644 --- a/app/src/main/java/be/ugent/sel/studeez/common/composable/PrimaryScreenComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/PrimaryScreenComposable.kt @@ -6,17 +6,17 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Menu import androidx.compose.runtime.Composable import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.ui.tooling.preview.Preview import be.ugent.sel.studeez.R import be.ugent.sel.studeez.resources -import be.ugent.sel.studeez.ui.theme.StudeezTheme +import be.ugent.sel.studeez.screens.drawer.Drawer +import be.ugent.sel.studeez.screens.navbar.NavigationBar import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch @Composable fun PrimaryScreenTemplate( title: String, - onLogoutClick: () -> Unit, + openAndPopUp: (String, String) -> Unit, content: @Composable (PaddingValues) -> Unit ) { val scaffoldState: ScaffoldState = rememberScaffoldState() @@ -40,12 +40,10 @@ fun PrimaryScreenTemplate( ) }, drawerContent = { - Drawer( - onLogoutClick = { onLogoutClick() } - ) + Drawer(openAndPopUp) }, - bottomBar = { NavigationBar() }, // TODO Pass arguments so that the current tab etc can be shown + bottomBar = { NavigationBar(openAndPopUp) }, floatingActionButtonPosition = FabPosition.Center, isFloatingActionButtonDocked = true, floatingActionButton = { CollapsedAddButton() } @@ -54,13 +52,13 @@ fun PrimaryScreenTemplate( } } -@Preview -@Composable -fun PrimaryScreenPreview() { - StudeezTheme { - PrimaryScreenTemplate( - "Preview screen", - {} - ) {} - } -} \ No newline at end of file +//@Preview +//@Composable +//fun PrimaryScreenPreview() { +// StudeezTheme { +// PrimaryScreenTemplate( +// "Preview screen", +// {} +// ) {} +// } +//} \ No newline at end of file From 064a9d3f31916eca02684c00e274701afc134a2a Mon Sep 17 00:00:00 2001 From: lbarraga Date: Fri, 14 Apr 2023 00:03:53 +0200 Subject: [PATCH 7/8] code undupe go brr --- .../main/java/be/ugent/sel/studeez/StudeezApp.kt | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/StudeezApp.kt b/app/src/main/java/be/ugent/sel/studeez/StudeezApp.kt index aeacffa..53cf341 100644 --- a/app/src/main/java/be/ugent/sel/studeez/StudeezApp.kt +++ b/app/src/main/java/be/ugent/sel/studeez/StudeezApp.kt @@ -76,21 +76,23 @@ fun resources(): Resources { fun NavGraphBuilder.studeezGraph(appState: StudeezAppstate) { + val openAndPopUp: (String, String) -> Unit = { + route, popUp -> appState.navigateAndPopUp(route, popUp) + } + composable(StudeezDestinations.SPLASH_SCREEN) { - SplashScreen(openAndPopUp = { route, popUp -> appState.navigateAndPopUp(route, popUp) }) + SplashScreen(openAndPopUp) } composable(StudeezDestinations.LOGIN_SCREEN) { - LoginScreen(openAndPopUp = { route, popUp -> appState.navigateAndPopUp(route, popUp) }) + LoginScreen(openAndPopUp) } composable(StudeezDestinations.SIGN_UP_SCREEN) { - SignUpScreen(openAndPopUp = { route, popUp -> appState.navigateAndPopUp(route, popUp) }) + SignUpScreen(openAndPopUp) } composable(StudeezDestinations.HOME_SCREEN) { - HomeScreen( - openAndPopUp = { route, popUp -> appState.navigateAndPopUp(route, popUp) } - ) + HomeScreen(openAndPopUp) } } \ No newline at end of file From 7c09aac5b3afc551178563905bc8a59565db23aa Mon Sep 17 00:00:00 2001 From: tdpeuter Date: Fri, 14 Apr 2023 13:49:28 +0200 Subject: [PATCH 8/8] Proper drawer styling --- .../screens/drawer/DrawerComposable.kt | 87 +++++++++++-------- 1 file changed, 52 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/drawer/DrawerComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/drawer/DrawerComposable.kt index 0e3b2c9..7b39f80 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/drawer/DrawerComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/drawer/DrawerComposable.kt @@ -12,9 +12,13 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.vectorResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.viewmodel.compose.viewModel import be.ugent.sel.studeez.R import be.ugent.sel.studeez.resources +import be.ugent.sel.studeez.ui.theme.StudeezTheme @Composable @@ -22,31 +26,36 @@ fun Drawer( openAndPopUp: (String, String) -> Unit, viewModel: DrawerViewModel = hiltViewModel() ) { - - Column(modifier = Modifier.fillMaxSize()) { - DrawerEntry( - icon = Icons.Default.Home, - text = resources().getString(R.string.home) + Column ( + modifier = Modifier.fillMaxWidth() + ) { + Column ( + modifier = Modifier.fillMaxWidth().weight(1f) ) { - // TODO Go to home - } - DrawerEntry( - icon = ImageVector.vectorResource(id = R.drawable.ic_timer), - text = resources().getString(R.string.timers) - ) { - viewModel.onTimersClick(openAndPopUp) - } - DrawerEntry( - icon = Icons.Default.Settings, - text = resources().getString(R.string.settings) - ) { - viewModel.onSettingsClick(openAndPopUp) - } - DrawerEntry( - icon = ImageVector.vectorResource(id = R.drawable.ic_logout), - text = resources().getString(R.string.log_out) - ) { - viewModel.onLogoutClick(openAndPopUp) + DrawerEntry( + icon = Icons.Default.Home, + text = resources().getString(R.string.home) + ) { + // TODO Go to home + } + DrawerEntry( + icon = ImageVector.vectorResource(id = R.drawable.ic_timer), + text = resources().getString(R.string.timers) + ) { + viewModel.onTimersClick(openAndPopUp) + } + DrawerEntry( + icon = Icons.Default.Settings, + text = resources().getString(R.string.settings) + ) { + viewModel.onSettingsClick(openAndPopUp) + } + DrawerEntry( + icon = ImageVector.vectorResource(id = R.drawable.ic_logout), + text = resources().getString(R.string.log_out) + ) { + viewModel.onLogoutClick(openAndPopUp) + } } DrawerEntry( @@ -70,21 +79,29 @@ fun DrawerEntry( .clickable(onClick = { onClick() }) .fillMaxWidth() ) { - Box(modifier = Modifier.fillMaxWidth(0.25f)) { + Box( + modifier = Modifier + .padding(vertical = 12.dp) + .fillMaxWidth(0.15f) + ) { Icon(imageVector = icon, contentDescription = text) } - Box(modifier = Modifier.fillMaxWidth(0.75f)) { + Box( + modifier = Modifier + .padding(vertical = 12.dp) + .fillMaxWidth(0.85f) + ) { Text(text = text) } } } -//@Preview -//@Composable -//fun DrawerPreview() { -// StudeezTheme { -// Drawer( -// {} -// ) -// } -//} \ No newline at end of file +@Preview +@Composable +fun DrawerPreview() { + StudeezTheme { + Drawer( + {a, b -> {}}, hiltViewModel() + ) + } +} \ No newline at end of file