mirror of
https://codeberg.org/comaps/comaps
synced 2025-12-20 13:23:59 +00:00
Implement Track Selection and elevation info display on PP
Signed-off-by: kavikhalique <kavikhalique3@gmail.com>
This commit is contained in:
committed by
Konstantin Pastbin
parent
ebb7c45d1a
commit
f1628c70bc
@@ -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]()
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user