pull/600/head
Sawyer Blatz 5 years ago committed by GitHub
parent 912a5c2574
commit 04c3965413

@ -4,14 +4,12 @@
package org.mozilla.fenix package org.mozilla.fenix
import android.app.Activity
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.preference.PreferenceManager import android.preference.PreferenceManager
import android.util.AttributeSet import android.util.AttributeSet
import android.view.View import android.view.View
import android.view.inputmethod.InputMethodManager
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar import androidx.appcompat.widget.Toolbar
import androidx.navigation.fragment.NavHostFragment import androidx.navigation.fragment.NavHostFragment
@ -87,11 +85,6 @@ open class HomeActivity : AppCompatActivity() {
handleOpenedFromExternalSourceIfNecessary(intent) handleOpenedFromExternalSourceIfNecessary(intent)
} }
override fun onResume() {
super.onResume()
showSoftwareKeyboardIfNecessary()
}
override fun onNewIntent(intent: Intent?) { override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent) super.onNewIntent(intent)
handleCrashIfNecessary(intent) handleCrashIfNecessary(intent)
@ -118,29 +111,6 @@ open class HomeActivity : AppCompatActivity() {
super.onBackPressed() 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?) { private fun handleCrashIfNecessary(intent: Intent?) {
if (intent == null) { return } if (intent == null) { return }
if (!Crash.isCrashIntent(intent)) { return } if (!Crash.isCrashIntent(intent)) { return }

@ -36,6 +36,8 @@ class ToolbarComponent(
override val reducer: Reducer<SearchState, SearchChange> = { state, change -> override val reducer: Reducer<SearchState, SearchChange> = { state, change ->
when (change) { when (change) {
is SearchChange.ToolbarClearedFocus -> state.copy(focused = false)
is SearchChange.ToolbarRequestedFocus -> state.copy(focused = true)
is SearchChange.SearchShortcutEngineSelected -> is SearchChange.SearchShortcutEngineSelected ->
state.copy(engine = change.engine) state.copy(engine = change.engine)
} }
@ -75,7 +77,8 @@ data class SearchState(
val query: String, val query: String,
val searchTerm: String, val searchTerm: String,
val isEditing: Boolean, val isEditing: Boolean,
val engine: SearchEngine? = null val engine: SearchEngine? = null,
val focused: Boolean = isEditing
) : ViewState ) : ViewState
sealed class SearchAction : Action { sealed class SearchAction : Action {
@ -88,5 +91,7 @@ sealed class SearchAction : Action {
} }
sealed class SearchChange : Change { sealed class SearchChange : Change {
object ToolbarRequestedFocus : SearchChange()
object ToolbarClearedFocus : SearchChange()
data class SearchShortcutEngineSelected(val engine: SearchEngine) : SearchChange() data class SearchShortcutEngineSelected(val engine: SearchEngine) : SearchChange()
} }

@ -113,19 +113,25 @@ class ToolbarUIView(
} }
override fun updateView() = Consumer<SearchState> { override fun updateView() = Consumer<SearchState> {
if (shouldUpdateEngineIcon(it)) { var newState = it
updateEngineIcon(it) if (shouldUpdateEngineIcon(newState)) {
updateEngineIcon(newState)
} }
if (shouldClearSearchURL(it)) { if (shouldClearSearchURL(it)) {
clearSearchURL() newState = SearchState("", "", it.isEditing, it.engine, it.focused)
} }
if (shouldUpdateEditingState(it)) { // Need to set edit mode if the url value was cleared
updateEditingState(it) if (newState.focused || shouldClearSearchURL(it) || shouldUpdateEditingState(newState)) {
updateEditingState(newState)
} }
state = it if (!newState.focused) {
view.clearFocus()
}
state = newState
} }
private fun shouldUpdateEngineIcon(newState: SearchState): Boolean { private fun shouldUpdateEngineIcon(newState: SearchState): Boolean {
@ -145,16 +151,20 @@ class ToolbarUIView(
} }
private fun shouldClearSearchURL(newState: SearchState): Boolean { private fun shouldClearSearchURL(newState: SearchState): Boolean {
return newState.engine != state?.engine && view.url == newState.query with(view.context) {
} val defaultEngine = this
.components
private fun clearSearchURL() { .search
view.url = "" .searchEngineManager
view.editMode() .defaultSearchEngine
return (newState.engine != null && newState.engine != defaultEngine) ||
(state?.engine != null && state?.engine != defaultEngine)
}
} }
private fun shouldUpdateEditingState(newState: SearchState): Boolean { private fun shouldUpdateEditingState(newState: SearchState): Boolean {
return !engineDidChange(newState) return !engineDidChange(newState) && (state?.isEditing != newState.isEditing)
} }
private fun updateEditingState(newState: SearchState) { private fun updateEditingState(newState: SearchState) {

@ -11,12 +11,14 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment 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.*
import kotlinx.android.synthetic.main.fragment_search.view.* import kotlinx.android.synthetic.main.fragment_search.view.*
import mozilla.components.browser.search.SearchEngine import mozilla.components.browser.search.SearchEngine
import mozilla.components.feature.qr.QrFeature import mozilla.components.feature.qr.QrFeature
import mozilla.components.feature.search.SearchUseCases import mozilla.components.feature.search.SearchUseCases
import mozilla.components.feature.session.SessionUseCases import mozilla.components.feature.session.SessionUseCases
import mozilla.components.support.base.feature.BackHandler
import mozilla.components.support.base.feature.ViewBoundFeatureWrapper import mozilla.components.support.base.feature.ViewBoundFeatureWrapper
import mozilla.components.support.ktx.kotlin.isUrl import mozilla.components.support.ktx.kotlin.isUrl
import org.mozilla.fenix.BrowserDirection 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.AwesomeBarComponent
import org.mozilla.fenix.search.awesomebar.AwesomeBarUIView import org.mozilla.fenix.search.awesomebar.AwesomeBarUIView
class SearchFragment : Fragment() { @Suppress("TooManyFunctions")
class SearchFragment : Fragment(), BackHandler {
private lateinit var toolbarComponent: ToolbarComponent private lateinit var toolbarComponent: ToolbarComponent
private lateinit var awesomeBarComponent: AwesomeBarComponent private lateinit var awesomeBarComponent: AwesomeBarComponent
private var sessionId: String? = null private var sessionId: String? = null
@ -93,6 +96,7 @@ class SearchFragment : Fragment() {
) )
view.search_scan_button.setOnClickListener { view.search_scan_button.setOnClickListener {
getManagedEmitter<SearchChange>().onNext(SearchChange.ToolbarClearedFocus)
qrFeature.get()?.scan(R.id.container) qrFeature.get()?.scan(R.id.container)
} }
@ -115,15 +119,32 @@ class SearchFragment : Fragment() {
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
getManagedEmitter<SearchChange>().onNext(SearchChange.ToolbarRequestedFocus)
(activity as AppCompatActivity).supportActionBar?.hide() (activity as AppCompatActivity).supportActionBar?.hide()
} }
override fun onPause() {
super.onPause()
getManagedEmitter<SearchChange>().onNext(SearchChange.ToolbarClearedFocus)
}
override fun onStart() { override fun onStart() {
super.onStart() super.onStart()
subscribeToSearchActions() subscribeToSearchActions()
subscribeToAwesomeBarActions() subscribeToAwesomeBarActions()
} }
override fun onBackPressed(): Boolean {
return when {
qrFeature.onBackPressed() -> {
view?.search_scan_button?.isChecked = false
getManagedEmitter<SearchChange>().onNext(SearchChange.ToolbarRequestedFocus)
true
}
else -> false
}
}
private fun subscribeToSearchActions() { private fun subscribeToSearchActions() {
getAutoDisposeObservable<SearchAction>() getAutoDisposeObservable<SearchAction>()
.subscribe { .subscribe {

Loading…
Cancel
Save