diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/SettingsActivity.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/SettingsActivity.kt index c554de7b1..aa6b9f8b6 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/settings/SettingsActivity.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/SettingsActivity.kt @@ -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) } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/search/SettingsSearchFragment.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/search/SettingsSearchFragment.kt index 4b11f6d5d..bda7eef32 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/settings/search/SettingsSearchFragment.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/search/SettingsSearchFragment.kt @@ -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(), OnListItemClickListener { +class SettingsSearchFragment : BaseFragment(), + OnListItemClickListener, + ListListener { private val viewModel: SettingsSearchViewModel by activityViewModels() @@ -29,6 +33,7 @@ class SettingsSearchFragment : BaseFragment(), super.onViewBindingCreated(binding, savedInstanceState) val adapter = BaseListAdapter() .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(), } override fun onItemClick(item: SettingsItem, view: View) = viewModel.navigateToPreference(item) + + override fun onCurrentListChanged( + previousList: List, + currentList: List + ) { + if (currentList.size != previousList.size) { + (viewBinding?.root?.layoutManager as? LinearLayoutManager)?.scrollToPositionWithOffset(0, 0) + } + } } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/search/SettingsSearchHelper.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/search/SettingsSearchHelper.kt index 2bdc6871b..d0411d663 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/settings/search/SettingsSearchHelper.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/search/SettingsSearchHelper.kt @@ -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 } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/search/SettingsSearchMenuProvider.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/search/SettingsSearchMenuProvider.kt index 7f2f4527e..59fd74334 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/settings/search/SettingsSearchMenuProvider.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/search/SettingsSearchMenuProvider.kt @@ -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() diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/search/SettingsSearchViewModel.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/search/SettingsSearchViewModel.kt index 6be04636a..b698dd51a 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/settings/search/SettingsSearchViewModel.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/search/SettingsSearchViewModel.kt @@ -18,30 +18,43 @@ class SettingsSearchViewModel @Inject constructor( private val searchHelper: SettingsSearchHelper, ) : BaseViewModel() { - private val query = MutableStateFlow("") + private val query = MutableStateFlow(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() 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) } } diff --git a/app/src/main/res/xml/pref_user_data.xml b/app/src/main/res/xml/pref_user_data.xml index 38eacc270..5a606dd2b 100644 --- a/app/src/main/res/xml/pref_user_data.xml +++ b/app/src/main/res/xml/pref_user_data.xml @@ -46,7 +46,7 @@ android:summary="@string/restore_summary" android:title="@string/restore_backup" /> -