forked from organicmaps/organicmaps
[android] Added JNI code and java structure for elevation profile
This commit is contained in:
parent
23cf5e5060
commit
4a975dfc45
6 changed files with 229 additions and 50 deletions
|
@ -32,6 +32,7 @@ jclass g_httpBackgroundUploaderClazz;
|
|||
jclass g_httpUploaderResultClazz;
|
||||
jclass g_networkPolicyClazz;
|
||||
jclass g_storageUtilsClazz;
|
||||
jclass g_elevationInfoClazz;
|
||||
|
||||
extern "C"
|
||||
{
|
||||
|
@ -62,6 +63,7 @@ JNI_OnLoad(JavaVM * jvm, void *)
|
|||
g_httpUploaderResultClazz = jni::GetGlobalClassRef(env, "com/mapswithme/util/HttpUploader$Result");
|
||||
g_networkPolicyClazz = jni::GetGlobalClassRef(env, "com/mapswithme/util/NetworkPolicy");
|
||||
g_storageUtilsClazz = jni::GetGlobalClassRef(env, "com/mapswithme/util/StorageUtils");
|
||||
g_elevationInfoClazz = jni::GetGlobalClassRef(env, "com/mapswithme/maps/bookmarks/data/ElevationInfo");
|
||||
|
||||
return JNI_VERSION_1_6;
|
||||
}
|
||||
|
@ -89,6 +91,7 @@ JNI_OnUnload(JavaVM *, void *)
|
|||
env->DeleteGlobalRef(g_httpUploaderResultClazz);
|
||||
env->DeleteGlobalRef(g_networkPolicyClazz);
|
||||
env->DeleteGlobalRef(g_storageUtilsClazz);
|
||||
env->DeleteGlobalRef(g_elevationInfoClazz);
|
||||
}
|
||||
} // extern "C"
|
||||
|
||||
|
|
|
@ -33,6 +33,7 @@ extern jclass g_httpBackgroundUploaderClazz;
|
|||
extern jclass g_httpUploaderResultClazz;
|
||||
extern jclass g_networkPolicyClazz;
|
||||
extern jclass g_storageUtilsClazz;
|
||||
extern jclass g_elevationInfoClazz;
|
||||
|
||||
namespace jni
|
||||
{
|
||||
|
|
|
@ -1032,7 +1032,16 @@ Java_com_mapswithme_maps_Framework_nativeSetUserMarkActivationListener(JNIEnv *e
|
|||
{
|
||||
JNIEnv * env = jni::GetEnv();
|
||||
auto const & info = frm()->GetCurrentPlacePageInfo();
|
||||
jni::TScopedLocalRef userMarkRef(env, usermark_helper::CreateMapObject(env, info));
|
||||
jni::TScopedLocalRef userMarkRef(env, nullptr);
|
||||
if (info.IsTrack())
|
||||
{
|
||||
auto const elevationInfo = frm()->GetBookmarkManager().MakeElevationInfo(info.GetTrackId());
|
||||
userMarkRef.reset(usermark_helper::CreateElevationInfo(env, elevationInfo));
|
||||
}
|
||||
else
|
||||
{
|
||||
userMarkRef.reset(usermark_helper::CreateMapObject(env, info));
|
||||
}
|
||||
env->CallVoidMethod(g_userMarkActivationListener, activatedId, userMarkRef.get());
|
||||
};
|
||||
auto const closePlacePage = [deactivateId](bool switchFullScreenMode)
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#include "UserMarkHelper.hpp"
|
||||
|
||||
#include "map/elevation_info.hpp"
|
||||
#include "map/place_page_info.hpp"
|
||||
|
||||
#include "partners_api/ads_engine.hpp"
|
||||
|
@ -126,6 +127,110 @@ jobject CreateMapObject(JNIEnv * env, std::string const & mwmName, int64_t mwmVe
|
|||
return mapObject;
|
||||
}
|
||||
|
||||
jobject CreateBookmark(JNIEnv *env, const place_page::Info &info,
|
||||
const jni::TScopedLocalObjectArrayRef &jbanners,
|
||||
const jni::TScopedLocalObjectArrayRef &jratings,
|
||||
const jni::TScopedLocalIntArrayRef &jTaxiTypes,
|
||||
const jni::TScopedLocalObjectArrayRef &jrawTypes,
|
||||
const jni::TScopedLocalRef &localAdInfo,
|
||||
const jni::TScopedLocalRef &routingPointInfo,
|
||||
const jni::TScopedLocalRef &hotelType,
|
||||
const jni::TScopedLocalRef &popularity, int priceRate)
|
||||
{
|
||||
// public Bookmark(@NonNull FeatureId featureId, @IntRange(from = 0) long categoryId,
|
||||
// @IntRange(from = 0) long bookmarkId, String title, @Nullable String secondaryTitle,
|
||||
// @Nullable String subtitle, @Nullable String address, @Nullable Banner[] banners,
|
||||
// @Nullable int[] reachableByTaxiTypes, @Nullable String bookingSearchUrl,
|
||||
// @Nullable LocalAdInfo localAdInfo, @Nullable RoutePointInfo routePointInfo,
|
||||
// @OpeningMode int openingMode, boolean shouldShowUGC, boolean canBeRated,
|
||||
// boolean canBeReviewed, @Nullable UGC.Rating[] ratings,
|
||||
// @Nullable HotelsFilter.HotelType hotelType,
|
||||
// @PriceFilterView.PriceDef int priceRate,
|
||||
// @NotNull com.mapswithme.maps.search.Popularity entity
|
||||
// @NotNull String description)
|
||||
static jmethodID const ctorId =
|
||||
jni::GetConstructorID(env, g_bookmarkClazz,
|
||||
"(Lcom/mapswithme/maps/bookmarks/data/FeatureId;JJLjava/lang/String;"
|
||||
"Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;"
|
||||
"[Lcom/mapswithme/maps/ads/Banner;[ILjava/lang/String;"
|
||||
"Lcom/mapswithme/maps/ads/LocalAdInfo;"
|
||||
"Lcom/mapswithme/maps/routing/RoutePointInfo;"
|
||||
"IZZZ[Lcom/mapswithme/maps/ugc/UGC$Rating;"
|
||||
"Lcom/mapswithme/maps/search/HotelsFilter$HotelType;"
|
||||
"ILcom/mapswithme/maps/search/Popularity;Ljava/lang/String;"
|
||||
"[Ljava/lang/String;)V");
|
||||
// public FeatureId(@NonNull String mwmName, long mwmVersion, int featureIndex)
|
||||
static jmethodID const featureCtorId =
|
||||
jni::GetConstructorID(env, g_featureIdClazz, "(Ljava/lang/String;JI)V");
|
||||
|
||||
auto const bookmarkId = info.GetBookmarkId();
|
||||
auto const categoryId = info.GetBookmarkCategoryId();
|
||||
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.GetAddress()));
|
||||
jni::TScopedLocalRef jDescription(env, jni::ToJavaString(env, info.GetDescription()));
|
||||
jni::TScopedLocalRef jBookingSearchUrl(env, jni::ToJavaString(env, info.GetBookingSearchUrl()));
|
||||
jobject mapObject = env->NewObject(
|
||||
g_bookmarkClazz, ctorId, jFeatureId.get(), static_cast<jlong>(categoryId),
|
||||
static_cast<jlong>(bookmarkId), jTitle.get(), jSecondaryTitle.get(), jSubtitle.get(),
|
||||
jAddress.get(), jbanners.get(), jTaxiTypes.get(), jBookingSearchUrl.get(),
|
||||
localAdInfo.get(), routingPointInfo.get(), info.GetOpeningMode(), info.ShouldShowUGC(),
|
||||
info.CanBeRated(), info.CanBeReviewed(), jratings.get(), hotelType.get(), priceRate,
|
||||
popularity.get(), jDescription.get(), jrawTypes.get());
|
||||
|
||||
if (info.IsFeature())
|
||||
InjectMetadata(env, g_mapObjectClazz, mapObject, info.GetMetadata());
|
||||
return mapObject;
|
||||
}
|
||||
|
||||
jobject CreateElevationPoint(JNIEnv * env, ElevationInfo::Point const & point)
|
||||
{
|
||||
static jclass const pointClass =
|
||||
jni::GetGlobalClassRef(env, "com/mapswithme/maps/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_altitude));
|
||||
}
|
||||
|
||||
jobjectArray ToElevationPointArray(JNIEnv * env, ElevationInfo::Points const & points)
|
||||
{
|
||||
CHECK(!points.empty(), ("Elevation points must be non empty!"));
|
||||
static jclass const pointClass =
|
||||
jni::GetGlobalClassRef(env, "com/mapswithme/maps/bookmarks/data/ElevationInfo$Point");
|
||||
return jni::ToJavaArray(env, pointClass, points,
|
||||
[](JNIEnv * env, ElevationInfo::Point const & item)
|
||||
{
|
||||
return CreateElevationPoint(env, item);
|
||||
});
|
||||
}
|
||||
|
||||
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;"
|
||||
"[Lcom/mapswithme/maps/bookmarks/data/ElevationInfo$Point;"
|
||||
"IIIIIJ)V");
|
||||
jni::TScopedLocalRef jName(env, jni::ToJavaString(env, info.GetName()));
|
||||
jni::TScopedLocalObjectArrayRef jPoints(env, ToElevationPointArray(env, info.GetPoints()));
|
||||
return env->NewObject(g_elevationInfoClazz, ctorId, static_cast<jlong>(info.GetId()),
|
||||
jName.get(), 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()),
|
||||
static_cast<jlong>(info.GetDuration()));
|
||||
}
|
||||
|
||||
jobject CreateMapObject(JNIEnv * env, place_page::Info const & info)
|
||||
{
|
||||
jni::TScopedLocalObjectArrayRef jbanners(env, nullptr);
|
||||
|
@ -151,55 +256,8 @@ jobject CreateMapObject(JNIEnv * env, place_page::Info const & info)
|
|||
|
||||
if (info.IsBookmark())
|
||||
{
|
||||
// public Bookmark(@NonNull FeatureId featureId, @IntRange(from = 0) long categoryId,
|
||||
// @IntRange(from = 0) long bookmarkId, String title, @Nullable String secondaryTitle,
|
||||
// @Nullable String subtitle, @Nullable String address, @Nullable Banner[] banners,
|
||||
// @Nullable int[] reachableByTaxiTypes, @Nullable String bookingSearchUrl,
|
||||
// @Nullable LocalAdInfo localAdInfo, @Nullable RoutePointInfo routePointInfo,
|
||||
// @OpeningMode int openingMode, boolean shouldShowUGC, boolean canBeRated,
|
||||
// boolean canBeReviewed, @Nullable UGC.Rating[] ratings,
|
||||
// @Nullable HotelsFilter.HotelType hotelType,
|
||||
// @PriceFilterView.PriceDef int priceRate,
|
||||
// @NotNull com.mapswithme.maps.search.Popularity entity
|
||||
// @NotNull String description)
|
||||
static jmethodID const ctorId =
|
||||
jni::GetConstructorID(env, g_bookmarkClazz,
|
||||
"(Lcom/mapswithme/maps/bookmarks/data/FeatureId;JJLjava/lang/String;"
|
||||
"Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;"
|
||||
"[Lcom/mapswithme/maps/ads/Banner;[ILjava/lang/String;"
|
||||
"Lcom/mapswithme/maps/ads/LocalAdInfo;"
|
||||
"Lcom/mapswithme/maps/routing/RoutePointInfo;"
|
||||
"IZZZ[Lcom/mapswithme/maps/ugc/UGC$Rating;"
|
||||
"Lcom/mapswithme/maps/search/HotelsFilter$HotelType;"
|
||||
"ILcom/mapswithme/maps/search/Popularity;Ljava/lang/String;"
|
||||
"[Ljava/lang/String;)V");
|
||||
// public FeatureId(@NonNull String mwmName, long mwmVersion, int featureIndex)
|
||||
static jmethodID const featureCtorId =
|
||||
jni::GetConstructorID(env, g_featureIdClazz, "(Ljava/lang/String;JI)V");
|
||||
|
||||
auto const bookmarkId = info.GetBookmarkId();
|
||||
auto const categoryId = info.GetBookmarkCategoryId();
|
||||
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.GetAddress()));
|
||||
jni::TScopedLocalRef jDescription(env, jni::ToJavaString(env, info.GetDescription()));
|
||||
jni::TScopedLocalRef jBookingSearchUrl(env, jni::ToJavaString(env, info.GetBookingSearchUrl()));
|
||||
jobject mapObject = env->NewObject(
|
||||
g_bookmarkClazz, ctorId, jFeatureId.get(), static_cast<jlong>(categoryId),
|
||||
static_cast<jlong>(bookmarkId), jTitle.get(), jSecondaryTitle.get(), jSubtitle.get(),
|
||||
jAddress.get(), jbanners.get(), jTaxiTypes.get(), jBookingSearchUrl.get(),
|
||||
localAdInfo.get(), routingPointInfo.get(), info.GetOpeningMode(), info.ShouldShowUGC(),
|
||||
info.CanBeRated(), info.CanBeReviewed(), jratings.get(), hotelType.get(), priceRate,
|
||||
popularity.get(), jDescription.get(), jrawTypes.get());
|
||||
|
||||
if (info.IsFeature())
|
||||
InjectMetadata(env, g_mapObjectClazz, mapObject, info.GetMetadata());
|
||||
return mapObject;
|
||||
return CreateBookmark(env, info, jbanners, jratings, jTaxiTypes, jrawTypes, localAdInfo,
|
||||
routingPointInfo, hotelType, popularity, priceRate);
|
||||
}
|
||||
|
||||
ms::LatLon const ll = info.GetLatLon();
|
||||
|
|
|
@ -34,6 +34,8 @@ void InjectMetadata(JNIEnv * env, jclass clazz, jobject const mapObject, feature
|
|||
|
||||
jobject CreateMapObject(JNIEnv * env, place_page::Info const & info);
|
||||
|
||||
jobject CreateElevationInfo(JNIEnv * env, ElevationInfo const & info);
|
||||
|
||||
jobjectArray ToBannersArray(JNIEnv * env, std::vector<ads::Banner> const & banners);
|
||||
|
||||
jobjectArray ToRatingArray(JNIEnv * env, std::vector<std::string> const & ratingCategories);
|
||||
|
|
|
@ -0,0 +1,106 @@
|
|||
package com.mapswithme.maps.bookmarks.data;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class ElevationInfo
|
||||
{
|
||||
private final long mId;
|
||||
@NonNull
|
||||
private final String mName;
|
||||
@NonNull
|
||||
private final List<Point> mPoints;
|
||||
private final int mAscent;
|
||||
private final int mDescent;
|
||||
private final int mMinAltitude;
|
||||
private final int mMaxAltitude;
|
||||
private final int mDifficulty;
|
||||
private final long m_duration;
|
||||
|
||||
public ElevationInfo(long trackId, @NonNull String name, @NonNull Point[] points,
|
||||
int ascent, int descent, int minAltitude, int maxAltitude, int difficulty,
|
||||
long m_duration)
|
||||
{
|
||||
mId = trackId;
|
||||
mName = name;
|
||||
mPoints = Arrays.asList(points);
|
||||
mAscent = ascent;
|
||||
mDescent = descent;
|
||||
mMinAltitude = minAltitude;
|
||||
mMaxAltitude = maxAltitude;
|
||||
mDifficulty = difficulty;
|
||||
this.m_duration = m_duration;
|
||||
}
|
||||
|
||||
public long getId()
|
||||
{
|
||||
return mId;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public String getName()
|
||||
{
|
||||
return mName;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public List<Point> getPoints()
|
||||
{
|
||||
return Collections.unmodifiableList(mPoints);
|
||||
}
|
||||
|
||||
public int getAscent()
|
||||
{
|
||||
return mAscent;
|
||||
}
|
||||
|
||||
public int getDescent()
|
||||
{
|
||||
return mDescent;
|
||||
}
|
||||
|
||||
public int getMinAltitude()
|
||||
{
|
||||
return mMinAltitude;
|
||||
}
|
||||
|
||||
public int getMaxAltitude()
|
||||
{
|
||||
return mMaxAltitude;
|
||||
}
|
||||
|
||||
public int getDifficulty()
|
||||
{
|
||||
return mDifficulty;
|
||||
}
|
||||
|
||||
public long getM_duration()
|
||||
{
|
||||
return m_duration;
|
||||
}
|
||||
|
||||
public static class Point
|
||||
{
|
||||
private final double mDistance;
|
||||
private final int mAltitude;
|
||||
|
||||
public Point(double distance, int altitude)
|
||||
{
|
||||
mDistance = distance;
|
||||
mAltitude = altitude;
|
||||
}
|
||||
|
||||
public double getDistance()
|
||||
{
|
||||
return mDistance;
|
||||
}
|
||||
|
||||
public int getAltitude()
|
||||
{
|
||||
return mAltitude;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue