diff --git a/app/src/main/java/be/ugent/sel/studeez/StudeezApp.kt b/app/src/main/java/be/ugent/sel/studeez/StudeezApp.kt index d72bedf..65cd3bb 100644 --- a/app/src/main/java/be/ugent/sel/studeez/StudeezApp.kt +++ b/app/src/main/java/be/ugent/sel/studeez/StudeezApp.kt @@ -40,6 +40,7 @@ import be.ugent.sel.studeez.screens.session.SessionRoute import be.ugent.sel.studeez.screens.session_recap.SessionRecapRoute import be.ugent.sel.studeez.screens.sign_up.SignUpRoute import be.ugent.sel.studeez.screens.splash.SplashRoute +import be.ugent.sel.studeez.screens.tasks.SubjectRoute import be.ugent.sel.studeez.screens.tasks.TaskRoute import be.ugent.sel.studeez.screens.timer_overview.TimerOverviewRoute import be.ugent.sel.studeez.screens.timer_selection.TimerSelectionRoute @@ -146,14 +147,21 @@ fun StudeezNavGraph( ) } - composable(StudeezDestinations.TASKS_SCREEN) { - TaskRoute( + composable(StudeezDestinations.SUBJECT_SCREEN) { + SubjectRoute( open = open, viewModel = hiltViewModel(), drawerActions = drawerActions, navigationBarActions = navigationBarActions, ) } + + composable(StudeezDestinations.TASKS_SCREEN) { + TaskRoute( + viewModel = hiltViewModel() + ) + } + // TODO Sessions screen composable(StudeezDestinations.PROFILE_SCREEN) { 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 7b1d012..8a39fc1 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 @@ -3,6 +3,7 @@ package be.ugent.sel.studeez.common.composable.navbar 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.SUBJECT_SCREEN import be.ugent.sel.studeez.navigation.StudeezDestinations.TASKS_SCREEN import be.ugent.sel.studeez.screens.StudeezViewModel import dagger.hilt.android.lifecycle.HiltViewModel @@ -18,7 +19,7 @@ class NavigationBarViewModel @Inject constructor( } fun onTasksClick(open: (String) -> Unit) { - open(TASKS_SCREEN) + open(SUBJECT_SCREEN) } fun onSessionsClick(open: (String) -> Unit) { diff --git a/app/src/main/java/be/ugent/sel/studeez/di/DatabaseModule.kt b/app/src/main/java/be/ugent/sel/studeez/di/DatabaseModule.kt index e4228bb..7ee4992 100644 --- a/app/src/main/java/be/ugent/sel/studeez/di/DatabaseModule.kt +++ b/app/src/main/java/be/ugent/sel/studeez/di/DatabaseModule.kt @@ -30,4 +30,7 @@ abstract class DatabaseModule { @Binds abstract fun provideSubjectDAO(impl: FireBaseSubjectDAO): SubjectDAO + + @Binds + abstract fun provideTaskDAO(impl: FireBaseTaskDAO): TaskDAO } \ No newline at end of file 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 new file mode 100644 index 0000000..8b9adef --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/domain/TaskDAO.kt @@ -0,0 +1,13 @@ +package be.ugent.sel.studeez.domain + +import be.ugent.sel.studeez.data.local.models.task.Task +import kotlinx.coroutines.flow.Flow + +interface TaskDAO { + + fun getTasks(): Flow> + + fun saveTask(newTask: Task) + + fun deleteTask(oldTask: Task) +} \ 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 new file mode 100644 index 0000000..2485317 --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FireBaseTaskDAO.kt @@ -0,0 +1,26 @@ +package be.ugent.sel.studeez.domain.implementation + +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.FirebaseFirestore +import kotlinx.coroutines.flow.Flow +import javax.inject.Inject + +class FireBaseTaskDAO @Inject constructor( + private val firestore: FirebaseFirestore, + private val auth: AccountDAO, +) : TaskDAO { + override fun getTasks(): Flow> { + TODO("Not yet implemented") + } + + override fun saveTask(newTask: Task) { + TODO("Not yet implemented") + } + + override fun deleteTask(oldTask: Task) { + TODO("Not yet implemented") + } + +} \ No newline at end of file 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 c6d39cd..1d7ed4a 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 @@ -10,8 +10,10 @@ object StudeezDestinations { const val TIMER_SELECTION_SCREEN = "timer_selection" const val SESSION_SCREEN = "session" const val SESSION_RECAP = "session_recap" - const val TASKS_SCREEN = "tasks" - // const val SESSIONS_SCREEN = "sessions" + const val SUBJECT_SCREEN = "subjects" + const val TASKS_SCREEN = "tasks" + + // const val SESSIONS_SCREEN = "sessions" const val PROFILE_SCREEN = "profile" // const val TIMERS_SCREEN = "timers" 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 new file mode 100644 index 0000000..e9ab007 --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/tasks/SubjectScreen.kt @@ -0,0 +1,85 @@ +package be.ugent.sel.studeez.screens.tasks + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import be.ugent.sel.studeez.R +import be.ugent.sel.studeez.common.composable.NewTaskSubjectButton +import be.ugent.sel.studeez.common.composable.PrimaryScreenTemplate +import be.ugent.sel.studeez.common.composable.SubjectEntry +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.task.Subject +import be.ugent.sel.studeez.resources +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flowOf + +@Composable +fun SubjectRoute( + open: (String) -> Unit, + viewModel: SubjectViewModel, + drawerActions: DrawerActions, + navigationBarActions: NavigationBarActions, +) { + SubjectScreen( + drawerActions = drawerActions, + navigationBarActions = navigationBarActions, + addSubject = { viewModel.addSubject() }, + ) { viewModel.getSubjects() } +} + +@Composable +fun SubjectScreen( + drawerActions: DrawerActions, + navigationBarActions: NavigationBarActions, + addSubject: () -> Unit, + getSubjects: () -> Flow>, +) { + PrimaryScreenTemplate( + title = resources().getString(R.string.tasks), + drawerActions = drawerActions, + navigationBarActions = navigationBarActions, + barAction = {}, + ) { + val subjects = getSubjects().collectAsState(initial = emptyList()) + Column( + modifier = Modifier.padding(top = 5.dp) + ) { + LazyColumn { +// if (subjects.value.isNotEmpty()) { +// item { +// SubjectEntry(subject = subjects.value[0]) +// } +// } +// if (subjects.value.size > 1) { +// items(subjects.value.subList(1, subjects.value.lastIndex + 1)) { +// Column { +// Divider(modifier = Modifier.padding(10.dp, 0.dp)) +// SubjectEntry(subject = it) +// } +// } +// } + items(subjects.value) { + SubjectEntry(subject = it) + } + } + NewTaskSubjectButton(onClick = addSubject, R.string.new_subject) + } + } +} + +@Preview +@Composable +fun SubjectScreenPreview() { + SubjectScreen( + drawerActions = DrawerActions({}, {}, {}, {}, {}), + navigationBarActions = NavigationBarActions({ false }, {}, {}, {}, {}), + {}, + ) { flowOf() } +} \ No newline at end of file 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 new file mode 100644 index 0000000..61645c1 --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/tasks/SubjectViewModel.kt @@ -0,0 +1,30 @@ +package be.ugent.sel.studeez.screens.tasks + +import be.ugent.sel.studeez.data.local.models.task.Subject +import be.ugent.sel.studeez.domain.LogService +import be.ugent.sel.studeez.domain.SubjectDAO +import be.ugent.sel.studeez.screens.StudeezViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.Flow +import javax.inject.Inject + +@HiltViewModel +class SubjectViewModel @Inject constructor( + private val subjectDAO: SubjectDAO, + logService: LogService, +) : StudeezViewModel(logService) { + fun addSubject() { + subjectDAO.saveSubject( + Subject( + name = "Test Subject", + tasks = listOf(), + time = 0, + argb_color = 0xFFF44336, + ) + ) + } + + fun getSubjects(): Flow> { + return subjectDAO.getSubjects() + } +} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/tasks/TaskScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/tasks/TaskScreen.kt index ea9b6d4..d167ddc 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/tasks/TaskScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/tasks/TaskScreen.kt @@ -1,86 +1,34 @@ package be.ugent.sel.studeez.screens.tasks -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items -import androidx.compose.material.Divider import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState -import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import be.ugent.sel.studeez.R -import be.ugent.sel.studeez.common.composable.NewTaskSubjectButton -import be.ugent.sel.studeez.common.composable.PrimaryScreenTemplate -import be.ugent.sel.studeez.common.composable.SubjectEntry -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.task.Subject -import be.ugent.sel.studeez.resources +import be.ugent.sel.studeez.data.local.models.task.Task import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOf @Composable fun TaskRoute( - open: (String) -> Unit, viewModel: TaskViewModel, - drawerActions: DrawerActions, - navigationBarActions: NavigationBarActions, ) { TaskScreen( - drawerActions = drawerActions, - navigationBarActions = navigationBarActions, - addSubject = { viewModel.addSubject() }, - ) { viewModel.getSubjects() } + addTask = viewModel::addTask, + getTasks = viewModel::getTasks, + ) } @Composable fun TaskScreen( - drawerActions: DrawerActions, - navigationBarActions: NavigationBarActions, - addSubject: () -> Unit, - getSubjects: () -> Flow>, + addTask: () -> Unit, + getTasks: () -> Flow>, ) { - PrimaryScreenTemplate( - title = resources().getString(R.string.tasks), - drawerActions = drawerActions, - navigationBarActions = navigationBarActions, - barAction = {}, - ) { - val subjects = getSubjects().collectAsState(initial = emptyList()) - Column( - modifier = Modifier.padding(top = 5.dp) - ) { - LazyColumn { -// if (subjects.value.isNotEmpty()) { -// item { -// SubjectEntry(subject = subjects.value[0]) -// } -// } -// if (subjects.value.size > 1) { -// items(subjects.value.subList(1, subjects.value.lastIndex + 1)) { -// Column { -// Divider(modifier = Modifier.padding(10.dp, 0.dp)) -// SubjectEntry(subject = it) -// } -// } -// } - items(subjects.value) { - SubjectEntry(subject = it) - } - } - NewTaskSubjectButton(onClick = addSubject, R.string.new_subject) - } - } + } @Preview @Composable fun TaskScreenPreview() { TaskScreen( - drawerActions = DrawerActions({}, {}, {}, {}, {}), - navigationBarActions = NavigationBarActions({ false }, {}, {}, {}, {}), - {}, - ) { flowOf() } + addTask = {}, + getTasks = { flowOf() } + ) } \ 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 cbd46c2..eabe81d 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,30 +1,33 @@ package be.ugent.sel.studeez.screens.tasks -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.LogService -import be.ugent.sel.studeez.domain.SubjectDAO +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 subjectDAO: SubjectDAO, + private val taskDAO: TaskDAO, logService: LogService, ) : StudeezViewModel(logService) { - fun addSubject() { - subjectDAO.saveSubject( - Subject( - name = "Test Subject", - tasks = listOf(), - time = 0, - argb_color = 0xFFF44336, - ) - ) + fun addTask() { + } - fun getSubjects(): Flow> { - return subjectDAO.getSubjects() + fun getTasks() : Flow> { + return flowOf(listOf( + Task( + name = "Test Task", + completed = false, + ), + Task( + name = "Test Task 2", + completed = true, + ) + )) } } \ No newline at end of file