From cd5923ed69aa0a1195c8be31b3dbbbb7092af5af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Kl=C3=BCber?= <48260138+sklueber@users.noreply.github.com> Date: Sat, 13 Jan 2024 17:04:26 -0600 Subject: [PATCH] [android][bookmarks] Add sorting bookmarks and tracks by name MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Simon Klüber <48260138+sklueber@users.noreply.github.com> --- .../ChooseBookmarksSortingTypeFragment.java | 6 ++- .../bookmarks/data/BookmarkManager.java | 3 +- .../main/res/layout/dialog_sorting_types.xml | 9 ++++ map/bookmark_manager.cpp | 52 ++++++++++++++++++- map/bookmark_manager.hpp | 12 ++++- 5 files changed, 78 insertions(+), 4 deletions(-) diff --git a/android/app/src/main/java/app/organicmaps/bookmarks/ChooseBookmarksSortingTypeFragment.java b/android/app/src/main/java/app/organicmaps/bookmarks/ChooseBookmarksSortingTypeFragment.java index 5db49e6c50..2a74f80ae0 100644 --- a/android/app/src/main/java/app/organicmaps/bookmarks/ChooseBookmarksSortingTypeFragment.java +++ b/android/app/src/main/java/app/organicmaps/bookmarks/ChooseBookmarksSortingTypeFragment.java @@ -74,6 +74,8 @@ public class ChooseBookmarksSortingTypeFragment extends BaseMwmDialogFragment return R.id.sort_by_distance; case BookmarkManager.SORT_BY_TIME: return R.id.sort_by_time; + case BookmarkManager.SORT_BY_NAME: + return R.id.sort_by_name; } } return R.id.sort_by_default; @@ -88,7 +90,7 @@ public class ChooseBookmarksSortingTypeFragment extends BaseMwmDialogFragment if (args == null) throw new AssertionError("Arguments of choose sorting type view can't be null."); - UiUtils.hide(view, R.id.sort_by_type, R.id.sort_by_distance, R.id.sort_by_time); + UiUtils.hide(view, R.id.sort_by_type, R.id.sort_by_distance, R.id.sort_by_time, R.id.sort_by_name); @BookmarkManager.SortingType int[] availableSortingTypes = args.getIntArray(EXTRA_SORTING_TYPES); @@ -151,5 +153,7 @@ public class ChooseBookmarksSortingTypeFragment extends BaseMwmDialogFragment setSortingType(BookmarkManager.SORT_BY_DISTANCE); else if (id == R.id.sort_by_time) setSortingType(BookmarkManager.SORT_BY_TIME); + else if (id == R.id.sort_by_name) + setSortingType(BookmarkManager.SORT_BY_NAME); } } 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 3945bb0276..75bf07c562 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 @@ -63,12 +63,13 @@ public enum BookmarkManager public static final int CLOUD_NOT_ENOUGH_DISK_SPACE = 2; @Retention(RetentionPolicy.SOURCE) - @IntDef({ SORT_BY_TYPE, SORT_BY_DISTANCE, SORT_BY_TIME }) + @IntDef({ SORT_BY_TYPE, SORT_BY_DISTANCE, SORT_BY_TIME, SORT_BY_NAME }) public @interface SortingType {} public static final int SORT_BY_TYPE = 0; public static final int SORT_BY_DISTANCE = 1; public static final int SORT_BY_TIME = 2; + public static final int SORT_BY_NAME = 3; // These values have to match the values of kml::CompilationType from kml/types.hpp public static final int CATEGORY = 0; diff --git a/android/app/src/main/res/layout/dialog_sorting_types.xml b/android/app/src/main/res/layout/dialog_sorting_types.xml index 554b3ea42e..50e43174c9 100644 --- a/android/app/src/main/res/layout/dialog_sorting_types.xml +++ b/android/app/src/main/res/layout/dialog_sorting_types.xml @@ -34,6 +34,15 @@ android:checked="true" android:text="@string/by_default"/> + + BookmarkManager::GetAvailableSortingTy sortingTypes.push_back(SortingType::ByDistance); if (byTimeChecked) sortingTypes.push_back(SortingType::ByTime); - + // Sorting by name should always be possible. + sortingTypes.push_back(SortingType::ByName); return sortingTypes; } @@ -685,6 +689,12 @@ std::string BookmarkManager::GetTracksSortedBlockName() return platform::GetLocalizedString("tracks_title"); } +// static +std::string BookmarkManager::GetBookmarksSortedBlockName() +{ + return platform::GetLocalizedString("bookmarks"); +} + // static std::string BookmarkManager::GetOthersSortedBlockName() { @@ -1129,6 +1139,16 @@ void BookmarkManager::SortTracksByTime(std::vector & tracks) }); } +// static +void BookmarkManager::SortTracksByName(std::vector & tracks) +{ + std::sort(tracks.begin(), tracks.end(), + [](SortTrackData const & lbm, SortTrackData const & rbm) + { + return lbm.m_name < rbm.m_name; + }); +} + void BookmarkManager::SortByDistance(std::vector const & bookmarksForSort, std::vector const & tracksForSort, m2::PointD const & myPosition, @@ -1325,6 +1345,33 @@ void BookmarkManager::SortByType(std::vector const & bookmarks } } +void BookmarkManager::SortByName(std::vector const & bookmarksForSort, + std::vector const & tracksForSort, + SortedBlocksCollection & sortedBlocks) +{ + std::vector sortedTracks = tracksForSort; + SortTracksByName(sortedTracks); + AddTracksSortedBlock(sortedTracks, sortedBlocks); + + std::vector sortedMarks; + sortedMarks.reserve(bookmarksForSort.size()); + for (auto const & mark : bookmarksForSort) + sortedMarks.push_back(&mark); + + std::sort(sortedMarks.begin(), sortedMarks.end(), + [](SortBookmarkData const * lbm, SortBookmarkData const * rbm) + { + return lbm->m_name < rbm->m_name; + }); + + // Put all bookmarks into one block + SortedBlock bookmarkBlock; + bookmarkBlock.m_blockName = GetBookmarksSortedBlockName(); + for (auto mark : sortedMarks) + bookmarkBlock.m_markIds.push_back(mark->m_id); + sortedBlocks.push_back(bookmarkBlock); +} + void BookmarkManager::GetSortedCategoryImpl(SortParams const & params, std::vector const & bookmarksForSort, std::vector const & tracksForSort, @@ -1342,6 +1389,9 @@ void BookmarkManager::GetSortedCategoryImpl(SortParams const & params, case SortingType::ByType: SortByType(bookmarksForSort, tracksForSort, sortedBlocks); return; + case SortingType::ByName: + SortByName(bookmarksForSort, tracksForSort, sortedBlocks); + return; } UNREACHABLE(); } diff --git a/map/bookmark_manager.hpp b/map/bookmark_manager.hpp index 7b627845be..1328b81780 100644 --- a/map/bookmark_manager.hpp +++ b/map/bookmark_manager.hpp @@ -222,7 +222,8 @@ public: { ByType, ByDistance, - ByTime + ByTime, + ByName }; struct SortedBlock @@ -370,6 +371,7 @@ public: void CreateCategories(KMLDataCollection && dataCollection, bool autoSave = false); static std::string GetTracksSortedBlockName(); + static std::string GetBookmarksSortedBlockName(); static std::string GetOthersSortedBlockName(); static std::string GetNearMeSortedBlockName(); enum class SortedByTimeBlockType : uint32_t @@ -636,6 +638,7 @@ private: { SortBookmarkData(kml::BookmarkData const & bmData, search::ReverseGeocoder::RegionAddress const & address) : m_id(bmData.m_id) + , m_name(GetPreferredBookmarkName(bmData)) , m_point(bmData.m_point) , m_type(GetBookmarkBaseType(bmData.m_featureTypes)) , m_timestamp(bmData.m_timestamp) @@ -643,6 +646,7 @@ private: {} kml::MarkId m_id; + std::string m_name; m2::PointD m_point; BookmarkBaseType m_type; kml::Timestamp m_timestamp; @@ -653,10 +657,12 @@ private: { explicit SortTrackData(kml::TrackData const & trackData) : m_id(trackData.m_id) + , m_name(GetPreferredBookmarkStr(trackData.m_name)) , m_timestamp(trackData.m_timestamp) {} kml::TrackId m_id; + std::string m_name; kml::Timestamp m_timestamp; }; @@ -674,6 +680,9 @@ private: static void SortByType(std::vector const & bookmarksForSort, std::vector const & tracksForSort, SortedBlocksCollection & sortedBlocks); + static void SortByName(std::vector const & bookmarksForSort, + std::vector const & tracksForSort, + SortedBlocksCollection & sortedBlocks); using AddressesCollection = std::vector>; void PrepareBookmarksAddresses(std::vector & bookmarksForSort, AddressesCollection & newAddresses); @@ -681,6 +690,7 @@ private: void SetBookmarksAddresses(AddressesCollection const & addresses); static void AddTracksSortedBlock(std::vector const & sortedTracks, SortedBlocksCollection & sortedBlocks); static void SortTracksByTime(std::vector & tracks); + static void SortTracksByName(std::vector & tracks); kml::MarkId GetTrackSelectionMarkId(kml::TrackId trackId) const; int GetTrackSelectionMarkMinZoom(kml::TrackId trackId) const;