diff options
Diffstat (limited to 'platform/android/src/file_source.cpp')
-rw-r--r-- | platform/android/src/file_source.cpp | 42 |
1 files changed, 39 insertions, 3 deletions
diff --git a/platform/android/src/file_source.cpp b/platform/android/src/file_source.cpp index 41081cd0fb..ba5f18dbc4 100644 --- a/platform/android/src/file_source.cpp +++ b/platform/android/src/file_source.cpp @@ -77,10 +77,25 @@ void FileSource::setResourceTransform(jni::JNIEnv& env, const jni::Object<FileSo } } -void FileSource::setResourceCachePath(jni::JNIEnv& env, const jni::String& path) { +void FileSource::setResourceCachePath(jni::JNIEnv& env, const jni::String& path, + const jni::Object<FileSource::ResourcesCachePathChangeCallback>& _callback) { + if (pathChangeCallback) { + FileSource::ResourcesCachePathChangeCallback::onError(env, _callback, jni::Make<jni::String>(env, "Another resources cache path change is in progress")); + return; + } + std::string newPath = jni::Make<std::string>(env, path); mapbox::sqlite::setTempPath(newPath); - fileSource->setResourceCachePath(newPath + DATABASE_FILE); + + auto global = jni::NewGlobal<jni::EnvAttachingDeleter>(env, _callback); + pathChangeCallback = std::make_unique<Actor<PathChangeCallback>>(*Scheduler::GetCurrent(), + [this, callback = std::make_shared<decltype(global)>(std::move(global)), newPath] { + android::UniqueEnv _env = android::AttachEnv(); + FileSource::ResourcesCachePathChangeCallback::onSuccess(*_env, *callback, jni::Make<jni::String>(*_env, newPath)); + pathChangeCallback.reset(); + }); + + fileSource->setResourceCachePath(newPath + DATABASE_FILE, pathChangeCallback->self()); } void FileSource::resume(jni::JNIEnv&) { @@ -123,11 +138,32 @@ mbgl::ResourceOptions FileSource::getSharedResourceOptions(jni::JNIEnv& env, con return fileSource->resourceOptions.clone(); } +// FileSource::ResourcesCachePathChangeCallback // + +void FileSource::ResourcesCachePathChangeCallback::onSuccess(jni::JNIEnv& env, + const jni::Object<FileSource::ResourcesCachePathChangeCallback>& callback, + const jni::String& path) { + static auto& javaClass = jni::Class<FileSource::ResourcesCachePathChangeCallback>::Singleton(env); + static auto method = javaClass.GetMethod<void (jni::String)>(env, "onSuccess"); + + callback.Call(env, method, path); +} + +void FileSource::ResourcesCachePathChangeCallback::onError(jni::JNIEnv& env, + const jni::Object<FileSource::ResourcesCachePathChangeCallback>& callback, + const jni::String& message) { + static auto& javaClass = jni::Class<FileSource::ResourcesCachePathChangeCallback>::Singleton(env); + static auto method = javaClass.GetMethod<void (jni::String)>(env, "onError"); + + callback.Call(env, method, message); +} + void FileSource::registerNative(jni::JNIEnv& env) { - // Ensure the class for ResourceTransformCallback is cached. If it's requested for the + // Ensure the classes are cached. If they're requested for the // first time on a background thread, Android's class loader heuristics will fail. // https://developer.android.com/training/articles/perf-jni#faq_FindClass jni::Class<ResourceTransformCallback>::Singleton(env); + jni::Class<ResourcesCachePathChangeCallback>::Singleton(env); static auto& javaClass = jni::Class<FileSource>::Singleton(env); |