From 125e0a87d1f38dc40831a1d0e192d2d4e468b5ac Mon Sep 17 00:00:00 2001 From: tdpeuter Date: Sat, 15 Apr 2023 09:06:44 +0200 Subject: [PATCH 1/8] #58 Add simple screen for login/register --- .../common/composable/SimpleScreenComposable.kt | 16 ++++++++++++++++ .../sel/studeez/screens/log_in/LoginScreen.kt | 3 +-- .../sel/studeez/screens/sign_up/SignUpScreen.kt | 4 +--- 3 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/be/ugent/sel/studeez/common/composable/SimpleScreenComposable.kt diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/SimpleScreenComposable.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/SimpleScreenComposable.kt new file mode 100644 index 0000000..0e3c684 --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/SimpleScreenComposable.kt @@ -0,0 +1,16 @@ +package be.ugent.sel.studeez.common.composable + +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.material.Scaffold +import androidx.compose.material.Text +import androidx.compose.material.TopAppBar +import androidx.compose.runtime.Composable + +@Composable +fun SimpleScreenTemplate( + title: String, + content: @Composable (PaddingValues) -> Unit +) { + Scaffold( topBar = { TopAppBar ( title = { Text(text = title) } ) } + ) { paddingValues -> content(paddingValues) } +} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/log_in/LoginScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/log_in/LoginScreen.kt index 82ff679..2762abc 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/log_in/LoginScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/log_in/LoginScreen.kt @@ -26,8 +26,7 @@ fun LoginScreen( ) { val uiState by viewModel.uiState - // TODO Make this a separate kind of screen? - SecondaryScreenTemplate(title = resources().getString(AppText.sign_in), {}) { + SimpleScreenTemplate(title = resources().getString(AppText.sign_in)) { Column( modifier = modifier .fillMaxWidth() diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/sign_up/SignUpScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/sign_up/SignUpScreen.kt index 19ff103..7515117 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/sign_up/SignUpScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/sign_up/SignUpScreen.kt @@ -6,8 +6,6 @@ import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Person import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment @@ -29,7 +27,7 @@ fun SignUpScreen( val uiState by viewModel.uiState val fieldModifier = Modifier.fieldModifier() - SecondaryScreenTemplate(title = resources().getString(AppText.create_account), {}) { + SimpleScreenTemplate(title = resources().getString(AppText.create_account)) { Column( modifier = modifier .fillMaxWidth() From fcd8b249d440ff9c473ca19b03d325f8eddd2e48 Mon Sep 17 00:00:00 2001 From: tdpeuter Date: Sat, 15 Apr 2023 09:20:27 +0200 Subject: [PATCH 2/8] Fix preview --- .../composable/PrimaryScreenComposable.kt | 22 ++++++++++--------- .../screens/navbar/NavigationBarComposable.kt | 16 +++++++++----- 2 files changed, 23 insertions(+), 15 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 9dc92f2..8f0b5f6 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,10 +6,12 @@ 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.screens.drawer.Drawer import be.ugent.sel.studeez.screens.navbar.NavigationBar +import be.ugent.sel.studeez.ui.theme.StudeezTheme import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch @@ -52,13 +54,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 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 fb4b2a3..088efb6 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 @@ -15,6 +15,7 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import be.ugent.sel.studeez.ui.theme.StudeezTheme + @Composable fun NavigationBar( popUpAndOpen: (String, String) -> Unit, @@ -60,8 +61,13 @@ fun NavigationBar( } } -//@Preview(showBackground = true) -//@Composable -//fun NavigationBarPreview() { -// StudeezTheme { NavigationBar() } -//} \ No newline at end of file +@Preview(showBackground = true) +@Composable +fun NavigationBarPreview() { + StudeezTheme { + NavigationBar( + { _, _ -> {} }, + hiltViewModel() + ) + } +} \ No newline at end of file From da3f8d33777a41d92660300dcdfabeac40bbefa8 Mon Sep 17 00:00:00 2001 From: tdpeuter Date: Sat, 15 Apr 2023 09:26:44 +0200 Subject: [PATCH 3/8] Use resources in navbar --- .../screens/navbar/NavigationBarComposable.kt | 18 ++++++++++-------- app/src/main/res/values/strings.xml | 10 +++++++++- 2 files changed, 19 insertions(+), 9 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 088efb6..7f90e53 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 @@ -13,7 +13,9 @@ 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.resources import be.ugent.sel.studeez.ui.theme.StudeezTheme +import be.ugent.sel.studeez.R.string as AppText @Composable @@ -28,15 +30,15 @@ fun NavigationBar( elevation = 10.dp ) { BottomNavigationItem( - icon = { Icon(imageVector = Icons.Default.List, "Home") }, - label = { Text(text = "Home") }, + icon = { Icon(imageVector = Icons.Default.List, resources().getString(AppText.home)) }, + label = { Text(text = resources().getString(AppText.home)) }, selected = false, // TODO onClick = { viewModel.onHomeClick(popUpAndOpen) } ) BottomNavigationItem( - icon = { Icon(imageVector = Icons.Default.Check, "Tasks") }, - label = { Text(text = "Tasks") }, + icon = { Icon(imageVector = Icons.Default.Check, resources().getString(AppText.tasks)) }, + label = { Text(text = resources().getString(AppText.tasks)) }, selected = false, // TODO onClick = { viewModel.onTasksClick(popUpAndOpen) } ) @@ -45,15 +47,15 @@ fun NavigationBar( BottomNavigationItem(icon = {}, onClick = {}, selected = false) BottomNavigationItem( - icon = { Icon(imageVector = Icons.Outlined.DateRange, "Sessions") }, - label = { Text(text = "Sessions") }, + icon = { Icon(imageVector = Icons.Outlined.DateRange, resources().getString(AppText.sessions)) }, + label = { Text(text = resources().getString(AppText.sessions)) }, selected = false, // TODO onClick = { viewModel.onSessionsClick(popUpAndOpen) } ) BottomNavigationItem( - icon = { Icon(imageVector = Icons.Default.Person, "Profile") }, - label = { Text(text = "Profile") }, + icon = { Icon(imageVector = Icons.Default.Person, resources().getString(AppText.profile)) }, + label = { Text(text = resources().getString(AppText.profile)) }, selected = false, // TODO onClick = { viewModel.onProfileClick(popUpAndOpen) } ) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d070672..f1a46ed 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -18,7 +18,6 @@ Passwords do not match. Already have an account? Log in. - Don\'t have an account yet? Sign up. Sign in @@ -31,6 +30,15 @@ Home Start session + + Tasks + + + Sessions + + + Profile + Log out Profile Picture From 13140d4e3c9fa0e08fc68fd220c3c4d9f7fc6166 Mon Sep 17 00:00:00 2001 From: tdpeuter Date: Sat, 15 Apr 2023 09:45:41 +0200 Subject: [PATCH 4/8] Make use of open instead of always openAndPopUp --- .../java/be/ugent/sel/studeez/StudeezApp.kt | 6 ++++- .../composable/PrimaryScreenComposable.kt | 6 +++-- .../screens/drawer/DrawerComposable.kt | 13 ++++++---- .../studeez/screens/drawer/DrawerViewModel.kt | 26 +++++++++---------- .../sel/studeez/screens/home/HomeScreen.kt | 4 ++- .../sel/studeez/screens/home/HomeViewModel.kt | 17 ++---------- .../screens/navbar/NavigationBarComposable.kt | 12 ++++----- .../screens/navbar/NavigationBarViewModel.kt | 11 ++++---- 8 files changed, 47 insertions(+), 48 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 53cf341..9934467 100644 --- a/app/src/main/java/be/ugent/sel/studeez/StudeezApp.kt +++ b/app/src/main/java/be/ugent/sel/studeez/StudeezApp.kt @@ -80,6 +80,10 @@ fun NavGraphBuilder.studeezGraph(appState: StudeezAppstate) { route, popUp -> appState.navigateAndPopUp(route, popUp) } + val open: (String) -> Unit = { + route -> appState.navigate(route) + } + composable(StudeezDestinations.SPLASH_SCREEN) { SplashScreen(openAndPopUp) } @@ -93,6 +97,6 @@ fun NavGraphBuilder.studeezGraph(appState: StudeezAppstate) { } composable(StudeezDestinations.HOME_SCREEN) { - HomeScreen(openAndPopUp) + HomeScreen(open, openAndPopUp) } } \ No newline at end of file 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 8f0b5f6..5983d37 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 @@ -18,6 +18,7 @@ import kotlinx.coroutines.launch @Composable fun PrimaryScreenTemplate( title: String, + open: (String) -> Unit, openAndPopUp: (String, String) -> Unit, content: @Composable (PaddingValues) -> Unit ) { @@ -42,10 +43,10 @@ fun PrimaryScreenTemplate( ) }, drawerContent = { - Drawer(openAndPopUp) + Drawer(open, openAndPopUp) }, - bottomBar = { NavigationBar(openAndPopUp) }, + bottomBar = { NavigationBar(open) }, floatingActionButtonPosition = FabPosition.Center, isFloatingActionButtonDocked = true, floatingActionButton = { CollapsedAddButton() } @@ -60,6 +61,7 @@ fun PrimaryScreenPreview() { StudeezTheme { PrimaryScreenTemplate( "Preview screen", + { _ -> {}}, { _, _ -> {}} ) {} } 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 7b39f80..296fd94 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 @@ -23,6 +23,7 @@ import be.ugent.sel.studeez.ui.theme.StudeezTheme @Composable fun Drawer( + open: (String) -> Unit, openAndPopUp: (String, String) -> Unit, viewModel: DrawerViewModel = hiltViewModel() ) { @@ -36,19 +37,19 @@ fun Drawer( icon = Icons.Default.Home, text = resources().getString(R.string.home) ) { - // TODO Go to home + viewModel.onHomeButtonClick(open) } DrawerEntry( icon = ImageVector.vectorResource(id = R.drawable.ic_timer), text = resources().getString(R.string.timers) ) { - viewModel.onTimersClick(openAndPopUp) + viewModel.onTimersClick(open) } DrawerEntry( icon = Icons.Default.Settings, text = resources().getString(R.string.settings) ) { - viewModel.onSettingsClick(openAndPopUp) + viewModel.onSettingsClick(open) } DrawerEntry( icon = ImageVector.vectorResource(id = R.drawable.ic_logout), @@ -62,7 +63,7 @@ fun Drawer( icon = Icons.Outlined.Info, text = resources().getString(R.string.about) ) { - viewModel.onAboutClick(openAndPopUp) + viewModel.onAboutClick(open) } } } @@ -101,7 +102,9 @@ fun DrawerEntry( fun DrawerPreview() { StudeezTheme { Drawer( - {a, b -> {}}, hiltViewModel() + { _, -> {} }, + { _, _ -> {} }, + hiltViewModel() ) } } \ 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 index 8eb4945..dbf3eed 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 @@ -13,6 +13,18 @@ class DrawerViewModel @Inject constructor( logService: LogService ) : StudeezViewModel(logService) { + fun onHomeButtonClick(open: (String) -> Unit) { + // TODO + } + + fun onTimersClick(open: (String) -> Unit) { + // TODO + } + + fun onSettingsClick(open: (String) -> Unit) { + // TODO + } + fun onLogoutClick(openAndPopup: (String, String) -> Unit) { launchCatching { accountDAO.signOut() @@ -20,19 +32,7 @@ class DrawerViewModel @Inject constructor( } } - 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) { + fun onAboutClick(open: (String) -> Unit) { // TODO } } 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 db0be1a..e8c88c1 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 @@ -11,15 +11,17 @@ import be.ugent.sel.studeez.resources @Composable fun HomeScreen( + open: (String) -> Unit, openAndPopUp: (String, String) -> Unit, viewModel: HomeViewModel = hiltViewModel() ) { PrimaryScreenTemplate( title = resources().getString(R.string.home), + open = open, openAndPopUp = openAndPopUp ) { BasicButton(R.string.start_session, Modifier.basicButton()) { - viewModel.onStartSessionClick(openAndPopUp) + viewModel.onStartSessionClick(open) } } } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/home/HomeViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/home/HomeViewModel.kt index 6a791d0..8830dc3 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/home/HomeViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/home/HomeViewModel.kt @@ -1,15 +1,9 @@ package be.ugent.sel.studeez.screens.home -import androidx.compose.material.ScaffoldState -import androidx.compose.material.rememberScaffoldState -import be.ugent.sel.studeez.data.local.models.User import be.ugent.sel.studeez.domain.AccountDAO import be.ugent.sel.studeez.domain.LogService -import be.ugent.sel.studeez.navigation.StudeezDestinations.HOME_SCREEN -import be.ugent.sel.studeez.navigation.StudeezDestinations.LOGIN_SCREEN import be.ugent.sel.studeez.screens.StudeezViewModel import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.flow.Flow import javax.inject.Inject @HiltViewModel @@ -18,14 +12,7 @@ class HomeViewModel @Inject constructor( logService: LogService ) : StudeezViewModel(logService) { - fun onStartSessionClick(openAndPopUp: (String, String) -> Unit) { - // TODO openAndPopUp(StudeezDestinations.xxx, StudeezDestinations.HOME_SCREEN) - } - - fun onLogoutClick(openAndPopup: (String, String) -> Unit) { - launchCatching { - accountDAO.signOut() - openAndPopup(LOGIN_SCREEN, HOME_SCREEN) - } + fun onStartSessionClick(open: (String) -> Unit) { + // TODO open(StudeezDestinations.xxx, StudeezDestinations.HOME_SCREEN) } } \ No newline at end of file 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 7f90e53..5c5dee1 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 @@ -20,7 +20,7 @@ import be.ugent.sel.studeez.R.string as AppText @Composable fun NavigationBar( - popUpAndOpen: (String, String) -> Unit, + open: (String) -> Unit, viewModel: NavigationBarViewModel = hiltViewModel() ) { // TODO Pass functions and new screens. @@ -33,14 +33,14 @@ fun NavigationBar( icon = { Icon(imageVector = Icons.Default.List, resources().getString(AppText.home)) }, label = { Text(text = resources().getString(AppText.home)) }, selected = false, // TODO - onClick = { viewModel.onHomeClick(popUpAndOpen) } + onClick = { viewModel.onHomeClick(open) } ) BottomNavigationItem( icon = { Icon(imageVector = Icons.Default.Check, resources().getString(AppText.tasks)) }, label = { Text(text = resources().getString(AppText.tasks)) }, selected = false, // TODO - onClick = { viewModel.onTasksClick(popUpAndOpen) } + onClick = { viewModel.onTasksClick(open) } ) // Hack to space the entries in the navigation bar, make space for fab @@ -50,14 +50,14 @@ fun NavigationBar( icon = { Icon(imageVector = Icons.Outlined.DateRange, resources().getString(AppText.sessions)) }, label = { Text(text = resources().getString(AppText.sessions)) }, selected = false, // TODO - onClick = { viewModel.onSessionsClick(popUpAndOpen) } + onClick = { viewModel.onSessionsClick(open) } ) BottomNavigationItem( icon = { Icon(imageVector = Icons.Default.Person, resources().getString(AppText.profile)) }, label = { Text(text = resources().getString(AppText.profile)) }, selected = false, // TODO - onClick = { viewModel.onProfileClick(popUpAndOpen) } + onClick = { viewModel.onProfileClick(open) } ) } @@ -68,7 +68,7 @@ fun NavigationBar( fun NavigationBarPreview() { StudeezTheme { NavigationBar( - { _, _ -> {} }, + { _ -> {} }, hiltViewModel() ) } 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 57ae686..a62de2d 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 @@ -3,6 +3,7 @@ package be.ugent.sel.studeez.screens.navbar 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.navigation.StudeezDestinations.PROFILE_SCREEN import be.ugent.sel.studeez.screens.StudeezViewModel import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject @@ -13,19 +14,19 @@ class NavigationBarViewModel @Inject constructor( logService: LogService ) : StudeezViewModel(logService) { - fun onHomeClick(openAndPopup: (String, String) -> Unit) { + fun onHomeClick(open: (String) -> Unit) { // TODO } - fun onTasksClick(openAndPopup: (String, String) -> Unit) { + fun onTasksClick(open: (String) -> Unit) { // TODO } - fun onSessionsClick(openAndPopup: (String, String) -> Unit) { + fun onSessionsClick(open: (String) -> Unit) { // TODO } - fun onProfileClick(openAndPopup: (String, String) -> Unit) { - // TODO + fun onProfileClick(open: (String) -> Unit) { + open(PROFILE_SCREEN) } } \ No newline at end of file From e4066dedd7485a028265c943e8c1a9f10f97fefc Mon Sep 17 00:00:00 2001 From: tdpeuter Date: Sat, 15 Apr 2023 10:00:21 +0200 Subject: [PATCH 5/8] #14 Basic navigation around the app --- .../java/be/ugent/sel/studeez/StudeezApp.kt | 11 +++++++++ .../studeez/navigation/StudeezDestinations.kt | 8 ++++++- .../studeez/screens/drawer/DrawerViewModel.kt | 7 +++--- .../screens/navbar/NavigationBarViewModel.kt | 3 ++- .../studeez/screens/profile/ProfileScreen.kt | 23 +++++++++++++++++++ .../screens/profile/ProfileViewModel.kt | 13 +++++++++++ 6 files changed, 60 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/profile/ProfileScreen.kt create mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/profile/ProfileViewModel.kt 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 9934467..fb3aeb2 100644 --- a/app/src/main/java/be/ugent/sel/studeez/StudeezApp.kt +++ b/app/src/main/java/be/ugent/sel/studeez/StudeezApp.kt @@ -20,6 +20,7 @@ import be.ugent.sel.studeez.common.snackbar.SnackbarManager import be.ugent.sel.studeez.navigation.StudeezDestinations import be.ugent.sel.studeez.screens.home.HomeScreen import be.ugent.sel.studeez.screens.log_in.LoginScreen +import be.ugent.sel.studeez.screens.profile.ProfileScreen import be.ugent.sel.studeez.screens.sign_up.SignUpScreen import be.ugent.sel.studeez.screens.splash.SplashScreen import be.ugent.sel.studeez.ui.theme.StudeezTheme @@ -99,4 +100,14 @@ fun NavGraphBuilder.studeezGraph(appState: StudeezAppstate) { composable(StudeezDestinations.HOME_SCREEN) { HomeScreen(open, openAndPopUp) } + + // TODO Tasks screen + // TODO Sessions screen + + composable(StudeezDestinations.PROFILE_SCREEN) { + ProfileScreen(open, openAndPopUp) + } + + // TODO Timers screen + // TODO Settings screen } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/navigation/StudeezDestinations.kt b/app/src/main/java/be/ugent/sel/studeez/navigation/StudeezDestinations.kt index 3ac8d47..a042da1 100644 --- a/app/src/main/java/be/ugent/sel/studeez/navigation/StudeezDestinations.kt +++ b/app/src/main/java/be/ugent/sel/studeez/navigation/StudeezDestinations.kt @@ -4,6 +4,12 @@ object StudeezDestinations { const val SPLASH_SCREEN = "splash" const val SIGN_UP_SCREEN = "signup" const val LOGIN_SCREEN = "login" - const val HOME_SCREEN = "home" + const val HOME_SCREEN = "home" +// const val TASKS_SCREEN = "tasks" +// const val SESSIONS_SCREEN = "sessions" + const val PROFILE_SCREEN = "profile" + +// const val TIMERS_SCREEN = "timers" +// const val SETTINGS_SCREEN = "settings" } \ 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 index dbf3eed..641321c 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 @@ -3,6 +3,7 @@ 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.navigation.StudeezDestinations.HOME_SCREEN import be.ugent.sel.studeez.screens.StudeezViewModel import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject @@ -14,7 +15,7 @@ class DrawerViewModel @Inject constructor( ) : StudeezViewModel(logService) { fun onHomeButtonClick(open: (String) -> Unit) { - // TODO + open(HOME_SCREEN) } fun onTimersClick(open: (String) -> Unit) { @@ -25,10 +26,10 @@ class DrawerViewModel @Inject constructor( // TODO } - fun onLogoutClick(openAndPopup: (String, String) -> Unit) { + fun onLogoutClick(openAndPopUp: (String, String) -> Unit) { launchCatching { accountDAO.signOut() - openAndPopup(StudeezDestinations.LOGIN_SCREEN, StudeezDestinations.HOME_SCREEN) + openAndPopUp(StudeezDestinations.LOGIN_SCREEN, StudeezDestinations.HOME_SCREEN) } } 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 a62de2d..1814d84 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 @@ -3,6 +3,7 @@ package be.ugent.sel.studeez.screens.navbar 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.navigation.StudeezDestinations.HOME_SCREEN import be.ugent.sel.studeez.navigation.StudeezDestinations.PROFILE_SCREEN import be.ugent.sel.studeez.screens.StudeezViewModel import dagger.hilt.android.lifecycle.HiltViewModel @@ -15,7 +16,7 @@ class NavigationBarViewModel @Inject constructor( ) : StudeezViewModel(logService) { fun onHomeClick(open: (String) -> Unit) { - // TODO + open(HOME_SCREEN) } fun onTasksClick(open: (String) -> Unit) { diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/profile/ProfileScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/profile/ProfileScreen.kt new file mode 100644 index 0000000..ed3297a --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/profile/ProfileScreen.kt @@ -0,0 +1,23 @@ +package be.ugent.sel.studeez.screens.profile + +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.hilt.navigation.compose.hiltViewModel +import be.ugent.sel.studeez.common.composable.PrimaryScreenTemplate +import be.ugent.sel.studeez.resources +import be.ugent.sel.studeez.R.string as AppText + +@Composable +fun ProfileScreen( + open: (String) -> Unit, + openAndPopUp: (String, String) -> Unit, + viewModel: ProfileViewModel = hiltViewModel() +) { + PrimaryScreenTemplate( + title = resources().getString(AppText.profile), + open = open, + openAndPopUp = openAndPopUp + ) { + Text(text = "This is your profile!") // TODO + } +} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/profile/ProfileViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/profile/ProfileViewModel.kt new file mode 100644 index 0000000..47286cc --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/profile/ProfileViewModel.kt @@ -0,0 +1,13 @@ +package be.ugent.sel.studeez.screens.profile + +import be.ugent.sel.studeez.domain.LogService +import be.ugent.sel.studeez.screens.StudeezViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject + +@HiltViewModel +class ProfileViewModel @Inject constructor( + logService: LogService +) : StudeezViewModel(logService) { + +} \ No newline at end of file From b790b55ab2556067ce6a61708df5fdfab182792f Mon Sep 17 00:00:00 2001 From: tdpeuter Date: Sat, 15 Apr 2023 13:32:38 +0200 Subject: [PATCH 6/8] #14 temporary update does not work --- .../common/composable/TextComposable.kt | 25 +++++++++++++++++++ .../be/ugent/sel/studeez/domain/UserDAO.kt | 5 +--- .../domain/implementation/FirebaseUserDAO.kt | 10 +++++++- .../studeez/screens/drawer/DrawerViewModel.kt | 4 +-- .../studeez/screens/profile/ProfileScreen.kt | 21 ++++++++++++++-- .../screens/profile/ProfileViewModel.kt | 17 +++++++++++++ .../studeez/screens/splash/SplashScreen.kt | 2 +- .../sel/studeez/screens/timers/TimerScreen.kt | 4 +++ app/src/main/res/values/strings.xml | 1 + 9 files changed, 79 insertions(+), 10 deletions(-) create mode 100644 app/src/main/java/be/ugent/sel/studeez/common/composable/TextComposable.kt create mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/timers/TimerScreen.kt diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/TextComposable.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/TextComposable.kt new file mode 100644 index 0000000..4fca2ee --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/TextComposable.kt @@ -0,0 +1,25 @@ +package be.ugent.sel.studeez.common.composable + +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.size +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp + +@Composable +fun Headline( + text: String +) { + Row ( + modifier = Modifier.fillMaxWidth() + ) { + Text( + text = text, + modifier = Modifier.size(34.dp) + .height(45.dp) + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/UserDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/UserDAO.kt index 28999e6..8b6f357 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/UserDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/UserDAO.kt @@ -1,10 +1,7 @@ package be.ugent.sel.studeez.domain -import kotlinx.coroutines.flow.Flow - interface UserDAO { - suspend fun getUserName(): String? - + suspend fun getUsername(): String? suspend fun save(newUsername: String) } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseUserDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseUserDAO.kt index ac8f455..8ac779b 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseUserDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseUserDAO.kt @@ -1,18 +1,26 @@ package be.ugent.sel.studeez.domain.implementation +import androidx.compose.runtime.rememberCoroutineScope import be.ugent.sel.studeez.domain.AccountDAO import be.ugent.sel.studeez.domain.UserDAO import com.google.firebase.firestore.DocumentReference import com.google.firebase.firestore.FirebaseFirestore +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.channels.awaitClose +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.callbackFlow +import kotlinx.coroutines.flow.flow import kotlinx.coroutines.tasks.await import javax.inject.Inject +import kotlin.coroutines.coroutineContext class FirebaseUserDAO @Inject constructor( private val firestore: FirebaseFirestore, private val auth: AccountDAO ) : UserDAO { - override suspend fun getUserName(): String? { + override suspend fun getUsername(): String? { return currentUserDocument().get().await().getString("username") } 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 641321c..9cf7fcc 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 @@ -2,8 +2,8 @@ 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.navigation.StudeezDestinations.HOME_SCREEN +import be.ugent.sel.studeez.navigation.StudeezDestinations.LOGIN_SCREEN import be.ugent.sel.studeez.screens.StudeezViewModel import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject @@ -29,7 +29,7 @@ class DrawerViewModel @Inject constructor( fun onLogoutClick(openAndPopUp: (String, String) -> Unit) { launchCatching { accountDAO.signOut() - openAndPopUp(StudeezDestinations.LOGIN_SCREEN, StudeezDestinations.HOME_SCREEN) + openAndPopUp(LOGIN_SCREEN, HOME_SCREEN) } } diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/profile/ProfileScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/profile/ProfileScreen.kt index ed3297a..d08a5aa 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/profile/ProfileScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/profile/ProfileScreen.kt @@ -1,10 +1,16 @@ package be.ugent.sel.studeez.screens.profile -import androidx.compose.material.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.rememberCoroutineScope import androidx.hilt.navigation.compose.hiltViewModel +import be.ugent.sel.studeez.R +import be.ugent.sel.studeez.common.composable.Headline import be.ugent.sel.studeez.common.composable.PrimaryScreenTemplate import be.ugent.sel.studeez.resources +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.launch import be.ugent.sel.studeez.R.string as AppText @Composable @@ -13,11 +19,22 @@ fun ProfileScreen( openAndPopUp: (String, String) -> Unit, viewModel: ProfileViewModel = hiltViewModel() ) { + val coroutineScope: CoroutineScope = rememberCoroutineScope() + + var username: String? = null + + PrimaryScreenTemplate( title = resources().getString(AppText.profile), open = open, openAndPopUp = openAndPopUp ) { - Text(text = "This is your profile!") // TODO + Headline(text = (username ?: resources().getString(R.string.no_username))) + } + + LaunchedEffect(true) { + coroutineScope.launch { + username = viewModel.getUsername() + } } } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/profile/ProfileViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/profile/ProfileViewModel.kt index 47286cc..1f6b1a2 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/profile/ProfileViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/profile/ProfileViewModel.kt @@ -1,13 +1,30 @@ package be.ugent.sel.studeez.screens.profile +import androidx.compose.runtime.rememberCoroutineScope +import androidx.lifecycle.viewModelScope +import be.ugent.sel.studeez.R import be.ugent.sel.studeez.domain.LogService +import be.ugent.sel.studeez.domain.UserDAO +import be.ugent.sel.studeez.resources import be.ugent.sel.studeez.screens.StudeezViewModel import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.stateIn + import javax.inject.Inject @HiltViewModel class ProfileViewModel @Inject constructor( + private val userDAO: UserDAO, logService: LogService ) : StudeezViewModel(logService) { + suspend fun getUsername(): String? { + return userDAO.getUsername() + } + } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/splash/SplashScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/splash/SplashScreen.kt index ec5e515..38146c0 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/splash/SplashScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/splash/SplashScreen.kt @@ -21,7 +21,7 @@ import be.ugent.sel.studeez.common.ext.basicButton import kotlinx.coroutines.delay import be.ugent.sel.studeez.R.string as AppText -private const val SPLASH_TIMEOUT = 1000L +private const val SPLASH_TIMEOUT = 500L @Composable fun SplashScreen( diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timers/TimerScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timers/TimerScreen.kt new file mode 100644 index 0000000..b7ca484 --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timers/TimerScreen.kt @@ -0,0 +1,4 @@ +package be.ugent.sel.studeez.screens.timers + +class TimerScreen { +} \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f1a46ed..1f23152 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -38,6 +38,7 @@ Profile + Unknown username Log out From b60603d292a840346d2fd12e79374b73f946666d Mon Sep 17 00:00:00 2001 From: tdpeuter Date: Sun, 16 Apr 2023 09:42:14 +0200 Subject: [PATCH 7/8] #14 Username working --- .../common/composable/TextComposable.kt | 4 +--- .../studeez/screens/profile/ProfileScreen.kt | 21 +++++-------------- 2 files changed, 6 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/TextComposable.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/TextComposable.kt index 4fca2ee..b7e4906 100644 --- a/app/src/main/java/be/ugent/sel/studeez/common/composable/TextComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/TextComposable.kt @@ -3,7 +3,6 @@ package be.ugent.sel.studeez.common.composable import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.size import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier @@ -18,8 +17,7 @@ fun Headline( ) { Text( text = text, - modifier = Modifier.size(34.dp) - .height(45.dp) + modifier = Modifier.height(45.dp) ) } } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/profile/ProfileScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/profile/ProfileScreen.kt index d08a5aa..56568c4 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/profile/ProfileScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/profile/ProfileScreen.kt @@ -1,16 +1,11 @@ package be.ugent.sel.studeez.screens.profile -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.* import androidx.hilt.navigation.compose.hiltViewModel import be.ugent.sel.studeez.R import be.ugent.sel.studeez.common.composable.Headline import be.ugent.sel.studeez.common.composable.PrimaryScreenTemplate import be.ugent.sel.studeez.resources -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.coroutineScope -import kotlinx.coroutines.launch import be.ugent.sel.studeez.R.string as AppText @Composable @@ -19,10 +14,10 @@ fun ProfileScreen( openAndPopUp: (String, String) -> Unit, viewModel: ProfileViewModel = hiltViewModel() ) { - val coroutineScope: CoroutineScope = rememberCoroutineScope() - - var username: String? = null - + var username: String? by remember { mutableStateOf("") } + LaunchedEffect(key1 = Unit) { + username = viewModel.getUsername() + } PrimaryScreenTemplate( title = resources().getString(AppText.profile), @@ -31,10 +26,4 @@ fun ProfileScreen( ) { Headline(text = (username ?: resources().getString(R.string.no_username))) } - - LaunchedEffect(true) { - coroutineScope.launch { - username = viewModel.getUsername() - } - } } \ No newline at end of file From 0af211362d910f82b96e7b56fd4e50b4d987c7f6 Mon Sep 17 00:00:00 2001 From: tdpeuter Date: Sun, 16 Apr 2023 09:54:23 +0200 Subject: [PATCH 8/8] #14 Username styling --- .../sel/studeez/common/composable/TextComposable.kt | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/TextComposable.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/TextComposable.kt index b7e4906..1b921a9 100644 --- a/app/src/main/java/be/ugent/sel/studeez/common/composable/TextComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/TextComposable.kt @@ -1,23 +1,26 @@ package be.ugent.sel.studeez.common.composable +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height import androidx.compose.material.Text import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp @Composable fun Headline( text: String ) { Row ( - modifier = Modifier.fillMaxWidth() + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Center ) { Text( text = text, - modifier = Modifier.height(45.dp) + fontSize = 34.sp ) } } \ No newline at end of file