From 4533ed336484b7299d7f1b429314a560a05f1cbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=20?= =?UTF-8?q?=D0=97=D0=B0=D1=86=D0=B5=D0=BF=D0=B8=D0=BD?= Date: Tue, 29 Jan 2019 18:38:28 +0300 Subject: [PATCH] [android] Added third party anchor bottom sheet behavior and adapted it for place page --- android/build.gradle | 2 + android/res/layout/activity_map.xml | 3 +- android/res/values/attrs.xml | 11 +++ android/res/values/donottranslate.xml | 1 + .../BottomSheetPlacePageController.java | 73 +++++++++++-------- data/copyright.html | 3 + 6 files changed, 63 insertions(+), 30 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index 96bcdce715..019c5e3dc6 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -18,6 +18,7 @@ allprojects { google() mavenCentral() jcenter() + maven { url 'https://jitpack.io' } } } @@ -110,6 +111,7 @@ dependencies { implementation 'uk.co.samuelwall:material-tap-target-prompt:2.12.1' implementation 'com.firebase:firebase-jobdispatcher:0.8.5' implementation 'com.google.android:flexbox:1.0.0' + implementation 'com.trafi:anchor-bottom-sheet-behavior:0.13-alpha' } def getDate() { diff --git a/android/res/layout/activity_map.xml b/android/res/layout/activity_map.xml index 396dc96e95..be3b2dbd62 100644 --- a/android/res/layout/activity_map.xml +++ b/android/res/layout/activity_map.xml @@ -80,7 +80,8 @@ android:layout_height="wrap_content" android:fillViewport="true" app:behavior_hideable="true" - app:layout_behavior="@string/bottom_sheet_behavior"/> + app:behavior_defaultState="hidden" + app:layout_behavior="@string/placepage_behavior"/> + + + + + + + + + + + diff --git a/android/res/values/donottranslate.xml b/android/res/values/donottranslate.xml index 0abff8106c..bb14824504 100644 --- a/android/res/values/donottranslate.xml +++ b/android/res/values/donottranslate.xml @@ -97,4 +97,5 @@ ALWAYS AUTO com.mapswithme.maps.widget.placepage.ToolbarBehavior + com.trafi.anchorbottomsheetbehavior.AnchorBottomSheetBehavior diff --git a/android/src/com/mapswithme/maps/widget/placepage/BottomSheetPlacePageController.java b/android/src/com/mapswithme/maps/widget/placepage/BottomSheetPlacePageController.java index 41f1a222d5..9eca5d6076 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/BottomSheetPlacePageController.java +++ b/android/src/com/mapswithme/maps/widget/placepage/BottomSheetPlacePageController.java @@ -6,7 +6,6 @@ import android.app.Activity; import android.graphics.Rect; import android.location.Location; import android.support.annotation.NonNull; -import android.support.design.widget.BottomSheetBehavior; import android.support.v7.widget.Toolbar; import android.view.View; import android.view.ViewGroup; @@ -20,18 +19,20 @@ import com.mapswithme.util.UiUtils; import com.mapswithme.util.log.Logger; import com.mapswithme.util.log.LoggerFactory; import com.mapswithme.util.statistics.PlacePageTracker; +import com.trafi.anchorbottomsheetbehavior.AnchorBottomSheetBehavior; public class BottomSheetPlacePageController implements PlacePageController, LocationListener, View.OnLayoutChangeListener { private static final int BUTTONS_ANIMATION_DURATION = 100; + private static final float ANCHOR_RATIO = 0.3f; private static final Logger LOGGER = LoggerFactory.INSTANCE.getLogger(LoggerFactory.Type.MISC); private static final String TAG = BottomSheetPlacePageController.class.getSimpleName(); @NonNull private final Activity mActivity; @SuppressWarnings("NullableProblems") @NonNull - private BottomSheetBehavior mPlacePageBehavior; + private AnchorBottomSheetBehavior mPlacePageBehavior; @SuppressWarnings("NullableProblems") @NonNull private View mButtonsLayout; @@ -47,20 +48,21 @@ public class BottomSheetPlacePageController implements PlacePageController, Loca private int mLastPeekHeight; private int mViewportMinHeight; @NonNull - private final BottomSheetBehavior.BottomSheetCallback mSheetCallback - = new BottomSheetBehavior.BottomSheetCallback() + private final AnchorBottomSheetBehavior.BottomSheetCallback mSheetCallback + = new AnchorBottomSheetBehavior.BottomSheetCallback() { @Override - public void onStateChanged(@NonNull View bottomSheet, int newState) + public void onStateChanged(@NonNull View bottomSheet, int oldState, int newState) { LOGGER.d(TAG, "State change, new = " + BottomSheetPlacePageController.toString(newState) + + " old = " + BottomSheetPlacePageController.toString(oldState) + " placepage height = " + mPlacePage.getHeight()); - if (newState == BottomSheetBehavior.STATE_SETTLING - || newState == BottomSheetBehavior.STATE_DRAGGING) + if (newState == AnchorBottomSheetBehavior.STATE_SETTLING + || newState == AnchorBottomSheetBehavior.STATE_DRAGGING) return; - if (newState == BottomSheetBehavior.STATE_HIDDEN) + if (newState == AnchorBottomSheetBehavior.STATE_HIDDEN) { hideButtons(); return; @@ -90,9 +92,8 @@ public class BottomSheetPlacePageController implements PlacePageController, Loca UiUtils.showHomeUpButton(mToolbar); mToolbar.setNavigationOnClickListener(v -> close()); mPlacePage = mActivity.findViewById(R.id.placepage); - mPlacePageBehavior = BottomSheetBehavior.from(mPlacePage); - mPlacePageBehavior.setState(BottomSheetBehavior.STATE_HIDDEN); - mPlacePageBehavior.setBottomSheetCallback(mSheetCallback); + mPlacePageBehavior = AnchorBottomSheetBehavior.from(mPlacePage); + mPlacePageBehavior.addBottomSheetCallback(mSheetCallback); mPlacePage.addOnLayoutChangeListener(this); mButtonsLayout = mActivity.findViewById(R.id.pp_buttons_layout); ViewGroup buttons = mButtonsLayout.findViewById(R.id.container); @@ -115,28 +116,40 @@ public class BottomSheetPlacePageController implements PlacePageController, Loca mPlacePage.setMapObject(object, false, () -> { if (object.isExtendedView()) { - mPlacePageBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); + mPlacePageBehavior.setState(AnchorBottomSheetBehavior.STATE_EXPANDED); return; } - openBottomSheet(); + openPlacePage(); }); mToolbar.setTitle(object.getTitle()); mPlacePageTracker.setMapObject(object); Framework.logLocalAdsEvent(Framework.LocalAdsEventType.LOCAL_ADS_EVENT_OPEN_INFO, object); } - private void openBottomSheet() + private void openPlacePage() { mPlacePage.post(() -> { - int peekHeight = getPeekHeight(); - LOGGER.d(TAG, "Peek height = " + peekHeight); - mLastPeekHeight = peekHeight; - mPlacePageBehavior.setPeekHeight(mLastPeekHeight); - mPlacePageBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED); + collapsePlacePage(); + setPlacePageAnchor(); }); } + private void collapsePlacePage() + { + int peekHeight = getPeekHeight(); + LOGGER.d(TAG, "Peek height = " + peekHeight); + mLastPeekHeight = peekHeight; + mPlacePageBehavior.setPeekHeight(mLastPeekHeight); + mPlacePageBehavior.setState(AnchorBottomSheetBehavior.STATE_COLLAPSED); + } + + private void setPlacePageAnchor() + { + View parent = (View) mPlacePage.getParent(); + mPlacePageBehavior.setAnchorOffset((int) (parent.getHeight() * ANCHOR_RATIO)); + } + private int getPeekHeight() { return mPlacePage.getPreviewHeight() + mButtonsLayout.getHeight(); @@ -145,7 +158,7 @@ public class BottomSheetPlacePageController implements PlacePageController, Loca @Override public void close() { - mPlacePageBehavior.setState(BottomSheetBehavior.STATE_HIDDEN); + mPlacePageBehavior.setState(AnchorBottomSheetBehavior.STATE_HIDDEN); mPlacePage.hide(); } @@ -186,7 +199,7 @@ public class BottomSheetPlacePageController implements PlacePageController, Loca @Override public boolean isClosed() { - return mPlacePageBehavior.getState() == BottomSheetBehavior.STATE_HIDDEN; + return mPlacePageBehavior.getState() == AnchorBottomSheetBehavior.STATE_HIDDEN; } @Override @@ -213,13 +226,13 @@ public class BottomSheetPlacePageController implements PlacePageController, Loca oldTop, int oldRight, int oldBottom) { LOGGER.d(TAG, "Layout changed, current state = " + toString(mPlacePageBehavior.getState())); - if (mPlacePageBehavior.getState() != BottomSheetBehavior.STATE_COLLAPSED) + if (mPlacePageBehavior.getState() != AnchorBottomSheetBehavior.STATE_COLLAPSED) return; if (getPeekHeight() == mLastPeekHeight) return; - openBottomSheet(); + openPlacePage(); } private void updateViewPortRect() @@ -243,19 +256,21 @@ public class BottomSheetPlacePageController implements PlacePageController, Loca } @NonNull - private static String toString(@BottomSheetBehavior.State int state) + private static String toString(@AnchorBottomSheetBehavior.State int state) { switch (state) { - case BottomSheetBehavior.STATE_EXPANDED: + case AnchorBottomSheetBehavior.STATE_EXPANDED: return "EXPANDED"; - case BottomSheetBehavior.STATE_COLLAPSED: + case AnchorBottomSheetBehavior.STATE_COLLAPSED: return "COLLAPSED"; - case BottomSheetBehavior.STATE_DRAGGING: + case AnchorBottomSheetBehavior.STATE_ANCHORED: + return "ANCHORED"; + case AnchorBottomSheetBehavior.STATE_DRAGGING: return "DRAGGING"; - case BottomSheetBehavior.STATE_SETTLING: + case AnchorBottomSheetBehavior.STATE_SETTLING: return "SETTLING"; - case BottomSheetBehavior.STATE_HIDDEN: + case AnchorBottomSheetBehavior.STATE_HIDDEN: return "HIDDEN"; default: throw new AssertionError("Unsupported state detected: " + state); diff --git a/data/copyright.html b/data/copyright.html index a206af0283..cff1908142 100644 --- a/data/copyright.html +++ b/data/copyright.html @@ -210,6 +210,9 @@
  • sticky-headers-recyclerview
    © 2014 Jacob Tabak; Apache License
  • + +
  • AnchorBottomSheetBehavior
    + Apache License
  • We also use these wonderful fonts for labels on the map: