From 1f585c2a60eb28479d917638a4266ff0d2b2ba28 Mon Sep 17 00:00:00 2001 From: Leith Bade Date: Tue, 8 Sep 2015 14:01:53 +1000 Subject: [PATCH 01/26] Use MapView as parent for InfoWindow See comment in #894 --- .../main/java/com/mapbox/mapboxgl/annotations/InfoWindow.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/InfoWindow.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/InfoWindow.java index c48227501..56eae1951 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/InfoWindow.java +++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/InfoWindow.java @@ -28,11 +28,10 @@ public class InfoWindow { public InfoWindow(int layoutResId, MapView mapView) { mMapView = mapView; mIsVisible = false; - ViewGroup parent = (ViewGroup) mapView.getParent(); Context context = mapView.getContext(); LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - mView = inflater.inflate(layoutResId, parent, false); + mView = inflater.inflate(layoutResId, (ViewGroup) mapView, false); if (mTitleId == 0) { setResIds(mapView.getContext()); From 038f2f5ea3073b0294adf97fcf26bd8ff20a80f5 Mon Sep 17 00:00:00 2001 From: Leith Bade Date: Thu, 3 Sep 2015 16:12:53 +1000 Subject: [PATCH 02/26] Switch to TextureView Closes #2244 --- .../com/mapbox/mapboxgl/views/MapView.java | 42 +++++++++++-------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java index f5610f5d9..aa2fed1e9 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java +++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java @@ -14,6 +14,7 @@ import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.PointF; import android.graphics.RectF; +import android.graphics.SurfaceTexture; import android.hardware.GeomagneticField; import android.hardware.Sensor; import android.hardware.SensorEvent; @@ -37,8 +38,8 @@ import android.util.AttributeSet; import android.view.InputDevice; import android.view.KeyEvent; import android.view.MotionEvent; -import android.view.SurfaceHolder; -import android.view.SurfaceView; +import android.view.Surface; +import android.view.TextureView; import android.view.View; import android.view.ViewConfiguration; import android.widget.FrameLayout; @@ -299,8 +300,8 @@ public class MapView extends FrameLayout implements LocationListener { // Save the context mContext = context; - SurfaceView surfaceView = new SurfaceView(mContext); - addView(surfaceView); + TextureView textureView = new TextureView(mContext); + addView(textureView); // Check if we are in Eclipse UI editor if (isInEditMode()) { @@ -333,8 +334,8 @@ public class MapView extends FrameLayout implements LocationListener { setFocusableInTouchMode(true); requestFocus(); - // Register the SurfaceHolder callbacks - surfaceView.getHolder().addCallback(new CallbacksHandler()); + // Register the TextureView callbacks + textureView.setSurfaceTextureListener(new SurfaceTextureListener()); // Touch gesture detectors mGestureDetector = new GestureDetectorCompat(context, new GestureListener()); @@ -857,37 +858,44 @@ public class MapView extends FrameLayout implements LocationListener { } } - // This class handles SurfaceHolder callbacks - private class CallbacksHandler implements SurfaceHolder.Callback, SurfaceHolder.Callback2 { + // This class handles TextureView callbacks + private class SurfaceTextureListener implements TextureView.SurfaceTextureListener { - // Called when the native surface buffer has been created + // Called when the native surface texture has been created // Must do all EGL/GL ES initialization here @Override - public void surfaceCreated(SurfaceHolder holder) { - mNativeMapView.createSurface(holder.getSurface()); + public void onSurfaceTextureAvailable (SurfaceTexture surface, int width, int height) { + mNativeMapView.createSurface(new Surface(surface)); + mNativeMapView.resizeFramebuffer(width, height); } - // Called when the native surface buffer has been destroyed + // Called when the native surface texture has been destroyed // Must do all EGL/GL ES destruction here @Override - public void surfaceDestroyed(SurfaceHolder holder) { + public boolean onSurfaceTextureDestroyed (SurfaceTexture surface) { mNativeMapView.destroySurface(); + return true; } - // Called when the format or size of the native surface buffer has been - // changed + // Called when the format or size of the native surface texture has been changed // Must handle window resizing here. @Override - public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { + public void onSurfaceTextureSizeChanged (SurfaceTexture surface, int width, int height) { mNativeMapView.resizeFramebuffer(width, height); } // Called when we need to redraw the view // This is called before our view is first visible to prevent an initial // flicker (see Android SDK documentation) - @Override + /*@Override public void surfaceRedrawNeeded(SurfaceHolder holder) { mNativeMapView.update(); + }*/ // TODO call update somewhere? + + // Not used + @Override + public void onSurfaceTextureUpdated (SurfaceTexture surface) { + // Do nothing } } From 0da95e17c37e1b283074bc0e4f7293c7a0f2076e Mon Sep 17 00:00:00 2001 From: Brad Leege Date: Tue, 8 Sep 2015 14:46:18 -0500 Subject: [PATCH 03/26] #2283 - Supporting custom InfoWindow touch listeners via Marker.setInfoWindowOnTouchListener(). Added Test to Custom Annotations in TestApp's MainActivity. --- .../mapbox/mapboxgl/annotations/Marker.java | 28 ++++++++++++++++--- .../com/mapbox/mapboxgl/views/MapView.java | 16 +++++++---- .../mapbox/mapboxgl/testapp/MainActivity.java | 12 +++++++- 3 files changed, 46 insertions(+), 10 deletions(-) diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/Marker.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/Marker.java index 4776c37bf..17317bffb 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/Marker.java +++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/Marker.java @@ -1,6 +1,7 @@ package com.mapbox.mapboxgl.annotations; import android.graphics.Point; +import android.view.View; import com.mapbox.mapboxgl.geometry.LatLng; import com.mapbox.mapboxgl.views.R; @@ -145,13 +146,32 @@ public class Marker extends Annotation { return; } + getInfoWindow().open(this, getPosition(), (int) anchorU, (int) anchorV); + getInfoWindow().setBoundMarker(this); + infoWindowShown = true; + } + + /** + * Use to set a custom OnTouchListener for the InfoWindow. + * By default the InfoWindow will close on touch. + * @param listener Custom OnTouchListener + */ + public void setInfoWindowOnTouchListener(View.OnTouchListener listener) { + if (listener == null) { + return; + } + getInfoWindow().setOnTouchListener(listener); + } + + /** + * Common internal InfoWindow initialization method + * @return InfoWindow for Marker + */ + private InfoWindow getInfoWindow() { if (infoWindow == null) { infoWindow = new InfoWindow(R.layout.infowindow, mapView); } - - infoWindow.open(this, getPosition(), (int)anchorU, (int)anchorV); - infoWindow.setBoundMarker(this); - infoWindowShown = true; + return infoWindow; } @Override diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java index aa2fed1e9..e96cf3ed0 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java +++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java @@ -8,10 +8,7 @@ import android.content.IntentFilter; import android.content.pm.PackageManager; import android.content.res.TypedArray; import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Color; import android.graphics.Matrix; -import android.graphics.Paint; import android.graphics.PointF; import android.graphics.RectF; import android.graphics.SurfaceTexture; @@ -30,7 +27,6 @@ import android.support.v4.content.ContextCompat; import android.support.v4.view.GestureDetectorCompat; import android.support.v4.view.ScaleGestureDetectorCompat; import android.text.TextUtils; -import android.util.Log; import android.view.GestureDetector; import android.view.Gravity; import android.view.ScaleGestureDetector; @@ -484,6 +480,9 @@ public class MapView extends FrameLayout implements LocationListener { private void removeAnnotationsWithId(long annotationId){ for (Iterator iterator = mAnnotations.iterator(); iterator.hasNext();) { Annotation annotation = iterator.next(); + if (annotation instanceof Marker) { + ((Marker)annotation).hideInfoWindow(); + } if (annotation.getId() == annotationId) { iterator.remove(); } @@ -491,6 +490,9 @@ public class MapView extends FrameLayout implements LocationListener { } public void removeAnnotation(Annotation annotation) { + if (annotation instanceof Marker) { + ((Marker)annotation).hideInfoWindow(); + } long id = annotation.getId(); mNativeMapView.removeAnnotation(id); mAnnotations.remove(annotation); @@ -504,8 +506,12 @@ public class MapView extends FrameLayout implements LocationListener { public void removeAnnotations() { long[] ids = new long[mAnnotations.size()]; for(int i = 0; i < mAnnotations.size(); i++) { - long id = mAnnotations.get(i).getId(); + Annotation annotation = mAnnotations.get(i); + long id = annotation.getId(); ids[i] = id; + if (annotation instanceof Marker) { + ((Marker)annotation).hideInfoWindow(); + } } mNativeMapView.removeAnnotations(ids); mAnnotations.clear(); diff --git a/android/java/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxgl/testapp/MainActivity.java b/android/java/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxgl/testapp/MainActivity.java index ba521fc31..ed9b7ef06 100644 --- a/android/java/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxgl/testapp/MainActivity.java +++ b/android/java/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxgl/testapp/MainActivity.java @@ -22,7 +22,9 @@ import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.widget.TextView; +import android.widget.Toast; import com.crashlytics.android.Crashlytics; +import com.mapbox.mapboxgl.annotations.Marker; import com.mapbox.mapboxgl.annotations.MarkerOptions; import com.mapbox.mapboxgl.annotations.PolygonOptions; import com.mapbox.mapboxgl.annotations.PolylineOptions; @@ -395,10 +397,18 @@ public class MainActivity extends AppCompatActivity { private void addMarkers() { LatLng backLot = new LatLng(38.649441, -121.369064); - mMapView.addMarker(new MarkerOptions() + final Marker marker = mMapView.addMarker(new MarkerOptions() .position(backLot) .title("Back Lot") .snippet("The back lot behind my house")); + marker.setInfoWindowOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View view, MotionEvent motionEvent) { + Toast.makeText(getApplicationContext(), "Custom Info Touch Listener!!", Toast.LENGTH_SHORT).show(); + marker.hideInfoWindow(); + return true; + } + }); LatLng cheeseRoom = new LatLng(38.531577,-122.010646); mMapView.addMarker(new MarkerOptions() From d57b47b1ebdffa7a1f33519d618ac590b607761e Mon Sep 17 00:00:00 2001 From: "Justin R. Miller" Date: Tue, 8 Sep 2015 18:03:10 -0700 Subject: [PATCH 04/26] fixes #1675: abstract annotation tile refresh check/render; trigger post-sprite/sprite store load --- src/mbgl/map/annotation.hpp | 1 + src/mbgl/map/map_context.cpp | 10 ++++++++-- src/mbgl/map/map_context.hpp | 2 ++ src/mbgl/style/style.cpp | 4 ++++ src/mbgl/style/style.hpp | 1 + test/style/resource_loading.cpp | 4 ++++ 6 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/mbgl/map/annotation.hpp b/src/mbgl/map/annotation.hpp index 745fc779c..5adec162f 100644 --- a/src/mbgl/map/annotation.hpp +++ b/src/mbgl/map/annotation.hpp @@ -52,6 +52,7 @@ public: ~AnnotationManager(); void markStaleTiles(std::unordered_set); + size_t getStaleTileCount() const { return staleTiles.size(); } std::unordered_set resetStaleTiles(); void setDefaultPointAnnotationSymbol(const std::string& symbol); diff --git a/src/mbgl/map/map_context.cpp b/src/mbgl/map/map_context.cpp index 94aedb46d..0ebcd73f8 100644 --- a/src/mbgl/map/map_context.cpp +++ b/src/mbgl/map/map_context.cpp @@ -142,9 +142,11 @@ void MapContext::loadStyleJSON(const std::string& json, const std::string& base) updateFlags |= Update::DefaultTransition | Update::Classes | Update::Zoom; asyncUpdate->send(); +} - auto staleTiles = data.getAnnotationManager()->resetStaleTiles(); - if (!staleTiles.empty()) { +void MapContext::updateAnnotationTilesIfNeeded() { + if (data.getAnnotationManager()->getStaleTileCount()) { + auto staleTiles = data.getAnnotationManager()->resetStaleTiles(); updateAnnotationTiles(staleTiles); } } @@ -417,4 +419,8 @@ void MapContext::onResourceLoadingFailed(std::exception_ptr error) { } } +void MapContext::onSpriteStoreLoaded() { + updateAnnotationTilesIfNeeded(); +} + } diff --git a/src/mbgl/map/map_context.hpp b/src/mbgl/map/map_context.hpp index f1bfb01e4..449a0f1d1 100644 --- a/src/mbgl/map/map_context.hpp +++ b/src/mbgl/map/map_context.hpp @@ -54,6 +54,7 @@ public: bool isLoaded() const; double getTopOffsetPixelsForAnnotationSymbol(const std::string& symbol); + void updateAnnotationTilesIfNeeded(); void updateAnnotationTiles(const std::unordered_set&); void setSourceTileCacheSize(size_t size); @@ -66,6 +67,7 @@ public: // Style::Observer implementation. void onTileDataChanged() override; void onResourceLoadingFailed(std::exception_ptr error) override; + void onSpriteStoreLoaded() override; private: // Update the state indicated by the accumulated Update flags, then render. diff --git a/src/mbgl/style/style.cpp b/src/mbgl/style/style.cpp index 768621530..d4c9bd4e5 100644 --- a/src/mbgl/style/style.cpp +++ b/src/mbgl/style/style.cpp @@ -190,6 +190,10 @@ void Style::onSpriteLoaded(const Sprites& sprites) { // Add all sprite images to the SpriteStore object spriteStore->setSprites(sprites); + if (observer) { + observer->onSpriteStoreLoaded(); + } + shouldReparsePartialTiles = true; emitTileDataChanged(); } diff --git a/src/mbgl/style/style.hpp b/src/mbgl/style/style.hpp index cbc0ee2db..3f9696ffb 100644 --- a/src/mbgl/style/style.hpp +++ b/src/mbgl/style/style.hpp @@ -39,6 +39,7 @@ public: virtual ~Observer() = default; virtual void onTileDataChanged() = 0; + virtual void onSpriteStoreLoaded() = 0; virtual void onResourceLoadingFailed(std::exception_ptr error) = 0; }; diff --git a/test/style/resource_loading.cpp b/test/style/resource_loading.cpp index 056243458..5ed09065a 100644 --- a/test/style/resource_loading.cpp +++ b/test/style/resource_loading.cpp @@ -63,6 +63,10 @@ public: callback_(error); } + void onSpriteStoreLoaded() override { + // no-op + } + private: MapData data_; Transform transform_; From 7341ada02ea42b2d916792fd3cb07bb3742476eb Mon Sep 17 00:00:00 2001 From: tobrunvannuland Date: Tue, 1 Sep 2015 08:36:53 +0200 Subject: [PATCH 05/26] Added info icon and map box logo --- .../com/mapbox/mapboxgl/views/MapView.java | 133 +++++++++++++++++- .../main/res/color/material_bg_selector.xml | 8 ++ .../ic_info_outline_black_24dp.png | Bin 0 -> 487 bytes .../ic_info_outline_black_24dp.png | Bin 0 -> 323 bytes .../ic_info_outline_black_24dp.png | Bin 0 -> 640 bytes .../ic_info_outline_black_24dp.png | Bin 0 -> 940 bytes .../res/drawable-xxhdpi/ic_logo_mapbox.png | Bin 0 -> 7059 bytes .../ic_info_outline_black_24dp.png | Bin 0 -> 1256 bytes .../src/main/res/values/arrays.xml | 13 ++ .../src/main/res/values/attrs.xml | 62 +++++++- .../src/main/res/values/strings.xml | 3 + 11 files changed, 215 insertions(+), 4 deletions(-) create mode 100644 android/java/MapboxGLAndroidSDK/src/main/res/color/material_bg_selector.xml create mode 100644 android/java/MapboxGLAndroidSDK/src/main/res/drawable-hdpi/ic_info_outline_black_24dp.png create mode 100644 android/java/MapboxGLAndroidSDK/src/main/res/drawable-mdpi/ic_info_outline_black_24dp.png create mode 100644 android/java/MapboxGLAndroidSDK/src/main/res/drawable-xhdpi/ic_info_outline_black_24dp.png create mode 100644 android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxhdpi/ic_info_outline_black_24dp.png create mode 100644 android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxhdpi/ic_logo_mapbox.png create mode 100644 android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxxhdpi/ic_info_outline_black_24dp.png create mode 100644 android/java/MapboxGLAndroidSDK/src/main/res/values/arrays.xml diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java index e96cf3ed0..c8cbcc554 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java +++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java @@ -1,17 +1,23 @@ package com.mapbox.mapboxgl.views; import android.app.ActivityManager; +import android.app.AlertDialog; +import android.app.Dialog; import android.content.BroadcastReceiver; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; +import android.content.res.ColorStateList; import android.content.res.TypedArray; +import android.content.res.XmlResourceParser; import android.graphics.Bitmap; import android.graphics.Matrix; import android.graphics.PointF; import android.graphics.RectF; import android.graphics.SurfaceTexture; +import android.graphics.drawable.Drawable; import android.hardware.GeomagneticField; import android.hardware.Sensor; import android.hardware.SensorEvent; @@ -20,10 +26,12 @@ import android.hardware.SensorManager; import android.location.Location; import android.net.ConnectivityManager; import android.net.NetworkInfo; +import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.content.ContextCompat; +import android.support.v4.graphics.drawable.DrawableCompat; import android.support.v4.view.GestureDetectorCompat; import android.support.v4.view.ScaleGestureDetectorCompat; import android.text.TextUtils; @@ -38,6 +46,8 @@ import android.view.Surface; import android.view.TextureView; import android.view.View; import android.view.ViewConfiguration; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.ZoomButtonsController; @@ -95,6 +105,10 @@ public class MapView extends FrameLayout implements LocationListener { private static final String STATE_MY_LOCATION_ENABLED = "myLocationEnabled"; private static final String STATE_USER_LOCATION_TRACKING_MODE = "userLocationTrackingMode"; + // Used for positioning views + private static final float DIMENSION_SIXTEEN_DP = 16f; + private static final float DIMENSION_TEN_DP = 10f; + /** * Every annotation that has been added to the map. */ @@ -156,6 +170,12 @@ public class MapView extends FrameLayout implements LocationListener { private float mCompassBearing; private boolean mCompassValid = false; + // Used for MapboxLogo + private ImageView mLogoView; + + // Used for attributions control + private ImageView mAttributionsView; + // Used for map toggle mode private long t0 = new Date().getTime(); @@ -306,6 +326,8 @@ public class MapView extends FrameLayout implements LocationListener { // Get the screen's density mScreenDensity = context.getResources().getDisplayMetrics().density; + int tenDp = (int)(10 * mScreenDensity); + int sixteenDp = (int)(16 * mScreenDensity); // Get the cache path String cachePath = context.getCacheDir().getAbsolutePath(); @@ -373,13 +395,30 @@ public class MapView extends FrameLayout implements LocationListener { mCompassView.setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.compass)); mCompassView.setContentDescription(getResources().getString(R.string.compassContentDescription)); LayoutParams lp = new FrameLayout.LayoutParams((int)(48 * mScreenDensity), (int)(48 * mScreenDensity)); - lp.gravity = Gravity.TOP | Gravity.END; - int tenDp = (int)(10 * mScreenDensity); - lp.setMargins(tenDp, tenDp, tenDp, tenDp); mCompassView.setLayoutParams(lp); addView(mCompassView); mCompassView.setOnClickListener(new CompassOnClickListener()); + // Setup Mapbox logo + mLogoView = new ImageView(mContext); + mLogoView.setImageDrawable(ContextCompat.getDrawable(mContext, R.drawable.ic_logo_mapbox)); + mLogoView.setContentDescription(getResources().getString(R.string.mapboxIconContentDescription)); + LayoutParams logoParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + mLogoView.setLayoutParams(logoParams); + addView(mLogoView); + + // Setup Attributions control + mAttributionsView = new ImageView(mContext); + Drawable attrDrawable = ContextCompat.getDrawable(mContext, R.drawable.ic_info_outline_black_24dp); + attrDrawable = DrawableCompat.wrap(attrDrawable); + DrawableCompat.setTintList(attrDrawable, getResources().getColorStateList(R.color.material_bg_selector, mContext.getTheme())); + mAttributionsView.setImageDrawable(attrDrawable); + mAttributionsView.setContentDescription(getResources().getString(R.string.attributionsIconContentDescription)); + LayoutParams attrParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + mAttributionsView.setLayoutParams(attrParams); + addView(mAttributionsView); + mAttributionsView.setOnClickListener(new AttributionOnClickListener()); + // Setup Support For Listener Tracking // MapView's internal listener is setup in onCreate() mOnMapChangedListener = new ArrayList<>(); @@ -412,7 +451,29 @@ public class MapView extends FrameLayout implements LocationListener { } setStyleClasses(styleClasses); } + + // Compass setCompassEnabled(typedArray.getBoolean(R.styleable.MapView_compassEnabled, true)); + setCompassGravity(typedArray.getInt(R.styleable.MapView_compassGravity, Gravity.TOP | Gravity.END)); + setWidgetMargins(mCompassView, typedArray.getDimension(R.styleable.MapView_compassMarginLeft, DIMENSION_TEN_DP) + , typedArray.getDimension(R.styleable.MapView_compassMarginTop, DIMENSION_TEN_DP) + , typedArray.getDimension(R.styleable.MapView_compassMarginRight, DIMENSION_TEN_DP) + , typedArray.getDimension(R.styleable.MapView_compassMarginBottom, DIMENSION_TEN_DP)); + + // Logo + setLogoGravity(typedArray.getInt(R.styleable.MapView_logoGravity, Gravity.BOTTOM | Gravity.START)); + setWidgetMargins(mLogoView, typedArray.getDimension(R.styleable.MapView_logoMarginLeft, DIMENSION_SIXTEEN_DP) + , typedArray.getDimension(R.styleable.MapView_logoMarginTop, DIMENSION_SIXTEEN_DP) + , typedArray.getDimension(R.styleable.MapView_logoMarginRight, DIMENSION_SIXTEEN_DP) + , typedArray.getDimension(R.styleable.MapView_logoMarginBottom, DIMENSION_SIXTEEN_DP)); + + // Attribution + setAttributionGravity(typedArray.getInt(R.styleable.MapView_attributionGravity, Gravity.BOTTOM | Gravity.END)); + setWidgetMargins(mAttributionsView, typedArray.getDimension(R.styleable.MapView_attributionMarginLeft, DIMENSION_SIXTEEN_DP) + , typedArray.getDimension(R.styleable.MapView_attributionMarginTop, DIMENSION_SIXTEEN_DP) + , typedArray.getDimension(R.styleable.MapView_attributionMarginRight, DIMENSION_SIXTEEN_DP) + , typedArray.getDimension(R.styleable.MapView_attributionMarginBottom, DIMENSION_SIXTEEN_DP)); + setMyLocationEnabled(typedArray.getBoolean(R.styleable.MapView_myLocationEnabled, false)); } finally { typedArray.recycle(); @@ -1835,6 +1896,48 @@ public class MapView extends FrameLayout implements LocationListener { updateMap(MapChange.MapChangeNullChange); } + public void setCompassGravity(int gravity){ + setWidgetGravity(mCompassView, gravity); + } + + public void setCompassMargins(int left, int top, int right, int bottom){ + setWidgetMargins(mCompassView, left, top, right, bottom); + } + + public void setLogoGravity(int gravity){ + setWidgetGravity(mLogoView, gravity); + } + + public void setLogoMargins(int left, int top, int right, int bottom){ + setWidgetMargins(mLogoView, left, top, right, bottom); + } + + public void setAttributionGravity(int gravity){ + setWidgetGravity(mAttributionsView, gravity); + } + + public void setAttributionMargins(int left, int top, int right, int bottom) { + setWidgetMargins(mAttributionsView, left, top, right, bottom); + } + + private void setWidgetGravity(@NonNull final View view, int gravity){ + LayoutParams layoutParams = (LayoutParams) view.getLayoutParams(); + layoutParams.gravity = gravity; + view.setLayoutParams(layoutParams); + } + + private void setWidgetMargins(@NonNull final View view, int left, int top, int right, int bottom){ + LayoutParams layoutParams = (LayoutParams) view.getLayoutParams(); + layoutParams.setMargins(left,top,right,bottom); + view.setLayoutParams(layoutParams); + } + + private void setWidgetMargins(@NonNull final View view, float leftDp, float topDp, float rightDp, float bottomDp){ + LayoutParams layoutParams = (LayoutParams) view.getLayoutParams(); + layoutParams.setMargins((int)(leftDp*mScreenDensity),(int)(topDp*mScreenDensity),(int)(rightDp*mScreenDensity),(int)(bottomDp*mScreenDensity)); + view.setLayoutParams(layoutParams); + } + // This class handles sensor updates to calculate compass bearing private class CompassListener implements SensorEventListener { @@ -1889,6 +1992,30 @@ public class MapView extends FrameLayout implements LocationListener { } + private static class AttributionOnClickListener implements View.OnClickListener, DialogInterface.OnClickListener { + + // Called when someone presses the attribution icon + @Override + public void onClick(View v) { + Context context = v.getContext(); + String[] items = context.getResources().getStringArray(R.array.attribution_names); + AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setTitle(R.string.attributionsDialogTitle); + builder.setAdapter(new ArrayAdapter<>(context, android.R.layout.simple_list_item_1, items), this); + builder.show(); + } + + // Called when someone selects an attribution + @Override + public void onClick(DialogInterface dialog, int which) { + Context context = ((Dialog)dialog).getContext(); + String[]links = context.getResources().getStringArray(R.array.attribution_links); + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setData(Uri.parse(links[which])); + context.startActivity(intent); + } + } + /** * LOST's LocationListener Callback * @param location New Location diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/color/material_bg_selector.xml b/android/java/MapboxGLAndroidSDK/src/main/res/color/material_bg_selector.xml new file mode 100644 index 000000000..0da674ac7 --- /dev/null +++ b/android/java/MapboxGLAndroidSDK/src/main/res/color/material_bg_selector.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-hdpi/ic_info_outline_black_24dp.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-hdpi/ic_info_outline_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..4b5ab06e19d61515cf3a7395db43a81bb30a8203 GIT binary patch literal 487 zcmVS-P=?%O3jv@aJa6HGW<0ceyC!`rEoc~?j{U=`ic|b z9N*QPsMv*+MQv@1i8kR%)UIh1`=XoCqqIYBOKErvea{GWZ!y>;D~RpT`=%tUi9cM8 zjMJd-5IZXpx*;AQpQG66NVp4e3Hh{Q=T<@);yl@>u@F125nkF002ovPDHLkV1kFY-~<2w literal 0 HcmV?d00001 diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-mdpi/ic_info_outline_black_24dp.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-mdpi/ic_info_outline_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..e0c9fe0eb8457013fbfa6e2efea61fca70bb9303 GIT binary patch literal 323 zcmV-J0lfZ+P)&s5ci5fY}sT-yed|rRg0)~VyRe(RxP5| ziKSu?+iDTDUGbuL5L2~?+LgFdoQk=|C}Pxj7RQRtyXcJ~MwepHsvL@iJ?s4SCH8$Y z6AQgYt#Ro~-1uQ)CSvZwj!tLSm1hyxCe}LeCL$stVz6(6)`@$smX==JIoA4R{{X3C VfQx`Hg^K_H002ovPDHLkV1oM>kN^Mx literal 0 HcmV?d00001 diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xhdpi/ic_info_outline_black_24dp.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xhdpi/ic_info_outline_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..b706f0d06a9a1e5e2f6606c01e84094ee6a99b42 GIT binary patch literal 640 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 literal 0 HcmV?d00001 diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxxhdpi/ic_info_outline_black_24dp.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxxhdpi/ic_info_outline_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..c1e2a03a4bc540419ce1165d5dedd8d5345fdec2 GIT binary patch literal 1256 zcmVP)W$LQv#I8j8T_{yf~=m$~;IXzu5?eh%l+bI*O5LnIQ3L?S-g zNEKIT<0XBJGshx}%rQL6n2^)65BytPpur(aAq3mzkx5L*!vp z0a@Ola>x)hq%a~$J)clM5drmH23z#q<|xU<0`*qKPGo7Si~n z%wqBU&0hSlj{%E?RDuuU7MJcXB=Jj%b`&x_e(Xp;ExUAT@Y|(jm(qjWZ(B;_Uor&Y z6!R#Nv*chaGsx+GPf(5^TbQOC&z>U}Plh0!MlPf-JUW9CsUc{WQ6klNkmN0L=W$Hb zI`=E``6_{H*O2>uGL!}iknh%)aH)U^vHJHyC=I|j;!5~HKCWcN1R5Z;2B2BgU%-W! zczBp#L#PcDi)Yo>;Taa!Y@Ptv;<}7l4r)8NeQGlwNF& zYb9ky8`z|cGKQ@=tt4)=frR*F&DNq;5;NLBOdDlk)i+CZzQKZh$R zK8n3)UuX^N7uDk=aj8xWGC(Sn1_~Jx)mdCiFf4{?52b-lQTv8C9#o@5E)leAD3OzR z)Fn^Gaf%@QAdedG1kbj}b8XCXgrFSb3rcL@n*sbhFEP*Qfd2Kr_;5}_cz_aF;&K3M ze+ebhM9$XHgOZ`06n-hB6D318YwImEMS(?`<%O>vfHEvXL&vNpLe#!|zDLp9b&_k9T z*x5;~c-Pf0-68_APCn*}yr+}vWZ1(d62yp+WD|SHaD&H;+SWI+mO!0l8Wm6`sU`&F zbfE&s6E+i?YKBohW{8u7EWu?ypnS+US>hOx&jq=;y2>EuNMckT2YAG1l*`QUkZ)PT z3X$L_jr@gjkUknXOq>;|goD)5%rkl!W0nOLm}QJ!o^qco2Ph^Ii9{k1-~0zqnGDmx SqDLYC0000 literal 0 HcmV?d00001 diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/values/arrays.xml b/android/java/MapboxGLAndroidSDK/src/main/res/values/arrays.xml new file mode 100644 index 000000000..3e937722c --- /dev/null +++ b/android/java/MapboxGLAndroidSDK/src/main/res/values/arrays.xml @@ -0,0 +1,13 @@ + + + + © Mapbox + © OpenStreetMap + Improve this map + + + https://www.mapbox.com/about/maps/ + http://www.openstreetmap.org/about/ + https://www.mapbox.com/map-feedback + + \ No newline at end of file diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/values/attrs.xml b/android/java/MapboxGLAndroidSDK/src/main/res/values/attrs.xml index 7148429db..901044375 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/res/values/attrs.xml +++ b/android/java/MapboxGLAndroidSDK/src/main/res/values/attrs.xml @@ -11,7 +11,67 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/values/strings.xml b/android/java/MapboxGLAndroidSDK/src/main/res/values/strings.xml index ff91a160d..455fdb026 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/res/values/strings.xml +++ b/android/java/MapboxGLAndroidSDK/src/main/res/values/strings.xml @@ -4,4 +4,7 @@ Title Description Address + Attribution icon. Click to show attribution dialog. + Mapbox for Android + Mapbox logo. From 7ce853acc796fa75132bfff1f94c209d4fc8503f Mon Sep 17 00:00:00 2001 From: tobrunvannuland Date: Wed, 2 Sep 2015 20:49:54 +0200 Subject: [PATCH 06/26] Added save/restore state for CompassView, LogoView and AttributionView --- .../com/mapbox/mapboxgl/views/MapView.java | 66 ++++++++++++++++++- 1 file changed, 63 insertions(+), 3 deletions(-) diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java index c8cbcc554..689482b22 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java +++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java @@ -101,9 +101,24 @@ public class MapView extends FrameLayout implements LocationListener { private static final String STATE_ACCESS_TOKEN = "accessToken"; private static final String STATE_STYLE_CLASSES = "styleClasses"; private static final String STATE_DEFAULT_TRANSITION_DURATION = "defaultTransitionDuration"; - private static final String STATE_COMPASS_ENABLED = "compassEnabled"; private static final String STATE_MY_LOCATION_ENABLED = "myLocationEnabled"; private static final String STATE_USER_LOCATION_TRACKING_MODE = "userLocationTrackingMode"; + private static final String STATE_COMPASS_ENABLED = "compassEnabled"; + private static final String STATE_COMPASS_GRAVITY = "compassGravity"; + private static final String STATE_COMPASS_MARGIN_LEFT = "compassMarginLeft"; + private static final String STATE_COMPASS_MARGIN_TOP = "compassMarginTop"; + private static final String STATE_COMPASS_MARGIN_RIGHT = "compassMarginRight"; + private static final String STATE_COMPASS_MARGIN_BOTTOM = "compassMarginBottom"; + private static final String STATE_LOGO_GRAVITY = "logoGravity"; + private static final String STATE_LOGO_MARGIN_LEFT = "logoMarginLeft"; + private static final String STATE_LOGO_MARGIN_TOP = "logoMarginTop"; + private static final String STATE_LOGO_MARGIN_RIGHT = "logoMarginRight"; + private static final String STATE_LOGO_MARGIN_BOTTOM = "logoMarginBottom"; + private static final String STATE_ATTRIBUTION_GRAVITY = "attrGravity"; + private static final String STATE_ATTRIBUTION_MARGIN_LEFT = "attrMarginLeft"; + private static final String STATE_ATTRIBUTION_MARGIN_TOP = "attrMarginTop"; + private static final String STATE_ATTRIBUTION_MARGIN_RIGHT = "attrMarginRight"; + private static final String STATE_ATTRIBUTION_MARGIN_BOTTOM = "atrrMarginBottom"; // Used for positioning views private static final float DIMENSION_SIXTEEN_DP = 16f; @@ -835,9 +850,30 @@ public class MapView extends FrameLayout implements LocationListener { setStyleClasses(appliedStyleClasses); } mNativeMapView.setDefaultTransitionDuration(savedInstanceState.getLong(STATE_DEFAULT_TRANSITION_DURATION)); - setCompassEnabled(savedInstanceState.getBoolean(STATE_COMPASS_ENABLED)); setMyLocationEnabled(savedInstanceState.getBoolean(STATE_MY_LOCATION_ENABLED)); setUserLocationTrackingMode((UserLocationTrackingMode) savedInstanceState.getSerializable(STATE_USER_LOCATION_TRACKING_MODE)); + + // Compass + setCompassEnabled(savedInstanceState.getBoolean(STATE_COMPASS_ENABLED)); + setCompassGravity(savedInstanceState.getInt(STATE_COMPASS_GRAVITY)); + setCompassMargins(savedInstanceState.getInt(STATE_COMPASS_MARGIN_LEFT) + , savedInstanceState.getInt(STATE_COMPASS_MARGIN_TOP) + , savedInstanceState.getInt(STATE_COMPASS_MARGIN_RIGHT) + , savedInstanceState.getInt(STATE_COMPASS_MARGIN_BOTTOM)); + + // Logo + setLogoGravity(savedInstanceState.getInt(STATE_LOGO_GRAVITY)); + setLogoMargins(savedInstanceState.getInt(STATE_LOGO_MARGIN_LEFT) + , savedInstanceState.getInt(STATE_LOGO_MARGIN_TOP) + , savedInstanceState.getInt(STATE_LOGO_MARGIN_RIGHT) + , savedInstanceState.getInt(STATE_LOGO_MARGIN_BOTTOM)); + + // Attribution + setAttributionGravity(savedInstanceState.getInt(STATE_ATTRIBUTION_GRAVITY)); + setAttributionMargins(savedInstanceState.getInt(STATE_ATTRIBUTION_MARGIN_LEFT) + , savedInstanceState.getInt(STATE_ATTRIBUTION_MARGIN_TOP) + , savedInstanceState.getInt(STATE_ATTRIBUTION_MARGIN_RIGHT) + , savedInstanceState.getInt(STATE_ATTRIBUTION_MARGIN_BOTTOM)); } // Force a check for an access token @@ -868,9 +904,33 @@ public class MapView extends FrameLayout implements LocationListener { outState.putString(STATE_ACCESS_TOKEN, getAccessToken()); outState.putStringArrayList(STATE_STYLE_CLASSES, new ArrayList<>(getStyleClasses())); outState.putLong(STATE_DEFAULT_TRANSITION_DURATION, mNativeMapView.getDefaultTransitionDuration()); - outState.putBoolean(STATE_COMPASS_ENABLED, isCompassEnabled()); outState.putBoolean(STATE_MY_LOCATION_ENABLED, isMyLocationEnabled()); outState.putSerializable(STATE_USER_LOCATION_TRACKING_MODE, getUserLocationTrackingMode()); + + // Compass + LayoutParams compassParams = (LayoutParams) mCompassView.getLayoutParams(); + outState.putBoolean(STATE_COMPASS_ENABLED, isCompassEnabled()); + outState.putInt(STATE_COMPASS_GRAVITY, compassParams.gravity ); + outState.putInt(STATE_COMPASS_MARGIN_LEFT, compassParams.leftMargin); + outState.putInt(STATE_COMPASS_MARGIN_TOP, compassParams.topMargin); + outState.putInt(STATE_COMPASS_MARGIN_BOTTOM, compassParams.bottomMargin); + outState.putInt(STATE_COMPASS_MARGIN_RIGHT, compassParams.rightMargin); + + // Logo + LayoutParams logoParams = (LayoutParams) mLogoView.getLayoutParams(); + outState.putInt(STATE_LOGO_GRAVITY, logoParams.gravity); + outState.putInt(STATE_LOGO_MARGIN_LEFT, logoParams.leftMargin); + outState.putInt(STATE_LOGO_MARGIN_TOP, logoParams.topMargin); + outState.putInt(STATE_LOGO_MARGIN_RIGHT, logoParams.rightMargin); + outState.putInt(STATE_LOGO_MARGIN_BOTTOM, logoParams.bottomMargin); + + // Attribution + LayoutParams attrParams = (LayoutParams) mAttributionsView.getLayoutParams(); + outState.putInt(STATE_ATTRIBUTION_GRAVITY, attrParams.gravity); + outState.putInt(STATE_ATTRIBUTION_MARGIN_LEFT, attrParams.leftMargin); + outState.putInt(STATE_ATTRIBUTION_MARGIN_TOP, attrParams.topMargin); + outState.putInt(STATE_ATTRIBUTION_MARGIN_RIGHT, attrParams.rightMargin); + outState.putInt(STATE_ATTRIBUTION_MARGIN_BOTTOM, attrParams.bottomMargin); } // Called when we need to clean up From 2a898ae853c728070e96dfb9b246dd45dbd6db2d Mon Sep 17 00:00:00 2001 From: tobrun Date: Sun, 6 Sep 2015 15:16:56 +0200 Subject: [PATCH 07/26] Refactored ColorStateList of attribution control to a Drawable selector, added images responding to different states. --- .../java/com/mapbox/mapboxgl/views/MapView.java | 8 +------- .../res/drawable-hdpi/ic_info_blue_normal.png | Bin 0 -> 2194 bytes .../res/drawable-hdpi/ic_info_blue_pressed.png | Bin 0 -> 2133 bytes .../drawable-hdpi/ic_info_outline_black_24dp.png | Bin 487 -> 0 bytes .../res/drawable-mdpi/ic_info_blue_normal.png | Bin 0 -> 1354 bytes .../res/drawable-mdpi/ic_info_blue_pressed.png | Bin 0 -> 1391 bytes .../drawable-mdpi/ic_info_outline_black_24dp.png | Bin 323 -> 0 bytes .../res/drawable-xhdpi/ic_info_blue_normal.png | Bin 0 -> 2710 bytes .../res/drawable-xhdpi/ic_info_blue_pressed.png | Bin 0 -> 2738 bytes .../ic_info_outline_black_24dp.png | Bin 640 -> 0 bytes .../res/drawable-xxhdpi/ic_info_blue_normal.png | Bin 0 -> 4256 bytes .../res/drawable-xxhdpi/ic_info_blue_pressed.png | Bin 0 -> 4240 bytes .../ic_info_outline_black_24dp.png | Bin 940 -> 0 bytes .../res/drawable-xxxhdpi/ic_info_blue_normal.png | Bin 0 -> 730 bytes .../drawable-xxxhdpi/ic_info_blue_pressed.png | Bin 0 -> 836 bytes .../ic_info_outline_black_24dp.png | Bin 1256 -> 0 bytes .../src/main/res/drawable/ic_info_selector.xml | 5 +++++ 17 files changed, 6 insertions(+), 7 deletions(-) create mode 100644 android/java/MapboxGLAndroidSDK/src/main/res/drawable-hdpi/ic_info_blue_normal.png create mode 100644 android/java/MapboxGLAndroidSDK/src/main/res/drawable-hdpi/ic_info_blue_pressed.png delete mode 100644 android/java/MapboxGLAndroidSDK/src/main/res/drawable-hdpi/ic_info_outline_black_24dp.png create mode 100644 android/java/MapboxGLAndroidSDK/src/main/res/drawable-mdpi/ic_info_blue_normal.png create mode 100644 android/java/MapboxGLAndroidSDK/src/main/res/drawable-mdpi/ic_info_blue_pressed.png delete mode 100644 android/java/MapboxGLAndroidSDK/src/main/res/drawable-mdpi/ic_info_outline_black_24dp.png create mode 100644 android/java/MapboxGLAndroidSDK/src/main/res/drawable-xhdpi/ic_info_blue_normal.png create mode 100644 android/java/MapboxGLAndroidSDK/src/main/res/drawable-xhdpi/ic_info_blue_pressed.png delete mode 100644 android/java/MapboxGLAndroidSDK/src/main/res/drawable-xhdpi/ic_info_outline_black_24dp.png create mode 100644 android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxhdpi/ic_info_blue_normal.png create mode 100644 android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxhdpi/ic_info_blue_pressed.png delete mode 100644 android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxhdpi/ic_info_outline_black_24dp.png create mode 100644 android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxxhdpi/ic_info_blue_normal.png create mode 100644 android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxxhdpi/ic_info_blue_pressed.png delete mode 100644 android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxxhdpi/ic_info_outline_black_24dp.png create mode 100644 android/java/MapboxGLAndroidSDK/src/main/res/drawable/ic_info_selector.xml diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java index 689482b22..714379b53 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java +++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java @@ -9,9 +9,7 @@ import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; -import android.content.res.ColorStateList; import android.content.res.TypedArray; -import android.content.res.XmlResourceParser; import android.graphics.Bitmap; import android.graphics.Matrix; import android.graphics.PointF; @@ -31,7 +29,6 @@ import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.content.ContextCompat; -import android.support.v4.graphics.drawable.DrawableCompat; import android.support.v4.view.GestureDetectorCompat; import android.support.v4.view.ScaleGestureDetectorCompat; import android.text.TextUtils; @@ -424,10 +421,7 @@ public class MapView extends FrameLayout implements LocationListener { // Setup Attributions control mAttributionsView = new ImageView(mContext); - Drawable attrDrawable = ContextCompat.getDrawable(mContext, R.drawable.ic_info_outline_black_24dp); - attrDrawable = DrawableCompat.wrap(attrDrawable); - DrawableCompat.setTintList(attrDrawable, getResources().getColorStateList(R.color.material_bg_selector, mContext.getTheme())); - mAttributionsView.setImageDrawable(attrDrawable); + mAttributionsView.setBackgroundResource(R.drawable.ic_info_selector); mAttributionsView.setContentDescription(getResources().getString(R.string.attributionsIconContentDescription)); LayoutParams attrParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); mAttributionsView.setLayoutParams(attrParams); diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-hdpi/ic_info_blue_normal.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-hdpi/ic_info_blue_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..de44e3ddc08a6ec2733d5f9a9aef169c0cf97805 GIT binary patch literal 2194 zcmY*b3pf*A8y_mn{g&MCwY31ypUcm1HvAEGXd(b0AhBy)fa@g(H~@4o%7f&AbbaimV{A`4GRq?!eSAsKM^pFzZ(XtD*uF#@Ca28q_eUmAquN( zq<2J5U)2<-tgLJj6^MhmTG{+g=j;%wXGo+77#K_@ll91l^$1ZxU;`)=3f4CS8ybQ* z2oNzYoP>!5g%j0&k^G0p3QG)#3XUKJ6T+2uc`^QkXc9tIbyw)m_*Ew<824YLaN_T_ zI1Pe#PrwFx`rtp@oK%zDDC|U3FqWgd%WrC6@)P-gvEMo-;9c?mDdtzFKck#hO@Suh zKi6gobm}~W1_1UA*jt&SJovjkkfErPlI_#&MKL(a&HcJ5X&DASDMpbzI>^n8f2<_- z3?t;wfS0+I^~)N1p;aofepIRSBgQvl#0Oi1m`i()i~skp zr^L2K`{jF9Sr`zcrSlCZWDpW%6gKbqLm&*Kf{!)pHf?-`nuXF{e;cAqXSN05%}=7? zz*FAmt7Vsw+y~!HeTlu1=OiD^vY;i{Xg7wThov}&2uuXTU{gFQ90BP zL?^haObHE}gOKdL6nNFPFxOf|GWKgx6#Gm=@{&$iuhNGKn^&EdG$y!Qex||m(c}KA z)oZ-A>pPM;=E5C1aV#`|*6Gv|pu3Dp*IjWsLv~!#n9YB1eJ)E9;hi^Z8YE$yA;Yld z797x6?%`_^N>m=E`p%kC9}X!tGrvxnN?lsgzraO<3{j;NaHYDPkhkswkaf7(%a{&p zk(ss(x8jBj9uNPEg-_!yPTvo&T?3a1DBR78cDNa}nOtjB+U8}AN&OdBrjzJYQ_EK6 za>;NB((t~RfkgblD<>JY)V#)1eJkHpcJd64^+p`opY<{1+90*Fo2{cI7YRBX5^o`l zm+$5#(`DNA9m3K;CgXan@A}XOKM$ho5z9698;WvjV4)r>c@_h2+ z{ZBq}tK8Sz87Yx>GG2_)AEiV?qx{R0Q z>pdb^+1!3Ta$-Y*qgnWk)Qz!6UTxWfX(sNp(=PbYE`{6psv0WX=!>F!a3|t0f}v8N zby~$sGH-P-(w4b`jWHsnh}l^}9v>VjuoXQDN|it11fR(CvY>mg?u@Cb%VE_9s_|(_ zlMo*k?kqP?XjT|R6D-VIqSa*HlfjgA5=po@H`!cAT=2U=;%c{0H$;+hrAl9bLdEZj z&y!`QExGEehDL|CqQwGl@bCw@ zr~SKUboD2(6!I1&v7_%6`p`4BgU5|y5}Q4c@mqx{Iod}T{OX{V)t4<9{IJ>HJ@Xg| z^AT~SpjhbDzL`nN1onK8y!7lIbDb5awgBCy7@F0#T%Q@r1ah8gKk^Jr|H&m_jJjs1 zZ^c)_*eyN9vZJlj(qvETwsYcXtM->qP`Cg!^?c(7ME zQ^+|{*pXu5ueL-uk!| J-NNtuzX40N*J=O& literal 0 HcmV?d00001 diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-hdpi/ic_info_blue_pressed.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-hdpi/ic_info_blue_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..fa26786242c07a74e6de23c0e89703a50ad9b84f GIT binary patch literal 2133 zcmY*adpr~B8y_+EILtN8Z0Rg!bICPhTyn1nzo~xxe&_vsp7(v8=lwq4@AJI>yyx8yI>||ENCN->Ijpli zUU=@>GD)Ct9|IH?3J(z~-pLNY?$-P$45VV52~+?;Mrq4L09T9EgaAUgmk-Sc=V}>D zi9!a3P=ZKEdQ^-M4FFitEro6ri53WAzR|@9emfbC=l&>yI|d0an+fcgA9r$|B({p-sIJF>vHg2u-l)rF#>W zSblwYb*#lZ*LQDS>$clI`pS7CFOn7(l@r*g8=Xs?w_i2%hZ+&7bmOVN3erU8UB)X@ z(}33I^;p&$G4(0?q3RFDka>1%h0Sxf45R*=Bg2VZ1bEG?X#R}sIU*x@V|*m?1%Dbd zz;c?V!CawwHQ4n*vi*5o1{=`(vfA4$^QG!B7%Jd6ZO;{g^=2Q~-C!~OvMM)1UTaz` zS-adz3bNr?r^4zvdNrV=S2oCz;3>h89L+xxu>)ZKV&w7kx2(i{-~$q>6VjRLKpU(2 zr)npav>$Fy_#`o$=pL(D%4I)ztVtN=nHOS<7`nNv@aVMnrlQ|;=Q@E6{=91f-)^sw zLA3IeWCZpzoJqtpsvK9KcBQGL*(RJGtA@&dbwM!>=OsTIQv4t)#pzjPo?W73{_E_! z&r{5=o+F#SZd|DV?4VK$jStbvP=hfrixA@OeGabhZ}7+9_Uwe6?NJ_S3q7H(YU4p|Mro6MkBEnYG=|Ia zRx{+=vJos2fgwBXu2qERB@}#NUCS{_|6)G2t*v{eMKyB2Lh#uRx0jd3+!XoWY@3UG zyNg`(FUW$mk~-k)2qnD@Bu;A}&PV|QgQRihnePV0JWZ>1fG(FFQQI+IfWXOca*_Tg zi1a1QtzMiQ51(l=FQ{qVy&&=E+<~^xQM$>kNylUhiR{v$NRyiT_U10jq3Yn>OYbnmMPZe)B96#5ha&Vl0!0VCud&2+N4r-cMYGtTTBY# zolw}iFNQ}FC;7#?!uQF+buJ0cKd;o`eBI-0cxlF^&P24=;~_^W4-BntkD_GRNuBXV zIIaV@~YK5afQ1N*56|VR)|-|WxUzjS*wuE$yLWL->VBk!<04I;qGHFFVFSN z%CEWdZ3pQ-)Zm4=m^9hL6;gMcQsKFy5Gzz(?9QpbNuq(d#|)%w->Zc6doW8*mSJFx z_oEMFT%#IpGehHiH+(o3GD?7G2G98Gy6lN2N|_=^!fISa%%U_4#)XwU*vTu8EcSGi^SOSA9zP z8hhb1=&-Z9&4C*m`f~cd9w0x^;>C=drTn?;g~?YhZfwBDkHldcB{xyCy83m)(5CC7 z+;Hf_(TtP)uH&Ap?8JtS9uSBZ)hS3mTK7R~NA5#$!$!o+MLBh%HM_@i^Vu`QaIsF$ zu@j>UE(v$zTst_eeNjg#iw*ZWUKs?f+I+=+(pt@`T&^@FJlgu}u?`3A*>*(6e*pH= BzA^v+ literal 0 HcmV?d00001 diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-hdpi/ic_info_outline_black_24dp.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-hdpi/ic_info_outline_black_24dp.png deleted file mode 100644 index 4b5ab06e19d61515cf3a7395db43a81bb30a8203..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 487 zcmVS-P=?%O3jv@aJa6HGW<0ceyC!`rEoc~?j{U=`ic|b z9N*QPsMv*+MQv@1i8kR%)UIh1`=XoCqqIYBOKErvea{GWZ!y>;D~RpT`=%tUi9cM8 zjMJd-5IZXpx*;AQpQG66NVp4e3Hh{Q=T<@);yl@>u@F125nkF002ovPDHLkV1kFY-~<2w diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-mdpi/ic_info_blue_normal.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-mdpi/ic_info_blue_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..dd50478ac143d77b36c6a74c5fdcf6183f8a3b89 GIT binary patch literal 1354 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&a=a>mHakcg59UmvUF{9L`nl>DSry^7odplSvNn+hu+GdHy)QK2F?C$HG5 z!d3~a!V1U+3F|8Y3;nDA{o-C@9zzrKDK}xwt{K19`Se z86_nJR{Hwo<>h+i#(Mch>H3D2mX`VkM*2oZx=P7{9O-#x!EwNQn0$BtH5O0c3d|4@L;p!@;Rg)$-uze<>}%W;=#K$ z^sK*dpuqf_x*Q^1xnv=J`8}9#k_O`h^|AQsZCa?wvhcdLd zC+<-Nk4a<8t5{Jkap>3j9fZpUtLB-_Sa{ugIqnRTF0 zr$9zEORD;=W6Dy2mt2o;ORo8SMrnDR+96h#`l{Lo&%&QtFOdG^ytDCL53jMOC8x@< z^!5o4CSEPL#&(B9c~{D{r5Su?66GKl5ht*C571JuOipnq7OJNc=Rl(rR#b)d%pNjwr}|dB_;$; zoqa6LKFQ>o=WW(|AJtc8{Z9OLZ|$CW?=Gkte$;BK-m2UXCV%bP=81nE{c^beRAAYh z#>NAlc}XS5HolT>|8b?p;Z@}8{U2iv3h8P;*A)9LIJwmB{+#w}?>YAFt=?p3{_h!| z;#+q!S3gMFeDwa~x$I)s zjaNSRzgiXXPm)&nUMpyEYtnAt$D7Y@ShlbK|D0Nn=~q6U$#u-WH7!^mO0!UdIqYdv z3jc#{?wNVLGO>&9*p^=oIVO>}NO{+(gE3s3JDODkzTWNS!%ZdJVJ*Szxrj z#k|N=VQcGwXC;ZL7Aq?jwk-{`v*}v*P{42E=XL{~nA5ZVWfZp+oqj5^;Io%}b875U zh8RAJqbGwi|8o0HVO^i5~@s2rKmsj1}_K5Y|uhT&n z1LkIn96fvY$1!>Dqt})#o@)BUbP0l+XkKQZzk) literal 0 HcmV?d00001 diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-mdpi/ic_info_blue_pressed.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-mdpi/ic_info_blue_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..d377f3cb8c2fc5a059efd69f58ba5908ed76066c GIT binary patch literal 1391 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&a=a>mHakcg59UmvUF{9L`nl>DSry^7odplSvNn+hu+GdHy)QK2F?C$HG5 z!d3~a!V1U+3F|8Y3;nDA{o-C@9zzrKDK}xwt{K19`Se z86_nJR{Hwo<>h+i#(Mch>H3D2mX`VkM*2oZx=P7{9O-#x!EwNQn0$BtH5O0c3d|4@L;p!@;Rg)$-uz8-qXb~#DjNk zm~W0xporafzfAAt8Ox;XyVX=C-MYE5wX9u(GtErMGrUYm(@ZE%SI5Qm&6-`CW;!~% zs*0s9l+O0$NL+j+B-4HC)tS{b&-aw4Kl|GMMXmf^?f07R*7o1$d~VCwdN4<0t}jE< zw8mDWgKLb!#Mp8)4bIKKTUTDtJa=YlWx4e0vo~(8yC3J)z2RxC&NMB7?w-I!Yq!g9 zog&ut_Smf0Gk18lynB2-;mOU9?MHUanwbB*zh67^YUFyAbqlyI+$sOxkzCAi;OvIO zk1XHwyPl6y663FrI(+_O|Z3go{)-PKcd%v?)9L4 z&TZ!S+m08NY>w?T7vBGqk9DT~lbs4HK32$23lVz4Qslll=WIc8V%3M>3%23MLdD)k zHUE2l`J`{`u|jqAH}^s=&7G~V>*Y=ssVafkAdzV%Z|0Tye6NeK`swv^(}^V)P4e%5 zTjF=`_&%Ari?_{L=(9}aeRQ6UMFQ_!wrJZ!Q!f{|&e^f;L(o^J?xUv16#lGUl&zVU(b=aY30jX%io=|eDgSuPwBQ*w{I=~<+h&&NA|DLjy)fL zsz&sk)Tt*=n7k+HZeS2UHD6U{@}ZKgi(QrlhdmTXUga)e;Nc}AU@EqZjhpvmEypRo zbfMpj(gJzjJA0m4#oXjov{@q9yR${rC*0R}#sW{dncHl=((0EDW=UAs<4;UCX4rz zW!lv9DTxiQU1y4Jv$!(fRqsaYr5Fj>hOLE)M+1~YyjKLMW@LB!>Gwsn-m7+(Tb;i1 z+NRU}@ixZF9^GYYW<5AiE#vTeVOdDVT(OIbwzLSE8m$h^kX`uTiO&tIghht(qRnqM zP4Ug1|F?9>1QxSretQysL1(Gs2A|aiZER{)es9|NkBs_%D3O^Y?f2KVmE0#NThf_Uq#J=hN%E%(egLDo*80oBC0_>&pLf T$EjPVfl5J7S3j3^P6lN literal 0 HcmV?d00001 diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-mdpi/ic_info_outline_black_24dp.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-mdpi/ic_info_outline_black_24dp.png deleted file mode 100644 index e0c9fe0eb8457013fbfa6e2efea61fca70bb9303..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 323 zcmV-J0lfZ+P)&s5ci5fY}sT-yed|rRg0)~VyRe(RxP5| ziKSu?+iDTDUGbuL5L2~?+LgFdoQk=|C}Pxj7RQRtyXcJ~MwepHsvL@iJ?s4SCH8$Y z6AQgYt#Ro~-1uQ)CSvZwj!tLSm1hyxCe}LeCL$stVz6(6)`@$smX==JIoA4R{{X3C VfQx`Hg^K_H002ovPDHLkV1oM>kN^Mx diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xhdpi/ic_info_blue_normal.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xhdpi/ic_info_blue_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..df7d7a88757135f8ae6c25f83f04e8d1340757b3 GIT binary patch literal 2710 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 HsDH{|I2Gyg literal 0 HcmV?d00001 diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xhdpi/ic_info_blue_pressed.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xhdpi/ic_info_blue_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..f5b183364174112edbcd242539676f7ad7e83ffb GIT binary patch literal 2738 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 xhz93Kv=biY(x2LAarfT`)JRx8_w{|6D6+y(#u literal 0 HcmV?d00001 diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxhdpi/ic_info_blue_pressed.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxhdpi/ic_info_blue_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..faaef0625d15ae837e23c270ce22d7d1b6ccdd48 GIT binary patch literal 4240 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 literal 0 HcmV?d00001 diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxhdpi/ic_info_outline_black_24dp.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxhdpi/ic_info_outline_black_24dp.png deleted file mode 100644 index 3847a9fe74774d3593dd694cff48ccca13cdec5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 940 zcmV;d15^BoP)mdcfcOtJM6uO{+z8D@UxkKMBq1+Buz@6?P#P0jG1VJo zr4$sRhK5k2Z=fXRN~6nW@y^{1KD~XI=}gYdoFjX&pWp3sm>a@9yM-m0@&}6isAEB(Qj;>qRst`p9~=6q zAu7LO=u+TQ_K7Dd@dg8*_ZUX>5!&WBSSti4^<9Bi7`TY2+y<+KU=~psWnX%OzQeO# z$Y%%reeR=-{wJ-1^+Iq9eT6F#>jwG=^_&zcppV__#9BjN7F^M%z)NCy=&SoFTsf2ppC<<**2_ZI5@SJo9Db@pv9Dwel>@Q2Y|A^pR+ zXm)h0I4$&8t(hXy6*cz3S)t(J`aO{jqc{F(SB1>4AMjd@E;uWs|KhZ2{;};ky2AQ2 z)rxDxD$`NJH=PukQuA$!?4zc}-&3$&Xn>Du{t5dULsafqFEod!oWp?rpGSuiRtueB z&+LQNE+8tK3|cF6gtuz;3+FNP08y#Yj|~U-15sJR*io8@$}eQs#}cB_phN-_NT5>I zKj|$a=v*bC1q7WMgQRsN@Unzi63g)%L1&Ybq;ZC~2s(dqkQ990An0_M#V3gY=Ga5f z`5TXvN})=^4!0;^!e^R~NT^Pc418W7q3m*(v-Aa=K4XNz?fnc_RXp{J*(OZ^8ac7(2N>$@cY O0000WFU8GbZ8()Nlj27Z*CxAAWdOomE>Pr0006tNklnlcoicoy71mc7~=byUr8rH2l-DLmA!hR=qH<5hGk%LMzBi9` z_N{(xT)oHVt|OlEeR(flhWNhxQslCu5VIYTbB#~0!=tl8EVOu3>YB;TE7hzVfB}4Mh48b5t}&+ zD!5&m8^AbPj_djK=Gug3%z{!*dE0&uD?v3`Fp~*2Ty9?)X+G*JJ9CKBP;oUgL7Zv6DH0>0Uz;k9*fhg#A?xUb0wPr zirJ8JUd$}chujp5xUY6k;bjcyWrmXIvIZPw2(Q!t00000005Nm4{Jegp7QBMr~m)} M07*qoM6N<$g0ufBqyPW_ literal 0 HcmV?d00001 diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxxhdpi/ic_info_blue_pressed.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxxhdpi/ic_info_blue_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..781263f760abe2339a8df4f9aba5d04fa5b9eed1 GIT binary patch literal 836 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP~CmS!L`er`8KA@0VW=KSdbAE1aYF-JD%fR4Vl$uzQ znxasiS(2gP?&%w#ke{cJsNkEJJoQO@Gy?6j(kYsC~VmFm{(&cgY?_QBh4X7}Ii<9G0M;9zkS0HX?K z9rkjId3HsA=4Z;>%W!Z#7;VH7=kmYjw+Y{RJ>CG3dm*6*c7M3#*6`@{EC#Oi*(@6S z)^RTQu*>bht{>5z(OpZs7%e%bpEB#-cu?qI)M|e3!b41&YkeoQ&RFPqfyW#N1 zFW=qr|DEJg$Y9__#SLsODwh}@bIv=;&@X>W=gFVc&5UyPIVW2`|9;HBO+nxJMzHj$ zlT$@6II%wYXEvk#P5dfJ?FHL=BhH6TIPf;QjCqGlY+t6#yO8#R{?H9mCZG8nu!dFj zU(V;lvwtYI6#V=9W$Nhw)e|=L{(q&Xoa?xj?w+}BgVYT6kE^#X5PRT4o?uX&}O7Mbt9_2-+d9A!l*H`D%_op0Fc6qV(mc(m)0xS>LMy?IH6xz`=@!;fE!9@WosPgTe~ HDWM4f2pMO@ literal 0 HcmV?d00001 diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxxhdpi/ic_info_outline_black_24dp.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxxhdpi/ic_info_outline_black_24dp.png deleted file mode 100644 index c1e2a03a4bc540419ce1165d5dedd8d5345fdec2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1256 zcmVP)W$LQv#I8j8T_{yf~=m$~;IXzu5?eh%l+bI*O5LnIQ3L?S-g zNEKIT<0XBJGshx}%rQL6n2^)65BytPpur(aAq3mzkx5L*!vp z0a@Ola>x)hq%a~$J)clM5drmH23z#q<|xU<0`*qKPGo7Si~n z%wqBU&0hSlj{%E?RDuuU7MJcXB=Jj%b`&x_e(Xp;ExUAT@Y|(jm(qjWZ(B;_Uor&Y z6!R#Nv*chaGsx+GPf(5^TbQOC&z>U}Plh0!MlPf-JUW9CsUc{WQ6klNkmN0L=W$Hb zI`=E``6_{H*O2>uGL!}iknh%)aH)U^vHJHyC=I|j;!5~HKCWcN1R5Z;2B2BgU%-W! zczBp#L#PcDi)Yo>;Taa!Y@Ptv;<}7l4r)8NeQGlwNF& zYb9ky8`z|cGKQ@=tt4)=frR*F&DNq;5;NLBOdDlk)i+CZzQKZh$R zK8n3)UuX^N7uDk=aj8xWGC(Sn1_~Jx)mdCiFf4{?52b-lQTv8C9#o@5E)leAD3OzR z)Fn^Gaf%@QAdedG1kbj}b8XCXgrFSb3rcL@n*sbhFEP*Qfd2Kr_;5}_cz_aF;&K3M ze+ebhM9$XHgOZ`06n-hB6D318YwImEMS(?`<%O>vfHEvXL&vNpLe#!|zDLp9b&_k9T z*x5;~c-Pf0-68_APCn*}yr+}vWZ1(d62yp+WD|SHaD&H;+SWI+mO!0l8Wm6`sU`&F zbfE&s6E+i?YKBohW{8u7EWu?ypnS+US>hOx&jq=;y2>EuNMckT2YAG1l*`QUkZ)PT z3X$L_jr@gjkUknXOq>;|goD)5%rkl!W0nOLm}QJ!o^qco2Ph^Ii9{k1-~0zqnGDmx SqDLYC0000 diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable/ic_info_selector.xml b/android/java/MapboxGLAndroidSDK/src/main/res/drawable/ic_info_selector.xml new file mode 100644 index 000000000..fdbabbae1 --- /dev/null +++ b/android/java/MapboxGLAndroidSDK/src/main/res/drawable/ic_info_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file From 4bdb0e2cc9613255ada077f84b8863c45975dacb Mon Sep 17 00:00:00 2001 From: tobrun Date: Sun, 6 Sep 2015 15:51:11 +0200 Subject: [PATCH 08/26] Added styling to the Attribution AlertDialog --- .../main/java/com/mapbox/mapboxgl/views/MapView.java | 4 ++-- .../src/main/res/layout/attribution_list_item.xml | 11 +++++++++++ .../MapboxGLAndroidSDK/src/main/res/values/colors.xml | 1 + .../MapboxGLAndroidSDK/src/main/res/values/styles.xml | 9 +++++++++ .../src/main/res/values/colors.xml | 2 +- 5 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 android/java/MapboxGLAndroidSDK/src/main/res/layout/attribution_list_item.xml create mode 100644 android/java/MapboxGLAndroidSDK/src/main/res/values/styles.xml diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java index 714379b53..20742ccc1 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java +++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java @@ -2053,9 +2053,9 @@ public class MapView extends FrameLayout implements LocationListener { public void onClick(View v) { Context context = v.getContext(); String[] items = context.getResources().getStringArray(R.array.attribution_names); - AlertDialog.Builder builder = new AlertDialog.Builder(context); + AlertDialog.Builder builder = new AlertDialog.Builder(context, R.style.AttributionAlertDialogStyle); builder.setTitle(R.string.attributionsDialogTitle); - builder.setAdapter(new ArrayAdapter<>(context, android.R.layout.simple_list_item_1, items), this); + builder.setAdapter(new ArrayAdapter<>(context, R.layout.attribution_list_item, items), this); builder.show(); } diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/layout/attribution_list_item.xml b/android/java/MapboxGLAndroidSDK/src/main/res/layout/attribution_list_item.xml new file mode 100644 index 000000000..f0a912158 --- /dev/null +++ b/android/java/MapboxGLAndroidSDK/src/main/res/layout/attribution_list_item.xml @@ -0,0 +1,11 @@ + + diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/values/colors.xml b/android/java/MapboxGLAndroidSDK/src/main/res/values/colors.xml index bf3f48431..bb1c326a8 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/res/values/colors.xml +++ b/android/java/MapboxGLAndroidSDK/src/main/res/values/colors.xml @@ -2,4 +2,5 @@ #FFFFFF #000000 + #1E8CAB diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/values/styles.xml b/android/java/MapboxGLAndroidSDK/src/main/res/values/styles.xml new file mode 100644 index 000000000..a0859a998 --- /dev/null +++ b/android/java/MapboxGLAndroidSDK/src/main/res/values/styles.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/android/java/MapboxGLAndroidSDKTestApp/src/main/res/values/colors.xml b/android/java/MapboxGLAndroidSDKTestApp/src/main/res/values/colors.xml index ac3b4fc30..af798515f 100644 --- a/android/java/MapboxGLAndroidSDKTestApp/src/main/res/values/colors.xml +++ b/android/java/MapboxGLAndroidSDKTestApp/src/main/res/values/colors.xml @@ -1,6 +1,6 @@ - #1E8CAB + @color/mapbox_blue #166B83 #E55E5E #FFFFFF From c00687c9327bce4c782962167177c5d6bbf888eb Mon Sep 17 00:00:00 2001 From: tobrun Date: Sun, 6 Sep 2015 16:37:34 +0200 Subject: [PATCH 09/26] Added "Improve this map" functionality, current zoom level, center latitude and longitude will be parsed in to the url of improve this map. --- .../com/mapbox/mapboxgl/views/MapView.java | 22 ++++++++++++++----- .../src/main/res/values/arrays.xml | 2 +- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java index 20742ccc1..5128ed567 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java +++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java @@ -121,6 +121,8 @@ public class MapView extends FrameLayout implements LocationListener { private static final float DIMENSION_SIXTEEN_DP = 16f; private static final float DIMENSION_TEN_DP = 10f; + private static final int IMPROVE_THIS_MAP_INDEX = 2; + /** * Every annotation that has been added to the map. */ @@ -426,7 +428,7 @@ public class MapView extends FrameLayout implements LocationListener { LayoutParams attrParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); mAttributionsView.setLayoutParams(attrParams); addView(mAttributionsView); - mAttributionsView.setOnClickListener(new AttributionOnClickListener()); + mAttributionsView.setOnClickListener(new AttributionOnClickListener(this)); // Setup Support For Listener Tracking // MapView's internal listener is setup in onCreate() @@ -2048,6 +2050,12 @@ public class MapView extends FrameLayout implements LocationListener { private static class AttributionOnClickListener implements View.OnClickListener, DialogInterface.OnClickListener { + private MapView mMapView; + + public AttributionOnClickListener(MapView mapView) { + mMapView = mapView; + } + // Called when someone presses the attribution icon @Override public void onClick(View v) { @@ -2059,13 +2067,17 @@ public class MapView extends FrameLayout implements LocationListener { builder.show(); } - // Called when someone selects an attribution + // Called when someone selects an attribution, 'Improve this map' adds location data to the url @Override public void onClick(DialogInterface dialog, int which) { - Context context = ((Dialog)dialog).getContext(); - String[]links = context.getResources().getStringArray(R.array.attribution_links); + Context context = ((Dialog) dialog).getContext(); + String url = context.getResources().getStringArray(R.array.attribution_links)[which]; + if (which == IMPROVE_THIS_MAP_INDEX) { + LatLng latLng = mMapView.getCenterCoordinate(); + url = String.format(url, latLng.getLongitude(), latLng.getLatitude(), (int) mMapView.getZoomLevel()); + } Intent intent = new Intent(Intent.ACTION_VIEW); - intent.setData(Uri.parse(links[which])); + intent.setData(Uri.parse(url)); context.startActivity(intent); } } diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/values/arrays.xml b/android/java/MapboxGLAndroidSDK/src/main/res/values/arrays.xml index 3e937722c..8a8e204b7 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/res/values/arrays.xml +++ b/android/java/MapboxGLAndroidSDK/src/main/res/values/arrays.xml @@ -8,6 +8,6 @@ https://www.mapbox.com/about/maps/ http://www.openstreetmap.org/about/ - https://www.mapbox.com/map-feedback + https://www.mapbox.com/map-feedback/#/%1$f/%2$f/%3$d \ No newline at end of file From fcfefadfda2873c4796bac93500a22144474be79 Mon Sep 17 00:00:00 2001 From: tobrun Date: Sun, 6 Sep 2015 19:20:05 +0200 Subject: [PATCH 10/26] Using AlertDialog from AppCompat instead of SDKs version --- .../src/main/java/com/mapbox/mapboxgl/views/MapView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java index 5128ed567..d21dc81f4 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java +++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java @@ -1,7 +1,6 @@ package com.mapbox.mapboxgl.views; import android.app.ActivityManager; -import android.app.AlertDialog; import android.app.Dialog; import android.content.BroadcastReceiver; import android.content.Context; @@ -31,6 +30,7 @@ import android.support.annotation.NonNull; import android.support.v4.content.ContextCompat; import android.support.v4.view.GestureDetectorCompat; import android.support.v4.view.ScaleGestureDetectorCompat; +import android.support.v7.app.AlertDialog; import android.text.TextUtils; import android.view.GestureDetector; import android.view.Gravity; From a5ae3a57bc7db1d59ef58101de5c912d533ca9c7 Mon Sep 17 00:00:00 2001 From: tobrun Date: Wed, 9 Sep 2015 18:40:27 +0200 Subject: [PATCH 11/26] Moved icon to the right of Mapbox logo --- .../com/mapbox/mapboxgl/views/MapView.java | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java index d21dc81f4..823424be7 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java +++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java @@ -118,10 +118,12 @@ public class MapView extends FrameLayout implements LocationListener { private static final String STATE_ATTRIBUTION_MARGIN_BOTTOM = "atrrMarginBottom"; // Used for positioning views - private static final float DIMENSION_SIXTEEN_DP = 16f; + private static final float DIMENSION_SEVEN_DP = 7f; private static final float DIMENSION_TEN_DP = 10f; + private static final float DIMENSION_SIXTEEN_DP = 16f; + private static final float DIMENSION_SEVENTYSIX_DP = 76f; - private static final int IMPROVE_THIS_MAP_INDEX = 2; + private static final int ATTRIBUTION_INDEX_IMPROVE_THIS_MAP = 2; /** * Every annotation that has been added to the map. @@ -423,7 +425,11 @@ public class MapView extends FrameLayout implements LocationListener { // Setup Attributions control mAttributionsView = new ImageView(mContext); - mAttributionsView.setBackgroundResource(R.drawable.ic_info_selector); + mAttributionsView.setClickable(true); + mAttributionsView.setImageResource(R.drawable.ic_info_selector); + int attrPadding = (int) (DIMENSION_SEVEN_DP * mScreenDensity); + mAttributionsView.setPadding(attrPadding, attrPadding, attrPadding, attrPadding); + mAttributionsView.setAdjustViewBounds(true); mAttributionsView.setContentDescription(getResources().getString(R.string.attributionsIconContentDescription)); LayoutParams attrParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); mAttributionsView.setLayoutParams(attrParams); @@ -479,11 +485,11 @@ public class MapView extends FrameLayout implements LocationListener { , typedArray.getDimension(R.styleable.MapView_logoMarginBottom, DIMENSION_SIXTEEN_DP)); // Attribution - setAttributionGravity(typedArray.getInt(R.styleable.MapView_attributionGravity, Gravity.BOTTOM | Gravity.END)); - setWidgetMargins(mAttributionsView, typedArray.getDimension(R.styleable.MapView_attributionMarginLeft, DIMENSION_SIXTEEN_DP) - , typedArray.getDimension(R.styleable.MapView_attributionMarginTop, DIMENSION_SIXTEEN_DP) - , typedArray.getDimension(R.styleable.MapView_attributionMarginRight, DIMENSION_SIXTEEN_DP) - , typedArray.getDimension(R.styleable.MapView_attributionMarginBottom, DIMENSION_SIXTEEN_DP)); + setAttributionGravity(typedArray.getInt(R.styleable.MapView_attributionGravity, Gravity.BOTTOM)); + setWidgetMargins(mAttributionsView, typedArray.getDimension(R.styleable.MapView_attributionMarginLeft, DIMENSION_SEVENTYSIX_DP) + , typedArray.getDimension(R.styleable.MapView_attributionMarginTop, DIMENSION_SEVEN_DP) + , typedArray.getDimension(R.styleable.MapView_attributionMarginRight, DIMENSION_SEVEN_DP) + , typedArray.getDimension(R.styleable.MapView_attributionMarginBottom, DIMENSION_SEVEN_DP)); setMyLocationEnabled(typedArray.getBoolean(R.styleable.MapView_myLocationEnabled, false)); } finally { @@ -2072,7 +2078,7 @@ public class MapView extends FrameLayout implements LocationListener { public void onClick(DialogInterface dialog, int which) { Context context = ((Dialog) dialog).getContext(); String url = context.getResources().getStringArray(R.array.attribution_links)[which]; - if (which == IMPROVE_THIS_MAP_INDEX) { + if (which == ATTRIBUTION_INDEX_IMPROVE_THIS_MAP) { LatLng latLng = mMapView.getCenterCoordinate(); url = String.format(url, latLng.getLongitude(), latLng.getLatitude(), (int) mMapView.getZoomLevel()); } From f8ba99bf956b50817a77348337ed91d7fedf4a9e Mon Sep 17 00:00:00 2001 From: tobrun Date: Wed, 9 Sep 2015 18:55:17 +0200 Subject: [PATCH 12/26] Changed title dialog --- .../java/MapboxGLAndroidSDK/src/main/res/values/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/values/strings.xml b/android/java/MapboxGLAndroidSDK/src/main/res/values/strings.xml index 455fdb026..be9a1d38c 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/res/values/strings.xml +++ b/android/java/MapboxGLAndroidSDK/src/main/res/values/strings.xml @@ -1,10 +1,10 @@ Map compass. Click to reset the map rotation to North. + Attribution icon. Click to show attribution dialog. + Mapbox Android SDK + Mapbox logo. Title Description Address - Attribution icon. Click to show attribution dialog. - Mapbox for Android - Mapbox logo. From 953fcfda8dbac339f232d6417a588a545d77d88b Mon Sep 17 00:00:00 2001 From: Brad Leege Date: Wed, 9 Sep 2015 15:15:23 -0500 Subject: [PATCH 13/26] #2293 - Removing Drawable --- .../src/main/java/com/mapbox/mapboxgl/views/MapView.java | 1 - 1 file changed, 1 deletion(-) diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java index 823424be7..664268141 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java +++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java @@ -14,7 +14,6 @@ import android.graphics.Matrix; import android.graphics.PointF; import android.graphics.RectF; import android.graphics.SurfaceTexture; -import android.graphics.drawable.Drawable; import android.hardware.GeomagneticField; import android.hardware.Sensor; import android.hardware.SensorEvent; From d894bb7c107018b37a43921fa34c28efe4135d93 Mon Sep 17 00:00:00 2001 From: Leith Bade Date: Fri, 11 Sep 2015 11:34:04 +1000 Subject: [PATCH 14/26] Call cancelTransitions when setting map position, zoom level, or direction. Fixes # 2296 --- .../src/main/java/com/mapbox/mapboxgl/views/MapView.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java index 664268141..614ccdb11 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java +++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java @@ -628,6 +628,7 @@ public class MapView extends FrameLayout implements LocationListener { public void setCenterCoordinate(LatLng centerCoordinate, boolean animated) { long duration = animated ? ANIMATION_DURATION : 0; + mNativeMapView.cancelTransitions(); mNativeMapView.setLatLng(centerCoordinate, duration); } @@ -638,6 +639,7 @@ public class MapView extends FrameLayout implements LocationListener { public void setCenterCoordinate(LatLngZoom centerCoordinate, boolean animated) { long duration = animated ? ANIMATION_DURATION : 0; + mNativeMapView.cancelTransitions(); mNativeMapView.setLatLngZoom(centerCoordinate, duration); } @@ -660,14 +662,17 @@ public class MapView extends FrameLayout implements LocationListener { public void setDirection(double direction, boolean animated) { long duration = animated ? ANIMATION_DURATION : 0; + mNativeMapView.cancelTransitions(); mNativeMapView.setBearing(-direction, duration); } public void resetPosition() { + mNativeMapView.cancelTransitions(); mNativeMapView.resetPosition(); } public void resetNorth() { + mNativeMapView.cancelTransitions(); mNativeMapView.resetNorth(); } @@ -681,6 +686,7 @@ public class MapView extends FrameLayout implements LocationListener { public void setZoomLevel(double zoomLevel, boolean animated) { long duration = animated ? ANIMATION_DURATION : 0; + mNativeMapView.cancelTransitions(); mNativeMapView.setZoom(zoomLevel, duration); } From 2a03e321541895ef3027863daa655a6286162396 Mon Sep 17 00:00:00 2001 From: Leith Bade Date: Fri, 11 Sep 2015 12:12:03 +1000 Subject: [PATCH 15/26] Update to Android build tools 23.0.1 Closes #2303 --- .travis.yml | 8 ++++---- android/java/MapboxGLAndroidSDK/gradle.properties | 2 +- android/java/MapboxGLAndroidSDKTestApp/build.gradle | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 2e300c568..091fd1e8f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -33,28 +33,28 @@ matrix: - os: linux env: FLAVOR=android ANDROID_ABI=arm-v7 BUILDTYPE=Release android: - components: [ 'build-tools-23', 'android-23', 'extra-android-m2repository', 'extra-android-support', 'extra-google-m2repository' ] + components: [ 'build-tools-23.0.1', 'android-23', 'extra-android-m2repository', 'extra-android-support', 'extra-google-m2repository' ] addons: apt: packages: [ 'lib32stdc++6' ] - os: linux env: FLAVOR=android ANDROID_ABI=arm-v7 BUILDTYPE=Debug android: - components: [ 'build-tools-23', 'android-23', 'extra-android-m2repository', 'extra-android-support', 'extra-google-m2repository' ] + components: [ 'build-tools-23.0.1', 'android-23', 'extra-android-m2repository', 'extra-android-support', 'extra-google-m2repository' ] addons: apt: packages: [ 'lib32stdc++6' ] - os: linux env: FLAVOR=android ANDROID_ABI=arm-v8 BUILDTYPE=Release android: - components: [ 'build-tools-23', 'android-23', 'extra-android-m2repository', 'extra-android-support', 'extra-google-m2repository' ] + components: [ 'build-tools-23.0.1', 'android-23', 'extra-android-m2repository', 'extra-android-support', 'extra-google-m2repository' ] addons: apt: packages: [ 'lib32stdc++6' ] - os: linux env: FLAVOR=android ANDROID_ABI=x86 BUILDTYPE=Release android: - components: [ 'build-tools-23', 'android-23', 'extra-android-m2repository', 'extra-android-support', 'extra-google-m2repository' ] + components: [ 'build-tools-23.0.1', 'android-23', 'extra-android-m2repository', 'extra-android-support', 'extra-google-m2repository' ] addons: apt: packages: [ 'lib32stdc++6' ] diff --git a/android/java/MapboxGLAndroidSDK/gradle.properties b/android/java/MapboxGLAndroidSDK/gradle.properties index 5d862987b..680aad376 100644 --- a/android/java/MapboxGLAndroidSDK/gradle.properties +++ b/android/java/MapboxGLAndroidSDK/gradle.properties @@ -14,7 +14,7 @@ POM_DEVELOPER_NAME=Mapbox ANDROID_MIN_SDK=15 ANDROID_BUILD_TARGET_SDK_VERSION=23 -ANDROID_BUILD_TOOLS_VERSION=23 +ANDROID_BUILD_TOOLS_VERSION=23.0.1 ANDROID_BUILD_SDK_VERSION=23 POM_NAME=Mapbox GL Android SDK diff --git a/android/java/MapboxGLAndroidSDKTestApp/build.gradle b/android/java/MapboxGLAndroidSDKTestApp/build.gradle index 84f627d9e..172f31d0f 100644 --- a/android/java/MapboxGLAndroidSDKTestApp/build.gradle +++ b/android/java/MapboxGLAndroidSDKTestApp/build.gradle @@ -39,7 +39,7 @@ gradle.projectsEvaluated { android { compileSdkVersion 23 - buildToolsVersion "23" + buildToolsVersion "23.0.1" repositories { mavenCentral() From 7971861aa5b0e5941dfdd0d78a54bc3aee9aee77 Mon Sep 17 00:00:00 2001 From: Leith Bade Date: Fri, 11 Sep 2015 15:47:28 +1000 Subject: [PATCH 16/26] Add missing support libs --- .../src/main/res/layout/activity_main.xml | 2 -- .../MapboxGLAndroidSDKTestApp/src/main/res/values/colors.xml | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/android/java/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_main.xml b/android/java/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_main.xml index 2d22dcce7..0e569b770 100644 --- a/android/java/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_main.xml +++ b/android/java/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_main.xml @@ -53,8 +53,6 @@ android:layout_gravity="end|bottom" android:layout_margin="@dimen/fab_margin" app:backgroundTint="@color/white" - app:borderWidth="0dp" - app:elevation="0dp" /> diff --git a/android/java/MapboxGLAndroidSDKTestApp/src/main/res/values/colors.xml b/android/java/MapboxGLAndroidSDKTestApp/src/main/res/values/colors.xml index af798515f..ac3b4fc30 100644 --- a/android/java/MapboxGLAndroidSDKTestApp/src/main/res/values/colors.xml +++ b/android/java/MapboxGLAndroidSDKTestApp/src/main/res/values/colors.xml @@ -1,6 +1,6 @@ - @color/mapbox_blue + #1E8CAB #166B83 #E55E5E #FFFFFF From b05f5c5f7fbb9fa79b068e6a265e3d6c2a77026b Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Wed, 26 Aug 2015 11:14:08 -0400 Subject: [PATCH 17/26] increase precision for coordinate conversions This fixes the earthquakes while panning at high zoom levels. Cherry-picked from 9607171612c4a40e41eddaff5230ad571571a5b9 on the perspective-improved-gestures branch. --- src/mbgl/map/transform_state.cpp | 31 +++++++++++++++---------------- src/mbgl/map/transform_state.hpp | 8 ++++---- src/mbgl/util/mat4.cpp | 2 +- src/mbgl/util/tile_coordinate.hpp | 12 ++++++------ src/mbgl/util/vec4.cpp | 2 +- 5 files changed, 27 insertions(+), 28 deletions(-) diff --git a/src/mbgl/map/transform_state.cpp b/src/mbgl/map/transform_state.cpp index c672ca5de..e37f10dc6 100644 --- a/src/mbgl/map/transform_state.cpp +++ b/src/mbgl/map/transform_state.cpp @@ -157,21 +157,21 @@ float TransformState::getPitch() const { #pragma mark - Projection -float TransformState::lngX(float lng) const { +double TransformState::lngX(double lng) const { return (180.0f + lng) * worldSize() / 360.0f; } -float TransformState::latY(float lat) const { - float y_ = 180.0f / M_PI * std::log(std::tan(M_PI / 4 + lat * M_PI / 360.0f)); +double TransformState::latY(double lat) const { + double y_ = 180.0f / M_PI * std::log(std::tan(M_PI / 4 + lat * M_PI / 360.0f)); return (180.0f - y_) * worldSize() / 360.0f; } -float TransformState::xLng(float x_, float worldSize_) const { +double TransformState::xLng(double x_, double worldSize_) const { return x_ * 360.0f / worldSize_ - 180.0f; } -float TransformState::yLat(float y_, float worldSize_) const { - float y2 = 180.0f - y_ * 360.0f / worldSize_; +double TransformState::yLat(double y_, double worldSize_) const { + double y2 = 180.0f - y_ * 360.0f / worldSize_; return 360.0f / M_PI * std::atan(std::exp(y2 * M_PI / 180.0f)) - 90.0f; } @@ -245,17 +245,16 @@ TileCoordinate TransformState::pointToCoordinate(const vec2 point) const matrix::transformMat4(coord0, point0, inverted); matrix::transformMat4(coord1, point1, inverted); - float w0 = coord0[3]; - float w1 = coord1[3]; - float x0 = coord0[0] / w0; - float x1 = coord1[0] / w1; - float y0 = coord0[1] / w0; - float y1 = coord1[1] / w1; - float z0 = coord0[2] / w0; - float z1 = coord1[2] / w1; + double w0 = coord0[3]; + double w1 = coord1[3]; + double x0 = coord0[0] / w0; + double x1 = coord1[0] / w1; + double y0 = coord0[1] / w0; + double y1 = coord1[1] / w1; + double z0 = coord0[2] / w0; + double z1 = coord1[2] / w1; - - float t = z0 == z1 ? 0 : (targetZ - z0) / (z1 - z0); + double t = z0 == z1 ? 0 : (targetZ - z0) / (z1 - z0); return { util::interpolate(x0, x1, t), util::interpolate(y0, y1, t), tileZoom }; } diff --git a/src/mbgl/map/transform_state.hpp b/src/mbgl/map/transform_state.hpp index d4b46f04b..c3e1072c9 100644 --- a/src/mbgl/map/transform_state.hpp +++ b/src/mbgl/map/transform_state.hpp @@ -79,10 +79,10 @@ private: // logical dimensions uint16_t width = 0, height = 0; - float xLng(float x, float worldSize) const; - float yLat(float y, float worldSize) const; - float lngX(float lon) const; - float latY(float lat) const; + double xLng(double x, double worldSize) const; + double yLat(double y, double worldSize) const; + double lngX(double lon) const; + double latY(double lat) const; float zoomScale(float zoom) const; float worldSize() const; diff --git a/src/mbgl/util/mat4.cpp b/src/mbgl/util/mat4.cpp index 123c8464f..0934cd081 100644 --- a/src/mbgl/util/mat4.cpp +++ b/src/mbgl/util/mat4.cpp @@ -46,7 +46,7 @@ void matrix::identity(mat4& out) { } bool matrix::invert(mat4& out, mat4& a) { - float a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], + double a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3], a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7], a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11], a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15], diff --git a/src/mbgl/util/tile_coordinate.hpp b/src/mbgl/util/tile_coordinate.hpp index 0f5f0dcb8..836539b5b 100644 --- a/src/mbgl/util/tile_coordinate.hpp +++ b/src/mbgl/util/tile_coordinate.hpp @@ -6,15 +6,15 @@ namespace mbgl { struct TileCoordinate { - float column; - float row; - float zoom; + double column; + double row; + double zoom; - TileCoordinate(float column_, float row_, float zoom_) : + TileCoordinate(double column_, double row_, double zoom_) : column(column_), row(row_), zoom(zoom_) {} - TileCoordinate zoomTo(float targetZoom) { - float scale = std::pow(2, targetZoom - zoom); + TileCoordinate zoomTo(double targetZoom) { + double scale = std::pow(2, targetZoom - zoom); return { column * scale, row * scale, targetZoom }; } diff --git a/src/mbgl/util/vec4.cpp b/src/mbgl/util/vec4.cpp index 415b15d80..bee4eaf97 100644 --- a/src/mbgl/util/vec4.cpp +++ b/src/mbgl/util/vec4.cpp @@ -25,7 +25,7 @@ using namespace mbgl; void matrix::transformMat4(vec4& out, vec4& a, mat4& m) { - float x = a[0], y = a[1], z = a[2], w = a[3]; + double x = a[0], y = a[1], z = a[2], w = a[3]; out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w; out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w; out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w; From 68778883851b3f0ea31294ccbddc858f061e62f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minh=20Nguye=CC=82=CC=83n?= Date: Thu, 10 Sep 2015 13:39:47 -0700 Subject: [PATCH 18/26] Increased precision of coordinate conversion methods Fixes #2230. --- src/mbgl/map/transform_state.cpp | 16 ++++++++-------- src/mbgl/map/transform_state.hpp | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/mbgl/map/transform_state.cpp b/src/mbgl/map/transform_state.cpp index e37f10dc6..ac3988dc5 100644 --- a/src/mbgl/map/transform_state.cpp +++ b/src/mbgl/map/transform_state.cpp @@ -175,7 +175,7 @@ double TransformState::yLat(double y_, double worldSize_) const { return 360.0f / M_PI * std::atan(std::exp(y2 * M_PI / 180.0f)) - 90.0f; } -float TransformState::zoomScale(float zoom) const { +double TransformState::zoomScale(double zoom) const { return std::pow(2.0f, zoom); } @@ -192,8 +192,8 @@ LatLng TransformState::pointToLatLng(const vec2 point) const { } TileCoordinate TransformState::latLngToCoordinate(const LatLng& latLng) const { - const float tileZoom = getIntegerZoom(); - const float k = zoomScale(tileZoom) / worldSize(); + const double tileZoom = getZoom(); + const double k = zoomScale(tileZoom) / worldSize(); return { lngX(latLng.longitude) * k, latY(latLng.latitude) * k, @@ -202,12 +202,12 @@ TileCoordinate TransformState::latLngToCoordinate(const LatLng& latLng) const { } LatLng TransformState::coordinateToLatLng(const TileCoordinate& coord) const { - const float worldSize_ = zoomScale(coord.zoom); + const double worldSize_ = zoomScale(coord.zoom); LatLng latLng = { yLat(coord.row, worldSize_), xLng(coord.column, worldSize_) }; - while (latLng.longitude < 180.0f) latLng.longitude += 360.0f; + while (latLng.longitude < -180.0f) latLng.longitude += 360.0f; while (latLng.longitude > 180.0f) latLng.longitude -= 360.0f; return latLng; } @@ -223,7 +223,7 @@ vec2 TransformState::coordinateToPoint(const TileCoordinate& coord) cons TileCoordinate TransformState::pointToCoordinate(const vec2 point) const { float targetZ = 0; - const float tileZoom = getIntegerZoom(); + const double tileZoom = getZoom(); mat4 mat = coordinatePointMatrix(tileZoom); @@ -259,11 +259,11 @@ TileCoordinate TransformState::pointToCoordinate(const vec2 point) const return { util::interpolate(x0, x1, t), util::interpolate(y0, y1, t), tileZoom }; } -mat4 TransformState::coordinatePointMatrix(float z) const { +mat4 TransformState::coordinatePointMatrix(double z) const { mat4 proj; getProjMatrix(proj); float s = util::tileSize * scale / std::pow(2, z); - matrix::scale(proj, proj, s , s, 1); + matrix::scale(proj, proj, s, s, 1); matrix::multiply(proj, getPixelMatrix(), proj); return proj; } diff --git a/src/mbgl/map/transform_state.hpp b/src/mbgl/map/transform_state.hpp index c3e1072c9..6fcd35ffa 100644 --- a/src/mbgl/map/transform_state.hpp +++ b/src/mbgl/map/transform_state.hpp @@ -83,10 +83,10 @@ private: double yLat(double y, double worldSize) const; double lngX(double lon) const; double latY(double lat) const; - float zoomScale(float zoom) const; + double zoomScale(double zoom) const; float worldSize() const; - mat4 coordinatePointMatrix(float z) const; + mat4 coordinatePointMatrix(double z) const; mat4 getPixelMatrix() const; private: From 4b587603b3c80e1dbe42390f59d942e52cfb68a2 Mon Sep 17 00:00:00 2001 From: Leith Bade Date: Wed, 16 Sep 2015 12:45:46 +1000 Subject: [PATCH 19/26] Create SharedSQLiteCache --- android/cpp/native_map_view.cpp | 4 ++-- include/mbgl/android/native_map_view.hpp | 2 +- include/mbgl/storage/sqlite_cache.hpp | 10 ++++++++++ platform/default/sqlite_cache.cpp | 12 ++++++++++++ 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/android/cpp/native_map_view.cpp b/android/cpp/native_map_view.cpp index f38513b32..9ffb083ec 100644 --- a/android/cpp/native_map_view.cpp +++ b/android/cpp/native_map_view.cpp @@ -58,8 +58,8 @@ NativeMapView::NativeMapView(JNIEnv *env, jobject obj_, float pixelRatio_, int a pixelRatio(pixelRatio_), availableProcessors(availableProcessors_), totalMemory(totalMemory_), - fileCache(mbgl::android::cachePath + "/mbgl-cache.db"), - fileSource(&fileCache), + fileCache(mbgl::SharedSQLiteCache::get(mbgl::android::cachePath + "/mbgl-cache.db")), + fileSource(fileCache.get()), map(*this, fileSource, MapMode::Continuous) { mbgl::Log::Debug(mbgl::Event::Android, "NativeMapView::NativeMapView"); diff --git a/include/mbgl/android/native_map_view.hpp b/include/mbgl/android/native_map_view.hpp index d5606ae37..4033c628b 100644 --- a/include/mbgl/android/native_map_view.hpp +++ b/include/mbgl/android/native_map_view.hpp @@ -90,7 +90,7 @@ private: size_t totalMemory = 0; // Ensure these are initialised last - mbgl::SQLiteCache fileCache; + std::shared_ptr fileCache; mbgl::DefaultFileSource fileSource; mbgl::Map map; diff --git a/include/mbgl/storage/sqlite_cache.hpp b/include/mbgl/storage/sqlite_cache.hpp index 65328652f..3054b6c73 100644 --- a/include/mbgl/storage/sqlite_cache.hpp +++ b/include/mbgl/storage/sqlite_cache.hpp @@ -26,6 +26,16 @@ private: const std::unique_ptr> thread; }; +class SharedSQLiteCache : util::noncopyable { +public: + static std::shared_ptr get(const std::string &path = ":memory:"); + +private: + SharedSQLiteCache() {} + + static std::weak_ptr masterPtr; +}; + } #endif diff --git a/platform/default/sqlite_cache.cpp b/platform/default/sqlite_cache.cpp index 9d5d0541e..8863c151e 100644 --- a/platform/default/sqlite_cache.cpp +++ b/platform/default/sqlite_cache.cpp @@ -264,4 +264,16 @@ void SQLiteCache::Impl::refresh(const Resource& resource, int64_t expires) { } } +std::shared_ptr SharedSQLiteCache::get(const std::string &path) { + std::shared_ptr temp = masterPtr.lock(); + if (!temp) { + temp.reset(new SQLiteCache(path)); + masterPtr = temp; + } + + return temp; +} + +std::weak_ptr SharedSQLiteCache::masterPtr; + } From da691dcbb584f870d396507f65469b68b44afff4 Mon Sep 17 00:00:00 2001 From: Leith Bade Date: Mon, 21 Sep 2015 14:38:11 +1000 Subject: [PATCH 20/26] Remove Android style URL validation Fixes #2370 --- .../src/main/java/com/mapbox/mapboxgl/views/MapView.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java index 614ccdb11..dfbb3ff9d 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java +++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java @@ -744,16 +744,7 @@ public class MapView extends FrameLayout implements LocationListener { return mNativeMapView.isFullyLoaded(); } - private void validateStyleUrl(String url) { - url = url.replaceFirst("asset://", "http://"); - HttpUrl parsedUrl = HttpUrl.parse(url); - if (parsedUrl == null) { - throw new RuntimeException("Style URL is not a valid http, https or asset URL."); - } - } - public void setStyleUrl(String url) { - validateStyleUrl(url); mStyleUrl = url; mNativeMapView.setStyleUrl(url); } From d2d3df2a694fd75ce59a2879aa0d4fec2dacff23 Mon Sep 17 00:00:00 2001 From: Leith Bade Date: Tue, 22 Sep 2015 16:23:39 +1000 Subject: [PATCH 21/26] Fix freezing on Android when rotating Fixes #1941 --- android/cpp/native_map_view.cpp | 5 +++++ .../src/main/java/com/mapbox/mapboxgl/views/MapView.java | 9 --------- .../java/com/mapbox/mapboxgl/testapp/MainActivity.java | 3 +++ include/mbgl/map/map.hpp | 1 + src/mbgl/map/map.cpp | 4 ++++ 5 files changed, 13 insertions(+), 9 deletions(-) diff --git a/android/cpp/native_map_view.cpp b/android/cpp/native_map_view.cpp index 9ffb083ec..02228d85b 100644 --- a/android/cpp/native_map_view.cpp +++ b/android/cpp/native_map_view.cpp @@ -699,6 +699,11 @@ void NativeMapView::updateFps() { void NativeMapView::onInvalidate() { mbgl::Log::Debug(mbgl::Event::Android, "NativeMapView::onInvalidate()"); + if (map.isPaused()) { + mbgl::Log::Debug(mbgl::Event::Android, "Not rendering as map is paused"); + return; + } + const bool dirty = !clean.test_and_set(); if (dirty) { float zoomFactor = map.getMaxZoom() - map.getMinZoom() + 1; diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java index dfbb3ff9d..a3b53ae37 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java +++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java @@ -1009,14 +1009,6 @@ public class MapView extends FrameLayout implements LocationListener { mNativeMapView.resizeFramebuffer(width, height); } - // Called when we need to redraw the view - // This is called before our view is first visible to prevent an initial - // flicker (see Android SDK documentation) - /*@Override - public void surfaceRedrawNeeded(SurfaceHolder holder) { - mNativeMapView.update(); - }*/ // TODO call update somewhere? - // Not used @Override public void onSurfaceTextureUpdated (SurfaceTexture surface) { @@ -1796,7 +1788,6 @@ public class MapView extends FrameLayout implements LocationListener { }); } - /** * Defines callback for events OnMapChange */ diff --git a/android/java/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxgl/testapp/MainActivity.java b/android/java/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxgl/testapp/MainActivity.java index ed9b7ef06..f81717ae5 100644 --- a/android/java/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxgl/testapp/MainActivity.java +++ b/android/java/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxgl/testapp/MainActivity.java @@ -176,12 +176,14 @@ public class MainActivity extends AppCompatActivity { @Override protected void onStart() { super.onStart(); + mMapView.onStart(); } @Override protected void onStop() { super.onStop(); + mMapView.onStop(); } @@ -204,6 +206,7 @@ public class MainActivity extends AppCompatActivity { @Override protected void onDestroy() { super.onDestroy(); + mMapView.onDestroy(); } diff --git a/include/mbgl/map/map.hpp b/include/mbgl/map/map.hpp index 4cd9293c9..06695778e 100644 --- a/include/mbgl/map/map.hpp +++ b/include/mbgl/map/map.hpp @@ -58,6 +58,7 @@ public: // Pauses the render thread. The render thread will stop running but will not be terminated and will not lose state until resumed. void pause(); + bool isPaused(); // Resumes a paused render thread void resume(); diff --git a/src/mbgl/map/map.cpp b/src/mbgl/map/map.cpp index 9195f6b58..3e7a61a4e 100644 --- a/src/mbgl/map/map.cpp +++ b/src/mbgl/map/map.cpp @@ -39,6 +39,10 @@ void Map::pause() { } } +bool Map::isPaused() { + return paused; +} + void Map::resume() { data->condResume.notify_all(); paused = false; From 6e55dd575e481cb2b71e6dceac7739f0935e572b Mon Sep 17 00:00:00 2001 From: Leith Bade Date: Fri, 18 Sep 2015 09:43:15 +1000 Subject: [PATCH 22/26] Add Crashlytics NDK to Android Closes #2107 Conflicts: Makefile android/java/MapboxGLAndroidSDKTestApp/build.gradle --- Makefile | 4 ++-- android/java/.gitignore | 6 +++++ .../MapboxGLAndroidSDKTestApp/build.gradle | 18 +++++++++++++++ .../mapbox/mapboxgl/testapp/MainActivity.java | 3 ++- android/mapboxgl-app.gypi | 8 ++++++- scripts/android/run.sh | 22 +++++++++++-------- 6 files changed, 48 insertions(+), 13 deletions(-) diff --git a/Makefile b/Makefile index c69e426dd..c7099ce03 100644 --- a/Makefile +++ b/Makefile @@ -130,8 +130,8 @@ clean: clear_sqlite_cache clear_xcode_cache -rm -rf ./ios/build -rm -rf ./test/build -rm -rf ./config/*.gypi - -rm -rf ./android/java/build ./android/java/MapboxGLAndroidSDKTestApp/build ./android/java/MapboxGLAndroidSDKTestApp/build - -rm -rf ./android/java/MapboxGLAndroidSDK/src/main/jniLibs ./android/java/MapboxGLAndroidSDK/src/main/assets + -rm -rf ./android/java/build ./android/java/MapboxGLAndroidSDK/build ./android/java/MapboxGLAndroidSDKTestApp/build + -rm -rf ./android/java/MapboxGLAndroidSDK/src/main/libs ./android/java/MapboxGLAndroidSDK/src/main/obj.target ./android/java/MapboxGLAndroidSDK/src/main/assets -rm -f ./android/test/features.zip distclean: clean diff --git a/android/java/.gitignore b/android/java/.gitignore index 866441810..a79fb8fae 100644 --- a/android/java/.gitignore +++ b/android/java/.gitignore @@ -10,6 +10,12 @@ build/ *.so *.apk +# JNI +MapboxGLAndroidSDK/src/main/libs/ +MapboxGLAndroidSDK/src/main/jniLibs/ +MapboxGLAndroidSDK/src/main/obj/ +MapboxGLAndroidSDK/src/main/obj.target/ + # Lib assets MapboxGLAndroidSDK/src/main/assets/ diff --git a/android/java/MapboxGLAndroidSDKTestApp/build.gradle b/android/java/MapboxGLAndroidSDKTestApp/build.gradle index 172f31d0f..02f8a19eb 100644 --- a/android/java/MapboxGLAndroidSDKTestApp/build.gradle +++ b/android/java/MapboxGLAndroidSDKTestApp/build.gradle @@ -76,6 +76,21 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + + splits { + abi { + enable true + reset() + include 'armeabi', 'armeabi-v7a', 'x86', 'mips' + universalApk true + } + } +} + +crashlytics { + enableNdk true + androidNdkOut '../MapboxGLAndroidSDK/src/main/obj.target' + androidNdkLibsOut '../MapboxGLAndroidSDK/src/main/obj.target' } dependencies { @@ -89,6 +104,9 @@ dependencies { compile('com.crashlytics.sdk.android:crashlytics:2.5.1@aar') { transitive = true; } + compile('com.crashlytics.sdk.android:crashlytics-ndk:1.1.1@aar') { + transitive = true; + } } checkstyle { diff --git a/android/java/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxgl/testapp/MainActivity.java b/android/java/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxgl/testapp/MainActivity.java index f81717ae5..3c486185d 100644 --- a/android/java/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxgl/testapp/MainActivity.java +++ b/android/java/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxgl/testapp/MainActivity.java @@ -24,6 +24,7 @@ import android.view.View; import android.widget.TextView; import android.widget.Toast; import com.crashlytics.android.Crashlytics; +import com.crashlytics.android.ndk.CrashlyticsNdk; import com.mapbox.mapboxgl.annotations.Marker; import com.mapbox.mapboxgl.annotations.MarkerOptions; import com.mapbox.mapboxgl.annotations.PolygonOptions; @@ -77,7 +78,7 @@ public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - Fabric.with(this, new Crashlytics()); + Fabric.with(this, new Crashlytics(), new CrashlyticsNdk()); // Load the layout setContentView(R.layout.activity_main); diff --git a/android/mapboxgl-app.gypi b/android/mapboxgl-app.gypi index e3db1269d..5731d21f8 100644 --- a/android/mapboxgl-app.gypi +++ b/android/mapboxgl-app.gypi @@ -74,13 +74,19 @@ ], 'destination': '<(pwd)/../android/java/MapboxGLAndroidSDK/src/main/assets' }, + { + 'files': [ + '<(PRODUCT_DIR)/obj.target' + ], + 'destination': '<(pwd)/../android/java/MapboxGLAndroidSDK/src/main' + }, ], 'actions': [ { 'action_name': 'Strip dynamic library', 'inputs': [ '<(PRODUCT_DIR)/lib.target/libmapbox-gl.so' ], - 'outputs': [ '<(pwd)/../android/java/MapboxGLAndroidSDK/src/main/jniLibs/$(JNIDIR)/libmapbox-gl.so' ], + 'outputs': [ '<(pwd)/../android/java/MapboxGLAndroidSDK/src/main/libs/$(JNIDIR)/libmapbox-gl.so' ], 'action': [ '$(STRIP)', '<@(_inputs)', '-o', '<@(_outputs)' ] }, ], diff --git a/scripts/android/run.sh b/scripts/android/run.sh index 2ef0c40c9..73ffc4c5c 100755 --- a/scripts/android/run.sh +++ b/scripts/android/run.sh @@ -39,16 +39,20 @@ if [ ! -z "${AWS_ACCESS_KEY_ID}" ] && [ ! -z "${AWS_SECRET_ACCESS_KEY}" ] ; then S3_PREFIX=s3://mapbox/mapbox-gl-native/android/build/${TRAVIS_JOB_NUMBER} APK_OUTPUTS=./android/java/MapboxGLAndroidSDKTestApp/build/outputs/apk + JNILIB=`mason env JNIDIR` - # Upload either the debug or the release build - if [ ${BUILDTYPE} == "Debug" ] ; then - aws s3 cp \ - ${APK_OUTPUTS}/MapboxGLAndroidSDKTestApp-debug.apk \ - ${S3_PREFIX}/MapboxGLAndroidSDKTestApp-debug.apk - elif [ ${BUILDTYPE} == "Release" ] ; then - aws s3 cp \ - ${APK_OUTPUTS}/MapboxGLAndroidSDKTestApp-release-unsigned.apk \ - ${S3_PREFIX}/MapboxGLAndroidSDKTestApp-release-unsigned.apk + # ARM64 does not build APK for now + if [ ${JNIDIR} != "arm64-v8a" ] ; then + # Upload either the debug or the release build + if [ ${BUILDTYPE} == "Debug" ] ; then + aws s3 cp \ + ${APK_OUTPUTS}/MapboxGLAndroidSDKTestApp-${JNILIB}-debug.apk \ + ${S3_PREFIX}/MapboxGLAndroidSDKTestApp-debug.apk + elif [ ${BUILDTYPE} == "Release" ] ; then + aws s3 cp \ + ${APK_OUTPUTS}/MapboxGLAndroidSDKTestApp-${JNILIB}-release-unsigned.apk \ + ${S3_PREFIX}/MapboxGLAndroidSDKTestApp-release-unsigned.apk + fi fi mapbox_time_finish From 19e7d154bb540302339eb984f5350c20e9001020 Mon Sep 17 00:00:00 2001 From: Leith Bade Date: Thu, 17 Sep 2015 17:34:13 -0700 Subject: [PATCH 23/26] Improve handling of cancelled HTTP requests Fix a memory leak of NativeMapView Java object --- android/cpp/native_map_view.cpp | 4 +-- .../com/mapbox/mapboxgl/http/HTTPContext.java | 4 +++ include/mbgl/android/native_map_view.hpp | 2 +- platform/android/http_request_android.cpp | 35 +++++++++++-------- 4 files changed, 27 insertions(+), 18 deletions(-) diff --git a/android/cpp/native_map_view.cpp b/android/cpp/native_map_view.cpp index 02228d85b..6c1cd87bb 100644 --- a/android/cpp/native_map_view.cpp +++ b/android/cpp/native_map_view.cpp @@ -73,7 +73,7 @@ NativeMapView::NativeMapView(JNIEnv *env, jobject obj_, float pixelRatio_, int a return; } - obj = env->NewGlobalRef(obj_); + obj = env->NewWeakGlobalRef(obj_); if (obj == nullptr) { env->ExceptionDescribe(); return; @@ -93,7 +93,7 @@ NativeMapView::~NativeMapView() { JNIEnv *env = nullptr; ret = vm->GetEnv(reinterpret_cast(&env), JNI_VERSION_1_6); if (ret == JNI_OK) { - env->DeleteGlobalRef(obj); + env->DeleteWeakGlobalRef(obj); } else { mbgl::Log::Error(mbgl::Event::JNI, "GetEnv() failed with %i", ret); throw new std::runtime_error("GetEnv() failed"); diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/http/HTTPContext.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/http/HTTPContext.java index 4558bbfe3..775daaafd 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/http/HTTPContext.java +++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/http/HTTPContext.java @@ -20,6 +20,7 @@ class HTTPContext { private static final int CONNECTION_ERROR = 0; private static final int TEMPORARY_ERROR = 1; private static final int PERMANENT_ERROR = 2; + private static final int CANCELED_ERROR = 3; private static HTTPContext mInstance = null; @@ -78,7 +79,10 @@ class HTTPContext { type = CONNECTION_ERROR; } else if ((e instanceof InterruptedIOException)) { type = TEMPORARY_ERROR; + } else if (mCall.isCanceled()) { + type = CANCELED_ERROR; } + nativeOnFailure(mNativePtr, type, e.getMessage()); } diff --git a/include/mbgl/android/native_map_view.hpp b/include/mbgl/android/native_map_view.hpp index 4033c628b..0a4e856db 100644 --- a/include/mbgl/android/native_map_view.hpp +++ b/include/mbgl/android/native_map_view.hpp @@ -62,7 +62,7 @@ private: private: JavaVM *vm = nullptr; - jobject obj = nullptr; + jweak obj = nullptr; ANativeWindow *window = nullptr; EGLDisplay display = EGL_NO_DISPLAY; diff --git a/platform/android/http_request_android.cpp b/platform/android/http_request_android.cpp index 249cb731e..5c5805906 100644 --- a/platform/android/http_request_android.cpp +++ b/platform/android/http_request_android.cpp @@ -75,7 +75,8 @@ private: static const int connectionError = 0; static const int temporaryError = 1; - static const int permanentError = 1; + static const int permanentError = 2; + static const int canceledError = 3; }; // ------------------------------------------------------------------------------------------------- @@ -305,22 +306,26 @@ void HTTPAndroidRequest::onResponse(int code, std::string message, std::string e } void HTTPAndroidRequest::onFailure(int type, std::string message) { - if (!response) { - response = std::make_unique(); - } + if (type != canceledError) { + if (!response) { + response = std::make_unique(); + } - response->status = Response::Error; - response->message = message; + response->status = Response::Error; + response->message = message; - switch (type) { - case connectionError: - status = ResponseStatus::ConnectionError; - - case temporaryError: - status = ResponseStatus::TemporaryError; - - default: - status = ResponseStatus::PermanentError; + switch (type) { + case connectionError: + status = ResponseStatus::ConnectionError; + break; + case temporaryError: + status = ResponseStatus::TemporaryError; + break; + default: + status = ResponseStatus::PermanentError; + } + } else { + status = ResponseStatus::Canceled; } async.send(); From 9e96e4e94b5f879b65e64b4baacda4662f8d58ac Mon Sep 17 00:00:00 2001 From: Leith Bade Date: Tue, 22 Sep 2015 10:06:32 +1000 Subject: [PATCH 24/26] Restore libcurl HTTP on Android --- android/mapboxgl-app.gypi | 5 ++ platform/default/http_request_curl.cpp | 109 +++++++++++++++++++++++++ scripts/android/configure.sh | 2 + scripts/android/defaults.mk | 2 +- 4 files changed, 117 insertions(+), 1 deletion(-) diff --git a/android/mapboxgl-app.gypi b/android/mapboxgl-app.gypi index 5731d21f8..7a8c52d5b 100644 --- a/android/mapboxgl-app.gypi +++ b/android/mapboxgl-app.gypi @@ -25,6 +25,8 @@ '<@(boost_cflags)', ], 'libraries': [ + '<@(openssl_static_libs)', + '<@(libcurl_static_libs)', '<@(libpng_static_libs)', '<@(jpeg_static_libs)', '<@(sqlite_static_libs)', @@ -43,6 +45,8 @@ '<@(libpng_ldflags)', '<@(jpeg_ldflags)', '<@(sqlite_ldflags)', + '<@(openssl_ldflags)', + '<@(libcurl_ldflags)', '<@(zlib_ldflags)', '<@(libzip_ldflags)', ], @@ -70,6 +74,7 @@ 'copies': [ { 'files': [ + '../common/ca-bundle.crt', '../styles/styles' ], 'destination': '<(pwd)/../android/java/MapboxGLAndroidSDK/src/main/assets' diff --git a/platform/default/http_request_curl.cpp b/platform/default/http_request_curl.cpp index e416034b4..0f7f8c0ac 100644 --- a/platform/default/http_request_curl.cpp +++ b/platform/default/http_request_curl.cpp @@ -11,6 +11,12 @@ #include +#ifdef __ANDROID__ +#include +#include +#include +#endif + #include #include #include @@ -325,6 +331,104 @@ int HTTPCURLContext::startTimeout(CURLM * /* multi */, long timeout_ms, void *us // ------------------------------------------------------------------------------------------------- +#ifdef __ANDROID__ + +// This function is called to load the CA bundle +// from http://curl.haxx.se/libcurl/c/cacertinmem.html¯ +static CURLcode sslctx_function(CURL * /* curl */, void *sslctx, void * /* parm */) { + + int error = 0; + struct zip *apk = zip_open(mbgl::android::apkPath.c_str(), 0, &error); + if (apk == nullptr) { + return CURLE_SSL_CACERT_BADFILE; + } + + struct zip_file *apkFile = zip_fopen(apk, "assets/ca-bundle.crt", ZIP_FL_NOCASE); + if (apkFile == nullptr) { + zip_close(apk); + apk = nullptr; + return CURLE_SSL_CACERT_BADFILE; + } + + struct zip_stat stat; + if (zip_stat(apk, "assets/ca-bundle.crt", ZIP_FL_NOCASE, &stat) != 0) { + zip_fclose(apkFile); + apkFile = nullptr; + zip_close(apk); + apk = nullptr; + return CURLE_SSL_CACERT_BADFILE; + } + + if (stat.size > std::numeric_limits::max()) { + zip_fclose(apkFile); + apkFile = nullptr; + zip_close(apk); + apk = nullptr; + return CURLE_SSL_CACERT_BADFILE; + } + + const auto pem = std::make_unique(stat.size); + + if (static_cast(zip_fread(apkFile, reinterpret_cast(pem.get()), stat.size)) != stat.size) { + zip_fclose(apkFile); + apkFile = nullptr; + zip_close(apk); + apk = nullptr; + return CURLE_SSL_CACERT_BADFILE; + } + + // get a pointer to the X509 certificate store (which may be empty!) + X509_STORE *store = SSL_CTX_get_cert_store((SSL_CTX *)sslctx); + if (store == nullptr) { + return CURLE_SSL_CACERT_BADFILE; + } + + // get a BIO + BIO *bio = BIO_new_mem_buf(pem.get(), static_cast(stat.size)); + if (bio == nullptr) { + store = nullptr; + return CURLE_SSL_CACERT_BADFILE; + } + + // use it to read the PEM formatted certificate from memory into an X509 + // structure that SSL can use + X509 *cert = nullptr; + while (PEM_read_bio_X509(bio, &cert, 0, nullptr) != nullptr) { + if (cert == nullptr) { + BIO_free(bio); + bio = nullptr; + store = nullptr; + return CURLE_SSL_CACERT_BADFILE; + } + + // add our certificate to this store + if (X509_STORE_add_cert(store, cert) == 0) { + X509_free(cert); + cert = nullptr; + BIO_free(bio); + bio = nullptr; + store = nullptr; + return CURLE_SSL_CACERT_BADFILE; + } + + X509_free(cert); + cert = nullptr; + } + + // decrease reference counts + BIO_free(bio); + bio = nullptr; + + zip_fclose(apkFile); + apkFile = nullptr; + zip_close(apk); + apk = nullptr; + + // all set to go + return CURLE_OK; +} +#endif + HTTPCURLRequest::HTTPCURLRequest(HTTPCURLContext* context_, const Resource& resource_, Callback callback_, uv_loop_t*, std::shared_ptr response_) : HTTPRequestBase(resource_, callback_), context(context_), @@ -354,7 +458,12 @@ HTTPCURLRequest::HTTPCURLRequest(HTTPCURLContext* context_, const Resource& reso handleError(curl_easy_setopt(handle, CURLOPT_PRIVATE, this)); handleError(curl_easy_setopt(handle, CURLOPT_ERRORBUFFER, error)); +#ifdef __ANDROID__ + handleError(curl_easy_setopt(handle, CURLOPT_SSLCERTTYPE, "PEM")); + handleError(curl_easy_setopt(handle, CURLOPT_SSL_CTX_FUNCTION, sslctx_function)); +#else handleError(curl_easy_setopt(handle, CURLOPT_CAINFO, "ca-bundle.crt")); +#endif handleError(curl_easy_setopt(handle, CURLOPT_FOLLOWLOCATION, 1)); handleError(curl_easy_setopt(handle, CURLOPT_URL, resource.url.c_str())); handleError(curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, writeCallback)); diff --git a/scripts/android/configure.sh b/scripts/android/configure.sh index 70c8973a8..5e5a9034c 100644 --- a/scripts/android/configure.sh +++ b/scripts/android/configure.sh @@ -1,6 +1,8 @@ #!/usr/bin/env bash BOOST_VERSION=1.57.0 +LIBCURL_VERSION=7.40.0 +OPENSSL_VERSION=1.0.1l LIBPNG_VERSION=1.6.16 JPEG_VERSION=v9a SQLITE_VERSION=3.8.8.1 diff --git a/scripts/android/defaults.mk b/scripts/android/defaults.mk index 29f047c88..436f9db71 100644 --- a/scripts/android/defaults.mk +++ b/scripts/android/defaults.mk @@ -1,7 +1,7 @@ HEADLESS ?= none PLATFORM ?= android ASSET ?= zip -HTTP ?= android +HTTP ?= curl CACHE ?= sqlite GYP_FLAVOR_SUFFIX=-android From f6a784ce8c5c061e8d306ef19f012032cbad273f Mon Sep 17 00:00:00 2001 From: Brad Leege Date: Wed, 23 Sep 2015 13:21:48 -0500 Subject: [PATCH 25/26] Revert "Add Crashlytics NDK to Android" This reverts commit 6e55dd575e481cb2b71e6dceac7739f0935e572b. --- Makefile | 4 ++-- android/java/.gitignore | 6 ----- .../MapboxGLAndroidSDKTestApp/build.gradle | 18 --------------- .../mapbox/mapboxgl/testapp/MainActivity.java | 3 +-- android/mapboxgl-app.gypi | 8 +------ scripts/android/run.sh | 22 ++++++++----------- 6 files changed, 13 insertions(+), 48 deletions(-) diff --git a/Makefile b/Makefile index c7099ce03..c69e426dd 100644 --- a/Makefile +++ b/Makefile @@ -130,8 +130,8 @@ clean: clear_sqlite_cache clear_xcode_cache -rm -rf ./ios/build -rm -rf ./test/build -rm -rf ./config/*.gypi - -rm -rf ./android/java/build ./android/java/MapboxGLAndroidSDK/build ./android/java/MapboxGLAndroidSDKTestApp/build - -rm -rf ./android/java/MapboxGLAndroidSDK/src/main/libs ./android/java/MapboxGLAndroidSDK/src/main/obj.target ./android/java/MapboxGLAndroidSDK/src/main/assets + -rm -rf ./android/java/build ./android/java/MapboxGLAndroidSDKTestApp/build ./android/java/MapboxGLAndroidSDKTestApp/build + -rm -rf ./android/java/MapboxGLAndroidSDK/src/main/jniLibs ./android/java/MapboxGLAndroidSDK/src/main/assets -rm -f ./android/test/features.zip distclean: clean diff --git a/android/java/.gitignore b/android/java/.gitignore index a79fb8fae..866441810 100644 --- a/android/java/.gitignore +++ b/android/java/.gitignore @@ -10,12 +10,6 @@ build/ *.so *.apk -# JNI -MapboxGLAndroidSDK/src/main/libs/ -MapboxGLAndroidSDK/src/main/jniLibs/ -MapboxGLAndroidSDK/src/main/obj/ -MapboxGLAndroidSDK/src/main/obj.target/ - # Lib assets MapboxGLAndroidSDK/src/main/assets/ diff --git a/android/java/MapboxGLAndroidSDKTestApp/build.gradle b/android/java/MapboxGLAndroidSDKTestApp/build.gradle index 02f8a19eb..172f31d0f 100644 --- a/android/java/MapboxGLAndroidSDKTestApp/build.gradle +++ b/android/java/MapboxGLAndroidSDKTestApp/build.gradle @@ -76,21 +76,6 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } - - splits { - abi { - enable true - reset() - include 'armeabi', 'armeabi-v7a', 'x86', 'mips' - universalApk true - } - } -} - -crashlytics { - enableNdk true - androidNdkOut '../MapboxGLAndroidSDK/src/main/obj.target' - androidNdkLibsOut '../MapboxGLAndroidSDK/src/main/obj.target' } dependencies { @@ -104,9 +89,6 @@ dependencies { compile('com.crashlytics.sdk.android:crashlytics:2.5.1@aar') { transitive = true; } - compile('com.crashlytics.sdk.android:crashlytics-ndk:1.1.1@aar') { - transitive = true; - } } checkstyle { diff --git a/android/java/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxgl/testapp/MainActivity.java b/android/java/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxgl/testapp/MainActivity.java index 3c486185d..f81717ae5 100644 --- a/android/java/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxgl/testapp/MainActivity.java +++ b/android/java/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxgl/testapp/MainActivity.java @@ -24,7 +24,6 @@ import android.view.View; import android.widget.TextView; import android.widget.Toast; import com.crashlytics.android.Crashlytics; -import com.crashlytics.android.ndk.CrashlyticsNdk; import com.mapbox.mapboxgl.annotations.Marker; import com.mapbox.mapboxgl.annotations.MarkerOptions; import com.mapbox.mapboxgl.annotations.PolygonOptions; @@ -78,7 +77,7 @@ public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - Fabric.with(this, new Crashlytics(), new CrashlyticsNdk()); + Fabric.with(this, new Crashlytics()); // Load the layout setContentView(R.layout.activity_main); diff --git a/android/mapboxgl-app.gypi b/android/mapboxgl-app.gypi index 7a8c52d5b..e32775ff7 100644 --- a/android/mapboxgl-app.gypi +++ b/android/mapboxgl-app.gypi @@ -79,19 +79,13 @@ ], 'destination': '<(pwd)/../android/java/MapboxGLAndroidSDK/src/main/assets' }, - { - 'files': [ - '<(PRODUCT_DIR)/obj.target' - ], - 'destination': '<(pwd)/../android/java/MapboxGLAndroidSDK/src/main' - }, ], 'actions': [ { 'action_name': 'Strip dynamic library', 'inputs': [ '<(PRODUCT_DIR)/lib.target/libmapbox-gl.so' ], - 'outputs': [ '<(pwd)/../android/java/MapboxGLAndroidSDK/src/main/libs/$(JNIDIR)/libmapbox-gl.so' ], + 'outputs': [ '<(pwd)/../android/java/MapboxGLAndroidSDK/src/main/jniLibs/$(JNIDIR)/libmapbox-gl.so' ], 'action': [ '$(STRIP)', '<@(_inputs)', '-o', '<@(_outputs)' ] }, ], diff --git a/scripts/android/run.sh b/scripts/android/run.sh index 73ffc4c5c..2ef0c40c9 100755 --- a/scripts/android/run.sh +++ b/scripts/android/run.sh @@ -39,20 +39,16 @@ if [ ! -z "${AWS_ACCESS_KEY_ID}" ] && [ ! -z "${AWS_SECRET_ACCESS_KEY}" ] ; then S3_PREFIX=s3://mapbox/mapbox-gl-native/android/build/${TRAVIS_JOB_NUMBER} APK_OUTPUTS=./android/java/MapboxGLAndroidSDKTestApp/build/outputs/apk - JNILIB=`mason env JNIDIR` - # ARM64 does not build APK for now - if [ ${JNIDIR} != "arm64-v8a" ] ; then - # Upload either the debug or the release build - if [ ${BUILDTYPE} == "Debug" ] ; then - aws s3 cp \ - ${APK_OUTPUTS}/MapboxGLAndroidSDKTestApp-${JNILIB}-debug.apk \ - ${S3_PREFIX}/MapboxGLAndroidSDKTestApp-debug.apk - elif [ ${BUILDTYPE} == "Release" ] ; then - aws s3 cp \ - ${APK_OUTPUTS}/MapboxGLAndroidSDKTestApp-${JNILIB}-release-unsigned.apk \ - ${S3_PREFIX}/MapboxGLAndroidSDKTestApp-release-unsigned.apk - fi + # Upload either the debug or the release build + if [ ${BUILDTYPE} == "Debug" ] ; then + aws s3 cp \ + ${APK_OUTPUTS}/MapboxGLAndroidSDKTestApp-debug.apk \ + ${S3_PREFIX}/MapboxGLAndroidSDKTestApp-debug.apk + elif [ ${BUILDTYPE} == "Release" ] ; then + aws s3 cp \ + ${APK_OUTPUTS}/MapboxGLAndroidSDKTestApp-release-unsigned.apk \ + ${S3_PREFIX}/MapboxGLAndroidSDKTestApp-release-unsigned.apk fi mapbox_time_finish From 3de441f20e965e2c33a927c91ee8404e239cbd17 Mon Sep 17 00:00:00 2001 From: Leith Bade Date: Thu, 24 Sep 2015 12:18:59 +1000 Subject: [PATCH 26/26] Refactor NativeMapView to hold std::unique_ptr to Map and DefaultFileSource Add missing asserts to attach_jni_thread/detach_jni_thread Fixes #2406 --- android/cpp/jni.cpp | 6 ++++ android/cpp/native_map_view.cpp | 41 +++++++++++++----------- include/mbgl/android/native_map_view.hpp | 4 +-- 3 files changed, 31 insertions(+), 20 deletions(-) diff --git a/android/cpp/jni.cpp b/android/cpp/jni.cpp index 140cc9f3c..5ed0a730c 100644 --- a/android/cpp/jni.cpp +++ b/android/cpp/jni.cpp @@ -117,6 +117,9 @@ bool throw_jni_error(JNIEnv *env, const char *msg) { } bool attach_jni_thread(JavaVM* vm, JNIEnv** env, std::string threadName) { + assert(vm != nullptr); + assert(env != nullptr); + JavaVMAttachArgs args = {JNI_VERSION_1_2, threadName.c_str(), NULL}; jint ret; @@ -142,6 +145,9 @@ bool attach_jni_thread(JavaVM* vm, JNIEnv** env, std::string threadName) { void detach_jni_thread(JavaVM* vm, JNIEnv** env, bool detach) { if (detach) { + assert(vm != nullptr); + assert(env != nullptr); + jint ret; if ((ret = vm->DetachCurrentThread()) != JNI_OK) { mbgl::Log::Error(mbgl::Event::JNI, "DetachCurrentThread() failed with %i", ret); diff --git a/android/cpp/native_map_view.cpp b/android/cpp/native_map_view.cpp index 6c1cd87bb..cc04f089e 100644 --- a/android/cpp/native_map_view.cpp +++ b/android/cpp/native_map_view.cpp @@ -57,14 +57,9 @@ NativeMapView::NativeMapView(JNIEnv *env, jobject obj_, float pixelRatio_, int a : mbgl::View(*this), pixelRatio(pixelRatio_), availableProcessors(availableProcessors_), - totalMemory(totalMemory_), - fileCache(mbgl::SharedSQLiteCache::get(mbgl::android::cachePath + "/mbgl-cache.db")), - fileSource(fileCache.get()), - map(*this, fileSource, MapMode::Continuous) { + totalMemory(totalMemory_) { mbgl::Log::Debug(mbgl::Event::Android, "NativeMapView::NativeMapView"); - map.pause(); - assert(env != nullptr); assert(obj_ != nullptr); @@ -78,6 +73,12 @@ NativeMapView::NativeMapView(JNIEnv *env, jobject obj_, float pixelRatio_, int a env->ExceptionDescribe(); return; } + + fileCache = mbgl::SharedSQLiteCache::get(mbgl::android::cachePath + "/mbgl-cache.db"); + fileSource = std::make_unique(fileCache.get()); + map = std::make_unique(*this, *fileSource, MapMode::Continuous); + + map->pause(); } NativeMapView::~NativeMapView() { @@ -89,6 +90,10 @@ NativeMapView::~NativeMapView() { assert(vm != nullptr); assert(obj != nullptr); + map.reset(); + fileSource.reset(); + fileCache.reset(); + jint ret; JNIEnv *env = nullptr; ret = vm->GetEnv(reinterpret_cast(&env), JNI_VERSION_1_6); @@ -183,9 +188,9 @@ void NativeMapView::notify() { // noop } -mbgl::Map &NativeMapView::getMap() { return map; } +mbgl::Map &NativeMapView::getMap() { return *map; } -mbgl::DefaultFileSource &NativeMapView::getFileSource() { return fileSource; } +mbgl::DefaultFileSource &NativeMapView::getFileSource() { return *fileSource; } bool NativeMapView::inEmulator() { // Detect if we are in emulator @@ -620,7 +625,7 @@ void NativeMapView::pause() { mbgl::Log::Debug(mbgl::Event::Android, "NativeMapView::pause"); if ((display != EGL_NO_DISPLAY) && (context != EGL_NO_CONTEXT)) { - map.pause(); + map->pause(); } } @@ -631,7 +636,7 @@ void NativeMapView::resume() { assert(context != EGL_NO_CONTEXT); if (surface != EGL_NO_SURFACE) { - map.resume(); + map->resume(); } else { mbgl::Log::Debug(mbgl::Event::Android, "Not resuming because we are not ready"); } @@ -699,37 +704,37 @@ void NativeMapView::updateFps() { void NativeMapView::onInvalidate() { mbgl::Log::Debug(mbgl::Event::Android, "NativeMapView::onInvalidate()"); - if (map.isPaused()) { + if (map->isPaused()) { mbgl::Log::Debug(mbgl::Event::Android, "Not rendering as map is paused"); return; } const bool dirty = !clean.test_and_set(); if (dirty) { - float zoomFactor = map.getMaxZoom() - map.getMinZoom() + 1; + float zoomFactor = map->getMaxZoom() - map->getMinZoom() + 1; float cpuFactor = availableProcessors; float memoryFactor = static_cast(totalMemory) / 1000.0f / 1000.0f / 1000.0f; - float sizeFactor = (static_cast(map.getWidth()) / mbgl::util::tileSize) * - (static_cast(map.getHeight()) / mbgl::util::tileSize); + float sizeFactor = (static_cast(map->getWidth()) / mbgl::util::tileSize) * + (static_cast(map->getHeight()) / mbgl::util::tileSize); size_t cacheSize = zoomFactor * cpuFactor * memoryFactor * sizeFactor * 0.5f; - map.setSourceTileCacheSize(cacheSize); + map->setSourceTileCacheSize(cacheSize); - map.renderSync(); + map->renderSync(); } } void NativeMapView::resizeView(int w, int h) { width = w; height = h; - map.update(mbgl::Update::Dimensions); + map->update(mbgl::Update::Dimensions); } void NativeMapView::resizeFramebuffer(int w, int h) { fbWidth = w; fbHeight = h; - map.update(mbgl::Update::Repaint); + map->update(mbgl::Update::Repaint); } } diff --git a/include/mbgl/android/native_map_view.hpp b/include/mbgl/android/native_map_view.hpp index 0a4e856db..fe619ba6f 100644 --- a/include/mbgl/android/native_map_view.hpp +++ b/include/mbgl/android/native_map_view.hpp @@ -91,8 +91,8 @@ private: // Ensure these are initialised last std::shared_ptr fileCache; - mbgl::DefaultFileSource fileSource; - mbgl::Map map; + std::unique_ptr fileSource; + std::unique_ptr map; std::atomic_flag clean = ATOMIC_FLAG_INIT; };