diff --git a/android/res/values/dimens.xml b/android/res/values/dimens.xml
index 4a2eb8ab0b..8b5bf79d8d 100644
--- a/android/res/values/dimens.xml
+++ b/android/res/values/dimens.xml
@@ -73,6 +73,7 @@
40dp
20dp
2dp
+ 100dp
48dp
diff --git a/android/src/com/mapswithme/maps/widget/placepage/BottomSheetPlacePageController.java b/android/src/com/mapswithme/maps/widget/placepage/BottomSheetPlacePageController.java
index 345355114d..31c6259893 100644
--- a/android/src/com/mapswithme/maps/widget/placepage/BottomSheetPlacePageController.java
+++ b/android/src/com/mapswithme/maps/widget/placepage/BottomSheetPlacePageController.java
@@ -3,6 +3,7 @@ package com.mapswithme.maps.widget.placepage;
import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.app.Activity;
+import android.graphics.Rect;
import android.location.Location;
import android.support.annotation.NonNull;
import android.support.design.widget.BottomSheetBehavior;
@@ -47,8 +48,8 @@ public class BottomSheetPlacePageController implements PlacePageController, Loca
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState)
{
- LOGGER.d(TAG, "State changed, new state = "
- + BottomSheetPlacePageController.toString(newState));
+ LOGGER.d(TAG, "State change, new = " + BottomSheetPlacePageController.toString(newState)
+ + " sheet height = " + mPpSheet.getHeight());
if (newState == BottomSheetBehavior.STATE_SETTLING
|| newState == BottomSheetBehavior.STATE_DRAGGING)
return;
@@ -65,11 +66,15 @@ public class BottomSheetPlacePageController implements PlacePageController, Loca
@Override
public void onSlide(@NonNull View bottomSheet, float slideOffset)
{
- LOGGER.v(TAG, "Sliding: " + slideOffset);
+ updateViewPortRect();
}
};
private int mLastPeekHeight;
+ @SuppressWarnings("NullableProblems")
+ @NonNull
+ private View mPpSheet;
+ private int mViewportMinHeight;
public BottomSheetPlacePageController(@NonNull Activity activity)
{
@@ -79,11 +84,12 @@ public class BottomSheetPlacePageController implements PlacePageController, Loca
@Override
public void initialize()
{
- View ppSheet = mActivity.findViewById(R.id.pp_bottom_sheet);
- mPpSheetBehavior = BottomSheetBehavior.from(ppSheet);
+ mViewportMinHeight = mActivity.getResources().getDimensionPixelSize(R.dimen.viewport_min_height);
+ mPpSheet = mActivity.findViewById(R.id.pp_bottom_sheet);
+ mPpSheetBehavior = BottomSheetBehavior.from(mPpSheet);
mPpSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
mPpSheetBehavior.setBottomSheetCallback(mSheetCallback);
- mPlacePage = ppSheet.findViewById(R.id.placepage);
+ mPlacePage = mPpSheet.findViewById(R.id.placepage);
mPlacePage.addOnLayoutChangeListener(this);
mButtonsLayout = mActivity.findViewById(R.id.pp_buttons_layout);
ViewGroup buttons = mButtonsLayout.findViewById(R.id.pp_buttons);
@@ -108,19 +114,26 @@ public class BottomSheetPlacePageController implements PlacePageController, Loca
return;
}
- int peekHeight = mPlacePage.getPreviewHeight() + mButtonsLayout.getHeight();
- LOGGER.d(TAG, "Initial peek height = " + peekHeight + " for " + object.getFeatureId());
- openBottomSheet(peekHeight);
+ openBottomSheet();
});
mPlacePageTracker.setMapObject(object);
Framework.logLocalAdsEvent(Framework.LocalAdsEventType.LOCAL_ADS_EVENT_OPEN_INFO, object);
}
- private void openBottomSheet(int peekHeight)
+ private void openBottomSheet()
{
- mLastPeekHeight = peekHeight;
- mPpSheetBehavior.setPeekHeight(mLastPeekHeight);
- mPpSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
+ mPpSheet.post(() -> {
+ int peekHeight = getPeekHeight();
+ LOGGER.d(TAG, "Peek height = " + peekHeight);
+ mLastPeekHeight = peekHeight;
+ mPpSheetBehavior.setPeekHeight(mLastPeekHeight);
+ mPpSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
+ });
+ }
+
+ private int getPeekHeight()
+ {
+ return mPlacePage.getPreviewHeight() + mButtonsLayout.getHeight();
}
@Override
@@ -197,10 +210,30 @@ public class BottomSheetPlacePageController implements PlacePageController, Loca
if (mPpSheetBehavior.getState() != BottomSheetBehavior.STATE_COLLAPSED)
return;
- int peekHeight = mPlacePage.getPreviewHeight() + mButtonsLayout.getHeight();
- LOGGER.d(TAG, "New peek height = " + peekHeight);
- if (peekHeight != mLastPeekHeight)
- openBottomSheet(peekHeight);
+ if (getPeekHeight() == mLastPeekHeight)
+ return;
+
+ openBottomSheet();
+ }
+
+ private void updateViewPortRect()
+ {
+ View coordinatorLayout = (ViewGroup) mPpSheet.getParent();
+ int viewPortWidth = coordinatorLayout.getWidth();
+ int viewPortHeight = coordinatorLayout.getHeight();
+ Rect sheetRect = new Rect();
+ mPlacePage.getGlobalVisibleRect(sheetRect);
+ if (sheetRect.top < mViewportMinHeight)
+ return;
+
+ if (sheetRect.top >= viewPortHeight)
+ {
+ Framework.nativeSetVisibleRect(0, 0, viewPortWidth, viewPortHeight);
+ return;
+ }
+ viewPortHeight -= sheetRect.height();
+ LOGGER.d(TAG, "Viewport room: 0, 0, " + viewPortWidth + ", " + viewPortHeight);
+ Framework.nativeSetVisibleRect(0, 0, viewPortWidth, viewPortHeight);
}
@NonNull