From f3ffb45cf6adbdca375217c645eb455ff47991ec Mon Sep 17 00:00:00 2001 From: Tobrun Date: Tue, 27 Oct 2015 11:16:55 +0100 Subject: [PATCH] [android] #2809 - addPolylines and removeAnnotations in JNI, added feature activity + sanity test case --- .../com/mapbox/mapboxsdk/views/MapView.java | 22 ++- .../mapbox/mapboxsdk/views/NativeMapView.java | 6 + .../testapp/PolylineActivityTest.java | 34 ++++ .../src/main/AndroidManifest.xml | 4 + .../mapboxsdk/testapp/MainActivity.java | 4 + .../mapboxsdk/testapp/PolylineActivity.java | 168 ++++++++++++++++++ .../res/drawable-hdpi/ic_add_black_24dp.png | Bin 0 -> 124 bytes .../drawable-hdpi/ic_delete_white_24dp.png | Bin 0 -> 161 bytes .../ic_trending_up_white_24dp.png | Bin 0 -> 227 bytes .../res/drawable-mdpi/ic_add_black_24dp.png | Bin 0 -> 86 bytes .../drawable-mdpi/ic_delete_white_24dp.png | Bin 0 -> 115 bytes .../ic_trending_up_white_24dp.png | Bin 0 -> 179 bytes .../res/drawable-xhdpi/ic_add_black_24dp.png | Bin 0 -> 108 bytes .../drawable-xhdpi/ic_delete_white_24dp.png | Bin 0 -> 151 bytes .../ic_trending_up_white_24dp.png | Bin 0 -> 243 bytes .../res/drawable-xxhdpi/ic_add_black_24dp.png | Bin 0 -> 114 bytes .../drawable-xxhdpi/ic_delete_white_24dp.png | Bin 0 -> 194 bytes .../ic_trending_up_white_24dp.png | Bin 0 -> 367 bytes .../drawable-xxxhdpi/ic_add_black_24dp.png | Bin 0 -> 119 bytes .../drawable-xxxhdpi/ic_delete_white_24dp.png | Bin 0 -> 243 bytes .../ic_trending_up_white_24dp.png | Bin 0 -> 408 bytes .../src/main/res/layout/activity_polyline.xml | 37 ++++ .../src/main/res/menu/menu_drawer.xml | 6 + .../src/main/res/menu/menu_polyline.xml | 9 + .../src/main/res/values/strings.xml | 2 + platform/android/jni.cpp | 79 ++++++++ 26 files changed, 364 insertions(+), 7 deletions(-) create mode 100644 android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/testapp/PolylineActivityTest.java create mode 100644 android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/PolylineActivity.java create mode 100644 android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-hdpi/ic_add_black_24dp.png create mode 100644 android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-hdpi/ic_delete_white_24dp.png create mode 100644 android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-hdpi/ic_trending_up_white_24dp.png create mode 100644 android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-mdpi/ic_add_black_24dp.png create mode 100644 android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-mdpi/ic_delete_white_24dp.png create mode 100644 android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-mdpi/ic_trending_up_white_24dp.png create mode 100644 android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xhdpi/ic_add_black_24dp.png create mode 100644 android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xhdpi/ic_delete_white_24dp.png create mode 100644 android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xhdpi/ic_trending_up_white_24dp.png create mode 100644 android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxhdpi/ic_add_black_24dp.png create mode 100644 android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxhdpi/ic_delete_white_24dp.png create mode 100644 android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxhdpi/ic_trending_up_white_24dp.png create mode 100644 android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxxhdpi/ic_add_black_24dp.png create mode 100644 android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxxhdpi/ic_delete_white_24dp.png create mode 100644 android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxxhdpi/ic_trending_up_white_24dp.png create mode 100644 android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_polyline.xml create mode 100644 android/MapboxGLAndroidSDKTestApp/src/main/res/menu/menu_polyline.xml diff --git a/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/MapView.java b/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/MapView.java index 6f59ea211..f1c021c0c 100644 --- a/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/MapView.java +++ b/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/MapView.java @@ -1757,12 +1757,20 @@ public final class MapView extends FrameLayout { throw new NullPointerException("polylineOptionsList is null"); } - // TODO make faster in JNI int count = polylineOptionsList.size(); List polylines = new ArrayList<>(count); + for (PolylineOptions options : polylineOptionsList) { + polylines.add(options.getPolyline()); + } + + long[] ids = mNativeMapView.addPolylines(polylines); + + Polyline p; for (int i = 0; i < count; i++) { - PolylineOptions polylineOptions = polylineOptionsList.get(i); - polylines.add(addPolyline(polylineOptions)); + p = polylines.get(i); + p.setId(ids[i]); + p.setMapView(this); + mAnnotations.add(p); } return new ArrayList<>(polylines); @@ -1847,17 +1855,17 @@ public final class MapView extends FrameLayout { * @param annotationList A list of annotation objects to remove. */ @UiThread - public void removeAnnotations(@NonNull List annotationList) { + public void removeAnnotations(@NonNull List annotationList) { if (annotationList == null) { throw new NullPointerException("annotationList is null"); } - // TODO make faster in JNI int count = annotationList.size(); + long[] ids = new long[count]; for (int i = 0; i < count; i++) { - Annotation annotation = annotationList.get(i); - removeAnnotation(annotation); + ids[i] = annotationList.get(i).getId(); } + mNativeMapView.removeAnnotations(ids); } /** diff --git a/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/NativeMapView.java b/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/NativeMapView.java index da13efcf8..dce90b64d 100644 --- a/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/NativeMapView.java +++ b/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/NativeMapView.java @@ -361,6 +361,10 @@ final class NativeMapView { return nativeAddPolyline(mNativeMapViewPtr, polyline); } + public long[] addPolylines(List polylines) { + return nativeAddPolylines(mNativeMapViewPtr, polylines); + } + public long addPolygon(Polygon polygon) { return nativeAddPolygon(mNativeMapViewPtr, polygon); } @@ -584,6 +588,8 @@ final class NativeMapView { private native long nativeAddPolyline(long nativeMapViewPtr, Polyline polyline); + private native long[] nativeAddPolylines(long mNativeMapViewPtr, List polygon); + private native long nativeAddPolygon(long mNativeMapViewPtr, Polygon polygon); private native long[] nativeAddPolygons(long mNativeMapViewPtr, List polygon); diff --git a/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/testapp/PolylineActivityTest.java b/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/testapp/PolylineActivityTest.java new file mode 100644 index 000000000..653921497 --- /dev/null +++ b/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/testapp/PolylineActivityTest.java @@ -0,0 +1,34 @@ +package com.mapbox.mapboxsdk.testapp; + +import android.support.test.rule.ActivityTestRule; +import android.support.test.runner.AndroidJUnit4; +import android.test.suitebuilder.annotation.LargeTest; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** + * Tests on PolyLineActivity + */ +@RunWith(AndroidJUnit4.class) +@LargeTest +public class PolylineActivityTest extends BaseTest { + + @Rule + public ActivityTestRule mActivityRule = new ActivityTestRule<>( + PolylineActivity.class); + + private PolylineActivity mActivity = null; + + @Before + public void setActivity() { + mActivity = mActivityRule.getActivity(); + } + + @Test + public void testSanity() { + checkViewIsDisplayed(R.id.mapView); + } +} diff --git a/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml b/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml index 6d8ac8424..c24a86629 100644 --- a/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml +++ b/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml @@ -52,6 +52,10 @@ android:name=".MyLocationTrackingModeActivity" android:label="@string/activity_user_tracking_mode" /> + + diff --git a/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/MainActivity.java b/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/MainActivity.java index 006c11d47..4d9d1ecc4 100644 --- a/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/MainActivity.java +++ b/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/MainActivity.java @@ -343,6 +343,10 @@ public class MainActivity extends AppCompatActivity { startActivity(new Intent(getApplicationContext(), MyLocationTrackingModeActivity.class)); return true; + case R.id.action_polyline: + startActivity(new Intent(getApplicationContext(), PolylineActivity.class)); + return true; + default: return changeMapStyle(menuItem.getItemId()); } diff --git a/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/PolylineActivity.java b/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/PolylineActivity.java new file mode 100644 index 000000000..919053a22 --- /dev/null +++ b/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/PolylineActivity.java @@ -0,0 +1,168 @@ +package com.mapbox.mapboxsdk.testapp; + +import android.graphics.Color; +import android.os.Bundle; +import android.support.v7.app.ActionBar; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; + +import com.mapbox.mapboxsdk.annotations.Polyline; +import com.mapbox.mapboxsdk.annotations.PolylineOptions; +import com.mapbox.mapboxsdk.geometry.LatLng; +import com.mapbox.mapboxsdk.utils.ApiAccess; +import com.mapbox.mapboxsdk.views.MapView; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class PolylineActivity extends AppCompatActivity { + + private List mPolyLines; + private MapView mMapView; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_polyline); + + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + ActionBar actionBar = getSupportActionBar(); + if (actionBar != null) { + actionBar.setDisplayHomeAsUpEnabled(true); + actionBar.setDisplayShowHomeEnabled(true); + } + + mMapView = (MapView) findViewById(R.id.mapView); + mMapView.setAccessToken(ApiAccess.getToken(this)); + mMapView.onCreate(savedInstanceState); + + mPolyLines = mMapView.addPolylines(PolylineProvider.getAll()); + + findViewById(R.id.fab).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (mPolyLines != null && mPolyLines.size() > 0) { + if (mPolyLines.size() == 1) { + // test for removing annotation + mMapView.removeAnnotation(mPolyLines.get(0)); + } else { + // test for removing annotations + mMapView.removeAnnotations(mPolyLines); + } + } + mPolyLines = mMapView.addPolylines(PolylineProvider.getRandomLine()); + } + }); + } + + + @Override + protected void onStart() { + super.onStart(); + mMapView.onStart(); + } + + @Override + public void onResume() { + super.onResume(); + mMapView.onResume(); + } + + @Override + public void onPause() { + super.onPause(); + mMapView.onPause(); + } + + @Override + protected void onStop() { + super.onStop(); + mMapView.onStop(); + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + mMapView.onSaveInstanceState(outState); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + mMapView.onDestroy(); + } + + @Override + public void onLowMemory() { + super.onLowMemory(); + mMapView.onLowMemory(); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.menu_polyline, menu); + return super.onCreateOptionsMenu(menu); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.action_id_remove: + // test to remove all annotations + mMapView.removeAllAnnotations(); + return true; + + case android.R.id.home: + onBackPressed(); + return true; + + default: + return super.onOptionsItemSelected(item); + } + } + + private static class PolylineProvider { + private static final LatLng ANDORRA = new LatLng(42.505777, 1.52529); + private static final LatLng LUXEMBOURG = new LatLng(49.815273, 6.129583); + private static final LatLng MONACO = new LatLng(43.738418, 7.424616); + private static final LatLng VATICAN_CITY = new LatLng(41.902916, 12.453389); + private static final LatLng SAN_MARINO = new LatLng(43.942360, 12.457777); + private static final LatLng LIECHTENSTEIN = new LatLng(47.166000, 9.555373); + + private static final List POLYLINES = new ArrayList() {{ + add(generatePolyline(ANDORRA, LUXEMBOURG, "#F44336")); + add(generatePolyline(ANDORRA, MONACO, "#FF5722")); + add(generatePolyline(MONACO, VATICAN_CITY, "#673AB7")); + add(generatePolyline(VATICAN_CITY, SAN_MARINO, "#009688")); + add(generatePolyline(SAN_MARINO, LIECHTENSTEIN, "#795548")); + add(generatePolyline(LIECHTENSTEIN, LUXEMBOURG, "#3F51B5")); + }}; + + private static PolylineOptions generatePolyline(LatLng start, LatLng end, String color) { + PolylineOptions line = new PolylineOptions(); + line.add(start); + line.add(end); + line.color(Color.parseColor(color)); + return line; + } + + public static List getAll() { + return POLYLINES; + } + + public static List getRandomLine() { + List randomLines = new ArrayList<>(); + Collections.shuffle(POLYLINES); + randomLines.add(POLYLINES.get(0)); + return randomLines; + } + + } + +} diff --git a/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-hdpi/ic_add_black_24dp.png b/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-hdpi/ic_add_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..c04b523c482b77824608a836515e865579f8b00c GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8K;v!{z=NCji^0d}{88U+a%3{LE) zc(W3I@VD?TX6u!5iTdQ+%zl7P_JBaSLWcds4UNy(0^e=DSmGkkBjwV6s9vOpiQ(Iw WlC8ByowtC-F?hQAxvX|k0wldT1B8K8hNp{Th{y5d1PNA=hW|4Ewf~tb z9PIip^F(s-FKmRW+J}dc&f#K)gg?ihMxz_^iWbkzL Kb6Mw<&;$SheLUU( literal 0 HcmV?d00001 diff --git a/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-hdpi/ic_trending_up_white_24dp.png b/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-hdpi/ic_trending_up_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..a9864a8fcfe54b51038b832512e518122a677148 GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8LpDo+>35Rc<;FM9JGQV?-_$ld3A zXR%q{;Z%t={i}8x7CvaQ;nU(h>XGlP?rXvQ;|Jr!pv-d{m9vbpHicSVXu8h9arzT~ zvHV63@59ZZO_f>-I=l`(iPq0LGVgmGb_qFfMdJS(&1aW>-`8(_dM!OFYer#CWi{97 zuhTECDU=Xg)%R(-)r%R$CpuU{_7CM{eR+v zgY~R6ULP4=Whfl~yJVLAs>BdxJ>K;jR@FB~H~;@Xea5N(zxh7d@H058PdfN2J>(P6 O6b4UMKbLh*2~7YiM=IO^ literal 0 HcmV?d00001 diff --git a/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-mdpi/ic_trending_up_white_24dp.png b/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-mdpi/ic_trending_up_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..fb04031d47a2df76d49938e674ea79ee0082d470 GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+iDo+>35R22v2@mdKI;Vst06!J6N0?fLsPoS3j3^P6omm*dL5Nt8*s| zfjVId)Cgk$;Kla^iTMkFYp!&86~M&IYnv$Ycb?V2^LT@pogmqpJ*&$yLUipz2 t9P^9EgKHjO$D?C@BnHQPEEbFXa1X$nII5sT7kdBz002ovPDHLkV1nSGXXyX{ literal 0 HcmV?d00001 diff --git a/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxhdpi/ic_add_black_24dp.png b/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxhdpi/ic_add_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..a84106b01fd4402e5d15b08c496a75b76e811999 GIT binary patch literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xf3?%cF6p=fS?83{ F1OO~S9V-9; literal 0 HcmV?d00001 diff --git a/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxhdpi/ic_delete_white_24dp.png b/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxhdpi/ic_delete_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..3fcdfdb55ebcba8d2fff8be03ea3518c137e3464 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY0wn)GsXhawIz3$+Lo)8Yy>yn>!GXc$q3uOx zabB)cz0QC}ts}W53MuVBD%UsZPv&gw=#W`?Y0ciWQ2$4FyseJx>{`Oj#KIv^yWsd< zb^!&41_nkD7m4wnX|34#N6cTv0=_gxaj*E+Smb+hj$`D9r9sI`%Q@~%Ssl3i>7S{h gq0!eBm41aw^UfFNx4vv@4|EiRr>mdKI;Vst0RDqR&j0`b literal 0 HcmV?d00001 diff --git a/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxhdpi/ic_trending_up_white_24dp.png b/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxhdpi/ic_trending_up_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..78119528c28cc6e03562bac07541f94f7b759c20 GIT binary patch literal 367 zcmV-#0g(QQP)@A%kCkFz`mmi`y08p{~QJyiJ zXplT!mJcK;oTZFmperYkq;dw;O8~_QASs;152t!B#c+1D1K=U~IAs!&;~^=Wtjzf* zb>(cGW1^5kIDe#WoQ?Mn;)WE;`6adIJk&Td`H+)~q;S4noG!bgar*i5cb$}oQ@m41 zDyNU+tX&)j>5!14lB&(IoK+L2fs}&dA*JFtNMA_KpdCjcfjP^zoEy^20H;I(a~54W z7t$w|lf`i0$Nr@(5CxtP_7-NhvXlDbn^OTL(4hH}L N002ovPDHLkV1ms!pThtE literal 0 HcmV?d00001 diff --git a/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxxhdpi/ic_add_black_24dp.png b/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxxhdpi/ic_add_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..3cb10924a0912d9f64d338b9769da053bc051da6 GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeK3?y%aJ*@^(YymzYu0R?HmZtAK52P4Ng8YIR z9G=}s19Id&T^vIy7?T^C0uTIeOgX2~{@-4rW`SaRO?zLF8zVzTLHf)E76O$Z{hqFV JF6*2UngE2qAnO1C literal 0 HcmV?d00001 diff --git a/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxxhdpi/ic_delete_white_24dp.png b/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxxhdpi/ic_delete_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..8d322aa9baba09c58b0058760fb7d53a392b63a1 GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%xcgc6quuhE&{od*w9mAp-%|!1oIz zUAkW?IxdlN5p^sPGLtM@^D{+9cy9DT>q|G5dQ4KuY+ck{{`y~aU3Uxr^X+awlIm)m zLim6tF)Yw+SYp*L31Z?03ltA1m;Rr_zhgPmvYG>yq8FYs_ibEqHvUn-r*1=DgDFx+ z?bd02*59bTR4g&(=Y(kztIpQ%Z4JJY^zZNE9?f4`+x0ysZP__5=_$iXi`hvQAj>>m L{an^LB{Ts5t^ZVx literal 0 HcmV?d00001 diff --git a/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxxhdpi/ic_trending_up_white_24dp.png b/android/MapboxGLAndroidSDKTestApp/src/main/res/drawable-xxxhdpi/ic_trending_up_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..32f3a10cf13477b79ebef0c7c665c8949c1d977b GIT binary patch literal 408 zcmV;J0cZY+P)Hj3O)XyX&^{>1y)wcSHgv5GB|2rX0 zf5JUBB?;^GBcJ|+!3^hqLSp^41AQ|;p>usNfj~c-@RZQM?n*zKz@cA}(5rr7!WK8( z>K7#RuJ0sF1p1i-7X3s5lm0>ioBk|e!Y!TtQ39*}KH-H}zvUldZhbR6Q|p`I46nrc z3khucvjj%{eZq!V|1h_C^@R{Z2qA + + + + + + + + + diff --git a/android/MapboxGLAndroidSDKTestApp/src/main/res/menu/menu_drawer.xml b/android/MapboxGLAndroidSDKTestApp/src/main/res/menu/menu_drawer.xml index 58c95db07..592651ef8 100644 --- a/android/MapboxGLAndroidSDKTestApp/src/main/res/menu/menu_drawer.xml +++ b/android/MapboxGLAndroidSDKTestApp/src/main/res/menu/menu_drawer.xml @@ -108,6 +108,12 @@ android:icon="@drawable/ic_gps_fixed_white_24dp" android:title="@string/activity_user_tracking_mode" /> + + diff --git a/android/MapboxGLAndroidSDKTestApp/src/main/res/menu/menu_polyline.xml b/android/MapboxGLAndroidSDKTestApp/src/main/res/menu/menu_polyline.xml new file mode 100644 index 000000000..d419fb0b2 --- /dev/null +++ b/android/MapboxGLAndroidSDKTestApp/src/main/res/menu/menu_polyline.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/android/MapboxGLAndroidSDKTestApp/src/main/res/values/strings.xml b/android/MapboxGLAndroidSDKTestApp/src/main/res/values/strings.xml index b52662824..6f1263dca 100644 --- a/android/MapboxGLAndroidSDKTestApp/src/main/res/values/strings.xml +++ b/android/MapboxGLAndroidSDKTestApp/src/main/res/values/strings.xml @@ -11,6 +11,7 @@ InfoWindow Activity Visible Coordinate Bounds User tracking mode + Polyline Activity Main Activity Controls Main Activity Styles @@ -27,6 +28,7 @@ Add Markers in bulk Set Visible Bounds Center map around 2 markers + Remove polylines FPS: diff --git a/platform/android/jni.cpp b/platform/android/jni.cpp index 5808dff9c..3dca3c9b2 100644 --- a/platform/android/jni.cpp +++ b/platform/android/jni.cpp @@ -959,6 +959,83 @@ jlong JNICALL nativeAddPolyline(JNIEnv *env, jobject obj, jlong nativeMapViewPtr return id; } +jlongArray JNICALL nativeAddPolylines(JNIEnv *env, jobject obj, jlong nativeMapViewPtr, jobject jlist) { + mbgl::Log::Debug(mbgl::Event::JNI, "nativeAddPolylines"); + assert(nativeMapViewPtr != 0); + NativeMapView *nativeMapView = reinterpret_cast(nativeMapViewPtr); + + std::vector shapes; + + if (jlist == nullptr) { + if (env->ThrowNew(nullPointerExceptionClass, "List cannot be null.") < 0) { + env->ExceptionDescribe(); + return nullptr; + } + return nullptr; + } + + jobjectArray jarray = + reinterpret_cast(env->CallObjectMethod(jlist, listToArrayId)); + if (env->ExceptionCheck() || (jarray == nullptr)) { + env->ExceptionDescribe(); + return nullptr; + } + + jsize len = env->GetArrayLength(jarray); + if (len < 0) { + env->ExceptionDescribe(); + return nullptr; + } + + shapes.reserve(len); + + for (jsize i = 0; i < len; i++) { + jobject polyline = reinterpret_cast(env->GetObjectArrayElement(jarray, i)); + + jfloat alpha = env->GetFloatField(polyline, polylineAlphaId); + if (env->ExceptionCheck()) { + env->ExceptionDescribe(); + return nullptr; + } + + jint color = env->GetIntField(polyline, polylineColorId); + if (env->ExceptionCheck()) { + env->ExceptionDescribe(); + return nullptr; + } + + int r = (color >> 16) & 0xFF; + int g = (color >> 8) & 0xFF; + int b = (color) & 0xFF; + int a = (color >> 24) & 0xFF; + + jfloat width = env->GetFloatField(polyline, polylineWidthId); + if (env->ExceptionCheck()) { + env->ExceptionDescribe(); + return nullptr; + } + + mbgl::ShapeAnnotation::Properties shapeProperties; + mbgl::LinePaintProperties lineProperties; + lineProperties.opacity = alpha; + lineProperties.color = {{ static_cast(r) / 255.0f, static_cast(g) / 255.0f, static_cast(b) / 255.0f, static_cast(a) / 255.0f }}; + lineProperties.width = width; + shapeProperties.set(lineProperties); + + jobject points = env->GetObjectField(polyline, polylinePointsId); + mbgl::AnnotationSegment segment = annotation_segment_from_latlng_jlist(env, points); + + shapes.emplace_back(mbgl::AnnotationSegments { segment }, shapeProperties); + + env->DeleteLocalRef(polyline); + } + + env->DeleteLocalRef(jarray); + + std::vector shapeAnnotationIDs = nativeMapView->getMap().addShapeAnnotations(shapes); + return std_vector_uint_to_jobject(env, shapeAnnotationIDs); +} + jlong JNICALL nativeAddPolygon(JNIEnv *env, jobject obj, jlong nativeMapViewPtr, jobject polygon) { mbgl::Log::Debug(mbgl::Event::JNI, "nativeAddPolygon"); assert(nativeMapViewPtr != 0); @@ -1852,6 +1929,8 @@ extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) { reinterpret_cast(&nativeAddMarkers)}, {"nativeAddPolyline", "(JLcom/mapbox/mapboxsdk/annotations/Polyline;)J", reinterpret_cast(&nativeAddPolyline)}, + {"nativeAddPolylines", "(JLjava/util/List;)[J", + reinterpret_cast(&nativeAddPolylines)}, {"nativeAddPolygon", "(JLcom/mapbox/mapboxsdk/annotations/Polygon;)J", reinterpret_cast(&nativeAddPolygon)}, {"nativeAddPolygons", "(JLjava/util/List;)[J",