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.model.MangaSourceInfo
|
||||||
import org.koitharu.kotatsu.core.parser.external.ExternalMangaSource
|
import org.koitharu.kotatsu.core.parser.external.ExternalMangaSource
|
||||||
import org.koitharu.kotatsu.core.ui.BaseActivity
|
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.observe
|
||||||
import org.koitharu.kotatsu.core.util.ext.observeEvent
|
import org.koitharu.kotatsu.core.util.ext.observeEvent
|
||||||
import org.koitharu.kotatsu.core.util.ext.textAndVisible
|
import org.koitharu.kotatsu.core.util.ext.textAndVisible
|
||||||
@@ -174,8 +175,9 @@ class SettingsActivity :
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun navigateToPreference(item: SettingsItem) {
|
private fun navigateToPreference(item: SettingsItem) {
|
||||||
val args = Bundle(1)
|
val args = buildBundle(1) {
|
||||||
args.putString(ARG_PREF_KEY, item.key)
|
putString(ARG_PREF_KEY, item.key)
|
||||||
|
}
|
||||||
openFragment(item.fragmentClass, args, true)
|
openFragment(item.fragmentClass, args, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ import android.view.ViewGroup
|
|||||||
import androidx.core.graphics.Insets
|
import androidx.core.graphics.Insets
|
||||||
import androidx.core.view.updatePadding
|
import androidx.core.view.updatePadding
|
||||||
import androidx.fragment.app.activityViewModels
|
import androidx.fragment.app.activityViewModels
|
||||||
|
import androidx.recyclerview.widget.AsyncListDiffer.ListListener
|
||||||
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
import org.koitharu.kotatsu.R
|
import org.koitharu.kotatsu.R
|
||||||
import org.koitharu.kotatsu.core.ui.BaseFragment
|
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
|
import org.koitharu.kotatsu.list.ui.adapter.ListItemType
|
||||||
|
|
||||||
@AndroidEntryPoint
|
@AndroidEntryPoint
|
||||||
class SettingsSearchFragment : BaseFragment<FragmentSearchSuggestionBinding>(), OnListItemClickListener<SettingsItem> {
|
class SettingsSearchFragment : BaseFragment<FragmentSearchSuggestionBinding>(),
|
||||||
|
OnListItemClickListener<SettingsItem>,
|
||||||
|
ListListener<SettingsItem> {
|
||||||
|
|
||||||
private val viewModel: SettingsSearchViewModel by activityViewModels()
|
private val viewModel: SettingsSearchViewModel by activityViewModels()
|
||||||
|
|
||||||
@@ -29,6 +33,7 @@ class SettingsSearchFragment : BaseFragment<FragmentSearchSuggestionBinding>(),
|
|||||||
super.onViewBindingCreated(binding, savedInstanceState)
|
super.onViewBindingCreated(binding, savedInstanceState)
|
||||||
val adapter = BaseListAdapter<SettingsItem>()
|
val adapter = BaseListAdapter<SettingsItem>()
|
||||||
.addDelegate(ListItemType.NAV_ITEM, settingsItemAD(this))
|
.addDelegate(ListItemType.NAV_ITEM, settingsItemAD(this))
|
||||||
|
adapter.addListListener(this)
|
||||||
binding.root.adapter = adapter
|
binding.root.adapter = adapter
|
||||||
binding.root.setHasFixedSize(true)
|
binding.root.setHasFixedSize(true)
|
||||||
viewModel.content.observe(viewLifecycleOwner, adapter)
|
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 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.AppearanceSettingsFragment
|
||||||
import org.koitharu.kotatsu.settings.DownloadsSettingsFragment
|
import org.koitharu.kotatsu.settings.DownloadsSettingsFragment
|
||||||
import org.koitharu.kotatsu.settings.NetworkSettingsFragment
|
import org.koitharu.kotatsu.settings.NetworkSettingsFragment
|
||||||
|
import org.koitharu.kotatsu.settings.ProxySettingsFragment
|
||||||
import org.koitharu.kotatsu.settings.ReaderSettingsFragment
|
import org.koitharu.kotatsu.settings.ReaderSettingsFragment
|
||||||
import org.koitharu.kotatsu.settings.ServicesSettingsFragment
|
import org.koitharu.kotatsu.settings.ServicesSettingsFragment
|
||||||
|
import org.koitharu.kotatsu.settings.SuggestionsSettingsFragment
|
||||||
import org.koitharu.kotatsu.settings.about.AboutSettingsFragment
|
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.sources.SourcesSettingsFragment
|
||||||
import org.koitharu.kotatsu.settings.tracker.TrackerSettingsFragment
|
import org.koitharu.kotatsu.settings.tracker.TrackerSettingsFragment
|
||||||
import org.koitharu.kotatsu.settings.userdata.UserDataSettingsFragment
|
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_tracker, emptyList(), TrackerSettingsFragment::class.java)
|
||||||
preferenceManager.inflateTo(result, R.xml.pref_services, emptyList(), ServicesSettingsFragment::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_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
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -22,18 +22,20 @@ class SettingsSearchMenuProvider(
|
|||||||
|
|
||||||
override fun onPrepareMenu(menu: Menu) {
|
override fun onPrepareMenu(menu: Menu) {
|
||||||
super.onPrepareMenu(menu)
|
super.onPrepareMenu(menu)
|
||||||
val currentQuery = viewModel.currentQuery
|
if (viewModel.isSearchActive.value) {
|
||||||
if (currentQuery.isNotEmpty()) {
|
|
||||||
val menuItem = menu.findItem(R.id.action_search)
|
val menuItem = menu.findItem(R.id.action_search)
|
||||||
menuItem.expandActionView()
|
menuItem.expandActionView()
|
||||||
val searchView = menuItem.actionView as SearchView
|
val searchView = menuItem.actionView as SearchView
|
||||||
searchView.setQuery(currentQuery, false)
|
searchView.setQuery(viewModel.currentQuery, false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onMenuItemSelected(menuItem: MenuItem): Boolean = 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 {
|
override fun onMenuItemActionCollapse(item: MenuItem): Boolean {
|
||||||
viewModel.discardSearch()
|
viewModel.discardSearch()
|
||||||
|
|||||||
@@ -18,30 +18,43 @@ class SettingsSearchViewModel @Inject constructor(
|
|||||||
private val searchHelper: SettingsSearchHelper,
|
private val searchHelper: SettingsSearchHelper,
|
||||||
) : BaseViewModel() {
|
) : BaseViewModel() {
|
||||||
|
|
||||||
private val query = MutableStateFlow("")
|
private val query = MutableStateFlow<String?>(null)
|
||||||
private val allSettings by lazy {
|
private val allSettings by lazy {
|
||||||
searchHelper.inflatePreferences()
|
searchHelper.inflatePreferences()
|
||||||
}
|
}
|
||||||
|
|
||||||
val content = query.map { q ->
|
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())
|
}.stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Lazily, emptyList())
|
||||||
|
|
||||||
val isSearchActive = query.map {
|
val isSearchActive = query.map {
|
||||||
it.isNotEmpty()
|
it != null
|
||||||
}.stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Lazily, false)
|
}.stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Lazily, query.value != null)
|
||||||
|
|
||||||
val onNavigateToPreference = MutableEventFlow<SettingsItem>()
|
val onNavigateToPreference = MutableEventFlow<SettingsItem>()
|
||||||
val currentQuery: String
|
val currentQuery: String
|
||||||
get() = query.value
|
get() = query.value.orEmpty()
|
||||||
|
|
||||||
fun onQueryChanged(value: String) {
|
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) {
|
fun navigateToPreference(item: SettingsItem) {
|
||||||
|
discardSearch()
|
||||||
onNavigateToPreference.call(item)
|
onNavigateToPreference.call(item)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,7 +46,7 @@
|
|||||||
android:summary="@string/restore_summary"
|
android:summary="@string/restore_summary"
|
||||||
android:title="@string/restore_backup" />
|
android:title="@string/restore_backup" />
|
||||||
|
|
||||||
<Preference
|
<PreferenceScreen
|
||||||
android:fragment="org.koitharu.kotatsu.settings.backup.PeriodicalBackupSettingsFragment"
|
android:fragment="org.koitharu.kotatsu.settings.backup.PeriodicalBackupSettingsFragment"
|
||||||
android:key="backup_periodic"
|
android:key="backup_periodic"
|
||||||
android:persistent="false"
|
android:persistent="false"
|
||||||
|
|||||||
Reference in New Issue
Block a user