From 5963ece353abfed7998fe4f4240406d3733f7685 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: Thu, 31 Jan 2019 12:44:37 +0300 Subject: [PATCH] [android] Place page saving during configuration change --- .../src/com/mapswithme/maps/MwmActivity.java | 7 +- .../BottomSheetPlacePageController.java | 79 ++++++++++++++----- .../widget/placepage/PlacePageController.java | 4 +- .../maps/widget/placepage/PlacePageView.java | 13 --- 4 files changed, 66 insertions(+), 37 deletions(-) diff --git a/android/src/com/mapswithme/maps/MwmActivity.java b/android/src/com/mapswithme/maps/MwmActivity.java index e67af6589f..e149c23678 100644 --- a/android/src/com/mapswithme/maps/MwmActivity.java +++ b/android/src/com/mapswithme/maps/MwmActivity.java @@ -697,7 +697,6 @@ public class MwmActivity extends BaseMwmFragmentActivity public boolean closePlacePage() { mPlacePageController.close(); - Framework.nativeDeactivatePopup(); return true; } @@ -752,8 +751,7 @@ public class MwmActivity extends BaseMwmFragmentActivity RoutingController.get().prepare(canUseMyPositionAsStart, endPoint); // TODO: check for tablet. - /*if (mPlacePage.isDocked() || !mPlacePage.isFloating()) - closePlacePage();*/ + closePlacePage(); }); } @@ -814,6 +812,7 @@ public class MwmActivity extends BaseMwmFragmentActivity @Override protected void onSaveInstanceState(Bundle outState) { + mPlacePageController.onSave(outState); if (!mIsTabletLayout && RoutingController.get().isPlanning()) mRoutingPlanInplaceController.onSaveState(outState); @@ -852,7 +851,7 @@ public class MwmActivity extends BaseMwmFragmentActivity protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); - + mPlacePageController.onRestore(savedInstanceState); if (mIsTabletLayout) { RoutingPlanFragment fragment = (RoutingPlanFragment) getFragment(RoutingPlanFragment.class); diff --git a/android/src/com/mapswithme/maps/widget/placepage/BottomSheetPlacePageController.java b/android/src/com/mapswithme/maps/widget/placepage/BottomSheetPlacePageController.java index 9eca5d6076..e7cbf7d6df 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/BottomSheetPlacePageController.java +++ b/android/src/com/mapswithme/maps/widget/placepage/BottomSheetPlacePageController.java @@ -5,6 +5,7 @@ import android.animation.ObjectAnimator; import android.app.Activity; import android.graphics.Rect; import android.location.Location; +import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v7.widget.Toolbar; import android.view.View; @@ -28,6 +29,7 @@ public class BottomSheetPlacePageController implements PlacePageController, Loca 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(); + private static final String EXTRA_MAP_OBJECT = "extra_map_object"; @NonNull private final Activity mActivity; @SuppressWarnings("NullableProblems") @@ -64,6 +66,7 @@ public class BottomSheetPlacePageController implements PlacePageController, Loca if (newState == AnchorBottomSheetBehavior.STATE_HIDDEN) { + Framework.nativeDeactivatePopup(); hideButtons(); return; } @@ -130,20 +133,20 @@ public class BottomSheetPlacePageController implements PlacePageController, Loca private void openPlacePage() { mPlacePage.post(() -> { - collapsePlacePage(); + setPeekHeight(); + mPlacePageBehavior.setState(AnchorBottomSheetBehavior.STATE_COLLAPSED); setPlacePageAnchor(); }); } - private void collapsePlacePage() + private void setPeekHeight() { 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(); @@ -226,33 +229,42 @@ public class BottomSheetPlacePageController implements PlacePageController, Loca oldTop, int oldRight, int oldBottom) { LOGGER.d(TAG, "Layout changed, current state = " + toString(mPlacePageBehavior.getState())); + if (mLastPeekHeight == 0) + { + LOGGER.d(TAG, "Layout changed - ignoring, peek height not calculated yet"); + return; + } + + updateViewPortRect(); + if (mPlacePageBehavior.getState() != AnchorBottomSheetBehavior.STATE_COLLAPSED) return; if (getPeekHeight() == mLastPeekHeight) return; - openPlacePage(); + mPlacePage.post(this::setPeekHeight); } private void updateViewPortRect() { - View coordinatorLayout = (ViewGroup) mPlacePage.getParent(); - int viewPortWidth = coordinatorLayout.getWidth(); - int viewPortHeight = coordinatorLayout.getHeight(); - Rect sheetRect = new Rect(); - mPlacePage.getGlobalVisibleRect(sheetRect); - if (sheetRect.top < mViewportMinHeight) - return; + mPlacePage.post(() -> { + View coordinatorLayout = (ViewGroup) mPlacePage.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) - { + if (sheetRect.top >= viewPortHeight) + { + Framework.nativeSetVisibleRect(0, 0, viewPortWidth, viewPortHeight); + return; + } + viewPortHeight -= sheetRect.height(); 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 @@ -276,4 +288,33 @@ public class BottomSheetPlacePageController implements PlacePageController, Loca throw new AssertionError("Unsupported state detected: " + state); } } + + @Override + public void onSave(@NonNull Bundle outState) + { + outState.putParcelable(EXTRA_MAP_OBJECT, mPlacePage.getMapObject()); + } + + @Override + public void onRestore(@NonNull Bundle inState) + { + if (mPlacePageBehavior.getState() == AnchorBottomSheetBehavior.STATE_HIDDEN) + return; + + MapObject object = inState.getParcelable(EXTRA_MAP_OBJECT); + if (object == null) + return; + + mPlacePage.setMapObject(object, true, this::restorePlacePage); + mToolbar.setTitle(object.getTitle()); + } + + private void restorePlacePage() + { + mPlacePage.post(() -> { + setPeekHeight(); + setPlacePageAnchor(); + showButtons(); + }); + } } diff --git a/android/src/com/mapswithme/maps/widget/placepage/PlacePageController.java b/android/src/com/mapswithme/maps/widget/placepage/PlacePageController.java index 89b3915eee..8e2ea46cad 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/PlacePageController.java +++ b/android/src/com/mapswithme/maps/widget/placepage/PlacePageController.java @@ -1,11 +1,13 @@ package com.mapswithme.maps.widget.placepage; +import android.os.Bundle; import android.support.annotation.NonNull; import com.mapswithme.maps.base.Initializable; +import com.mapswithme.maps.base.Savable; import com.mapswithme.maps.bookmarks.data.MapObject; -public interface PlacePageController extends Initializable +public interface PlacePageController extends Initializable, Savable { void openFor(@NonNull MapObject object); void close(); diff --git a/android/src/com/mapswithme/maps/widget/placepage/PlacePageView.java b/android/src/com/mapswithme/maps/widget/placepage/PlacePageView.java index e4392483b7..b7fb1f1467 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/PlacePageView.java +++ b/android/src/com/mapswithme/maps/widget/placepage/PlacePageView.java @@ -993,18 +993,6 @@ public class PlacePageView extends NestedScrollView attrArray.recycle(); } - public void restore() - { - if (mMapObject == null) - { - // FIXME query map object again - LOGGER.e(TAG, "A place page cannot be restored, mMapObject is null!"); - return; - } - - setMapObject(mMapObject, true, null); - } - public boolean isDocked() { return mIsDocked; @@ -1760,7 +1748,6 @@ public class PlacePageView extends NestedScrollView RoutingController.get().prepare(LocationHelper.INSTANCE.getMyPosition(), mMapObject, Framework.ROUTER_TYPE_TAXI); hide(); - Framework.nativeDeactivatePopup(); if (mMapObject != null) { List types = mMapObject.getReachableByTaxiTypes();