From 2d9d12f0bf868896c87a053bf9d73e292c7fce8d Mon Sep 17 00:00:00 2001 From: Hemanth S Date: Sat, 17 Oct 2020 13:53:03 +0530 Subject: [PATCH] Fix keyboard not showing when search fragment shows #955 --- .../retromusic/extensions/ViewExtensions.kt | 38 +++++++++++++++++++ .../fragments/search/SearchFragment.kt | 14 +++---- 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt b/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt index 3e90305f..a343b2c3 100644 --- a/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt +++ b/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt @@ -15,9 +15,12 @@ package code.name.monkey.retromusic.extensions import android.animation.ObjectAnimator +import android.content.Context import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.ViewTreeObserver +import android.view.inputmethod.InputMethodManager import android.widget.EditText import androidx.annotation.LayoutRes import androidx.core.animation.doOnEnd @@ -76,3 +79,38 @@ fun BottomSheetBehavior<*>.peekHeightAnimate(value: Int) { } } +fun View.focusAndShowKeyboard() { + /** + * This is to be called when the window already has focus. + */ + fun View.showTheKeyboardNow() { + if (isFocused) { + post { + // We still post the call, just in case we are being notified of the windows focus + // but InputMethodManager didn't get properly setup yet. + val imm = + context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT) + } + } + } + + requestFocus() + if (hasWindowFocus()) { + // No need to wait for the window to get focus. + showTheKeyboardNow() + } else { + // We need to wait until the window gets focus. + viewTreeObserver.addOnWindowFocusChangeListener( + object : ViewTreeObserver.OnWindowFocusChangeListener { + override fun onWindowFocusChanged(hasFocus: Boolean) { + // This notification will arrive just before the InputMethodManager gets set up. + if (hasFocus) { + this@focusAndShowKeyboard.showTheKeyboardNow() + // It’s very important to remove this listener once we are done. + viewTreeObserver.removeOnWindowFocusChangeListener(this) + } + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt index d767d859..6ab5113a 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt @@ -21,8 +21,6 @@ import android.speech.RecognizerIntent import android.text.Editable import android.text.TextWatcher import android.view.View -import android.view.inputmethod.InputMethodManager -import androidx.core.content.ContextCompat.getSystemService import androidx.core.view.isGone import androidx.core.view.isVisible import androidx.recyclerview.widget.LinearLayoutManager @@ -32,6 +30,7 @@ import code.name.monkey.retromusic.R import code.name.monkey.retromusic.adapter.SearchAdapter import code.name.monkey.retromusic.extensions.accentColor import code.name.monkey.retromusic.extensions.dipToPix +import code.name.monkey.retromusic.extensions.focusAndShowKeyboard import code.name.monkey.retromusic.extensions.showToast import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment import com.google.android.material.textfield.TextInputEditText @@ -54,17 +53,16 @@ class SearchFragment : AbsMainActivityFragment(R.layout.fragment_search), TextWa mainActivity.setSupportActionBar(toolbar) libraryViewModel.clearSearchResult() setupRecyclerView() - searchView.addTextChangedListener(this) + searchView.apply { + addTextChangedListener(this@SearchFragment) + focusAndShowKeyboard() + } voiceSearch.setOnClickListener { startMicSearch() } clearText.setOnClickListener { searchView.clearText() } keyboardPopup.apply { accentColor() setOnClickListener { - val inputManager = getSystemService( - requireContext(), - InputMethodManager::class.java - ) - inputManager?.showSoftInput(searchView, InputMethodManager.SHOW_IMPLICIT) + searchView.focusAndShowKeyboard() } } if (savedInstanceState != null) {