Fix settings search

This commit is contained in:
Koitharu
2025-01-01 13:36:02 +02:00
parent 3b5a9cd2b4
commit 8d519dd80f
6 changed files with 73 additions and 15 deletions

View File

@@ -25,6 +25,7 @@ import org.koitharu.kotatsu.core.model.MangaSource
import org.koitharu.kotatsu.core.model.MangaSourceInfo
import org.koitharu.kotatsu.core.parser.external.ExternalMangaSource
import org.koitharu.kotatsu.core.ui.BaseActivity
import org.koitharu.kotatsu.core.util.ext.buildBundle
import org.koitharu.kotatsu.core.util.ext.observe
import org.koitharu.kotatsu.core.util.ext.observeEvent
import org.koitharu.kotatsu.core.util.ext.textAndVisible
@@ -174,8 +175,9 @@ class SettingsActivity :
}
private fun navigateToPreference(item: SettingsItem) {
val args = Bundle(1)
args.putString(ARG_PREF_KEY, item.key)
val args = buildBundle(1) {
putString(ARG_PREF_KEY, item.key)
}
openFragment(item.fragmentClass, args, true)
}

View File

@@ -7,6 +7,8 @@ import android.view.ViewGroup
import androidx.core.graphics.Insets
import androidx.core.view.updatePadding
import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.AsyncListDiffer.ListListener
import androidx.recyclerview.widget.LinearLayoutManager
import dagger.hilt.android.AndroidEntryPoint
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.core.ui.BaseFragment
@@ -17,7 +19,9 @@ import org.koitharu.kotatsu.databinding.FragmentSearchSuggestionBinding
import org.koitharu.kotatsu.list.ui.adapter.ListItemType
@AndroidEntryPoint
class SettingsSearchFragment : BaseFragment<FragmentSearchSuggestionBinding>(), OnListItemClickListener<SettingsItem> {
class SettingsSearchFragment : BaseFragment<FragmentSearchSuggestionBinding>(),
OnListItemClickListener<SettingsItem>,
ListListener<SettingsItem> {
private val viewModel: SettingsSearchViewModel by activityViewModels()
@@ -29,6 +33,7 @@ class SettingsSearchFragment : BaseFragment<FragmentSearchSuggestionBinding>(),
super.onViewBindingCreated(binding, savedInstanceState)
val adapter = BaseListAdapter<SettingsItem>()
.addDelegate(ListItemType.NAV_ITEM, settingsItemAD(this))
adapter.addListListener(this)
binding.root.adapter = adapter
binding.root.setHasFixedSize(true)
viewModel.content.observe(viewLifecycleOwner, adapter)
@@ -45,4 +50,13 @@ class SettingsSearchFragment : BaseFragment<FragmentSearchSuggestionBinding>(),
}
override fun onItemClick(item: SettingsItem, view: View) = viewModel.navigateToPreference(item)
override fun onCurrentListChanged(
previousList: List<SettingsItem?>,
currentList: List<SettingsItem?>
) {
if (currentList.size != previousList.size) {
(viewBinding?.root?.layoutManager as? LinearLayoutManager)?.scrollToPositionWithOffset(0, 0)
}
}
}

View File

