From c311e69e0ef61f5203fa6cf632d5ec73b1e181da Mon Sep 17 00:00:00 2001 From: Tobrun Date: Wed, 6 Dec 2017 11:51:33 +0100 Subject: [android] - add FileSource activation/deactivation to MapSnapshotter, handle multiple deactivate scenario in FileSource (#10556) --- .../com/mapbox/mapboxsdk/storage/FileSource.java | 24 ++-------------- platform/android/src/file_source.cpp | 19 ++++++++++--- platform/android/src/file_source.hpp | 1 + .../android/src/snapshotter/map_snapshotter.cpp | 33 +++++++++++++++++----- .../android/src/snapshotter/map_snapshotter.hpp | 5 ++++ 5 files changed, 49 insertions(+), 33 deletions(-) diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/storage/FileSource.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/storage/FileSource.java index 41dc449b50..f0cb8d973a 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/storage/FileSource.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/storage/FileSource.java @@ -6,10 +6,8 @@ import android.content.pm.PackageManager; import android.content.res.AssetManager; import android.os.Environment; import android.support.annotation.NonNull; - import com.mapbox.mapboxsdk.Mapbox; import com.mapbox.mapboxsdk.constants.MapboxConstants; - import timber.log.Timber; /** @@ -119,28 +117,14 @@ public class FileSource { } private long nativePtr; - private long activeCounter; - private boolean wasPaused; private FileSource(String cachePath, AssetManager assetManager) { initialize(Mapbox.getAccessToken(), cachePath, assetManager); } - public void activate() { - activeCounter++; - if (activeCounter == 1 && wasPaused) { - wasPaused = false; - resume(); - } - } + public native void activate(); - public void deactivate() { - activeCounter--; - if (activeCounter == 0) { - wasPaused = true; - pause(); - } - } + public native void deactivate(); public native void setAccessToken(@NonNull String accessToken); @@ -148,10 +132,6 @@ public class FileSource { public native void setApiBaseUrl(String baseUrl); - private native void resume(); - - private native void pause(); - /** * Sets a callback for transforming URLs requested from the internet *

diff --git a/platform/android/src/file_source.cpp b/platform/android/src/file_source.cpp index a576661a4f..6a9d7badb0 100644 --- a/platform/android/src/file_source.cpp +++ b/platform/android/src/file_source.cpp @@ -63,11 +63,22 @@ void FileSource::setResourceTransform(jni::JNIEnv& env, jni::Objectresume(); + if (!activationCounter) { + activationCounter = optional(1) ; + return; + } + + activationCounter.value()++; + if (activationCounter == 1) { + fileSource->resume(); + } } void FileSource::pause(jni::JNIEnv&) { - fileSource->pause(); + activationCounter.value()--; + if (activationCounter == 0) { + fileSource->pause(); + } } jni::Class FileSource::javaClass; @@ -100,8 +111,8 @@ void FileSource::registerNative(jni::JNIEnv& env) { METHOD(&FileSource::setAccessToken, "setAccessToken"), METHOD(&FileSource::setAPIBaseUrl, "setApiBaseUrl"), METHOD(&FileSource::setResourceTransform, "setResourceTransform"), - METHOD(&FileSource::resume, "resume"), - METHOD(&FileSource::pause, "pause") + METHOD(&FileSource::resume, "activate"), + METHOD(&FileSource::pause, "deactivate") ); } diff --git a/platform/android/src/file_source.hpp b/platform/android/src/file_source.hpp index 2933aedf86..194f784622 100644 --- a/platform/android/src/file_source.hpp +++ b/platform/android/src/file_source.hpp @@ -54,6 +54,7 @@ public: static void registerNative(jni::JNIEnv&); private: + optional activationCounter; std::unique_ptr> resourceTransform; std::unique_ptr fileSource; }; diff --git a/platform/android/src/snapshotter/map_snapshotter.cpp b/platform/android/src/snapshotter/map_snapshotter.cpp index 637eb5c1fd..71f8b4f4c0 100644 --- a/platform/android/src/snapshotter/map_snapshotter.cpp +++ b/platform/android/src/snapshotter/map_snapshotter.cpp @@ -15,7 +15,7 @@ namespace android { MapSnapshotter::MapSnapshotter(jni::JNIEnv& _env, jni::Object _obj, - jni::Object jFileSource, + jni::Object _jFileSource, jni::jfloat _pixelRatio, jni::jint width, jni::jint height, @@ -34,16 +34,16 @@ MapSnapshotter::MapSnapshotter(jni::JNIEnv& _env, return; } - auto& fileSource = mbgl::android::FileSource::getDefaultFileSource(_env, jFileSource); + jFileSource = FileSource::getNativePeer(_env, _jFileSource); + auto& fileSource = mbgl::android::FileSource::getDefaultFileSource(_env, _jFileSource); auto size = mbgl::Size { static_cast(width), static_cast(height) }; auto cameraOptions = position ? CameraPosition::getCameraOptions(_env, position) : CameraOptions(); optional bounds; if (region) { bounds = LatLngBounds::getLatLngBounds(_env, region); } - + showLogo = _showLogo; - // Create the core snapshotter snapshotter = std::make_unique(fileSource, *threadPool, @@ -58,8 +58,9 @@ MapSnapshotter::MapSnapshotter(jni::JNIEnv& _env, MapSnapshotter::~MapSnapshotter() = default; -void MapSnapshotter::start(JNIEnv&) { +void MapSnapshotter::start(JNIEnv& env) { MBGL_VERIFY_THREAD(tid); + activateFilesource(env); snapshotCallback = std::make_unique>( *Scheduler::GetCurrent(), @@ -79,17 +80,19 @@ void MapSnapshotter::start(JNIEnv&) { static auto onSnapshotReady = javaClass.GetMethod)>(*_env, "onSnapshotReady"); javaPeer->Call(*_env, onSnapshotReady, mapSnapshot); } + + deactivateFilesource(*_env); }); snapshotter->snapshot(snapshotCallback->self()); } -void MapSnapshotter::cancel(JNIEnv&) { +void MapSnapshotter::cancel(JNIEnv& env) { MBGL_VERIFY_THREAD(tid); snapshotCallback.reset(); + deactivateFilesource(env); } - void MapSnapshotter::setStyleUrl(JNIEnv& env, jni::String styleURL) { snapshotter->setStyleURL(jni::Make(env, styleURL)); } @@ -108,6 +111,22 @@ void MapSnapshotter::setRegion(JNIEnv& env, jni::Object region) { snapshotter->setRegion(LatLngBounds::getLatLngBounds(env, region)); } +// Private methods // + +void MapSnapshotter::activateFilesource(JNIEnv& env) { + if (!activatedFilesource) { + activatedFilesource = true; + jFileSource->resume(env); + } +} + +void MapSnapshotter::deactivateFilesource(JNIEnv& env) { + if (activatedFilesource) { + activatedFilesource = false; + jFileSource->pause(env); + } +} + // Static methods // jni::Class MapSnapshotter::javaClass; diff --git a/platform/android/src/snapshotter/map_snapshotter.hpp b/platform/android/src/snapshotter/map_snapshotter.hpp index 8cd85060bf..4cdf4bcf2b 100644 --- a/platform/android/src/snapshotter/map_snapshotter.hpp +++ b/platform/android/src/snapshotter/map_snapshotter.hpp @@ -65,6 +65,11 @@ private: std::shared_ptr threadPool; std::unique_ptr> snapshotCallback; std::unique_ptr snapshotter; + + FileSource *jFileSource; + void activateFilesource(JNIEnv&); + void deactivateFilesource(JNIEnv&); + bool activatedFilesource = false; }; } // namespace android -- cgit v1.2.1