0
0
mirror of https://github.com/mediathekview/zapp.git synced 2024-09-20 04:12:14 +02:00

Display local results (WIP)

This commit is contained in:
Christine Coenen 2023-08-20 20:49:21 +02:00
parent f1c8e1023b
commit 7592ae774c
3 changed files with 61 additions and 8 deletions

View File

@ -6,12 +6,16 @@ import androidx.paging.Pager
import androidx.paging.PagingConfig
import androidx.paging.PagingData
import androidx.paging.cachedIn
import androidx.paging.map
import de.christinecoenen.code.zapp.app.mediathek.ui.list.adapter.UiModel
import de.christinecoenen.code.zapp.models.shows.SortableMediathekShow
import de.christinecoenen.code.zapp.repositories.MediathekRepository
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.map
@OptIn(ExperimentalCoroutinesApi::class)
class SearchViewModel(private val mediathekRepository: MediathekRepository) : ViewModel() {
@ -46,6 +50,22 @@ class SearchViewModel(private val mediathekRepository: MediathekRepository) : Vi
}
.cachedIn(viewModelScope)
val localShowsResult = _searchQuery
.flatMapLatest { query ->
if (query.isEmpty()) {
flowOf(PagingData.empty())
} else {
// TODO: fetch bookmarks and other local shows too
Pager(pagingConfig) { mediathekRepository.getDownloads(query) }.flow
}
}
.map<PagingData<SortableMediathekShow>, PagingData<UiModel>> { pagingData ->
pagingData.map { show ->
UiModel.MediathekShowModel(show.mediathekShow, show.sortDate)
}
}
.cachedIn(viewModelScope)
fun setSearchQuery(query: String?) {
_searchState.tryEmit(SeachState.Query)
_searchQuery.tryEmit(query ?: "")

View File

@ -10,14 +10,20 @@ import android.view.ViewGroup
import androidx.core.view.MenuProvider
import androidx.fragment.app.Fragment
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.ConcatAdapter
import de.christinecoenen.code.zapp.R
import de.christinecoenen.code.zapp.app.mediathek.ui.list.adapter.MediathekShowListItemListener
import de.christinecoenen.code.zapp.app.mediathek.ui.list.adapter.PagedMediathekShowListAdapter
import de.christinecoenen.code.zapp.app.personal.adapter.HeaderAdapater
import de.christinecoenen.code.zapp.app.search.SearchViewModel
import de.christinecoenen.code.zapp.databinding.SearchResultsFragmentBinding
import de.christinecoenen.code.zapp.models.shows.MediathekShow
import de.christinecoenen.code.zapp.utils.system.LifecycleOwnerHelper.launchOnResumed
import kotlinx.coroutines.flow.collectLatest
import org.koin.androidx.viewmodel.ext.android.activityViewModel
class SearchResultsFragment : Fragment(), MenuProvider {
class SearchResultsFragment : Fragment(), MenuProvider, MediathekShowListItemListener {
private var _binding: SearchResultsFragmentBinding? = null
private val binding: SearchResultsFragmentBinding get() = _binding!!
@ -38,9 +44,26 @@ class SearchResultsFragment : Fragment(), MenuProvider {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val adapter = ConcatAdapter()
val localShowsResultAdapter = PagedMediathekShowListAdapter(
lifecycleScope,
true,
this
)
// TODO: hide header when there are no results
adapter.addAdapter(HeaderAdapater(R.string.activity_main_tab_personal, R.drawable.ic_outline_app_shortcut_24, null))
adapter.addAdapter(localShowsResultAdapter)
// TODO: hide header when there are no results
adapter.addAdapter(HeaderAdapater(R.string.activity_main_tab_mediathek, R.drawable.ic_outline_video_library_24, null))
// TODO: display results from api
binding.results.adapter = adapter
viewLifecycleOwner.launchOnResumed {
viewModel.searchQuery.collectLatest { query ->
binding.results.text = "Results for: $query"
viewModel.localShowsResult.collectLatest { localShows ->
localShowsResultAdapter.submitData(localShows)
}
}
}
@ -65,4 +88,8 @@ class SearchResultsFragment : Fragment(), MenuProvider {
}
}
override fun onShowClicked(show: MediathekShow) {
TODO("Not yet implemented")
}
}

View File

@ -1,15 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".app.search.SearchFragment">
<com.google.android.material.textview.MaterialTextView
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/results"
style="@style/TextAppearance.AppCompat.Display1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Results!" />
android:layout_width="0dp"
android:layout_height="0dp"
android:scrollbars="vertical"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:listitem="@layout/mediathek_list_fragment_item" />
</androidx.constraintlayout.widget.ConstraintLayout>