From 04f7e29b8a4ace4b23685b7b2badb5604b71e58a Mon Sep 17 00:00:00 2001 From: Sebastian Seedorf Date: Sat, 20 Nov 2021 14:00:23 +0100 Subject: [PATCH] Added announcement list screen --- .../fuplanner2/mainActivityComponents.kt | 10 +++ .../ui/details/CourseDetailsScreen.kt | 4 +- .../ui/details/components/AnnouncementItem.kt | 7 +- .../ui/details/components/QuickLinks.kt | 25 ++++---- .../AnnouncementsAdapter.kt | 40 ------------ .../AnnouncementsFragment.kt | 64 ------------------- .../AnnouncementsViewModel.kt | 19 ------ .../CourseAnnouncementScreen.kt | 9 +-- .../CourseAnnouncementsScreen.kt | 56 ++++++++++++++++ .../de/sebse/fuplanner2/ui/shared/Heading.kt | 1 + app/src/main/res/navigation/nav_graph.xml | 12 ---- 11 files changed, 87 insertions(+), 160 deletions(-) delete mode 100644 app/src/main/java/de/sebse/fuplanner2/ui/details_announcements/AnnouncementsAdapter.kt delete mode 100644 app/src/main/java/de/sebse/fuplanner2/ui/details_announcements/AnnouncementsFragment.kt delete mode 100644 app/src/main/java/de/sebse/fuplanner2/ui/details_announcements/AnnouncementsViewModel.kt create mode 100644 app/src/main/java/de/sebse/fuplanner2/ui/details_announcements/CourseAnnouncementsScreen.kt diff --git a/app/src/main/java/de/sebse/fuplanner2/mainActivityComponents.kt b/app/src/main/java/de/sebse/fuplanner2/mainActivityComponents.kt index 82b3889..57ea63c 100644 --- a/app/src/main/java/de/sebse/fuplanner2/mainActivityComponents.kt +++ b/app/src/main/java/de/sebse/fuplanner2/mainActivityComponents.kt @@ -8,6 +8,7 @@ import androidx.navigation.navArgument import de.sebse.fuplanner2.ui.courses.CoursesScreen import de.sebse.fuplanner2.ui.details.CourseDetailsScreen import de.sebse.fuplanner2.ui.details_announcements.CourseAnnouncementScreen +import de.sebse.fuplanner2.ui.details_announcements.CourseAnnouncementsScreen import de.sebse.fuplanner2.ui.details_description.CourseDescriptionScreen sealed class MenuItem { @@ -53,6 +54,15 @@ fun MainActivityComposable() { val id = it.arguments!!.getLong("id") CourseDescriptionScreen(tools, id) } + composable( + arguments = listOf( + navArgument("id") { type = NavType.LongType } + ), + route = "${MenuItem.Courses.route}/{id}/announcements" + ) { + val id = it.arguments!!.getLong("id") + CourseAnnouncementsScreen(tools, id) + } composable( arguments = listOf( navArgument("id") { type = NavType.LongType }, diff --git a/app/src/main/java/de/sebse/fuplanner2/ui/details/CourseDetailsScreen.kt b/app/src/main/java/de/sebse/fuplanner2/ui/details/CourseDetailsScreen.kt index add8056..019b72c 100644 --- a/app/src/main/java/de/sebse/fuplanner2/ui/details/CourseDetailsScreen.kt +++ b/app/src/main/java/de/sebse/fuplanner2/ui/details/CourseDetailsScreen.kt @@ -1,5 +1,6 @@ package de.sebse.fuplanner2.ui.details +import android.content.res.Configuration import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.runtime.Composable @@ -91,7 +92,8 @@ fun CourseDetailsScreen( } } -@Preview +@Preview(showBackground = true) +@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES, showBackground = true) @Composable fun CourseDetailsScreenPreview(@PreviewParameter(CoursePreviewProvider::class, 1) course: Course) { AppTheme { diff --git a/app/src/main/java/de/sebse/fuplanner2/ui/details/components/AnnouncementItem.kt b/app/src/main/java/de/sebse/fuplanner2/ui/details/components/AnnouncementItem.kt index c4398d1..c95a53b 100644 --- a/app/src/main/java/de/sebse/fuplanner2/ui/details/components/AnnouncementItem.kt +++ b/app/src/main/java/de/sebse/fuplanner2/ui/details/components/AnnouncementItem.kt @@ -14,11 +14,6 @@ import de.sebse.fuplanner2.ui.theme.AppTheme import de.sebse.fuplanner2.ui.tools.previews.AnnouncementPreviewProvider import de.sebse.fuplanner2.utils.toDateTimeString -@Composable -fun AnnouncementItem(announcement: Announcement) { - AnnouncementItem(announcement) { } -} - @Composable fun AnnouncementItem(announcement: Announcement, click: () -> Unit) { FuCardColumn( @@ -40,6 +35,6 @@ fun AnnouncementItem(announcement: Announcement, click: () -> Unit) { @Composable fun AnnouncementItemPreview(@PreviewParameter(AnnouncementPreviewProvider::class, 5) announcement: Announcement) { AppTheme { - AnnouncementItem(announcement) + AnnouncementItem(announcement) { } } } diff --git a/app/src/main/java/de/sebse/fuplanner2/ui/details/components/QuickLinks.kt b/app/src/main/java/de/sebse/fuplanner2/ui/details/components/QuickLinks.kt index 5025e84..f57315e 100644 --- a/app/src/main/java/de/sebse/fuplanner2/ui/details/components/QuickLinks.kt +++ b/app/src/main/java/de/sebse/fuplanner2/ui/details/components/QuickLinks.kt @@ -1,12 +1,13 @@ package de.sebse.fuplanner2.ui.details.components +import android.content.res.Configuration import androidx.annotation.StringRes import androidx.compose.foundation.ExperimentalFoundationApi -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.GridCells -import androidx.compose.material.Card +import androidx.compose.material.Button +import androidx.compose.material.ButtonDefaults.buttonColors import androidx.compose.material.MaterialTheme import androidx.compose.material.Text import androidx.compose.runtime.Composable @@ -37,28 +38,28 @@ fun QuickLinks(courseId: Long, onClick: (String) -> Unit) { cells = GridCells.Adaptive(150.dp) ) { list.forEach { - Card( - backgroundColor = MaterialTheme.colors.secondary, + Button( + colors = buttonColors( + backgroundColor = MaterialTheme.colors.secondary, + contentColor = MaterialTheme.colors.onSecondary, + ), modifier = Modifier .padding(dimensionResource(R.dimen.card_view_margin)) - .fillMaxWidth() - .clickable { onClick(it.route) }, - elevation = dimensionResource(R.dimen.card_view_elevation), + .fillMaxWidth(), + onClick = { onClick(it.route) } ) { Text( text = stringResource(it.name), - color = MaterialTheme.colors.onSecondary, textAlign = TextAlign.Center, - style = MaterialTheme.typography.h6, - modifier = Modifier - .padding(dimensionResource(R.dimen.card_view_padding)) + style = MaterialTheme.typography.h6 ) } } } } -@Preview +@Preview(showBackground = true) +@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES, showBackground = true) @Composable fun QuickLinksPreview() { AppTheme { diff --git a/app/src/main/java/de/sebse/fuplanner2/ui/details_announcements/AnnouncementsAdapter.kt b/app/src/main/java/de/sebse/fuplanner2/ui/details_announcements/AnnouncementsAdapter.kt deleted file mode 100644 index ee2f375..0000000 --- a/app/src/main/java/de/sebse/fuplanner2/ui/details_announcements/AnnouncementsAdapter.kt +++ /dev/null @@ -1,40 +0,0 @@ -package de.sebse.fuplanner2.ui.details_announcements - -import android.view.ViewGroup -import androidx.paging.PagedListAdapter -import androidx.recyclerview.widget.DiffUtil -import de.sebse.fuplanner2.database.Announcement -import de.sebse.fuplanner2.ui.ListItemHolder -import de.sebse.fuplanner2.utils.toDateTimeString - -class AnnouncementsAdapter() : PagedListAdapter(EventDiffCallback()) { - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListItemHolder { - return ListItemHolder.invoke(parent) - } - - override fun onBindViewHolder(holder: ListItemHolder, position: Int) { - val event = getItem(position) - val actCtx = holder.itemView.context - - event?.let { - holder.title.text = it.title - holder.subLeft.text = it.createdOn.toDateTimeString(actCtx) - holder.subRight.text = it.createdBy - } ?: run { - holder.clear() - holder.itemView.setOnClickListener(null) - } - } -} - -class EventDiffCallback : DiffUtil.ItemCallback() { - - override fun areItemsTheSame(oldItem: Announcement, newItem: Announcement): Boolean { - return oldItem.uid == newItem.uid - } - - override fun areContentsTheSame(oldItem: Announcement, newItem: Announcement): Boolean { - return oldItem.getHash() == newItem.getHash() - } -} \ No newline at end of file diff --git a/app/src/main/java/de/sebse/fuplanner2/ui/details_announcements/AnnouncementsFragment.kt b/app/src/main/java/de/sebse/fuplanner2/ui/details_announcements/AnnouncementsFragment.kt deleted file mode 100644 index 69bda28..0000000 --- a/app/src/main/java/de/sebse/fuplanner2/ui/details_announcements/AnnouncementsFragment.kt +++ /dev/null @@ -1,64 +0,0 @@ -package de.sebse.fuplanner2.ui.details_announcements - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.fragment.app.Fragment -import androidx.fragment.app.viewModels -import androidx.lifecycle.Observer -import androidx.navigation.NavController -import androidx.navigation.fragment.findNavController -import androidx.navigation.fragment.navArgs -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.work.workDataOf -import de.sebse.fuplanner2.R -import de.sebse.fuplanner2.auth.AppAccounts -import de.sebse.fuplanner2.databinding.FragmentRefreshRecyclerBinding -import de.sebse.fuplanner2.utils.console -import de.sebse.fuplanner2.utils.enqueueOneTimeWork -import de.sebse.fuplanner2.worker.AbstractAccountWorker.Companion.KEY_ACCOUNT_NAME -import de.sebse.fuplanner2.worker.AbstractAccountWorker.Companion.KEY_COURSE_ID -import de.sebse.fuplanner2.worker.AnnouncementWorker - -class AnnouncementsFragment : Fragment() { - - private var title: String = "" - private val args: AnnouncementsFragmentArgs by navArgs() - private val announcementsViewModel: AnnouncementsViewModel by viewModels { AnnouncementsViewModelFactory(args.courseId) } - private lateinit var navController: NavController - private lateinit var binding: FragmentRefreshRecyclerBinding - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - val viewManager = LinearLayoutManager(context) - val viewAdapter = AnnouncementsAdapter() - return inflater.inflate(R.layout.fragment_refresh_recycler, container, false).apply { - console.log(findViewById(R.id.recycler_view), binding.recyclerView) - binding.recyclerView.apply { - setHasFixedSize(true) - - layoutManager = viewManager - adapter = viewAdapter - } - binding.swipeRefreshLayout.setOnRefreshListener { - enqueueOneTimeWork(context.applicationContext) { - it.setInputData(workDataOf( - KEY_ACCOUNT_NAME to AppAccounts.getInstance().selectedAccount?.name, - KEY_COURSE_ID to args.courseId - )) - }.observe(viewLifecycleOwner, Observer { - if (it.state.isFinished) - binding.swipeRefreshLayout.isRefreshing = false - }) - } - announcementsViewModel.events.observe(viewLifecycleOwner, Observer { - viewAdapter.submitList(it) - this@AnnouncementsFragment.title = args.title - }) - navController = findNavController() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/de/sebse/fuplanner2/ui/details_announcements/AnnouncementsViewModel.kt b/app/src/main/java/de/sebse/fuplanner2/ui/details_announcements/AnnouncementsViewModel.kt deleted file mode 100644 index 006ec7f..0000000 --- a/app/src/main/java/de/sebse/fuplanner2/ui/details_announcements/AnnouncementsViewModel.kt +++ /dev/null @@ -1,19 +0,0 @@ -package de.sebse.fuplanner2.ui.details_announcements - -import androidx.lifecycle.LiveData -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import androidx.paging.LivePagedListBuilder -import androidx.paging.PagedList -import de.sebse.fuplanner2.database.Announcement -import de.sebse.fuplanner2.database.AppDatabase - -class AnnouncementsViewModelFactory(private val courseId: Long): ViewModelProvider.NewInstanceFactory() { - override fun create(modelClass: Class): T = AnnouncementsViewModel(courseId) as T -} - -class AnnouncementsViewModel(private val courseId: Long) : ViewModel() { - private val factory = AppDatabase.getInstance().announcementDao().getAll1(courseId) - - val events: LiveData> = LivePagedListBuilder(factory, 50).build() -} diff --git a/app/src/main/java/de/sebse/fuplanner2/ui/details_announcements/CourseAnnouncementScreen.kt b/app/src/main/java/de/sebse/fuplanner2/ui/details_announcements/CourseAnnouncementScreen.kt index 37a682b..c2d1a02 100644 --- a/app/src/main/java/de/sebse/fuplanner2/ui/details_announcements/CourseAnnouncementScreen.kt +++ b/app/src/main/java/de/sebse/fuplanner2/ui/details_announcements/CourseAnnouncementScreen.kt @@ -16,11 +16,10 @@ import androidx.lifecycle.viewmodel.compose.viewModel import de.sebse.fuplanner2.R import de.sebse.fuplanner2.Tools import de.sebse.fuplanner2.database.Announcement -import de.sebse.fuplanner2.database.Course import de.sebse.fuplanner2.ui.shared.Heading import de.sebse.fuplanner2.ui.shared.HtmlText import de.sebse.fuplanner2.ui.theme.AppTheme -import de.sebse.fuplanner2.ui.tools.previews.CoursePreviewProvider +import de.sebse.fuplanner2.ui.tools.previews.AnnouncementPreviewProvider import de.sebse.fuplanner2.ui.tools.viewmodels.AnnouncementViewModel import de.sebse.fuplanner2.ui.tools.viewmodels.AnnouncementViewModelFactory import de.sebse.fuplanner2.ui.tools.viewmodels.DetailsViewModel @@ -57,10 +56,8 @@ fun CourseAnnouncementScreen(announcement: Announcement) { @Preview @Composable -fun CourseAnnouncementScreenPreview(@PreviewParameter(CoursePreviewProvider::class, 1) course: Course) { +fun CourseAnnouncementScreenPreview(@PreviewParameter(AnnouncementPreviewProvider::class, 2) announcement: Announcement) { AppTheme { - /*CourseAnnouncementScreen( - "scripfsdfsfg
tion" - )*/ + CourseAnnouncementScreen(announcement) } } diff --git a/app/src/main/java/de/sebse/fuplanner2/ui/details_announcements/CourseAnnouncementsScreen.kt b/app/src/main/java/de/sebse/fuplanner2/ui/details_announcements/CourseAnnouncementsScreen.kt new file mode 100644 index 0000000..2d5b3c3 --- /dev/null +++ b/app/src/main/java/de/sebse/fuplanner2/ui/details_announcements/CourseAnnouncementsScreen.kt @@ -0,0 +1,56 @@ +package de.sebse.fuplanner2.ui.details_announcements + +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.lifecycle.viewmodel.compose.viewModel +import de.sebse.fuplanner2.MenuItem +import de.sebse.fuplanner2.R +import de.sebse.fuplanner2.Tools +import de.sebse.fuplanner2.database.Announcement +import de.sebse.fuplanner2.ui.details.components.AnnouncementItem +import de.sebse.fuplanner2.ui.theme.AppTheme +import de.sebse.fuplanner2.ui.tools.previews.AnnouncementPreviewProvider +import de.sebse.fuplanner2.ui.tools.viewmodels.DetailsViewModel +import de.sebse.fuplanner2.ui.tools.viewmodels.DetailsViewModelFactory + +@Composable +fun CourseAnnouncementsScreen(tools: Tools, id: Long) { + val coursesViewModel: DetailsViewModel = + viewModel(factory = DetailsViewModelFactory(id)) + val course by coursesViewModel.course.observeAsState() + val announcements by coursesViewModel.announcements.observeAsState() + val title = course?.title ?: stringResource(id = R.string.description) + LaunchedEffect(title) { + tools.setTitle(title) + } + announcements?.let { CourseAnnouncementsScreen(it) { uid -> + tools.navTo("${MenuItem.Courses.route}/$id/announcements/${uid}") + } } +} + +@Composable +fun CourseAnnouncementsScreen(announcements: List, onClick: (Long) -> Unit) { + LazyColumn { + items(announcements) { + AnnouncementItem(it) { + it.uid?.let { uid -> onClick(uid) } + } + } + } +} + +@Preview +@Composable +fun CourseAnnouncementsScreenPreview() { + AppTheme { + CourseAnnouncementsScreen( + AnnouncementPreviewProvider().values.take(10).toList() + ) { } + } +} diff --git a/app/src/main/java/de/sebse/fuplanner2/ui/shared/Heading.kt b/app/src/main/java/de/sebse/fuplanner2/ui/shared/Heading.kt index 85401f5..058885a 100644 --- a/app/src/main/java/de/sebse/fuplanner2/ui/shared/Heading.kt +++ b/app/src/main/java/de/sebse/fuplanner2/ui/shared/Heading.kt @@ -23,6 +23,7 @@ fun Heading(text: String, onClick: (() -> Unit)? = null) { Text( text = text, style = MaterialTheme.typography.h5, + color = MaterialTheme.colors.onSurface, modifier = Modifier .padding(top = dimensionResource(id = R.dimen.header_padding)) ) diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml index 3956e5b..8c3e558 100644 --- a/app/src/main/res/navigation/nav_graph.xml +++ b/app/src/main/res/navigation/nav_graph.xml @@ -27,18 +27,6 @@ android:name="title" app:argType="string" /> - - - -