From 6eb9e1098b406e70e44ad4f41a2e217317831e37 Mon Sep 17 00:00:00 2001 From: Tobrun Date: Thu, 12 Jul 2018 20:05:40 +0200 Subject: [PATCH] platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java --- .../com/mapbox/mapboxsdk/maps/MapView.java | 31 +++++++++-- .../mapboxsdk/maps/MapboxMapOptions.java | 31 ++++++++++- .../mapboxsdk/maps/renderer/MapRenderer.java | 35 +++++------- .../GLSurfaceViewMapRenderer.java | 8 ++- .../textureview/TextureViewMapRenderer.java | 6 ++- .../style/layers/PropertyFactory.java | 13 +++-- .../style/layers/property_factory.java.ejs | 14 ++--- .../mapbox/mapboxsdk/utils/ColorUtils.java | 54 +++++++++++++++++++ .../src/main/res-public/values/public.xml | 1 + .../src/main/res/values/attrs.xml | 1 + 10 files changed, 151 insertions(+), 43 deletions(-) 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 0fa1072cd2c..770a5f3e878 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 @@ -3,6 +3,7 @@ import android.content.Context; import android.graphics.Bitmap; import android.graphics.PointF; +import android.graphics.drawable.ColorDrawable; import android.opengl.GLSurfaceView; import android.os.Build; import android.os.Bundle; @@ -126,6 +127,11 @@ protected void initialize(@NonNull final Context context, @NonNull final MapboxM // in IDE layout editor, just return return; } + + // hide surface until map is fully loaded #10990 + setForeground(new ColorDrawable(options.getForegroundLoadColor())); + mapCallback.addOnMapReadyCallback(new InitialStyleLoadedCallback(this)); + mapboxMapOptions = options; // inflate view @@ -283,11 +289,13 @@ public void onCreate(@Nullable Bundle savedInstanceState) { } private void initialiseDrawingSurface(MapboxMapOptions options) { + String localFontFamily = options.getLocalIdeographFontFamily(); + int foregroundLoadColor = options.getForegroundLoadColor(); if (options.getTextureMode()) { TextureView textureView = new TextureView(getContext()); - String localFontFamily = options.getLocalIdeographFontFamily(); boolean translucentSurface = options.getTranslucentTextureSurface(); - mapRenderer = new TextureViewMapRenderer(getContext(), textureView, localFontFamily, translucentSurface) { + mapRenderer = new TextureViewMapRenderer(getContext(), + textureView, localFontFamily, translucentSurface, foregroundLoadColor) { @Override protected void onSurfaceCreated(GL10 gl, EGLConfig config) { MapView.this.onSurfaceCreated(); @@ -299,7 +307,7 @@ protected void onSurfaceCreated(GL10 gl, EGLConfig config) { } else { GLSurfaceView glSurfaceView = new GLSurfaceView(getContext()); glSurfaceView.setZOrderMediaOverlay(mapboxMapOptions.getRenderSurfaceOnTop()); - mapRenderer = new GLSurfaceViewMapRenderer(getContext(), glSurfaceView, options.getLocalIdeographFontFamily()) { + mapRenderer = new GLSurfaceViewMapRenderer(getContext(), glSurfaceView, localFontFamily, foregroundLoadColor) { @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { MapView.this.onSurfaceCreated(); @@ -981,6 +989,23 @@ public void onFocalPointChanged(PointF pointF) { } } + private static class InitialStyleLoadedCallback implements OnMapReadyCallback { + + private WeakReference weakReference; + + InitialStyleLoadedCallback(MapView mapView) { + this.weakReference = new WeakReference<>(mapView); + } + + @Override + public void onMapReady(MapboxMap mapboxMap) { + MapView mapView = weakReference.get(); + if (mapView != null && !mapView.isDestroyed()) { + mapView.setForeground(null); + } + } + } + private class GesturesManagerInteractionListener implements MapboxMap.OnGesturesManagerInteractionListener { @Override 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 02c50c9f18c..0075199b1e3 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 @@ -30,6 +30,7 @@ */ public class MapboxMapOptions implements Parcelable { + private static final int LIGHT_GRAY = 0xFFF0E9E1; // RGB(240, 233, 225)) private static final float FOUR_DP = 4f; private static final float NINETY_TWO_DP = 92f; private static final int UNDEFINED_COLOR = -1; @@ -73,6 +74,9 @@ public class MapboxMapOptions implements Parcelable { private boolean textureMode; private boolean translucentTextureSurface; + @ColorInt + private int foregroundLoadColor; + private String style; private float pixelRatio; @@ -124,6 +128,7 @@ private MapboxMapOptions(Parcel in) { zMediaOverlay = in.readByte() != 0; localIdeographFontFamily = in.readString(); pixelRatio = in.readFloat(); + foregroundLoadColor = in.readInt(); } /** @@ -209,7 +214,6 @@ public static MapboxMapOptions createFromAttributes(@NonNull Context context, @N FOUR_DP * pxlRatio)), (int) (typedArray.getDimension(R.styleable.mapbox_MapView_mapbox_uiAttributionMarginBottom, FOUR_DP * pxlRatio))}); - mapboxMapOptions.textureMode( typedArray.getBoolean(R.styleable.mapbox_MapView_mapbox_renderTextureMode, false)); mapboxMapOptions.translucentTextureSurface( @@ -222,6 +226,9 @@ public static MapboxMapOptions createFromAttributes(@NonNull Context context, @N typedArray.getString(R.styleable.mapbox_MapView_mapbox_localIdeographFontFamily)); mapboxMapOptions.pixelRatio( typedArray.getFloat(R.styleable.mapbox_MapView_mapbox_pixelRatio, 0)); + mapboxMapOptions.foregroundLoadColor( + typedArray.getInt(R.styleable.mapbox_MapView_mapbox_foregroundLoadColor, LIGHT_GRAY) + ); } finally { typedArray.recycle(); } @@ -521,6 +528,17 @@ public MapboxMapOptions translucentTextureSurface(boolean translucentTextureSurf return this; } + /** + * Set the MapView foreground color that is used when the map surface is being created. + * + * @param loadColor the color to show during map creation + * @return This + */ + public MapboxMapOptions foregroundLoadColor(@ColorInt int loadColor) { + this.foregroundLoadColor = loadColor; + 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. @@ -819,6 +837,16 @@ public boolean getTranslucentTextureSurface() { return translucentTextureSurface; } + /** + * Returns the current configured foreground color that is used during map creation. + * + * @return the load color + */ + @ColorInt + public int getForegroundLoadColor() { + return foregroundLoadColor; + } + /** * Returns the font-family for locally overriding generation of glyphs in the * 'CJK Unified Ideographs' and 'Hangul Syllables' ranges. @@ -892,6 +920,7 @@ public void writeToParcel(Parcel dest, int flags) { dest.writeByte((byte) (zMediaOverlay ? 1 : 0)); dest.writeString(localIdeographFontFamily); dest.writeFloat(pixelRatio); + dest.writeInt(foregroundLoadColor); } @Override 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 fcee5bd1793..214bf5b9901 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 @@ -5,6 +5,7 @@ import com.mapbox.mapboxsdk.maps.MapboxMap; import com.mapbox.mapboxsdk.storage.FileSource; +import com.mapbox.mapboxsdk.utils.ColorUtils; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; @@ -21,13 +22,19 @@ public abstract class MapRenderer implements MapRendererScheduler { // Holds the pointer to the native peer after initialisation private long nativePtr = 0; - private MapboxMap.OnFpsChangedListener onFpsChangedListener; + // The color shown when the map style is loading + private final float[] foregroundRgbaColor; - public MapRenderer(Context context, String localIdeographFontFamily) { + private MapboxMap.OnFpsChangedListener onFpsChangedListener; + public MapRenderer(Context context, String localIdeographFontFamily, int foregroundLoadColor) { FileSource fileSource = FileSource.getInstance(context); float pixelRatio = context.getResources().getDisplayMetrics().density; String programCacheDir = context.getCacheDir().getAbsolutePath(); + + // convert android int color to GL rgba, range 0-1 + foregroundRgbaColor = ColorUtils.colorToGlRgbaArray(foregroundLoadColor); + // Initialise native peer nativeInitialize(this, fileSource, pixelRatio, programCacheDir, localIdeographFontFamily); } @@ -63,30 +70,17 @@ protected void onSurfaceCreated(GL10 gl, EGLConfig config) { @CallSuper protected void onSurfaceChanged(GL10 gl, int width, int height) { - if (width < 0) { - throw new IllegalArgumentException("fbWidth cannot be negative."); - } - - if (height < 0) { - throw new IllegalArgumentException("fbHeight cannot be negative."); - } - - if (width > 65535) { - throw new IllegalArgumentException( - "fbWidth cannot be greater than 65535."); - } - - if (height > 65535) { - throw new IllegalArgumentException( - "fbHeight cannot be greater than 65535."); - } - gl.glViewport(0, 0, width, height); nativeOnSurfaceChanged(width, height); } @CallSuper protected void onDrawFrame(GL10 gl) { + // clear color with the foreground load color #10990 + // on low end devices there is a race condition between + // when the gl surface is loaded and the onMapReady is called + gl.glClearColor(foregroundRgbaColor[0], foregroundRgbaColor[1], foregroundRgbaColor[2], foregroundRgbaColor[3]); + nativeRender(); if (onFpsChangedListener != null) { @@ -138,5 +132,4 @@ private void updateFps() { frames = 0; } } - } 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 7bc56475c01..7bb0887a150 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 @@ -3,6 +3,7 @@ import android.content.Context; import android.opengl.GLSurfaceView; +import android.support.annotation.ColorInt; import com.mapbox.mapboxsdk.maps.renderer.MapRenderer; import com.mapbox.mapboxsdk.maps.renderer.egl.EGLConfigChooser; @@ -21,8 +22,11 @@ public class GLSurfaceViewMapRenderer extends MapRenderer implements GLSurfaceVi private final GLSurfaceView glSurfaceView; - public GLSurfaceViewMapRenderer(Context context, GLSurfaceView glSurfaceView, String localIdeographFontFamily) { - super(context, localIdeographFontFamily); + public GLSurfaceViewMapRenderer(Context context, + GLSurfaceView glSurfaceView, + String localIdeographFontFamily, + @ColorInt int clearColor) { + super(context, localIdeographFontFamily, clearColor); 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 ad25dea0d30..4c6786d872c 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 @@ -1,6 +1,7 @@ package com.mapbox.mapboxsdk.maps.renderer.textureview; import android.content.Context; +import android.support.annotation.ColorInt; import android.support.annotation.NonNull; import android.view.TextureView; @@ -30,8 +31,9 @@ public class TextureViewMapRenderer extends MapRenderer { public TextureViewMapRenderer(@NonNull Context context, @NonNull TextureView textureView, String localIdeographFontFamily, - boolean translucentSurface) { - super(context, localIdeographFontFamily); + boolean translucentSurface, + @ColorInt int foregroundLoadColor) { + super(context, localIdeographFontFamily, foregroundLoadColor); this.translucentSurface = translucentSurface; renderThread = new TextureViewRenderThread(textureView, this); renderThread.start(); diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/PropertyFactory.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/PropertyFactory.java index ad603d356e3..6ae9d1be4ac 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/PropertyFactory.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/PropertyFactory.java @@ -6,9 +6,6 @@ import com.mapbox.mapboxsdk.style.expressions.Expression; -import java.text.DecimalFormat; -import java.util.Locale; - /** * Constructs paint/layout properties for Layers * @@ -2404,11 +2401,11 @@ public static PropertyValue textOptional(Expression value) { * * @param color Android color int * @return String rgba color + * @deprecated use {@link com.mapbox.mapboxsdk.utils.ColorUtils#colorToRgbaString(int)} instead */ + @Deprecated public static String colorToRgbaString(@ColorInt int color) { - String alpha = new DecimalFormat("#.###").format(((float)((color >> 24) & 0xFF)) / 255.0f); - return String.format(Locale.US, "rgba(%d, %d, %d, %s)", - (color >> 16) & 0xFF, (color >> 8) & 0xFF, color & 0xFF, alpha); + return ColorUtils.colorToRgbaString(color); } /** @@ -2419,8 +2416,10 @@ public static String colorToRgbaString(@ColorInt int color) { * * @param color Android color int * @return int rgba array + * @deprecated use {@link com.mapbox.mapboxsdk.utils.ColorUtils#colorToRgbaArray(int)} instead */ + @Deprecated public static float[] colorToRgbaArray(@ColorInt int color) { - return new float[] {(color >> 16) & 0xFF, (color >> 8) & 0xFF, color & 0xFF, ((color >> 24) & 0xFF) / 255.0f}; + return ColorUtils.colorToRgbaArray(color); } } \ No newline at end of file diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/property_factory.java.ejs b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/property_factory.java.ejs index 2fb51f4a470..27bb66aa08d 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/property_factory.java.ejs +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/layers/property_factory.java.ejs @@ -9,9 +9,7 @@ package com.mapbox.mapboxsdk.style.layers; import android.support.annotation.ColorInt; import com.mapbox.mapboxsdk.style.expressions.Expression; - -import java.text.DecimalFormat; -import java.util.Locale; +import com.mapbox.mapboxsdk.utils.ColorUtils; /** * Constructs paint/layout properties for Layers @@ -94,11 +92,11 @@ public class PropertyFactory { * * @param color Android color int * @return String rgba color + * @deprecated use {@link com.mapbox.mapboxsdk.utils.ColorUtils#colorToRgbaString(int)} instead */ + @Deprecated public static String colorToRgbaString(@ColorInt int color) { - String alpha = new DecimalFormat("#.###").format(((float)((color >> 24) & 0xFF)) / 255.0f); - return String.format(Locale.US, "rgba(%d, %d, %d, %s)", - (color >> 16) & 0xFF, (color >> 8) & 0xFF, color & 0xFF, alpha); + return ColorUtils.colorToRgbaString(color); } /** @@ -109,8 +107,10 @@ public class PropertyFactory { * * @param color Android color int * @return int rgba array + * @deprecated use {@link com.mapbox.mapboxsdk.utils.ColorUtils#colorToRgbaArray(int)} instead */ + @Deprecated public static float[] colorToRgbaArray(@ColorInt int color) { - return new float[] {(color >> 16) & 0xFF, (color >> 8) & 0xFF, color & 0xFF, ((color >> 24) & 0xFF) / 255.0f}; + return ColorUtils.colorToRgbaArray(color); } } \ No newline at end of file diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/utils/ColorUtils.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/utils/ColorUtils.java index 1c0e439afcb..3a53794e500 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/utils/ColorUtils.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/utils/ColorUtils.java @@ -15,6 +15,8 @@ import com.mapbox.mapboxsdk.R; import com.mapbox.mapboxsdk.exceptions.ConversionException; +import java.text.DecimalFormat; +import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -139,6 +141,58 @@ public static int rgbaToColor(String value) { } } + /** + * Converts Android color int to "rbga(r, g, b, a)" String equivalent. + *

+ * Alpha value will be converted from 0-255 range to 0-1. + *

+ * + * @param color Android color int + * @return String rgba color + */ + public static String colorToRgbaString(@ColorInt int color) { + String alpha = new DecimalFormat("#.###").format(((float)((color >> 24) & 0xFF)) / 255.0f); + return String.format(Locale.US, "rgba(%d, %d, %d, %s)", + (color >> 16) & 0xFF, (color >> 8) & 0xFF, color & 0xFF, alpha); + } + + /** + * Converts Android color int to rgba float array. + *

+ * Returned RGB values range from 0 to 255. + * Alpha value ranges from 0-1. + *

+ * + * @param color Android color int + * @return float rgba array, rgb values range from 0-255, alpha from 0-1 + */ + public static float[] colorToRgbaArray(@ColorInt int color) { + return new float[] { + (color >> 16) & 0xFF, // r (0-255) + (color >> 8) & 0xFF, // g (0-255) + color & 0xFF, // b (0-255) + ((color >> 24) & 0xFF) / 255.0f // a (0-1) + }; + } + + /** + * Converts Android color int to GL rgba float array. + *

+ * Returned values range from 0-1. + *

+ * + * @param color Android color int + * @return float rgba array, values range from 0 to 1 + */ + public static float[] colorToGlRgbaArray(@ColorInt int color) { + return new float[] { + ((color >> 16) & 0xFF) / 255.0f, // r (0-1) + ((color >> 8) & 0xFF) / 255.0f, // g (0-1) + (color & 0xFF) / 255.0f, // b (0-1) + ((color >> 24) & 0xFF) / 255.0f // a (0-1) + }; + } + private static int getColorCompat(Context context, int id) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { return context.getResources().getColor(id, context.getTheme()); 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 99432e7066e..8acb0c27ccf 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/res-public/values/public.xml +++ b/platform/android/MapboxGLAndroidSDK/src/main/res-public/values/public.xml @@ -65,6 +65,7 @@ + diff --git a/platform/android/MapboxGLAndroidSDK/src/main/res/values/attrs.xml b/platform/android/MapboxGLAndroidSDK/src/main/res/values/attrs.xml index 75339e31944..3a8fa74b34f 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/res/values/attrs.xml +++ b/platform/android/MapboxGLAndroidSDK/src/main/res/values/attrs.xml @@ -103,6 +103,7 @@ +