From 4520d4b6204bed7832ef55d35e8895da3d819e7c Mon Sep 17 00:00:00 2001 From: Christine Emrich Date: Sat, 23 Jan 2021 19:43:56 +0100 Subject: [PATCH] Move query suggestion handling into viewmodel --- .../code/zapp/app/ZappApplicationBase.kt | 4 ++- .../code/zapp/app/main/MainActivity.kt | 29 +++---------------- .../code/zapp/app/main/MainViewModel.kt | 19 +++++++++++- .../MediathekSearchSuggestionsProvider.kt | 28 ++++++++++-------- .../ui/DeleteSearchQueriesPreferenceDialog.kt | 7 +++-- 5 files changed, 46 insertions(+), 41 deletions(-) diff --git a/app/src/main/java/de/christinecoenen/code/zapp/app/ZappApplicationBase.kt b/app/src/main/java/de/christinecoenen/code/zapp/app/ZappApplicationBase.kt index 67ce1725..84669cc7 100644 --- a/app/src/main/java/de/christinecoenen/code/zapp/app/ZappApplicationBase.kt +++ b/app/src/main/java/de/christinecoenen/code/zapp/app/ZappApplicationBase.kt @@ -8,6 +8,7 @@ import de.christinecoenen.code.zapp.app.livestream.ui.detail.ChannelDetailActivi import de.christinecoenen.code.zapp.app.main.MainViewModel import de.christinecoenen.code.zapp.app.mediathek.api.MediathekApi import de.christinecoenen.code.zapp.app.mediathek.controller.downloads.DownloadController +import de.christinecoenen.code.zapp.app.mediathek.repository.MediathekSearchSuggestionsProvider import de.christinecoenen.code.zapp.app.player.IPlaybackPositionRepository import de.christinecoenen.code.zapp.app.player.PersistedPlaybackPositionRepository import de.christinecoenen.code.zapp.app.player.Player @@ -105,8 +106,9 @@ abstract class ZappApplicationBase : Application() { factory { SettingsRepository(androidContext()) } factory { Player(androidContext(), get()) } factory { JsonChannelList(androidContext()) } + factory { MediathekSearchSuggestionsProvider(androidContext()) } - viewModel { MainViewModel(androidApplication()) } + viewModel { MainViewModel(androidApplication(), get()) } viewModel { ChannelDetailActivityViewModel(get(), get()) } viewModel { DownloadsViewModel(get()) } } diff --git a/app/src/main/java/de/christinecoenen/code/zapp/app/main/MainActivity.kt b/app/src/main/java/de/christinecoenen/code/zapp/app/main/MainActivity.kt index 1afa2842..b33cd8fb 100644 --- a/app/src/main/java/de/christinecoenen/code/zapp/app/main/MainActivity.kt +++ b/app/src/main/java/de/christinecoenen/code/zapp/app/main/MainActivity.kt @@ -12,7 +12,6 @@ import androidx.core.view.isVisible import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback import de.christinecoenen.code.zapp.R import de.christinecoenen.code.zapp.app.about.ui.AboutActivity -import de.christinecoenen.code.zapp.app.mediathek.repository.MediathekSearchSuggestionsProvider import de.christinecoenen.code.zapp.app.mediathek.ui.list.MediathekListFragment import de.christinecoenen.code.zapp.app.settings.ui.SettingsActivity import de.christinecoenen.code.zapp.databinding.ActivityMainBinding @@ -26,8 +25,6 @@ class MainActivity : AppCompatActivity() { private var _binding: ActivityMainBinding? = null private val binding get() = _binding!! - private var searchQuery: String? = null - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -54,6 +51,8 @@ class MainActivity : AppCompatActivity() { binding.search.clearFocus() binding.search.setOnQueryTextFocusChangeListener(::onSearchQueryTextFocusChangeListener) + viewModel.searchQuery.observe(this, ::onSearchQuerySubmitted) + binding.bottomNavigation.setOnNavigationItemSelectedListener(::onNavigationItemSelected) onPageSelected(binding.viewPager.currentItem) handleIntent(intent) @@ -69,18 +68,6 @@ class MainActivity : AppCompatActivity() { handleIntent(intent) } - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - outState.putString(ARG_QUERY, searchQuery) - } - - override fun onRestoreInstanceState(savedInstanceState: Bundle) { - super.onRestoreInstanceState(savedInstanceState) - - searchQuery = savedInstanceState.getString(ARG_QUERY) - search(searchQuery) - } - override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.activity_main_toolbar, menu) return super.onCreateOptionsMenu(menu) @@ -124,15 +111,11 @@ class MainActivity : AppCompatActivity() { binding.search.clearFocus() binding.search.setQuery(query, false) - search(query) - - MediathekSearchSuggestionsProvider.saveQuery(this, query) + viewModel.submitSearchQuery(query) } } - private fun search(query: String?) { - searchQuery = query - + private fun onSearchQuerySubmitted(query: String?) { val currentFragment = supportFragmentManager .findFragmentByTag("f" + binding.viewPager.currentItem) @@ -158,8 +141,4 @@ class MainActivity : AppCompatActivity() { } } } - - companion object { - private const val ARG_QUERY = "ARG_QUERY" - } } diff --git a/app/src/main/java/de/christinecoenen/code/zapp/app/main/MainViewModel.kt b/app/src/main/java/de/christinecoenen/code/zapp/app/main/MainViewModel.kt index 864c941e..d30c5c93 100644 --- a/app/src/main/java/de/christinecoenen/code/zapp/app/main/MainViewModel.kt +++ b/app/src/main/java/de/christinecoenen/code/zapp/app/main/MainViewModel.kt @@ -2,18 +2,35 @@ package de.christinecoenen.code.zapp.app.main import android.app.Application import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData import androidx.preference.PreferenceManager import de.christinecoenen.code.zapp.R +import de.christinecoenen.code.zapp.app.mediathek.repository.MediathekSearchSuggestionsProvider -class MainViewModel(application: Application) : AndroidViewModel(application) { +class MainViewModel( + application: Application, + private val mediathekSearchSuggestionsProvider: MediathekSearchSuggestionsProvider +) : AndroidViewModel(application) { val pageCount get() = PageType.values().size + private val searchQuerySource = MutableLiveData() + var searchQuery: LiveData = searchQuerySource + init { PreferenceManager.setDefaultValues(application, R.xml.preferences, false) } + fun submitSearchQuery(query: String?) { + searchQuerySource.postValue(query) + + if (query != null) { + mediathekSearchSuggestionsProvider.saveQuery(query) + } + } + fun getPageTypeAt(position: Int) = PageType.values()[position] fun getPageTypeFromMenuResId(itemId: Int) = diff --git a/app/src/main/java/de/christinecoenen/code/zapp/app/mediathek/repository/MediathekSearchSuggestionsProvider.kt b/app/src/main/java/de/christinecoenen/code/zapp/app/mediathek/repository/MediathekSearchSuggestionsProvider.kt index 3cf4e40a..56fde130 100644 --- a/app/src/main/java/de/christinecoenen/code/zapp/app/mediathek/repository/MediathekSearchSuggestionsProvider.kt +++ b/app/src/main/java/de/christinecoenen/code/zapp/app/mediathek/repository/MediathekSearchSuggestionsProvider.kt @@ -4,26 +4,30 @@ import android.content.Context import android.content.SearchRecentSuggestionsProvider import android.provider.SearchRecentSuggestions -class MediathekSearchSuggestionsProvider : SearchRecentSuggestionsProvider() { +class MediathekSearchSuggestionsProvider( + private val applicationContext: Context? = null +) : SearchRecentSuggestionsProvider() { companion object { private const val AUTHORITY = "de.christinecoenen.code.zapp.MediathekSearchSuggestionsProvider" private const val MODE = DATABASE_MODE_QUERIES - - fun saveQuery(context: Context, query: String) { - val suggestions = SearchRecentSuggestions(context, AUTHORITY, MODE) - suggestions.saveRecentQuery(query, null) - } - - @JvmStatic - fun deleteAllQueries(context: Context) { - val suggestions = SearchRecentSuggestions(context, AUTHORITY, MODE) - suggestions.clearHistory() - } } + @Suppress("unused") + constructor() : this(null) + init { setupSuggestions(AUTHORITY, MODE) } + + fun saveQuery(query: String) { + val suggestions = SearchRecentSuggestions(applicationContext ?: context, AUTHORITY, MODE) + suggestions.saveRecentQuery(query, null) + } + + fun deleteAllQueries() { + val suggestions = SearchRecentSuggestions(applicationContext ?: context, AUTHORITY, MODE) + suggestions.clearHistory() + } } diff --git a/app/src/main/java/de/christinecoenen/code/zapp/app/settings/ui/DeleteSearchQueriesPreferenceDialog.kt b/app/src/main/java/de/christinecoenen/code/zapp/app/settings/ui/DeleteSearchQueriesPreferenceDialog.kt index f1025ca0..8e571c20 100644 --- a/app/src/main/java/de/christinecoenen/code/zapp/app/settings/ui/DeleteSearchQueriesPreferenceDialog.kt +++ b/app/src/main/java/de/christinecoenen/code/zapp/app/settings/ui/DeleteSearchQueriesPreferenceDialog.kt @@ -2,7 +2,8 @@ package de.christinecoenen.code.zapp.app.settings.ui import android.os.Bundle import androidx.preference.PreferenceDialogFragmentCompat -import de.christinecoenen.code.zapp.app.mediathek.repository.MediathekSearchSuggestionsProvider.Companion.deleteAllQueries +import de.christinecoenen.code.zapp.app.mediathek.repository.MediathekSearchSuggestionsProvider +import org.koin.android.ext.android.inject class DeleteSearchQueriesPreferenceDialog : PreferenceDialogFragmentCompat() { @@ -18,9 +19,11 @@ class DeleteSearchQueriesPreferenceDialog : PreferenceDialogFragmentCompat() { } + private val mediathekSearchSuggestionsProvider: MediathekSearchSuggestionsProvider by inject() + override fun onDialogClosed(positiveResult: Boolean) { if (positiveResult) { - deleteAllQueries(requireContext()) + mediathekSearchSuggestionsProvider.deleteAllQueries() } } }