From c5300ebabf6d01a11aca00df5eee350f49b5cbf1 Mon Sep 17 00:00:00 2001 From: Ivo van Dongen Date: Tue, 18 Jul 2017 16:26:24 +0200 Subject: [android] add api to enable/disable tile prefetching --- .../java/com/mapbox/mapboxsdk/maps/MapboxMap.java | 33 ++++++++++++++++++++++ .../mapbox/mapboxsdk/maps/MapboxMapOptions.java | 33 ++++++++++++++++++++++ .../com/mapbox/mapboxsdk/maps/NativeMapView.java | 18 ++++++++++++ .../src/main/res/values/attrs.xml | 2 ++ .../mapboxsdk/maps/MapboxMapOptionsTest.java | 10 +++++++ .../com/mapbox/mapboxsdk/maps/MapboxMapTest.java | 16 +++++++++++ platform/android/src/native_map_view.cpp | 13 ++++++++- platform/android/src/native_map_view.hpp | 4 +++ 8 files changed, 128 insertions(+), 1 deletion(-) (limited to 'platform') diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java index 6233efa966..f47fcdfd4a 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java @@ -99,6 +99,7 @@ public final class MapboxMap { setDebugActive(options.getDebugActive()); setApiBaseUrl(options); setStyleUrl(options); + setPrefetchesTiles(options); } /** @@ -247,6 +248,38 @@ public final class MapboxMap { nativeMapView.setTransitionDelay(delayMs); } + /** + * Sets tile pre-fetching from MapboxOptions. + * + * @param options the options object + */ + private void setPrefetchesTiles(@NonNull MapboxMapOptions options) { + setPrefetchesTiles(options.getPrefetchesTiles()); + } + + /** + * Enable or disable tile pre-fetching. Pre-fetching makes sure that a low-resolution + * tile is rendered as soon as possible at the expense of a little bandwidth. + * + * @param enable true to enable + */ + @UiThread + public void setPrefetchesTiles(boolean enable) { + nativeMapView.setPrefetchesTiles(enable); + } + + /** + * Check whether tile pre-fetching is enabled or not. + * + * @return true if enabled + * + * @see MapboxMap#setPrefetchesTiles(boolean) + */ + @UiThread + public boolean getPrefetchesTiles() { + return nativeMapView.getPrefetchesTiles(); + } + /** * Retrieve all the layers in the style * diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMapOptions.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMapOptions.java index e2f4123e95..4301d64375 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMapOptions.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMapOptions.java @@ -80,6 +80,7 @@ public class MapboxMapOptions implements Parcelable { private int myLocationAccuracyTintColor; private int myLocationAccuracyAlpha; private float myLocationAccuracyThreshold; + private boolean prefetchesTiles = true; private String apiBaseUrl; @@ -154,6 +155,7 @@ public class MapboxMapOptions implements Parcelable { style = in.readString(); apiBaseUrl = in.readString(); textureMode = in.readByte() != 0; + prefetchesTiles = in.readByte() != 0; } static Bitmap getBitmapFromDrawable(Drawable drawable) { @@ -297,6 +299,8 @@ public class MapboxMapOptions implements Parcelable { typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_myLocationAccuracyThreshold, 0)); mapboxMapOptions.textureMode( typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_renderTextureMode, false)); + mapboxMapOptions.setPrefetchesTiles( + typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_enableTilePrefetch, true)); } finally { typedArray.recycle(); } @@ -711,6 +715,30 @@ public class MapboxMapOptions implements Parcelable { return this; } + /** + * Enable tile pre-fetching. Loads tiles at a lower zoom-level to pre-render + * a low resolution preview while more detailed tiles are loaded. + * + * Enabled by default + * + * @param enable true to enable + * + * @return This + */ + public MapboxMapOptions setPrefetchesTiles(boolean enable) { + this.prefetchesTiles = enable; + return this; + } + + /** + * Check whether tile pre-fetching is enabled. + * + * @return true if enabled + */ + public boolean getPrefetchesTiles() { + return prefetchesTiles; + } + /** * Get the current configured API endpoint base URL. * @@ -1094,6 +1122,7 @@ public class MapboxMapOptions implements Parcelable { dest.writeString(style); dest.writeString(apiBaseUrl); dest.writeByte((byte) (textureMode ? 1 : 0)); + dest.writeByte((byte) (prefetchesTiles ? 1 : 0)); } @Override @@ -1217,6 +1246,9 @@ public class MapboxMapOptions implements Parcelable { if (apiBaseUrl != null ? !apiBaseUrl.equals(options.apiBaseUrl) : options.apiBaseUrl != null) { return false; } + if (prefetchesTiles != options.prefetchesTiles) { + return false; + } return false; } @@ -1263,6 +1295,7 @@ public class MapboxMapOptions implements Parcelable { result = 31 * result + (apiBaseUrl != null ? apiBaseUrl.hashCode() : 0); result = 31 * result + (textureMode ? 1 : 0); result = 31 * result + (style != null ? style.hashCode() : 0); + result = 31 * result + (prefetchesTiles ? 1 : 0); return result; } } diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java index 34ac5b9eaf..52596358e2 100755 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java @@ -638,6 +638,20 @@ final class NativeMapView { return nativeGetCameraPosition(); } + public void setPrefetchesTiles(boolean enable) { + if (isDestroyedOn("setPrefetchesTiles")) { + return; + } + nativeSetPrefetchesTiles(enable); + } + + public boolean getPrefetchesTiles() { + if (isDestroyedOn("getPrefetchesTiles")) { + return false; + } + return nativeGetPrefetchesTiles(); + } + // Runtime style Api public long getTransitionDuration() { @@ -1072,6 +1086,10 @@ final class NativeMapView { private native Light nativeGetLight(); + private native void nativeSetPrefetchesTiles(boolean enable); + + private native boolean nativeGetPrefetchesTiles(); + int getWidth() { if (isDestroyedOn("")) { return 0; diff --git a/platform/android/MapboxGLAndroidSDK/src/main/res/values/attrs.xml b/platform/android/MapboxGLAndroidSDK/src/main/res/values/attrs.xml index e20b640d9e..a7ef78d699 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/res/values/attrs.xml +++ b/platform/android/MapboxGLAndroidSDK/src/main/res/values/attrs.xml @@ -117,6 +117,8 @@ + + diff --git a/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/maps/MapboxMapOptionsTest.java b/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/maps/MapboxMapOptionsTest.java index ce0cb00b0b..4f929641f3 100644 --- a/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/maps/MapboxMapOptionsTest.java +++ b/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/maps/MapboxMapOptionsTest.java @@ -186,5 +186,15 @@ public class MapboxMapOptionsTest { assertEquals(Color.BLUE, new MapboxMapOptions() .myLocationBackgroundTintColor(Color.BLUE).getMyLocationBackgroundTintColor()); } + + @Test + public void testPrefetchesTiles() { + // Default value + assertTrue(new MapboxMapOptions().getPrefetchesTiles()); + + // Check mutations + assertTrue(new MapboxMapOptions().setPrefetchesTiles(true).getPrefetchesTiles()); + assertFalse(new MapboxMapOptions().setPrefetchesTiles(false).getPrefetchesTiles()); + } } diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/maps/MapboxMapTest.java b/platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/maps/MapboxMapTest.java index a813b7f368..294d57bce1 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/maps/MapboxMapTest.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/maps/MapboxMapTest.java @@ -779,6 +779,22 @@ public class MapboxMapTest extends BaseActivityTest { })); } + // Tile pre-fetching + + @Test + public void testTilePrefetch() { + validateTestSetup(); + onView(withId(R.id.mapView)).perform(new MapboxMapAction(new InvokeViewAction() { + @Override + public void onViewAction(UiController uiController, View view) { + mapboxMap.setPrefetchesTiles(true); + assertTrue(mapboxMap.getPrefetchesTiles()); + mapboxMap.setPrefetchesTiles(false); + assertFalse(mapboxMap.getPrefetchesTiles()); + } + })); + } + private class MapboxMapAction implements ViewAction { private InvokeViewAction invokeViewAction; diff --git a/platform/android/src/native_map_view.cpp b/platform/android/src/native_map_view.cpp index 5a03f8af4a..5f89217485 100755 --- a/platform/android/src/native_map_view.cpp +++ b/platform/android/src/native_map_view.cpp @@ -1037,6 +1037,15 @@ void NativeMapView::removeImage(JNIEnv& env, jni::String name) { map->getStyle().removeImage(jni::Make(env, name)); } + +void NativeMapView::setPrefetchesTiles(JNIEnv&, jni::jboolean enable) { + map->setPrefetchZoomDelta(enable ? util::DEFAULT_PREFETCH_ZOOM_DELTA : uint8_t(0)); +} + +jni::jboolean NativeMapView::getPrefetchesTiles(JNIEnv&) { + return jni::jboolean(map->getPrefetchZoomDelta() > 0); +} + // Private methods // void NativeMapView::_initializeDisplay() { @@ -1537,7 +1546,9 @@ void NativeMapView::registerNative(jni::JNIEnv& env) { METHOD(&NativeMapView::removeSource, "nativeRemoveSource"), METHOD(&NativeMapView::addImage, "nativeAddImage"), METHOD(&NativeMapView::removeImage, "nativeRemoveImage"), - METHOD(&NativeMapView::setLatLngBounds, "nativeSetLatLngBounds") + METHOD(&NativeMapView::setLatLngBounds, "nativeSetLatLngBounds"), + METHOD(&NativeMapView::setPrefetchesTiles, "nativeSetPrefetchesTiles"), + METHOD(&NativeMapView::getPrefetchesTiles, "nativeGetPrefetchesTiles") ); } diff --git a/platform/android/src/native_map_view.hpp b/platform/android/src/native_map_view.hpp index 9bf02de82b..387593350a 100755 --- a/platform/android/src/native_map_view.hpp +++ b/platform/android/src/native_map_view.hpp @@ -255,6 +255,10 @@ public: void removeImage(JNIEnv&, jni::String); + void setPrefetchesTiles(JNIEnv&, jni::jboolean); + + jni::jboolean getPrefetchesTiles(JNIEnv&); + protected: // mbgl::RendererBackend // -- cgit v1.2.1