diff --git a/android/app/src/main/cpp/app/organicmaps/bookmarks/data/BookmarkManager.cpp b/android/app/src/main/cpp/app/organicmaps/bookmarks/data/BookmarkManager.cpp index 249a3cb0eb..caa4c7bcfe 100644 --- a/android/app/src/main/cpp/app/organicmaps/bookmarks/data/BookmarkManager.cpp +++ b/android/app/src/main/cpp/app/organicmaps/bookmarks/data/BookmarkManager.cpp @@ -355,9 +355,7 @@ Java_app_organicmaps_bookmarks_data_BookmarkManager_nativeDeleteTrack( frm()->GetBookmarkManager().GetEditSession().DeleteTrack(static_cast(trkId)); } -JNIEXPORT jobject JNICALL -Java_app_organicmaps_bookmarks_data_BookmarkManager_nativeAddBookmarkToLastEditedCategory( - JNIEnv * env, jobject, double lat, double lon) +jobject AddBookmark(JNIEnv * env, double lat, double lon, long categoryId) { if (!frm()->HasPlacePageInfo()) return nullptr; @@ -370,13 +368,12 @@ Java_app_organicmaps_bookmarks_data_BookmarkManager_nativeAddBookmarkToLastEdite bmData.m_name = info.FormatNewBookmarkName(); bmData.m_color.m_predefinedColor = frm()->LastEditedBMColor(); bmData.m_point = mercator::FromLatLon(lat, lon); - auto const lastEditedCategory = frm()->LastEditedBMCategory(); if (info.IsFeature()) SaveFeatureTypes(info.GetTypes(), bmData); auto const * createdBookmark = bmMng.GetEditSession().CreateBookmark(std::move(bmData), - lastEditedCategory); + categoryId); auto buildInfo = info.GetBuildInfo(); buildInfo.m_match = place_page::BuildInfo::Match::Everything; @@ -385,6 +382,23 @@ Java_app_organicmaps_bookmarks_data_BookmarkManager_nativeAddBookmarkToLastEdite return usermark_helper::CreateMapObject(env, g_framework->GetPlacePageInfo()); } +JNIEXPORT jobject JNICALL +Java_app_organicmaps_bookmarks_data_BookmarkManager_nativeAddBookmarkToLastEditedCategory( + JNIEnv * env, jobject, double lat, double lon) +{ + if (!frm()->HasPlacePageInfo()) + return nullptr; + + auto const activeCategory = frm()->LastEditedBMCategory(); + return AddBookmark(env, lat, lon, activeCategory); +} + +JNIEXPORT jobject JNICALL +Java_app_organicmaps_bookmarks_data_BookmarkManager_nativeAddBookmark( + JNIEnv * env, jobject, double lat, double lon, long categoryId) +{ + return AddBookmark(env, lat, lon, categoryId); +} JNIEXPORT jlong JNICALL Java_app_organicmaps_bookmarks_data_BookmarkManager_nativeGetLastEditedCategory( diff --git a/android/app/src/main/java/app/organicmaps/bookmarks/data/BookmarkManager.java b/android/app/src/main/java/app/organicmaps/bookmarks/data/BookmarkManager.java index 79bdbeb25e..d23772c97a 100644 --- a/android/app/src/main/java/app/organicmaps/bookmarks/data/BookmarkManager.java +++ b/android/app/src/main/java/app/organicmaps/bookmarks/data/BookmarkManager.java @@ -139,6 +139,12 @@ public enum BookmarkManager return nativeAddBookmarkToLastEditedCategory(lat, lon); } + @Nullable + public Bookmark addNewBookmark(double lat, double lon, long cotegoryId) + { + return nativeAddBookmark(lat, lon, cotegoryId); + } + public void addLoadingListener(@NonNull BookmarksLoadingListener listener) { mListeners.add(listener); @@ -816,6 +822,9 @@ public enum BookmarkManager @Nullable private native Bookmark nativeAddBookmarkToLastEditedCategory(double lat, double lon); + @Nullable + private native Bookmark nativeAddBookmark(double lat, double lon, long catedoryId); + @Icon.PredefinedColor private native int nativeGetLastEditedColor(); diff --git a/android/app/src/main/java/app/organicmaps/util/bottomsheet/MenuBottomSheetItem.java b/android/app/src/main/java/app/organicmaps/util/bottomsheet/MenuBottomSheetItem.java index 6d124bcfc7..860b64d7f4 100644 --- a/android/app/src/main/java/app/organicmaps/util/bottomsheet/MenuBottomSheetItem.java +++ b/android/app/src/main/java/app/organicmaps/util/bottomsheet/MenuBottomSheetItem.java @@ -6,6 +6,7 @@ public class MenuBottomSheetItem public final int iconRes; public final int badgeCount; public final OnClickListener onClickListener; + public final OnLongClickListener onLongClickListener; public MenuBottomSheetItem(int titleRes, int iconRes, OnClickListener onClickListener) { @@ -13,6 +14,16 @@ public class MenuBottomSheetItem this.iconRes = iconRes; this.badgeCount = 0; this.onClickListener = onClickListener; + this.onLongClickListener = () -> {}; + } + + public MenuBottomSheetItem(int titleRes, int iconRes, OnClickListener onClickListener, OnLongClickListener onLongClickListener) + { + this.titleRes = titleRes; + this.iconRes = iconRes; + this.badgeCount = 0; + this.onClickListener = onClickListener; + this.onLongClickListener = onLongClickListener; } public MenuBottomSheetItem(int titleRes, int iconRes, int badgeCount, OnClickListener onClickListener) @@ -21,10 +32,25 @@ public class MenuBottomSheetItem this.iconRes = iconRes; this.badgeCount = badgeCount; this.onClickListener = onClickListener; + this.onLongClickListener = () -> {}; + } + + public MenuBottomSheetItem(int titleRes, int iconRes, int badgeCount, OnClickListener onClickListener, OnLongClickListener onLongClickListener) + { + this.titleRes = titleRes; + this.iconRes = iconRes; + this.badgeCount = badgeCount; + this.onClickListener = onClickListener; + this.onLongClickListener = onLongClickListener; } public interface OnClickListener { void onClick(); } + + public interface OnLongClickListener + { + void onLongClick(); + } } diff --git a/android/app/src/main/java/app/organicmaps/widget/placepage/PlacePageButtons.java b/android/app/src/main/java/app/organicmaps/widget/placepage/PlacePageButtons.java index 50a5610e6e..30549cfda3 100644 --- a/android/app/src/main/java/app/organicmaps/widget/placepage/PlacePageButtons.java +++ b/android/app/src/main/java/app/organicmaps/widget/placepage/PlacePageButtons.java @@ -28,6 +28,7 @@ public final class PlacePageButtons extends Fragment implements Observer { + mItemLongClickListener.onPlacePageButtonLongClick(current.getType()); + return true; + }); return parent; } @@ -149,4 +155,9 @@ public final class PlacePageButtons extends Fragment implements Observer { private static final String TAG = PlacePageController.class.getSimpleName(); private static final String PLACE_PAGE_BUTTONS_FRAGMENT_TAG = "PLACE_PAGE_BUTTONS"; private static final String PLACE_PAGE_FRAGMENT_TAG = "PLACE_PAGE"; + private static final String PLACEPAGE_CATEGORY_SELECTOR_BOTTOM_SHEET = "PLACEPAGE_CATEGORY_SELECTOR_BOTTOM_SHEET"; + private static final float PREVIEW_PLUS_RATIO = 0.45f; private BottomSheetBehavior mPlacePageBehavior; @@ -71,6 +78,8 @@ public class PlacePageController extends Fragment implements private MapObject mPreviousMapObject; private WindowInsetsCompat mCurrentWindowInsets; + private ChooseBookmarkCategoryFragment chooseBookmarkCategoryFragment; + private boolean mShouldCollapse; private int mDistanceToTop; @@ -113,6 +122,20 @@ public class PlacePageController extends Fragment implements public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + + final FragmentManager manager = getParentFragmentManager(); + final FragmentFactory factory = manager.getFragmentFactory(); + String className = ChooseBookmarkCategoryFragment.class.getName(); + final Bundle args = new Bundle(); + + args.putInt(ChooseBookmarkCategoryFragment.CATEGORY_POSITION, 0); + chooseBookmarkCategoryFragment = + (ChooseBookmarkCategoryFragment) factory.instantiate(getContext().getClassLoader(), className); + chooseBookmarkCategoryFragment.onDestroyView(); + chooseBookmarkCategoryFragment.setArguments(args); + + + final FragmentActivity activity = requireActivity(); mPlacePageRouteSettingsListener = (MwmActivity) activity; @@ -193,8 +216,8 @@ public class PlacePageController extends Fragment implements { final PlacePageButton bsItem = PlacePageButtonFactory.createButton(currentItems.get(i), requireActivity()); items.add(new MenuBottomSheetItem( - bsItem.getTitle(), - bsItem.getIcon(), + bsItem.getTitle(), + bsItem.getIcon(), () -> onPlacePageButtonClick(bsItem.getType()) )); } @@ -371,6 +394,15 @@ public class PlacePageController extends Fragment implements } } + @Override + public void onPlacePageButtonLongClick(PlacePageButtons.ButtonType item) + { + switch (item) + { + case BOOKMARK_SAVE -> onBookmarkBtnLongClicked(); + } + } + private void onBookmarkBtnClicked() { // mMapObject is set to null when the place page closes @@ -384,6 +416,11 @@ public class PlacePageController extends Fragment implements BookmarkManager.INSTANCE.addNewBookmark(mMapObject.getLat(), mMapObject.getLon()); } + private void onBookmarkBtnLongClicked() + { + chooseBookmarkCategoryFragment.show(getChildFragmentManager(),PLACEPAGE_CATEGORY_SELECTOR_BOTTOM_SHEET); + } + private void onBackBtnClicked() { if (mMapObject == null) @@ -619,6 +656,11 @@ public class PlacePageController extends Fragment implements mViewModel.getPlacePageDistanceToTop().removeObserver(mPlacePageDistanceToTopObserver); } + @Override + public void onCategoryChanged(@NonNull BookmarkCategory newCategory) { + BookmarkManager.INSTANCE.addNewBookmark(mMapObject.getLat(), mMapObject.getLon(), newCategory.getId()); + } + public interface PlacePageRouteSettingsListener { void onPlacePageRequestToggleRouteSettings(@NonNull RoadType roadType);