Implement Track Selection and elevation info display on PP

Signed-off-by: kavikhalique <kavikhalique3@gmail.com>
This commit is contained in:
kavikhalique
2025-07-25 22:45:32 +05:30
committed by Konstantin Pastbin
parent ebb7c45d1a
commit f1628c70bc
41 changed files with 1181 additions and 436 deletions

View File

@@ -921,17 +921,7 @@ JNIEXPORT void JNICALL Java_app_organicmaps_sdk_Framework_nativePlacePageActivat
JNIEnv * env = jni::GetEnv();
auto const & info = frm()->GetCurrentPlacePageInfo();
jni::TScopedLocalRef placePageDataRef(env, nullptr);
if (info.IsTrack())
{
// todo: (KK) implement elevation info handling for the proper track selection
auto const & track = frm()->GetBookmarkManager().GetTrack(info.GetTrackId());
auto const & elevationInfo = track->GetElevationInfo();
if (elevationInfo.has_value())
placePageDataRef.reset(usermark_helper::CreateElevationInfo(env, elevationInfo.value()));
}
if (!placePageDataRef)
placePageDataRef.reset(usermark_helper::CreateMapObject(env, info));
placePageDataRef.reset(usermark_helper::CreateMapObject(env, info));
env->CallVoidMethod(g_placePageActivationListener, activatedId, placePageDataRef.get());
};
auto const closePlacePage = [deactivateId]()

View File

