Loading app/src/main/java/org/mozilla/fenix/search/SearchController.kt +1 −0 Original line number Diff line number Diff line Loading @@ -76,6 +76,7 @@ class DefaultSearchController( } override fun handleEditingCancelled() { store.dispatch(SearchFragmentAction.UpdateEditingCanceled) navController.navigateUp() } Loading app/src/main/java/org/mozilla/fenix/search/SearchFragment.kt +25 −2 Original line number Diff line number Diff line Loading @@ -17,7 +17,9 @@ import android.view.ViewGroup import android.view.ViewStub import androidx.appcompat.app.AlertDialog import androidx.core.view.isVisible import androidx.core.view.marginStart import androidx.fragment.app.Fragment import androidx.interpolator.view.animation.FastOutSlowInInterpolator import androidx.navigation.fragment.findNavController import androidx.transition.TransitionInflater import kotlinx.android.synthetic.main.fragment_search.* Loading Loading @@ -111,7 +113,8 @@ class SearchFragment : Fragment(), UserInteractionHandler { showBookmarkSuggestions = requireContext().settings().shouldShowBookmarkSuggestions, session = session, pastedText = pastedText, searchAccessPoint = searchAccessPoint searchAccessPoint = searchAccessPoint, isAnimatingOut = false ) ) } Loading Loading @@ -199,7 +202,7 @@ class SearchFragment : Fragment(), UserInteractionHandler { } view.back_button.setOnClickListener { findNavController().navigateUp() searchInteractor.onEditingCanceled() } val stubListener = ViewStub.OnInflateListener { _, inflated -> Loading Loading @@ -253,6 +256,7 @@ class SearchFragment : Fragment(), UserInteractionHandler { updateSearchWithLabel(it) updateClipboardSuggestion(it, requireContext().components.clipboardHandler.url) updateSearchSuggestionsHintVisibility(it) updateBackButton(it) } startPostponedEnterTransition() Loading Loading @@ -316,6 +320,13 @@ class SearchFragment : Fragment(), UserInteractionHandler { clipboard_url.text = clipboardUrl } private fun updateBackButton(searchState: SearchFragmentState) { if (searchState.isAnimatingOut) { searchStore.dispatch(SearchFragmentAction.ConsumeEditingCancelled) animateBackButtonAway() } } override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<String>, Loading Loading @@ -352,6 +363,18 @@ class SearchFragment : Fragment(), UserInteractionHandler { } } private fun animateBackButtonAway() { val backButton = requireView().back_button val xTranslation = with(backButton) { -(width + marginStart + paddingStart).toFloat() } backButton .animate() .translationX(xTranslation) .interpolator = FastOutSlowInInterpolator() } companion object { private const val SHARED_TRANSITION_MS = 200L private const val REQUEST_CODE_CAMERA_PERMISSIONS = 1 Loading app/src/main/java/org/mozilla/fenix/search/SearchFragmentStore.kt +8 −1 Original line number Diff line number Diff line Loading @@ -57,13 +57,16 @@ data class SearchFragmentState( val showBookmarkSuggestions: Boolean, val session: Session?, val pastedText: String? = null, val searchAccessPoint: Event.PerformedSearch.SearchAccessPoint? val searchAccessPoint: Event.PerformedSearch.SearchAccessPoint?, val isAnimatingOut: Boolean ) : State /** * Actions to dispatch through the `SearchStore` to modify `SearchState` through the reducer. */ sealed class SearchFragmentAction : Action { object UpdateEditingCanceled : SearchFragmentAction() object ConsumeEditingCancelled : SearchFragmentAction() data class SearchShortcutEngineSelected(val engine: SearchEngine) : SearchFragmentAction() data class SelectNewDefaultSearchEngine(val engine: SearchEngine) : SearchFragmentAction() data class ShowSearchShortcutEnginePicker(val show: Boolean) : SearchFragmentAction() Loading Loading @@ -91,5 +94,9 @@ private fun searchStateReducer(state: SearchFragmentState, action: SearchFragmen ) is SearchFragmentAction.ShowSearchSuggestionsHint -> state.copy(showSearchSuggestionsHint = action.show) is SearchFragmentAction.UpdateEditingCanceled -> state.copy(isAnimatingOut = true) is SearchFragmentAction.ConsumeEditingCancelled -> state.copy(isAnimatingOut = false) } } app/src/test/java/org/mozilla/fenix/search/SearchFragmentStoreTest.kt +2 −1 Original line number Diff line number Diff line Loading @@ -58,6 +58,7 @@ class SearchFragmentStoreTest { showHistorySuggestions = false, showBookmarkSuggestions = false, session = null, searchAccessPoint = Event.PerformedSearch.SearchAccessPoint.NONE searchAccessPoint = Event.PerformedSearch.SearchAccessPoint.NONE, isAnimatingOut = false ) } app/src/test/java/org/mozilla/fenix/search/SearchInteractorTest.kt +3 −2 Original line number Diff line number Diff line Loading @@ -13,8 +13,8 @@ import io.mockk.Runs import io.mockk.every import io.mockk.just import io.mockk.mockk import io.mockk.verify import io.mockk.mockkObject import io.mockk.verify import mozilla.components.browser.search.SearchEngine import mozilla.components.browser.search.SearchEngineManager import mozilla.components.browser.session.Session Loading Loading @@ -85,7 +85,7 @@ class SearchInteractorTest { @Test fun onEditingCanceled() { val navController: NavController = mockk(relaxed = true) val store: SearchFragmentStore = mockk() val store: SearchFragmentStore = mockk(relaxed = true) every { store.state } returns mockk(relaxed = true) Loading @@ -99,6 +99,7 @@ class SearchInteractorTest { interactor.onEditingCanceled() verify { store.dispatch(SearchFragmentAction.UpdateEditingCanceled) navController.navigateUp() } } Loading Loading
app/src/main/java/org/mozilla/fenix/search/SearchController.kt +1 −0 Original line number Diff line number Diff line Loading @@ -76,6 +76,7 @@ class DefaultSearchController( } override fun handleEditingCancelled() { store.dispatch(SearchFragmentAction.UpdateEditingCanceled) navController.navigateUp() } Loading
app/src/main/java/org/mozilla/fenix/search/SearchFragment.kt +25 −2 Original line number Diff line number Diff line Loading @@ -17,7 +17,9 @@ import android.view.ViewGroup import android.view.ViewStub import androidx.appcompat.app.AlertDialog import androidx.core.view.isVisible import androidx.core.view.marginStart import androidx.fragment.app.Fragment import androidx.interpolator.view.animation.FastOutSlowInInterpolator import androidx.navigation.fragment.findNavController import androidx.transition.TransitionInflater import kotlinx.android.synthetic.main.fragment_search.* Loading Loading @@ -111,7 +113,8 @@ class SearchFragment : Fragment(), UserInteractionHandler { showBookmarkSuggestions = requireContext().settings().shouldShowBookmarkSuggestions, session = session, pastedText = pastedText, searchAccessPoint = searchAccessPoint searchAccessPoint = searchAccessPoint, isAnimatingOut = false ) ) } Loading Loading @@ -199,7 +202,7 @@ class SearchFragment : Fragment(), UserInteractionHandler { } view.back_button.setOnClickListener { findNavController().navigateUp() searchInteractor.onEditingCanceled() } val stubListener = ViewStub.OnInflateListener { _, inflated -> Loading Loading @@ -253,6 +256,7 @@ class SearchFragment : Fragment(), UserInteractionHandler { updateSearchWithLabel(it) updateClipboardSuggestion(it, requireContext().components.clipboardHandler.url) updateSearchSuggestionsHintVisibility(it) updateBackButton(it) } startPostponedEnterTransition() Loading Loading @@ -316,6 +320,13 @@ class SearchFragment : Fragment(), UserInteractionHandler { clipboard_url.text = clipboardUrl } private fun updateBackButton(searchState: SearchFragmentState) { if (searchState.isAnimatingOut) { searchStore.dispatch(SearchFragmentAction.ConsumeEditingCancelled) animateBackButtonAway() } } override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<String>, Loading Loading @@ -352,6 +363,18 @@ class SearchFragment : Fragment(), UserInteractionHandler { } } private fun animateBackButtonAway() { val backButton = requireView().back_button val xTranslation = with(backButton) { -(width + marginStart + paddingStart).toFloat() } backButton .animate() .translationX(xTranslation) .interpolator = FastOutSlowInInterpolator() } companion object { private const val SHARED_TRANSITION_MS = 200L private const val REQUEST_CODE_CAMERA_PERMISSIONS = 1 Loading
app/src/main/java/org/mozilla/fenix/search/SearchFragmentStore.kt +8 −1 Original line number Diff line number Diff line Loading @@ -57,13 +57,16 @@ data class SearchFragmentState( val showBookmarkSuggestions: Boolean, val session: Session?, val pastedText: String? = null, val searchAccessPoint: Event.PerformedSearch.SearchAccessPoint? val searchAccessPoint: Event.PerformedSearch.SearchAccessPoint?, val isAnimatingOut: Boolean ) : State /** * Actions to dispatch through the `SearchStore` to modify `SearchState` through the reducer. */ sealed class SearchFragmentAction : Action { object UpdateEditingCanceled : SearchFragmentAction() object ConsumeEditingCancelled : SearchFragmentAction() data class SearchShortcutEngineSelected(val engine: SearchEngine) : SearchFragmentAction() data class SelectNewDefaultSearchEngine(val engine: SearchEngine) : SearchFragmentAction() data class ShowSearchShortcutEnginePicker(val show: Boolean) : SearchFragmentAction() Loading Loading @@ -91,5 +94,9 @@ private fun searchStateReducer(state: SearchFragmentState, action: SearchFragmen ) is SearchFragmentAction.ShowSearchSuggestionsHint -> state.copy(showSearchSuggestionsHint = action.show) is SearchFragmentAction.UpdateEditingCanceled -> state.copy(isAnimatingOut = true) is SearchFragmentAction.ConsumeEditingCancelled -> state.copy(isAnimatingOut = false) } }
app/src/test/java/org/mozilla/fenix/search/SearchFragmentStoreTest.kt +2 −1 Original line number Diff line number Diff line Loading @@ -58,6 +58,7 @@ class SearchFragmentStoreTest { showHistorySuggestions = false, showBookmarkSuggestions = false, session = null, searchAccessPoint = Event.PerformedSearch.SearchAccessPoint.NONE searchAccessPoint = Event.PerformedSearch.SearchAccessPoint.NONE, isAnimatingOut = false ) }
app/src/test/java/org/mozilla/fenix/search/SearchInteractorTest.kt +3 −2 Original line number Diff line number Diff line Loading @@ -13,8 +13,8 @@ import io.mockk.Runs import io.mockk.every import io.mockk.just import io.mockk.mockk import io.mockk.verify import io.mockk.mockkObject import io.mockk.verify import mozilla.components.browser.search.SearchEngine import mozilla.components.browser.search.SearchEngineManager import mozilla.components.browser.session.Session Loading Loading @@ -85,7 +85,7 @@ class SearchInteractorTest { @Test fun onEditingCanceled() { val navController: NavController = mockk(relaxed = true) val store: SearchFragmentStore = mockk() val store: SearchFragmentStore = mockk(relaxed = true) every { store.state } returns mockk(relaxed = true) Loading @@ -99,6 +99,7 @@ class SearchInteractorTest { interactor.onEditingCanceled() verify { store.dispatch(SearchFragmentAction.UpdateEditingCanceled) navController.navigateUp() } } Loading