From 218dcf2a330b7ad112780c14a4ba6ce5dd94499e Mon Sep 17 00:00:00 2001 From: Chris Loer Date: Fri, 15 Dec 2017 09:12:04 -0800 Subject: [android] Add Configuration hook for local ideograph font family and demo activity --- .../java/com/mapbox/mapboxsdk/maps/MapView.java | 4 +- .../mapbox/mapboxsdk/maps/MapboxMapOptions.java | 31 +++++++++ .../mapboxsdk/maps/renderer/MapRenderer.java | 8 +-- .../glsurfaceview/GLSurfaceViewMapRenderer.java | 4 +- .../textureview/TextureViewMapRenderer.java | 6 +- .../src/main/res-public/values/public.xml | 1 + .../src/main/res/values/attrs.xml | 1 + .../src/main/AndroidManifest.xml | 64 +++++++++++------ .../activity/maplayout/LocalGlyphActivity.java | 81 ++++++++++++++++++++++ .../src/main/res/layout/activity_local_glyph.xml | 17 +++++ .../src/main/res/values/descriptions.xml | 1 + .../src/main/res/values/titles.xml | 2 + platform/android/src/map_renderer.cpp | 10 +-- platform/android/src/map_renderer.hpp | 4 +- 14 files changed, 196 insertions(+), 38 deletions(-) create mode 100644 platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/maplayout/LocalGlyphActivity.java create mode 100644 platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_local_glyph.xml diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java index 1f8faf0231..80a3ce5bb3 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java @@ -293,7 +293,7 @@ public class MapView extends FrameLayout { private void initialiseDrawingSurface(MapboxMapOptions options) { if (options.getTextureMode()) { TextureView textureView = new TextureView(getContext()); - mapRenderer = new TextureViewMapRenderer(getContext(), textureView) { + mapRenderer = new TextureViewMapRenderer(getContext(), textureView, options.getLocalIdeographFontFamily()) { @Override protected void onSurfaceCreated(GL10 gl, EGLConfig config) { MapView.this.post(new Runnable() { @@ -315,7 +315,7 @@ public class MapView extends FrameLayout { GLSurfaceView glSurfaceView = (GLSurfaceView) findViewById(R.id.surfaceView); glSurfaceView.setZOrderMediaOverlay(mapboxMapOptions.getRenderSurfaceOnTop()); - mapRenderer = new GLSurfaceViewMapRenderer(getContext(), glSurfaceView) { + mapRenderer = new GLSurfaceViewMapRenderer(getContext(), glSurfaceView, options.getLocalIdeographFontFamily()) { @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { MapView.this.post(new Runnable() { 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 f26e0b9d3b..48c83628d6 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 @@ -82,6 +82,7 @@ public class MapboxMapOptions implements Parcelable { private float myLocationAccuracyThreshold; private boolean prefetchesTiles = true; private boolean zMediaOverlay = false; + private String localIdeographFontFamily; private String apiBaseUrl; @@ -157,6 +158,7 @@ public class MapboxMapOptions implements Parcelable { textureMode = in.readByte() != 0; prefetchesTiles = in.readByte() != 0; zMediaOverlay = in.readByte() != 0; + localIdeographFontFamily = in.readString(); } static Bitmap getBitmapFromDrawable(Drawable drawable) { @@ -304,6 +306,8 @@ public class MapboxMapOptions implements Parcelable { typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_enableTilePrefetch, true)); mapboxMapOptions.renderSurfaceOnTop( typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_enableZMediaOverlay, false)); + mapboxMapOptions.localIdeographFontFamily( + typedArray.getString(R.styleable.mapbox_MapView_mapbox_localIdeographFontFamily)); } finally { typedArray.recycle(); } @@ -733,6 +737,18 @@ public class MapboxMapOptions implements Parcelable { return this; } + /** + * Set the font-family for generating glyphs locally for ideographs in the ‘CJK Unified Ideographs’ + * and ‘Hangul Syllables’ ranges. + * + * @param fontFamily font family for local ideograph generation. + * @return This + */ + public MapboxMapOptions localIdeographFontFamily(String fontFamily) { + this.localIdeographFontFamily = fontFamily; + return this; + } + /** * Check whether tile pre-fetching is enabled. * @@ -1079,6 +1095,16 @@ public class MapboxMapOptions implements Parcelable { return textureMode; } + /** + * Returns the font-family for locally overriding generation of glyphs in the + * ‘CJK Unified Ideographs’ and ‘Hangul Syllables’ ranges. + * + * @return Local ideograph font family name. + */ + public String getLocalIdeographFontFamily() { + return localIdeographFontFamily; + } + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { public MapboxMapOptions createFromParcel(Parcel in) { return new MapboxMapOptions(in); @@ -1145,6 +1171,7 @@ public class MapboxMapOptions implements Parcelable { dest.writeByte((byte) (textureMode ? 1 : 0)); dest.writeByte((byte) (prefetchesTiles ? 1 : 0)); dest.writeByte((byte) (zMediaOverlay ? 1 : 0)); + dest.writeString(localIdeographFontFamily); } @Override @@ -1274,6 +1301,9 @@ public class MapboxMapOptions implements Parcelable { if (zMediaOverlay != options.zMediaOverlay) { return false; } + if (localIdeographFontFamily != options.localIdeographFontFamily) { + return false; + } return false; } @@ -1323,6 +1353,7 @@ public class MapboxMapOptions implements Parcelable { result = 31 * result + (style != null ? style.hashCode() : 0); result = 31 * result + (prefetchesTiles ? 1 : 0); result = 31 * result + (zMediaOverlay ? 1 : 0); + result = 31 * result + (localIdeographFontFamily != null ? localIdeographFontFamily.hashCode() : 0); return result; } } diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/MapRenderer.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/MapRenderer.java index 2baff473e9..fcee5bd179 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/MapRenderer.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/MapRenderer.java @@ -23,14 +23,13 @@ public abstract class MapRenderer implements MapRendererScheduler { private MapboxMap.OnFpsChangedListener onFpsChangedListener; - public MapRenderer(Context context) { + public MapRenderer(Context context, String localIdeographFontFamily) { FileSource fileSource = FileSource.getInstance(context); float pixelRatio = context.getResources().getDisplayMetrics().density; String programCacheDir = context.getCacheDir().getAbsolutePath(); - // Initialise native peer - nativeInitialize(this, fileSource, pixelRatio, programCacheDir); + nativeInitialize(this, fileSource, pixelRatio, programCacheDir, localIdeographFontFamily); } public void onStart() { @@ -112,7 +111,8 @@ public abstract class MapRenderer implements MapRendererScheduler { private native void nativeInitialize(MapRenderer self, FileSource fileSource, float pixelRatio, - String programCacheDir); + String programCacheDir, + String localIdeographFontFamily); @CallSuper @Override diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/glsurfaceview/GLSurfaceViewMapRenderer.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/glsurfaceview/GLSurfaceViewMapRenderer.java index d98e4d06a3..7bc56475c0 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/glsurfaceview/GLSurfaceViewMapRenderer.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/glsurfaceview/GLSurfaceViewMapRenderer.java @@ -21,8 +21,8 @@ public class GLSurfaceViewMapRenderer extends MapRenderer implements GLSurfaceVi private final GLSurfaceView glSurfaceView; - public GLSurfaceViewMapRenderer(Context context, GLSurfaceView glSurfaceView) { - super(context); + public GLSurfaceViewMapRenderer(Context context, GLSurfaceView glSurfaceView, String localIdeographFontFamily) { + super(context, localIdeographFontFamily); this.glSurfaceView = glSurfaceView; glSurfaceView.setEGLContextClientVersion(2); glSurfaceView.setEGLConfigChooser(new EGLConfigChooser()); diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/textureview/TextureViewMapRenderer.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/textureview/TextureViewMapRenderer.java index 397904b1f5..dcc95217ff 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/textureview/TextureViewMapRenderer.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/renderer/textureview/TextureViewMapRenderer.java @@ -24,8 +24,10 @@ public class TextureViewMapRenderer extends MapRenderer { * @param context the current Context * @param textureView the TextureView */ - public TextureViewMapRenderer(@NonNull Context context, @NonNull TextureView textureView) { - super(context); + public TextureViewMapRenderer(@NonNull Context context, + @NonNull TextureView textureView, + String localIdeographFontFamily) { + super(context, localIdeographFontFamily); renderThread = new TextureViewRenderThread(textureView, this); renderThread.start(); } diff --git a/platform/android/MapboxGLAndroidSDK/src/main/res-public/values/public.xml b/platform/android/MapboxGLAndroidSDK/src/main/res-public/values/public.xml index f406f4d042..412d8c5d9b 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/res-public/values/public.xml +++ b/platform/android/MapboxGLAndroidSDK/src/main/res-public/values/public.xml @@ -11,6 +11,7 @@ + diff --git a/platform/android/MapboxGLAndroidSDK/src/main/res/values/attrs.xml b/platform/android/MapboxGLAndroidSDK/src/main/res/values/attrs.xml index 2a4c2fe746..97adce8a4e 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/res/values/attrs.xml +++ b/platform/android/MapboxGLAndroidSDK/src/main/res/values/attrs.xml @@ -5,6 +5,7 @@ + diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml index ee26f39f57..6f311788ba 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml @@ -367,9 +367,10 @@ android:name="android.support.PARENT_ACTIVITY" android:value=".activity.FeatureOverviewActivity"/> - + @@ -377,9 +378,10 @@ android:name="android.support.PARENT_ACTIVITY" android:value=".activity.FeatureOverviewActivity"/> - + @@ -387,9 +389,10 @@ android:name="android.support.PARENT_ACTIVITY" android:value=".activity.FeatureOverviewActivity"/> - + @@ -586,8 +589,8 @@ + android:description="@string/description_animated_image_source" + android:label="@string/activity_animated_image_source"> @@ -720,36 +723,51 @@ android:name="android.support.PARENT_ACTIVITY" android:value=".activity.FeatureOverviewActivity"/> - + - + - + - + + + + + + + + + + diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/descriptions.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/descriptions.xml index 33d9638712..7acd8b1ef8 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/descriptions.xml +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/descriptions.xml @@ -67,4 +67,5 @@ Use TextureView to render the map Resize a map rendered on a TextureView Animate a map rendered on a TextureView + Suzhou using Droid Sans for Chinese glyphs \ No newline at end of file diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/titles.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/titles.xml index b90cedc518..c4d13e1068 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/titles.xml +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/values/titles.xml @@ -67,4 +67,6 @@ TextureView debug TextureView resize TextureView animation + Grid Source + Local CJK glyph generation \ No newline at end of file diff --git a/platform/android/src/map_renderer.cpp b/platform/android/src/map_renderer.cpp index 36e8142bfa..2440ac93ef 100644 --- a/platform/android/src/map_renderer.cpp +++ b/platform/android/src/map_renderer.cpp @@ -16,10 +16,12 @@ namespace android { MapRenderer::MapRenderer(jni::JNIEnv& _env, jni::Object obj, jni::Object _fileSource, jni::jfloat pixelRatio_, - jni::String programCacheDir_) + jni::String programCacheDir_, + jni::String localIdeographFontFamily_) : javaPeer(SeizeGenericWeakRef(_env, jni::Object(jni::NewWeakGlobalRef(_env, obj.Get()).release()))), pixelRatio(pixelRatio_) , fileSource(FileSource::getDefaultFileSource(_env, _fileSource)) , programCacheDir(jni::Make(_env, programCacheDir_)) + , localIdeographFontFamily(localIdeographFontFamily_ == nullptr ? optional{} : jni::Make(_env, localIdeographFontFamily_ )) , threadPool(sharedThreadPool()) , mailbox(std::make_shared(*this)) { } @@ -145,7 +147,7 @@ void MapRenderer::onSurfaceCreated(JNIEnv&) { std::lock_guard lock(initialisationMutex); // The android system will have already destroyed the underlying - // GL resources if this is not the first intialization and an + // GL resources if this is not the first initialization and an // attempt to clean them up will fail if (backend) backend->markContextLost(); if (renderer) renderer->markContextLost(); @@ -157,7 +159,7 @@ void MapRenderer::onSurfaceCreated(JNIEnv&) { // Create the new backend and renderer backend = std::make_unique(); renderer = std::make_unique(*backend, pixelRatio, fileSource, *threadPool, - GLContextMode::Unique, programCacheDir); + GLContextMode::Unique, programCacheDir, localIdeographFontFamily); rendererRef = std::make_unique>(*renderer, mailbox); // Set the observer on the new Renderer implementation @@ -184,7 +186,7 @@ void MapRenderer::registerNative(jni::JNIEnv& env) { // Register the peer jni::RegisterNativePeer(env, MapRenderer::javaClass, "nativePtr", - std::make_unique, jni::Object, jni::jfloat, jni::String>, + std::make_unique, jni::Object, jni::jfloat, jni::String, jni::String>, "nativeInitialize", "finalize", METHOD(&MapRenderer::render, "nativeRender"), METHOD(&MapRenderer::onSurfaceCreated, diff --git a/platform/android/src/map_renderer.hpp b/platform/android/src/map_renderer.hpp index 0d614912a9..c36357af7a 100644 --- a/platform/android/src/map_renderer.hpp +++ b/platform/android/src/map_renderer.hpp @@ -48,7 +48,8 @@ public: jni::Object, jni::Object, jni::jfloat pixelRatio, - jni::String programCacheDir); + jni::String programCacheDir, + jni::String localIdeographFontFamily); ~MapRenderer() override; @@ -103,6 +104,7 @@ private: float pixelRatio; DefaultFileSource& fileSource; std::string programCacheDir; + optional localIdeographFontFamily; std::shared_ptr threadPool; std::shared_ptr mailbox; -- cgit v1.2.1