Fix settings search
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user