#22 boilerplate for task screen
This commit is contained in:
		
							parent
							
								
									7ad1047091
								
							
						
					
					
						commit
						1a2e192227
					
				
					 10 changed files with 200 additions and 81 deletions
				
			
		| 
						 | 
				
			
			@ -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) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,4 +30,7 @@ abstract class DatabaseModule {
 | 
			
		|||
 | 
			
		||||
    @Binds
 | 
			
		||||
    abstract fun provideSubjectDAO(impl: FireBaseSubjectDAO): SubjectDAO
 | 
			
		||||
 | 
			
		||||
    @Binds
 | 
			
		||||
    abstract fun provideTaskDAO(impl: FireBaseTaskDAO): TaskDAO
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										13
									
								
								app/src/main/java/be/ugent/sel/studeez/domain/TaskDAO.kt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								app/src/main/java/be/ugent/sel/studeez/domain/TaskDAO.kt
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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<List<Task>>
 | 
			
		||||
 | 
			
		||||
    fun saveTask(newTask: Task)
 | 
			
		||||
 | 
			
		||||
    fun deleteTask(oldTask: Task)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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<List<Task>> {
 | 
			
		||||
        TODO("Not yet implemented")
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun saveTask(newTask: Task) {
 | 
			
		||||
        TODO("Not yet implemented")
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun deleteTask(oldTask: Task) {
 | 
			
		||||
        TODO("Not yet implemented")
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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<List<Subject>>,
 | 
			
		||||
) {
 | 
			
		||||
    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() }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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<List<Subject>> {
 | 
			
		||||
        return subjectDAO.getSubjects()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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<List<Subject>>,
 | 
			
		||||
    addTask: () -> Unit,
 | 
			
		||||
    getTasks: () -> Flow<List<Task>>,
 | 
			
		||||
) {
 | 
			
		||||
    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() }
 | 
			
		||||
    )
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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<List<Subject>> {
 | 
			
		||||
        return subjectDAO.getSubjects()
 | 
			
		||||
    fun getTasks() : Flow<List<Task>> {
 | 
			
		||||
        return flowOf(listOf(
 | 
			
		||||
            Task(
 | 
			
		||||
                name = "Test Task",
 | 
			
		||||
                completed = false,
 | 
			
		||||
            ),
 | 
			
		||||
            Task(
 | 
			
		||||
                name = "Test Task 2",
 | 
			
		||||
                completed = true,
 | 
			
		||||
            )
 | 
			
		||||
        ))
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in a new issue