Skip to content

Commit

Permalink
Fix search action ignoring received query
Browse files Browse the repository at this point in the history
(cherry picked from commit 2784a1b)
  • Loading branch information
nielsvanvelzen committed Mar 12, 2024
1 parent ec5c751 commit 4e8e8bc
Show file tree
Hide file tree
Showing 7 changed files with 46 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ class HomeFragment : Fragment() {
}

binding.search.setOnClickListener {
navigationRepository.navigate(Destinations.search)
navigationRepository.navigate(Destinations.search())
}

return binding.root
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,9 @@ object Destinations {

// General
val home = fragmentDestination<HomeFragment>()
val search = fragmentDestination<SearchFragment>()
fun search(query: String? = null) = fragmentDestination<SearchFragment>(
SearchFragment.EXTRA_QUERY to query,
)
val userPreferences = preferenceDestination<UserPreferencesScreen>()

// Browsing
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ class LeanbackSearchFragment : SearchSupportFragment(), SearchSupportFragment.Se
viewModel.searchResultsFlow
.onEach { searchFragmentDelegate.showResults(it) }
.launchIn(lifecycleScope)

val query = arguments?.getString(SearchFragment.EXTRA_QUERY)
if (!query.isNullOrBlank()) setSearchQuery(query, true)
}

override fun getResultsAdapter() = searchFragmentDelegate.rowsAdapter
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,14 @@ import android.os.Bundle
import android.speech.SpeechRecognizer
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import androidx.fragment.app.commit
import org.jellyfin.androidtv.R

class SearchFragment : Fragment(R.layout.fragment_content_view) {
companion object {
const val EXTRA_QUERY = "query"
}

private val isSpeechEnabled by lazy {
SpeechRecognizer.isRecognitionAvailable(requireContext())
&& ContextCompat.checkSelfPermission(
Expand All @@ -22,14 +27,13 @@ class SearchFragment : Fragment(R.layout.fragment_content_view) {

// Determine fragment to use
val searchFragment = when {
isSpeechEnabled -> LeanbackSearchFragment()
else -> TextSearchFragment()
isSpeechEnabled -> LeanbackSearchFragment::class.java
else -> TextSearchFragment::class.java
}

// Add fragment
childFragmentManager
.beginTransaction()
.replace(R.id.content_view, searchFragment)
.commit()
childFragmentManager.commit {
replace(R.id.content_view, searchFragment, arguments)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import android.view.inputmethod.InputMethodManager
import android.widget.EditText
import androidx.core.content.getSystemService
import androidx.fragment.app.Fragment
import androidx.fragment.app.commit
import androidx.leanback.app.RowsSupportFragment
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.flow.launchIn
Expand All @@ -36,26 +37,40 @@ class TextSearchFragment : Fragment() {
savedInstanceState: Bundle?
): View {
_binding = FragmentSearchTextBinding.inflate(inflater, container, false)
return binding.root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

binding.searchBar.apply {
onTextChanged { viewModel.searchDebounced(it) }
onSubmit { viewModel.searchImmediately(it) }
}

binding.resultsFrame.getFragment<RowsSupportFragment?>()?.let {
it.adapter = searchFragmentDelegate.rowsAdapter
it.onItemViewClickedListener = searchFragmentDelegate.onItemViewClickedListener
it.onItemViewSelectedListener = searchFragmentDelegate.onItemViewSelectedListener
val rowsSupportFragment = RowsSupportFragment().apply {
adapter = searchFragmentDelegate.rowsAdapter
onItemViewClickedListener = searchFragmentDelegate.onItemViewClickedListener
onItemViewSelectedListener = searchFragmentDelegate.onItemViewSelectedListener
}

childFragmentManager.commit {
replace(binding.resultsFrame.id, rowsSupportFragment)
}

return binding.root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

viewModel.searchResultsFlow
.onEach { searchFragmentDelegate.showResults(it) }
.launchIn(lifecycleScope)

val query = arguments?.getString(SearchFragment.EXTRA_QUERY)
if (!query.isNullOrBlank()) {
binding.searchBar.setText(query)
viewModel.searchImmediately(query)
binding.resultsFrame.requestFocus()
} else {
binding.searchBar.requestFocus()
}
}

override fun onDestroyView() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.jellyfin.androidtv.ui.startup

import android.Manifest
import android.app.SearchManager
import android.content.Intent
import android.os.Bundle
import android.widget.Toast
Expand Down Expand Up @@ -137,7 +138,9 @@ class StartupActivity : FragmentActivity() {
// Create destination
val destination = when {
// Search is requested
intent.action === Intent.ACTION_SEARCH -> Destinations.search
intent.action === Intent.ACTION_SEARCH -> Destinations.search(
query = intent.getStringExtra(SearchManager.QUERY)
)
// User view item is requested
itemId != null && itemIsUserView -> {
val item by api.userLibraryApi.getItem(itemId = itemId)
Expand Down
3 changes: 1 addition & 2 deletions app/src/main/res/layout/fragment_search_text.xml
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,8 @@
app:layout_constraintTop_toTopOf="@id/logo" />

<!-- Fragment showing search results -->
<androidx.fragment.app.FragmentContainerView
<FrameLayout
android:id="@+id/results_frame"
android:name="androidx.leanback.app.RowsSupportFragment"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="27dp"
Expand Down

0 comments on commit 4e8e8bc

Please sign in to comment.