diff --git a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt index 6c8078b6d3..3f5a610ae7 100644 --- a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt +++ b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt @@ -4,14 +4,12 @@ package org.mozilla.fenix -import android.app.Activity import android.content.Context import android.content.Intent import android.os.Bundle import android.preference.PreferenceManager import android.util.AttributeSet import android.view.View -import android.view.inputmethod.InputMethodManager import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.Toolbar import androidx.navigation.fragment.NavHostFragment @@ -87,11 +85,6 @@ open class HomeActivity : AppCompatActivity() { handleOpenedFromExternalSourceIfNecessary(intent) } - override fun onResume() { - super.onResume() - showSoftwareKeyboardIfNecessary() - } - override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) handleCrashIfNecessary(intent) @@ -118,29 +111,6 @@ open class HomeActivity : AppCompatActivity() { super.onBackPressed() } - override fun onPause() { - super.onPause() - hideSoftwareKeyboardIfNecessary() - } - - private fun showSoftwareKeyboardIfNecessary() { - if (navHost.navController.currentDestination?.id != R.id.searchFragment) { return } - (getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager).apply { - currentFocus?.also { - this.showSoftInput(it, 0) - } - } - } - - private fun hideSoftwareKeyboardIfNecessary() { - if (navHost.navController.currentDestination?.id != R.id.searchFragment) { return } - (getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager).apply { - currentFocus?.also { - this.hideSoftInputFromWindow(it.windowToken, 0) - } - } - } - private fun handleCrashIfNecessary(intent: Intent?) { if (intent == null) { return } if (!Crash.isCrashIntent(intent)) { return } diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarComponent.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarComponent.kt index 5ecc618314..ac24a030b3 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarComponent.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarComponent.kt @@ -36,6 +36,8 @@ class ToolbarComponent( override val reducer: Reducer = { state, change -> when (change) { + is SearchChange.ToolbarClearedFocus -> state.copy(focused = false) + is SearchChange.ToolbarRequestedFocus -> state.copy(focused = true) is SearchChange.SearchShortcutEngineSelected -> state.copy(engine = change.engine) } @@ -75,7 +77,8 @@ data class SearchState( val query: String, val searchTerm: String, val isEditing: Boolean, - val engine: SearchEngine? = null + val engine: SearchEngine? = null, + val focused: Boolean = isEditing ) : ViewState sealed class SearchAction : Action { @@ -88,5 +91,7 @@ sealed class SearchAction : Action { } sealed class SearchChange : Change { + object ToolbarRequestedFocus : SearchChange() + object ToolbarClearedFocus : SearchChange() data class SearchShortcutEngineSelected(val engine: SearchEngine) : SearchChange() } diff --git a/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarUIView.kt b/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarUIView.kt index d1c7973abf..6f5fc5f787 100644 --- a/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarUIView.kt +++ b/app/src/main/java/org/mozilla/fenix/components/toolbar/ToolbarUIView.kt @@ -113,19 +113,25 @@ class ToolbarUIView( } override fun updateView() = Consumer { - if (shouldUpdateEngineIcon(it)) { - updateEngineIcon(it) + var newState = it + if (shouldUpdateEngineIcon(newState)) { + updateEngineIcon(newState) } if (shouldClearSearchURL(it)) { - clearSearchURL() + newState = SearchState("", "", it.isEditing, it.engine, it.focused) } - if (shouldUpdateEditingState(it)) { - updateEditingState(it) + // Need to set edit mode if the url value was cleared + if (newState.focused || shouldClearSearchURL(it) || shouldUpdateEditingState(newState)) { + updateEditingState(newState) } - state = it + if (!newState.focused) { + view.clearFocus() + } + + state = newState } private fun shouldUpdateEngineIcon(newState: SearchState): Boolean { @@ -145,16 +151,20 @@ class ToolbarUIView( } private fun shouldClearSearchURL(newState: SearchState): Boolean { - return newState.engine != state?.engine && view.url == newState.query - } - - private fun clearSearchURL() { - view.url = "" - view.editMode() + with(view.context) { + val defaultEngine = this + .components + .search + .searchEngineManager + .defaultSearchEngine + + return (newState.engine != null && newState.engine != defaultEngine) || + (state?.engine != null && state?.engine != defaultEngine) + } } private fun shouldUpdateEditingState(newState: SearchState): Boolean { - return !engineDidChange(newState) + return !engineDidChange(newState) && (state?.isEditing != newState.isEditing) } private fun updateEditingState(newState: SearchState) { diff --git a/app/src/main/java/org/mozilla/fenix/search/SearchFragment.kt b/app/src/main/java/org/mozilla/fenix/search/SearchFragment.kt index dcd22a4f4b..7918d437c6 100644 --- a/app/src/main/java/org/mozilla/fenix/search/SearchFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/search/SearchFragment.kt @@ -11,12 +11,14 @@ import android.view.View import android.view.ViewGroup import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment +import kotlinx.android.synthetic.main.component_search.* import kotlinx.android.synthetic.main.fragment_search.* import kotlinx.android.synthetic.main.fragment_search.view.* import mozilla.components.browser.search.SearchEngine import mozilla.components.feature.qr.QrFeature import mozilla.components.feature.search.SearchUseCases import mozilla.components.feature.session.SessionUseCases +import mozilla.components.support.base.feature.BackHandler import mozilla.components.support.base.feature.ViewBoundFeatureWrapper import mozilla.components.support.ktx.kotlin.isUrl import org.mozilla.fenix.BrowserDirection @@ -38,7 +40,8 @@ import org.mozilla.fenix.search.awesomebar.AwesomeBarChange import org.mozilla.fenix.search.awesomebar.AwesomeBarComponent import org.mozilla.fenix.search.awesomebar.AwesomeBarUIView -class SearchFragment : Fragment() { +@Suppress("TooManyFunctions") +class SearchFragment : Fragment(), BackHandler { private lateinit var toolbarComponent: ToolbarComponent private lateinit var awesomeBarComponent: AwesomeBarComponent private var sessionId: String? = null @@ -93,6 +96,7 @@ class SearchFragment : Fragment() { ) view.search_scan_button.setOnClickListener { + getManagedEmitter().onNext(SearchChange.ToolbarClearedFocus) qrFeature.get()?.scan(R.id.container) } @@ -115,15 +119,32 @@ class SearchFragment : Fragment() { override fun onResume() { super.onResume() + getManagedEmitter().onNext(SearchChange.ToolbarRequestedFocus) (activity as AppCompatActivity).supportActionBar?.hide() } + override fun onPause() { + super.onPause() + getManagedEmitter().onNext(SearchChange.ToolbarClearedFocus) + } + override fun onStart() { super.onStart() subscribeToSearchActions() subscribeToAwesomeBarActions() } + override fun onBackPressed(): Boolean { + return when { + qrFeature.onBackPressed() -> { + view?.search_scan_button?.isChecked = false + getManagedEmitter().onNext(SearchChange.ToolbarRequestedFocus) + true + } + else -> false + } + } + private fun subscribeToSearchActions() { getAutoDisposeObservable() .subscribe {