[android] Load predefined colors from core

Signed-off-by: Andrei Shkrob <github@shkrob.dev>
This commit is contained in:
Andrei Shkrob
2025-07-19 15:07:48 +02:00
committed by Konstantin Pastbin
parent ebc5370052
commit d9335c0b6c
17 changed files with 180 additions and 151 deletions

View File

@@ -43,6 +43,8 @@ set(SRC
app/organicmaps/sdk/core/jni_java_methods.cpp
app/organicmaps/sdk/core/logging.cpp
app/organicmaps/sdk/bookmarks/data/BookmarkManager.cpp
app/organicmaps/sdk/bookmarks/data/PredefinedColors.cpp
app/organicmaps/sdk/bookmarks/data/PredefinedColors.hpp
app/organicmaps/sdk/DownloadResourcesLegacyActivity.cpp
app/organicmaps/sdk/editor/Editor.cpp
app/organicmaps/sdk/editor/OpeningHours.cpp

View File

@@ -532,16 +532,10 @@ Java_app_organicmaps_sdk_bookmarks_data_BookmarkManager_nativeGetTrack(
ASSERT(nTrack, ("Track must not be null with id:)", trackId));
dp::Color nColor = nTrack->GetColor(0);
jint androidColor = shift(nColor.GetAlpha(), 24) +
shift(nColor.GetRed(), 16) +
shift(nColor.GetGreen(), 8) +
nColor.GetBlue();
return env->NewObject(trackClazz, cId,
trackId, static_cast<jlong>(nTrack->GetGroupId()), jni::ToJavaString(env, nTrack->GetName()),
ToJavaDistance(env, platform::Distance::CreateFormatted(nTrack->GetLengthMeters())), androidColor);
return env->NewObject(trackClazz, cId, trackId, static_cast<jlong>(nTrack->GetGroupId()),
jni::ToJavaString(env, nTrack->GetName()),
ToJavaDistance(env, platform::Distance::CreateFormatted(nTrack->GetLengthMeters())),
nTrack->GetColor(0).GetARGB());
}
JNIEXPORT jlong JNICALL

View File

@@ -0,0 +1,40 @@
#include "PredefinedColors.hpp"
#include "kml/types.hpp"
#include <array>
extern "C"
{
JNIEXPORT jintArray JNICALL
Java_app_organicmaps_sdk_bookmarks_data_PredefinedColors_nativeGetPredefinedColors(JNIEnv * env, jclass)
{
std::array<jint, static_cast<size_t>(kml::PredefinedColor::Count)> colors{};
for (size_t i = 0; i < static_cast<size_t>(kml::PredefinedColor::Count); ++i)
colors[i] = static_cast<jint>(kml::ColorFromPredefinedColor(static_cast<kml::PredefinedColor>(i)).GetARGB());
jintArray jColors = env->NewIntArray(colors.size());
env->SetIntArrayRegion(jColors, 0, static_cast<jsize>(colors.size()), colors.data());
return jColors;
}
}
namespace
{
JNINativeMethod const methods[] = {
{"nativeGetPredefinedColors", "()[I",
reinterpret_cast<void *>(&Java_app_organicmaps_sdk_bookmarks_data_PredefinedColors_nativeGetPredefinedColors)},
};
}
namespace predefined_colors
{
jint registerNativeMethods(JNIEnv * env)
{
jclass clazz = env->FindClass("app/organicmaps/sdk/bookmarks/data/PredefinedColors");
if (clazz == nullptr)
return JNI_ERR;
return env->RegisterNatives(clazz, methods, std::size(methods));
}
} // namespace predefined_colors

View File

@@ -0,0 +1,8 @@
#pragma once
#include <jni.h>
namespace predefined_colors
{
jint registerNativeMethods(JNIEnv * env);
}

View File

@@ -1,11 +1,13 @@
#include "jni_helper.hpp"
#include "logging.hpp"
#include "ScopedLocalRef.hpp"
#include "logging.hpp"
#include "base/assert.hpp"
#include "base/exception.hpp"
#include "base/string_utils.hpp"
#include "app/organicmaps/sdk/bookmarks/data/PredefinedColors.hpp"
#include <vector>
static JavaVM * g_jvm = 0;
@@ -31,21 +33,21 @@ extern "C"
{
int __system_property_get(char const * name, char * value);
static bool IsAndroidLowerThan7()
static bool IsAndroidApiLowerThan(int apiLevel)
{
char value[92] = { 0 };
if (__system_property_get("ro.build.version.sdk", value) < 1)
return false;
const int apiLevel = atoi(value);
if (apiLevel > 0 && apiLevel < 24)
int const deviceApiLevel = atoi(value);
if (deviceApiLevel > 0 && deviceApiLevel < apiLevel)
return true;
return false;
}
static bool const g_isAndroidLowerThan7 = IsAndroidLowerThan7();
static bool const g_isAndroidLowerThan12 = IsAndroidApiLowerThan(30);
static bool const g_isAndroidLowerThan7 = g_isAndroidLowerThan12 && IsAndroidApiLowerThan(24);
JNIEXPORT jint JNICALL
JNI_OnLoad(JavaVM * jvm, void *)
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM * jvm, void *)
{
g_jvm = jvm;
jni::InitSystemLog();
@@ -64,6 +66,12 @@ JNI_OnLoad(JavaVM * jvm, void *)
g_networkPolicyClazz = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/util/NetworkPolicy");
g_elevationInfoClazz = jni::GetGlobalClassRef(env, "app/organicmaps/sdk/bookmarks/data/ElevationInfo");
if (g_isAndroidLowerThan12)
{
if (predefined_colors::registerNativeMethods(env) != JNI_OK)
return JNI_ERR;
}
return JNI_VERSION_1_6;
}
@@ -84,7 +92,7 @@ JNI_OnUnload(JavaVM *, void *)
env->DeleteGlobalRef(g_networkPolicyClazz);
env->DeleteGlobalRef(g_elevationInfoClazz);
}
} // extern "C"
} // extern "C"
namespace jni
{