From 5a43e677c57ff20d7870381db0d1582960aa3e8a Mon Sep 17 00:00:00 2001 From: Koitharu Date: Fri, 28 Oct 2022 08:17:37 +0300 Subject: [PATCH] Respect incognito mode in search --- .../koitharu/kotatsu/main/ui/MainActivity.kt | 13 +++++++++ .../kotatsu/search/ui/SearchActivity.kt | 13 ++++++++- .../suggestion/SearchSuggestionViewModel.kt | 29 ++++++++++++++++--- 3 files changed, 50 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt index 0a036c51c..32f8f33b5 100644 --- a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt @@ -7,6 +7,7 @@ import android.os.Bundle import android.util.SparseIntArray import android.view.MenuItem import android.view.View +import android.view.inputmethod.EditorInfo import androidx.activity.result.ActivityResultCallback import androidx.activity.viewModels import androidx.appcompat.view.ActionMode @@ -17,6 +18,7 @@ import androidx.core.graphics.Insets import androidx.core.util.size import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat +import androidx.core.view.inputmethod.EditorInfoCompat import androidx.core.view.isVisible import androidx.core.view.updateLayoutParams import androidx.core.view.updatePadding @@ -129,6 +131,7 @@ class MainActivity : viewModel.isResumeEnabled.observe(this, this::onResumeEnabledChanged) viewModel.counters.observe(this, ::onCountersChanged) viewModel.isFeedAvailable.observe(this, ::onFeedAvailabilityChanged) + searchSuggestionViewModel.isIncognitoModeEnabled.observe(this, this::onIncognitoModeChanged) } override fun onRestoreInstanceState(savedInstanceState: Bundle) { @@ -274,6 +277,16 @@ class MainActivity : navigationDelegate.setItemVisibility(R.id.nav_feed, isFeedAvailable) } + private fun onIncognitoModeChanged(isIncognito: Boolean) { + var options = binding.searchView.imeOptions + options = if (isIncognito) { + options or EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING + } else { + options and EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING.inv() + } + binding.searchView.imeOptions = options + } + private fun onLoadingStateChanged(isLoading: Boolean) { binding.fab?.isEnabled = !isLoading } diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchActivity.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchActivity.kt index eb7242065..6d14265be 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/SearchActivity.kt @@ -6,6 +6,7 @@ import android.os.Bundle import androidx.activity.viewModels import androidx.appcompat.widget.SearchView import androidx.core.graphics.Insets +import androidx.core.view.inputmethod.EditorInfoCompat import androidx.core.view.updatePadding import androidx.fragment.app.commit import dagger.hilt.android.AndroidEntryPoint @@ -15,7 +16,6 @@ import org.koitharu.kotatsu.databinding.ActivitySearchBinding import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.search.ui.suggestion.SearchSuggestionViewModel import org.koitharu.kotatsu.utils.ext.showKeyboard -import kotlin.text.Typography.dagger @AndroidEntryPoint class SearchActivity : BaseActivity(), SearchView.OnQueryTextListener { @@ -32,6 +32,7 @@ class SearchActivity : BaseActivity(), SearchView.OnQuery } val query = intent.getStringExtra(EXTRA_QUERY) supportActionBar?.setDisplayHomeAsUpEnabled(true) + searchSuggestionViewModel.isIncognitoModeEnabled.observe(this, this::onIncognitoModeChanged) with(binding.searchView) { queryHint = getString(R.string.search_on_s, source.title) setOnQueryTextListener(this@SearchActivity) @@ -72,6 +73,16 @@ class SearchActivity : BaseActivity(), SearchView.OnQuery override fun onQueryTextChange(newText: String?): Boolean = false + private fun onIncognitoModeChanged(isIncognito: Boolean) { + var options = binding.searchView.imeOptions + options = if (isIncognito) { + options or EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING + } else { + options and EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING.inv() + } + binding.searchView.imeOptions = options + } + companion object { private const val EXTRA_SOURCE = "source" diff --git a/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/SearchSuggestionViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/SearchSuggestionViewModel.kt index 377b2c17c..31edd3481 100644 --- a/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/SearchSuggestionViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/search/ui/suggestion/SearchSuggestionViewModel.kt @@ -3,17 +3,28 @@ package org.koitharu.kotatsu.search.ui.suggestion import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel -import javax.inject.Inject -import kotlinx.coroutines.* -import kotlinx.coroutines.flow.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.async +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.debounce +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.mapLatest +import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.plus import org.koitharu.kotatsu.base.ui.BaseViewModel import org.koitharu.kotatsu.base.ui.widgets.ChipsView import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.observeAsFlow +import org.koitharu.kotatsu.core.prefs.observeAsLiveData import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaTag import org.koitharu.kotatsu.search.domain.MangaSearchRepository import org.koitharu.kotatsu.search.ui.suggestion.model.SearchSuggestionItem +import javax.inject.Inject private const val DEBOUNCE_TIMEOUT = 500L private const val MAX_MANGA_ITEMS = 6 @@ -30,6 +41,12 @@ class SearchSuggestionViewModel @Inject constructor( private val query = MutableStateFlow("") private var suggestionJob: Job? = null + val isIncognitoModeEnabled = settings.observeAsLiveData( + context = viewModelScope.coroutineContext + Dispatchers.Default, + key = AppSettings.KEY_INCOGNITO_MODE, + valueProducer = { isIncognitoModeEnabled }, + ) + val suggestion = MutableLiveData>() init { @@ -41,7 +58,11 @@ class SearchSuggestionViewModel @Inject constructor( } fun saveQuery(query: String) { - repository.saveSearchQuery(query) + launchJob(Dispatchers.Default) { + if (!settings.isIncognitoModeEnabled) { + repository.saveSearchQuery(query) + } + } } fun clearSearchHistory() {