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..8913215044 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,32 @@ 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 jstring JNICALL +Java_app_organicmaps_bookmarks_data_BookmarkManager_nativeGetNewBookmarkName( + JNIEnv * env, jobject) +{ + place_page::Info const & info = g_framework->GetPlacePageInfo(); + std::string newName = GetPreferredBookmarkStr(info.FormatNewBookmarkName()); + return jni::ToJavaString(env,newName); +} 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..4646bfac76 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,24 @@ public enum BookmarkManager return nativeAddBookmarkToLastEditedCategory(lat, lon); } + @Nullable + public Bookmark addNewBookmark(double lat, double lon, long cotegoryId) + { + return nativeAddBookmark(lat, lon, cotegoryId); + } + + @Nullable + public long getLastEditedCategory() + { + return nativeGetLastEditedCategory(); + } + + @Nullable + public String getNewBookmarkName() + { + return nativeGetNewBookmarkName(); + } + public void addLoadingListener(@NonNull BookmarksLoadingListener listener) { mListeners.add(listener); @@ -412,6 +430,10 @@ public enum BookmarkManager @Icon.PredefinedColor public int getLastEditedColor() { return nativeGetLastEditedColor(); } + public Icon getIconByColor(int colorId) { + return ICONS.stream().filter(icon -> icon.getColor()==colorId).findFirst().orElse(null); + } + @MainThread public void loadBookmarksFile(@NonNull String path, boolean isTemporaryFile) { @@ -816,6 +838,15 @@ public enum BookmarkManager @Nullable private native Bookmark nativeAddBookmarkToLastEditedCategory(double lat, double lon); + @Nullable + private native Bookmark nativeAddBookmark(double lat, double lon, long catedoryId); + + @Nullable + private native String nativeGetNewBookmarkName(); + + @Nullable + private native long nativeGetLastEditedCategory(); + @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/EditBookmarkFragment.java b/android/app/src/main/java/app/organicmaps/widget/placepage/EditBookmarkFragment.java index afbbca39ef..7ce59a01af 100644 --- a/android/app/src/main/java/app/organicmaps/widget/placepage/EditBookmarkFragment.java +++ b/android/app/src/main/java/app/organicmaps/widget/placepage/EditBookmarkFragment.java @@ -25,6 +25,7 @@ import app.organicmaps.R; import app.organicmaps.base.BaseMwmDialogFragment; import app.organicmaps.bookmarks.ChooseBookmarkCategoryFragment; import app.organicmaps.bookmarks.ChooseBookmarkCategoryFragment.Listener; +import app.organicmaps.bookmarks.data.Bookmark; import app.organicmaps.bookmarks.data.BookmarkCategory; import app.organicmaps.bookmarks.data.BookmarkInfo; import app.organicmaps.bookmarks.data.BookmarkManager; @@ -41,7 +42,8 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View. { public static final String EXTRA_CATEGORY_ID = "CategoryId"; public static final String EXTRA_BOOKMARK_ID = "BookmarkId"; - + public static final String EXTRA_BOOKMARK_LAT = "BookmarkLat"; + public static final String EXTRA_BOOKMARK_LON = "BookmarkLon"; private TextInputEditText mEtDescription; private TextInputEditText mEtName; @NonNull @@ -68,6 +70,23 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View. final Bundle args = new Bundle(); args.putLong(EXTRA_CATEGORY_ID, categoryId); args.putLong(EXTRA_BOOKMARK_ID, bookmarkId); + showView(args, context, manager, listener); + } + + public static void createBookmark(double lat, double lon, @NonNull Context context, + @NonNull FragmentManager manager, + @Nullable EditBookmarkListener listener) + { + final Bundle args = new Bundle(); + args.putDouble(EXTRA_BOOKMARK_LAT, lat); + args.putDouble(EXTRA_BOOKMARK_LON, lon); + showView(args, context, manager, listener); + } + + public static void showView(Bundle args, @NonNull Context context, + @NonNull FragmentManager manager, + @Nullable EditBookmarkListener listener) + { String name = EditBookmarkFragment.class.getName(); final FragmentFactory factory = manager.getFragmentFactory(); final EditBookmarkFragment fragment = (EditBookmarkFragment) factory.instantiate(context.getClassLoader(), name); @@ -91,16 +110,8 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View. return inflater.inflate(R.layout.fragment_edit_bookmark, container, false); } - @Override - public void onViewCreated(@NonNull View view, Bundle savedInstanceState) + private void InitViewElements(@NonNull View view) { - final Bundle args = getArguments(); - long categoryId = args.getLong(EXTRA_CATEGORY_ID); - mBookmarkCategory = BookmarkManager.INSTANCE.getCategoryById(categoryId); - long bookmarkId = args.getLong(EXTRA_BOOKMARK_ID); - mBookmark = BookmarkManager.INSTANCE.getBookmarkInfo(bookmarkId); - if (mBookmark != null) - mIcon = mBookmark.getIcon(); mEtName = view.findViewById(R.id.et__bookmark_name); clearNameBtn = view.findViewById(R.id.edit_bookmark_name_input); clearNameBtn.setEndIconOnClickListener(v -> clearAndFocus(mEtName)); @@ -123,6 +134,36 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View. mTvBookmarkGroup.setOnClickListener(this); mIvColor = view.findViewById(R.id.iv__bookmark_color); mIvColor.setOnClickListener(this); + + if (mBookmark == null) { + int lastUsedColor = BookmarkManager.INSTANCE.getLastEditedColor(); + mIcon = BookmarkManager.INSTANCE.getIconByColor(lastUsedColor); + } + else { + mIcon = mBookmark.getIcon(); + } + } + + @Override + public void onViewCreated(@NonNull View view, Bundle savedInstanceState) + { + final Bundle args = getArguments(); + + long categoryId = -1; + if (args.containsKey(EXTRA_CATEGORY_ID)) + categoryId = args.getLong(EXTRA_CATEGORY_ID); + else + categoryId = BookmarkManager.INSTANCE.getLastEditedCategory(); + + mBookmarkCategory = BookmarkManager.INSTANCE.getCategoryById(categoryId); + + if (args.containsKey(EXTRA_BOOKMARK_ID)) + { + long bookmarkId = args.getLong(EXTRA_BOOKMARK_ID); + mBookmark = BookmarkManager.INSTANCE.getBookmarkInfo(bookmarkId); + } + + InitViewElements(view); refreshBookmark(); initToolbar(view); } @@ -158,6 +199,14 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View. } private void saveBookmark() + { + if (mBookmark == null) + createBookmark(); + else + updateBookmark(); + } + + private void updateBookmark() { if (mBookmark == null) { @@ -168,13 +217,30 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View. if (movedFromCategory) BookmarkManager.INSTANCE.notifyCategoryChanging(mBookmark, mBookmarkCategory.getId()); BookmarkManager.INSTANCE.notifyParametersUpdating(mBookmark, mEtName.getText().toString(), - mIcon, mEtDescription.getText().toString()); + mIcon, mEtDescription.getText().toString()); if (mListener != null) mListener.onBookmarkSaved(mBookmark.getBookmarkId(), movedFromCategory); dismiss(); } + private void createBookmark() + { + if (mBookmarkCategory == null) + return; + + final Bundle args = getArguments(); + double lat = args.getDouble(EXTRA_BOOKMARK_LAT); + double lon = args.getDouble(EXTRA_BOOKMARK_LON); + + Bookmark bookmark = BookmarkManager.INSTANCE.addNewBookmark(lat,lon,mBookmarkCategory.getId()); + BookmarkManager.INSTANCE.setBookmarkParams(bookmark.getBookmarkId(), mEtName.getText().toString(), mIcon.getColor(), mEtDescription.getText().toString()); + + if (mListener != null) + mListener.onBookmarkSaved(bookmark.getBookmarkId(), false); + dismiss(); + } + @Override public void onClick(View v) { @@ -187,9 +253,6 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View. private void selectBookmarkSet() { - if (mBookmark == null) - return; - final Bundle args = new Bundle(); final List categories = BookmarkManager.INSTANCE.getCategories(); final int index = categories.indexOf(mBookmarkCategory); @@ -253,16 +316,22 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View. private void refreshBookmark() { if (mBookmark == null) - return; - - if (TextUtils.isEmpty(mEtName.getText())) - mEtName.setText(mBookmark.getName()); - - if (TextUtils.isEmpty(mEtDescription.getText())) { - mEtDescription.setText( - BookmarkManager.INSTANCE.getBookmarkDescription(mBookmark.getBookmarkId())); + if (TextUtils.isEmpty(mEtName.getText())) + mEtName.setText(BookmarkManager.INSTANCE.getNewBookmarkName()); } + else + { + if (TextUtils.isEmpty(mEtName.getText())) + mEtName.setText(mBookmark.getName()); + + if (TextUtils.isEmpty(mEtDescription.getText())) + { + mEtDescription.setText( + BookmarkManager.INSTANCE.getBookmarkDescription(mBookmark.getBookmarkId())); + } + } + refreshCategory(); refreshColorMarker(); } 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; @@ -113,6 +119,7 @@ public class PlacePageController extends Fragment implements public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + final FragmentActivity activity = requireActivity(); mPlacePageRouteSettingsListener = (MwmActivity) activity; @@ -193,9 +200,10 @@ public class PlacePageController extends Fragment implements { final PlacePageButton bsItem = PlacePageButtonFactory.createButton(currentItems.get(i), requireActivity()); items.add(new MenuBottomSheetItem( - bsItem.getTitle(), - bsItem.getIcon(), - () -> onPlacePageButtonClick(bsItem.getType()) + bsItem.getTitle(), + bsItem.getIcon(), + () -> onPlacePageButtonClick(bsItem.getType()), + () -> onPlacePageButtonLongClick(bsItem.getType()) )); } return items; @@ -371,6 +379,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 +401,15 @@ public class PlacePageController extends Fragment implements BookmarkManager.INSTANCE.addNewBookmark(mMapObject.getLat(), mMapObject.getLon()); } + private void onBookmarkBtnLongClicked() + { + final FragmentActivity activity = requireActivity(); + EditBookmarkFragment.createBookmark(mMapObject.getLat(), mMapObject.getLon(), + activity, + activity.getSupportFragmentManager(), + this); + } + private void onBackBtnClicked() { if (mMapObject == null) @@ -619,6 +645,11 @@ public class PlacePageController extends Fragment implements mViewModel.getPlacePageDistanceToTop().removeObserver(mPlacePageDistanceToTopObserver); } + @Override + public void onBookmarkSaved(long bookmarkId, boolean movedFromCategory) { + + } + public interface PlacePageRouteSettingsListener { void onPlacePageRequestToggleRouteSettings(@NonNull RoadType roadType);