commit
						2e61ab7304
					
				
					 15 changed files with 419 additions and 149 deletions
				
			
		|  | @ -2,18 +2,8 @@ package be.ugent.sel.studeez | |||
| 
 | ||||
| import android.content.res.Resources | ||||
| import androidx.compose.foundation.layout.padding | ||||
| import androidx.compose.material.MaterialTheme | ||||
| import androidx.compose.material.Scaffold | ||||
| import androidx.compose.material.ScaffoldState | ||||
| import androidx.compose.material.Snackbar | ||||
| import androidx.compose.material.SnackbarHost | ||||
| import androidx.compose.material.Surface | ||||
| import androidx.compose.material.rememberScaffoldState | ||||
| import androidx.compose.runtime.Composable | ||||
| import androidx.compose.runtime.ReadOnlyComposable | ||||
| import androidx.compose.runtime.getValue | ||||
| import androidx.compose.runtime.remember | ||||
| import androidx.compose.runtime.rememberCoroutineScope | ||||
| import androidx.compose.material.* | ||||
| import androidx.compose.runtime.* | ||||
| import androidx.compose.ui.Modifier | ||||
| import androidx.compose.ui.platform.LocalConfiguration | ||||
| import androidx.compose.ui.platform.LocalContext | ||||
|  | @ -38,6 +28,8 @@ import be.ugent.sel.studeez.screens.profile.EditProfileRoute | |||
| import be.ugent.sel.studeez.screens.profile.ProfileRoute | ||||
| import be.ugent.sel.studeez.screens.session.SessionRoute | ||||
| import be.ugent.sel.studeez.screens.session_recap.SessionRecapRoute | ||||
| import be.ugent.sel.studeez.screens.sessions.SessionsRoute | ||||
| import be.ugent.sel.studeez.screens.settings.SettingsRoute | ||||
| import be.ugent.sel.studeez.screens.sign_up.SignUpRoute | ||||
| import be.ugent.sel.studeez.screens.splash.SplashRoute | ||||
| import be.ugent.sel.studeez.screens.timer_overview.TimerOverviewRoute | ||||
|  | @ -91,7 +83,7 @@ fun resources(): Resources { | |||
| @Composable | ||||
| fun StudeezNavGraph( | ||||
|     appState: StudeezAppstate, | ||||
|     modifier: Modifier, | ||||
|     modifier: Modifier = Modifier, | ||||
| ) { | ||||
|     val drawerViewModel: DrawerViewModel = hiltViewModel() | ||||
|     val navBarViewModel: NavigationBarViewModel = hiltViewModel() | ||||
|  | @ -113,8 +105,51 @@ fun StudeezNavGraph( | |||
|         startDestination = StudeezDestinations.SPLASH_SCREEN, | ||||
|         modifier = modifier, | ||||
|     ) { | ||||
|         // NavBar | ||||
|         composable(StudeezDestinations.HOME_SCREEN) { | ||||
|             HomeRoute( | ||||
|                 open, | ||||
|                 viewModel = hiltViewModel(), | ||||
|                 drawerActions = drawerActions, | ||||
|                 navigationBarActions = navigationBarActions | ||||
|             ) | ||||
|         } | ||||
| 
 | ||||
|         composable(StudeezDestinations.TASKS_SCREEN) { | ||||
|             // TODO | ||||
|         } | ||||
| 
 | ||||
|         composable(StudeezDestinations.SESSIONS_SCREEN) { | ||||
|             SessionsRoute( | ||||
|                 drawerActions = drawerActions, | ||||
|                 navigationBarActions = navigationBarActions | ||||
|             ) | ||||
|         } | ||||
| 
 | ||||
|         composable(StudeezDestinations.PROFILE_SCREEN) { | ||||
|             ProfileRoute( | ||||
|                 open, | ||||
|                 viewModel = hiltViewModel(), | ||||
|                 drawerActions = drawerActions, | ||||
|                 navigationBarActions = navigationBarActions | ||||
|             ) | ||||
|         } | ||||
| 
 | ||||
|         // Drawer | ||||
|         composable(StudeezDestinations.TIMER_SCREEN) { | ||||
|             TimerOverviewRoute( | ||||
|                 viewModel = hiltViewModel(), | ||||
|                 drawerActions = drawerActions, | ||||
|             ) | ||||
|         } | ||||
| 
 | ||||
|         composable(StudeezDestinations.SETTINGS_SCREEN) { | ||||
|             SettingsRoute( | ||||
|                 drawerActions = drawerActions | ||||
|             ) | ||||
|         } | ||||
| 
 | ||||
|         // Login flow | ||||
|         composable(StudeezDestinations.SPLASH_SCREEN) { | ||||
|             SplashRoute( | ||||
|                 openAndPopUp, | ||||
|  | @ -136,31 +171,12 @@ fun StudeezNavGraph( | |||
|             ) | ||||
|         } | ||||
| 
 | ||||
|         composable(StudeezDestinations.HOME_SCREEN) { | ||||
|             HomeRoute( | ||||
|         // Studying flow | ||||
|         composable(StudeezDestinations.TIMER_SELECTION_SCREEN) { | ||||
|             TimerSelectionRoute( | ||||
|                 open, | ||||
|                 goBack, | ||||
|                 viewModel = hiltViewModel(), | ||||
|                 drawerActions = drawerActions, | ||||
|                 navigationBarActions = navigationBarActions, | ||||
|             ) | ||||
|         } | ||||
| 
 | ||||
|         // TODO Tasks screen | ||||
|         // TODO Sessions screen | ||||
| 
 | ||||
|         composable(StudeezDestinations.PROFILE_SCREEN) { | ||||
|             ProfileRoute( | ||||
|                 open, | ||||
|                 viewModel = hiltViewModel(), | ||||
|                 drawerActions = drawerActions, | ||||
|                 navigationBarActions = navigationBarActions, | ||||
|             ) | ||||
|         } | ||||
| 
 | ||||
|         composable(StudeezDestinations.TIMER_OVERVIEW_SCREEN) { | ||||
|             TimerOverviewRoute( | ||||
|                 viewModel = hiltViewModel(), | ||||
|                 drawerActions = drawerActions, | ||||
|             ) | ||||
|         } | ||||
| 
 | ||||
|  | @ -172,10 +188,27 @@ fun StudeezNavGraph( | |||
|             ) | ||||
|         } | ||||
| 
 | ||||
|         // TODO Timers screen | ||||
|         // TODO Settings screen | ||||
|         composable(StudeezDestinations.SESSION_RECAP) { | ||||
|             SessionRecapRoute( | ||||
|                 openAndPopUp = openAndPopUp, | ||||
|                 viewModel = hiltViewModel() | ||||
|             ) | ||||
|         } | ||||
| 
 | ||||
|         // Friends flow | ||||
|         composable(StudeezDestinations.SEARCH_FRIENDS_SCREEN) { | ||||
|             // TODO | ||||
|         } | ||||
| 
 | ||||
|         // Create & edit screens | ||||
|         composable(StudeezDestinations.CREATE_TASK_SCREEN) { | ||||
|             // TODO | ||||
|         } | ||||
| 
 | ||||
|         composable(StudeezDestinations.CREATE_SESSION_SCREEN) { | ||||
|             // TODO | ||||
|         } | ||||
| 
 | ||||
|         // Edit screens | ||||
|         composable(StudeezDestinations.EDIT_PROFILE_SCREEN) { | ||||
|             EditProfileRoute( | ||||
|                 goBack, | ||||
|  | @ -183,20 +216,5 @@ fun StudeezNavGraph( | |||
|                 viewModel = hiltViewModel(), | ||||
|             ) | ||||
|         } | ||||
| 
 | ||||
|         composable(StudeezDestinations.TIMER_SELECTION_SCREEN) { | ||||
|             TimerSelectionRoute( | ||||
|                 open, | ||||
|                 goBack, | ||||
|                 viewModel = hiltViewModel(), | ||||
|             ) | ||||
|         } | ||||
| 
 | ||||
|         composable(StudeezDestinations.SESSION_RECAP) { | ||||
|             SessionRecapRoute( | ||||
|                 openAndPopUp = openAndPopUp, | ||||
|                 viewModel = hiltViewModel() | ||||
|             ) | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -1,7 +1,9 @@ | |||
| package be.ugent.sel.studeez.common.composable | ||||
| 
 | ||||
| import androidx.compose.foundation.layout.Column | ||||
| import androidx.compose.foundation.layout.Row | ||||
| import androidx.compose.animation.core.animateFloat | ||||
| import androidx.compose.animation.core.updateTransition | ||||
| import androidx.compose.foundation.border | ||||
| import androidx.compose.foundation.layout.* | ||||
| import androidx.compose.material.FloatingActionButton | ||||
| import androidx.compose.material.Icon | ||||
| import androidx.compose.material.IconButton | ||||
|  | @ -11,52 +13,134 @@ import androidx.compose.material.icons.filled.Add | |||
| import androidx.compose.material.icons.filled.Check | ||||
| import androidx.compose.material.icons.filled.DateRange | ||||
| import androidx.compose.material.icons.filled.Person | ||||
| import androidx.compose.runtime.Composable | ||||
| import androidx.compose.runtime.* | ||||
| import androidx.compose.ui.Alignment | ||||
| import androidx.compose.ui.Modifier | ||||
| import androidx.compose.ui.draw.rotate | ||||
| import androidx.compose.ui.graphics.vector.ImageVector | ||||
| import androidx.compose.ui.tooling.preview.Preview | ||||
| import androidx.compose.ui.unit.dp | ||||
| import be.ugent.sel.studeez.resources | ||||
| import be.ugent.sel.studeez.ui.theme.StudeezTheme | ||||
| import be.ugent.sel.studeez.R.string as AppText | ||||
| 
 | ||||
| const val TRANSITION = "transition" | ||||
| val HEIGHT_DIFFERENCE = 30.dp | ||||
| 
 | ||||
| data class AddButtonActions( | ||||
|     val onTaskClick: () -> Unit, | ||||
|     val onFriendClick: () -> Unit, | ||||
|     val onSessionClick: () -> Unit | ||||
| ) | ||||
| 
 | ||||
| @Composable | ||||
| fun CollapsedAddButton() { | ||||
|     FloatingActionButton( | ||||
|         onClick = { /* TODO popup add options */ } | ||||
| fun AddButton( | ||||
|     addButtonActions: AddButtonActions | ||||
| ) { | ||||
|     var isExpanded by remember { mutableStateOf(false) } | ||||
| 
 | ||||
|     // Rotate the button when expanded, normal when collapsed. | ||||
|     val transition = updateTransition(targetState = isExpanded, label = TRANSITION) | ||||
|     val rotate by transition.animateFloat(label = TRANSITION) { expanded -> if (expanded) 315f else 0f } | ||||
| 
 | ||||
|     Column( | ||||
|         horizontalAlignment = Alignment.CenterHorizontally, | ||||
|         verticalArrangement = Arrangement.Top | ||||
|     ) { | ||||
|         Icon(imageVector = Icons.Default.Add, contentDescription = "fab") | ||||
|         Box { | ||||
|             // Show minis when expanded. | ||||
|             if (isExpanded) { | ||||
|                 ExpandedAddButton( | ||||
|                     addButtonActions = addButtonActions | ||||
|                 ) | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         // The base add button | ||||
|         FloatingActionButton( | ||||
|             onClick = { | ||||
|                 // Toggle expanded/collapsed. | ||||
|                 isExpanded = !isExpanded | ||||
|             }, | ||||
|             modifier = Modifier.padding(bottom = if (isExpanded) 78.dp else 0.dp) | ||||
|         ) { | ||||
|             Icon( | ||||
|                 imageVector = Icons.Default.Add, | ||||
|                 contentDescription = "fab", | ||||
|                 modifier = Modifier.rotate(rotate) // The rotation | ||||
|             ) | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| @Composable | ||||
| fun ExpandedAddButton() { | ||||
|     Row() { | ||||
|         IconButton(onClick = { /* TODO Go to next step */ }) { | ||||
|             Column (horizontalAlignment = Alignment.CenterHorizontally) { | ||||
|                 Icon(imageVector = Icons.Default.Check, contentDescription = "Task") | ||||
|                 Text(text = "Task") | ||||
|             } | ||||
|         } | ||||
|         IconButton(onClick = { /* TODO Go to next step */ }) { | ||||
|             Column (horizontalAlignment = Alignment.CenterHorizontally) { | ||||
|                 Icon(imageVector = Icons.Default.Person, contentDescription = "Friend") | ||||
|                 Text(text = "Friend") | ||||
|             } | ||||
|         } | ||||
|         IconButton(onClick = { /* TODO Go to next step */ }) { | ||||
|             Column (horizontalAlignment = Alignment.CenterHorizontally) { | ||||
|                 Icon(imageVector = Icons.Default.DateRange, contentDescription = "Session") | ||||
|                 Text(text = "Session") | ||||
|             } | ||||
|         } | ||||
| fun ExpandedAddButton( | ||||
|     addButtonActions: AddButtonActions | ||||
| ) { | ||||
|     Row { | ||||
|         ExpandedEntry( | ||||
|             name = AppText.task, | ||||
|             imageVector = Icons.Default.Check, | ||||
|             onClick = addButtonActions.onTaskClick, | ||||
|             modifier = Modifier.padding(36.dp, HEIGHT_DIFFERENCE, 36.dp, 0.dp) | ||||
|         ) | ||||
| 
 | ||||
|         ExpandedEntry( | ||||
|             name = AppText.friend, | ||||
|             imageVector = Icons.Default.Person, | ||||
|             onClick = addButtonActions.onFriendClick | ||||
|         ) | ||||
| 
 | ||||
|         ExpandedEntry( | ||||
|             name = AppText.session, | ||||
|             imageVector = Icons.Default.DateRange, | ||||
|             onClick = addButtonActions.onSessionClick, | ||||
|             modifier = Modifier.padding(36.dp, HEIGHT_DIFFERENCE, 36.dp, 0.dp) | ||||
|         ) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| @Composable | ||||
| fun ExpandedEntry( | ||||
|     name: Int, | ||||
|     imageVector: ImageVector, | ||||
|     onClick: () -> Unit, | ||||
|     modifier: Modifier = Modifier | ||||
| ) { | ||||
|     IconButton( | ||||
|         onClick = onClick, | ||||
|         modifier = modifier | ||||
|     ) { | ||||
|         Column(horizontalAlignment = Alignment.CenterHorizontally) { | ||||
|             Icon( | ||||
|                 imageVector = imageVector, | ||||
|                 contentDescription = resources().getString(name), | ||||
|                 // TODO Dark overlay | ||||
|                 //  tint = colors.surface | ||||
|             ) | ||||
|             Text( | ||||
|                 text = resources().getString(name), | ||||
|                 // TODO Dark overlay | ||||
|                 //  color = colors.surface | ||||
|             ) | ||||
|         } | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| @Preview | ||||
| @Composable | ||||
| fun CollapsedAddButtonPreview() { | ||||
|     StudeezTheme { CollapsedAddButton() } | ||||
| fun AddButtonPreview() { | ||||
|     StudeezTheme { AddButton( | ||||
|         addButtonActions = AddButtonActions({}, {}, {}) | ||||
|     )} | ||||
| } | ||||
| 
 | ||||
| @Preview | ||||
| @Composable | ||||
| fun ExpandedAddButtonPreview() { | ||||
|     StudeezTheme { ExpandedAddButton() } | ||||
|     StudeezTheme { ExpandedAddButton ( | ||||
|         addButtonActions = AddButtonActions({}, {}, {}) | ||||
|     ) } | ||||
| } | ||||
|  | @ -57,7 +57,11 @@ fun PrimaryScreenTemplate( | |||
|         bottomBar = { NavigationBar(navigationBarActions) }, | ||||
|         floatingActionButtonPosition = FabPosition.Center, | ||||
|         isFloatingActionButtonDocked = true, | ||||
|         floatingActionButton = { CollapsedAddButton() } | ||||
|         floatingActionButton = { AddButton(AddButtonActions( | ||||
|             onTaskClick = navigationBarActions.onAddTaskClick, | ||||
|             onFriendClick = navigationBarActions.onAddFriendClick, | ||||
|             onSessionClick = navigationBarActions.onAddSessionClick | ||||
|         )) } | ||||
|     ) { | ||||
|         content(it) | ||||
|     } | ||||
|  | @ -70,7 +74,7 @@ fun PrimaryScreenPreview() { | |||
|         PrimaryScreenTemplate( | ||||
|             "Preview screen", | ||||
|             DrawerActions({}, {}, {}, {}, {}), | ||||
|             NavigationBarActions({ false }, {}, {}, {}, {}), | ||||
|             NavigationBarActions({ false }, {}, {}, {}, {}, {}, {}, {}), | ||||
|             { | ||||
|                 IconButton(onClick = { /*TODO*/ }) { | ||||
|                     Icon( | ||||
|  |  | |||
|  | @ -1,5 +1,6 @@ | |||
| package be.ugent.sel.studeez.common.composable.drawer | ||||
| 
 | ||||
| import android.content.Context | ||||
| import androidx.compose.foundation.clickable | ||||
| import androidx.compose.foundation.layout.Arrangement | ||||
| import androidx.compose.foundation.layout.Box | ||||
|  | @ -16,6 +17,7 @@ import androidx.compose.material.icons.outlined.Info | |||
| import androidx.compose.runtime.Composable | ||||
| import androidx.compose.ui.Modifier | ||||
| import androidx.compose.ui.graphics.vector.ImageVector | ||||
| import androidx.compose.ui.platform.LocalContext | ||||
| import androidx.compose.ui.res.vectorResource | ||||
| import androidx.compose.ui.tooling.preview.Preview | ||||
| import androidx.compose.ui.unit.dp | ||||
|  | @ -28,7 +30,7 @@ data class DrawerActions( | |||
|     val onTimersClick: () -> Unit, | ||||
|     val onSettingsClick: () -> Unit, | ||||
|     val onLogoutClick: () -> Unit, | ||||
|     val onAboutClick: () -> Unit, | ||||
|     val onAboutClick: (Context) -> Unit, | ||||
| ) | ||||
| 
 | ||||
| fun getDrawerActions( | ||||
|  | @ -41,7 +43,7 @@ fun getDrawerActions( | |||
|         onTimersClick = { drawerViewModel.onTimersClick(open) }, | ||||
|         onSettingsClick = { drawerViewModel.onSettingsClick(open) }, | ||||
|         onLogoutClick = { drawerViewModel.onLogoutClick(openAndPopUp) }, | ||||
|         onAboutClick = { drawerViewModel.onAboutClick(open) }, | ||||
|         onAboutClick = { context -> drawerViewModel.onAboutClick(open, context = context) }, | ||||
|     ) | ||||
| } | ||||
| 
 | ||||
|  | @ -79,10 +81,11 @@ fun Drawer( | |||
|             ) | ||||
|         } | ||||
| 
 | ||||
|         val context = LocalContext.current | ||||
|         DrawerEntry( | ||||
|             icon = Icons.Outlined.Info, | ||||
|             text = resources().getString(R.string.about), | ||||
|             onClick = drawerActions.onAboutClick, | ||||
|             onClick = { drawerActions.onAboutClick(context) }, | ||||
|         ) | ||||
|     } | ||||
| } | ||||
|  | @ -96,7 +99,7 @@ fun DrawerEntry( | |||
|     Row( | ||||
|         horizontalArrangement = Arrangement.Center, | ||||
|         modifier = Modifier | ||||
|             .clickable(onClick = { onClick() }) | ||||
|             .clickable(onClick = onClick) | ||||
|             .fillMaxWidth() | ||||
|     ) { | ||||
|         Box( | ||||
|  |  | |||
|  | @ -1,5 +1,10 @@ | |||
| package be.ugent.sel.studeez.common.composable.drawer | ||||
| 
 | ||||
| import android.content.Context | ||||
| import android.content.Intent | ||||
| import android.net.Uri | ||||
| import androidx.compose.runtime.remember | ||||
| import androidx.compose.ui.platform.LocalContext | ||||
| import be.ugent.sel.studeez.domain.AccountDAO | ||||
| import be.ugent.sel.studeez.domain.LogService | ||||
| import be.ugent.sel.studeez.navigation.StudeezDestinations | ||||
|  | @ -9,6 +14,8 @@ import be.ugent.sel.studeez.screens.StudeezViewModel | |||
| import dagger.hilt.android.lifecycle.HiltViewModel | ||||
| import javax.inject.Inject | ||||
| 
 | ||||
| const val REPO_URL: String = "https://github.ugent.be/SELab1/project2023-groep14/" | ||||
| 
 | ||||
| @HiltViewModel | ||||
| class DrawerViewModel @Inject constructor( | ||||
|     private val accountDAO: AccountDAO, | ||||
|  | @ -20,11 +27,11 @@ class DrawerViewModel @Inject constructor( | |||
|     } | ||||
| 
 | ||||
|     fun onTimersClick(openAndPopup: (String) -> Unit) { | ||||
|         openAndPopup(StudeezDestinations.TIMER_OVERVIEW_SCREEN) | ||||
|         openAndPopup(StudeezDestinations.TIMER_SCREEN) | ||||
|     } | ||||
| 
 | ||||
|     fun onSettingsClick(open: (String) -> Unit) { | ||||
|         // TODO | ||||
|         open(StudeezDestinations.SETTINGS_SCREEN) | ||||
|     } | ||||
| 
 | ||||
|     fun onLogoutClick(openAndPopUp: (String, String) -> Unit) { | ||||
|  | @ -34,7 +41,8 @@ class DrawerViewModel @Inject constructor( | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     fun onAboutClick(open: (String) -> Unit) { | ||||
|         // TODO | ||||
|     fun onAboutClick(open: (String) -> Unit, context: Context) { | ||||
|         val intent = Intent(Intent.ACTION_VIEW, Uri.parse(REPO_URL)) | ||||
|         context.startActivity(intent) | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -14,16 +14,24 @@ import androidx.compose.ui.tooling.preview.Preview | |||
| import androidx.compose.ui.unit.dp | ||||
| import be.ugent.sel.studeez.navigation.StudeezDestinations.HOME_SCREEN | ||||
| import be.ugent.sel.studeez.navigation.StudeezDestinations.PROFILE_SCREEN | ||||
| import be.ugent.sel.studeez.navigation.StudeezDestinations.SESSIONS_SCREEN | ||||
| import be.ugent.sel.studeez.navigation.StudeezDestinations.TASKS_SCREEN | ||||
| import be.ugent.sel.studeez.resources | ||||
| import be.ugent.sel.studeez.ui.theme.StudeezTheme | ||||
| import be.ugent.sel.studeez.R.string as AppText | ||||
| 
 | ||||
| data class NavigationBarActions( | ||||
|     val isSelectedTab: (String) -> Boolean, | ||||
| 
 | ||||
|     val onHomeClick: () -> Unit, | ||||
|     val onTasksClick: () -> Unit, | ||||
|     val onSessionsClick: () -> Unit, | ||||
|     val onProfileClick: () -> Unit, | ||||
| 
 | ||||
|     // AddButton | ||||
|     val onAddTaskClick: () -> Unit, | ||||
|     val onAddFriendClick: () -> Unit, | ||||
|     val onAddSessionClick: () -> Unit | ||||
| ) | ||||
| 
 | ||||
| fun getNavigationBarActions( | ||||
|  | @ -35,6 +43,7 @@ fun getNavigationBarActions( | |||
|         isSelectedTab = { screen -> | ||||
|             screen == getCurrentScreen() | ||||
|         }, | ||||
| 
 | ||||
|         onHomeClick = { | ||||
|             navigationBarViewModel.onHomeClick(open) | ||||
|         }, | ||||
|  | @ -47,6 +56,16 @@ fun getNavigationBarActions( | |||
|         onProfileClick = { | ||||
|             navigationBarViewModel.onProfileClick(open) | ||||
|         }, | ||||
| 
 | ||||
|         onAddTaskClick = { | ||||
|             navigationBarViewModel.onAddTaskClick(open) | ||||
|         }, | ||||
|         onAddFriendClick = { | ||||
|             navigationBarViewModel.onAddFriendClick(open) | ||||
|         }, | ||||
|         onAddSessionClick = { | ||||
|             navigationBarViewModel.onAddSessionClick(open) | ||||
|         } | ||||
|     ) | ||||
| } | ||||
| 
 | ||||
|  | @ -71,13 +90,12 @@ fun NavigationBar( | |||
|                 ) | ||||
|             }, | ||||
|             label = { Text(text = resources().getString(AppText.tasks)) }, | ||||
|             // TODO selected = navigationBarActions.isSelectedTab(TASKS_SCREEN), | ||||
|             selected = false, | ||||
|             selected = navigationBarActions.isSelectedTab(TASKS_SCREEN), | ||||
|             onClick = navigationBarActions.onTasksClick | ||||
|         ) | ||||
| 
 | ||||
|         // Hack to space the entries in the navigation bar, make space for fab | ||||
|         BottomNavigationItem(icon = {}, onClick = {}, selected = false) | ||||
|         BottomNavigationItem(icon = {}, onClick = {}, selected = false, enabled = false) | ||||
| 
 | ||||
|         BottomNavigationItem( | ||||
|             icon = { | ||||
|  | @ -86,8 +104,7 @@ fun NavigationBar( | |||
|                 ) | ||||
|             }, | ||||
|             label = { Text(text = resources().getString(AppText.sessions)) }, | ||||
|             // TODO selected = navigationBarActions.isSelectedTab(SESSIONS_SCREEN), | ||||
|             selected = false, | ||||
|             selected = navigationBarActions.isSelectedTab(SESSIONS_SCREEN), | ||||
|             onClick = navigationBarActions.onSessionsClick | ||||
|         ) | ||||
| 
 | ||||
|  | @ -110,7 +127,7 @@ fun NavigationBar( | |||
| fun NavigationBarPreview() { | ||||
|     StudeezTheme { | ||||
|         NavigationBar( | ||||
|             navigationBarActions = NavigationBarActions({ false }, {}, {}, {}, {}), | ||||
|             navigationBarActions = NavigationBarActions({ false }, {}, {}, {}, {}, {}, {}, {}), | ||||
|         ) | ||||
|     } | ||||
| } | ||||
|  | @ -1,12 +1,16 @@ | |||
| package be.ugent.sel.studeez.common.composable.navbar | ||||
| 
 | ||||
| import be.ugent.sel.studeez.common.snackbar.SnackbarManager | ||||
| 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.PROFILE_SCREEN | ||||
| import be.ugent.sel.studeez.navigation.StudeezDestinations.SESSIONS_SCREEN | ||||
| import be.ugent.sel.studeez.navigation.StudeezDestinations.TASKS_SCREEN | ||||
| import be.ugent.sel.studeez.screens.StudeezViewModel | ||||
| import dagger.hilt.android.lifecycle.HiltViewModel | ||||
| import javax.inject.Inject | ||||
| import be.ugent.sel.studeez.R.string as AppText | ||||
| 
 | ||||
| @HiltViewModel | ||||
| class NavigationBarViewModel @Inject constructor( | ||||
|  | @ -19,14 +23,29 @@ class NavigationBarViewModel @Inject constructor( | |||
|     } | ||||
| 
 | ||||
|     fun onTasksClick(open: (String) -> Unit) { | ||||
|         // TODO | ||||
|         open(TASKS_SCREEN) | ||||
|     } | ||||
| 
 | ||||
|     fun onSessionsClick(open: (String) -> Unit) { | ||||
|         // TODO | ||||
|         open(SESSIONS_SCREEN) | ||||
|     } | ||||
| 
 | ||||
|     fun onProfileClick(open: (String) -> Unit) { | ||||
|         open(PROFILE_SCREEN) | ||||
|     } | ||||
| 
 | ||||
|     fun onAddTaskClick(open: (String) -> Unit) { | ||||
|         // TODO open(CREATE_TASK_SCREEN) | ||||
|         SnackbarManager.showMessage(AppText.create_task_not_possible_yet) // TODO Remove | ||||
|     } | ||||
| 
 | ||||
|     fun onAddFriendClick(open: (String) -> Unit) { | ||||
|         // TODO open(SEARCH_FRIENDS_SCREEN) | ||||
|         SnackbarManager.showMessage(AppText.add_friend_not_possible_yet) // TODO Remove | ||||
|     } | ||||
| 
 | ||||
|     fun onAddSessionClick(open: (String) -> Unit) { | ||||
|         // TODO open(CREATE_SESSION_SCREEN) | ||||
|         SnackbarManager.showMessage(AppText.create_session_not_possible_yet) // TODO Remove | ||||
|     } | ||||
| } | ||||
|  | @ -1,22 +1,31 @@ | |||
| package be.ugent.sel.studeez.navigation | ||||
| 
 | ||||
| object StudeezDestinations { | ||||
|     const val SPLASH_SCREEN = "splash" | ||||
|     const val SIGN_UP_SCREEN = "signup" | ||||
|     const val LOGIN_SCREEN = "login" | ||||
| 
 | ||||
|     // NavBar | ||||
|     const val HOME_SCREEN = "home" | ||||
|     const val TIMER_OVERVIEW_SCREEN = "timer_overview" | ||||
|     const val TASKS_SCREEN = "tasks" | ||||
|     const val SESSIONS_SCREEN = "sessions" | ||||
|     const val PROFILE_SCREEN = "profile" | ||||
| 
 | ||||
|     // Drawer | ||||
|     const val TIMER_SCREEN = "timer_overview" | ||||
|     const val SETTINGS_SCREEN = "settings" | ||||
| 
 | ||||
|     // Login flow | ||||
|     const val SPLASH_SCREEN = "splash" | ||||
|     const val LOGIN_SCREEN = "login" | ||||
|     const val SIGN_UP_SCREEN = "signup" | ||||
| 
 | ||||
|     // Studying flow | ||||
|     const val TIMER_SELECTION_SCREEN = "timer_selection" | ||||
|     const val SESSION_SCREEN = "session" | ||||
|     const val SESSION_RECAP = "session_recap" | ||||
|  //    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" | ||||
|     // Friends flow | ||||
|     const val SEARCH_FRIENDS_SCREEN = "search_friends" | ||||
| 
 | ||||
|     // Edit screens | ||||
|     // Create & edit screens | ||||
|     const val CREATE_TASK_SCREEN = "create_task" | ||||
|     const val CREATE_SESSION_SCREEN = "create_session" | ||||
|     const val EDIT_PROFILE_SCREEN = "edit_profile" | ||||
| } | ||||
|  | @ -33,13 +33,13 @@ fun HomeRoute( | |||
| fun HomeScreen( | ||||
|     onStartSessionClick: () -> Unit, | ||||
|     drawerActions: DrawerActions, | ||||
|     navigationBarActions: NavigationBarActions, | ||||
|     navigationBarActions: NavigationBarActions | ||||
| ) { | ||||
|     PrimaryScreenTemplate( | ||||
|         title = resources().getString(R.string.home), | ||||
|         drawerActions = drawerActions, | ||||
|         navigationBarActions = navigationBarActions, | ||||
|         barAction = { FriendsAction() } | ||||
|         // TODO barAction = { FriendsAction() } | ||||
|     ) { | ||||
|         BasicButton(R.string.start_session, Modifier.basicButton()) { | ||||
|             onStartSessionClick() | ||||
|  | @ -63,6 +63,6 @@ fun HomeScreenPreview() { | |||
|     HomeScreen( | ||||
|         onStartSessionClick = {}, | ||||
|         drawerActions = DrawerActions({}, {}, {}, {}, {}), | ||||
|         navigationBarActions = NavigationBarActions({ false }, {}, {}, {}, {}) | ||||
|         navigationBarActions = NavigationBarActions({ false }, {}, {}, {}, {}, {}, {}, {}) | ||||
|     ) | ||||
| } | ||||
|  |  | |||
|  | @ -63,7 +63,10 @@ fun EditProfileScreen( | |||
|             BasicTextButton( | ||||
|                 text = R.string.save, | ||||
|                 Modifier.textButton(), | ||||
|                 action = editProfileActions.onSaveClick | ||||
|                 action = { | ||||
|                     editProfileActions.onSaveClick() | ||||
|                     goBack() | ||||
|                 } | ||||
|             ) | ||||
|             BasicTextButton( | ||||
|                 text = R.string.delete_profile, | ||||
|  |  | |||
|  | @ -88,6 +88,6 @@ fun ProfileScreenPreview() { | |||
|     ProfileScreen( | ||||
|         profileActions = ProfileActions({ null }, {}), | ||||
|         drawerActions = DrawerActions({}, {}, {}, {}, {}), | ||||
|         navigationBarActions = NavigationBarActions({ false }, {}, {}, {}, {}) | ||||
|         navigationBarActions = NavigationBarActions({ false }, {}, {}, {}, {}, {}, {}, {}) | ||||
|     ) | ||||
| } | ||||
|  | @ -0,0 +1,42 @@ | |||
| package be.ugent.sel.studeez.screens.sessions | ||||
| 
 | ||||
| import androidx.compose.foundation.layout.fillMaxSize | ||||
| import androidx.compose.material.Text | ||||
| import androidx.compose.runtime.Composable | ||||
| import androidx.compose.ui.Modifier | ||||
| import androidx.compose.ui.text.style.TextAlign | ||||
| import be.ugent.sel.studeez.common.composable.PrimaryScreenTemplate | ||||
| import be.ugent.sel.studeez.common.composable.drawer.DrawerActions | ||||
| import be.ugent.sel.studeez.common.composable.navbar.NavigationBarActions | ||||
| import be.ugent.sel.studeez.resources | ||||
| import be.ugent.sel.studeez.R.string as AppText | ||||
| 
 | ||||
| @Composable | ||||
| fun SessionsRoute( | ||||
|     // viewModel: SessionsViewModel, | ||||
|     drawerActions: DrawerActions, | ||||
|     navigationBarActions: NavigationBarActions | ||||
| ) { | ||||
|     SessionsScreen( | ||||
|         drawerActions = drawerActions, | ||||
|         navigationBarActions = navigationBarActions | ||||
|     ) | ||||
| } | ||||
| 
 | ||||
| @Composable | ||||
| fun SessionsScreen( | ||||
|     drawerActions: DrawerActions, | ||||
|     navigationBarActions: NavigationBarActions | ||||
| ) { | ||||
|     PrimaryScreenTemplate( | ||||
|         title = resources().getString(AppText.upcoming_sessions), | ||||
|         drawerActions = drawerActions, | ||||
|         navigationBarActions = navigationBarActions | ||||
|     ) { | ||||
|         Text( | ||||
|             text = resources().getString(AppText.sessions_temp_description), | ||||
|             modifier = Modifier.fillMaxSize(), | ||||
|             textAlign = TextAlign.Center | ||||
|         ) | ||||
|     } | ||||
| } | ||||
|  | @ -0,0 +1,37 @@ | |||
| package be.ugent.sel.studeez.screens.settings | ||||
| 
 | ||||
| import androidx.compose.foundation.layout.fillMaxSize | ||||
| import androidx.compose.material.Text | ||||
| import androidx.compose.runtime.Composable | ||||
| import androidx.compose.ui.Modifier | ||||
| import androidx.compose.ui.text.style.TextAlign | ||||
| import be.ugent.sel.studeez.common.composable.DrawerScreenTemplate | ||||
| import be.ugent.sel.studeez.common.composable.drawer.DrawerActions | ||||
| import be.ugent.sel.studeez.resources | ||||
| import be.ugent.sel.studeez.R.string as AppText | ||||
| 
 | ||||
| @Composable | ||||
| fun SettingsRoute( | ||||
|     // viewModel: SettingsViewModel, | ||||
|     drawerActions: DrawerActions | ||||
| ) { | ||||
|     SettingsScreen( | ||||
|         drawerActions = drawerActions | ||||
|     ) | ||||
| } | ||||
| 
 | ||||
| @Composable | ||||
| fun SettingsScreen( | ||||
|     drawerActions: DrawerActions | ||||
| ) { | ||||
|     DrawerScreenTemplate( | ||||
|         title = resources().getString(AppText.settings), | ||||
|         drawerActions = drawerActions | ||||
|     ) { | ||||
|         Text( | ||||
|             text = resources().getString(AppText.settings_temp_description), | ||||
|             modifier = Modifier.fillMaxSize(), | ||||
|             textAlign = TextAlign.Center | ||||
|         ) | ||||
|     } | ||||
| } | ||||
|  | @ -12,7 +12,9 @@ import androidx.compose.ui.graphics.Color | |||
| private val DarkColorPalette = darkColors( | ||||
|     primary = Blue100, | ||||
|     primaryVariant = Blue120, | ||||
|     secondary = Yellow100 | ||||
|     secondary = Yellow100, | ||||
| 
 | ||||
|     onPrimary = Color.White | ||||
| ) | ||||
| 
 | ||||
| private val LightColorPalette = lightColors( | ||||
|  |  | |||
|  | @ -1,5 +1,6 @@ | |||
| <resources> | ||||
|     <!-- Common --> | ||||
|     <!-- ========== Common ========== --> | ||||
| 
 | ||||
|     <string name="app_name">Studeez</string> | ||||
|     <string name="username">Username</string> | ||||
|     <string name="email">Email</string> | ||||
|  | @ -7,34 +8,22 @@ | |||
|     <string name="repeat_password">Repeat password</string> | ||||
|     <string name="menu">Menu</string> | ||||
| 
 | ||||
|         <!-- Actions --> | ||||
|         <string name="confirm">Confirm</string> | ||||
|         <string name="save">Save</string> | ||||
|         <string name="discard">Discard</string> | ||||
|         <string name="cancel">Cancel</string> | ||||
|         <string name="go_back">Go back</string> | ||||
|         <string name="next">Next</string> | ||||
|         <string name="start">Start</string> | ||||
|     <!-- Actions --> | ||||
|     <string name="confirm">Confirm</string> | ||||
|     <string name="save">Save</string> | ||||
|     <string name="discard">Discard</string> | ||||
|     <string name="cancel">Cancel</string> | ||||
|     <string name="go_back">Go back</string> | ||||
|     <string name="next">Next</string> | ||||
|     <string name="start">Start</string> | ||||
| 
 | ||||
|         <!-- Messages --> | ||||
|         <string name="success">Success!</string> | ||||
|         <string name="try_again">Try again</string> | ||||
|         <string name="generic_error">Something wrong happened. Please try again.</string> | ||||
|         <string name="email_error">Please insert a valid email.</string> | ||||
|     <!-- Messages --> | ||||
|     <string name="success">Success!</string> | ||||
|     <string name="try_again">Try again</string> | ||||
|     <string name="generic_error">Something wrong happened. Please try again.</string> | ||||
|     <string name="email_error">Please insert a valid email.</string> | ||||
| 
 | ||||
|     <!-- SignUpScreen --> | ||||
|     <string name="create_account">Create account</string> | ||||
|     <string name="password_error">Your password should have at least six characters and include one digit, one lower case letter and one upper case letter.</string> | ||||
|     <string name="password_match_error">Passwords do not match.</string> | ||||
|     <string name="already_user">Already have an account? Log in.</string> | ||||
| 
 | ||||
|     <!-- LoginScreen --> | ||||
|     <string name="not_already_user">Don\'t have an account yet? Sign up.</string> | ||||
|     <string name="sign_in">Sign in</string> | ||||
|     <string name="login_details">Enter your login details</string> | ||||
|     <string name="forgot_password">Forgot password? Click to get recovery email.</string> | ||||
|     <string name="recovery_email_sent">Check your inbox for the recovery email.</string> | ||||
|     <string name="empty_password_error">Password cannot be empty.</string> | ||||
|     <!-- ========== NavBar ========== --> | ||||
| 
 | ||||
|     <!-- HomeScreen --> | ||||
|     <string name="home">Home</string> | ||||
|  | @ -42,10 +31,14 @@ | |||
| 
 | ||||
|     <!-- Tasks --> | ||||
|     <string name="tasks">Tasks</string> | ||||
|     <string name="task">Task</string> | ||||
| 
 | ||||
|     <!-- Sessions --> | ||||
|     <string name="sessions_temp_description">Looks like you found the sessions screen! In here, your upcoming studying sessions with friends will be listed. You can accept invites or edit your own.</string> <!-- TODO Remove this description line once implemented. --> | ||||
|     <string name="sessions">Sessions</string> | ||||
|     <string name="session">Session</string> | ||||
|     <string name="end_session">End session</string> | ||||
|     <string name="upcoming_sessions">Upcoming sessions</string> | ||||
| 
 | ||||
|     <!-- Profile --> | ||||
|     <string name="profile">Profile</string> | ||||
|  | @ -54,10 +47,8 @@ | |||
|     <string name="editing_profile">Editing profile</string> | ||||
|     <string name="delete_profile">Delete profile</string> | ||||
| 
 | ||||
|     <!-- Friends --> | ||||
|     <string name="friends">Friends</string> | ||||
|     <!-- ========== Drawer ========== --> | ||||
| 
 | ||||
|     <!-- Drawer / SideMenu --> | ||||
|     <string name="log_out">Log out</string> | ||||
|     <string name="profile_picture_description">Profile Picture</string> | ||||
|     <string name="user_description">Normal user</string> | ||||
|  | @ -76,9 +67,42 @@ | |||
|     <string name="state_take_a_break">Take a break!</string> | ||||
| 
 | ||||
|     <!-- Settings --> | ||||
|     <string name="settings_temp_description">Looks like you found the settings screen! In the future, this will enable you to edit your preferenes such as light/dark mode, end sessions automatically when we detect you are gone etc.</string> <!-- TODO Remove this description line once implemented. --> | ||||
|     <string name="settings">Settings</string> | ||||
| 
 | ||||
|     <!-- About --> | ||||
|     <string name="about">About Studeez</string> | ||||
| 
 | ||||
|     <!-- ========== Login flow ========== --> | ||||
| 
 | ||||
|     <!-- SignUpScreen --> | ||||
|     <string name="create_account">Create account</string> | ||||
|     <string name="password_error">Your password should have at least six characters and include one digit, one lower case letter and one upper case letter.</string> | ||||
|     <string name="password_match_error">Passwords do not match.</string> | ||||
|     <string name="already_user">Already have an account? Log in.</string> | ||||
| 
 | ||||
|     <!-- LoginScreen --> | ||||
|     <string name="not_already_user">Don\'t have an account yet? Sign up.</string> | ||||
|     <string name="sign_in">Sign in</string> | ||||
|     <string name="login_details">Enter your login details</string> | ||||
|     <string name="forgot_password">Forgot password? Click to get recovery email.</string> | ||||
|     <string name="recovery_email_sent">Check your inbox for the recovery email.</string> | ||||
|     <string name="empty_password_error">Password cannot be empty.</string> | ||||
| 
 | ||||
|     <!-- ========== Studying flow ========== --> | ||||
| 
 | ||||
|     <!-- ========== Friends flow ========== --> | ||||
| 
 | ||||
|     <string name="friends">Friends</string> | ||||
|     <string name="friend">Friend</string> | ||||
|     <string name="add_friend_not_possible_yet">Adding friends still needs to be implemented. Hang on tight!</string> <!-- TODO Remove this description line once implemented. --> | ||||
| 
 | ||||
|     <!-- ========== Create & edit screens ========== --> | ||||
| 
 | ||||
|     <!-- Task --> | ||||
|     <string name="create_task_not_possible_yet">Creating tasks still needs to be implemented. Hang on tight!</string> <!-- TODO Remove this description line once implemented. --> | ||||
| 
 | ||||
|     <!-- Session --> | ||||
|     <string name="create_session_not_possible_yet">Creating sessions still needs to be implemented. Hang on tight!</string> <!-- TODO Remove this description line once implemented. --> | ||||
| 
 | ||||
| </resources> | ||||
|  |  | |||
		Reference in a new issue
	
	 GitHub Enterprise
							GitHub Enterprise