@@ -88,6 +88,47 @@ jobject CreateMapObject(JNIEnv * env, place_page::Info const & info, int mapObje
return mapObject;
}
jobject CreateTrack(JNIEnv * env, place_page::Info const & info, jni::TScopedLocalObjectArrayRef const & jrawTypes,
jni::TScopedLocalRef const & routingPointInfo, jobject const & popularity)
{
static jmethodID const ctorId =
jni::GetConstructorID(env, g_trackClazz,
"(Lapp/organicmaps/sdk/bookmarks/data/FeatureId;JJLjava/lang/String;"
"Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;"
"Lapp/organicmaps/sdk/routing/RoutePointInfo;"
"ILapp/organicmaps/sdk/search/Popularity;Ljava/lang/String;"
"[Ljava/lang/String;ILapp/organicmaps/sdk/util/Distance;DD)V");
static jmethodID const featureCtorId = jni::GetConstructorID(env, g_featureIdClazz, "(Ljava/lang/String;JI)V");
auto const trackId = info.GetTrackId();
auto const track = frm()->GetBookmarkManager().GetTrack(trackId);
dp::Color nColor = track->GetColor(0);
jint androidColor =
shift(nColor.GetAlpha(), 24) + shift(nColor.GetRed(), 16) + shift(nColor.GetGreen(), 8) + nColor.GetBlue();
auto const categoryId = track->GetGroupId();
ms::LatLon const ll = info.GetLatLon();
jni::TScopedLocalRef jMwmName(env, jni::ToJavaString(env, info.GetID().GetMwmName()));
jni::TScopedLocalRef jFeatureId(env, env->NewObject(g_featureIdClazz, featureCtorId, jMwmName.get(),
(jlong)info.GetID().GetMwmVersion(), (jint)info.GetID().m_index));
jni::TScopedLocalRef jTitle(env, jni::ToJavaString(env, info.GetTitle()));
jni::TScopedLocalRef jSecondaryTitle(env, jni::ToJavaString(env, info.GetSecondaryTitle()));
jni::TScopedLocalRef jSubtitle(env, jni::ToJavaString(env, info.GetSubtitle()));
jni::TScopedLocalRef jAddress(env, jni::ToJavaString(env, info.GetSecondarySubtitle()));
jni::TScopedLocalRef jWikiDescription(env, jni::ToJavaString(env, info.GetWikiDescription()));
jobject mapObject =
env->NewObject(g_trackClazz, ctorId, jFeatureId.get(), static_cast<jlong>(categoryId),
static_cast<jlong>(trackId), jTitle.get(), jSecondaryTitle.get(), jSubtitle.get(), jAddress.get(),
routingPointInfo.get(), info.GetOpeningMode(), popularity, jWikiDescription.get(), jrawTypes.get(),
androidColor, ToJavaDistance(env, platform::Distance::CreateFormatted(track->GetLengthMeters())),
static_cast<jdouble>(ll.m_lat), static_cast<jdouble>(ll.m_lon));
if (info.HasMetadata())
InjectMetadata(env, g_mapObjectClazz, mapObject, info);
return mapObject;
}
jobject CreateBookmark(JNIEnv * env, place_page::Info const & info, jni::TScopedLocalObjectArrayRef const & jrawTypes,
jni::TScopedLocalRef const & routingPointInfo, jobject const & popularity)
{
@@ -129,10 +170,11 @@ jobject CreateElevationPoint(JNIEnv * env, ElevationInfo::Point const & point)
{
static jclass const pointClass =
jni::GetGlobalClassRef(env, "app/organicmaps/sdk/bookmarks/data/ElevationInfo$Point");
// public Point(double distance, int altitude)
static jmethodID const pointCtorId = jni::GetConstructorID(env, pointClass, "(DI)V");
return env->NewObject(pointClass, pointCtorId, static_cast<jdouble>(point.m_distance),
static_cast<jint>(point.m_point.GetAltitude()));
// public Point(double distance, int altitude, double latitude, double longitude)
static jmethodID const pointCtorId = jni::GetConstructorID(env, pointClass, "(DIDD)V");
return env->NewObject(
pointClass, pointCtorId, static_cast<jdouble>(point.m_distance), static_cast<jint>(point.m_point.GetAltitude()),
static_cast<jdouble>(point.m_point.GetPoint().x), static_cast<jdouble>(point.m_point.GetPoint().y));
}
jobjectArray ToElevationPointArray(JNIEnv * env, ElevationInfo::Points const & points)
@@ -146,22 +188,12 @@ jobjectArray ToElevationPointArray(JNIEnv * env, ElevationInfo::Points const & p
jobject CreateElevationInfo(JNIEnv * env, ElevationInfo const & info)
{
// public ElevationInfo(long trackId, @NonNull String name, @NonNull Point[] points,
// int ascent, int descent, int minAltitude, int maxAltitude, int difficulty,
// long m_duration)
static jmethodID const ctorId = jni::GetConstructorID(env, g_elevationInfoClazz,
"(JLjava/lang/String;Ljava/lang/String;"
"[Lapp/organicmaps/sdk/bookmarks/data/ElevationInfo$Point;"
"IIIIIJ)V");
// public ElevationInfo(@NonNull Point[] points, int difficulty);
static jmethodID const ctorId =
jni::GetConstructorID(env, g_elevationInfoClazz, "([Lapp/organicmaps/sdk/bookmarks/data/ElevationInfo$Point;I)V");
jni::TScopedLocalObjectArrayRef jPoints(env, ToElevationPointArray(env, info.GetPoints()));
// TODO (KK): elevation info should have only the elevation data - see the
// https://github.com/organicmaps/organicmaps/pull/10063
return env->NewObject(g_elevationInfoClazz, ctorId, jPoints.get(),
// static_cast<jint>(info.GetAscent()),
// static_cast<jint>(info.GetDescent()),
// static_cast<jint>(info.GetMinAltitude()),
// static_cast<jint>(info.GetMaxAltitude()),
static_cast<jint>(info.GetDifficulty()));
return env->NewObject(g_elevationInfoClazz, ctorId, jPoints.get(), static_cast<jint>(info.GetDifficulty()));
}
jobject CreateMapObject(JNIEnv * env, place_page::Info const & info)
@@ -193,6 +225,9 @@ jobject CreateMapObject(JNIEnv * env, place_page::Info const & info)
routingPointInfo.get(), popularity, jrawTypes.get());
}
if (info.IsTrack())
return CreateTrack(env, info, jrawTypes, routingPointInfo, popularity);
return CreateMapObject(env, info, kPoi, ll.m_lat, ll.m_lon, true /* parseMeta */, false /* parseApi */,
routingPointInfo.get(), popularity, jrawTypes.get());
}

