diff --git a/android/res/layout/elevation_profile_bottom_sheet.xml b/android/res/layout/elevation_profile_bottom_sheet.xml index 8bcbb528ef..1b9ac8b986 100644 --- a/android/res/layout/elevation_profile_bottom_sheet.xml +++ b/android/res/layout/elevation_profile_bottom_sheet.xml @@ -13,6 +13,7 @@ app:behavior_defaultState="hidden" app:behavior_hideable="true" app:behavior_skipAnchored="true" + app:behavior_peekHeight="@dimen/elevation_profile_peek_height" app:layout_behavior="@string/placepage_behavior" android:orientation="vertical"> 2dp 100dp 300dp - 269dp + 260dp 144dp 68dp 10dp + 144dp + 72dp 48dp @@ -292,6 +294,4 @@ 328dp @dimen/margin_base_plus 88dp - 144dp - 72dp diff --git a/android/src/com/mapswithme/maps/widget/placepage/PlacePageGestureListener.java b/android/src/com/mapswithme/maps/widget/placepage/PlacePageGestureListener.java new file mode 100644 index 0000000000..f76ebdf618 --- /dev/null +++ b/android/src/com/mapswithme/maps/widget/placepage/PlacePageGestureListener.java @@ -0,0 +1,45 @@ +package com.mapswithme.maps.widget.placepage; + +import android.view.GestureDetector; +import android.view.MotionEvent; +import android.view.View; + +import androidx.annotation.NonNull; +import com.trafi.anchorbottomsheetbehavior.AnchorBottomSheetBehavior; + +class PlacePageGestureListener extends GestureDetector.SimpleOnGestureListener +{ + @NonNull + private final AnchorBottomSheetBehavior mBottomSheetBehavior; + + PlacePageGestureListener(@NonNull AnchorBottomSheetBehavior bottomSheetBehavior) + { + mBottomSheetBehavior = bottomSheetBehavior; + } + + @NonNull + AnchorBottomSheetBehavior getBottomSheetBehavior() + { + return mBottomSheetBehavior; + } + + @Override + public boolean onSingleTapConfirmed(MotionEvent e) + { + @AnchorBottomSheetBehavior.State + int state = mBottomSheetBehavior.getState(); + if (PlacePageUtils.isCollapsedState(state)) + { + mBottomSheetBehavior.setState(AnchorBottomSheetBehavior.STATE_ANCHORED); + return true; + } + + if (PlacePageUtils.isAnchoredState(state) || PlacePageUtils.isExpandedState(state)) + { + mBottomSheetBehavior.setState(AnchorBottomSheetBehavior.STATE_COLLAPSED); + return true; + } + + return false; + } +} diff --git a/android/src/com/mapswithme/maps/widget/placepage/RichPlacePageController.java b/android/src/com/mapswithme/maps/widget/placepage/RichPlacePageController.java index 3622944d31..213202c38f 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/RichPlacePageController.java +++ b/android/src/com/mapswithme/maps/widget/placepage/RichPlacePageController.java @@ -8,8 +8,6 @@ import android.content.res.Resources; import android.location.Location; import android.os.Bundle; import android.util.Log; -import android.view.GestureDetector; -import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; @@ -36,6 +34,8 @@ import com.mapswithme.util.log.LoggerFactory; import com.mapswithme.util.statistics.PlacePageTracker; import com.trafi.anchorbottomsheetbehavior.AnchorBottomSheetBehavior; +import java.util.Objects; + public class RichPlacePageController implements PlacePageController, LocationListener, View.OnLayoutChangeListener, BannerController.BannerStateRequester, @@ -80,9 +80,6 @@ public class RichPlacePageController implements PlacePageController, private final AdsRemovalPurchaseControllerProvider mPurchaseControllerProvider; @NonNull private final SlideListener mSlideListener; - @SuppressWarnings("NullableProblems") - @NonNull - private GestureDetectorCompat mGestureDetector; @Nullable private final RoutingModeListener mRoutingModeListener; @NonNull @@ -110,6 +107,7 @@ public class RichPlacePageController implements PlacePageController, @Override public void onSheetCollapsed() { + mPlacePage.resetScroll(); mBannerController.onPlacePageStateChanged(); setPeekHeight(); } @@ -209,12 +207,7 @@ public class RichPlacePageController implements PlacePageController, @Override public void initialize(@Nullable Activity activity) { - if (activity == null) - throw new AssertionError("Activity must be non-null!"); - - - mGestureDetector = new GestureDetectorCompat(activity, new PlacePageGestureListener()); - + Objects.requireNonNull(activity); Resources res = activity.getResources(); mViewportMinHeight = res.getDimensionPixelSize(R.dimen.viewport_min_height); mOpenBannerTouchSlop = res.getDimensionPixelSize(R.dimen.placepage_banner_open_touch_slop); @@ -225,11 +218,12 @@ public class RichPlacePageController implements PlacePageController, mPlacePage = activity.findViewById(R.id.placepage); mPlacePageBehavior = AnchorBottomSheetBehavior.from(mPlacePage); mPlacePageBehavior.addBottomSheetCallback(mSheetCallback); - mPlacePage.setOnTouchListener((v, event) -> mGestureDetector.onTouchEvent(event)); + GestureDetectorCompat gestureDetector + = new GestureDetectorCompat(activity, new PlacePageGestureListener(mPlacePageBehavior)); + mPlacePage.setOnTouchListener((v, event) -> gestureDetector.onTouchEvent(event)); mPlacePage.addOnLayoutChangeListener(this); mPlacePage.addClosable(this); mPlacePage.setRoutingModeListener(mRoutingModeListener); - ViewGroup bannerContainer = mPlacePage.findViewById(R.id.banner_container); DefaultAdTracker tracker = new DefaultAdTracker(); CompoundNativeAdLoader loader = Factory.createCompoundLoader(tracker, @@ -577,28 +571,4 @@ public class RichPlacePageController implements PlacePageController, // TODO: only for tests. return !object.getTitle().equals("Петровский Путевой Дворец"); } - - private class PlacePageGestureListener extends GestureDetector.SimpleOnGestureListener - { - @Override - public boolean onSingleTapConfirmed(MotionEvent e) - { - @AnchorBottomSheetBehavior.State - int state = mPlacePageBehavior.getState(); - if (PlacePageUtils.isCollapsedState(state)) - { - mPlacePageBehavior.setState(AnchorBottomSheetBehavior.STATE_ANCHORED); - return true; - } - - if (PlacePageUtils.isAnchoredState(state) || PlacePageUtils.isExpandedState(state)) - { - mPlacePage.resetScroll(); - mPlacePageBehavior.setState(AnchorBottomSheetBehavior.STATE_COLLAPSED); - return true; - } - - return false; - } - } } diff --git a/android/src/com/mapswithme/maps/widget/placepage/SimplePlacePageController.java b/android/src/com/mapswithme/maps/widget/placepage/SimplePlacePageController.java index 60aae66d6f..badb634e48 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/SimplePlacePageController.java +++ b/android/src/com/mapswithme/maps/widget/placepage/SimplePlacePageController.java @@ -1,18 +1,23 @@ package com.mapswithme.maps.widget.placepage; +import android.annotation.SuppressLint; import android.app.Activity; import android.app.Application; import android.os.Bundle; +import android.view.MotionEvent; import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.core.view.GestureDetectorCompat; import com.mapswithme.maps.Framework; import com.mapswithme.maps.R; import com.mapswithme.maps.bookmarks.data.MapObject; import com.mapswithme.util.UiUtils; import com.trafi.anchorbottomsheetbehavior.AnchorBottomSheetBehavior; +import java.util.Objects; + public class SimplePlacePageController implements PlacePageController { @SuppressWarnings("NullableProblems") @@ -33,55 +38,56 @@ public class SimplePlacePageController implements PlacePageController @NonNull private final PlacePageViewRenderer mViewRenderer; @NonNull - private final BottomSheetChangedListener mBottomSheetChangedListener = new BottomSheetChangedListener() - { - @Override - public void onSheetHidden() - { - onHiddenInternal(); - } + private final BottomSheetChangedListener mBottomSheetChangedListener = + new BottomSheetChangedListener() + { + @Override + public void onSheetHidden() + { + onHiddenInternal(); + } - @Override - public void onSheetDirectionIconChange() - { - if (UiUtils.isLandscape(mApplication)) - return; + @Override + public void onSheetDirectionIconChange() + { + if (UiUtils.isLandscape(mApplication)) + return; - PlacePageUtils.setPullDrawable(mSheetBehavior, mSheet, R.id.pull_icon); - } + PlacePageUtils.setPullDrawable(mSheetBehavior, mSheet, R.id.pull_icon); + } - @Override - public void onSheetDetailsOpened() - { - if (UiUtils.isLandscape(mApplication)) - PlacePageUtils.moveViewPortRight(mSheet, mViewPortMinWidth); - } + @Override + public void onSheetDetailsOpened() + { + if (UiUtils.isLandscape(mApplication)) + PlacePageUtils.moveViewPortRight(mSheet, mViewPortMinWidth); + } - @Override - public void onSheetCollapsed() - { - if (UiUtils.isLandscape(mApplication)) - PlacePageUtils.moveViewPortRight(mSheet, mViewPortMinWidth); - } + @Override + public void onSheetCollapsed() + { + if (UiUtils.isLandscape(mApplication)) + PlacePageUtils.moveViewPortRight(mSheet, mViewPortMinWidth); + } - @Override - public void onSheetSliding(int top) - { - if (UiUtils.isLandscape(mApplication)) - return; + @Override + public void onSheetSliding(int top) + { + if (UiUtils.isLandscape(mApplication)) + return; - mSlideListener.onPlacePageSlide(top); - } + mSlideListener.onPlacePageSlide(top); + } - @Override - public void onSheetSlideFinish() - { - if (UiUtils.isLandscape(mApplication)) - return; + @Override + public void onSheetSlideFinish() + { + if (UiUtils.isLandscape(mApplication)) + return; - PlacePageUtils.moveViewportUp(mSheet, mViewportMinHeight); - } - }; + PlacePageUtils.moveViewportUp(mSheet, mViewportMinHeight); + } + }; private final AnchorBottomSheetBehavior.BottomSheetCallback mSheetCallback = new DefaultBottomSheetCallback(mBottomSheetChangedListener); @@ -161,17 +167,21 @@ public class SimplePlacePageController implements PlacePageController } + @SuppressLint("ClickableViewAccessibility") @Override public void initialize(@Nullable Activity activity) { - if (activity == null) - throw new AssertionError("Activity must be non-null"); + Objects.requireNonNull(activity); mApplication = activity.getApplication(); mSheet = activity.findViewById(R.id.elevation_profile); mViewportMinHeight = mSheet.getResources().getDimensionPixelSize(R.dimen.viewport_min_height); mViewPortMinWidth = mSheet.getResources().getDimensionPixelSize(R.dimen.viewport_min_width); mSheetBehavior = AnchorBottomSheetBehavior.from(mSheet); mSheetBehavior.addBottomSheetCallback(mSheetCallback); + boolean isLandscape = UiUtils.isLandscape(mApplication); + GestureDetectorCompat gestureDetector = new GestureDetectorCompat( + activity, new SimplePlacePageGestureListener(mSheetBehavior, isLandscape)); + mSheet.setOnTouchListener((v, event) -> gestureDetector.onTouchEvent(event)); mViewRenderer.initialize(mSheet); } @@ -239,4 +249,28 @@ public class SimplePlacePageController implements PlacePageController // TODO: only for tests. return object.getTitle().equals("Петровский Путевой Дворец"); } + + private static class SimplePlacePageGestureListener extends PlacePageGestureListener + { + private final boolean mLandscape; + + SimplePlacePageGestureListener(@NonNull AnchorBottomSheetBehavior bottomSheetBehavior, + boolean landscape) + { + super(bottomSheetBehavior); + mLandscape = landscape; + } + + @Override + public boolean onSingleTapConfirmed(MotionEvent e) + { + if (mLandscape) + { + getBottomSheetBehavior().setState(AnchorBottomSheetBehavior.STATE_HIDDEN); + return false; + } + + return super.onSingleTapConfirmed(e); + } + } }