summaryrefslogtreecommitdiff
path: root/platform/android/src/jni.cpp
diff options
context:
space:
mode:
authorTobrun <tobrun.van.nuland@gmail.com>2016-09-28 07:48:01 +0200
committerGitHub <noreply@github.com>2016-09-28 07:48:01 +0200
commit3835ed556b03a7246d238e1ee1a52f3aac29ec98 (patch)
treed0e976a9b0a8f9b9513f757c0f6a24e81dce69f5 /platform/android/src/jni.cpp
parent73baa527100a311a3ab4e056b138ff5fc0e63700 (diff)
downloadqtlocation-mapboxgl-3835ed556b03a7246d238e1ee1a52f3aac29ec98.tar.gz
6402 update offline metadata android (#6456)
* [android] - update offline metadata jni integration * extract offline utils for reuse * add test activity for update metadata * fix requested signature changes
Diffstat (limited to 'platform/android/src/jni.cpp')
-rwxr-xr-xplatform/android/src/jni.cpp56
1 files changed, 55 insertions, 1 deletions
diff --git a/platform/android/src/jni.cpp b/platform/android/src/jni.cpp
index 03e66c5895..62d4ea1eed 100755
--- a/platform/android/src/jni.cpp
+++ b/platform/android/src/jni.cpp
@@ -137,6 +137,9 @@ jni::jfieldID* offlineRegionDefinitionPixelRatioId = nullptr;
jni::jmethodID* createOnCreateMethodId = nullptr;
jni::jmethodID* createOnErrorMethodId = nullptr;
+jni::jmethodID* updateMetadataOnUpdateMethodId = nullptr;
+jni::jmethodID* updateMetadataOnErrorMethodId = nullptr;
+
jni::jmethodID* offlineRegionObserveronStatusChangedId = nullptr;
jni::jmethodID* offlineRegionObserveronErrorId = nullptr;
jni::jmethodID* offlineRegionObserveronLimitId = nullptr;
@@ -1670,6 +1673,52 @@ void deleteOfflineRegion(JNIEnv *env, jni::jobject* offlineRegion_, jni::jobject
});
}
+void updateOfflineRegionMetadata(JNIEnv *env, jni::jobject* offlineRegion_, jni::jarray<jbyte>* metadata_, jni::jobject* updateCallback) {
+ mbgl::Log::Debug(mbgl::Event::JNI, "updateOfflineRegionMetadata");
+
+ // Offline region
+ mbgl::OfflineRegion* offlineRegion = getOfflineRegionPeer(env, offlineRegion_);
+
+ // File source
+ jni::jobject* jmanager = jni::GetField<jni::jobject*>(*env, offlineRegion_, *offlineRegionOfflineManagerId);
+ jlong defaultFileSourcePtr = jni::GetField<jlong>(*env, jmanager, *offlineManagerClassPtrId);
+ mbgl::DefaultFileSource *defaultFileSource = reinterpret_cast<mbgl::DefaultFileSource *>(defaultFileSourcePtr);
+
+ // Id conversion
+ int64_t id = offlineRegion->getID();
+
+ // Metadata
+ mbgl::OfflineRegionMetadata metadata;
+ if (metadata_ != nullptr) {
+ metadata = metadata_from_java(env, *metadata_);
+ }
+
+ // Makes sure the objects don't get GC'ed
+ updateCallback = jni::NewGlobalRef(*env, updateCallback).release();
+
+ // Launch updateCallback
+ defaultFileSource->updateOfflineMetadata(id, metadata, [updateCallback] (std::exception_ptr error, mbgl::optional<mbgl::OfflineRegionMetadata> data) mutable {
+ // Reattach, the callback comes from a different thread
+ JNIEnv *env2;
+ jboolean renderDetach = attach_jni_thread(theJVM, &env2, "Offline Thread");
+ if (renderDetach) {
+ mbgl::Log::Debug(mbgl::Event::JNI, "Attached.");
+ }
+
+ if (error) {
+ std::string message = mbgl::util::toString(error);
+ jni::CallMethod<void>(*env2, updateCallback, *updateMetadataOnErrorMethodId, std_string_to_jstring(env2, message));
+ } else if (data) {
+ jni::jarray<jbyte>* jmetadata = metadata_from_native(env2, *data);
+ jni::CallMethod<void>(*env2, updateCallback, *updateMetadataOnUpdateMethodId, jmetadata);
+ }
+
+ // Delete global refs and detach when we're done
+ jni::DeleteGlobalRef(*env2, jni::UniqueGlobalRef<jni::jobject>(updateCallback));
+ detach_jni_thread(theJVM, &env2, renderDetach);
+ });
+}
+
// Offline calls end
}
@@ -1900,7 +1949,8 @@ extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) {
MAKE_NATIVE_METHOD(setOfflineRegionObserver, "(Lcom/mapbox/mapboxsdk/offline/OfflineRegion$OfflineRegionObserver;)V"),
MAKE_NATIVE_METHOD(setOfflineRegionDownloadState, "(I)V"),
MAKE_NATIVE_METHOD(getOfflineRegionStatus, "(Lcom/mapbox/mapboxsdk/offline/OfflineRegion$OfflineRegionStatusCallback;)V"),
- MAKE_NATIVE_METHOD(deleteOfflineRegion, "(Lcom/mapbox/mapboxsdk/offline/OfflineRegion$OfflineRegionDeleteCallback;)V")
+ MAKE_NATIVE_METHOD(deleteOfflineRegion, "(Lcom/mapbox/mapboxsdk/offline/OfflineRegion$OfflineRegionDeleteCallback;)V"),
+ MAKE_NATIVE_METHOD(updateOfflineRegionMetadata, "([BLcom/mapbox/mapboxsdk/offline/OfflineRegion$OfflineRegionUpdateMetadataCallback;)V")
);
// This needs to be updated once we support more than one type of region definition
@@ -1943,6 +1993,10 @@ extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) {
offlineRegionDeleteOnDeleteId = &jni::GetMethodID(env, *offlineRegionDeleteCallbackClass, "onDelete", "()V");
offlineRegionDeleteOnErrorId = &jni::GetMethodID(env, *offlineRegionDeleteCallbackClass, "onError", "(Ljava/lang/String;)V");
+ jni::jclass* offlineRegionUpdateMetadataCallbackClass = &jni::FindClass(env, "com/mapbox/mapboxsdk/offline/OfflineRegion$OfflineRegionUpdateMetadataCallback");
+ updateMetadataOnUpdateMethodId = &jni::GetMethodID(env, *offlineRegionUpdateMetadataCallbackClass, "onUpdate", "([B)V");
+ updateMetadataOnErrorMethodId = &jni::GetMethodID(env, *offlineRegionUpdateMetadataCallbackClass, "onError", "(Ljava/lang/String;)V");
+
// Offline end
char release[PROP_VALUE_MAX] = "";