From 5f8b7d7a7b653ed2d56d842327261b001d8d7f1d Mon Sep 17 00:00:00 2001 From: brreynie Date: Tue, 9 May 2023 15:30:37 +0200 Subject: [PATCH] show #tasks and #completedTasks in subject entry --- .../common/composable/tasks/SubjectEntry.kt | 18 +++++++--------- .../studeez/data/local/models/task/Subject.kt | 7 ++++++- .../studeez/data/local/models/task/Task.kt | 2 ++ .../be/ugent/sel/studeez/domain/TaskDAO.kt | 4 ++++ .../implementation/FireBaseSubjectDAO.kt | 10 ++++++++- .../domain/implementation/FireBaseTaskDAO.kt | 21 ++++++++++++++++++- .../domain/implementation/FirebaseFeedDAO.kt | 14 +++++++------ .../studeez/screens/tasks/SubjectScreen.kt | 2 +- 8 files changed, 57 insertions(+), 21 deletions(-) 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 8655ba3..a6b89bf 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 @@ -1,13 +1,7 @@ package be.ugent.sel.studeez.common.composable.tasks import androidx.compose.foundation.background -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.size +import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.Card import androidx.compose.material.Icon @@ -24,10 +18,10 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import be.ugent.sel.studeez.R.string as AppText import be.ugent.sel.studeez.common.composable.StealthButton import be.ugent.sel.studeez.data.local.models.task.Subject import be.ugent.sel.studeez.data.local.models.timer_functional.HoursMinutesSeconds +import be.ugent.sel.studeez.R.string as AppText @Composable fun SubjectEntry( @@ -80,7 +74,7 @@ fun SubjectEntry( imageVector = Icons.Default.List, contentDescription = stringResource(id = AppText.tasks) ) - Text(text = "0/0") // TODO + Text(text = "${subject.taskCompletedCount}/${subject.taskCount}") // TODO } } } @@ -104,7 +98,9 @@ fun SubjectEntryPreview() { subject = Subject( name = "Test Subject", argb_color = 0xFFFFD200, - time = 60 + time = 60, + taskCount = 5, + taskCompletedCount = 2, ), ) {} } @@ -116,7 +112,7 @@ fun OverflowSubjectEntryPreview() { subject = Subject( name = "Testttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt", argb_color = 0xFFFFD200, - time = 60 + time = 60, ), ) {} } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/data/local/models/task/Subject.kt b/app/src/main/java/be/ugent/sel/studeez/data/local/models/task/Subject.kt index e84c2bb..622ef3c 100644 --- a/app/src/main/java/be/ugent/sel/studeez/data/local/models/task/Subject.kt +++ b/app/src/main/java/be/ugent/sel/studeez/data/local/models/task/Subject.kt @@ -1,10 +1,15 @@ package be.ugent.sel.studeez.data.local.models.task import com.google.firebase.firestore.DocumentId +import com.google.firebase.firestore.Exclude data class Subject( @DocumentId val id: String = "", val name: String = "", val time: Int = 0, val argb_color: Long = 0, -) \ No newline at end of file + @get:Exclude @set:Exclude + var taskCount: Int = 0, + @get:Exclude @set:Exclude + var taskCompletedCount: Int = 0, +) diff --git a/app/src/main/java/be/ugent/sel/studeez/data/local/models/task/Task.kt b/app/src/main/java/be/ugent/sel/studeez/data/local/models/task/Task.kt index f2618db..91242b0 100644 --- a/app/src/main/java/be/ugent/sel/studeez/data/local/models/task/Task.kt +++ b/app/src/main/java/be/ugent/sel/studeez/data/local/models/task/Task.kt @@ -8,6 +8,7 @@ data class Task( val completed: Boolean = false, val time: Int = 0, val subjectId: String = "", + val archived: Boolean = false, ) object TaskDocument { @@ -16,4 +17,5 @@ object TaskDocument { const val completed = "completed" const val time = "time" const val subjectId = "subjectId" + const val archived = "archived" } 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 988a10d..4c7ee44 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 @@ -17,4 +17,8 @@ interface TaskDAO { fun toggleTaskCompleted(task: Task, completed: Boolean) suspend fun getTask(subjectId: String, taskId: String): Task + + suspend fun getTaskCount(subject: Subject): Int + + suspend fun getCompletedTaskCount(subject: Subject): Int } \ No newline at end of file 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 e022863..9156771 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,9 +1,9 @@ package be.ugent.sel.studeez.domain.implementation 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.AccountDAO import be.ugent.sel.studeez.domain.SubjectDAO +import be.ugent.sel.studeez.domain.TaskDAO import com.google.firebase.firestore.CollectionReference import com.google.firebase.firestore.FirebaseFirestore import com.google.firebase.firestore.ktx.snapshots @@ -16,11 +16,19 @@ import javax.inject.Inject class FireBaseSubjectDAO @Inject constructor( private val firestore: FirebaseFirestore, private val auth: AccountDAO, + private val taskDAO: TaskDAO, ) : SubjectDAO { override fun getSubjects(): Flow> { return currentUserSubjectsCollection() .snapshots() .map { it.toObjects(Subject::class.java) } + .map { subjects -> + subjects.map { subject -> + subject.taskCount = taskDAO.getTaskCount(subject) + subject.taskCompletedCount = taskDAO.getCompletedTaskCount(subject) + subject + } + } } override suspend fun getSubject(subjectId: String): Subject? { 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 963c93b..bf32776 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 @@ -5,12 +5,12 @@ import be.ugent.sel.studeez.data.local.models.task.Task import be.ugent.sel.studeez.data.local.models.task.TaskDocument import be.ugent.sel.studeez.domain.AccountDAO import be.ugent.sel.studeez.domain.TaskDAO +import com.google.firebase.firestore.AggregateSource import com.google.firebase.firestore.CollectionReference import com.google.firebase.firestore.FirebaseFirestore import com.google.firebase.firestore.ktx.snapshots import com.google.firebase.firestore.ktx.toObject import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.map import kotlinx.coroutines.tasks.await import javax.inject.Inject @@ -21,6 +21,7 @@ class FireBaseTaskDAO @Inject constructor( ) : TaskDAO { override fun getTasks(subject: Subject): Flow> { return selectedSubjectTasksCollection(subject.id) + .whereEqualTo(TaskDocument.archived, false) .snapshots() .map { it.toObjects(Task::class.java) } } @@ -29,6 +30,24 @@ class FireBaseTaskDAO @Inject constructor( return selectedSubjectTasksCollection(subjectId).document(taskId).get().await().toObject()!! } + override suspend fun getTaskCount(subject: Subject): Int { + return selectedSubjectTasksCollection(subject.id) + .count() + .get(AggregateSource.SERVER) + .await() + .count.toInt() + } + + override suspend fun getCompletedTaskCount(subject: Subject): Int { + return selectedSubjectTasksCollection(subject.id) + .whereEqualTo(TaskDocument.completed, true) + .whereEqualTo(TaskDocument.archived, false) + .count() + .get(AggregateSource.SERVER) + .await() + .count.toInt() + } + override fun saveTask(newTask: Task) { selectedSubjectTasksCollection(newTask.subjectId).add(newTask) } 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 c116fbf..fa579bb 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 @@ -7,30 +7,32 @@ 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 com.google.firebase.Timestamp -import kotlinx.coroutines.flow.* +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map import javax.inject.Inject class FirebaseFeedDAO @Inject constructor( private val sessionDAO: SessionDAO, private val taskDAO: TaskDAO, - private val subjectDAO: FireBaseSubjectDAO + private val subjectDAO: SubjectDAO ) : FeedDAO { /** * Return a map as with key the day and value a list of feedentries for that day. */ override fun getFeedEntries(): Flow>> { - return sessionDAO.getSessions().map {sessionReports -> + return sessionDAO.getSessions().map { sessionReports -> sessionReports - .map { sessionReport -> sessionToFeedEntry(sessionReport) } + .map { sessionReport -> sessionToFeedEntry(sessionReport) } .sortedByDescending { it.endTime } .groupBy { getFormattedTime(it) } .mapValues { (_, entries) -> entries - .groupBy { it.taskId } - .map { fuseFeedEntries(it.component2()) } + .groupBy { it.taskId } + .map { fuseFeedEntries(it.component2()) } } } } diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/tasks/SubjectScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/tasks/SubjectScreen.kt index 15a3925..a3395ea 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/tasks/SubjectScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/tasks/SubjectScreen.kt @@ -54,6 +54,7 @@ fun SubjectScreen( Column( modifier = Modifier.padding(top = 5.dp) ) { + NewTaskSubjectButton(onClick = addSubject, AppText.new_subject) LazyColumn { items(subjects.value) { SubjectEntry( @@ -62,7 +63,6 @@ fun SubjectScreen( ) } } - NewTaskSubjectButton(onClick = addSubject, AppText.new_subject) } } }