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:
parent
f1c8e1023b
commit
7592ae774c
@ -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 ?: "")
|
||||
|
@ -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")
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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>
|
||||
|
Loading…
Reference in New Issue
Block a user