optimize imports and format code for all files :)

This commit is contained in:
brreynie 2023-05-16 11:59:40 +02:00
parent cefa85ae22
commit 62bca72d0f
56 changed files with 310 additions and 239 deletions

View file

@ -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,

View file

@ -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")
}
}
}

View file

@ -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({}, {}, {})
)
}
}

View file

@ -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)
}

View file

@ -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",
{}
) {}
}
}

View file

@ -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) }
}

View file

@ -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

View file

@ -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(

View file

@ -82,7 +82,11 @@ fun TimePickerButton(
}
}
private fun pickDuration(context: Context, onTimeChosen: (Int) -> Unit, timeState: MutableState<Int>) {
private fun pickDuration(
context: Context,
onTimeChosen: (Int) -> Unit,
timeState: MutableState<Int>
) {
val listener = OnTimeSetListener { _, hour, minute ->
timeState.value = HoursMinutesSeconds(hour, minute, 0).getTotalSeconds()
onTimeChosen(timeState.value)

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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)
}

View file

@ -48,6 +48,6 @@ class SelectedTimerInfo @Inject constructor() : SelectedState<TimerInfo>() {
@Singleton
class SelectedUserId @Inject constructor(
userDAO: UserDAO
): SelectedState<String>() {
) : SelectedState<String>() {
override var value: String = userDAO.getCurrentUserId()
}

View file

@ -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,

View file

@ -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<String, Any> {
override fun asJson(): Map<String, Any> {
return mapOf(
"type" to "custom",
"name" to name,

View file

@ -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<String, Any> {
override fun asJson(): Map<String, Any> {
return mapOf(
"type" to "endless",
"name" to name,

View file

@ -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<String, Any> {
override fun asJson(): Map<String, Any> {
return mapOf(
"type" to "break",
"name" to name,

View file

@ -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

View file

@ -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 {

View file

@ -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

View file

@ -42,14 +42,14 @@ class FirebaseFeedDAO @Inject constructor(
*/
override suspend fun getFeedEntriesFromUser(id: String): Map<String, List<FeedEntry>> {
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<Map<String, List<Pair<String, FeedEntry>>>> {
@ -70,7 +70,7 @@ class FirebaseFeedDAO @Inject constructor(
val new: MutableMap<String, List<Pair<String, FeedEntry>>> = mutableMapOf()
for ((name, map) in l) {
for ((day, feedEntries: List<FeedEntry>) 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

View file

@ -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

View file

@ -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

View file

@ -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)

View file

@ -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)

View file

@ -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<TimerInfo> = configurationService.getDefaultTimers()
val defaultTimersFlow: Flow<List<TimerInfo>> = flowOf(defaultTimers)
val userTimersFlow: Flow<List<TimerInfo>> = getUserTimers()
val userTimersFlow: Flow<List<TimerInfo>> = getUserTimers()
return defaultTimersFlow.combine(userTimersFlow) { defaultTimersList, userTimersList ->
defaultTimersList + userTimersList
}

View file

@ -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() {

View file

@ -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<TimerType, TimerFactory> = 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)
}

View file

@ -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(),
)

View file

@ -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

View file

@ -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<List<Pair<User, Friendship>>> {
return friendshipDAO.getAllFriendships(
userId = uiState.value.userId
)
userId = uiState.value.userId
)
.flatMapConcat { friendships ->
val userFlows = friendships.map { friendship ->
userDAO.getUserDetails(friendship.friendId)

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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()

View file

@ -82,7 +82,7 @@ fun EditProfileScreen(
)
}
item {
BasicTextButton(
BasicTextButton(
text = AppText.delete_profile,
Modifier.textButton(),
action = editProfileActions.onDeleteClick

View file

@ -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 = ""
)

View file

@ -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 = {},

View file

@ -18,7 +18,7 @@ class PublicProfileViewModel @Inject constructor(
private val friendshipDAO: FriendshipDAO,
selectedUserIdState: SelectedUserId,
logService: LogService
): StudeezViewModel(logService) {
) : StudeezViewModel(logService) {
val uiState = mutableStateOf(
PublicProfileUiState(

View file

@ -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()
}

View file

@ -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)
)

View file

@ -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)
)
}

View file

@ -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,

View file

@ -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)
) {

View file

@ -135,9 +135,11 @@ fun SessionRecapScreenPreview() {
SessionRecapScreen(
modifier = Modifier,
sessionRecapActions = SessionRecapActions(
{ SessionReport(
studyTime = 100,
) },
{
SessionReport(
studyTime = 100,
)
},
{},
{},
)

View file

@ -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)
}

View file

@ -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)
}
}

View file

@ -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<AbstractTimerFormScreen> {
class GetTimerFormScreen : TimerInfoVisitor<AbstractTimerFormScreen> {
override fun visitCustomTimerInfo(customTimerInfo: CustomTimerInfo): AbstractTimerFormScreen {
return CustomTimerFormScreen(customTimerInfo)

View file

@ -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)

View file

@ -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(

View file

@ -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() {

View file

@ -7,7 +7,7 @@ import be.ugent.sel.studeez.ui.theme.StudeezTheme
class EndlessTimerFormScreen(
endlessTimerInfo: EndlessTimerInfo
): AbstractTimerFormScreen(endlessTimerInfo) {
) : AbstractTimerFormScreen(endlessTimerInfo) {
}
@Preview

View file

@ -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)
}

View file

@ -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()) {

View file

@ -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)
val Blue100 = Color(30, 100, 200, 255)
val Blue120 = Color(27, 90, 180, 255)
val Yellow100 = Color(255, 210, 0, 255)