View File

@@ -26,6 +26,7 @@ static constexpr int kApiPoint = 1;
static constexpr int kBookmark = 2;
static constexpr int kMyPosition = 3;
static constexpr int kSearch = 4;
static constexpr int kTrack = 5;
static constexpr int kPriceRateUndefined = -1;
@@ -34,6 +35,9 @@ void InjectMetadata(JNIEnv * env, jclass clazz, jobject const mapObject, feature
jobject CreateMapObject(JNIEnv * env, place_page::Info const & info);
jobject CreateTrack(JNIEnv * env, place_page::Info const & info, jni::TScopedLocalObjectArrayRef const & jrawTypes,
jni::TScopedLocalRef const & routingPointInfo, jobject const & popularity);
jobject CreateElevationInfo(JNIEnv * env, ElevationInfo const & info);
jobjectArray ToRatingArray(JNIEnv * env, std::vector<std::string> const & ratingCategories);

View File

@@ -447,6 +447,16 @@ JNIEXPORT jobject JNICALL Java_app_organicmaps_sdk_bookmarks_data_BookmarkManage
return usermark_helper::CreateMapObject(env, g_framework->GetPlacePageInfo());
}
JNIEXPORT void JNICALL Java_app_organicmaps_sdk_bookmarks_data_BookmarkManager_nativeUpdateTrackPlacePage(JNIEnv * env,
jobject,
jlong trackId)
{
if (!frm()->HasPlacePageInfo())
return;
frm()->UpdatePlacePageInfoForCurrentSelection();
}
JNIEXPORT jobject JNICALL Java_app_organicmaps_sdk_bookmarks_data_BookmarkManager_nativeGetBookmarkInfo(JNIEnv * env,
jobject,
jlong bmkId)
@@ -824,14 +834,12 @@ Java_app_organicmaps_sdk_bookmarks_data_BookmarkManager_nativeRemoveElevationCur
}
JNIEXPORT void JNICALL Java_app_organicmaps_sdk_bookmarks_data_BookmarkManager_nativeSetElevationActivePoint(
JNIEnv *, jclass, jlong trackId, jdouble distanceInMeters)
JNIEnv *, jclass, jlong trackId, jdouble distanceInMeters, jdouble latitude, jdouble longitude)
{
auto & bm = frm()->GetBookmarkManager();
bm.SetElevationActivePoint(
static_cast<kml::TrackId>(trackId),
{0,
0}, // todo(KK): replace with coordinates from the elevation profile point to show selection mark on the track
static_cast<double>(distanceInMeters));
bm.SetElevationActivePoint(static_cast<kml::TrackId>(trackId),
m2::PointD(static_cast<double>(latitude), static_cast<double>(longitude)),
static_cast<double>(distanceInMeters));
}
JNIEXPORT jdouble JNICALL Java_app_organicmaps_sdk_bookmarks_data_BookmarkManager_nativeGetElevationActivePointDistance(
@@ -858,4 +866,41 @@ Java_app_organicmaps_sdk_widget_placepage_PlacePageButtonFactory_nativeHasRecent
{
return frm()->GetBookmarkManager().HasRecentlyDeletedBookmark();
}
JNIEXPORT jobject JNICALL Java_app_organicmaps_sdk_bookmarks_data_BookmarkManager_nativeGetTrackElevationInfo(
JNIEnv * env, jclass clazz, jlong track_id)
{
auto const & track = frm()->GetBookmarkManager().GetTrack(track_id);
auto const & elevationInfo = track->GetElevationInfo();
return usermark_helper::CreateElevationInfo(env, elevationInfo.value());
}
JNIEXPORT jboolean JNICALL Java_app_organicmaps_sdk_bookmarks_data_BookmarkManager_nativeIsElevationInfoHasValue(
JNIEnv * env, jclass clazz, jlong track_id)
{
return static_cast<jboolean>(frm()->GetBookmarkManager().GetTrack(track_id)->GetElevationInfo().has_value());
}
JNIEXPORT jobject JNICALL Java_app_organicmaps_sdk_bookmarks_data_BookmarkManager_nativeGetTrackStatistics(
JNIEnv * env, jclass clazz, jlong track_id)
{
static jmethodID const cId = jni::GetConstructorID(env, g_trackStatisticsClazz, "(DDDDII)V");
auto const trackStats = frm()->GetBookmarkManager().GetTrack(track_id)->GetStatistics();
return env->NewObject(g_trackStatisticsClazz, cId, static_cast<jdouble>(trackStats.m_length),
static_cast<jdouble>(trackStats.m_duration), static_cast<jdouble>(trackStats.m_ascent),
static_cast<jdouble>(trackStats.m_descent), static_cast<jint>(trackStats.m_minElevation),
static_cast<jint>(trackStats.m_maxElevation));
}
JNIEXPORT jobject JNICALL
Java_app_organicmaps_sdk_bookmarks_data_BookmarkManager_nativeGetElevationActivePointCoordinates(JNIEnv * env,
jclass clazz,
jlong track_id)
{
static jclass const pointClass =
jni::GetGlobalClassRef(env, "app/organicmaps/sdk/bookmarks/data/ElevationInfo$Point");
static jmethodID const pointCtorId = jni::GetConstructorID(env, pointClass, "(DIDD)V");
auto const & trackInfo = frm()->GetBookmarkManager().GetTrackSelectionInfo(track_id);
auto const latlon = mercator::ToLatLon(trackInfo.m_trackPoint);
return env->NewObject(pointClass, pointCtorId, 0.0, 0, static_cast<jdouble>(latlon.m_lat),
static_cast<jdouble>(latlon.m_lon));
}
} // extern "C"

