From d2af87f8f85b137c8fead4e0cf360a0133817319 Mon Sep 17 00:00:00 2001 From: Sawyer Blatz Date: Tue, 19 Mar 2019 14:14:55 -0700 Subject: [PATCH] For #1072: Adds grabber handle bounce animation --- .../mozilla/fenix/browser/BrowserFragment.kt | 4 +++ .../quickactionsheet/QuickActionSheet.kt | 33 ++++++++++++++----- .../main/res/drawable/ic_drawer_pull_tab.xml | 11 +++++++ .../res/layout/component_quickactionsheet.xml | 13 ++++---- app/src/main/res/layout/fragment_browser.xml | 3 +- 5 files changed, 49 insertions(+), 15 deletions(-) create mode 100644 app/src/main/res/drawable/ic_drawer_pull_tab.xml diff --git a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt index 212f4e044..2c3df9cdf 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt @@ -53,6 +53,7 @@ import org.mozilla.fenix.ext.requireComponents import org.mozilla.fenix.ext.share import org.mozilla.fenix.mvi.ActionBusFactory import org.mozilla.fenix.mvi.getAutoDisposeObservable +import org.mozilla.fenix.quickactionsheet.QuickActionSheet class BrowserFragment : Fragment(), BackHandler { private lateinit var toolbarComponent: ToolbarComponent @@ -208,6 +209,9 @@ class BrowserFragment : Fragment(), BackHandler { view = view ) + val actionSheet = view.findViewById(R.id.quick_action_sheet) + actionSheet.afterInflate() + val actionEmitter = ActionBusFactory.get(this).getManagedEmitter(SearchAction::class.java) sessionId?.let { id -> customTabsIntegration.set( diff --git a/app/src/main/java/org/mozilla/fenix/quickactionsheet/QuickActionSheet.kt b/app/src/main/java/org/mozilla/fenix/quickactionsheet/QuickActionSheet.kt index e519a1e96..ae13f3b67 100644 --- a/app/src/main/java/org/mozilla/fenix/quickactionsheet/QuickActionSheet.kt +++ b/app/src/main/java/org/mozilla/fenix/quickactionsheet/QuickActionSheet.kt @@ -2,7 +2,6 @@ package org.mozilla.fenix.quickactionsheet import android.content.Context import android.util.AttributeSet -import android.view.LayoutInflater import android.view.View import android.widget.LinearLayout import androidx.appcompat.widget.AppCompatImageButton @@ -11,6 +10,9 @@ import androidx.core.widget.NestedScrollView import com.google.android.material.bottomsheet.BottomSheetBehavior import mozilla.components.browser.toolbar.BrowserToolbar import org.mozilla.fenix.R +import android.animation.ValueAnimator +import androidx.interpolator.view.animation.FastOutSlowInInterpolator +import org.mozilla.fenix.ext.increaseTapArea class QuickActionSheet @JvmOverloads constructor( context: Context, @@ -21,24 +23,39 @@ class QuickActionSheet @JvmOverloads constructor( init { inflate(getContext(), R.layout.component_quickactionsheet, this) - //setupHandle() + } + + fun afterInflate() { + setupHandle() } private fun setupHandle() { val handle = findViewById(R.id.quick_action_sheet_handle) val linearLayout = findViewById(R.id.quick_action_sheet) - val quickActionSheetBehavior = BottomSheetBehavior.from(linearLayout) as QuickActionSheetBehavior + val quickActionSheetBehavior = BottomSheetBehavior.from(linearLayout.parent as View) as QuickActionSheetBehavior + handle.increaseTapArea(100) handle.setOnClickListener { bounceSheet(quickActionSheetBehavior) } + + bounceSheet(quickActionSheetBehavior, 600L) } - private fun bounceSheet(quickActionSheetBehavior: QuickActionSheetBehavior) { - quickActionSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN - quickActionSheetBehavior.peekHeight = height - quickActionSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED - } + private fun bounceSheet(quickActionSheetBehavior: QuickActionSheetBehavior, duration: Long = 400L) { + val normalPeekHeight = quickActionSheetBehavior.peekHeight + val valueAnimator = ValueAnimator.ofFloat(normalPeekHeight.toFloat(), normalPeekHeight*6f) + valueAnimator.addUpdateListener { + quickActionSheetBehavior.peekHeight = (it.animatedValue as Float).toInt() + } + + valueAnimator.repeatMode = ValueAnimator.REVERSE + valueAnimator.repeatCount = 1 + // Fast out slow in looks best so far + valueAnimator.interpolator = FastOutSlowInInterpolator() + valueAnimator.duration = duration + valueAnimator.start() + } } @Suppress("unused") // Referenced from XML diff --git a/app/src/main/res/drawable/ic_drawer_pull_tab.xml b/app/src/main/res/drawable/ic_drawer_pull_tab.xml new file mode 100644 index 000000000..f7f5a04f3 --- /dev/null +++ b/app/src/main/res/drawable/ic_drawer_pull_tab.xml @@ -0,0 +1,11 @@ + + + + + + + diff --git a/app/src/main/res/layout/component_quickactionsheet.xml b/app/src/main/res/layout/component_quickactionsheet.xml index 8f3dec57a..e7474a4a9 100644 --- a/app/src/main/res/layout/component_quickactionsheet.xml +++ b/app/src/main/res/layout/component_quickactionsheet.xml @@ -9,21 +9,22 @@ android:orientation="vertical" android:layout_width="match_parent" android:layout_height="80dp" - android:background="@color/photonRed50"> + android:background="@color/off_white"> + android:background="@drawable/ic_drawer_pull_tab"/> + android:layout_height="78dp" + android:background="@color/off_white">