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 +