From 056947e1dbf64215b2a8193a895e7e02cbee964b Mon Sep 17 00:00:00 2001 From: brreynie Date: Tue, 2 May 2023 22:57:35 +0200 Subject: [PATCH] #22 get tasks from firestore --- .../studeez/common/composable/SubjectEntry.kt | 2 +- .../ugent/sel/studeez/data/SelectedSubject.kt | 18 +++++++++++++ .../studeez/data/local/models/task/Subject.kt | 1 - .../implementation/FireBaseCollections.kt | 1 + .../domain/implementation/FireBaseTaskDAO.kt | 25 +++++++++---------- .../studeez/screens/tasks/SubjectScreen.kt | 6 ++--- .../studeez/screens/tasks/SubjectViewModel.kt | 6 ++++- .../studeez/screens/tasks/TaskViewModel.kt | 8 +++--- 8 files changed, 44 insertions(+), 23 deletions(-) create mode 100644 app/src/main/java/be/ugent/sel/studeez/data/SelectedSubject.kt diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/SubjectEntry.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/SubjectEntry.kt index 0352327..e8b8741 100644 --- a/app/src/main/java/be/ugent/sel/studeez/common/composable/SubjectEntry.kt +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/SubjectEntry.kt @@ -77,7 +77,7 @@ fun SubjectEntry( Icon( imageVector = Icons.Default.List, contentDescription = "tasks" ) - Text(text = subject.tasks.size.toString()) + Text(text = "0/0") // TODO } } } diff --git a/app/src/main/java/be/ugent/sel/studeez/data/SelectedSubject.kt b/app/src/main/java/be/ugent/sel/studeez/data/SelectedSubject.kt new file mode 100644 index 0000000..6e2da9f --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/data/SelectedSubject.kt @@ -0,0 +1,18 @@ +package be.ugent.sel.studeez.data + +import be.ugent.sel.studeez.data.local.models.task.Subject +import javax.inject.Inject +import javax.inject.Singleton + +/** + * Used to communicate the selected subject from the subject overview to the task overview of that subject. + * Because this is a singleton-class the view-models of both screens observe the same data. + */ +@Singleton +class SelectedSubject @Inject constructor() { + private lateinit var subject: Subject + operator fun invoke() = subject + fun set(subject: Subject) { + this.subject = subject + } +} \ 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 5e8ea0f..e84c2bb 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 @@ -5,7 +5,6 @@ import com.google.firebase.firestore.DocumentId data class Subject( @DocumentId val id: String = "", val name: String = "", - val tasks: List = mutableListOf(), val time: Int = 0, val argb_color: Long = 0, ) \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FireBaseCollections.kt b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FireBaseCollections.kt index a36361c..78867c9 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FireBaseCollections.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FireBaseCollections.kt @@ -5,4 +5,5 @@ object FireBaseCollections { const val USER_COLLECTION = "users" const val TIMER_COLLECTION = "timers" const val SUBJECT_COLLECTION = "subjects" + const val TASK_COLLECTION = "tasks" } \ No newline at end of file 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 bfb1493..50c99f0 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 @@ -4,9 +4,11 @@ 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.TaskDAO +import com.google.firebase.firestore.CollectionReference import com.google.firebase.firestore.FirebaseFirestore +import com.google.firebase.firestore.ktx.snapshots import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.flowOf +import kotlinx.coroutines.flow.map import javax.inject.Inject class FireBaseTaskDAO @Inject constructor( @@ -14,18 +16,9 @@ class FireBaseTaskDAO @Inject constructor( private val auth: AccountDAO, ) : TaskDAO { override fun getTasks(subject: Subject): Flow> { - return flowOf( - listOf( - Task( - name = "Test Task", - completed = false, - ), - Task( - name = "Test Task 2", - completed = true, - ) - ) - ) + return selectedSubjectTasksCollection(subject) + .snapshots() + .map { it.toObjects(Task::class.java) } } override fun saveTask(newTask: Task) { @@ -36,4 +29,10 @@ class FireBaseTaskDAO @Inject constructor( TODO("Not yet implemented") } + private fun selectedSubjectTasksCollection(subject: Subject): CollectionReference = + firestore.collection(FireBaseCollections.USER_COLLECTION) + .document(auth.currentUserId) + .collection(FireBaseCollections.SUBJECT_COLLECTION) + .document(subject.id) + .collection(FireBaseCollections.TASK_COLLECTION) } \ No newline at end of file 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 3e7c3e1..fbaee8e 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 @@ -32,7 +32,7 @@ fun SubjectRoute( navigationBarActions = navigationBarActions, addSubject = { viewModel.addSubject() }, getSubjects = viewModel::getSubjects, - onViewSubject = { viewModel.onViewSubject(Subject(), open) }, + onViewSubject = { viewModel.onViewSubject(it, open) }, ) } @@ -42,7 +42,7 @@ fun SubjectScreen( navigationBarActions: NavigationBarActions, addSubject: () -> Unit, getSubjects: () -> Flow>, - onViewSubject: () -> Unit, + onViewSubject: (Subject) -> Unit, ) { PrimaryScreenTemplate( title = resources().getString(R.string.tasks), @@ -71,7 +71,7 @@ fun SubjectScreen( items(subjects.value) { SubjectEntry( subject = it, - onViewSubject = onViewSubject, + onViewSubject = { onViewSubject(it) }, ) } } diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/tasks/SubjectViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/tasks/SubjectViewModel.kt index 455ed49..31c0c0f 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/tasks/SubjectViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/tasks/SubjectViewModel.kt @@ -1,5 +1,7 @@ package be.ugent.sel.studeez.screens.tasks +import android.util.Log +import be.ugent.sel.studeez.data.SelectedSubject import be.ugent.sel.studeez.data.local.models.task.Subject import be.ugent.sel.studeez.domain.LogService import be.ugent.sel.studeez.domain.SubjectDAO @@ -12,13 +14,13 @@ import javax.inject.Inject @HiltViewModel class SubjectViewModel @Inject constructor( private val subjectDAO: SubjectDAO, + private val selectedSubject: SelectedSubject, logService: LogService, ) : StudeezViewModel(logService) { fun addSubject() { subjectDAO.saveSubject( Subject( name = "Test Subject", - tasks = listOf(), time = 0, argb_color = 0xFFF44336, ) @@ -30,6 +32,8 @@ class SubjectViewModel @Inject constructor( } fun onViewSubject(subject: Subject, open: (String) -> Unit) { + Log.v("MYLOG", subject.id) + selectedSubject.set(subject) open(StudeezDestinations.TASKS_SCREEN) } } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/tasks/TaskViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/tasks/TaskViewModel.kt index c86b751..9dc7f2c 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/tasks/TaskViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/tasks/TaskViewModel.kt @@ -1,25 +1,25 @@ package be.ugent.sel.studeez.screens.tasks -import be.ugent.sel.studeez.data.local.models.task.Subject +import be.ugent.sel.studeez.data.SelectedSubject import be.ugent.sel.studeez.data.local.models.task.Task import be.ugent.sel.studeez.domain.LogService import be.ugent.sel.studeez.domain.TaskDAO import be.ugent.sel.studeez.screens.StudeezViewModel import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.flowOf import javax.inject.Inject @HiltViewModel class TaskViewModel @Inject constructor( private val taskDAO: TaskDAO, + private val selectedSubject: SelectedSubject, logService: LogService, ) : StudeezViewModel(logService) { fun addTask() { } - fun getTasks() : Flow> { - return taskDAO.getTasks(Subject()) + fun getTasks(): Flow> { + return taskDAO.getTasks(selectedSubject()) } } \ No newline at end of file