@@ -13,9 +13,12 @@ import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.settings.AppearanceSettingsFragment
import org.koitharu.kotatsu.settings.DownloadsSettingsFragment
import org.koitharu.kotatsu.settings.NetworkSettingsFragment
import org.koitharu.kotatsu.settings.ProxySettingsFragment
import org.koitharu.kotatsu.settings.ReaderSettingsFragment
import org.koitharu.kotatsu.settings.ServicesSettingsFragment
import org.koitharu.kotatsu.settings.SuggestionsSettingsFragment
import org.koitharu.kotatsu.settings.about.AboutSettingsFragment
import org.koitharu.kotatsu.settings.backup.PeriodicalBackupSettingsFragment
import org.koitharu.kotatsu.settings.sources.SourcesSettingsFragment
import org.koitharu.kotatsu.settings.tracker.TrackerSettingsFragment
import org.koitharu.kotatsu.settings.userdata.UserDataSettingsFragment
@@ -39,6 +42,30 @@ class SettingsSearchHelper @Inject constructor(
preferenceManager.inflateTo(result, R.xml.pref_tracker, emptyList(), TrackerSettingsFragment::class.java)
preferenceManager.inflateTo(result, R.xml.pref_services, emptyList(), ServicesSettingsFragment::class.java)
preferenceManager.inflateTo(result, R.xml.pref_about, emptyList(), AboutSettingsFragment::class.java)
preferenceManager.inflateTo(
result,
R.xml.pref_backup_periodic,
listOf(context.getString(R.string.data_and_privacy)),
PeriodicalBackupSettingsFragment::class.java,
)
preferenceManager.inflateTo(
result,
R.xml.pref_proxy,
listOf(context.getString(R.string.proxy)),
ProxySettingsFragment::class.java,
)
preferenceManager.inflateTo(
result,
R.xml.pref_suggestions,
listOf(context.getString(R.string.suggestions)),
SuggestionsSettingsFragment::class.java,
)
preferenceManager.inflateTo(
result,
R.xml.pref_sources,
listOf(context.getString(R.string.remote_sources)),
SourcesSettingsFragment::class.java,
)
return result
}

View File

@@ -22,18 +22,20 @@ class SettingsSearchMenuProvider(
override fun onPrepareMenu(menu: Menu) {
super.onPrepareMenu(menu)
val currentQuery = viewModel.currentQuery
if (currentQuery.isNotEmpty()) {
if (viewModel.isSearchActive.value) {
val menuItem = menu.findItem(R.id.action_search)
menuItem.expandActionView()
val searchView = menuItem.actionView as SearchView
searchView.setQuery(currentQuery, false)
searchView.setQuery(viewModel.currentQuery, false)
}
}
override fun onMenuItemSelected(menuItem: MenuItem): Boolean = false
override fun onMenuItemActionExpand(item: MenuItem): Boolean = true
override fun onMenuItemActionExpand(item: MenuItem): Boolean {
viewModel.startSearch()
return true
}
override fun onMenuItemActionCollapse(item: MenuItem): Boolean {
viewModel.discardSearch()

View File

@@ -18,30 +18,43 @@ class SettingsSearchViewModel @Inject constructor(
private val searchHelper: SettingsSearchHelper,
) : BaseViewModel() {
private val query = MutableStateFlow("")
private val query = MutableStateFlow<String?>(null)
private val allSettings by lazy {
searchHelper.inflatePreferences()
}
val content = query.map { q ->
allSettings.filter { it.title.contains(q, ignoreCase = true) }
if (q == null) {
emptyList()
} else {
allSettings.filter { it.title.contains(q, ignoreCase = true) }
}
}.stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Lazily, emptyList())
val isSearchActive = query.map {
it.isNotEmpty()
}.stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Lazily, false)
it != null
}.stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Lazily, query.value != null)
val onNavigateToPreference = MutableEventFlow<SettingsItem>()
val currentQuery: String
get() = query.value
get() = query.value.orEmpty()
fun onQueryChanged(value: String) {
query.value = value
if (query.value != null) {
query.value = value
}
}
fun discardSearch() = onQueryChanged("")
fun discardSearch() {
query.value = null
}
fun startSearch() {
query.value = query.value.orEmpty()
}
fun navigateToPreference(item: SettingsItem) {
discardSearch()
onNavigateToPreference.call(item)
}
}

View File

@@ -46,7 +46,7 @@
android:summary="@string/restore_summary"
android:title="@string/restore_backup" />
<Preference
<PreferenceScreen
android:fragment="org.koitharu.kotatsu.settings.backup.PeriodicalBackupSettingsFragment"
android:key="backup_periodic"
android:persistent="false"