View File

@@ -21,6 +21,8 @@ extern JavaVM * GetJVM()
jclass g_mapObjectClazz;
jclass g_featureIdClazz;
jclass g_bookmarkClazz;
jclass g_trackClazz;
jclass g_trackStatisticsClazz;
jclass g_httpClientClazz;
jclass g_httpParamsClazz;
jclass g_platformSocketClazz;
@@ -57,6 +59,8 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM * jvm, void *)
JNIEnv * env = jni::GetEnv();
g_mapObjectClazz = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/bookmarks/data/MapObject");
g_featureIdClazz = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/bookmarks/data/FeatureId");
g_trackClazz = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/bookmarks/data/Track");
g_trackStatisticsClazz = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/bookmarks/data/TrackStatistics");
g_bookmarkClazz = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/bookmarks/data/Bookmark");
g_httpClientClazz = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/util/HttpClient");
g_httpParamsClazz = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/util/HttpClient$Params");
@@ -85,6 +89,8 @@ JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *, void *)
env->DeleteGlobalRef(g_mapObjectClazz);
env->DeleteGlobalRef(g_featureIdClazz);
env->DeleteGlobalRef(g_bookmarkClazz);
env->DeleteGlobalRef(g_trackClazz);
env->DeleteGlobalRef(g_trackStatisticsClazz);
env->DeleteGlobalRef(g_httpClientClazz);
env->DeleteGlobalRef(g_httpParamsClazz);
env->DeleteGlobalRef(g_platformSocketClazz);

View File

@@ -18,6 +18,8 @@
extern jclass g_mapObjectClazz;
extern jclass g_featureIdClazz;
extern jclass g_bookmarkClazz;
extern jclass g_trackClazz;
extern jclass g_trackStatisticsClazz;
extern jclass g_httpClientClazz;
extern jclass g_httpParamsClazz;
extern jclass g_platformSocketClazz;