From 5bce9d6108ffe746a6d1c95b78124bdac02d6809 Mon Sep 17 00:00:00 2001 From: tdpeuter Date: Mon, 15 May 2023 23:43:30 +0200 Subject: [PATCH 01/18] Search field fixes --- .../common/composable/TextFieldComposable.kt | 4 ++- .../friends_overview/FriendsOverviewScreen.kt | 35 +++++++++++++++---- .../friends_search/SearchFriendsScreen.kt | 19 +++++----- app/src/main/res/values/strings.xml | 2 ++ 4 files changed, 44 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/TextFieldComposable.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/TextFieldComposable.kt index 66c7bc4..ba07898 100644 --- a/app/src/main/java/be/ugent/sel/studeez/common/composable/TextFieldComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/TextFieldComposable.kt @@ -227,12 +227,14 @@ fun SearchField( onValueChange: (String) -> Unit, onSubmit: () -> Unit, @StringRes label: Int, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, + enabled: Boolean = true ) { OutlinedTextField( value = value, onValueChange = onValueChange, modifier = modifier, + enabled = enabled, label = { Text(text = stringResource(id = label)) }, trailingIcon = { IconButton(onClick = onSubmit) { diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/friends/friends_overview/FriendsOverviewScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/friends/friends_overview/FriendsOverviewScreen.kt index 8ea6d20..db76179 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/friends/friends_overview/FriendsOverviewScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/friends/friends_overview/FriendsOverviewScreen.kt @@ -10,10 +10,12 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material.icons.filled.Delete import androidx.compose.material.icons.filled.Person +import androidx.compose.material.icons.filled.Search import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.modifier.modifierLocalConsumer import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource import androidx.compose.ui.text.style.TextOverflow @@ -89,13 +91,32 @@ fun FriendsOverviewScreen( topBar = { TopAppBar( title = { - // TODO Link to each other - SearchField( - value = uiState.queryString, - onValueChange = friendsOverviewActions.onQueryStringChange, - onSubmit = friendsOverviewActions.onSubmit, - label = AppText.search_friends - ) + // TODO Make search field +// SearchField( +// value = uiState.queryString, +// onValueChange = friendsOverviewActions.onQueryStringChange, +// onSubmit = friendsOverviewActions.onSubmit, +// label = AppText.search_friends, +// enabled = false +// ) + IconButton( + onClick = friendsOverviewActions.onSubmit, +// modifier = Modifier.background( +// color = MaterialTheme.colors.background +// ), + ) { + Row { + Text( + text = stringResource(id = AppText.click_search_friends), + color = MaterialTheme.colors.onPrimary + ) + Icon( + imageVector = Icons.Default.Search, + contentDescription = stringResource(AppText.search_friends), + tint = MaterialTheme.colors.onPrimary + ) + } + } }, navigationIcon = { IconButton(onClick = popUp) { diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/friends/friends_search/SearchFriendsScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/friends/friends_search/SearchFriendsScreen.kt index e84bb9f..7803066 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/friends/friends_search/SearchFriendsScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/friends/friends_search/SearchFriendsScreen.kt @@ -9,6 +9,7 @@ import androidx.compose.material.* import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material.icons.filled.Person +import androidx.compose.material.icons.filled.Search import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -82,14 +83,16 @@ fun SearchFriendsScreen( topBar = { TopAppBar( title = { - SearchField( - value = query, - onValueChange = { newValue -> - searchFriendsActions.onQueryStringChange(newValue) - query = newValue - }, - onSubmit = { }, - label = AppText.search_friends + // TODO Make search field +// SearchField( +// value = uiState.queryString, +// onValueChange = friendsOverviewActions.onQueryStringChange, +// onSubmit = friendsOverviewActions.onSubmit, +// label = AppText.search_friends, +// enabled = false +// ) + Text( + text = stringResource(id = AppText.searching_friends) ) }, navigationIcon = { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f7d2666..75ad6ea 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -132,6 +132,8 @@ Send friend request Remove as friend Show profile + Click to search friends + Searching friends From 9eab533251d23899b58e3141b52e3286ffe34ee7 Mon Sep 17 00:00:00 2001 From: tdpeuter Date: Tue, 16 May 2023 08:44:21 +0200 Subject: [PATCH 02/18] Styling --- .../common/composable/TextComposable.kt | 2 +- .../studeez/common/composable/feed/Feed.kt | 2 +- .../common/composable/feed/FeedEntry.kt | 2 +- .../common/composable/tasks/SubjectEntry.kt | 14 +++- .../friends_overview/FriendsOverviewScreen.kt | 75 +++++++++---------- 5 files changed, 50 insertions(+), 45 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 25fa3c4..425d8f6 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 @@ -32,7 +32,7 @@ fun Headline( fun DateText(date: String) { Text( text = date, - fontWeight = FontWeight.Bold, + fontWeight = FontWeight.Medium, fontSize = 20.sp, modifier = Modifier.padding(horizontal = 10.dp) ) diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/feed/Feed.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/feed/Feed.kt index 54be2ea..fb18f02 100644 --- a/app/src/main/java/be/ugent/sel/studeez/common/composable/feed/Feed.kt +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/feed/Feed.kt @@ -81,7 +81,7 @@ fun FeedWithElements( Text( text = "${HoursMinutesSeconds(totalDayStudyTime)}", fontSize = 15.sp, - fontWeight = FontWeight.Bold + fontWeight = FontWeight.Medium ) } feedEntries.forEach { feedEntry -> diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/feed/FeedEntry.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/feed/FeedEntry.kt index ff950d6..016090d 100644 --- a/app/src/main/java/be/ugent/sel/studeez/common/composable/feed/FeedEntry.kt +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/feed/FeedEntry.kt @@ -56,7 +56,7 @@ fun FeedEntry( ) { Text( text = feedEntry.subJectName, - fontWeight = FontWeight.Bold, + fontWeight = FontWeight.Medium, overflow = TextOverflow.Ellipsis, maxLines = 1, ) diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/tasks/SubjectEntry.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/tasks/SubjectEntry.kt index 63d4fbe..1c98af2 100644 --- a/app/src/main/java/be/ugent/sel/studeez/common/composable/tasks/SubjectEntry.kt +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/tasks/SubjectEntry.kt @@ -5,6 +5,7 @@ import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.Card import androidx.compose.material.Icon +import androidx.compose.material.MaterialTheme import androidx.compose.material.Text import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.List @@ -65,16 +66,17 @@ fun SubjectEntry( ) { Text( text = subject.name, - fontWeight = FontWeight.Bold, overflow = TextOverflow.Ellipsis, maxLines = 1, + fontWeight = FontWeight.Medium ) Row( horizontalArrangement = Arrangement.spacedBy(10.dp), - verticalAlignment = Alignment.CenterVertically, + verticalAlignment = Alignment.CenterVertically ) { Text( text = HoursMinutesSeconds(studytime).toString(), + color = MaterialTheme.colors.onBackground.copy(alpha = 0.6f) ) Row( verticalAlignment = Alignment.CenterVertically, @@ -82,9 +84,13 @@ fun SubjectEntry( ) { Icon( imageVector = Icons.Default.List, - contentDescription = stringResource(id = AppText.tasks) + contentDescription = stringResource(id = AppText.tasks), + tint = MaterialTheme.colors.onBackground.copy(alpha = 0.6f) + ) + Text( + text = "${completedTaskCount}/${taskCount}", + color = MaterialTheme.colors.onBackground.copy(alpha = 0.6f) ) - Text(text = "${completedTaskCount}/${taskCount}") } } } diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/friends/friends_overview/FriendsOverviewScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/friends/friends_overview/FriendsOverviewScreen.kt index db76179..a1960d8 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/friends/friends_overview/FriendsOverviewScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/friends/friends_overview/FriendsOverviewScreen.kt @@ -1,10 +1,8 @@ package be.ugent.sel.studeez.screens.friends.friends_overview -import androidx.compose.foundation.background import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items -import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.* import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowBack @@ -15,7 +13,6 @@ import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.modifier.modifierLocalConsumer import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource import androidx.compose.ui.text.style.TextOverflow @@ -25,7 +22,6 @@ import androidx.compose.ui.unit.sp import be.ugent.sel.studeez.R import be.ugent.sel.studeez.common.composable.BasicButton import be.ugent.sel.studeez.common.composable.ProfilePicture -import be.ugent.sel.studeez.common.composable.SearchField import be.ugent.sel.studeez.common.composable.drawer.DrawerEntry import be.ugent.sel.studeez.common.ext.basicButton import be.ugent.sel.studeez.data.local.models.Friendship @@ -183,49 +179,52 @@ fun FriendsEntry( viewProfile: (String) -> Unit, removeFriend: (Friendship) -> Unit ) { - Row ( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 15.dp, vertical = 7.dp), - ) { - Box( - modifier = Modifier - .padding(vertical = 4.dp) - ) { - ProfilePicture() - } - - Box ( + Card { + Row ( modifier = Modifier .fillMaxWidth() + .padding(horizontal = 15.dp, vertical = 7.dp), + horizontalArrangement = Arrangement.spacedBy(15.dp) ) { - Column ( + Box( modifier = Modifier .padding(vertical = 4.dp) ) { - Text( - text = user.username, - fontSize = 16.sp, - maxLines = 1, - overflow = TextOverflow.Ellipsis - ) - Text( - text = "${resources().getString(AppText.app_name)} ${resources().getString(AppText.friend)}", - fontSize = 14.sp, - maxLines = 1, - overflow = TextOverflow.Ellipsis - ) + ProfilePicture() } - Box( - modifier = Modifier.fillMaxWidth(), - contentAlignment = Alignment.CenterEnd + Box ( + modifier = Modifier + .fillMaxWidth() ) { - FriendsOverviewDropDown( - friendship = friendship, - viewProfile = viewProfile, - removeFriend = removeFriend - ) + Column ( + modifier = Modifier + .padding(vertical = 4.dp) + ) { + Text( + text = user.username, + fontSize = 16.sp, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + Text( + text = "${resources().getString(AppText.app_name)} ${resources().getString(AppText.friend)}", + fontSize = 14.sp, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } + + Box( + modifier = Modifier.fillMaxWidth(), + contentAlignment = Alignment.CenterEnd + ) { + FriendsOverviewDropDown( + friendship = friendship, + viewProfile = viewProfile, + removeFriend = removeFriend + ) + } } } } From ef08a773f8e78f45dff35ae2cacbd10fa3e195e4 Mon Sep 17 00:00:00 2001 From: tdpeuter Date: Tue, 16 May 2023 08:44:56 +0200 Subject: [PATCH 03/18] Fix own profile showing up in search friends --- .../friends/friends_search/SearchFriendsViewModel.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/friends/friends_search/SearchFriendsViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/friends/friends_search/SearchFriendsViewModel.kt index 39aabf6..05bf6d6 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/friends/friends_search/SearchFriendsViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/friends/friends_search/SearchFriendsViewModel.kt @@ -10,7 +10,7 @@ import be.ugent.sel.studeez.navigation.StudeezDestinations import be.ugent.sel.studeez.screens.StudeezViewModel import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.map import javax.inject.Inject @HiltViewModel @@ -49,8 +49,8 @@ class SearchFriendsViewModel @Inject constructor( */ fun getAllUsers(): Flow> { return userDAO.getAllUsers() - .filter { users -> - users.any { user -> + .map { users -> + users.filter { user -> user.id != userDAO.getCurrentUserId() } } From af23a29f6c4cc17b5a319aeabb1c5af0099e09ca Mon Sep 17 00:00:00 2001 From: tdpeuter Date: Tue, 16 May 2023 09:10:39 +0200 Subject: [PATCH 04/18] Forbid adding friends twice --- .../implementation/FirebaseFriendshipDAO.kt | 52 ++++++++++++------- .../public_profile/PublicProfileScreen.kt | 17 +++--- .../public_profile/PublicProfileViewModel.kt | 6 ++- app/src/main/res/values/strings.xml | 1 + 4 files changed, 49 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseFriendshipDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseFriendshipDAO.kt index bd429e1..2583bed 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseFriendshipDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseFriendshipDAO.kt @@ -1,11 +1,10 @@ package be.ugent.sel.studeez.domain.implementation -import androidx.compose.runtime.collectAsState import be.ugent.sel.studeez.common.snackbar.SnackbarManager import be.ugent.sel.studeez.data.local.models.Friendship import be.ugent.sel.studeez.data.remote.FirebaseFriendship.ACCEPTED -import be.ugent.sel.studeez.data.remote.FirebaseFriendship.FRIENDSSINCE import be.ugent.sel.studeez.data.remote.FirebaseFriendship.FRIENDID +import be.ugent.sel.studeez.data.remote.FirebaseFriendship.FRIENDSSINCE import be.ugent.sel.studeez.domain.AccountDAO import be.ugent.sel.studeez.domain.FriendshipDAO import be.ugent.sel.studeez.domain.implementation.FirebaseCollections.FRIENDS_COLLECTION @@ -18,6 +17,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.map +import kotlinx.coroutines.tasks.await import javax.inject.Inject import kotlin.coroutines.resume import kotlin.coroutines.resumeWithException @@ -75,24 +75,40 @@ class FirebaseFriendshipDAO @Inject constructor( val currentUserId: String = auth.currentUserId val otherUserId: String = id - // Add entry to current user - currentUserDocument() - .collection(FRIENDS_COLLECTION) - .add(mapOf( - FRIENDID to otherUserId, - ACCEPTED to true, // TODO Make it not automatically accepted. - FRIENDSSINCE to Timestamp.now() - )) - - // Add entry to other user + // Check if the friendship already exists for the logged in user + var allowed = false firestore.collection(USER_COLLECTION) - .document(otherUserId) + .document(currentUserId) .collection(FRIENDS_COLLECTION) - .add(mapOf( - FRIENDID to currentUserId, - ACCEPTED to true, // TODO Make it not automatically accepted. - FRIENDSSINCE to Timestamp.now() - )) + .whereEqualTo(FRIENDID, otherUserId) + .get() + .addOnSuccessListener { + allowed = it.documents.isEmpty() + + if (allowed) { + // Add entry to current user + currentUserDocument() + .collection(FRIENDS_COLLECTION) + .add(mapOf( + FRIENDID to otherUserId, + ACCEPTED to true, // TODO Make it not automatically accepted. + FRIENDSSINCE to Timestamp.now() + )) + + // Add entry to other user + firestore.collection(USER_COLLECTION) + .document(otherUserId) + .collection(FRIENDS_COLLECTION) + .add(mapOf( + FRIENDID to currentUserId, + ACCEPTED to true, // TODO Make it not automatically accepted. + FRIENDSSINCE to Timestamp.now() + )) + } + }.addOnSuccessListener { + val message = if (allowed) AppText.success else AppText.already_friend + SnackbarManager.showMessage(message) + } return true } diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/profile/public_profile/PublicProfileScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/profile/public_profile/PublicProfileScreen.kt index 41e33c5..8fd9d89 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/profile/public_profile/PublicProfileScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/profile/public_profile/PublicProfileScreen.kt @@ -18,6 +18,7 @@ import be.ugent.sel.studeez.R import be.ugent.sel.studeez.common.composable.Headline import be.ugent.sel.studeez.common.composable.SecondaryScreenTemplate import be.ugent.sel.studeez.common.composable.drawer.DrawerEntry +import be.ugent.sel.studeez.common.snackbar.SnackbarManager import be.ugent.sel.studeez.data.local.models.User import be.ugent.sel.studeez.resources import be.ugent.sel.studeez.screens.profile.AmountOfFriendsButton @@ -30,7 +31,7 @@ data class PublicProfileActions( val getUserDetails: () -> Flow, val getAmountOfFriends: () -> Flow, val onViewFriendsClick: () -> Unit, - val sendFriendRequest: () -> Boolean + val sendFriendRequest: () -> Unit ) fun getPublicProfileActions( @@ -43,9 +44,11 @@ fun getPublicProfileActions( userId = viewModel.uiState.value.userId ) }, onViewFriendsClick = { viewModel.onViewFriendsClick(open) }, - sendFriendRequest = { viewModel.sendFriendRequest( - userId = viewModel.uiState.value.userId - ) } + sendFriendRequest = { + viewModel.sendFriendRequest( + userId = viewModel.uiState.value.userId + ) + } ) } @@ -129,7 +132,7 @@ fun PublicProfilePreview() { }, getAmountOfFriends = { flowOf(113) }, onViewFriendsClick = {}, - sendFriendRequest = { true } + sendFriendRequest = {} ), popUp = {} ) @@ -138,7 +141,7 @@ fun PublicProfilePreview() { @Composable fun PublicProfileEllipsis( - sendFriendRequest: () -> Boolean + sendFriendRequest: () -> Unit ) { var expanded by remember { mutableStateOf(false) } @@ -172,7 +175,7 @@ fun PublicProfileEllipsis( fun PublicProfileEllipsisPreview() { StudeezTheme { PublicProfileEllipsis( - sendFriendRequest = { true } + sendFriendRequest = {} ) } } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/profile/public_profile/PublicProfileViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/profile/public_profile/PublicProfileViewModel.kt index 031950c..700084f 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/profile/public_profile/PublicProfileViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/profile/public_profile/PublicProfileViewModel.kt @@ -1,6 +1,7 @@ package be.ugent.sel.studeez.screens.profile.public_profile import androidx.compose.runtime.mutableStateOf +import be.ugent.sel.studeez.common.snackbar.SnackbarManager import be.ugent.sel.studeez.data.SelectedUserId import be.ugent.sel.studeez.data.local.models.User import be.ugent.sel.studeez.domain.FriendshipDAO @@ -11,6 +12,7 @@ import be.ugent.sel.studeez.screens.StudeezViewModel import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.Flow import javax.inject.Inject +import be.ugent.sel.studeez.R.string as AppText @HiltViewModel class PublicProfileViewModel @Inject constructor( @@ -53,8 +55,8 @@ class PublicProfileViewModel @Inject constructor( fun sendFriendRequest( userId: String - ): Boolean { - return friendshipDAO.sendFriendshipRequest(userId) + ) { + friendshipDAO.sendFriendshipRequest(userId) } } \ 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 f4aa7cb..4544ddd 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -136,6 +136,7 @@ Show profile Click to search friends Searching friends + You are already befriended with that person. From 45bd215004633d5c13267ddf586c410061e24910 Mon Sep 17 00:00:00 2001 From: tdpeuter Date: Tue, 16 May 2023 09:16:03 +0200 Subject: [PATCH 05/18] Add friends to FAB --- .../common/composable/navbar/NavigationBarViewModel.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/navbar/NavigationBarViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/navbar/NavigationBarViewModel.kt index d2f4f09..3afc87b 100644 --- a/app/src/main/java/be/ugent/sel/studeez/common/composable/navbar/NavigationBarViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/navbar/NavigationBarViewModel.kt @@ -4,6 +4,7 @@ import be.ugent.sel.studeez.common.snackbar.SnackbarManager 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.SEARCH_FRIENDS_SCREEN import be.ugent.sel.studeez.navigation.StudeezDestinations.SELECT_SUBJECT import be.ugent.sel.studeez.navigation.StudeezDestinations.SESSIONS_SCREEN import be.ugent.sel.studeez.navigation.StudeezDestinations.SUBJECT_SCREEN @@ -38,8 +39,7 @@ class NavigationBarViewModel @Inject constructor( } fun onAddFriendClick(open: (String) -> Unit) { - // TODO open(SEARCH_FRIENDS_SCREEN) - SnackbarManager.showMessage(AppText.add_friend_not_possible_yet) // TODO Remove + open(SEARCH_FRIENDS_SCREEN) } fun onAddSessionClick(open: (String) -> Unit) { From 57668d31643cc5dfe418ea5c3c9a31154f57815b Mon Sep 17 00:00:00 2001 From: tdpeuter Date: Tue, 16 May 2023 09:32:20 +0200 Subject: [PATCH 06/18] Fix public profile string not showing --- .../screens/profile/public_profile/PublicProfileScreen.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/profile/public_profile/PublicProfileScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/profile/public_profile/PublicProfileScreen.kt index 8fd9d89..fdc2e97 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/profile/public_profile/PublicProfileScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/profile/public_profile/PublicProfileScreen.kt @@ -150,8 +150,7 @@ fun PublicProfileEllipsis( ) { Icon( imageVector = ImageVector.vectorResource(id = R.drawable.ic_more_horizontal), - contentDescription = resources().getString(AppText.view_more), - modifier = Modifier.fillMaxSize() + contentDescription = resources().getString(AppText.view_more) ) } From 439bc0ab61991cbfb86beaaa249ecf37894de21f Mon Sep 17 00:00:00 2001 From: lbarraga Date: Tue, 16 May 2023 10:04:21 +0200 Subject: [PATCH 07/18] changed sessions to feed in navbar --- .../navbar/NavigationBarComposable.kt | 10 +-- .../navbar/NavigationBarViewModel.kt | 4 +- .../be/ugent/sel/studeez/domain/SessionDAO.kt | 3 +- .../be/ugent/sel/studeez/domain/TaskDAO.kt | 2 + .../implementation/FirebaseSessionDAO.kt | 35 +++++----- .../domain/implementation/FirebaseTaskDAO.kt | 11 +++- .../sel/studeez/navigation/StudeezNavGraph.kt | 8 ++- .../screens/friends_feed/FriendsFeedScreen.kt | 65 +++++++++++++++++++ .../friends_feed/FriendsFeedViewModel.kt | 23 +++++++ .../screens/sessions/SessionsScreen.kt | 42 ------------ 10 files changed, 131 insertions(+), 72 deletions(-) create mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedScreen.kt create mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedViewModel.kt delete mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/sessions/SessionsScreen.kt diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/navbar/NavigationBarComposable.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/navbar/NavigationBarComposable.kt index c4d6e33..ecf26b0 100644 --- a/app/src/main/java/be/ugent/sel/studeez/common/composable/navbar/NavigationBarComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/navbar/NavigationBarComposable.kt @@ -8,13 +8,15 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Check import androidx.compose.material.icons.filled.List import androidx.compose.material.icons.filled.Person +import androidx.compose.material.icons.outlined.Check import androidx.compose.material.icons.outlined.DateRange +import androidx.compose.material.icons.outlined.Face import androidx.compose.runtime.Composable import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import be.ugent.sel.studeez.navigation.StudeezDestinations.FRIENDS_FEED 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.SUBJECT_SCREEN import be.ugent.sel.studeez.resources import be.ugent.sel.studeez.ui.theme.StudeezTheme @@ -99,11 +101,11 @@ fun NavigationBar( BottomNavigationItem( icon = { Icon( - imageVector = Icons.Outlined.DateRange, resources().getString(AppText.sessions) + imageVector = Icons.Outlined.Face, resources().getString(AppText.friends_feed) ) }, - label = { Text(text = resources().getString(AppText.sessions)) }, - selected = navigationBarActions.isSelectedTab(SESSIONS_SCREEN), + label = { Text(text = resources().getString(AppText.friends_feed)) }, + selected = navigationBarActions.isSelectedTab(FRIENDS_FEED), onClick = navigationBarActions.onSessionsClick ) diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/navbar/NavigationBarViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/navbar/NavigationBarViewModel.kt index 07a5bf9..3b8c142 100644 --- a/app/src/main/java/be/ugent/sel/studeez/common/composable/navbar/NavigationBarViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/navbar/NavigationBarViewModel.kt @@ -2,9 +2,9 @@ package be.ugent.sel.studeez.common.composable.navbar import be.ugent.sel.studeez.common.snackbar.SnackbarManager import be.ugent.sel.studeez.domain.LogService +import be.ugent.sel.studeez.navigation.StudeezDestinations.FRIENDS_FEED 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.SUBJECT_SCREEN import be.ugent.sel.studeez.screens.StudeezViewModel import dagger.hilt.android.lifecycle.HiltViewModel @@ -25,7 +25,7 @@ class NavigationBarViewModel @Inject constructor( } fun onSessionsClick(open: (String) -> Unit) { - open(SESSIONS_SCREEN) + open(FRIENDS_FEED) } fun onProfileClick(open: (String) -> Unit) { diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/SessionDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/SessionDAO.kt index bb233e9..53d6996 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/SessionDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/SessionDAO.kt @@ -2,6 +2,7 @@ package be.ugent.sel.studeez.domain import be.ugent.sel.studeez.data.local.models.SessionReport import be.ugent.sel.studeez.data.local.models.User +import be.ugent.sel.studeez.data.local.models.task.Task import be.ugent.sel.studeez.data.local.models.timer_info.TimerInfo import kotlinx.coroutines.flow.Flow @@ -13,7 +14,7 @@ interface SessionDAO { /** * Return a list of pairs, containing the username and all the studysessions of that user. */ - fun getFriendsSessions(): Flow>>> + fun getFriendsSessions(): Flow>>> fun saveSession(newSessionReport: SessionReport) diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/TaskDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/TaskDAO.kt index 8a2dd41..c27cf7d 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/TaskDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/TaskDAO.kt @@ -15,4 +15,6 @@ interface TaskDAO { fun deleteTask(oldTask: Task) suspend fun getTask(subjectId: String, taskId: String): Task + + suspend fun getTaskFromUser(subjectId: String, taskId: String, userId: String): Task } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseSessionDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseSessionDAO.kt index e7cb763..7072de6 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseSessionDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseSessionDAO.kt @@ -2,14 +2,12 @@ package be.ugent.sel.studeez.domain.implementation import be.ugent.sel.studeez.data.local.models.SessionReport import be.ugent.sel.studeez.data.local.models.User +import be.ugent.sel.studeez.data.local.models.task.Task import be.ugent.sel.studeez.data.local.models.timer_info.TimerInfo import be.ugent.sel.studeez.data.remote.FirebaseSessionReport import be.ugent.sel.studeez.data.remote.FirebaseSessionReport.ENDTIME import be.ugent.sel.studeez.data.remote.FirebaseSessionReport.STUDYTIME -import be.ugent.sel.studeez.domain.AccountDAO -import be.ugent.sel.studeez.domain.FriendshipDAO -import be.ugent.sel.studeez.domain.SessionDAO -import be.ugent.sel.studeez.domain.UserDAO +import be.ugent.sel.studeez.domain.* import be.ugent.sel.studeez.domain.implementation.FirebaseCollections.SESSION_COLLECTION import be.ugent.sel.studeez.domain.implementation.FirebaseCollections.USER_COLLECTION import com.google.firebase.Timestamp @@ -17,6 +15,7 @@ import com.google.firebase.firestore.CollectionReference import com.google.firebase.firestore.FirebaseFirestore import com.google.firebase.firestore.ktx.getField import com.google.firebase.firestore.ktx.snapshots +import com.google.firebase.firestore.ktx.toObject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.flow.map @@ -27,7 +26,8 @@ class FirebaseSessionDAO @Inject constructor( private val firestore: FirebaseFirestore, private val auth: AccountDAO, private val userDAO: UserDAO, - private val friendshipDAO: FriendshipDAO + private val friendshipDAO: FriendshipDAO, + private val taskDAO: TaskDAO, ) : SessionDAO { override fun getSessions(): Flow> { @@ -37,29 +37,28 @@ class FirebaseSessionDAO @Inject constructor( } override suspend fun getSessionsOfUser(userId: String): List { - val collection = firestore.collection(USER_COLLECTION) + return firestore.collection(USER_COLLECTION) .document(userId) .collection(SESSION_COLLECTION) .get().await() - val list: MutableList = mutableListOf() - for (document in collection) { - val id = document.id - val studyTime: Int = document.getField(STUDYTIME)!! - val endTime: Timestamp = document.getField(ENDTIME)!! - list.add(SessionReport(id, studyTime, endTime)) - } - return list + .map { it.toObject(SessionReport::class.java) } } - override fun getFriendsSessions(): Flow>>> { + override fun getFriendsSessions(): Flow>>> { return friendshipDAO.getAllFriendships(auth.currentUserId) .map { friendships -> friendships.map { friendship -> val userId: String = friendship.friendId val username = userDAO.getUsername(userId) - val userSessions = getSessionsOfUser(userId) - - Pair(username, userSessions) + val userTasks = getSessionsOfUser(userId) + .map { sessionReport -> + taskDAO.getTaskFromUser( + sessionReport.subjectId, + sessionReport.taskId, + userId + ) + } + Pair(username, userTasks) } } } diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseTaskDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseTaskDAO.kt index 93bc221..1ca60e4 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseTaskDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseTaskDAO.kt @@ -30,6 +30,13 @@ class FirebaseTaskDAO @Inject constructor( return selectedSubjectTasksCollection(subjectId).document(taskId).get().await().toObject()!! } + override suspend fun getTaskFromUser(subjectId: String, taskId: String, userId: String): Task { + return selectedSubjectTasksCollection(subjectId, userId) + .document(taskId) + .get() + .await().toObject(Task::class.java)!! + } + override fun saveTask(newTask: Task) { selectedSubjectTasksCollection(newTask.subjectId).add(newTask) } @@ -44,9 +51,9 @@ class FirebaseTaskDAO @Inject constructor( selectedSubjectTasksCollection(oldTask.subjectId).document(oldTask.id).delete() } - private fun selectedSubjectTasksCollection(subjectId: String): CollectionReference = + private fun selectedSubjectTasksCollection(subjectId: String, id: String = auth.currentUserId): CollectionReference = firestore.collection(FirebaseCollections.USER_COLLECTION) - .document(auth.currentUserId) + .document(id) .collection(FirebaseCollections.SUBJECT_COLLECTION) .document(subjectId) .collection(FirebaseCollections.TASK_COLLECTION) diff --git a/app/src/main/java/be/ugent/sel/studeez/navigation/StudeezNavGraph.kt b/app/src/main/java/be/ugent/sel/studeez/navigation/StudeezNavGraph.kt index 6b59abc..1953d03 100644 --- a/app/src/main/java/be/ugent/sel/studeez/navigation/StudeezNavGraph.kt +++ b/app/src/main/java/be/ugent/sel/studeez/navigation/StudeezNavGraph.kt @@ -16,6 +16,8 @@ import be.ugent.sel.studeez.common.composable.navbar.NavigationBarViewModel import be.ugent.sel.studeez.common.composable.navbar.getNavigationBarActions import be.ugent.sel.studeez.screens.friends.friends_overview.FriendsOveriewRoute import be.ugent.sel.studeez.screens.friends.friends_search.SearchFriendsRoute +import be.ugent.sel.studeez.screens.friends_feed.FriendsFeedRoute +import be.ugent.sel.studeez.screens.friends_feed.FriendsFeedScreen import be.ugent.sel.studeez.screens.home.HomeRoute import be.ugent.sel.studeez.screens.log_in.LoginRoute import be.ugent.sel.studeez.screens.profile.edit_profile.EditProfileRoute @@ -23,7 +25,6 @@ import be.ugent.sel.studeez.screens.profile.ProfileRoute import be.ugent.sel.studeez.screens.profile.public_profile.PublicProfileRoute 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 @@ -127,9 +128,10 @@ fun StudeezNavGraph( composable(StudeezDestinations.SESSIONS_SCREEN) { - SessionsRoute( + FriendsFeedRoute( drawerActions = drawerActions, - navigationBarActions = navigationBarActions + navigationBarActions = navigationBarActions, + viewModel = hiltViewModel() ) } diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedScreen.kt new file mode 100644 index 0000000..62e7050 --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedScreen.kt @@ -0,0 +1,65 @@ +package be.ugent.sel.studeez.screens.friends_feed + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material.Divider +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import be.ugent.sel.studeez.common.composable.PrimaryScreenTemplate +import be.ugent.sel.studeez.common.composable.TimerEntry +import be.ugent.sel.studeez.common.composable.drawer.DrawerActions +import be.ugent.sel.studeez.common.composable.navbar.NavigationBarActions +import be.ugent.sel.studeez.data.local.models.SessionReport +import be.ugent.sel.studeez.data.local.models.task.Task +import be.ugent.sel.studeez.data.local.models.timer_functional.HoursMinutesSeconds +import be.ugent.sel.studeez.resources +import be.ugent.sel.studeez.R.string as AppText + +@Composable +fun FriendsFeedRoute( + viewModel: FriendsFeedViewModel, + drawerActions: DrawerActions, + navigationBarActions: NavigationBarActions +) { + FriendsFeedScreen( + drawerActions = drawerActions, + navigationBarActions = navigationBarActions, + viewModel = viewModel + ) +} + +@Composable +fun FriendsFeedScreen( + drawerActions: DrawerActions, + navigationBarActions: NavigationBarActions, + viewModel: FriendsFeedViewModel +) { + PrimaryScreenTemplate( + title = resources().getString(AppText.upcoming_sessions), + drawerActions = drawerActions, + navigationBarActions = navigationBarActions + ) { + + val friendsSessions = viewModel.getFriendsSessions().collectAsState(initial = emptyList()) + LazyColumn() { + // Default Timers, cannot be edited + items(friendsSessions.value) { + FriendsFeedEntry(name = it.first, sessions = it.second) + Divider() + } + } + + } +} + +@Composable +fun FriendsFeedEntry(name: String, sessions: List) { + Column() { + Text(text = "$name Werkte ") + sessions.forEach { + Text(text = "${HoursMinutesSeconds(it.time)} aan ${it.name}") + } + } +} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedViewModel.kt new file mode 100644 index 0000000..6426161 --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedViewModel.kt @@ -0,0 +1,23 @@ +package be.ugent.sel.studeez.screens.friends_feed + +import be.ugent.sel.studeez.data.local.models.task.Task +import be.ugent.sel.studeez.domain.LogService +import be.ugent.sel.studeez.domain.SessionDAO +import be.ugent.sel.studeez.screens.StudeezViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.Flow +import javax.inject.Inject + +@HiltViewModel +class FriendsFeedViewModel @Inject constructor( + private val sessionDAO: SessionDAO, + logService: LogService +) : StudeezViewModel(logService) { + + fun getFriendsSessions(): Flow>>> { + return sessionDAO.getFriendsSessions() + } + + +} + diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/sessions/SessionsScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/sessions/SessionsScreen.kt deleted file mode 100644 index fe60ca8..0000000 --- a/app/src/main/java/be/ugent/sel/studeez/screens/sessions/SessionsScreen.kt +++ /dev/null @@ -1,42 +0,0 @@ -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 - ) - } -} \ No newline at end of file From 4d2abaec12ede44cdab4938f93f405d2a7610231 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Tue, 16 May 2023 10:04:50 +0200 Subject: [PATCH 08/18] changed dateText to Medium instead of bold --- .../be/ugent/sel/studeez/common/composable/TextComposable.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 25fa3c4..425d8f6 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 @@ -32,7 +32,7 @@ fun Headline( fun DateText(date: String) { Text( text = date, - fontWeight = FontWeight.Bold, + fontWeight = FontWeight.Medium, fontSize = 20.sp, modifier = Modifier.padding(horizontal = 10.dp) ) From 43b46dd4a15318e4e19f2d593b27677b428898c3 Mon Sep 17 00:00:00 2001 From: lbarraga Date: Tue, 16 May 2023 10:05:37 +0200 Subject: [PATCH 09/18] changed some DAOs to take ids and added a friends feed getter --- .../be/ugent/sel/studeez/domain/FeedDAO.kt | 3 + .../be/ugent/sel/studeez/domain/SessionDAO.kt | 6 +- .../be/ugent/sel/studeez/domain/SubjectDAO.kt | 1 + .../domain/implementation/FirebaseFeedDAO.kt | 66 +++++++++++++++++-- .../implementation/FirebaseSessionDAO.kt | 22 +------ .../implementation/FirebaseSubjectDAO.kt | 13 ++-- 6 files changed, 75 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/FeedDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/FeedDAO.kt index 2d91781..e9e95b9 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/FeedDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/FeedDAO.kt @@ -7,4 +7,7 @@ interface FeedDAO { fun getFeedEntries(): Flow>> + suspend fun getFeedEntriesFromUser(id: String): Map> + + fun getFriendsSessions(): Flow>>> } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/SessionDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/SessionDAO.kt index 53d6996..4ac2891 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/SessionDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/SessionDAO.kt @@ -1,5 +1,6 @@ package be.ugent.sel.studeez.domain +import be.ugent.sel.studeez.data.local.models.FeedEntry import be.ugent.sel.studeez.data.local.models.SessionReport import be.ugent.sel.studeez.data.local.models.User import be.ugent.sel.studeez.data.local.models.task.Task @@ -11,11 +12,6 @@ interface SessionDAO { fun getSessions(): Flow> suspend fun getSessionsOfUser(userId: String): List - /** - * Return a list of pairs, containing the username and all the studysessions of that user. - */ - fun getFriendsSessions(): Flow>>> - fun saveSession(newSessionReport: SessionReport) fun deleteSession(newTimer: TimerInfo) diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/SubjectDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/SubjectDAO.kt index d887ef5..7b89bba 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/SubjectDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/SubjectDAO.kt @@ -20,4 +20,5 @@ interface SubjectDAO { fun getStudyTime(subject: Subject): Flow suspend fun getSubject(subjectId: String): Subject? + suspend fun getSubjectOfUSer(subjectId: String, userId: String): Subject } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseFeedDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseFeedDAO.kt index 6c445bf..be4893d 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseFeedDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseFeedDAO.kt @@ -5,19 +5,19 @@ import be.ugent.sel.studeez.data.local.models.FeedEntry import be.ugent.sel.studeez.data.local.models.SessionReport import be.ugent.sel.studeez.data.local.models.task.Subject import be.ugent.sel.studeez.data.local.models.task.Task -import be.ugent.sel.studeez.domain.FeedDAO -import be.ugent.sel.studeez.domain.SessionDAO -import be.ugent.sel.studeez.domain.SubjectDAO -import be.ugent.sel.studeez.domain.TaskDAO +import be.ugent.sel.studeez.domain.* import com.google.firebase.Timestamp import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import javax.inject.Inject class FirebaseFeedDAO @Inject constructor( + private val friendshipDAO: FriendshipDAO, private val sessionDAO: SessionDAO, private val taskDAO: TaskDAO, - private val subjectDAO: SubjectDAO + private val subjectDAO: SubjectDAO, + private val auth: AccountDAO, + private val userDAO: UserDAO, ) : FeedDAO { /** @@ -37,6 +37,45 @@ class FirebaseFeedDAO @Inject constructor( } } + /** + * Return a map as with key the day and value a list of feedentries for that day. + */ + override suspend fun getFeedEntriesFromUser(id: String): Map> { + return sessionDAO.getSessionsOfUser(id) + .map { sessionReport -> sessionToFeedEntryFromUser(sessionReport, id) } + .sortedByDescending { it.endTime } + .groupBy { getFormattedTime(it) } + .mapValues { (_, entries) -> + entries + .groupBy { it.taskId } + .map { fuseFeedEntries(it.component2()) } + } + } + + override fun getFriendsSessions(): Flow>>> { + return friendshipDAO.getAllFriendships(auth.currentUserId) + .map { friendships -> + friendships.map { friendship -> + val userId: String = friendship.friendId + val username = userDAO.getUsername(userId) + val friendFeed = getFeedEntriesFromUser(userId) + Pair(username, friendFeed) + } + }.map { + mergeNameAndEntries(it) + } + } + + private fun mergeNameAndEntries(l: List>>>): Map>> { + val new: MutableMap>> = mutableMapOf() + for ((name, map) in l) { + for ((day, feedEntries: List) in map) { + new[day] = new.getOrDefault(day, listOf()) + feedEntries.map { Pair(name, it) } + } + } + return new + } + private fun getFormattedTime(entry: FeedEntry): String { return DateFormat.getDateInstance().format(entry.endTime.toDate()) } @@ -67,6 +106,10 @@ class FirebaseFeedDAO @Inject constructor( val task: Task = taskDAO.getTask(subjectId, taskId) val subject: Subject = subjectDAO.getSubject(subjectId)!! + return makeFeedEntry(sessionReport, subject, task) + } + + private fun makeFeedEntry(sessionReport: SessionReport, subject: Subject, task: Task): FeedEntry { return FeedEntry( argb_color = subject.argb_color, subJectName = subject.name, @@ -78,4 +121,17 @@ class FirebaseFeedDAO @Inject constructor( isArchived = task.archived || subject.archived ) } + + /** + * Convert a sessionReport to a feedEntry. Fetch Task and Subject to get names + */ + private suspend fun sessionToFeedEntryFromUser(sessionReport: SessionReport, id: String): FeedEntry { + val subjectId: String = sessionReport.subjectId + val taskId: String = sessionReport.taskId + + val task: Task = taskDAO.getTaskFromUser(subjectId, taskId, id) + val subject: Subject = subjectDAO.getSubjectOfUSer(subjectId, id) + + return makeFeedEntry(sessionReport, subject, task) + } } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseSessionDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseSessionDAO.kt index 7072de6..df271c6 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseSessionDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseSessionDAO.kt @@ -1,5 +1,6 @@ package be.ugent.sel.studeez.domain.implementation +import be.ugent.sel.studeez.data.local.models.FeedEntry import be.ugent.sel.studeez.data.local.models.SessionReport import be.ugent.sel.studeez.data.local.models.User import be.ugent.sel.studeez.data.local.models.task.Task @@ -25,9 +26,6 @@ import javax.inject.Inject class FirebaseSessionDAO @Inject constructor( private val firestore: FirebaseFirestore, private val auth: AccountDAO, - private val userDAO: UserDAO, - private val friendshipDAO: FriendshipDAO, - private val taskDAO: TaskDAO, ) : SessionDAO { override fun getSessions(): Flow> { @@ -44,24 +42,6 @@ class FirebaseSessionDAO @Inject constructor( .map { it.toObject(SessionReport::class.java) } } - override fun getFriendsSessions(): Flow>>> { - return friendshipDAO.getAllFriendships(auth.currentUserId) - .map { friendships -> - friendships.map { friendship -> - val userId: String = friendship.friendId - val username = userDAO.getUsername(userId) - val userTasks = getSessionsOfUser(userId) - .map { sessionReport -> - taskDAO.getTaskFromUser( - sessionReport.subjectId, - sessionReport.taskId, - userId - ) - } - Pair(username, userTasks) - } - } - } override fun saveSession(newSessionReport: SessionReport) { currentUserSessionsCollection().add(newSessionReport) diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseSubjectDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseSubjectDAO.kt index f1571d7..65c11a5 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseSubjectDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseSubjectDAO.kt @@ -1,6 +1,5 @@ package be.ugent.sel.studeez.domain.implementation -import android.util.Log import be.ugent.sel.studeez.data.local.models.task.Subject import be.ugent.sel.studeez.data.local.models.task.SubjectDocument import be.ugent.sel.studeez.data.local.models.task.Task @@ -35,6 +34,10 @@ class FirebaseSubjectDAO @Inject constructor( return currentUserSubjectsCollection().document(subjectId).get().await().toObject() } + override suspend fun getSubjectOfUSer(subjectId: String, userId: String): Subject { + return currentUserSubjectsCollection(userId).document(subjectId).get().await().toObject()!! + } + override fun saveSubject(newSubject: Subject) { currentUserSubjectsCollection().add(newSubject) } @@ -74,14 +77,14 @@ class FirebaseSubjectDAO @Inject constructor( .map { tasks -> tasks.sumOf { it.time } } } - private fun currentUserSubjectsCollection(): CollectionReference = + private fun currentUserSubjectsCollection(id: String = auth.currentUserId): CollectionReference = firestore.collection(FirebaseCollections.USER_COLLECTION) - .document(auth.currentUserId) + .document(id) .collection(FirebaseCollections.SUBJECT_COLLECTION) - private fun subjectTasksCollection(subject: Subject): CollectionReference = + private fun subjectTasksCollection(subject: Subject, id: String = auth.currentUserId): CollectionReference = firestore.collection(FirebaseCollections.USER_COLLECTION) - .document(auth.currentUserId) + .document(id) .collection(FirebaseCollections.SUBJECT_COLLECTION) .document(subject.id) .collection(FirebaseCollections.TASK_COLLECTION) From bd9fce4418fa615ed3f46a58d0af2ed4dd709adf Mon Sep 17 00:00:00 2001 From: lbarraga Date: Tue, 16 May 2023 10:06:04 +0200 Subject: [PATCH 10/18] changed sessions to feed --- .../java/be/ugent/sel/studeez/navigation/StudeezDestinations.kt | 2 +- .../java/be/ugent/sel/studeez/navigation/StudeezNavGraph.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 578c74a..32ad7ff 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,7 +4,7 @@ object StudeezDestinations { // NavBar const val HOME_SCREEN = "home" const val SUBJECT_SCREEN = "subjects" - const val SESSIONS_SCREEN = "sessions" + const val FRIENDS_FEED = "friends_feed" const val PROFILE_SCREEN = "profile" // Drawer diff --git a/app/src/main/java/be/ugent/sel/studeez/navigation/StudeezNavGraph.kt b/app/src/main/java/be/ugent/sel/studeez/navigation/StudeezNavGraph.kt index 1953d03..067896e 100644 --- a/app/src/main/java/be/ugent/sel/studeez/navigation/StudeezNavGraph.kt +++ b/app/src/main/java/be/ugent/sel/studeez/navigation/StudeezNavGraph.kt @@ -127,7 +127,7 @@ fun StudeezNavGraph( } - composable(StudeezDestinations.SESSIONS_SCREEN) { + composable(StudeezDestinations.FRIENDS_FEED) { FriendsFeedRoute( drawerActions = drawerActions, navigationBarActions = navigationBarActions, From f5ae4f157cb8e2d6c180d1f9cecf7c49ce4dfa1f Mon Sep 17 00:00:00 2001 From: lbarraga Date: Tue, 16 May 2023 10:06:24 +0200 Subject: [PATCH 11/18] implemented friends feed --- .../screens/friends_feed/FriendsFeedScreen.kt | 87 +++++++++++++++++-- .../friends_feed/FriendsFeedViewModel.kt | 10 ++- 2 files changed, 85 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedScreen.kt index 62e7050..ced14b3 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedScreen.kt @@ -1,20 +1,36 @@ package be.ugent.sel.studeez.screens.friends_feed -import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.Card import androidx.compose.material.Divider import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import be.ugent.sel.studeez.common.composable.DateText import be.ugent.sel.studeez.common.composable.PrimaryScreenTemplate +import be.ugent.sel.studeez.common.composable.StealthButton import be.ugent.sel.studeez.common.composable.TimerEntry import be.ugent.sel.studeez.common.composable.drawer.DrawerActions import be.ugent.sel.studeez.common.composable.navbar.NavigationBarActions +import be.ugent.sel.studeez.common.ext.spacer +import be.ugent.sel.studeez.data.local.models.FeedEntry import be.ugent.sel.studeez.data.local.models.SessionReport import be.ugent.sel.studeez.data.local.models.task.Task import be.ugent.sel.studeez.data.local.models.timer_functional.HoursMinutesSeconds import be.ugent.sel.studeez.resources +import kotlinx.coroutines.flow.toList import be.ugent.sel.studeez.R.string as AppText @Composable @@ -37,17 +53,25 @@ fun FriendsFeedScreen( viewModel: FriendsFeedViewModel ) { PrimaryScreenTemplate( - title = resources().getString(AppText.upcoming_sessions), + title = resources().getString(AppText.friends_feed), drawerActions = drawerActions, navigationBarActions = navigationBarActions ) { val friendsSessions = viewModel.getFriendsSessions().collectAsState(initial = emptyList()) + + + + LazyColumn() { // Default Timers, cannot be edited items(friendsSessions.value) { - FriendsFeedEntry(name = it.first, sessions = it.second) - Divider() + val (day, feedEntries) = it + DateText(date = day) + feedEntries.forEach { (name, feedEntry) -> + FriendsFeedEntry(name = name, feedEntry = feedEntry) + } + Spacer(modifier = Modifier.height(10.dp)) } } @@ -55,11 +79,56 @@ fun FriendsFeedScreen( } @Composable -fun FriendsFeedEntry(name: String, sessions: List) { - Column() { - Text(text = "$name Werkte ") - sessions.forEach { - Text(text = "${HoursMinutesSeconds(it.time)} aan ${it.name}") +fun FriendsFeedEntry( + name: String, + feedEntry: FeedEntry +) { + Card( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 10.dp, vertical = 5.dp), + ) { + Row( + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically, + ) { + Row( + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .padding(start = 10.dp) + .weight(11f) + ) { + Box( + modifier = Modifier + .size(20.dp) + .clip(CircleShape) + .background(Color(feedEntry.argb_color)), + ) + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically, + ) { + Column( + verticalArrangement = Arrangement.spacedBy(0.dp) + ) { + Text( + text = "$name studied for ${feedEntry.subJectName}", + fontWeight = FontWeight.Medium, + overflow = TextOverflow.Ellipsis, + maxLines = 1, + ) + Text( + text = feedEntry.taskName, + overflow = TextOverflow.Ellipsis, + maxLines = 1, + ) + } + Text(text = HoursMinutesSeconds(feedEntry.totalStudyTime).toString()) + } + } + } } } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedViewModel.kt index 6426161..d4ae2dc 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedViewModel.kt @@ -1,21 +1,25 @@ package be.ugent.sel.studeez.screens.friends_feed +import be.ugent.sel.studeez.data.local.models.FeedEntry import be.ugent.sel.studeez.data.local.models.task.Task +import be.ugent.sel.studeez.domain.FeedDAO import be.ugent.sel.studeez.domain.LogService import be.ugent.sel.studeez.domain.SessionDAO import be.ugent.sel.studeez.screens.StudeezViewModel import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.toList import javax.inject.Inject @HiltViewModel class FriendsFeedViewModel @Inject constructor( - private val sessionDAO: SessionDAO, + private val feedDAO: FeedDAO, logService: LogService ) : StudeezViewModel(logService) { - fun getFriendsSessions(): Flow>>> { - return sessionDAO.getFriendsSessions() + fun getFriendsSessions(): Flow>>>> { + return feedDAO.getFriendsSessions().map { it.toList() } } From c61853b8bd7a98bf7965103be7259b0d01b6accc Mon Sep 17 00:00:00 2001 From: lbarraga Date: Tue, 16 May 2023 10:06:46 +0200 Subject: [PATCH 12/18] added friends feed string resources --- app/src/main/res/values/strings.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f7d2666..2f8896b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -36,6 +36,9 @@ This is your feed Click here to create you first subject and tasks to get started + + Feed + Tasks Task From a3c0359edd6d1152fea88659fe81e08b968e81ef Mon Sep 17 00:00:00 2001 From: brreynie Date: Tue, 16 May 2023 11:15:07 +0200 Subject: [PATCH 13/18] fix import --- .../studeez/common/composable/navbar/NavigationBarViewModel.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/navbar/NavigationBarViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/navbar/NavigationBarViewModel.kt index bea755d..336ad69 100644 --- a/app/src/main/java/be/ugent/sel/studeez/common/composable/navbar/NavigationBarViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/navbar/NavigationBarViewModel.kt @@ -7,7 +7,6 @@ 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.SEARCH_FRIENDS_SCREEN import be.ugent.sel.studeez.navigation.StudeezDestinations.SELECT_SUBJECT -import be.ugent.sel.studeez.navigation.StudeezDestinations.SESSIONS_SCREEN import be.ugent.sel.studeez.navigation.StudeezDestinations.SUBJECT_SCREEN import be.ugent.sel.studeez.screens.StudeezViewModel import dagger.hilt.android.lifecycle.HiltViewModel From 6989f3c80696fdf9ab1fc9d997ece3215cca99d0 Mon Sep 17 00:00:00 2001 From: brreynie Date: Tue, 16 May 2023 11:34:13 +0200 Subject: [PATCH 14/18] refactor friends feed to use uiState.Loading --- .../screens/friends_feed/FriendsFeedScreen.kt | 128 ++++++++++++++++++ .../friends_feed/FriendsFeedUiState.kt | 10 ++ .../friends_feed/FriendsFeedViewModel.kt | 29 ++++ 3 files changed, 167 insertions(+) create mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedScreen.kt create mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedUiState.kt create mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedViewModel.kt diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedScreen.kt new file mode 100644 index 0000000..b5d0ca1 --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedScreen.kt @@ -0,0 +1,128 @@ +package be.ugent.sel.studeez.screens.friends_feed + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.Card +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import be.ugent.sel.studeez.common.composable.DateText +import be.ugent.sel.studeez.common.composable.PrimaryScreenTemplate +import be.ugent.sel.studeez.common.composable.drawer.DrawerActions +import be.ugent.sel.studeez.common.composable.feed.LoadingFeed +import be.ugent.sel.studeez.common.composable.navbar.NavigationBarActions +import be.ugent.sel.studeez.data.local.models.FeedEntry +import be.ugent.sel.studeez.data.local.models.timer_functional.HoursMinutesSeconds +import be.ugent.sel.studeez.resources +import be.ugent.sel.studeez.R.string as AppText + +@Composable +fun FriendsFeedRoute( + viewModel: FriendsFeedViewModel, + drawerActions: DrawerActions, + navigationBarActions: NavigationBarActions +) { + val friendsFeedUiState by viewModel.uiState.collectAsState() + FriendsFeedScreen( + drawerActions = drawerActions, + navigationBarActions = navigationBarActions, + uiState = friendsFeedUiState, + ) +} + +@Composable +fun FriendsFeedScreen( + drawerActions: DrawerActions, + navigationBarActions: NavigationBarActions, + uiState: FriendsFeedUiState, +) { + PrimaryScreenTemplate( + title = resources().getString(AppText.friends_feed), + drawerActions = drawerActions, + navigationBarActions = navigationBarActions + ) { + when (uiState) { + FriendsFeedUiState.Loading -> LoadingFeed() + is FriendsFeedUiState.Succes -> { + val friendsSessions = uiState.friendSessions + LazyColumn() { + // Default Timers, cannot be edited + items(friendsSessions) { + val (day, feedEntries) = it + DateText(date = day) + feedEntries.forEach { (name, feedEntry) -> + FriendsFeedEntry(name = name, feedEntry = feedEntry) + } + Spacer(modifier = Modifier.height(10.dp)) + } + } + } + } + } +} + +@Composable +fun FriendsFeedEntry( + name: String, + feedEntry: FeedEntry +) { + Card( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 10.dp, vertical = 5.dp), + ) { + Row( + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically, + ) { + Row( + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .padding(start = 10.dp) + .weight(11f) + ) { + Box( + modifier = Modifier + .size(20.dp) + .clip(CircleShape) + .background(Color(feedEntry.argb_color)), + ) + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically, + ) { + Column( + verticalArrangement = Arrangement.spacedBy(0.dp) + ) { + Text( + text = "$name studied for ${feedEntry.subJectName}", + fontWeight = FontWeight.Medium, + overflow = TextOverflow.Ellipsis, + maxLines = 1, + ) + Text( + text = feedEntry.taskName, + overflow = TextOverflow.Ellipsis, + maxLines = 1, + ) + } + Text(text = HoursMinutesSeconds(feedEntry.totalStudyTime).toString()) + } + } + + } + } +} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedUiState.kt b/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedUiState.kt new file mode 100644 index 0000000..a95e19f --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedUiState.kt @@ -0,0 +1,10 @@ +package be.ugent.sel.studeez.screens.friends_feed + +import be.ugent.sel.studeez.data.local.models.FeedEntry + +sealed interface FriendsFeedUiState { + object Loading : FriendsFeedUiState + data class Succes( + val friendSessions: List>>>, + ) : FriendsFeedUiState +} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedViewModel.kt new file mode 100644 index 0000000..5f01c40 --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedViewModel.kt @@ -0,0 +1,29 @@ +package be.ugent.sel.studeez.screens.friends_feed + +import androidx.lifecycle.viewModelScope +import be.ugent.sel.studeez.domain.FeedDAO +import be.ugent.sel.studeez.domain.LogService +import be.ugent.sel.studeez.screens.StudeezViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +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 FriendsFeedViewModel @Inject constructor( + private val feedDAO: FeedDAO, + logService: LogService +) : StudeezViewModel(logService) { + + val uiState: StateFlow = feedDAO.getFriendsSessions() + .map { it.toList() } + .map { FriendsFeedUiState.Succes(it) } + .stateIn( + scope = viewModelScope, + initialValue = FriendsFeedUiState.Loading, + started = SharingStarted.Eagerly, + ) +} + From 8f3d356502ecc0222384ed50196cf957199ed63a Mon Sep 17 00:00:00 2001 From: brreynie Date: Tue, 16 May 2023 11:52:17 +0200 Subject: [PATCH 15/18] fix elipsis not showing on feeds --- .../ugent/sel/studeez/common/composable/feed/FeedEntry.kt | 8 ++++++-- .../sel/studeez/screens/friends_feed/FriendsFeedScreen.kt | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/feed/FeedEntry.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/feed/FeedEntry.kt index 016090d..465fda2 100644 --- a/app/src/main/java/be/ugent/sel/studeez/common/composable/feed/FeedEntry.kt +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/feed/FeedEntry.kt @@ -52,7 +52,8 @@ fun FeedEntry( verticalAlignment = Alignment.CenterVertically, ) { Column( - verticalArrangement = Arrangement.spacedBy(0.dp) + verticalArrangement = Arrangement.spacedBy(0.dp), + modifier = Modifier.weight(13f) ) { Text( text = feedEntry.subJectName, @@ -66,7 +67,10 @@ fun FeedEntry( maxLines = 1, ) } - Text(text = HoursMinutesSeconds(feedEntry.totalStudyTime).toString()) + Text( + text = HoursMinutesSeconds(feedEntry.totalStudyTime).toString(), + modifier = Modifier.weight(6f), + ) } } val buttonText: Int = diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedScreen.kt index 7aab92a..36bb57e 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedScreen.kt @@ -103,7 +103,8 @@ fun FriendsFeedEntry( verticalAlignment = Alignment.CenterVertically, ) { Column( - verticalArrangement = Arrangement.spacedBy(0.dp) + verticalArrangement = Arrangement.spacedBy(0.dp), + modifier = Modifier.weight(10f), ) { Text( text = "$name studied for ${feedEntry.subJectName}", @@ -117,7 +118,10 @@ fun FriendsFeedEntry( maxLines = 1, ) } - Text(text = HoursMinutesSeconds(feedEntry.totalStudyTime).toString()) + Text( + text = HoursMinutesSeconds(feedEntry.totalStudyTime).toString(), + modifier = Modifier.weight(3f).padding(start = 5.dp), + ) } } From cefa85ae224afcba9d13479306d6c0af2f91ebb3 Mon Sep 17 00:00:00 2001 From: brreynie Date: Tue, 16 May 2023 11:57:49 +0200 Subject: [PATCH 16/18] refix friendFeed loading --- .../screens/friends_feed/FriendsFeedScreen.kt | 43 ++++++++++--------- .../friends_feed/FriendsFeedViewModel.kt | 25 ++++++----- 2 files changed, 37 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedScreen.kt index 36bb57e..7ddef78 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedScreen.kt @@ -9,6 +9,7 @@ import androidx.compose.material.Card import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -19,6 +20,7 @@ import androidx.compose.ui.unit.dp import be.ugent.sel.studeez.common.composable.DateText import be.ugent.sel.studeez.common.composable.PrimaryScreenTemplate import be.ugent.sel.studeez.common.composable.drawer.DrawerActions +import be.ugent.sel.studeez.common.composable.feed.LoadingFeed import be.ugent.sel.studeez.common.composable.navbar.NavigationBarActions import be.ugent.sel.studeez.data.local.models.FeedEntry import be.ugent.sel.studeez.data.local.models.timer_functional.HoursMinutesSeconds @@ -31,10 +33,11 @@ fun FriendsFeedRoute( drawerActions: DrawerActions, navigationBarActions: NavigationBarActions ) { + val uiState by viewModel.uiState.collectAsState() FriendsFeedScreen( drawerActions = drawerActions, navigationBarActions = navigationBarActions, - viewModel = viewModel + uiState = uiState, ) } @@ -42,38 +45,37 @@ fun FriendsFeedRoute( fun FriendsFeedScreen( drawerActions: DrawerActions, navigationBarActions: NavigationBarActions, - viewModel: FriendsFeedViewModel + uiState: FriendsFeedUiState, ) { PrimaryScreenTemplate( title = resources().getString(AppText.friends_feed), drawerActions = drawerActions, navigationBarActions = navigationBarActions ) { + when (uiState) { + FriendsFeedUiState.Loading -> LoadingFeed() + is FriendsFeedUiState.Succes -> { + val friendsSessions = uiState.friendSessions - val friendsSessions = viewModel.getFriendsSessions().collectAsState(initial = emptyList()) - - - - - LazyColumn() { - // Default Timers, cannot be edited - items(friendsSessions.value) { - val (day, feedEntries) = it - DateText(date = day) - feedEntries.forEach { (name, feedEntry) -> - FriendsFeedEntry(name = name, feedEntry = feedEntry) + LazyColumn { + // Default Timers, cannot be edited + items(friendsSessions) { + val (day, feedEntries) = it + DateText(date = day) + feedEntries.forEach { (name, feedEntry) -> + FriendsFeedEntry(name = name, feedEntry = feedEntry) + } + Spacer(modifier = Modifier.height(10.dp)) + } } - Spacer(modifier = Modifier.height(10.dp)) } } - } } @Composable fun FriendsFeedEntry( - name: String, - feedEntry: FeedEntry + name: String, feedEntry: FeedEntry ) { Card( modifier = Modifier @@ -120,11 +122,12 @@ fun FriendsFeedEntry( } Text( text = HoursMinutesSeconds(feedEntry.totalStudyTime).toString(), - modifier = Modifier.weight(3f).padding(start = 5.dp), + modifier = Modifier + .weight(3f) + .padding(start = 5.dp), ) } } - } } } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedViewModel.kt index d4ae2dc..5db5e4a 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/friends_feed/FriendsFeedViewModel.kt @@ -1,27 +1,30 @@ package be.ugent.sel.studeez.screens.friends_feed -import be.ugent.sel.studeez.data.local.models.FeedEntry -import be.ugent.sel.studeez.data.local.models.task.Task +import androidx.lifecycle.viewModelScope import be.ugent.sel.studeez.domain.FeedDAO import be.ugent.sel.studeez.domain.LogService -import be.ugent.sel.studeez.domain.SessionDAO import be.ugent.sel.studeez.screens.StudeezViewModel import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.toList +import kotlinx.coroutines.flow.stateIn import javax.inject.Inject @HiltViewModel class FriendsFeedViewModel @Inject constructor( - private val feedDAO: FeedDAO, + feedDAO: FeedDAO, logService: LogService ) : StudeezViewModel(logService) { - fun getFriendsSessions(): Flow>>>> { - return feedDAO.getFriendsSessions().map { it.toList() } - } - - + val uiState: StateFlow = + feedDAO.getFriendsSessions() + .map { it.toList() } + .map { FriendsFeedUiState.Succes(it) } + .stateIn( + scope = viewModelScope, + initialValue = FriendsFeedUiState.Loading, + started = SharingStarted.Eagerly, + ) } From 62bca72d0f28925f3a05c86377d3566a43d61384 Mon Sep 17 00:00:00 2001 From: brreynie Date: Tue, 16 May 2023 11:59:40 +0200 Subject: [PATCH 17/18] optimize imports and format code for all files :) --- .../common/composable/ButtonComposable.kt | 2 +- .../composable/DrawerScreenComposable.kt | 44 +++++++++-------- .../FloatingActionButtonComposable.kt | 16 +++--- .../composable/PrimaryScreenComposable.kt | 14 ++++-- .../composable/SecondaryScreenComposable.kt | 36 ++++++++------ .../composable/SimpleScreenComposable.kt | 2 +- .../common/composable/TextComposable.kt | 2 +- .../common/composable/TextFieldComposable.kt | 13 +++-- .../composable/TimePickerButtonComposable.kt | 6 ++- .../composable/drawer/DrawerComposable.kt | 7 +-- .../composable/drawer/DrawerViewModel.kt | 2 - .../navbar/NavigationBarComposable.kt | 2 - .../sel/studeez/common/ext/ModifierExt.kt | 20 ++++++-- .../ugent/sel/studeez/data/SelectedState.kt | 2 +- .../timer_functional/HoursMinutesSeconds.kt | 2 +- .../models/timer_info/CustomTimerInfo.kt | 4 +- .../models/timer_info/EndlessTimerInfo.kt | 4 +- .../models/timer_info/PomodoroTimerInfo.kt | 5 +- .../be/ugent/sel/studeez/domain/SessionDAO.kt | 3 -- .../be/ugent/sel/studeez/domain/TimerDAO.kt | 1 - .../FirebaseConfigurationService.kt | 4 +- .../domain/implementation/FirebaseFeedDAO.kt | 29 ++++++----- .../implementation/FirebaseFriendshipDAO.kt | 27 +++++----- .../implementation/FirebaseSessionDAO.kt | 13 +---- .../implementation/FirebaseSubjectDAO.kt | 5 +- .../domain/implementation/FirebaseTaskDAO.kt | 5 +- .../domain/implementation/FirebaseTimerDAO.kt | 5 +- .../domain/implementation/FirebaseUserDAO.kt | 10 ++-- .../domain/implementation/ToTimerConverter.kt | 49 +++++++++++-------- .../sel/studeez/navigation/StudeezNavGraph.kt | 7 ++- .../friends_overview/FriendsOverviewScreen.kt | 42 +++++++++------- .../FriendsOverviewViewModel.kt | 12 +++-- .../friends_search/SearchFriendsScreen.kt | 40 +++++++++------ .../friends_search/SearchFriendsViewModel.kt | 2 +- .../sel/studeez/screens/home/HomeViewModel.kt | 1 + .../studeez/screens/profile/ProfileScreen.kt | 5 +- .../profile/edit_profile/ProfileEditScreen.kt | 2 +- .../edit_profile/ProfileEditUiState.kt | 2 +- .../public_profile/PublicProfileScreen.kt | 20 +++++--- .../public_profile/PublicProfileViewModel.kt | 2 +- .../studeez/screens/session/SessionRoute.kt | 3 +- .../studeez/screens/session/SoundPlayer.kt | 2 +- .../BreakTimerScreenComposable.kt | 14 +++--- .../GetSessionScreenComposable.kt | 5 +- .../sessionScreens/SessionScreenComposable.kt | 4 +- .../session_recap/SessionRecapScreen.kt | 8 +-- .../screens/sign_up/SignUpViewModel.kt | 3 +- .../studeez/screens/splash/SplashViewModel.kt | 2 +- .../screens/timer_form/GetTimerFormScreen.kt | 2 +- .../screens/timer_form/TimerFormScreen.kt | 6 +-- .../form_screens/BreakTimerFormScreen.kt | 5 +- .../form_screens/CustomTimerFormScreen.kt | 2 +- .../form_screens/EndlessTimerFormScreen.kt | 2 +- .../TimerTypeSelectScreen.kt | 4 +- .../timer_overview/TimerOverviewScreen.kt | 12 +++-- .../be/ugent/sel/studeez/ui/theme/Color.kt | 6 +-- 56 files changed, 310 insertions(+), 239 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/ButtonComposable.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/ButtonComposable.kt index be799d2..aa52209 100644 --- a/app/src/main/java/be/ugent/sel/studeez/common/composable/ButtonComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/ButtonComposable.kt @@ -75,7 +75,7 @@ fun StealthButton( ) { //val clickablemodifier = if (disabled) Modifier.clickable(indication = null) else modifier val borderColor = if (enabled) MaterialTheme.colors.primary - else MaterialTheme.colors.onSurface.copy(alpha = 0.3f) + else MaterialTheme.colors.onSurface.copy(alpha = 0.3f) BasicButton( text = text, onClick = onClick, diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/DrawerScreenComposable.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/DrawerScreenComposable.kt index b0b1829..11bc773 100644 --- a/app/src/main/java/be/ugent/sel/studeez/common/composable/DrawerScreenComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/DrawerScreenComposable.kt @@ -29,20 +29,22 @@ fun DrawerScreenTemplate( 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(AppText.menu) - ) - } - }, - actions = barAction - )}, + topBar = { + TopAppBar( + title = { Text(text = title) }, + navigationIcon = { + IconButton(onClick = { + coroutineScope.launch { scaffoldState.drawerState.open() } + }) { + Icon( + imageVector = Icons.Default.Menu, + contentDescription = resources().getString(AppText.menu) + ) + } + }, + actions = barAction + ) + }, drawerContent = { Drawer(drawerActions) @@ -55,10 +57,12 @@ fun DrawerScreenTemplate( @Preview @Composable fun DrawerScreenPreview() { - StudeezTheme { DrawerScreenTemplate( - title = "Drawer screen preview", - drawerActions =DrawerActions({}, {}, {}, {}, {}) - ) { - Text(text = "Preview content") - } } + StudeezTheme { + DrawerScreenTemplate( + title = "Drawer screen preview", + drawerActions = DrawerActions({}, {}, {}, {}, {}) + ) { + Text(text = "Preview content") + } + } } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/FloatingActionButtonComposable.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/FloatingActionButtonComposable.kt index ea2b52d..ae6b06d 100644 --- a/app/src/main/java/be/ugent/sel/studeez/common/composable/FloatingActionButtonComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/FloatingActionButtonComposable.kt @@ -131,15 +131,19 @@ fun ExpandedEntry( @Preview @Composable fun AddButtonPreview() { - StudeezTheme { AddButton( - addButtonActions = AddButtonActions({}, {}, {}) - )} + StudeezTheme { + AddButton( + addButtonActions = AddButtonActions({}, {}, {}) + ) + } } @Preview @Composable fun ExpandedAddButtonPreview() { - StudeezTheme { ExpandedAddButton ( - addButtonActions = AddButtonActions({}, {}, {}) - ) } + StudeezTheme { + ExpandedAddButton( + addButtonActions = AddButtonActions({}, {}, {}) + ) + } } \ 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 0b3ee6e..5bf4cf9 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 @@ -57,11 +57,15 @@ fun PrimaryScreenTemplate( bottomBar = { NavigationBar(navigationBarActions) }, floatingActionButtonPosition = FabPosition.Center, isFloatingActionButtonDocked = true, - floatingActionButton = { AddButton(AddButtonActions( - onTaskClick = navigationBarActions.onAddTaskClick, - onFriendClick = navigationBarActions.onAddFriendClick, - onSessionClick = navigationBarActions.onAddSessionClick - )) } + floatingActionButton = { + AddButton( + AddButtonActions( + onTaskClick = navigationBarActions.onAddTaskClick, + onFriendClick = navigationBarActions.onAddFriendClick, + onSessionClick = navigationBarActions.onAddSessionClick + ) + ) + } ) { content(it) } 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 index 5999072..5fb9000 100644 --- 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 @@ -21,18 +21,20 @@ fun SecondaryScreenTemplate( ) { 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) - ) - } - }, - actions = barAction - ) }, + topBar = { + TopAppBar( + title = { Text(text = title) }, + navigationIcon = { + IconButton(onClick = { popUp() }) { + Icon( + imageVector = Icons.Default.ArrowBack, + contentDescription = resources().getString(R.string.go_back) + ) + } + }, + actions = barAction + ) + }, ) { paddingValues -> content(paddingValues) } @@ -41,8 +43,10 @@ fun SecondaryScreenTemplate( @Preview @Composable fun SecondaryScreenToolbarPreview() { - StudeezTheme { SecondaryScreenTemplate( - "Preview screen", - {} - ) {} } + StudeezTheme { + SecondaryScreenTemplate( + "Preview screen", + {} + ) {} + } } \ No newline at end of file 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 index 0e3c684..2a90b94 100644 --- 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 @@ -11,6 +11,6 @@ fun SimpleScreenTemplate( title: String, content: @Composable (PaddingValues) -> Unit ) { - Scaffold( topBar = { TopAppBar ( title = { Text(text = title) } ) } + 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/common/composable/TextComposable.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/TextComposable.kt index 425d8f6..9945aad 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 @@ -16,7 +16,7 @@ import androidx.compose.ui.unit.sp fun Headline( text: String ) { - Row ( + Row( modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.Center diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/TextFieldComposable.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/TextFieldComposable.kt index 880157f..702f3c5 100644 --- a/app/src/main/java/be/ugent/sel/studeez/common/composable/TextFieldComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/TextFieldComposable.kt @@ -102,7 +102,7 @@ fun LabeledNumberInputField( singleLine = singleLine, label = { Text(resources().getString(label)) }, keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), - onValueChange = {typedInt -> + onValueChange = { typedInt -> val isNumber = typedInt.matches(Regex("[1-9]+\\d*]")) if (isNumber) { number = typedInt.toInt() @@ -161,12 +161,11 @@ fun LabeledErrorTextField( } - - @Preview(showBackground = true) - @Composable - fun IntInputPreview() { - LabeledNumberInputField(value = 1, onNewValue = {}, label = AppText.email) - } +@Preview(showBackground = true) +@Composable +fun IntInputPreview() { + LabeledNumberInputField(value = 1, onNewValue = {}, label = AppText.email) +} @Composable fun PasswordField( diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/TimePickerButtonComposable.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/TimePickerButtonComposable.kt index c5e75cc..2a668c2 100644 --- a/app/src/main/java/be/ugent/sel/studeez/common/composable/TimePickerButtonComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/TimePickerButtonComposable.kt @@ -82,7 +82,11 @@ fun TimePickerButton( } } -private fun pickDuration(context: Context, onTimeChosen: (Int) -> Unit, timeState: MutableState) { +private fun pickDuration( + context: Context, + onTimeChosen: (Int) -> Unit, + timeState: MutableState +) { val listener = OnTimeSetListener { _, hour, minute -> timeState.value = HoursMinutesSeconds(hour, minute, 0).getTotalSeconds() onTimeChosen(timeState.value) diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/drawer/DrawerComposable.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/drawer/DrawerComposable.kt index 2d4eab3..44f43b5 100644 --- a/app/src/main/java/be/ugent/sel/studeez/common/composable/drawer/DrawerComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/drawer/DrawerComposable.kt @@ -2,12 +2,7 @@ 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 -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.* import androidx.compose.material.Icon import androidx.compose.material.Text import androidx.compose.material.icons.Icons diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/drawer/DrawerViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/drawer/DrawerViewModel.kt index e55c342..cde7981 100644 --- a/app/src/main/java/be/ugent/sel/studeez/common/composable/drawer/DrawerViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/drawer/DrawerViewModel.kt @@ -3,8 +3,6 @@ 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 diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/navbar/NavigationBarComposable.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/navbar/NavigationBarComposable.kt index ecf26b0..681456c 100644 --- a/app/src/main/java/be/ugent/sel/studeez/common/composable/navbar/NavigationBarComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/navbar/NavigationBarComposable.kt @@ -8,8 +8,6 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Check import androidx.compose.material.icons.filled.List import androidx.compose.material.icons.filled.Person -import androidx.compose.material.icons.outlined.Check -import androidx.compose.material.icons.outlined.DateRange import androidx.compose.material.icons.outlined.Face import androidx.compose.runtime.Composable import androidx.compose.ui.tooling.preview.Preview diff --git a/app/src/main/java/be/ugent/sel/studeez/common/ext/ModifierExt.kt b/app/src/main/java/be/ugent/sel/studeez/common/ext/ModifierExt.kt index 7280ab3..a24f988 100644 --- a/app/src/main/java/be/ugent/sel/studeez/common/ext/ModifierExt.kt +++ b/app/src/main/java/be/ugent/sel/studeez/common/ext/ModifierExt.kt @@ -6,11 +6,15 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp fun Modifier.textButton(): Modifier { - return this.fillMaxWidth().padding(16.dp, 8.dp, 16.dp, 0.dp) + return this + .fillMaxWidth() + .padding(16.dp, 8.dp, 16.dp, 0.dp) } fun Modifier.basicButton(): Modifier { - return this.fillMaxWidth().padding(16.dp, 8.dp) + return this + .fillMaxWidth() + .padding(16.dp, 8.dp) } fun Modifier.card(): Modifier { @@ -26,7 +30,9 @@ fun Modifier.dropdownSelector(): Modifier { } fun Modifier.fieldModifier(): Modifier { - return this.fillMaxWidth().padding(16.dp, 4.dp) + return this + .fillMaxWidth() + .padding(16.dp, 4.dp) } fun Modifier.toolbarActions(): Modifier { @@ -34,9 +40,13 @@ fun Modifier.toolbarActions(): Modifier { } fun Modifier.spacer(): Modifier { - return this.fillMaxWidth().padding(12.dp) + return this + .fillMaxWidth() + .padding(12.dp) } fun Modifier.smallSpacer(): Modifier { - return this.fillMaxWidth().height(8.dp) + return this + .fillMaxWidth() + .height(8.dp) } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/data/SelectedState.kt b/app/src/main/java/be/ugent/sel/studeez/data/SelectedState.kt index ebe8589..b5ed618 100644 --- a/app/src/main/java/be/ugent/sel/studeez/data/SelectedState.kt +++ b/app/src/main/java/be/ugent/sel/studeez/data/SelectedState.kt @@ -48,6 +48,6 @@ class SelectedTimerInfo @Inject constructor() : SelectedState() { @Singleton class SelectedUserId @Inject constructor( userDAO: UserDAO -): SelectedState() { +) : SelectedState() { override var value: String = userDAO.getCurrentUserId() } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/HoursMinutesSeconds.kt b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/HoursMinutesSeconds.kt index edccbd0..7f015c2 100644 --- a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/HoursMinutesSeconds.kt +++ b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_functional/HoursMinutesSeconds.kt @@ -2,7 +2,7 @@ package be.ugent.sel.studeez.data.local.models.timer_functional data class HoursMinutesSeconds(val hours: Int, val minutes: Int, val seconds: Int) { - constructor(sec: Int): this( + constructor(sec: Int) : this( hours = sec / (60 * 60), minutes = (sec / (60)) % 60, seconds = sec % 60, diff --git a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/CustomTimerInfo.kt b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/CustomTimerInfo.kt index d88e39f..ca05893 100644 --- a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/CustomTimerInfo.kt +++ b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/CustomTimerInfo.kt @@ -8,13 +8,13 @@ class CustomTimerInfo( description: String, var studyTime: Int, id: String = "" -): TimerInfo(id, name, description) { +) : TimerInfo(id, name, description) { override fun getFunctionalTimer(): FunctionalTimer { return FunctionalCustomTimer(studyTime) } - override fun asJson() : Map { + override fun asJson(): Map { return mapOf( "type" to "custom", "name" to name, diff --git a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/EndlessTimerInfo.kt b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/EndlessTimerInfo.kt index 45f7fd7..a39ccfe 100644 --- a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/EndlessTimerInfo.kt +++ b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/EndlessTimerInfo.kt @@ -7,14 +7,14 @@ class EndlessTimerInfo( name: String, description: String, id: String = "" -): TimerInfo(id, name, description) { +) : TimerInfo(id, name, description) { override fun getFunctionalTimer(): FunctionalTimer { return FunctionalEndlessTimer() } - override fun asJson() : Map { + override fun asJson(): Map { return mapOf( "type" to "endless", "name" to name, diff --git a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/PomodoroTimerInfo.kt b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/PomodoroTimerInfo.kt index 7316630..da60268 100644 --- a/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/PomodoroTimerInfo.kt +++ b/app/src/main/java/be/ugent/sel/studeez/data/local/models/timer_info/PomodoroTimerInfo.kt @@ -2,7 +2,6 @@ package be.ugent.sel.studeez.data.local.models.timer_info import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalPomodoroTimer import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalTimer -import be.ugent.sel.studeez.data.local.models.timer_functional.FunctionalTimerVisitor class PomodoroTimerInfo( name: String, @@ -11,14 +10,14 @@ class PomodoroTimerInfo( var breakTime: Int, var repeats: Int, id: String = "" -): TimerInfo(id, name, description) { +) : TimerInfo(id, name, description) { override fun getFunctionalTimer(): FunctionalTimer { return FunctionalPomodoroTimer(studyTime, breakTime, repeats) } - override fun asJson() : Map { + override fun asJson(): Map { return mapOf( "type" to "break", "name" to name, diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/SessionDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/SessionDAO.kt index 4ac2891..edb4895 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/SessionDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/SessionDAO.kt @@ -1,9 +1,6 @@ package be.ugent.sel.studeez.domain -import be.ugent.sel.studeez.data.local.models.FeedEntry import be.ugent.sel.studeez.data.local.models.SessionReport -import be.ugent.sel.studeez.data.local.models.User -import be.ugent.sel.studeez.data.local.models.task.Task import be.ugent.sel.studeez.data.local.models.timer_info.TimerInfo import kotlinx.coroutines.flow.Flow diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/TimerDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/TimerDAO.kt index ab3edcb..0385b26 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/TimerDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/TimerDAO.kt @@ -1,7 +1,6 @@ package be.ugent.sel.studeez.domain import be.ugent.sel.studeez.data.local.models.timer_info.TimerInfo -import be.ugent.sel.studeez.data.local.models.timer_info.TimerJson import kotlinx.coroutines.flow.Flow interface TimerDAO { diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseConfigurationService.kt b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseConfigurationService.kt index e3db024..3cdc3ff 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseConfigurationService.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseConfigurationService.kt @@ -1,12 +1,12 @@ package be.ugent.sel.studeez.domain.implementation -import be.ugent.sel.studeez.data.local.models.timer_info.* +import be.ugent.sel.studeez.data.local.models.timer_info.TimerInfo +import be.ugent.sel.studeez.data.local.models.timer_info.TimerJson import be.ugent.sel.studeez.domain.ConfigurationService import com.google.firebase.ktx.Firebase import com.google.firebase.remoteconfig.ktx.get import com.google.firebase.remoteconfig.ktx.remoteConfig import com.google.firebase.remoteconfig.ktx.remoteConfigSettings -import com.google.gson.Gson import kotlinx.coroutines.tasks.await import javax.inject.Inject diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseFeedDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseFeedDAO.kt index be4893d..78f1d2a 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseFeedDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseFeedDAO.kt @@ -42,14 +42,14 @@ class FirebaseFeedDAO @Inject constructor( */ override suspend fun getFeedEntriesFromUser(id: String): Map> { return sessionDAO.getSessionsOfUser(id) - .map { sessionReport -> sessionToFeedEntryFromUser(sessionReport, id) } - .sortedByDescending { it.endTime } - .groupBy { getFormattedTime(it) } - .mapValues { (_, entries) -> - entries - .groupBy { it.taskId } - .map { fuseFeedEntries(it.component2()) } - } + .map { sessionReport -> sessionToFeedEntryFromUser(sessionReport, id) } + .sortedByDescending { it.endTime } + .groupBy { getFormattedTime(it) } + .mapValues { (_, entries) -> + entries + .groupBy { it.taskId } + .map { fuseFeedEntries(it.component2()) } + } } override fun getFriendsSessions(): Flow>>> { @@ -70,7 +70,7 @@ class FirebaseFeedDAO @Inject constructor( val new: MutableMap>> = mutableMapOf() for ((name, map) in l) { for ((day, feedEntries: List) in map) { - new[day] = new.getOrDefault(day, listOf()) + feedEntries.map { Pair(name, it) } + new[day] = new.getOrDefault(day, listOf()) + feedEntries.map { Pair(name, it) } } } return new @@ -109,7 +109,11 @@ class FirebaseFeedDAO @Inject constructor( return makeFeedEntry(sessionReport, subject, task) } - private fun makeFeedEntry(sessionReport: SessionReport, subject: Subject, task: Task): FeedEntry { + private fun makeFeedEntry( + sessionReport: SessionReport, + subject: Subject, + task: Task + ): FeedEntry { return FeedEntry( argb_color = subject.argb_color, subJectName = subject.name, @@ -125,7 +129,10 @@ class FirebaseFeedDAO @Inject constructor( /** * Convert a sessionReport to a feedEntry. Fetch Task and Subject to get names */ - private suspend fun sessionToFeedEntryFromUser(sessionReport: SessionReport, id: String): FeedEntry { + private suspend fun sessionToFeedEntryFromUser( + sessionReport: SessionReport, + id: String + ): FeedEntry { val subjectId: String = sessionReport.subjectId val taskId: String = sessionReport.taskId diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseFriendshipDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseFriendshipDAO.kt index 2583bed..a19c02e 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseFriendshipDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseFriendshipDAO.kt @@ -17,7 +17,6 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.map -import kotlinx.coroutines.tasks.await import javax.inject.Inject import kotlin.coroutines.resume import kotlin.coroutines.resumeWithException @@ -27,7 +26,7 @@ import be.ugent.sel.studeez.R.string as AppText class FirebaseFriendshipDAO @Inject constructor( private val firestore: FirebaseFirestore, private val auth: AccountDAO -): FriendshipDAO { +) : FriendshipDAO { private fun currentUserDocument(): DocumentReference = firestore .collection(USER_COLLECTION) @@ -89,21 +88,25 @@ class FirebaseFriendshipDAO @Inject constructor( // Add entry to current user currentUserDocument() .collection(FRIENDS_COLLECTION) - .add(mapOf( - FRIENDID to otherUserId, - ACCEPTED to true, // TODO Make it not automatically accepted. - FRIENDSSINCE to Timestamp.now() - )) + .add( + mapOf( + FRIENDID to otherUserId, + ACCEPTED to true, // TODO Make it not automatically accepted. + FRIENDSSINCE to Timestamp.now() + ) + ) // Add entry to other user firestore.collection(USER_COLLECTION) .document(otherUserId) .collection(FRIENDS_COLLECTION) - .add(mapOf( - FRIENDID to currentUserId, - ACCEPTED to true, // TODO Make it not automatically accepted. - FRIENDSSINCE to Timestamp.now() - )) + .add( + mapOf( + FRIENDID to currentUserId, + ACCEPTED to true, // TODO Make it not automatically accepted. + FRIENDSSINCE to Timestamp.now() + ) + ) } }.addOnSuccessListener { val message = if (allowed) AppText.success else AppText.already_friend diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseSessionDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseSessionDAO.kt index df271c6..220bd71 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseSessionDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseSessionDAO.kt @@ -1,24 +1,15 @@ package be.ugent.sel.studeez.domain.implementation -import be.ugent.sel.studeez.data.local.models.FeedEntry import be.ugent.sel.studeez.data.local.models.SessionReport -import be.ugent.sel.studeez.data.local.models.User -import be.ugent.sel.studeez.data.local.models.task.Task import be.ugent.sel.studeez.data.local.models.timer_info.TimerInfo -import be.ugent.sel.studeez.data.remote.FirebaseSessionReport -import be.ugent.sel.studeez.data.remote.FirebaseSessionReport.ENDTIME -import be.ugent.sel.studeez.data.remote.FirebaseSessionReport.STUDYTIME -import be.ugent.sel.studeez.domain.* +import be.ugent.sel.studeez.domain.AccountDAO +import be.ugent.sel.studeez.domain.SessionDAO import be.ugent.sel.studeez.domain.implementation.FirebaseCollections.SESSION_COLLECTION import be.ugent.sel.studeez.domain.implementation.FirebaseCollections.USER_COLLECTION -import com.google.firebase.Timestamp import com.google.firebase.firestore.CollectionReference import com.google.firebase.firestore.FirebaseFirestore -import com.google.firebase.firestore.ktx.getField import com.google.firebase.firestore.ktx.snapshots -import com.google.firebase.firestore.ktx.toObject import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.flow.map import kotlinx.coroutines.tasks.await import javax.inject.Inject diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseSubjectDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseSubjectDAO.kt index 1b8d7da..644671b 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseSubjectDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseSubjectDAO.kt @@ -82,7 +82,10 @@ class FirebaseSubjectDAO @Inject constructor( .document(id) .collection(FirebaseCollections.SUBJECT_COLLECTION) - private fun subjectTasksCollection(subject: Subject, id: String = auth.currentUserId): CollectionReference = + private fun subjectTasksCollection( + subject: Subject, + id: String = auth.currentUserId + ): CollectionReference = firestore.collection(FirebaseCollections.USER_COLLECTION) .document(id) .collection(FirebaseCollections.SUBJECT_COLLECTION) diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseTaskDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseTaskDAO.kt index 1ca60e4..d35da27 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseTaskDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseTaskDAO.kt @@ -51,7 +51,10 @@ class FirebaseTaskDAO @Inject constructor( selectedSubjectTasksCollection(oldTask.subjectId).document(oldTask.id).delete() } - private fun selectedSubjectTasksCollection(subjectId: String, id: String = auth.currentUserId): CollectionReference = + private fun selectedSubjectTasksCollection( + subjectId: String, + id: String = auth.currentUserId + ): CollectionReference = firestore.collection(FirebaseCollections.USER_COLLECTION) .document(id) .collection(FirebaseCollections.SUBJECT_COLLECTION) diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseTimerDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseTimerDAO.kt index dad7047..7c77e7c 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseTimerDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseTimerDAO.kt @@ -1,6 +1,7 @@ package be.ugent.sel.studeez.domain.implementation -import be.ugent.sel.studeez.data.local.models.timer_info.* +import be.ugent.sel.studeez.data.local.models.timer_info.TimerInfo +import be.ugent.sel.studeez.data.local.models.timer_info.TimerJson import be.ugent.sel.studeez.domain.AccountDAO import be.ugent.sel.studeez.domain.TimerDAO import com.google.firebase.firestore.CollectionReference @@ -29,7 +30,7 @@ class FirebaseTimerDAO @Inject constructor( // Wrap default timers in een flow en combineer met de userTimer flow. val defaultTimers: List = configurationService.getDefaultTimers() val defaultTimersFlow: Flow> = flowOf(defaultTimers) - val userTimersFlow: Flow> = getUserTimers() + val userTimersFlow: Flow> = getUserTimers() return defaultTimersFlow.combine(userTimersFlow) { defaultTimersList, userTimersList -> defaultTimersList + userTimersList } 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 04239c0..349f647 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 @@ -80,10 +80,12 @@ class FirebaseUserDAO @Inject constructor( newUsername: String, newBiography: String ) { - currentUserDocument().set(mapOf( - USERNAME to newUsername, - BIOGRAPHY to newBiography - )) + currentUserDocument().set( + mapOf( + USERNAME to newUsername, + BIOGRAPHY to newBiography + ) + ) } override suspend fun deleteLoggedInUserReferences() { diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/ToTimerConverter.kt b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/ToTimerConverter.kt index ea06747..1caa1b0 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/ToTimerConverter.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/ToTimerConverter.kt @@ -1,6 +1,7 @@ package be.ugent.sel.studeez.domain.implementation import be.ugent.sel.studeez.data.local.models.timer_info.* +import be.ugent.sel.studeez.domain.implementation.ToTimerConverter.TimerFactory import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -15,32 +16,38 @@ import com.google.gson.reflect.TypeToken class ToTimerConverter { fun interface TimerFactory { - fun makeTimer(map: TimerJson) : TimerInfo + fun makeTimer(map: TimerJson): TimerInfo } private val timerInfoMap: Map = mapOf( - TimerType.ENDLESS to TimerFactory { EndlessTimerInfo( - it.name, - it.description, - it.id - ) }, - TimerType.CUSTOM to TimerFactory { CustomTimerInfo( - it.name, - it.description, - it.studyTime, - it.id - ) }, - TimerType.BREAK to TimerFactory { PomodoroTimerInfo( - it.name, - it.description, - it.studyTime, - it.breakTime, - it.repeats, - it.id - ) } + TimerType.ENDLESS to TimerFactory { + EndlessTimerInfo( + it.name, + it.description, + it.id + ) + }, + TimerType.CUSTOM to TimerFactory { + CustomTimerInfo( + it.name, + it.description, + it.studyTime, + it.id + ) + }, + TimerType.BREAK to TimerFactory { + PomodoroTimerInfo( + it.name, + it.description, + it.studyTime, + it.breakTime, + it.repeats, + it.id + ) + } ) - private fun getTimer(timerJson: TimerJson): TimerInfo{ + private fun getTimer(timerJson: TimerJson): TimerInfo { val type: TimerType = TimerType.valueOf(timerJson.type.uppercase()) return timerInfoMap.getValue(type).makeTimer(timerJson) } diff --git a/app/src/main/java/be/ugent/sel/studeez/navigation/StudeezNavGraph.kt b/app/src/main/java/be/ugent/sel/studeez/navigation/StudeezNavGraph.kt index 6dd57d5..29b28cf 100644 --- a/app/src/main/java/be/ugent/sel/studeez/navigation/StudeezNavGraph.kt +++ b/app/src/main/java/be/ugent/sel/studeez/navigation/StudeezNavGraph.kt @@ -112,7 +112,12 @@ fun StudeezNavGraph( composable(StudeezDestinations.TASKS_SCREEN) { TaskRoute( - goBack = { openAndPopUp(StudeezDestinations.SUBJECT_SCREEN, StudeezDestinations.TASKS_SCREEN) }, + goBack = { + openAndPopUp( + StudeezDestinations.SUBJECT_SCREEN, + StudeezDestinations.TASKS_SCREEN + ) + }, open = open, viewModel = hiltViewModel(), ) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/friends/friends_overview/FriendsOverviewScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/friends/friends_overview/FriendsOverviewScreen.kt index a1960d8..ff786f1 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/friends/friends_overview/FriendsOverviewScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/friends/friends_overview/FriendsOverviewScreen.kt @@ -95,24 +95,24 @@ fun FriendsOverviewScreen( // label = AppText.search_friends, // enabled = false // ) - IconButton( - onClick = friendsOverviewActions.onSubmit, + IconButton( + onClick = friendsOverviewActions.onSubmit, // modifier = Modifier.background( // color = MaterialTheme.colors.background // ), - ) { - Row { - Text( - text = stringResource(id = AppText.click_search_friends), - color = MaterialTheme.colors.onPrimary - ) - Icon( - imageVector = Icons.Default.Search, - contentDescription = stringResource(AppText.search_friends), - tint = MaterialTheme.colors.onPrimary - ) - } + ) { + Row { + Text( + text = stringResource(id = AppText.click_search_friends), + color = MaterialTheme.colors.onPrimary + ) + Icon( + imageVector = Icons.Default.Search, + contentDescription = stringResource(AppText.search_friends), + tint = MaterialTheme.colors.onPrimary + ) } + } }, navigationIcon = { IconButton(onClick = popUp) { @@ -126,7 +126,7 @@ fun FriendsOverviewScreen( ) } ) { paddingValues -> - LazyColumn ( + LazyColumn( modifier = Modifier.padding(paddingValues) ) { if (friends.value.isEmpty()) { @@ -180,7 +180,7 @@ fun FriendsEntry( removeFriend: (Friendship) -> Unit ) { Card { - Row ( + Row( modifier = Modifier .fillMaxWidth() .padding(horizontal = 15.dp, vertical = 7.dp), @@ -193,11 +193,11 @@ fun FriendsEntry( ProfilePicture() } - Box ( + Box( modifier = Modifier .fillMaxWidth() ) { - Column ( + Column( modifier = Modifier .padding(vertical = 4.dp) ) { @@ -208,7 +208,11 @@ fun FriendsEntry( overflow = TextOverflow.Ellipsis ) Text( - text = "${resources().getString(AppText.app_name)} ${resources().getString(AppText.friend)}", + text = "${resources().getString(AppText.app_name)} ${ + resources().getString( + AppText.friend + ) + }", fontSize = 14.sp, maxLines = 1, overflow = TextOverflow.Ellipsis diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/friends/friends_overview/FriendsOverviewViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/friends/friends_overview/FriendsOverviewViewModel.kt index 556e435..a841c67 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/friends/friends_overview/FriendsOverviewViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/friends/friends_overview/FriendsOverviewViewModel.kt @@ -23,15 +23,17 @@ class FriendsOverviewViewModel @Inject constructor( logService: LogService ) : StudeezViewModel(logService) { - var uiState = mutableStateOf(FriendsOverviewUiState( - userId = selectedUserIdState.value - )) + var uiState = mutableStateOf( + FriendsOverviewUiState( + userId = selectedUserIdState.value + ) + ) private set fun getAllFriends(): Flow>> { return friendshipDAO.getAllFriendships( - userId = uiState.value.userId - ) + userId = uiState.value.userId + ) .flatMapConcat { friendships -> val userFlows = friendships.map { friendship -> userDAO.getUserDetails(friendship.friendId) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/friends/friends_search/SearchFriendsScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/friends/friends_search/SearchFriendsScreen.kt index 508f7ed..a2a0291 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/friends/friends_search/SearchFriendsScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/friends/friends_search/SearchFriendsScreen.kt @@ -105,7 +105,7 @@ fun SearchFriendsScreen( LazyColumn( modifier = Modifier.padding(paddingValues) ) { - items (searchResults.value) { user -> + items(searchResults.value) { user -> UserEntry( user = user, goToProfile = searchFriendsActions.goToProfile @@ -123,21 +123,29 @@ fun SearchFriendsPreview() { popUp = {}, uiState = SearchFriendUiState( queryString = "dit is een test", - searchResults = flowOf(listOf(User( - id = "someid", - username = "Eerste user", - biography = "blah blah blah" - ))) + searchResults = flowOf( + listOf( + User( + id = "someid", + username = "Eerste user", + biography = "blah blah blah" + ) + ) + ) ), searchFriendsActions = SearchFriendsActions( onQueryStringChange = {}, getUsersWithUsername = {}, getAllUsers = { - flowOf(listOf(User( - id = "someid", - username = "Eerste user", - biography = "blah blah blah" - ))) + flowOf( + listOf( + User( + id = "someid", + username = "Eerste user", + biography = "blah blah blah" + ) + ) + ) }, goToProfile = { } ) @@ -163,11 +171,11 @@ fun UserEntry( ProfilePicture() } - Box ( + Box( modifier = Modifier .fillMaxWidth() ) { - Column ( + Column( modifier = Modifier .padding(vertical = 4.dp) ) { @@ -178,7 +186,11 @@ fun UserEntry( overflow = TextOverflow.Ellipsis ) Text( - text = "${resources().getString(AppText.app_name)} ${resources().getString(AppText.friend)}", + text = "${resources().getString(AppText.app_name)} ${ + resources().getString( + AppText.friend + ) + }", fontSize = 14.sp, maxLines = 1, overflow = TextOverflow.Ellipsis diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/friends/friends_search/SearchFriendsViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/friends/friends_search/SearchFriendsViewModel.kt index 05bf6d6..2856aa6 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/friends/friends_search/SearchFriendsViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/friends/friends_search/SearchFriendsViewModel.kt @@ -18,7 +18,7 @@ class SearchFriendsViewModel @Inject constructor( private val userDAO: UserDAO, private val selectedProfileState: SelectedUserId, logService: LogService -): StudeezViewModel(logService) { +) : StudeezViewModel(logService) { var uiState = mutableStateOf(SearchFriendUiState()) private set 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 5a9407a..d7f294d 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,4 +1,5 @@ package be.ugent.sel.studeez.screens.home + import be.ugent.sel.studeez.domain.LogService import be.ugent.sel.studeez.navigation.StudeezDestinations import be.ugent.sel.studeez.screens.StudeezViewModel 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 ca59fba..edec364 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 @@ -92,7 +92,8 @@ fun ProfileScreen( item { Row( horizontalArrangement = Arrangement.spacedBy(5.dp), - modifier = Modifier.fillMaxWidth() + modifier = Modifier + .fillMaxWidth() .wrapContentWidth(align = Alignment.CenterHorizontally) ) { AmountOfFriendsButton( @@ -140,7 +141,7 @@ fun ProfileScreenPreview() { fun AmountOfFriendsButton( amountOfFriends: Int, onClick: () -> Unit -){ +) { Button( onClick = onClick, shape = defaultButtonShape() diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/profile/edit_profile/ProfileEditScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/profile/edit_profile/ProfileEditScreen.kt index 31dcb9d..a70e67d 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/profile/edit_profile/ProfileEditScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/profile/edit_profile/ProfileEditScreen.kt @@ -82,7 +82,7 @@ fun EditProfileScreen( ) } item { - BasicTextButton( + BasicTextButton( text = AppText.delete_profile, Modifier.textButton(), action = editProfileActions.onDeleteClick diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/profile/edit_profile/ProfileEditUiState.kt b/app/src/main/java/be/ugent/sel/studeez/screens/profile/edit_profile/ProfileEditUiState.kt index 911df68..22cbc24 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/profile/edit_profile/ProfileEditUiState.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/profile/edit_profile/ProfileEditUiState.kt @@ -1,6 +1,6 @@ package be.ugent.sel.studeez.screens.profile.edit_profile -data class ProfileEditUiState ( +data class ProfileEditUiState( val username: String = "", val biography: String = "" ) \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/profile/public_profile/PublicProfileScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/profile/public_profile/PublicProfileScreen.kt index 4fff845..559a442 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/profile/public_profile/PublicProfileScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/profile/public_profile/PublicProfileScreen.kt @@ -39,9 +39,11 @@ fun getPublicProfileActions( ): PublicProfileActions { return PublicProfileActions( getUserDetails = { viewModel.getUserDetails(viewModel.uiState.value.userId) }, - getAmountOfFriends = { viewModel.getAmountOfFriends( - userId = viewModel.uiState.value.userId - ) }, + getAmountOfFriends = { + viewModel.getAmountOfFriends( + userId = viewModel.uiState.value.userId + ) + }, onViewFriendsClick = { viewModel.onViewFriendsClick(open) }, sendFriendRequest = { viewModel.sendFriendRequest( @@ -123,11 +125,13 @@ fun PublicProfilePreview() { PublicProfileScreen( publicProfileActions = PublicProfileActions( getUserDetails = { - flowOf(User( - id = "someid", - username = "Maxime De Poorter", - biography = "I am a different student and this is my public profile" - )) + flowOf( + User( + id = "someid", + username = "Maxime De Poorter", + biography = "I am a different student and this is my public profile" + ) + ) }, getAmountOfFriends = { flowOf(113) }, onViewFriendsClick = {}, diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/profile/public_profile/PublicProfileViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/profile/public_profile/PublicProfileViewModel.kt index 6958b88..a548b04 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/profile/public_profile/PublicProfileViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/profile/public_profile/PublicProfileViewModel.kt @@ -18,7 +18,7 @@ class PublicProfileViewModel @Inject constructor( private val friendshipDAO: FriendshipDAO, selectedUserIdState: SelectedUserId, logService: LogService -): StudeezViewModel(logService) { +) : StudeezViewModel(logService) { val uiState = mutableStateOf( PublicProfileUiState( diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/SessionRoute.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/SessionRoute.kt index 6ca8a96..bffca4a 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/SessionRoute.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/SessionRoute.kt @@ -39,7 +39,8 @@ fun SessionRoute( val soundPlayer = SoundPlayer(LocalContext.current) val sessionActions = getSessionActions(viewModel, openAndPopUp) - val sessionScreen = viewModel.getTimer().accept(GetSessionScreenComposable(soundPlayer, open, sessionActions)) + val sessionScreen = + viewModel.getTimer().accept(GetSessionScreenComposable(soundPlayer, open, sessionActions)) sessionScreen() } diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/SoundPlayer.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/SoundPlayer.kt index 14fae19..0d19979 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/SoundPlayer.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/SoundPlayer.kt @@ -21,7 +21,7 @@ class SoundPlayer(private val context: Context) { private fun initPlayer(): MediaPlayer { - return MediaPlayer.create( + return MediaPlayer.create( context, RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION) ) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/BreakTimerScreenComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/BreakTimerScreenComposable.kt index 42ec4f7..d3a3982 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/BreakTimerScreenComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/BreakTimerScreenComposable.kt @@ -27,7 +27,7 @@ fun BreakSessionScreenComposable( sessionActions = sessionActions, midSection = { Dots(pomodoroTimer = pomodoroTimer) }, callMediaPlayer = { soundPlayer.playOn(pomodoroTimer.hasCurrentCountdownEnded()) }, - motivationString = { motivationString (pomodoroTimer = pomodoroTimer) } + motivationString = { motivationString(pomodoroTimer = pomodoroTimer) } ) } @@ -57,11 +57,13 @@ private fun Dots(pomodoroTimer: FunctionalPomodoroTimer): Int { @Composable private fun Dot(color: Color) { - Box(modifier = Modifier - .padding(5.dp) - .size(10.dp) - .clip(CircleShape) - .background(color)) + Box( + modifier = Modifier + .padding(5.dp) + .size(10.dp) + .clip(CircleShape) + .background(color) + ) } diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/GetSessionScreenComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/GetSessionScreenComposable.kt index 47ca52e..4ca8ac3 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/GetSessionScreenComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/GetSessionScreenComposable.kt @@ -12,11 +12,12 @@ class GetSessionScreenComposable( private val soundPlayer: SoundPlayer, private val open: (String) -> Unit, private val sessionActions: SessionActions - ) : +) : FunctionalTimerVisitor<@Composable () -> Unit> { override fun visitFunctionalCustomTimer(functionalCustomTimer: FunctionalCustomTimer): @Composable () -> Unit { - return { CustomTimerSessionScreenComposable( + return { + CustomTimerSessionScreenComposable( open = open, sessionActions = sessionActions, soundPlayer = soundPlayer, diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/SessionScreenComposable.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/SessionScreenComposable.kt index c94d2a5..885a949 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/SessionScreenComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session/sessionScreens/SessionScreenComposable.kt @@ -23,10 +23,10 @@ fun SessionScreen( open: (String) -> Unit, sessionActions: SessionActions, callMediaPlayer: () -> Unit = {}, - midSection: @Composable () -> Int = {0}, + midSection: @Composable () -> Int = { 0 }, motivationString: @Composable () -> String, -) { + ) { Column( modifier = Modifier.padding(10.dp) ) { diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/session_recap/SessionRecapScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/session_recap/SessionRecapScreen.kt index 3a1e85f..f68b0d3 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/session_recap/SessionRecapScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/session_recap/SessionRecapScreen.kt @@ -135,9 +135,11 @@ fun SessionRecapScreenPreview() { SessionRecapScreen( modifier = Modifier, sessionRecapActions = SessionRecapActions( - { SessionReport( - studyTime = 100, - ) }, + { + SessionReport( + studyTime = 100, + ) + }, {}, {}, ) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/sign_up/SignUpViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/sign_up/SignUpViewModel.kt index 4cfa6a9..5dc815e 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/sign_up/SignUpViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/sign_up/SignUpViewModel.kt @@ -21,7 +21,7 @@ class SignUpViewModel @Inject constructor( private val accountDAO: AccountDAO, private val userDAO: UserDAO, logService: LogService - ) : StudeezViewModel(logService) { +) : StudeezViewModel(logService) { var uiState = mutableStateOf(SignUpUiState()) private set @@ -35,6 +35,7 @@ class SignUpViewModel @Inject constructor( fun onUsernameChange(newValue: String) { uiState.value = uiState.value.copy(username = newValue) } + fun onEmailChange(newValue: String) { uiState.value = uiState.value.copy(email = newValue) } diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/splash/SplashViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/splash/SplashViewModel.kt index 4e1dfbd..86a08ef 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/splash/SplashViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/splash/SplashViewModel.kt @@ -26,7 +26,7 @@ class SplashViewModel @Inject constructor( showError.value = false if (accountDAO.hasUser) { openAndPopUp(StudeezDestinations.HOME_SCREEN, StudeezDestinations.SPLASH_SCREEN) - } else{ + } else { openAndPopUp(StudeezDestinations.SIGN_UP_SCREEN, StudeezDestinations.SPLASH_SCREEN) } } diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/GetTimerFormScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/GetTimerFormScreen.kt index 99426e4..b772a1f 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/GetTimerFormScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/GetTimerFormScreen.kt @@ -9,7 +9,7 @@ import be.ugent.sel.studeez.screens.timer_form.form_screens.BreakTimerFormScreen import be.ugent.sel.studeez.screens.timer_form.form_screens.CustomTimerFormScreen import be.ugent.sel.studeez.screens.timer_form.form_screens.EndlessTimerFormScreen -class GetTimerFormScreen: TimerInfoVisitor { +class GetTimerFormScreen : TimerInfoVisitor { override fun visitCustomTimerInfo(customTimerInfo: CustomTimerInfo): AbstractTimerFormScreen { return CustomTimerFormScreen(customTimerInfo) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/TimerFormScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/TimerFormScreen.kt index c69e929..2dede13 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/TimerFormScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/TimerFormScreen.kt @@ -18,10 +18,10 @@ fun TimerAddRoute( TimerFormScreen( popUp = popUp, getTimerInfo = viewModel::getTimerInfo, - extraButton= { }, + extraButton = { }, AppText.add_timer ) { - viewModel.saveTimer(it, goBack = {popUp(); popUp()}) + viewModel.saveTimer(it, goBack = { popUp(); popUp() }) } } @@ -42,7 +42,7 @@ fun TimerEditRoute( TimerFormScreen( popUp = popUp, getTimerInfo = viewModel::getTimerInfo, - extraButton= { deleteButton() }, + extraButton = { deleteButton() }, AppText.edit_timer ) { viewModel.editTimer(it, goBack = popUp) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/BreakTimerFormScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/BreakTimerFormScreen.kt index 06c1079..2fa7003 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/BreakTimerFormScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/BreakTimerFormScreen.kt @@ -15,8 +15,7 @@ import be.ugent.sel.studeez.R.string as AppText class BreakTimerFormScreen( private val breakTimerInfo: PomodoroTimerInfo -): AbstractTimerFormScreen(breakTimerInfo) { - +) : AbstractTimerFormScreen(breakTimerInfo) { @Composable @@ -30,7 +29,7 @@ class BreakTimerFormScreen( breakTimerInfo.breakTime = newTime } - valids["repeats"] = remember {mutableStateOf(true)} + valids["repeats"] = remember { mutableStateOf(true) } firsts["repeats"] = remember { mutableStateOf(true) } LabeledErrorTextField( diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/CustomTimerFormScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/CustomTimerFormScreen.kt index 27c0657..77fa5a4 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/CustomTimerFormScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/CustomTimerFormScreen.kt @@ -9,7 +9,7 @@ import be.ugent.sel.studeez.R.string as AppText class CustomTimerFormScreen( private val customTimerInfo: CustomTimerInfo - ): AbstractTimerFormScreen(customTimerInfo) { +) : AbstractTimerFormScreen(customTimerInfo) { @Composable override fun ExtraFields() { diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/EndlessTimerFormScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/EndlessTimerFormScreen.kt index 9009fff..aaaac4c 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/EndlessTimerFormScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/form_screens/EndlessTimerFormScreen.kt @@ -7,7 +7,7 @@ import be.ugent.sel.studeez.ui.theme.StudeezTheme class EndlessTimerFormScreen( endlessTimerInfo: EndlessTimerInfo -): AbstractTimerFormScreen(endlessTimerInfo) { +) : AbstractTimerFormScreen(endlessTimerInfo) { } @Preview diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/timer_type_select/TimerTypeSelectScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/timer_type_select/TimerTypeSelectScreen.kt index d4b58f2..af659d6 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/timer_type_select/TimerTypeSelectScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_form/timer_type_select/TimerTypeSelectScreen.kt @@ -40,7 +40,9 @@ fun TimerTypeSelectScreen( val default: TimerInfo = defaultTimerInfo.getValue(timerType) Button( onClick = { viewModel.onTimerTypeChosen(default, open) }, - modifier = Modifier.fillMaxWidth().padding(5.dp) + modifier = Modifier + .fillMaxWidth() + .padding(5.dp) ) { Text(text = timerType.name) } diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/timer_overview/TimerOverviewScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/timer_overview/TimerOverviewScreen.kt index 3c25ddf..86ba700 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/timer_overview/TimerOverviewScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/timer_overview/TimerOverviewScreen.kt @@ -68,11 +68,13 @@ fun TimerOverviewScreen( LazyColumn { // Custom timer, select new duration each time item { - TimerEntry(timerInfo = CustomTimerInfo( - name = resources().getString(R.string.custom_name), - description = resources().getString(R.string.custom_name), - studyTime = 0 - )) + TimerEntry( + timerInfo = CustomTimerInfo( + name = resources().getString(R.string.custom_name), + description = resources().getString(R.string.custom_name), + studyTime = 0 + ) + ) } // Default Timers, cannot be edited items(timerOverviewActions.getDefaultTimers()) { diff --git a/app/src/main/java/be/ugent/sel/studeez/ui/theme/Color.kt b/app/src/main/java/be/ugent/sel/studeez/ui/theme/Color.kt index 3639b8d..4929a1e 100644 --- a/app/src/main/java/be/ugent/sel/studeez/ui/theme/Color.kt +++ b/app/src/main/java/be/ugent/sel/studeez/ui/theme/Color.kt @@ -2,6 +2,6 @@ package be.ugent.sel.studeez.ui.theme import androidx.compose.ui.graphics.Color -val Blue100 = Color( 30, 100, 200, 255) -val Blue120 = Color( 27, 90, 180, 255) -val Yellow100 = Color(255, 210, 0, 255) \ No newline at end of file +val Blue100 = Color(30, 100, 200, 255) +val Blue120 = Color(27, 90, 180, 255) +val Yellow100 = Color(255, 210, 0, 255) \ No newline at end of file From b4e1c87cb510aedb34b5948111a12f1cdc9bb1ea Mon Sep 17 00:00:00 2001 From: brreynie Date: Tue, 16 May 2023 12:02:46 +0200 Subject: [PATCH 18/18] fix homescreentest after refactor of navbar --- .../java/be/ugent/sel/studeez/HomeScreenTest.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/androidTest/java/be/ugent/sel/studeez/HomeScreenTest.kt b/app/src/androidTest/java/be/ugent/sel/studeez/HomeScreenTest.kt index 6906683..f3bcfd2 100644 --- a/app/src/androidTest/java/be/ugent/sel/studeez/HomeScreenTest.kt +++ b/app/src/androidTest/java/be/ugent/sel/studeez/HomeScreenTest.kt @@ -140,7 +140,7 @@ class HomeScreenTest { fun navigationbarTest() { var hometest = false var tasktest = false - var sessiontest = false + var friendstest = false var profiletest = false composeTestRule.setContent { @@ -150,7 +150,7 @@ class HomeScreenTest { {false}, {hometest = true}, {tasktest = true}, - {sessiontest = true}, + {friendstest = true}, {profiletest = true}, {}, {}, {} ), @@ -183,7 +183,7 @@ class HomeScreenTest { composeTestRule .onNodeWithContentDescription( - "session", + "feed", substring = true, ignoreCase = true ) @@ -201,7 +201,7 @@ class HomeScreenTest { Assert.assertTrue(hometest) Assert.assertTrue(tasktest) - Assert.assertTrue(sessiontest) + Assert.assertTrue(friendstest) Assert.assertTrue(profiletest) } } \ No newline at end of file