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..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
@@ -1,8 +1,10 @@
package com.mapbox.mapboxgl.views;
import android.app.ActivityManager;
+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;
@@ -12,6 +14,7 @@ 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,12 +23,14 @@ 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.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;
@@ -38,6 +43,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;
@@ -91,9 +98,32 @@ 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_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 ATTRIBUTION_INDEX_IMPROVE_THIS_MAP = 2;
/**
* Every annotation that has been added to the map.
@@ -156,6 +186,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 +342,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 +411,31 @@ 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);
+ 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);
+ addView(mAttributionsView);
+ mAttributionsView.setOnClickListener(new AttributionOnClickListener(this));
+
// Setup Support For Listener Tracking
// MapView's internal listener is setup in onCreate()
mOnMapChangedListener = new ArrayList<>();
@@ -412,7 +468,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));
+ 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 {
typedArray.recycle();
@@ -774,9 +852,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
@@ -807,9 +906,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
@@ -1835,6 +1958,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 +2054,40 @@ 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) {
+ Context context = v.getContext();
+ String[] items = context.getResources().getStringArray(R.array.attribution_names);
+ AlertDialog.Builder builder = new AlertDialog.Builder(context, R.style.AttributionAlertDialogStyle);
+ builder.setTitle(R.string.attributionsDialogTitle);
+ builder.setAdapter(new ArrayAdapter<>(context, R.layout.attribution_list_item, items), this);
+ builder.show();
+ }
+
+ // 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 url = context.getResources().getStringArray(R.array.attribution_links)[which];
+ if (which == ATTRIBUTION_INDEX_IMPROVE_THIS_MAP) {
+ 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(url));
+ 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_blue_normal.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-hdpi/ic_info_blue_normal.png
new file mode 100644
index 000000000..de44e3ddc
Binary files /dev/null and b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-hdpi/ic_info_blue_normal.png differ
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 000000000..fa2678624
Binary files /dev/null and b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-hdpi/ic_info_blue_pressed.png differ
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 000000000..dd50478ac
Binary files /dev/null and b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-mdpi/ic_info_blue_normal.png differ
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 000000000..d377f3cb8
Binary files /dev/null and b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-mdpi/ic_info_blue_pressed.png differ
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 000000000..df7d7a887
Binary files /dev/null and b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xhdpi/ic_info_blue_normal.png differ
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 000000000..f5b183364
Binary files /dev/null and b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xhdpi/ic_info_blue_pressed.png differ
diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxhdpi/ic_info_blue_normal.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxhdpi/ic_info_blue_normal.png
new file mode 100644
index 000000000..0a04d4eaa
Binary files /dev/null and b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxhdpi/ic_info_blue_normal.png differ
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 000000000..faaef0625
Binary files /dev/null and b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxhdpi/ic_info_blue_pressed.png differ
diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxhdpi/ic_logo_mapbox.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxhdpi/ic_logo_mapbox.png
new file mode 100644
index 000000000..d1260a16f
Binary files /dev/null and b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxhdpi/ic_logo_mapbox.png differ
diff --git a/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxxhdpi/ic_info_blue_normal.png b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxxhdpi/ic_info_blue_normal.png
new file mode 100644
index 000000000..bcee96dea
Binary files /dev/null and b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxxhdpi/ic_info_blue_normal.png differ
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 000000000..781263f76
Binary files /dev/null and b/android/java/MapboxGLAndroidSDK/src/main/res/drawable-xxxhdpi/ic_info_blue_pressed.png differ
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
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/arrays.xml b/android/java/MapboxGLAndroidSDK/src/main/res/values/arrays.xml
new file mode 100644
index 000000000..8a8e204b7
--- /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/#/%1$f/%2$f/%3$d
+
+
\ 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/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/strings.xml b/android/java/MapboxGLAndroidSDK/src/main/res/values/strings.xml
index ff91a160d..be9a1d38c 100644
--- a/android/java/MapboxGLAndroidSDK/src/main/res/values/strings.xml
+++ b/android/java/MapboxGLAndroidSDK/src/main/res/values/strings.xml
@@ -1,6 +1,9 @@
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
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
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_;