diff options
author | tobrun <tobrun.van.nuland@gmail.com> | 2017-11-07 16:04:12 +0100 |
---|---|---|
committer | Tobrun <tobrun.van.nuland@gmail.com> | 2017-11-13 18:57:55 +0100 |
commit | ab57792ec9b28319bce9bbfaaf3f492436f421d5 (patch) | |
tree | 448dbfd98f7a4d73d3bc742ba5562de7216082cb | |
parent | b79be1d40cde28407176661b5679b4299ee3f66c (diff) | |
download | qtlocation-mapboxgl-ab57792ec9b28319bce9bbfaaf3f492436f421d5.tar.gz |
[android] - optimise attribution sources
4 files changed, 112 insertions, 19 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/http/HTTPRequest.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/http/HTTPRequest.java index 32aa250997..9f887ab7cc 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/http/HTTPRequest.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/http/HTTPRequest.java @@ -55,6 +55,7 @@ class HTTPRequest implements Callback { private HTTPRequest(long nativePtr, String resourceUrl, String etag, String modified) { mNativePtr = nativePtr; + Timber.e("requesting: %s",resourceUrl); try { HttpUrl httpUrl = HttpUrl.parse(resourceUrl); final String host = httpUrl.host().toLowerCase(MapboxConstants.MAPBOX_LOCALE); diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/snapshotter/MapSnapshotter.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/snapshotter/MapSnapshotter.java index 3ce9a17358..2e13130c13 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/snapshotter/MapSnapshotter.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/snapshotter/MapSnapshotter.java @@ -5,6 +5,7 @@ import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Matrix; +import android.os.Build; import android.os.Handler; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -15,13 +16,15 @@ import android.util.DisplayMetrics; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; - import com.mapbox.mapboxsdk.R; import com.mapbox.mapboxsdk.camera.CameraPosition; import com.mapbox.mapboxsdk.constants.Style; import com.mapbox.mapboxsdk.geometry.LatLngBounds; import com.mapbox.mapboxsdk.storage.FileSource; +import java.util.ArrayList; +import java.util.List; + /** * The map snapshotter creates a bitmap of the map, rendered * off the UI thread. The snapshotter itself must be used on @@ -278,8 +281,8 @@ public class MapSnapshotter { Bitmap original = snapshot.getBitmap(); Canvas canvas = new Canvas(original); if (snapshot.isShowLogo()) { - Bitmap logo = addLogo(canvas, original); - addAttribution(canvas,logo,snapshot); + Logo logo = addLogo(canvas, original); + addAttribution(canvas, logo, snapshot); } } @@ -289,11 +292,13 @@ public class MapSnapshotter { * @param canvas the canvas to draw the bitmap on * @param original the map snapshot image */ - private Bitmap addLogo(Canvas canvas, Bitmap original) { + private Logo addLogo(Canvas canvas, Bitmap original) { DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); float margin = displayMetrics.density * LOGO_MARGIN_DP; - Bitmap logo = createScaledLogo(original); - canvas.drawBitmap(logo, margin, original.getHeight() - logo.getHeight() - margin, null); + Logo logo = createScaledLogo(original); + logo.setLeft(margin); + logo.setTop(original.getHeight() - logo.bitmap.getHeight() - margin); + canvas.drawBitmap(logo.bitmap, logo.left, logo.top, null); return logo; } @@ -303,7 +308,9 @@ public class MapSnapshotter { * @param canvas the canvas to draw the attribution on * @param mapSnapshot the map snapshot */ - private void addAttribution(Canvas canvas, Bitmap logo, MapSnapshot mapSnapshot) { + private void addAttribution(Canvas canvas, Logo logo, MapSnapshot mapSnapshot) { + DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); + int margin = (int) displayMetrics.density * LOGO_MARGIN_DP; Bitmap original = mapSnapshot.getBitmap(); TextView textView = new TextView(context); textView.setLayoutParams(new ViewGroup.LayoutParams( @@ -311,17 +318,48 @@ public class MapSnapshotter { ViewGroup.LayoutParams.WRAP_CONTENT) ); textView.setSingleLine(true); - textView.setTextSize(14); + textView.setTextSize(11 * logo.scale); + textView.setText(Html.fromHtml(createAttribution(mapSnapshot))); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + textView.setClipToOutline(true); + } + canvas.save(); + int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(original.getWidth(), View.MeasureSpec.AT_MOST); + int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); + textView.setPadding(margin, 0, margin, margin); + textView.setBackgroundResource(R.drawable.mapbox_rounded_corner); + textView.measure(widthMeasureSpec, heightMeasureSpec); + textView.layout(0, 0, textView.getMeasuredWidth(), textView.getMeasuredHeight()); + canvas.translate(logo.getWidth(), logo.getTop()); + textView.draw(canvas); + canvas.restore(); + } + + private String createAttribution(MapSnapshot mapSnapshot) { + String[] urls = parseAttribution(mapSnapshot); + return filterAttribution(urls); + } + + private String[] parseAttribution(MapSnapshot mapSnapshot) { + StringBuilder builder = new StringBuilder(); for (String attr : mapSnapshot.getAttributions()) { if (!attr.isEmpty()) { - textView.setText(fromHtml(attr)); - int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(original.getWidth(), View.MeasureSpec.AT_MOST); - int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); - textView.measure(widthMeasureSpec, heightMeasureSpec); - textView.layout(0, 0, original.getWidth(), original.getHeight()); - textView.draw(canvas); + builder.append(attr); } } + return builder.toString().split("(?=<a)"); + } + + private String filterAttribution(String[] urls) { + StringBuilder output = new StringBuilder(); + List<String> uniqueList = new ArrayList<>(); + for (String url : urls) { + if (!url.isEmpty() && !url.contains("mapbox-improve-map") && !uniqueList.contains(url)) { + output.append(url); + uniqueList.add(url); + } + } + return output.toString(); } /** @@ -346,12 +384,12 @@ public class MapSnapshotter { * @param snapshot the map snapshot where the logo should be placed on * @return the scaled bitmap logo */ - private Bitmap createScaledLogo(Bitmap snapshot) { + private Logo createScaledLogo(Bitmap snapshot) { Bitmap logo = BitmapFactory.decodeResource(context.getResources(), R.drawable.mapbox_logo_icon, null); float scale = calculateLogoScale(snapshot, logo); Matrix matrix = new Matrix(); matrix.postScale(scale, scale); - return Bitmap.createBitmap(logo, 0, 0, logo.getWidth(), logo.getHeight(), matrix, true); + return new Logo(Bitmap.createBitmap(logo, 0, 0, logo.getWidth(), logo.getHeight(), matrix, true), scale); } /** @@ -420,4 +458,44 @@ public class MapSnapshotter { @Override protected native void finalize() throws Throwable; + + private class Logo { + Bitmap bitmap; + float left; + float top; + float scale; + + public Logo(Bitmap bitmap, float scale) { + this.bitmap = bitmap; + this.scale = scale; + } + + public Bitmap getBitmap() { + return bitmap; + } + + public void setBitmap(Bitmap bitmap) { + this.bitmap = bitmap; + } + + public float getLeft() { + return left; + } + + public void setLeft(float left) { + this.left = left; + } + + public float getTop() { + return top; + } + + public void setTop(float top) { + this.top = top; + } + + public int getWidth() { + return (int) (left + bitmap.getWidth() + left + left + left); + } + } } diff --git a/platform/android/MapboxGLAndroidSDK/src/main/res/drawable/mapbox_rounded_corner.xml b/platform/android/MapboxGLAndroidSDK/src/main/res/drawable/mapbox_rounded_corner.xml new file mode 100644 index 0000000000..57ea9907d6 --- /dev/null +++ b/platform/android/MapboxGLAndroidSDK/src/main/res/drawable/mapbox_rounded_corner.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android"> + <solid android:color="#A6FFFFFF"/> + <padding + android:left="7dp" + android:right="4dp" + android:top="0.0dp" + android:bottom="1.5dp"/> + <corners android:radius="4.5dp"/> +</shape>
\ No newline at end of file diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/snapshot/MapSnapshotterMarkerActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/snapshot/MapSnapshotterMarkerActivity.java index 781e7b6334..8416a5017a 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/snapshot/MapSnapshotterMarkerActivity.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/snapshot/MapSnapshotterMarkerActivity.java @@ -9,14 +9,12 @@ import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.ViewTreeObserver; import android.widget.ImageView; - import com.mapbox.mapboxsdk.camera.CameraPosition; import com.mapbox.mapboxsdk.constants.Style; import com.mapbox.mapboxsdk.geometry.LatLng; import com.mapbox.mapboxsdk.snapshotter.MapSnapshot; import com.mapbox.mapboxsdk.snapshotter.MapSnapshotter; import com.mapbox.mapboxsdk.testapp.R; - import timber.log.Timber; /** @@ -46,7 +44,7 @@ public class MapSnapshotterMarkerActivity extends AppCompatActivity implements M getApplicationContext(), new MapSnapshotter .Options(Math.min(container.getMeasuredWidth(), 1024), Math.min(container.getMeasuredHeight(), 1024)) - .withStyle(Style.TRAFFIC_DAY) + .withStyle(Style.SATELLITE_STREETS) .withCameraPosition(new CameraPosition.Builder().target(new LatLng(52.090737, 5.121420)).zoom(15).build()) ); mapSnapshotter.start(MapSnapshotterMarkerActivity.this); @@ -55,6 +53,12 @@ public class MapSnapshotterMarkerActivity extends AppCompatActivity implements M } @Override + protected void onStop() { + super.onStop(); + mapSnapshotter.cancel(); + } + + @Override public void onSnapshotReady(MapSnapshot snapshot) { Timber.i("Snapshot ready"); ImageView imageView = (ImageView) findViewById(R.id.snapshot_image); |