package eu.kanade.tachiyomi.widget import android.content.Context import android.util.AttributeSet import android.view.inputmethod.EditorInfo import androidx.appcompat.widget.SearchView import androidx.core.view.inputmethod.EditorInfoCompat import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.asImmediateFlow import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.cancel import kotlinx.coroutines.flow.launchIn import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get /** * A custom [SearchView] that sets [EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING] to imeOptions * if [PreferencesHelper.incognitoMode] is true. Some IMEs may not respect this flag. */ class TachiyomiSearchView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = R.attr.searchViewStyle ) : SearchView(context, attrs, defStyleAttr) { private var scope: CoroutineScope? = null override fun onAttachedToWindow() { super.onAttachedToWindow() scope = CoroutineScope(SupervisorJob() + Dispatchers.Main) Injekt.get().incognitoMode().asImmediateFlow { imeOptions = if (it) { imeOptions or EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING } else { imeOptions and EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING.inv() } }.launchIn(scope!!) } override fun setOnQueryTextListener(listener: OnQueryTextListener?) { super.setOnQueryTextListener(listener) val searchAutoComplete: SearchAutoComplete = findViewById(R.id.search_src_text) searchAutoComplete.setOnEditorActionListener { _, actionID, _ -> if (actionID == EditorInfo.IME_ACTION_SEARCH || actionID == EditorInfo.IME_NULL) { clearFocus() listener?.onQueryTextSubmit(query.toString()) true } else false } } override fun onDetachedFromWindow() { super.onDetachedFromWindow() scope?.cancel() scope = null } }