From 6fb8894efa013443460452fe270c69c468e76a28 Mon Sep 17 00:00:00 2001 From: Daria Volvenkova Date: Mon, 21 May 2018 18:15:26 +0300 Subject: [PATCH] Check if a bookmark category is editable. --- .../maps/bookmarks/data/BookmarkManager.cpp | 22 ++++++++++ .../maps/bookmarks/data/BookmarkManager.java | 12 ++++++ map/bookmark_manager.cpp | 43 ++++++++++++++++++- map/bookmark_manager.hpp | 6 ++- 4 files changed, 80 insertions(+), 3 deletions(-) diff --git a/android/jni/com/mapswithme/maps/bookmarks/data/BookmarkManager.cpp b/android/jni/com/mapswithme/maps/bookmarks/data/BookmarkManager.cpp index a84c8d0cd9..8c577b3503 100644 --- a/android/jni/com/mapswithme/maps/bookmarks/data/BookmarkManager.cpp +++ b/android/jni/com/mapswithme/maps/bookmarks/data/BookmarkManager.cpp @@ -495,6 +495,28 @@ Java_com_mapswithme_maps_bookmarks_data_BookmarkManager_nativeIsUsedCategoryName ToNativeString(env, name))); } +JNIEXPORT jboolean JNICALL +Java_com_mapswithme_maps_bookmarks_data_BookmarkManager_nativeIsEditableBookmark( + JNIEnv * env, jobject thiz, jlong bmkId) +{ + return static_cast(frm()->GetBookmarkManager().IsEditableBookmark(static_cast(bmkId))); +} + +JNIEXPORT jboolean JNICALL +Java_com_mapswithme_maps_bookmarks_data_BookmarkManager_nativeIsEditableTrack( + JNIEnv * env, jobject thiz, jlong trackId) +{ + return static_cast(frm()->GetBookmarkManager().IsEditableTrack(static_cast(trackId))); +} + +JNIEXPORT jboolean JNICALL +Java_com_mapswithme_maps_bookmarks_data_BookmarkManager_nativeIsEditableCategory( + JNIEnv * env, jobject thiz, jlong catId) +{ + return static_cast(frm()->GetBookmarkManager().IsEditableCategory(static_cast(catId))); +} + + JNIEXPORT jboolean JNICALL Java_com_mapswithme_maps_bookmarks_data_BookmarkManager_nativeAreAllCategoriesVisible( JNIEnv * env, jobject thiz) diff --git a/android/src/com/mapswithme/maps/bookmarks/data/BookmarkManager.java b/android/src/com/mapswithme/maps/bookmarks/data/BookmarkManager.java index 4e1346dd82..2cb93f4d52 100644 --- a/android/src/com/mapswithme/maps/bookmarks/data/BookmarkManager.java +++ b/android/src/com/mapswithme/maps/bookmarks/data/BookmarkManager.java @@ -369,6 +369,12 @@ public enum BookmarkManager return nativeIsUsedCategoryName(name); } + public boolean isEditableBookmark(long bmkId) { return nativeIsEditableBookmark(bmkId); } + + public boolean isEditableTrack(long trackId) { return nativeIsEditableTrack(trackId); } + + public boolean isEditableCategory(long catId) { return nativeIsEditableCategory(catId); } + public boolean areAllCategoriesVisible() { return nativeAreAllCategoriesVisible(); @@ -535,6 +541,12 @@ public enum BookmarkManager private static native boolean nativeIsUsedCategoryName(@NonNull String name); + private static native boolean nativeIsEditableBookmark(long bmkId); + + private static native boolean nativeIsEditableTrack(long trackId); + + private static native boolean nativeIsEditableCategory(long catId); + private static native boolean nativeAreAllCategoriesVisible(); private static native boolean nativeAreAllCategoriesInvisible(); diff --git a/map/bookmark_manager.cpp b/map/bookmark_manager.cpp index ae906a3c8c..60658a9b35 100644 --- a/map/bookmark_manager.cpp +++ b/map/bookmark_manager.cpp @@ -1721,6 +1721,30 @@ bool BookmarkManager::IsCategoryEmpty(kml::MarkGroupId categoryId) const return GetBmCategory(categoryId)->IsEmpty(); } +bool BookmarkManager::IsEditableBookmark(kml::MarkId bmId) const +{ + CHECK_THREAD_CHECKER(m_threadChecker, ()); + auto const * mark = GetBookmark(bmId); + if (mark->GetGroupId() != kml::kInvalidMarkGroupId) + return !IsCategoryFromCatalog(mark->GetGroupId()); + return true; +} + +bool BookmarkManager::IsEditableTrack(kml::TrackId trackId) const +{ + CHECK_THREAD_CHECKER(m_threadChecker, ()); + auto const * track = GetTrack(trackId); + if (track->GetGroupId() != kml::kInvalidMarkGroupId) + return !IsCategoryFromCatalog(track->GetGroupId()); + return true; +} + +bool BookmarkManager::IsEditableCategory(kml::MarkGroupId groupId) const +{ + CHECK_THREAD_CHECKER(m_threadChecker, ()); + return !IsCategoryFromCatalog(groupId); +} + bool BookmarkManager::IsUsedCategoryName(std::string const & name) const { CHECK_THREAD_CHECKER(m_threadChecker, ()); @@ -2286,6 +2310,7 @@ Bookmark * BookmarkManager::EditSession::CreateBookmark(kml::BookmarkData && bmD Bookmark * BookmarkManager::EditSession::CreateBookmark(kml::BookmarkData && bmData, kml::MarkGroupId groupId) { + CHECK(m_bmManager.IsEditableCategory(groupId), ()); return m_bmManager.CreateBookmark(std::move(bmData), groupId); } @@ -2294,9 +2319,10 @@ Track * BookmarkManager::EditSession::CreateTrack(kml::TrackData && trackData) return m_bmManager.CreateTrack(std::move(trackData)); } -Bookmark * BookmarkManager::EditSession::GetBookmarkForEdit(kml::MarkId markId) +Bookmark * BookmarkManager::EditSession::GetBookmarkForEdit(kml::MarkId bmId) { - return m_bmManager.GetBookmarkForEdit(markId); + CHECK(m_bmManager.IsEditableBookmark(bmId), ()); + return m_bmManager.GetBookmarkForEdit(bmId); } void BookmarkManager::EditSession::DeleteUserMark(kml::MarkId markId) @@ -2306,16 +2332,20 @@ void BookmarkManager::EditSession::DeleteUserMark(kml::MarkId markId) void BookmarkManager::EditSession::DeleteBookmark(kml::MarkId bmId) { + CHECK(m_bmManager.IsEditableBookmark(bmId), ()); m_bmManager.DeleteBookmark(bmId); } void BookmarkManager::EditSession::DeleteTrack(kml::TrackId trackId) { + CHECK(m_bmManager.IsEditableTrack(trackId), ()); m_bmManager.DeleteTrack(trackId); } void BookmarkManager::EditSession::ClearGroup(kml::MarkGroupId groupId) { + if (m_bmManager.IsBookmarkCategory(groupId)) + CHECK(m_bmManager.IsEditableCategory(groupId), ()); m_bmManager.ClearGroup(groupId); } @@ -2327,36 +2357,45 @@ void BookmarkManager::EditSession::SetIsVisible(kml::MarkGroupId groupId, bool v void BookmarkManager::EditSession::MoveBookmark( kml::MarkId bmID, kml::MarkGroupId curGroupID, kml::MarkGroupId newGroupID) { + CHECK(m_bmManager.IsEditableCategory(curGroupID), ()); + CHECK(m_bmManager.IsEditableCategory(newGroupID), ()); + m_bmManager.MoveBookmark(bmID, curGroupID, newGroupID); } void BookmarkManager::EditSession::UpdateBookmark(kml::MarkId bmId, kml::BookmarkData const & bm) { + CHECK(m_bmManager.IsEditableBookmark(bmId), ()); return m_bmManager.UpdateBookmark(bmId, bm); } void BookmarkManager::EditSession::AttachBookmark(kml::MarkId bmId, kml::MarkGroupId groupId) { + CHECK(m_bmManager.IsEditableCategory(groupId), ()); m_bmManager.AttachBookmark(bmId, groupId); } void BookmarkManager::EditSession::DetachBookmark(kml::MarkId bmId, kml::MarkGroupId groupId) { + CHECK(m_bmManager.IsEditableCategory(groupId), ()); m_bmManager.DetachBookmark(bmId, groupId); } void BookmarkManager::EditSession::AttachTrack(kml::TrackId trackId, kml::MarkGroupId groupId) { + CHECK(m_bmManager.IsEditableCategory(groupId), ()); m_bmManager.AttachTrack(trackId, groupId); } void BookmarkManager::EditSession::DetachTrack(kml::TrackId trackId, kml::MarkGroupId groupId) { + CHECK(m_bmManager.IsEditableCategory(groupId), ()); m_bmManager.DetachTrack(trackId, groupId); } void BookmarkManager::EditSession::SetCategoryName(kml::MarkGroupId categoryId, std::string const & name) { + CHECK(m_bmManager.IsEditableCategory(categoryId), ()); m_bmManager.SetCategoryName(categoryId, name); } diff --git a/map/bookmark_manager.hpp b/map/bookmark_manager.hpp index 3abc1c0c67..a378960c97 100644 --- a/map/bookmark_manager.hpp +++ b/map/bookmark_manager.hpp @@ -97,7 +97,7 @@ public: return m_bmManager.GetMarkForEdit(markId); } - Bookmark * GetBookmarkForEdit(kml::MarkId markId); + Bookmark * GetBookmarkForEdit(kml::MarkId bmId); template void DeleteUserMarks(UserMark::Type type, F && deletePredicate) @@ -246,6 +246,10 @@ public: bool IsCategoryEmpty(kml::MarkGroupId categoryId) const; + bool IsEditableBookmark(kml::MarkId bmId) const; + bool IsEditableTrack(kml::TrackId trackId) const; + bool IsEditableCategory(kml::MarkGroupId groupId) const; + bool IsUsedCategoryName(std::string const & name) const; bool AreAllCategoriesVisible() const; bool AreAllCategoriesInvisible() const;