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 4058628..aeacffa 100644
--- a/app/src/main/java/be/ugent/sel/studeez/StudeezApp.kt
+++ b/app/src/main/java/be/ugent/sel/studeez/StudeezApp.kt
@@ -19,7 +19,7 @@ import androidx.navigation.compose.rememberNavController
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.sign_in.LoginScreen
+import be.ugent.sel.studeez.screens.log_in.LoginScreen
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
@@ -89,6 +89,8 @@ fun NavGraphBuilder.studeezGraph(appState: StudeezAppstate) {
}
composable(StudeezDestinations.HOME_SCREEN) {
- HomeScreen(openAndPopUp = { route, popUp -> appState.navigateAndPopUp(route, popUp) })
+ HomeScreen(
+ openAndPopUp = { route, popUp -> appState.navigateAndPopUp(route, popUp) }
+ )
}
}
\ No newline at end of file
diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/DrawerComposable.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/DrawerComposable.kt
new file mode 100644
index 0000000..2a484b1
--- /dev/null
+++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/DrawerComposable.kt
@@ -0,0 +1,89 @@
+package be.ugent.sel.studeez.common.composable
+
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.*
+import androidx.compose.material.Icon
+import androidx.compose.material.Text
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Home
+import androidx.compose.material.icons.filled.Settings
+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.res.vectorResource
+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
+
+
+@Composable
+fun Drawer(
+ onLogoutClick: () -> Unit
+) {
+ Column(modifier = Modifier.fillMaxSize()) {
+ 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)
+ ) {
+ // TODO Go to timers
+ }
+ DrawerEntry(
+ icon = Icons.Default.Settings,
+ text = resources().getString(R.string.settings)
+ ) {
+ // TODO Go to settings
+ }
+ DrawerEntry(
+ icon = ImageVector.vectorResource(id = R.drawable.ic_logout),
+ text = resources().getString(R.string.log_out)
+ ) {
+ onLogoutClick()
+ }
+
+ DrawerEntry(
+ icon = Icons.Outlined.Info,
+ text = resources().getString(R.string.about)
+ ) {
+ // TODO Go to about
+ }
+ }
+}
+
+@Composable
+fun DrawerEntry(
+ icon: ImageVector,
+ text: String,
+ onClick: () -> Unit
+) {
+ Row(
+ horizontalArrangement = Arrangement.Center,
+ modifier = Modifier
+ .clickable(onClick = { onClick() })
+ .fillMaxWidth()
+ ) {
+ Box(modifier = Modifier.fillMaxWidth(0.25f)) {
+ Icon(imageVector = icon, contentDescription = text)
+ }
+ Box(modifier = Modifier.fillMaxWidth(0.75f)) {
+ Text(text = text)
+ }
+ }
+}
+
+@Preview
+@Composable
+fun DrawerPreview() {
+ StudeezTheme {
+ Drawer(
+ {}
+ )
+ }
+}
\ 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
new file mode 100644
index 0000000..3c7eeb8
--- /dev/null
+++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/PrimaryScreenComposable.kt
@@ -0,0 +1,66 @@
+package be.ugent.sel.studeez.common.composable
+
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.material.*
+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 kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.launch
+
+@Composable
+fun PrimaryScreenTemplate(
+ title: String,
+ onLogoutClick: () -> Unit,
+ content: @Composable (PaddingValues) -> Unit
+) {
+ val scaffoldState: ScaffoldState = rememberScaffoldState()
+ val coroutineScope: CoroutineScope = rememberCoroutineScope()
+
+ Scaffold(
+ scaffoldState = scaffoldState,
+
+ topBar = { TopAppBar(
+ title = { Text(text = title) },
+ navigationIcon = {
+ IconButton(onClick = {
+ coroutineScope.launch { scaffoldState.drawerState.open() }
+ }) {
+ Icon(
+ imageVector = Icons.Default.Menu,
+ contentDescription = resources().getString(R.string.menu)
+ )
+ }
+ }
+ ) },
+
+ drawerContent = {
+ Drawer(
+ onLogoutClick = { onLogoutClick() }
+ )
+ },
+
+ bottomBar = { NavigationBar() }, // TODO Pass arguments so that the current tab etc can be shown
+ floatingActionButtonPosition = FabPosition.Center,
+ isFloatingActionButtonDocked = true,
+ floatingActionButton = { CollapsedAddButton() }
+ ) {
+ content(it)
+ }
+}
+
+@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/common/composable/SecondaryScreenComposable.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/SecondaryScreenComposable.kt
new file mode 100644
index 0000000..5470566
--- /dev/null
+++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/SecondaryScreenComposable.kt
@@ -0,0 +1,47 @@
+package be.ugent.sel.studeez.common.composable
+
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.material.*
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.ArrowBack
+import androidx.compose.runtime.Composable
+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
+
+// TODO Add option for button in top right corner as extra button
+
+@Composable
+// Does not contain floatingActionButton and bottom bar, used in all the other screens
+fun SecondaryScreenTemplate(
+ title: String,
+ popUp: () -> Unit,
+ content: @Composable (PaddingValues) -> Unit
+) {
+ Scaffold(
+ // Everything at the top of the screen
+ topBar = { TopAppBar(
+ title = { Text(text = title) },
+ navigationIcon = {
+ IconButton(onClick = { popUp() }) {
+ Icon(
+ imageVector = Icons.Default.ArrowBack,
+ contentDescription = resources().getString(R.string.go_back)
+ )
+ }
+ }
+ ) },
+ ) { paddingValues ->
+ content(paddingValues)
+ }
+}
+
+@Preview
+@Composable
+fun SecondaryScreenToolbarPreview() {
+ StudeezTheme { SecondaryScreenTemplate(
+ "Preview screen",
+ {}
+ ) {} }
+}
\ No newline at end of file
diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/ToolbarComposable.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/ToolbarComposable.kt
deleted file mode 100644
index 2ed16c6..0000000
--- a/app/src/main/java/be/ugent/sel/studeez/common/composable/ToolbarComposable.kt
+++ /dev/null
@@ -1,77 +0,0 @@
-package be.ugent.sel.studeez.common.composable
-
-import androidx.compose.foundation.layout.PaddingValues
-import androidx.compose.material.*
-import androidx.compose.material.icons.Icons
-import androidx.compose.material.icons.filled.Menu
-import androidx.compose.runtime.Composable
-import androidx.compose.ui.tooling.preview.Preview
-import be.ugent.sel.studeez.ui.theme.StudeezTheme
-
-// TODO Add option for button in top right corner as extra button
-
-@Composable
-// Contains floatingActionButton and bottom bar, used in the main four screens.
-fun PrimaryScreenToolbar(
- title: String,
- content: @Composable (PaddingValues) -> Unit
-) {
- Scaffold(
- // Everything at the top of the screen
- topBar = { TopAppBar(
- title = { Text(text = title) },
- navigationIcon = {
- IconButton(onClick = { /* TODO open sidemenu */ }) {
- Icon(imageVector = Icons.Default.Menu, contentDescription = "Menu")
- }
- }
- ) },
-
- // Everything at the bottom of the screen
- bottomBar = { NavigationBar() }, // TODO Pass arguments so that the current tab etc can be shown
- floatingActionButtonPosition = FabPosition.Center,
- isFloatingActionButtonDocked = true,
- floatingActionButton = { CollapsedAddButton() }
- ) { paddingValues ->
- content(paddingValues)
- }
-}
-
-@Composable
-// Does not contain floatingActionButton and bottom bar, used in all the other screens
-fun SecondaryScreenToolbar(
- title: String,
- content: @Composable (PaddingValues) -> Unit
-) {
- Scaffold(
- // Everything at the top of the screen
- topBar = { TopAppBar(
- title = { Text(text = title) },
- navigationIcon = {
- IconButton(onClick = { /* TODO open sidemenu */ }) {
- Icon(imageVector = Icons.Default.Menu, contentDescription = "Menu")
- }
- }
- ) },
- ) { paddingValues ->
- content(paddingValues)
- }
-}
-
-@Preview
-@Composable
-fun PrimaryScreenToolbarPreview() {
- StudeezTheme { PrimaryScreenToolbar(
- "Preview screen",
- {}
- ) }
-}
-
-@Preview
-@Composable
-fun SecondaryScreenToolbarPreview() {
- StudeezTheme { SecondaryScreenToolbar(
- "Preview screen",
- {}
- )}
-}
\ No newline at end of file
diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseAccountDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseAccountDAO.kt
index 4067fdd..434f3ce 100644
--- a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseAccountDAO.kt
+++ b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseAccountDAO.kt
@@ -18,8 +18,6 @@ package be.ugent.sel.studeez.domain.implementation
import be.ugent.sel.studeez.data.local.models.User
import be.ugent.sel.studeez.domain.AccountDAO
-import be.ugent.sel.studeez.domain.trace
-import com.google.firebase.auth.EmailAuthProvider
import com.google.firebase.auth.FirebaseAuth
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow
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 56d1b4d..d3c1275 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
@@ -5,8 +5,7 @@ import androidx.compose.ui.Modifier
import androidx.hilt.navigation.compose.hiltViewModel
import be.ugent.sel.studeez.R
import be.ugent.sel.studeez.common.composable.BasicButton
-import be.ugent.sel.studeez.common.composable.PrimaryScreenToolbar
-import be.ugent.sel.studeez.common.composable.SecondaryScreenToolbar
+import be.ugent.sel.studeez.common.composable.PrimaryScreenTemplate
import be.ugent.sel.studeez.common.ext.basicButton
import be.ugent.sel.studeez.resources
@@ -15,9 +14,10 @@ fun HomeScreen(
openAndPopUp: (String, String) -> Unit,
viewModel: HomeViewModel = hiltViewModel()
) {
-
- PrimaryScreenToolbar(title = resources().getString(R.string.home)) {
- // "Start session" button
+ PrimaryScreenTemplate(
+ title = resources().getString(R.string.home),
+ onLogoutClick = { viewModel.onLogoutClick(openAndPopUp) }
+ ) {
BasicButton(R.string.start_session, Modifier.basicButton()) {
viewModel.onStartSessionClick(openAndPopUp)
}
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 f3a5369..6a791d0 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,14 +1,31 @@
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
-class HomeViewModel @Inject constructor(logService: LogService) : StudeezViewModel(logService) {
+class HomeViewModel @Inject constructor(
+ private val accountDAO: AccountDAO,
+ logService: LogService
+) : StudeezViewModel(logService) {
fun onStartSessionClick(openAndPopUp: (String, String) -> Unit) {
- // openAndPopUp(StudeezDestinations.xxx, StudeezDestinations.HOME_SCREEN)
+ // TODO openAndPopUp(StudeezDestinations.xxx, StudeezDestinations.HOME_SCREEN)
+ }
+
+ fun onLogoutClick(openAndPopup: (String, String) -> Unit) {
+ launchCatching {
+ accountDAO.signOut()
+ openAndPopup(LOGIN_SCREEN, HOME_SCREEN)
+ }
}
}
\ 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 067011b..82ff679 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
@@ -1,4 +1,4 @@
-package be.ugent.sel.studeez.screens.sign_in
+package be.ugent.sel.studeez.screens.log_in
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
@@ -26,7 +26,8 @@ fun LoginScreen(
) {
val uiState by viewModel.uiState
- SecondaryScreenToolbar(title = resources().getString(AppText.sign_in)) {
+ // TODO Make this a separate kind of screen?
+ SecondaryScreenTemplate(title = resources().getString(AppText.sign_in), {}) {
Column(
modifier = modifier
.fillMaxWidth()
diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/log_in/LoginUiState.kt b/app/src/main/java/be/ugent/sel/studeez/screens/log_in/LoginUiState.kt
index e1cc98a..737dd39 100644
--- a/app/src/main/java/be/ugent/sel/studeez/screens/log_in/LoginUiState.kt
+++ b/app/src/main/java/be/ugent/sel/studeez/screens/log_in/LoginUiState.kt
@@ -1,4 +1,4 @@
-package be.ugent.sel.studeez.screens.sign_in
+package be.ugent.sel.studeez.screens.log_in
data class LoginUiState(
val email: String = "",
diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/log_in/LoginViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/log_in/LoginViewModel.kt
index 268fa91..cf3a72d 100644
--- a/app/src/main/java/be/ugent/sel/studeez/screens/log_in/LoginViewModel.kt
+++ b/app/src/main/java/be/ugent/sel/studeez/screens/log_in/LoginViewModel.kt
@@ -1,11 +1,10 @@
-package be.ugent.sel.studeez.screens.sign_in
+package be.ugent.sel.studeez.screens.log_in
import androidx.compose.runtime.mutableStateOf
import be.ugent.sel.studeez.common.ext.isValidEmail
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
import be.ugent.sel.studeez.navigation.StudeezDestinations.HOME_SCREEN
import be.ugent.sel.studeez.navigation.StudeezDestinations.LOGIN_SCREEN
import be.ugent.sel.studeez.navigation.StudeezDestinations.SIGN_UP_SCREEN
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 4d07f59..9eb9dea 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
@@ -27,7 +27,7 @@ fun SignUpScreen(
val uiState by viewModel.uiState
val fieldModifier = Modifier.fieldModifier()
- SecondaryScreenToolbar(title = resources().getString(AppText.create_account)) {
+ SecondaryScreenTemplate(title = resources().getString(AppText.create_account), {}) {
Column(
modifier = modifier
.fillMaxWidth()
diff --git a/app/src/main/res/drawable/ic_logout.xml b/app/src/main/res/drawable/ic_logout.xml
new file mode 100644
index 0000000..bceb2ec
--- /dev/null
+++ b/app/src/main/res/drawable/ic_logout.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_timer.xml b/app/src/main/res/drawable/ic_timer.xml
new file mode 100644
index 0000000..c99a685
--- /dev/null
+++ b/app/src/main/res/drawable/ic_timer.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 01e986c..672586e 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -8,6 +8,8 @@
Please insert a valid email.
Cancel
Try again
+ Go back
+ Menu
Create account
@@ -27,4 +29,18 @@
Home
Start session
+
+ Log out
+ Profile Picture
+ Normal user
+
+
+ Timers
+
+
+ Settings
+
+
+ About Studeez
+