From e1c05bb0d4b8f92c74c9e035f538a372699917b3 Mon Sep 17 00:00:00 2001 From: brreynie Date: Tue, 2 May 2023 22:18:56 +0200 Subject: [PATCH] "#22 styling of task overview" --- .../java/be/ugent/sel/studeez/StudeezApp.kt | 3 +- .../studeez/common/composable/SubjectEntry.kt | 26 +++--- .../be/ugent/sel/studeez/domain/TaskDAO.kt | 3 +- .../domain/implementation/FireBaseTaskDAO.kt | 17 +++- .../studeez/screens/tasks/SubjectScreen.kt | 16 +++- .../studeez/screens/tasks/SubjectViewModel.kt | 5 + .../sel/studeez/screens/tasks/TaskScreen.kt | 93 +++++++++++++++++-- .../studeez/screens/tasks/TaskViewModel.kt | 12 +-- app/src/main/res/values/strings.xml | 2 + 9 files changed, 140 insertions(+), 37 deletions(-) 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 65cd3bb..315c68d 100644 --- a/app/src/main/java/be/ugent/sel/studeez/StudeezApp.kt +++ b/app/src/main/java/be/ugent/sel/studeez/StudeezApp.kt @@ -158,7 +158,8 @@ fun StudeezNavGraph( composable(StudeezDestinations.TASKS_SCREEN) { TaskRoute( - viewModel = hiltViewModel() + goBack = goBack, + viewModel = hiltViewModel(), ) } 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 8de010c..0352327 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 @@ -8,7 +8,6 @@ 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.width import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.Card import androidx.compose.material.Icon @@ -31,6 +30,7 @@ import be.ugent.sel.studeez.data.local.models.timer_functional.HoursMinutesSecon @Composable fun SubjectEntry( subject: Subject, + onViewSubject: () -> Unit, ) { Card( modifier = Modifier @@ -40,12 +40,13 @@ fun SubjectEntry( Row( horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically, -// modifier = Modifier.fillMaxWidth(), ) { Row( horizontalArrangement = Arrangement.spacedBy(8.dp), verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.padding(start = 10.dp).weight(3f) + modifier = Modifier + .padding(start = 10.dp) + .weight(3f) ) { Box( modifier = Modifier @@ -61,8 +62,6 @@ fun SubjectEntry( fontWeight = FontWeight.Bold, overflow = TextOverflow.Ellipsis, maxLines = 1, -// modifier = Modifier.fillMaxWidth(), -// modifier = Modifier.width(200.dp) ) Row( horizontalArrangement = Arrangement.spacedBy(10.dp), @@ -78,16 +77,18 @@ fun SubjectEntry( Icon( imageVector = Icons.Default.List, contentDescription = "tasks" ) - Text(text = "4/9") + Text(text = subject.tasks.size.toString()) } } } } StealthButton( text = R.string.view_task, - modifier = Modifier.padding(start = 10.dp, end = 5.dp).weight(1f) - ) { - + modifier = Modifier + .padding(start = 10.dp, end = 5.dp) + .weight(1f) + ) { + onViewSubject() } } } @@ -98,10 +99,9 @@ fun SubjectEntry( fun SubjectEntryPreview() { SubjectEntry( subject = Subject( - name = "Test Subject longgggggggggggggggggggggggggggggggggggggggg", -// name = "Test Subject", + name = "Test Subject", argb_color = 0xFFF44336, time = 60 - ) - ) + ), + ) {} } \ 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 index 8b9adef..2fb5dde 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 @@ -1,11 +1,12 @@ package be.ugent.sel.studeez.domain +import be.ugent.sel.studeez.data.local.models.task.Subject import be.ugent.sel.studeez.data.local.models.task.Task import kotlinx.coroutines.flow.Flow interface TaskDAO { - fun getTasks(): Flow> + fun getTasks(subject: Subject): Flow> fun saveTask(newTask: Task) 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 2485317..bfb1493 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 @@ -1,18 +1,31 @@ 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.TaskDAO import com.google.firebase.firestore.FirebaseFirestore import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flowOf 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 getTasks(subject: Subject): Flow> { + return flowOf( + listOf( + Task( + name = "Test Task", + completed = false, + ), + Task( + name = "Test Task 2", + completed = true, + ) + ) + ) } override fun saveTask(newTask: Task) { 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 e9ab007..3e7c3e1 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 @@ -31,7 +31,9 @@ fun SubjectRoute( drawerActions = drawerActions, navigationBarActions = navigationBarActions, addSubject = { viewModel.addSubject() }, - ) { viewModel.getSubjects() } + getSubjects = viewModel::getSubjects, + onViewSubject = { viewModel.onViewSubject(Subject(), open) }, + ) } @Composable @@ -40,6 +42,7 @@ fun SubjectScreen( navigationBarActions: NavigationBarActions, addSubject: () -> Unit, getSubjects: () -> Flow>, + onViewSubject: () -> Unit, ) { PrimaryScreenTemplate( title = resources().getString(R.string.tasks), @@ -66,7 +69,10 @@ fun SubjectScreen( // } // } items(subjects.value) { - SubjectEntry(subject = it) + SubjectEntry( + subject = it, + onViewSubject = onViewSubject, + ) } } NewTaskSubjectButton(onClick = addSubject, R.string.new_subject) @@ -80,6 +86,8 @@ fun SubjectScreenPreview() { SubjectScreen( drawerActions = DrawerActions({}, {}, {}, {}, {}), navigationBarActions = NavigationBarActions({ false }, {}, {}, {}, {}), - {}, - ) { flowOf() } + addSubject = {}, + getSubjects = { flowOf() }, + onViewSubject = {}, + ) } \ 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 index 61645c1..455ed49 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 @@ -3,6 +3,7 @@ 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.navigation.StudeezDestinations import be.ugent.sel.studeez.screens.StudeezViewModel import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.Flow @@ -27,4 +28,8 @@ class SubjectViewModel @Inject constructor( fun getSubjects(): Flow> { return subjectDAO.getSubjects() } + + fun onViewSubject(subject: Subject, open: (String) -> Unit) { + open(StudeezDestinations.TASKS_SCREEN) + } } \ 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 d167ddc..b35ecb1 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,34 +1,115 @@ 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.ButtonDefaults +import androidx.compose.material.Icon +import androidx.compose.material.IconButton +import androidx.compose.material.Text +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Edit import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color 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.BasicButton +import be.ugent.sel.studeez.common.composable.NewTaskSubjectButton +import be.ugent.sel.studeez.common.composable.SecondaryScreenTemplate +import be.ugent.sel.studeez.common.ext.basicButton +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.resources import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOf +data class TaskActions( + val addTask: () -> Unit, + val getSubject: () -> Subject, + val getTasks: () -> Flow>, + val deleteSubject: () -> Unit, +) + +fun getTaskActions(viewModel: TaskViewModel): TaskActions { + return TaskActions( + addTask = viewModel::addTask, + getTasks = viewModel::getTasks, + getSubject = { Subject(name = "Test Subject") }, + deleteSubject = {}, + ) +} + @Composable fun TaskRoute( + goBack: () -> Unit, viewModel: TaskViewModel, ) { TaskScreen( - addTask = viewModel::addTask, - getTasks = viewModel::getTasks, + goBack = goBack, + taskActions = getTaskActions(viewModel = viewModel), ) } @Composable fun TaskScreen( - addTask: () -> Unit, - getTasks: () -> Flow>, + goBack: () -> Unit, + taskActions: TaskActions, ) { + SecondaryScreenTemplate( + title = taskActions.getSubject().name, + popUp = goBack, + barAction = { EditAction {} } // TODO implement + ) { + val tasks = taskActions.getTasks().collectAsState(initial = emptyList()) + Column( + modifier = Modifier.padding(top = 5.dp) + ) { + LazyColumn { + items(tasks.value) { + Text(text = it.name) + } + } + NewTaskSubjectButton(onClick = taskActions.addTask, R.string.new_task) + BasicButton( + text = R.string.delete_subject, + modifier = Modifier.basicButton(), + colors = ButtonDefaults.buttonColors( + backgroundColor = Color.Red, + contentColor = Color.White, + ), + onClick = taskActions.deleteSubject, + ) + } + } +} +@Composable +fun EditAction( + onClick: () -> Unit +) { + IconButton(onClick = onClick) { + Icon( + imageVector = Icons.Default.Edit, + contentDescription = resources().getString(R.string.edit_task) + ) + + } } @Preview @Composable fun TaskScreenPreview() { TaskScreen( - addTask = {}, - getTasks = { flowOf() } + goBack = {}, + taskActions = TaskActions( + {}, + { Subject(name = "Test Subject") }, + { 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 eabe81d..c86b751 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,5 +1,6 @@ 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.TaskDAO @@ -19,15 +20,6 @@ class TaskViewModel @Inject constructor( } fun getTasks() : Flow> { - return flowOf(listOf( - Task( - name = "Test Task", - completed = false, - ), - Task( - name = "Test Task 2", - completed = true, - ) - )) + return taskDAO.getTasks(Subject()) } } \ 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 8335853..bb0d6fd 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -45,6 +45,8 @@ New Subject New Task View + Edit Task + Delete Subject Sessions