Cleanup
This commit is contained in:
@@ -9,7 +9,6 @@ import androidx.room.Index
|
|||||||
import androidx.room.PrimaryKey
|
import androidx.room.PrimaryKey
|
||||||
import com.beust.klaxon.JsonObject
|
import com.beust.klaxon.JsonObject
|
||||||
import de.sebse.fuplanner2.R
|
import de.sebse.fuplanner2.R
|
||||||
import de.sebse.fuplanner2.ui.notification.NotificationFragmentDirections
|
|
||||||
import de.sebse.fuplanner2.utils.*
|
import de.sebse.fuplanner2.utils.*
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.GlobalScope
|
import kotlinx.coroutines.GlobalScope
|
||||||
@@ -82,7 +81,7 @@ data class Announcement (
|
|||||||
?.let { AppDatabase.getInstance().courseDao().getCourseById2(it.courseId) }
|
?.let { AppDatabase.getInstance().courseDao().getCourseById2(it.courseId) }
|
||||||
?.let {
|
?.let {
|
||||||
withContext(Dispatchers.Main) {
|
withContext(Dispatchers.Main) {
|
||||||
navController.navigate(NotificationFragmentDirections.actionNavNotificationsToCourseDetails(it.uid!!, it.title))
|
//navController.navigate(NotificationFragmentDirections.actionNavNotificationsToCourseDetails(it.uid!!, it.title))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import androidx.room.Index
|
|||||||
import androidx.room.PrimaryKey
|
import androidx.room.PrimaryKey
|
||||||
import com.beust.klaxon.JsonObject
|
import com.beust.klaxon.JsonObject
|
||||||
import de.sebse.fuplanner2.R
|
import de.sebse.fuplanner2.R
|
||||||
import de.sebse.fuplanner2.ui.notification.NotificationFragmentDirections
|
|
||||||
import de.sebse.fuplanner2.utils.*
|
import de.sebse.fuplanner2.utils.*
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.GlobalScope
|
import kotlinx.coroutines.GlobalScope
|
||||||
@@ -91,7 +90,7 @@ data class Course (
|
|||||||
?.let { AppDatabase.getInstance().courseDao().getCourseById2(it) }
|
?.let { AppDatabase.getInstance().courseDao().getCourseById2(it) }
|
||||||
?.let {
|
?.let {
|
||||||
withContext(Dispatchers.Main) {
|
withContext(Dispatchers.Main) {
|
||||||
navController.navigate(NotificationFragmentDirections.actionNavNotificationsToCourseDetails(it.uid!!, it.title))
|
//navController.navigate(NotificationFragmentDirections.actionNavNotificationsToCourseDetails(it.uid!!, it.title))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ interface CourseDao {
|
|||||||
fun getAll(): LiveData<List<Course>>
|
fun getAll(): LiveData<List<Course>>
|
||||||
|
|
||||||
@Query("SELECT * FROM course INNER JOIN (SELECT year, CASE WHEN isSummerSemester THEN 1 ELSE 0 END AS semester FROM course GROUP BY year, isSummerSemester ORDER BY year DESC, semester ASC LIMIT 1) current WHERE current.year = course.year AND current.semester = CASE WHEN course.isSummerSemester THEN 1 ELSE 0 END ORDER BY title ASC")
|
@Query("SELECT * FROM course INNER JOIN (SELECT year, CASE WHEN isSummerSemester THEN 1 ELSE 0 END AS semester FROM course GROUP BY year, isSummerSemester ORDER BY year DESC, semester ASC LIMIT 1) current WHERE current.year = course.year AND current.semester = CASE WHEN course.isSummerSemester THEN 1 ELSE 0 END ORDER BY title ASC")
|
||||||
|
@RewriteQueriesToDropUnusedColumns
|
||||||
fun getLatestSemester(): LiveData<List<Course>>
|
fun getLatestSemester(): LiveData<List<Course>>
|
||||||
|
|
||||||
@Query("SELECT year, CASE WHEN isSummerSemester THEN 1 ELSE 0 END AS semester FROM course GROUP BY year, isSummerSemester ORDER BY year DESC, semester ASC LIMIT 1")
|
@Query("SELECT year, CASE WHEN isSummerSemester THEN 1 ELSE 0 END AS semester FROM course GROUP BY year, isSummerSemester ORDER BY year DESC, semester ASC LIMIT 1")
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import androidx.room.Index
|
|||||||
import androidx.room.PrimaryKey
|
import androidx.room.PrimaryKey
|
||||||
import com.beust.klaxon.JsonObject
|
import com.beust.klaxon.JsonObject
|
||||||
import de.sebse.fuplanner2.R
|
import de.sebse.fuplanner2.R
|
||||||
import de.sebse.fuplanner2.ui.notification.NotificationFragmentDirections
|
|
||||||
import de.sebse.fuplanner2.utils.*
|
import de.sebse.fuplanner2.utils.*
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.GlobalScope
|
import kotlinx.coroutines.GlobalScope
|
||||||
@@ -81,7 +80,7 @@ data class Event (
|
|||||||
?.let { AppDatabase.getInstance().courseDao().getCourseById2(it.courseId) }
|
?.let { AppDatabase.getInstance().courseDao().getCourseById2(it.courseId) }
|
||||||
?.let {
|
?.let {
|
||||||
withContext(Dispatchers.Main) {
|
withContext(Dispatchers.Main) {
|
||||||
navController.navigate(NotificationFragmentDirections.actionNavNotificationsToCourseDetails(it.uid!!, it.title))
|
//navController.navigate(NotificationFragmentDirections.actionNavNotificationsToCourseDetails(it.uid!!, it.title))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import androidx.navigation.NavType
|
|||||||
import androidx.navigation.compose.composable
|
import androidx.navigation.compose.composable
|
||||||
import androidx.navigation.navArgument
|
import androidx.navigation.navArgument
|
||||||
import de.sebse.fuplanner2.ui.courses.CoursesScreen
|
import de.sebse.fuplanner2.ui.courses.CoursesScreen
|
||||||
import de.sebse.fuplanner2.ui.details.components.CourseDetailsScreen
|
import de.sebse.fuplanner2.ui.details.CourseDetailsScreen
|
||||||
|
|
||||||
sealed class MenuItem {
|
sealed class MenuItem {
|
||||||
object Courses : NavLinks(R.string.menu_courses, R.drawable.ic_menu_courses, "courses")
|
object Courses : NavLinks(R.string.menu_courses, R.drawable.ic_menu_courses, "courses")
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ import de.sebse.fuplanner2.Tools
|
|||||||
import de.sebse.fuplanner2.database.Course
|
import de.sebse.fuplanner2.database.Course
|
||||||
import de.sebse.fuplanner2.ui.details.CoursePreviewProvider
|
import de.sebse.fuplanner2.ui.details.CoursePreviewProvider
|
||||||
import de.sebse.fuplanner2.utils.color.getColor
|
import de.sebse.fuplanner2.utils.color.getColor
|
||||||
|
import de.sebse.fuplanner2.viewmodels.CoursesViewModel
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun CoursesScreen(tools: Tools) {
|
fun CoursesScreen(tools: Tools) {
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
package de.sebse.fuplanner2.ui.details
|
||||||
|
|
||||||
|
import androidx.compose.foundation.layout.Column
|
||||||
|
import androidx.compose.foundation.lazy.LazyColumn
|
||||||
|
import androidx.compose.foundation.lazy.items
|
||||||
|
import androidx.compose.material.MaterialTheme
|
||||||
|
import androidx.compose.material.Text
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
|
import androidx.compose.runtime.livedata.observeAsState
|
||||||
|
import androidx.compose.ui.res.stringResource
|
||||||
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
|
import androidx.compose.ui.tooling.preview.PreviewParameter
|
||||||
|
import androidx.lifecycle.viewmodel.compose.viewModel
|
||||||
|
import com.google.android.material.composethemeadapter.MdcTheme
|
||||||
|
import de.sebse.fuplanner2.R
|
||||||
|
import de.sebse.fuplanner2.Tools
|
||||||
|
import de.sebse.fuplanner2.database.Course
|
||||||
|
import de.sebse.fuplanner2.ui.details.components.QuickLinks
|
||||||
|
import de.sebse.fuplanner2.viewmodels.DetailsViewModel
|
||||||
|
import de.sebse.fuplanner2.viewmodels.DetailsViewModelFactory
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun CourseDetailsScreen(tools: Tools, id: Long) {
|
||||||
|
val coursesViewModel: DetailsViewModel = viewModel(factory = DetailsViewModelFactory(id))
|
||||||
|
val state = coursesViewModel.course.observeAsState()
|
||||||
|
val title = state.value?.title
|
||||||
|
LaunchedEffect(title) {
|
||||||
|
title?.let { tools.setTitle(it) }
|
||||||
|
}
|
||||||
|
CourseDetailsScreen(state.value, id)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun CourseDetailsScreen(course: Course?, id: Long) {
|
||||||
|
Column {
|
||||||
|
QuickLinks(courseId = id)
|
||||||
|
Text(
|
||||||
|
text = stringResource(R.string.lecturers),
|
||||||
|
style = MaterialTheme.typography.h5
|
||||||
|
)
|
||||||
|
LazyColumn {
|
||||||
|
items(course?.lecturers ?: listOf()) {
|
||||||
|
LecturerItem(lecturer = it, courseTitle = course?.title ?: "")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// TODO: Add latest announcements, current assignments, upcoming events
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Preview
|
||||||
|
@Composable
|
||||||
|
fun CourseDetailsScreenPreview(@PreviewParameter(CoursePreviewProvider::class, 1) course: Course) {
|
||||||
|
MdcTheme {
|
||||||
|
CourseDetailsScreen(course, course.uid!!)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,84 +0,0 @@
|
|||||||
package de.sebse.fuplanner2.ui.details
|
|
||||||
|
|
||||||
import android.view.ViewGroup
|
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
|
||||||
import de.sebse.fuplanner2.R
|
|
||||||
import de.sebse.fuplanner2.database.Lecturer
|
|
||||||
import de.sebse.fuplanner2.ui.*
|
|
||||||
import de.sebse.fuplanner2.utils.cast
|
|
||||||
import java.util.*
|
|
||||||
|
|
||||||
class DetailsAdapter(private val onQuickLink: (ButtonTypes) -> Unit, private val onMailTo: (Lecturer) -> Unit) : RecyclerView.Adapter<CustomHolder>() {
|
|
||||||
|
|
||||||
enum class HeaderTypes {
|
|
||||||
BUTTONS, LECTURER, ANNOUNCEMENTS, ASSIGNMENTS, EVENTS;
|
|
||||||
}
|
|
||||||
|
|
||||||
enum class ButtonTypes {
|
|
||||||
DESCRIPTION, RESOURCES, GRADEBOOK, ANNOUNCEMENTS, ASSIGNMENTS, EVENTS;
|
|
||||||
}
|
|
||||||
|
|
||||||
private val positionalData: ArrayList<Any> = arrayListOf()
|
|
||||||
|
|
||||||
var lecturers: List<Lecturer> = listOf()
|
|
||||||
set(value) {
|
|
||||||
field = value
|
|
||||||
updatePositionalData()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun updatePositionalData() {
|
|
||||||
positionalData.clear()
|
|
||||||
positionalData.add(HeaderTypes.BUTTONS)
|
|
||||||
positionalData.add(ViewHolderGenerator.HolderType.BUTTONS)
|
|
||||||
positionalData.add(HeaderTypes.LECTURER)
|
|
||||||
positionalData.addAll(lecturers.sortedBy { it.lastName }.sortedBy { !it.isResponsible })
|
|
||||||
notifyDataSetChanged()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomHolder {
|
|
||||||
return ViewHolderGenerator.getHolderByType(parent, viewType)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onBindViewHolder(holder: CustomHolder, position: Int) {
|
|
||||||
// val viewType = getItemViewType(position)
|
|
||||||
val res = holder.itemView.resources
|
|
||||||
when (holder) {
|
|
||||||
is CaptionHolder -> cast<HeaderTypes>(positionalData[position])?.let { type ->
|
|
||||||
holder.string.text = when (type) {
|
|
||||||
HeaderTypes.BUTTONS -> res.getString(R.string.quick_links)
|
|
||||||
HeaderTypes.LECTURER -> res.getString(R.string.lecturers)
|
|
||||||
HeaderTypes.ANNOUNCEMENTS -> res.getString(R.string.announcements)
|
|
||||||
HeaderTypes.ASSIGNMENTS -> res.getString(R.string.assignments)
|
|
||||||
HeaderTypes.EVENTS -> res.getString(R.string.events)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
is QuickLinksHolder -> {
|
|
||||||
holder.btnAnnouncements.setOnClickListener { this.onQuickLink(ButtonTypes.ANNOUNCEMENTS) }
|
|
||||||
holder.btnAssignments.setOnClickListener { this.onQuickLink(ButtonTypes.ASSIGNMENTS) }
|
|
||||||
holder.btnDescription.setOnClickListener { this.onQuickLink(ButtonTypes.DESCRIPTION) }
|
|
||||||
holder.btnEvents.setOnClickListener { this.onQuickLink(ButtonTypes.EVENTS) }
|
|
||||||
holder.btnGradebook.setOnClickListener { this.onQuickLink(ButtonTypes.GRADEBOOK) }
|
|
||||||
holder.btnResources.setOnClickListener { this.onQuickLink(ButtonTypes.RESOURCES) }
|
|
||||||
}
|
|
||||||
is MailHolder -> cast<Lecturer>(positionalData[position])?.let { type ->
|
|
||||||
holder.title.text = res.getString(R.string.full_name, type.firstName, type.lastName)
|
|
||||||
holder.subLeft.text = type.email
|
|
||||||
holder.itemView.setOnClickListener { this.onMailTo(type) }
|
|
||||||
}
|
|
||||||
is ListItemHolder -> when (positionalData[position]) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getItemViewType(position: Int): Int {
|
|
||||||
return when (positionalData[position]) {
|
|
||||||
is HeaderTypes -> ViewHolderGenerator.HolderType.HEADER.ordinal
|
|
||||||
ViewHolderGenerator.HolderType.BUTTONS -> ViewHolderGenerator.HolderType.BUTTONS.ordinal
|
|
||||||
is Lecturer -> ViewHolderGenerator.HolderType.MAIL.ordinal
|
|
||||||
else -> ViewHolderGenerator.HolderType.ITEM.ordinal
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the size of your dataset (invoked by the layout manager)
|
|
||||||
override fun getItemCount() = positionalData.size
|
|
||||||
}
|
|
||||||
@@ -1,98 +0,0 @@
|
|||||||
package de.sebse.fuplanner2.ui.details
|
|
||||||
|
|
||||||
import android.content.Intent
|
|
||||||
import android.net.Uri
|
|
||||||
import android.os.Bundle
|
|
||||||
import android.view.LayoutInflater
|
|
||||||
import android.view.View
|
|
||||||
import android.view.ViewGroup
|
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
|
||||||
import androidx.compose.foundation.layout.Column
|
|
||||||
import androidx.compose.material.MaterialTheme
|
|
||||||
import androidx.compose.material.Text
|
|
||||||
import androidx.compose.runtime.livedata.observeAsState
|
|
||||||
import androidx.compose.ui.platform.ComposeView
|
|
||||||
import androidx.compose.ui.res.stringResource
|
|
||||||
import androidx.fragment.app.Fragment
|
|
||||||
import androidx.fragment.app.viewModels
|
|
||||||
import androidx.navigation.NavController
|
|
||||||
import androidx.navigation.fragment.findNavController
|
|
||||||
import androidx.navigation.fragment.navArgs
|
|
||||||
import com.google.android.material.composethemeadapter.MdcTheme
|
|
||||||
import de.sebse.fuplanner2.R
|
|
||||||
import de.sebse.fuplanner2.database.Lecturer
|
|
||||||
|
|
||||||
|
|
||||||
class DetailsFragment : Fragment() {
|
|
||||||
|
|
||||||
private val args: DetailsFragmentArgs by navArgs()
|
|
||||||
private val detailsViewModel: DetailsViewModel by viewModels { DetailsViewModelFactory(args.courseId) }
|
|
||||||
private lateinit var navController: NavController
|
|
||||||
|
|
||||||
override fun onCreateView(
|
|
||||||
inflater: LayoutInflater, container: ViewGroup?,
|
|
||||||
savedInstanceState: Bundle?
|
|
||||||
): View {
|
|
||||||
navController = findNavController()
|
|
||||||
return ComposeView(requireContext()).apply {
|
|
||||||
setContent {
|
|
||||||
val course = detailsViewModel.course.observeAsState(null).value
|
|
||||||
(activity as? AppCompatActivity)?.supportActionBar?.title = args.title
|
|
||||||
MdcTheme {
|
|
||||||
Column {
|
|
||||||
Text(
|
|
||||||
text = stringResource(R.string.description),
|
|
||||||
style = MaterialTheme.typography.h5
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun sendMail(lecturer: Lecturer) {
|
|
||||||
val intent = Intent(Intent.ACTION_SENDTO)
|
|
||||||
intent.type = "text/html"
|
|
||||||
intent.data = Uri.fromParts("mailto", lecturer.email, null)
|
|
||||||
intent.putExtra(Intent.EXTRA_SUBJECT, args.title)
|
|
||||||
intent.putExtra(
|
|
||||||
Intent.EXTRA_TEXT,
|
|
||||||
getString(R.string.email_preview, lecturer.firstName, lecturer.lastName)
|
|
||||||
)
|
|
||||||
startActivity(
|
|
||||||
Intent.createChooser(
|
|
||||||
intent,
|
|
||||||
getString(R.string.send_email, lecturer.firstName, lecturer.lastName)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun launchFragment(btnType: DetailsAdapter.ButtonTypes) {
|
|
||||||
when (btnType) {
|
|
||||||
DetailsAdapter.ButtonTypes.DESCRIPTION ->
|
|
||||||
this.navController.navigate(
|
|
||||||
DetailsFragmentDirections.actionCourseDetailsToDescriptionFragment(
|
|
||||||
args.courseId,
|
|
||||||
args.title
|
|
||||||
)
|
|
||||||
)
|
|
||||||
DetailsAdapter.ButtonTypes.RESOURCES -> TODO()
|
|
||||||
DetailsAdapter.ButtonTypes.GRADEBOOK -> TODO()
|
|
||||||
DetailsAdapter.ButtonTypes.ANNOUNCEMENTS ->
|
|
||||||
this.navController.navigate(
|
|
||||||
DetailsFragmentDirections.actionCourseDetailsToCourseAnnouncements(
|
|
||||||
args.courseId,
|
|
||||||
args.title
|
|
||||||
)
|
|
||||||
)
|
|
||||||
DetailsAdapter.ButtonTypes.ASSIGNMENTS -> TODO()
|
|
||||||
DetailsAdapter.ButtonTypes.EVENTS ->
|
|
||||||
this.navController.navigate(
|
|
||||||
DetailsFragmentDirections.actionCourseDetailsToCourseEvents(
|
|
||||||
args.courseId,
|
|
||||||
args.title
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -2,65 +2,25 @@ package de.sebse.fuplanner2.ui.details.components
|
|||||||
|
|
||||||
import androidx.annotation.StringRes
|
import androidx.annotation.StringRes
|
||||||
import androidx.compose.foundation.ExperimentalFoundationApi
|
import androidx.compose.foundation.ExperimentalFoundationApi
|
||||||
import androidx.compose.foundation.layout.Column
|
|
||||||
import androidx.compose.foundation.layout.PaddingValues
|
import androidx.compose.foundation.layout.PaddingValues
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.layout.padding
|
||||||
import androidx.compose.foundation.lazy.GridCells
|
import androidx.compose.foundation.lazy.GridCells
|
||||||
import androidx.compose.foundation.lazy.LazyColumn
|
|
||||||
import androidx.compose.foundation.lazy.LazyVerticalGrid
|
import androidx.compose.foundation.lazy.LazyVerticalGrid
|
||||||
import androidx.compose.foundation.lazy.items
|
|
||||||
import androidx.compose.material.Card
|
import androidx.compose.material.Card
|
||||||
import androidx.compose.material.MaterialTheme
|
import androidx.compose.material.MaterialTheme
|
||||||
import androidx.compose.material.Text
|
import androidx.compose.material.Text
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.LaunchedEffect
|
|
||||||
import androidx.compose.runtime.livedata.observeAsState
|
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.res.dimensionResource
|
import androidx.compose.ui.res.dimensionResource
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.text.style.TextAlign
|
import androidx.compose.ui.text.style.TextAlign
|
||||||
import androidx.compose.ui.tooling.preview.Preview
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
import androidx.compose.ui.tooling.preview.PreviewParameter
|
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.lifecycle.viewmodel.compose.viewModel
|
|
||||||
import com.google.android.material.composethemeadapter.MdcTheme
|
import com.google.android.material.composethemeadapter.MdcTheme
|
||||||
import de.sebse.fuplanner2.R
|
import de.sebse.fuplanner2.R
|
||||||
import de.sebse.fuplanner2.Tools
|
|
||||||
import de.sebse.fuplanner2.database.Course
|
|
||||||
import de.sebse.fuplanner2.ui.details.CoursePreviewProvider
|
|
||||||
import de.sebse.fuplanner2.ui.details.DetailsViewModel
|
|
||||||
import de.sebse.fuplanner2.ui.details.DetailsViewModelFactory
|
|
||||||
import de.sebse.fuplanner2.ui.details.LecturerItem
|
|
||||||
|
|
||||||
|
|
||||||
@Composable
|
|
||||||
fun CourseDetailsScreen(tools: Tools, id: Long) {
|
|
||||||
val coursesViewModel: DetailsViewModel = viewModel(factory = DetailsViewModelFactory(id))
|
|
||||||
val state = coursesViewModel.course.observeAsState()
|
|
||||||
val title = state.value?.title
|
|
||||||
LaunchedEffect(title) {
|
|
||||||
title?.let { tools.setTitle(it) }
|
|
||||||
}
|
|
||||||
CourseDetailsScreen(state.value, id)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Composable
|
|
||||||
fun CourseDetailsScreen(course: Course?, id: Long) {
|
|
||||||
Column {
|
|
||||||
QuickLinks(courseId = id)
|
|
||||||
Text(
|
|
||||||
text = stringResource(R.string.lecturers),
|
|
||||||
style = MaterialTheme.typography.h5
|
|
||||||
)
|
|
||||||
LazyColumn {
|
|
||||||
items(course?.lecturers ?: listOf()) {
|
|
||||||
LecturerItem(lecturer = it, courseTitle = course?.title ?: "")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
data class QuickLinkProps(@StringRes val name: Int, val route: String)
|
data class QuickLinkProps(@StringRes val name: Int, val route: String)
|
||||||
|
|
||||||
@OptIn(ExperimentalFoundationApi::class)
|
@OptIn(ExperimentalFoundationApi::class)
|
||||||
@@ -101,14 +61,6 @@ fun QuickLinks(courseId: Long) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Preview
|
|
||||||
@Composable
|
|
||||||
fun CourseDetailsScreenPreview(@PreviewParameter(CoursePreviewProvider::class, 1) course: Course) {
|
|
||||||
MdcTheme {
|
|
||||||
CourseDetailsScreen(course, course.uid!!)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Preview
|
@Preview
|
||||||
@Composable
|
@Composable
|
||||||
fun QuickLinksPreview() {
|
fun QuickLinksPreview() {
|
||||||
@@ -15,8 +15,8 @@ import androidx.navigation.fragment.findNavController
|
|||||||
import androidx.navigation.fragment.navArgs
|
import androidx.navigation.fragment.navArgs
|
||||||
import de.sebse.fuplanner2.R
|
import de.sebse.fuplanner2.R
|
||||||
import de.sebse.fuplanner2.databinding.FragmentDescriptionBinding
|
import de.sebse.fuplanner2.databinding.FragmentDescriptionBinding
|
||||||
import de.sebse.fuplanner2.ui.details.DetailsViewModel
|
import de.sebse.fuplanner2.viewmodels.DetailsViewModel
|
||||||
import de.sebse.fuplanner2.ui.details.DetailsViewModelFactory
|
import de.sebse.fuplanner2.viewmodels.DetailsViewModelFactory
|
||||||
|
|
||||||
|
|
||||||
class DescriptionFragment : Fragment() {
|
class DescriptionFragment : Fragment() {
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ class ScheduleFragment : Fragment() {
|
|||||||
}
|
}
|
||||||
.setPositiveButton(R.string.view_course) { _, _ ->
|
.setPositiveButton(R.string.view_course) { _, _ ->
|
||||||
alertCourse?.let { course ->
|
alertCourse?.let { course ->
|
||||||
navController.navigate(ScheduleFragmentDirections.actionNavScheduleToCourseDetails(course.uid!!, course.title))
|
//navController.navigate(ScheduleFragmentDirections.actionNavScheduleToCourseDetails(course.uid!!, course.title))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.create()
|
.create()
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package de.sebse.fuplanner2.ui.courses
|
package de.sebse.fuplanner2.viewmodels
|
||||||
|
|
||||||
import androidx.lifecycle.LiveData
|
import androidx.lifecycle.LiveData
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package de.sebse.fuplanner2.ui.details
|
package de.sebse.fuplanner2.viewmodels
|
||||||
|
|
||||||
import androidx.lifecycle.LiveData
|
import androidx.lifecycle.LiveData
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
@@ -14,46 +14,7 @@
|
|||||||
android:id="@+id/nav_schedule"
|
android:id="@+id/nav_schedule"
|
||||||
android:name="de.sebse.fuplanner2.ui.schedule.ScheduleFragment"
|
android:name="de.sebse.fuplanner2.ui.schedule.ScheduleFragment"
|
||||||
android:label="@string/menu_schedule"
|
android:label="@string/menu_schedule"
|
||||||
tools:layout="@layout/fragment_schedule">
|
tools:layout="@layout/fragment_schedule"/>
|
||||||
<action
|
|
||||||
android:id="@+id/action_nav_schedule_to_course_details"
|
|
||||||
app:destination="@id/course_details"
|
|
||||||
app:enterAnim="@anim/slide_in_right"
|
|
||||||
app:exitAnim="@anim/slide_out_left"
|
|
||||||
app:popEnterAnim="@anim/slide_in_left"
|
|
||||||
app:popExitAnim="@anim/slide_out_right" />
|
|
||||||
</fragment>
|
|
||||||
<fragment
|
|
||||||
android:id="@+id/course_details"
|
|
||||||
android:name="de.sebse.fuplanner2.ui.details.DetailsFragment">
|
|
||||||
<action
|
|
||||||
android:id="@+id/action_course_details_to_descriptionFragment"
|
|
||||||
app:destination="@id/course_description"
|
|
||||||
app:enterAnim="@anim/slide_in_right"
|
|
||||||
app:exitAnim="@anim/slide_out_left"
|
|
||||||
app:popEnterAnim="@anim/slide_in_left"
|
|
||||||
app:popExitAnim="@anim/slide_out_right" />
|
|
||||||
<action
|
|
||||||
android:id="@+id/action_course_details_to_course_events"
|
|
||||||
app:destination="@id/course_events"
|
|
||||||
app:enterAnim="@anim/slide_in_right"
|
|
||||||
app:exitAnim="@anim/slide_out_left"
|
|
||||||
app:popEnterAnim="@anim/slide_in_left"
|
|
||||||
app:popExitAnim="@anim/slide_out_right" />
|
|
||||||
<action
|
|
||||||
android:id="@+id/action_course_details_to_course_announcements"
|
|
||||||
app:destination="@id/course_announcements"
|
|
||||||
app:enterAnim="@anim/slide_in_right"
|
|
||||||
app:exitAnim="@anim/slide_out_left"
|
|
||||||
app:popEnterAnim="@anim/slide_in_left"
|
|
||||||
app:popExitAnim="@anim/slide_out_right" />
|
|
||||||
<argument
|
|
||||||
android:name="courseId"
|
|
||||||
app:argType="long" />
|
|
||||||
<argument
|
|
||||||
android:name="title"
|
|
||||||
app:argType="string" />
|
|
||||||
</fragment>
|
|
||||||
<fragment
|
<fragment
|
||||||
android:id="@+id/course_events"
|
android:id="@+id/course_events"
|
||||||
android:name="de.sebse.fuplanner2.ui.details_events.EventsFragment"
|
android:name="de.sebse.fuplanner2.ui.details_events.EventsFragment"
|
||||||
@@ -93,10 +54,5 @@
|
|||||||
android:id="@+id/nav_notifications"
|
android:id="@+id/nav_notifications"
|
||||||
android:name="de.sebse.fuplanner2.ui.notification.NotificationFragment"
|
android:name="de.sebse.fuplanner2.ui.notification.NotificationFragment"
|
||||||
android:label="@string/menu_notifications"
|
android:label="@string/menu_notifications"
|
||||||
tools:layout="@layout/notification_fragment">
|
tools:layout="@layout/notification_fragment"/>
|
||||||
<action
|
|
||||||
android:id="@+id/action_nav_notifications_to_course_details"
|
|
||||||
app:destination="@id/course_details"
|
|
||||||
app:popUpTo="@id/nav_courses" />
|
|
||||||
</fragment>
|
|
||||||
</navigation>
|
</navigation>
|
||||||
|
|||||||
Reference in New Issue
Block a user