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;