diff --git a/android/app/src/main/java/app/organicmaps/MwmActivity.java b/android/app/src/main/java/app/organicmaps/MwmActivity.java index 6289a9108..47a97b0a7 100644 --- a/android/app/src/main/java/app/organicmaps/MwmActivity.java +++ b/android/app/src/main/java/app/organicmaps/MwmActivity.java @@ -767,9 +767,16 @@ public class MwmActivity extends BaseMwmFragmentActivity private void showPositionChooser(ChoosePositionMode mode, boolean isBusiness, boolean applyPosition) { closeFloatingToolbarsAndPanels(false); - int width = mMapFragment.getView().getWidth(); - int height = mMapFragment.getView().getHeight(); - Framework.nativeSetVisibleRect(0, 0, width, height); + if (mMapFragment != null) + { + final View mapView = mMapFragment.getView(); + if (mapView != null) + { + int width = mapView.getWidth(); + int height = mapView.getHeight(); + Framework.nativeSetVisibleRect(0, 0, width, height); + } + } UiUtils.show(mPointChooser); mMapButtonsViewModel.setButtonsHidden(true); ChoosePositionMode.set(mode, isBusiness, applyPosition); diff --git a/android/app/src/main/java/app/organicmaps/car/screens/PlaceScreen.java b/android/app/src/main/java/app/organicmaps/car/screens/PlaceScreen.java index d87109687..ee04d535e 100644 --- a/android/app/src/main/java/app/organicmaps/car/screens/PlaceScreen.java +++ b/android/app/src/main/java/app/organicmaps/car/screens/PlaceScreen.java @@ -287,7 +287,7 @@ public class PlaceScreen extends BaseMapScreen implements OnBackPressedCallback. @Override public void onBuiltRoute() { - Framework.nativeDeactivateMapSelectionCircle(); + Framework.nativeDeactivateMapSelectionCircle(true); mMapObject = mRoutingController.getEndPoint(); invalidate(); } @@ -295,7 +295,7 @@ public class PlaceScreen extends BaseMapScreen implements OnBackPressedCallback. @Override public void onPlanningCancelled() { - Framework.nativeDeactivateMapSelectionCircle(); + Framework.nativeDeactivateMapSelectionCircle(true); } @Override diff --git a/android/app/src/main/java/app/organicmaps/sdk/Framework.java b/android/app/src/main/java/app/organicmaps/sdk/Framework.java index b41f6304b..67a8dbc06 100644 --- a/android/app/src/main/java/app/organicmaps/sdk/Framework.java +++ b/android/app/src/main/java/app/organicmaps/sdk/Framework.java @@ -163,7 +163,7 @@ public class Framework public static native @Nullable String nativeGetParsedBackUrl(); public static native void nativeDeactivatePopup(); - public static native void nativeDeactivateMapSelectionCircle(); + public static native void nativeDeactivateMapSelectionCircle(boolean restoreViewport); public static native String nativeGetDataFileExt(); diff --git a/android/app/src/main/java/app/organicmaps/widget/placepage/PlacePageController.java b/android/app/src/main/java/app/organicmaps/widget/placepage/PlacePageController.java index 660f5dec6..086b6d668 100644 --- a/android/app/src/main/java/app/organicmaps/widget/placepage/PlacePageController.java +++ b/android/app/src/main/java/app/organicmaps/widget/placepage/PlacePageController.java @@ -225,10 +225,9 @@ public class PlacePageController private void onHiddenInternal() { - if (ChoosePositionMode.get() == ChoosePositionMode.None) { + if (ChoosePositionMode.get() == ChoosePositionMode.None) Framework.nativeDeactivatePopup(); - } - Framework.nativeDeactivateMapSelectionCircle(); + Framework.nativeDeactivateMapSelectionCircle(false); PlacePageUtils.updateMapViewport(mCoordinator, mDistanceToTop, mViewportMinHeight); resetPlacePageHeightBounds(); removePlacePageFragments(); diff --git a/android/sdk/src/main/cpp/app/organicmaps/sdk/Framework.cpp b/android/sdk/src/main/cpp/app/organicmaps/sdk/Framework.cpp index bda8a5ca7..b6abfe45f 100644 --- a/android/sdk/src/main/cpp/app/organicmaps/sdk/Framework.cpp +++ b/android/sdk/src/main/cpp/app/organicmaps/sdk/Framework.cpp @@ -621,9 +621,9 @@ void Framework::DeactivatePopup() m_work.DeactivateMapSelection(); } -void Framework::DeactivateMapSelectionCircle() +void Framework::DeactivateMapSelectionCircle(bool restoreViewport) { - m_work.DeactivateMapSelectionCircle(); + m_work.DeactivateMapSelectionCircle(restoreViewport); } /* @@ -1448,9 +1448,9 @@ Java_app_organicmaps_sdk_Framework_nativeDeactivatePopup(JNIEnv * env, jclass) } JNIEXPORT void JNICALL -Java_app_organicmaps_sdk_Framework_nativeDeactivateMapSelectionCircle(JNIEnv * env, jclass) +Java_app_organicmaps_sdk_Framework_nativeDeactivateMapSelectionCircle(JNIEnv * env, jclass, jboolean restoreViewport) { - return g_framework->DeactivateMapSelectionCircle(); + return g_framework->DeactivateMapSelectionCircle(restoreViewport); } JNIEXPORT void JNICALL diff --git a/android/sdk/src/main/cpp/app/organicmaps/sdk/Framework.hpp b/android/sdk/src/main/cpp/app/organicmaps/sdk/Framework.hpp index 13a4c2a36..debc312c8 100644 --- a/android/sdk/src/main/cpp/app/organicmaps/sdk/Framework.hpp +++ b/android/sdk/src/main/cpp/app/organicmaps/sdk/Framework.hpp @@ -171,7 +171,7 @@ namespace android void ExecuteMapApiRequest(); void DeactivatePopup(); - void DeactivateMapSelectionCircle(); + void DeactivateMapSelectionCircle(bool restoreViewport); // std::string GetOutdatedCountriesString(); diff --git a/drape_frontend/drape_engine.cpp b/drape_frontend/drape_engine.cpp index b5c57af45..ba73ec1b8 100644 --- a/drape_frontend/drape_engine.cpp +++ b/drape_frontend/drape_engine.cpp @@ -562,10 +562,10 @@ void DrapeEngine::SelectObject(SelectionShape::ESelectedObject obj, m2::PointD c MessagePriority::Normal); } -void DrapeEngine::DeselectObject() +void DrapeEngine::DeselectObject(bool restoreViewport) { m_threadCommutator->PostMessage(ThreadsCommutator::RenderThread, - make_unique_dp(SelectObjectMessage::DismissTag()), + make_unique_dp(SelectObjectMessage::DismissTag(), restoreViewport), MessagePriority::Normal); } diff --git a/drape_frontend/drape_engine.hpp b/drape_frontend/drape_engine.hpp index c84300319..2990a0c46 100644 --- a/drape_frontend/drape_engine.hpp +++ b/drape_frontend/drape_engine.hpp @@ -173,7 +173,7 @@ public: void SelectObject(SelectionShape::ESelectedObject obj, m2::PointD const & pt, FeatureID const & featureID, bool isAnim, bool isGeometrySelectionAllowed, bool isSelectionShapeVisible); - void DeselectObject(); + void DeselectObject(bool restoreViewport); dp::DrapeID AddSubroute(SubrouteConstPtr subroute); void RemoveSubroute(dp::DrapeID subrouteId, bool deactivateFollowing); diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index 35f612c86..58f573719 100755 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -1332,7 +1332,7 @@ void FrontendRenderer::ProcessSelection(ref_ptr msg) if (msg->IsDismiss()) { m_selectionShape->Hide(); - if (!m_myPositionController->IsModeChangeViewport() && m_selectionTrackInfo) + if (msg->ShouldRestoreViewport() && !m_myPositionController->IsModeChangeViewport() && m_selectionTrackInfo) { AddUserEvent(make_unique_dp(m_selectionTrackInfo->m_startRect, true /* isAnim */, false /* fitInViewport */, diff --git a/drape_frontend/message_subclasses.hpp b/drape_frontend/message_subclasses.hpp index e93f49627..3beff5c95 100644 --- a/drape_frontend/message_subclasses.hpp +++ b/drape_frontend/message_subclasses.hpp @@ -534,13 +534,14 @@ class SelectObjectMessage : public Message public: struct DismissTag {}; - explicit SelectObjectMessage(DismissTag) + explicit SelectObjectMessage(DismissTag, bool restoreViewport) : m_selected(SelectionShape::OBJECT_EMPTY) , m_glbPoint(m2::PointD::Zero()) , m_isAnim(false) , m_isDismiss(true) , m_isGeometrySelectionAllowed(false) , m_isSelectionShapeVisible(false) + , m_restoreViewport(restoreViewport) {} SelectObjectMessage(SelectionShape::ESelectedObject selectedObject, m2::PointD const & glbPoint, @@ -565,6 +566,7 @@ public: bool IsDismiss() const { return m_isDismiss; } bool IsGeometrySelectionAllowed() const { return m_isGeometrySelectionAllowed; } bool IsSelectionShapeVisible() const { return m_isSelectionShapeVisible; } + bool ShouldRestoreViewport() const { return m_restoreViewport; } private: SelectionShape::ESelectedObject m_selected; @@ -574,6 +576,7 @@ private: bool m_isDismiss; bool m_isGeometrySelectionAllowed; bool m_isSelectionShapeVisible; + bool m_restoreViewport; }; class CheckSelectionGeometryMessage : public Message diff --git a/map/framework.cpp b/map/framework.cpp index 0804db02a..978a6c671 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -2057,14 +2057,14 @@ void Framework::DeactivateMapSelection() m_currentPlacePageInfo = {}; if (m_drapeEngine != nullptr) - m_drapeEngine->DeselectObject(); + m_drapeEngine->DeselectObject(true); } } -void Framework::DeactivateMapSelectionCircle() +void Framework::DeactivateMapSelectionCircle(bool restoreViewport) { if (m_drapeEngine != nullptr) - m_drapeEngine->DeselectObject(); + m_drapeEngine->DeselectObject(restoreViewport); } void Framework::SwitchFullScreen() diff --git a/map/framework.hpp b/map/framework.hpp index 995698ba6..f5a32cb70 100644 --- a/map/framework.hpp +++ b/map/framework.hpp @@ -310,7 +310,7 @@ private: public: void DeactivateMapSelection(); - void DeactivateMapSelectionCircle(); + void DeactivateMapSelectionCircle(bool restoreViewport); void SwitchFullScreen(); /// Used to "refresh" UI in some cases (e.g. feature editing). void UpdatePlacePageInfoForCurrentSelection(