Unverified Commit 20396f78 authored by Sawyer Blatz's avatar Sawyer Blatz Committed by GitHub
Browse files

For #7698: Adds search back button animation (#7840)

* For #7698: Adds search back button animation

* Refactor for searchController
parent 2372ee6b
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -76,6 +76,7 @@ class DefaultSearchController(
    }

    override fun handleEditingCancelled() {
        store.dispatch(SearchFragmentAction.UpdateEditingCanceled)
        navController.navigateUp()
    }

+25 −2
Original line number Diff line number Diff line
@@ -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.*
@@ -111,7 +113,8 @@ class SearchFragment : Fragment(), UserInteractionHandler {
                    showBookmarkSuggestions = requireContext().settings().shouldShowBookmarkSuggestions,
                    session = session,
                    pastedText = pastedText,
                    searchAccessPoint = searchAccessPoint
                    searchAccessPoint = searchAccessPoint,
                    isAnimatingOut = false
                )
            )
        }
@@ -199,7 +202,7 @@ class SearchFragment : Fragment(), UserInteractionHandler {
        }

        view.back_button.setOnClickListener {
            findNavController().navigateUp()
            searchInteractor.onEditingCanceled()
        }

        val stubListener = ViewStub.OnInflateListener { _, inflated ->
@@ -253,6 +256,7 @@ class SearchFragment : Fragment(), UserInteractionHandler {
            updateSearchWithLabel(it)
            updateClipboardSuggestion(it, requireContext().components.clipboardHandler.url)
            updateSearchSuggestionsHintVisibility(it)
            updateBackButton(it)
        }

        startPostponedEnterTransition()
@@ -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>,
@@ -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
+8 −1
Original line number Diff line number Diff line
@@ -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()
@@ -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)
    }
}
+2 −1
Original line number Diff line number Diff line
@@ -58,6 +58,7 @@ class SearchFragmentStoreTest {
        showHistorySuggestions = false,
        showBookmarkSuggestions = false,
        session = null,
        searchAccessPoint = Event.PerformedSearch.SearchAccessPoint.NONE
        searchAccessPoint = Event.PerformedSearch.SearchAccessPoint.NONE,
        isAnimatingOut = false
    )
}
+3 −2
Original line number Diff line number Diff line
@@ -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
@@ -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)

@@ -99,6 +99,7 @@ class SearchInteractorTest {
        interactor.onEditingCanceled()

        verify {
            store.dispatch(SearchFragmentAction.UpdateEditingCanceled)
            navController.navigateUp()
        }
    }
Loading