For #1954: Resolves QR scanner back press and keyboard issues (#2036)

nightly-build-test
Sawyer Blatz 5 years ago committed by GitHub
parent 1aee091485
commit 4945805e37
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -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 }

@ -36,6 +36,8 @@ class ToolbarComponent(
override val reducer: Reducer<SearchState, SearchChange> = { 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()
}

@ -113,19 +113,25 @@ class ToolbarUIView(
}
override fun updateView() = Consumer<SearchState> {
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) {

@ -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<SearchChange>().onNext(SearchChange.ToolbarClearedFocus)
qrFeature.get()?.scan(R.id.container)
}
@ -115,15 +119,32 @@ class SearchFragment : Fragment() {
override fun onResume() {
super.onResume()
getManagedEmitter<SearchChange>().onNext(SearchChange.ToolbarRequestedFocus)
(activity as AppCompatActivity).supportActionBar?.hide()
}
override fun onPause() {
super.onPause()
getManagedEmitter<SearchChange>().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<SearchChange>().onNext(SearchChange.ToolbarRequestedFocus)
true
}
else -> false
}
}
private fun subscribeToSearchActions() {
getAutoDisposeObservable<SearchAction>()
.subscribe {

Loading…
Cancel
Save