From 3b4bf343f5d294d9a2d82689ad809dbcc7fbc255 Mon Sep 17 00:00:00 2001
From: Birk Skyum <74932975+birkskyum@users.noreply.github.com>
Date: Sun, 8 Jan 2023 20:00:59 +0100
Subject: [PATCH] Migrate remaining Feature Activities in Android TestApp to
Kotlin (#666)
---
.../activity/annotation/PolylineActivity.java | 225 -----------
.../activity/annotation/PolylineActivity.kt | 209 ++++++++++
.../annotation/PressForMarkerActivity.java | 153 --------
.../annotation/PressForMarkerActivity.kt | 134 +++++++
.../DeviceIndependentTestActivity.java | 81 ----
.../espresso/DeviceIndependentTestActivity.kt | 65 +++
.../espresso/EspressoTestActivity.java | 68 ----
.../activity/espresso/EspressoTestActivity.kt | 56 +++
.../activity/style/ImageInLabelActivity.java | 131 -------
.../activity/style/ImageInLabelActivity.kt | 123 ++++++
.../style/SymbolGeneratorActivity.java | 369 ------------------
.../activity/style/SymbolGeneratorActivity.kt | 346 ++++++++++++++++
.../PerformanceMeasurementActivity.java | 189 ---------
.../PerformanceMeasurementActivity.kt | 156 ++++++++
14 files changed, 1089 insertions(+), 1216 deletions(-)
delete mode 100644 platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/PolylineActivity.java
create mode 100644 platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/PolylineActivity.kt
delete mode 100644 platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/PressForMarkerActivity.java
create mode 100644 platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/PressForMarkerActivity.kt
delete mode 100644 platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/espresso/DeviceIndependentTestActivity.java
create mode 100644 platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/espresso/DeviceIndependentTestActivity.kt
delete mode 100644 platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/espresso/EspressoTestActivity.java
create mode 100644 platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/espresso/EspressoTestActivity.kt
delete mode 100644 platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/ImageInLabelActivity.java
create mode 100644 platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/ImageInLabelActivity.kt
delete mode 100644 platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/SymbolGeneratorActivity.java
create mode 100644 platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/SymbolGeneratorActivity.kt
delete mode 100644 platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/telemetry/PerformanceMeasurementActivity.java
create mode 100644 platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/telemetry/PerformanceMeasurementActivity.kt
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/PolylineActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/PolylineActivity.java
deleted file mode 100644
index b70313f5f..000000000
--- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/PolylineActivity.java
+++ /dev/null
@@ -1,225 +0,0 @@
-package com.mapbox.mapboxsdk.testapp.activity.annotation;
-
-import android.graphics.Color;
-import android.os.Bundle;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.widget.Toast;
-
-import androidx.appcompat.app.AppCompatActivity;
-
-import com.mapbox.mapboxsdk.annotations.Polyline;
-import com.mapbox.mapboxsdk.annotations.PolylineOptions;
-import com.mapbox.mapboxsdk.geometry.LatLng;
-import com.mapbox.mapboxsdk.maps.MapView;
-import com.mapbox.mapboxsdk.maps.MapboxMap;
-import com.mapbox.mapboxsdk.maps.Style;
-import com.mapbox.mapboxsdk.testapp.R;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Test activity showcasing the Polyline annotations API.
- *
- * Shows how to add and remove polylines.
- *
- */
-public class PolylineActivity extends AppCompatActivity {
-
- private static final String STATE_POLYLINE_OPTIONS = "polylineOptions";
-
- 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 float FULL_ALPHA = 1.0f;
- private static final float PARTIAL_ALPHA = 0.5f;
- private static final float NO_ALPHA = 0.0f;
-
- private List polylines;
- private ArrayList polylineOptions = new ArrayList<>();
- private MapView mapView;
- private MapboxMap mapboxMap;
-
- private boolean fullAlpha = true;
- private boolean visible = true;
- private boolean width = true;
- private boolean color = true;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_polyline);
-
- if (savedInstanceState != null) {
- polylineOptions = savedInstanceState.getParcelableArrayList(STATE_POLYLINE_OPTIONS);
- } else {
- polylineOptions.addAll(getAllPolylines());
- }
-
- mapView = findViewById(R.id.mapView);
- mapView.onCreate(savedInstanceState);
- mapView.getMapAsync(mapboxMap -> {
- PolylineActivity.this.mapboxMap = mapboxMap;
- mapboxMap.setStyle(Style.getPredefinedStyle("Satellite Hybrid"));
- mapboxMap.setOnPolylineClickListener(polyline -> Toast.makeText(
- PolylineActivity.this,
- "You clicked on polyline with id = " + polyline.getId(),
- Toast.LENGTH_SHORT
- ).show());
-
- polylines = mapboxMap.addPolylines(polylineOptions);
- });
-
- View fab = findViewById(R.id.fab);
- if (fab != null) {
- fab.setOnClickListener(view -> {
- if (mapboxMap != null) {
- if (polylines != null && polylines.size() > 0) {
- if (polylines.size() == 1) {
- // test for removing annotation
- mapboxMap.removeAnnotation(polylines.get(0));
- } else {
- // test for removing annotations
- mapboxMap.removeAnnotations(polylines);
- }
- }
- polylineOptions.clear();
- polylineOptions.addAll(getRandomLine());
- polylines = mapboxMap.addPolylines(polylineOptions);
-
- }
- });
- }
- }
-
- private List getAllPolylines() {
- List options = new ArrayList<>();
- options.add(generatePolyline(ANDORRA, LUXEMBOURG, "#F44336"));
- options.add(generatePolyline(ANDORRA, MONACO, "#FF5722"));
- options.add(generatePolyline(MONACO, VATICAN_CITY, "#673AB7"));
- options.add(generatePolyline(VATICAN_CITY, SAN_MARINO, "#009688"));
- options.add(generatePolyline(SAN_MARINO, LIECHTENSTEIN, "#795548"));
- options.add(generatePolyline(LIECHTENSTEIN, LUXEMBOURG, "#3F51B5"));
- return options;
- }
-
- private 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 List getRandomLine() {
- final List randomLines = getAllPolylines();
- Collections.shuffle(randomLines);
- return new ArrayList() {
- {
- add(randomLines.get(0));
- }
- };
- }
-
- @Override
- protected void onStart() {
- super.onStart();
- mapView.onStart();
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- mapView.onResume();
- }
-
- @Override
- protected void onPause() {
- super.onPause();
- mapView.onPause();
- }
-
- @Override
- protected void onStop() {
- super.onStop();
- mapView.onStop();
- }
-
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- mapView.onSaveInstanceState(outState);
- outState.putParcelableArrayList(STATE_POLYLINE_OPTIONS, polylineOptions);
- }
-
- @Override
- protected void onDestroy() {
- super.onDestroy();
- mapView.onDestroy();
- }
-
- @Override
- public void onLowMemory() {
- super.onLowMemory();
- mapView.onLowMemory();
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.menu_polyline, menu);
- return super.onCreateOptionsMenu(menu);
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- if (polylines.size() <= 0) {
- Toast.makeText(PolylineActivity.this, "No polylines on map", Toast.LENGTH_LONG).show();
- return super.onOptionsItemSelected(item);
- }
- switch (item.getItemId()) {
- case R.id.action_id_remove:
- // test to remove all annotations
- polylineOptions.clear();
- mapboxMap.clear();
- polylines.clear();
- return true;
-
- case R.id.action_id_alpha:
- fullAlpha = !fullAlpha;
- for (Polyline p : polylines) {
- p.setAlpha(fullAlpha ? FULL_ALPHA : PARTIAL_ALPHA);
- }
- return true;
-
- case R.id.action_id_color:
- color = !color;
- for (Polyline p : polylines) {
- p.setColor(color ? Color.RED : Color.BLUE);
- }
- return true;
-
- case R.id.action_id_width:
- width = !width;
- for (Polyline p : polylines) {
- p.setWidth(width ? 3.0f : 5.0f);
- }
- return true;
-
- case R.id.action_id_visible:
- visible = !visible;
- for (Polyline p : polylines) {
- p.setAlpha(visible ? (fullAlpha ? FULL_ALPHA : PARTIAL_ALPHA) : NO_ALPHA);
- }
- return true;
- default:
- return super.onOptionsItemSelected(item);
- }
- }
-}
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/PolylineActivity.kt b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/PolylineActivity.kt
new file mode 100644
index 000000000..246f74355
--- /dev/null
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/PolylineActivity.kt
@@ -0,0 +1,209 @@
+package com.mapbox.mapboxsdk.testapp.activity.annotation
+
+import android.graphics.Color
+import android.os.Bundle
+import android.view.Menu
+import android.view.MenuItem
+import android.view.View
+import android.widget.Toast
+import androidx.appcompat.app.AppCompatActivity
+import com.mapbox.mapboxsdk.annotations.Polyline
+import com.mapbox.mapboxsdk.annotations.PolylineOptions
+import com.mapbox.mapboxsdk.geometry.LatLng
+import com.mapbox.mapboxsdk.maps.MapView
+import com.mapbox.mapboxsdk.maps.MapboxMap
+import com.mapbox.mapboxsdk.maps.OnMapReadyCallback
+import com.mapbox.mapboxsdk.maps.Style
+import com.mapbox.mapboxsdk.testapp.R
+import java.util.*
+
+/**
+ * Test activity showcasing the Polyline annotations API.
+ *
+ *
+ * Shows how to add and remove polylines.
+ *
+ */
+class PolylineActivity : AppCompatActivity() {
+ private var polylines: MutableList? = null
+ private var polylineOptions: ArrayList? = ArrayList()
+ private lateinit var mapView: MapView
+ private lateinit var mapboxMap: MapboxMap
+ private var fullAlpha = true
+ private var showPolylines = true
+ private var width = true
+ private var color = true
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_polyline)
+ if (savedInstanceState != null) {
+ polylineOptions = savedInstanceState.getParcelableArrayList(STATE_POLYLINE_OPTIONS)
+ } else {
+ polylineOptions!!.addAll(allPolylines)
+ }
+ mapView = findViewById(R.id.mapView)
+ mapView.onCreate(savedInstanceState)
+ mapView.getMapAsync(
+ OnMapReadyCallback { mapboxMap: MapboxMap ->
+ this@PolylineActivity.mapboxMap = mapboxMap
+ mapboxMap.setStyle(Style.getPredefinedStyle("Satellite Hybrid"))
+ mapboxMap.setOnPolylineClickListener { polyline: Polyline ->
+ Toast.makeText(
+ this@PolylineActivity,
+ "You clicked on polyline with id = " + polyline.id,
+ Toast.LENGTH_SHORT
+ ).show()
+ }
+ polylines = mapboxMap.addPolylines(polylineOptions!!)
+ }
+ )
+ val fab = findViewById(R.id.fab)
+ fab?.setOnClickListener { view: View? ->
+ if (mapboxMap != null) {
+ if (polylines != null && polylines!!.size > 0) {
+ if (polylines!!.size == 1) {
+ // test for removing annotation
+ mapboxMap.removeAnnotation(polylines!![0])
+ } else {
+ // test for removing annotations
+ mapboxMap.removeAnnotations(polylines!!)
+ }
+ }
+ polylineOptions!!.clear()
+ polylineOptions!!.addAll(randomLine)
+ polylines = mapboxMap.addPolylines(polylineOptions!!)
+ }
+ }
+ }
+
+ private val allPolylines: List
+ private get() {
+ val options: MutableList = ArrayList()
+ options.add(generatePolyline(ANDORRA, LUXEMBOURG, "#F44336"))
+ options.add(generatePolyline(ANDORRA, MONACO, "#FF5722"))
+ options.add(generatePolyline(MONACO, VATICAN_CITY, "#673AB7"))
+ options.add(generatePolyline(VATICAN_CITY, SAN_MARINO, "#009688"))
+ options.add(generatePolyline(SAN_MARINO, LIECHTENSTEIN, "#795548"))
+ options.add(generatePolyline(LIECHTENSTEIN, LUXEMBOURG, "#3F51B5"))
+ return options
+ }
+
+ private fun generatePolyline(start: LatLng, end: LatLng, color: String): PolylineOptions {
+ val line = PolylineOptions()
+ line.add(start)
+ line.add(end)
+ line.color(Color.parseColor(color))
+ return line
+ }
+
+ val randomLine: List
+ get() {
+ val randomLines = allPolylines
+ Collections.shuffle(randomLines)
+ return object : ArrayList() {
+ init {
+ add(randomLines[0])
+ }
+ }
+ }
+
+ override fun onStart() {
+ super.onStart()
+ mapView.onStart()
+ }
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ super.onPause()
+ mapView.onPause()
+ }
+
+ override fun onStop() {
+ super.onStop()
+ mapView.onStop()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ outState.putParcelableArrayList(STATE_POLYLINE_OPTIONS, polylineOptions)
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ mapView.onDestroy()
+ }
+
+ override fun onLowMemory() {
+ super.onLowMemory()
+ mapView.onLowMemory()
+ }
+
+ override fun onCreateOptionsMenu(menu: Menu): Boolean {
+ menuInflater.inflate(R.menu.menu_polyline, menu)
+ return super.onCreateOptionsMenu(menu)
+ }
+
+ override fun onOptionsItemSelected(item: MenuItem): Boolean {
+ if (polylines!!.size <= 0) {
+ Toast.makeText(this@PolylineActivity, "No polylines on map", Toast.LENGTH_LONG).show()
+ return super.onOptionsItemSelected(item)
+ }
+ return when (item.itemId) {
+ R.id.action_id_remove -> {
+ // test to remove all annotations
+ polylineOptions!!.clear()
+ mapboxMap.clear()
+ polylines!!.clear()
+ true
+ }
+ R.id.action_id_alpha -> {
+ fullAlpha = !fullAlpha
+ for (p in polylines!!) {
+ p.alpha = if (fullAlpha) FULL_ALPHA else PARTIAL_ALPHA
+ }
+ true
+ }
+ R.id.action_id_color -> {
+ color = !color
+ for (p in polylines!!) {
+ p.color = if (color) Color.RED else Color.BLUE
+ }
+ true
+ }
+ R.id.action_id_width -> {
+ width = !width
+ for (p in polylines!!) {
+ p.width = if (width) 3.0f else 5.0f
+ }
+ true
+ }
+ R.id.action_id_visible -> {
+ showPolylines = !showPolylines
+ for (p in polylines!!) {
+ p.alpha =
+ if (showPolylines) (if (fullAlpha) FULL_ALPHA else PARTIAL_ALPHA) else NO_ALPHA
+ }
+ true
+ }
+ else -> super.onOptionsItemSelected(item)
+ }
+ }
+
+ companion object {
+ private const val STATE_POLYLINE_OPTIONS = "polylineOptions"
+ private val ANDORRA = LatLng(42.505777, 1.52529)
+ private val LUXEMBOURG = LatLng(49.815273, 6.129583)
+ private val MONACO = LatLng(43.738418, 7.424616)
+ private val VATICAN_CITY = LatLng(41.902916, 12.453389)
+ private val SAN_MARINO = LatLng(43.942360, 12.457777)
+ private val LIECHTENSTEIN = LatLng(47.166000, 9.555373)
+ private const val FULL_ALPHA = 1.0f
+ private const val PARTIAL_ALPHA = 0.5f
+ private const val NO_ALPHA = 0.0f
+ }
+}
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/PressForMarkerActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/PressForMarkerActivity.java
deleted file mode 100644
index b7f0c2cbf..000000000
--- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/PressForMarkerActivity.java
+++ /dev/null
@@ -1,153 +0,0 @@
-package com.mapbox.mapboxsdk.testapp.activity.annotation;
-
-import android.graphics.PointF;
-import android.os.Bundle;
-import android.view.Menu;
-import android.view.MenuItem;
-
-import androidx.annotation.Nullable;
-import androidx.appcompat.app.AppCompatActivity;
-
-import com.mapbox.mapboxsdk.annotations.MarkerOptions;
-import com.mapbox.mapboxsdk.geometry.LatLng;
-import com.mapbox.mapboxsdk.maps.MapView;
-import com.mapbox.mapboxsdk.maps.MapboxMap;
-import com.mapbox.mapboxsdk.maps.Style;
-import com.mapbox.mapboxsdk.testapp.R;
-
-import java.text.DecimalFormat;
-import java.util.ArrayList;
-
-/**
- * Test activity showcasing to add a Marker on click.
- *
- * Shows how to use a OnMapClickListener and a OnMapLongClickListener
- *
- */
-public class PressForMarkerActivity extends AppCompatActivity {
-
- private MapView mapView;
- private MapboxMap mapboxMap;
- private ArrayList markerList = new ArrayList<>();
-
- private static final DecimalFormat LAT_LON_FORMATTER = new DecimalFormat("#.#####");
-
- private static String STATE_MARKER_LIST = "markerList";
-
- @Override
- protected void onCreate(@Nullable final Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_press_for_marker);
-
- mapView = (MapView) findViewById(R.id.mapView);
- mapView.onCreate(savedInstanceState);
- mapView.getMapAsync(map -> {
- mapboxMap = map;
- resetMap();
-
- mapboxMap.addOnMapLongClickListener(point -> {
- addMarker(point);
- return false;
- });
-
- mapboxMap.addOnMapClickListener(point -> {
- addMarker(point);
- return false;
- });
-
- mapboxMap.setStyle(Style.getPredefinedStyle("Streets"));
-
- if (savedInstanceState != null) {
- markerList = savedInstanceState.getParcelableArrayList(STATE_MARKER_LIST);
- if (markerList != null) {
- mapboxMap.addMarkers(markerList);
- }
- }
- });
- }
-
- private void addMarker(LatLng point) {
- final PointF pixel = mapboxMap.getProjection().toScreenLocation(point);
-
- String title = LAT_LON_FORMATTER.format(point.getLatitude()) + ", "
- + LAT_LON_FORMATTER.format(point.getLongitude());
- String snippet = "X = " + (int) pixel.x + ", Y = " + (int) pixel.y;
-
- MarkerOptions marker = new MarkerOptions()
- .position(point)
- .title(title)
- .snippet(snippet);
-
- markerList.add(marker);
- mapboxMap.addMarker(marker);
- }
-
- private void resetMap() {
- if (mapboxMap == null) {
- return;
- }
- markerList.clear();
- mapboxMap.removeAnnotations();
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.menu_press_for_marker, menu);
- return true;
- }
-
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
-
- mapView.onSaveInstanceState(outState);
- outState.putParcelableArrayList(STATE_MARKER_LIST, markerList);
- }
-
- @Override
- protected void onStart() {
- super.onStart();
- mapView.onStart();
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- mapView.onResume();
- }
-
- @Override
- protected void onPause() {
- super.onPause();
- mapView.onPause();
- }
-
- @Override
- protected void onStop() {
- super.onStop();
- mapView.onStop();
- }
-
- @Override
- protected void onDestroy() {
- super.onDestroy();
- mapView.onDestroy();
- }
-
- @Override
- public void onLowMemory() {
- super.onLowMemory();
- mapView.onLowMemory();
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.menuItemReset:
- resetMap();
- return true;
- default:
- return super.onOptionsItemSelected(item);
- }
- }
-}
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/PressForMarkerActivity.kt b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/PressForMarkerActivity.kt
new file mode 100644
index 000000000..b9d5bc417
--- /dev/null
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/annotation/PressForMarkerActivity.kt
@@ -0,0 +1,134 @@
+package com.mapbox.mapboxsdk.testapp.activity.annotation
+
+import android.os.Bundle
+import android.view.Menu
+import android.view.MenuItem
+import android.view.View
+import androidx.appcompat.app.AppCompatActivity
+import com.mapbox.mapboxsdk.annotations.MarkerOptions
+import com.mapbox.mapboxsdk.geometry.LatLng
+import com.mapbox.mapboxsdk.maps.MapView
+import com.mapbox.mapboxsdk.maps.MapboxMap
+import com.mapbox.mapboxsdk.maps.Style
+import com.mapbox.mapboxsdk.testapp.R
+import java.text.DecimalFormat
+import java.util.ArrayList
+
+/**
+ * Test activity showcasing to add a Marker on click.
+ *
+ *
+ * Shows how to use a OnMapClickListener and a OnMapLongClickListener
+ *
+ */
+class PressForMarkerActivity : AppCompatActivity() {
+ private lateinit var mapView: MapView
+ private lateinit var mapboxMap: MapboxMap
+ private var markerList: ArrayList? = ArrayList()
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_press_for_marker)
+ mapView = findViewById(R.id.mapView) as MapView
+ mapView.onCreate(savedInstanceState)
+ mapView.getMapAsync { map: MapboxMap? ->
+ if (map != null) {
+ mapboxMap = map
+ }
+ resetMap()
+ mapboxMap.addOnMapLongClickListener { point: LatLng ->
+ addMarker(point)
+ false
+ }
+ mapboxMap.addOnMapClickListener { point: LatLng ->
+ addMarker(point)
+ false
+ }
+ mapboxMap.setStyle(Style.getPredefinedStyle("Streets"))
+ if (savedInstanceState != null) {
+ markerList = savedInstanceState.getParcelableArrayList(STATE_MARKER_LIST)
+ if (markerList != null) {
+ mapboxMap.addMarkers(markerList!!)
+ }
+ }
+ }
+ }
+
+ private fun addMarker(point: LatLng) {
+ val pixel = mapboxMap.projection.toScreenLocation(point)
+ val title = (
+ LAT_LON_FORMATTER.format(point.latitude) + ", " +
+ LAT_LON_FORMATTER.format(point.longitude)
+ )
+ val snippet = "X = " + pixel.x.toInt() + ", Y = " + pixel.y.toInt()
+ val marker = MarkerOptions()
+ .position(point)
+ .title(title)
+ .snippet(snippet)
+ markerList!!.add(marker)
+ mapboxMap.addMarker(marker)
+ }
+
+ private fun resetMap() {
+ if (mapboxMap == null) {
+ return
+ }
+ markerList!!.clear()
+ mapboxMap.removeAnnotations()
+ }
+
+ override fun onCreateOptionsMenu(menu: Menu): Boolean {
+ menuInflater.inflate(R.menu.menu_press_for_marker, menu)
+ return true
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ outState.putParcelableArrayList(STATE_MARKER_LIST, markerList)
+ }
+
+ override fun onStart() {
+ super.onStart()
+ mapView.onStart()
+ }
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ super.onPause()
+ mapView.onPause()
+ }
+
+ override fun onStop() {
+ super.onStop()
+ mapView.onStop()
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ mapView.onDestroy()
+ }
+
+ override fun onLowMemory() {
+ super.onLowMemory()
+ mapView.onLowMemory()
+ }
+
+ override fun onOptionsItemSelected(item: MenuItem): Boolean {
+ return when (item.itemId) {
+ R.id.menuItemReset -> {
+ resetMap()
+ true
+ }
+ else -> super.onOptionsItemSelected(item)
+ }
+ }
+
+ companion object {
+ private val LAT_LON_FORMATTER = DecimalFormat("#.#####")
+ private const val STATE_MARKER_LIST = "markerList"
+ }
+}
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/espresso/DeviceIndependentTestActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/espresso/DeviceIndependentTestActivity.java
deleted file mode 100644
index 56692185f..000000000
--- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/espresso/DeviceIndependentTestActivity.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package com.mapbox.mapboxsdk.testapp.activity.espresso;
-
-import android.os.Bundle;
-
-import androidx.annotation.NonNull;
-import androidx.appcompat.app.AppCompatActivity;
-
-import com.mapbox.mapboxsdk.maps.MapView;
-import com.mapbox.mapboxsdk.maps.MapboxMap;
-import com.mapbox.mapboxsdk.maps.OnMapReadyCallback;
-import com.mapbox.mapboxsdk.maps.Style;
-import com.mapbox.mapboxsdk.testapp.R;
-
-public class DeviceIndependentTestActivity extends AppCompatActivity implements OnMapReadyCallback {
-
- public MapView mapView;
- protected MapboxMap mapboxMap;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_camera_test);
-
- // Initialize map as normal
- mapView = findViewById(R.id.mapView);
- mapView.onCreate(savedInstanceState);
- mapView.getMapAsync(this);
- }
-
- @Override
- public void onMapReady(@NonNull MapboxMap map) {
- mapboxMap = map;
- mapboxMap.setStyle(Style.getPredefinedStyle("Streets"));
- }
-
- public MapboxMap getMapboxMap() {
- return mapboxMap;
- }
-
- @Override
- public void onResume() {
- super.onResume();
- mapView.onResume();
- }
-
- @Override
- protected void onStart() {
- super.onStart();
- mapView.onStart();
- }
-
- @Override
- public void onPause() {
- super.onPause();
- mapView.onPause();
- }
-
- @Override
- protected void onStop() {
- super.onStop();
- mapView.onStop();
- }
-
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- mapView.onSaveInstanceState(outState);
- }
-
- @Override
- protected void onDestroy() {
- super.onDestroy();
- mapView.onDestroy();
- }
-
- @Override
- public void onLowMemory() {
- super.onLowMemory();
- mapView.onLowMemory();
- }
-}
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/espresso/DeviceIndependentTestActivity.kt b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/espresso/DeviceIndependentTestActivity.kt
new file mode 100644
index 000000000..f230efe36
--- /dev/null
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/espresso/DeviceIndependentTestActivity.kt
@@ -0,0 +1,65 @@
+package com.mapbox.mapboxsdk.testapp.activity.espresso
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import com.mapbox.mapboxsdk.maps.MapView
+import com.mapbox.mapboxsdk.maps.MapboxMap
+import com.mapbox.mapboxsdk.maps.OnMapReadyCallback
+import com.mapbox.mapboxsdk.maps.Style
+import com.mapbox.mapboxsdk.testapp.R
+
+class DeviceIndependentTestActivity : AppCompatActivity(), OnMapReadyCallback {
+ lateinit var mapView: MapView
+ lateinit var mapboxMap: MapboxMap
+ protected set
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_camera_test)
+
+ // Initialize map as normal
+ mapView = findViewById(R.id.mapView)
+ mapView.onCreate(savedInstanceState)
+ mapView.getMapAsync(this)
+ }
+
+ override fun onMapReady(map: MapboxMap) {
+ mapboxMap = map
+ mapboxMap.setStyle(Style.getPredefinedStyle("Streets"))
+ }
+
+ public override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onStart() {
+ super.onStart()
+ mapView.onStart()
+ }
+
+ public override fun onPause() {
+ super.onPause()
+ mapView.onPause()
+ }
+
+ override fun onStop() {
+ super.onStop()
+ mapView.onStop()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ mapView.onDestroy()
+ }
+
+ override fun onLowMemory() {
+ super.onLowMemory()
+ mapView.onLowMemory()
+ }
+}
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/espresso/EspressoTestActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/espresso/EspressoTestActivity.java
deleted file mode 100644
index 832355751..000000000
--- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/espresso/EspressoTestActivity.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package com.mapbox.mapboxsdk.testapp.activity.espresso;
-
-import android.os.Bundle;
-
-import androidx.appcompat.app.AppCompatActivity;
-
-import com.mapbox.mapboxsdk.maps.MapView;
-import com.mapbox.mapboxsdk.maps.MapboxMap;
-import com.mapbox.mapboxsdk.testapp.R;
-
-/**
- * Base activity for instrumentation testing.
- */
-public class EspressoTestActivity extends AppCompatActivity {
-
- public MapView mapView;
- protected MapboxMap mapboxMap;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_espresso_test);
- mapView = findViewById(R.id.mapView);
- mapView.onCreate(savedInstanceState);
- }
-
- @Override
- public void onResume() {
- super.onResume();
- mapView.onResume();
- }
-
- @Override
- protected void onStart() {
- super.onStart();
- mapView.onStart();
- }
-
- @Override
- public void onPause() {
- super.onPause();
- mapView.onPause();
- }
-
- @Override
- protected void onStop() {
- super.onStop();
- mapView.onStop();
- }
-
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- mapView.onSaveInstanceState(outState);
- }
-
- @Override
- protected void onDestroy() {
- super.onDestroy();
- mapView.onDestroy();
- }
-
- @Override
- public void onLowMemory() {
- super.onLowMemory();
- mapView.onLowMemory();
- }
-}
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/espresso/EspressoTestActivity.kt b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/espresso/EspressoTestActivity.kt
new file mode 100644
index 000000000..067e3caa4
--- /dev/null
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/espresso/EspressoTestActivity.kt
@@ -0,0 +1,56 @@
+package com.mapbox.mapboxsdk.testapp.activity.espresso
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import com.mapbox.mapboxsdk.maps.MapView
+import com.mapbox.mapboxsdk.maps.MapboxMap
+import com.mapbox.mapboxsdk.testapp.R
+
+/**
+ * Base activity for instrumentation testing.
+ */
+class EspressoTestActivity : AppCompatActivity() {
+ lateinit var mapView: MapView
+ protected lateinit var mapboxMap: MapboxMap
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_espresso_test)
+ mapView = findViewById(R.id.mapView)
+ mapView.onCreate(savedInstanceState)
+ }
+
+ public override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onStart() {
+ super.onStart()
+ mapView.onStart()
+ }
+
+ public override fun onPause() {
+ super.onPause()
+ mapView.onPause()
+ }
+
+ override fun onStop() {
+ super.onStop()
+ mapView.onStop()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ mapView.onDestroy()
+ }
+
+ override fun onLowMemory() {
+ super.onLowMemory()
+ mapView.onLowMemory()
+ }
+}
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/ImageInLabelActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/ImageInLabelActivity.java
deleted file mode 100644
index 0935f3304..000000000
--- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/ImageInLabelActivity.java
+++ /dev/null
@@ -1,131 +0,0 @@
-package com.mapbox.mapboxsdk.testapp.activity.style;
-
-import android.graphics.Bitmap;
-import android.graphics.Color;
-import android.os.Bundle;
-
-import androidx.annotation.NonNull;
-import androidx.appcompat.app.AppCompatActivity;
-
-import com.mapbox.geojson.Feature;
-import com.mapbox.geojson.FeatureCollection;
-import com.mapbox.geojson.Point;
-import com.mapbox.mapboxsdk.maps.MapView;
-import com.mapbox.mapboxsdk.maps.MapboxMap;
-import com.mapbox.mapboxsdk.maps.OnMapReadyCallback;
-import com.mapbox.mapboxsdk.maps.Style;
-import com.mapbox.mapboxsdk.style.expressions.Expression;
-import com.mapbox.mapboxsdk.style.layers.SymbolLayer;
-import com.mapbox.mapboxsdk.style.sources.GeoJsonSource;
-import com.mapbox.mapboxsdk.testapp.R;
-import com.mapbox.mapboxsdk.utils.BitmapUtils;
-
-import static com.mapbox.mapboxsdk.style.expressions.Expression.FormatOption.formatFontScale;
-import static com.mapbox.mapboxsdk.style.expressions.Expression.FormatOption.formatTextColor;
-import static com.mapbox.mapboxsdk.style.expressions.Expression.FormatOption.formatTextFont;
-import static com.mapbox.mapboxsdk.style.expressions.Expression.formatEntry;
-import static com.mapbox.mapboxsdk.style.expressions.Expression.image;
-import static com.mapbox.mapboxsdk.style.expressions.Expression.literal;
-import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.textAllowOverlap;
-import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.textField;
-
-/**
- * Test image in label.
- */
-public class ImageInLabelActivity extends AppCompatActivity implements OnMapReadyCallback {
- private static final String ORIGINAL_SOURCE = "ORIGINAL_SOURCE";
- private static final String ORIGINAL_LAYER = "ORIGINAL_LAYER";
- private MapView mapView;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_stretchable_image);
- mapView = findViewById(R.id.mapView);
- mapView.onCreate(savedInstanceState);
- mapView.getMapAsync(this);
- }
-
- @Override
- public void onMapReady(@NonNull MapboxMap mapboxMap) {
- mapboxMap.setStyle(Style.getPredefinedStyle("Streets"), style -> {
- Bitmap us = BitmapUtils.getBitmapFromDrawable(getResources().getDrawable(R.drawable.ic_us));
- Bitmap android = BitmapUtils.getBitmapFromDrawable(getResources().getDrawable(R.drawable.ic_android));
-
- style.addImage("us", us);
- style.addImage("android", android);
-
- Point point = Point.fromLngLat(-10, 0);
- Feature feature = Feature.fromGeometry(point);
- FeatureCollection originalCollection = FeatureCollection.fromFeature(feature);
- GeoJsonSource originalSource = new GeoJsonSource(ORIGINAL_SOURCE, originalCollection);
- SymbolLayer originalLayer = new SymbolLayer(ORIGINAL_LAYER, ORIGINAL_SOURCE)
- .withProperties(
- textAllowOverlap(true),
- textField(Expression
- .format(
- formatEntry(literal("Android: "),
- formatFontScale(1.0),
- formatTextColor(Color.BLUE),
- formatTextFont(new String[] {"Ubuntu Medium", "Arial Unicode MS Regular"})),
- formatEntry(image(literal("android"))),
- formatEntry(literal("Us: "),
- formatFontScale(1.5),
- formatTextColor(Color.YELLOW)),
- formatEntry(image(literal("us"))),
- formatEntry(literal("suffix"),
- formatFontScale(2.0),
- formatTextColor(Color.CYAN))
- )
- )
-
- );
-
- style.addSource(originalSource);
- style.addLayer(originalLayer);
- });
- }
-
- @Override
- protected void onStart() {
- super.onStart();
- mapView.onStart();
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- mapView.onResume();
- }
-
- @Override
- protected void onPause() {
- super.onPause();
- mapView.onPause();
- }
-
- @Override
- protected void onStop() {
- super.onStop();
- mapView.onStop();
- }
-
- @Override
- public void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- mapView.onSaveInstanceState(outState);
- }
-
- @Override
- public void onLowMemory() {
- super.onLowMemory();
- mapView.onLowMemory();
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- mapView.onDestroy();
- }
-
-}
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/ImageInLabelActivity.kt b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/ImageInLabelActivity.kt
new file mode 100644
index 000000000..8236cc472
--- /dev/null
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/ImageInLabelActivity.kt
@@ -0,0 +1,123 @@
+package com.mapbox.mapboxsdk.testapp.activity.style
+
+import android.graphics.Color
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import com.mapbox.geojson.Feature
+import com.mapbox.geojson.FeatureCollection
+import com.mapbox.geojson.Point
+import com.mapbox.mapboxsdk.maps.MapView
+import com.mapbox.mapboxsdk.maps.MapboxMap
+import com.mapbox.mapboxsdk.maps.OnMapReadyCallback
+import com.mapbox.mapboxsdk.maps.Style
+import com.mapbox.mapboxsdk.style.expressions.Expression
+import com.mapbox.mapboxsdk.style.expressions.Expression.FormatOption
+import com.mapbox.mapboxsdk.style.layers.PropertyFactory
+import com.mapbox.mapboxsdk.style.layers.SymbolLayer
+import com.mapbox.mapboxsdk.style.sources.GeoJsonSource
+import com.mapbox.mapboxsdk.testapp.R
+import com.mapbox.mapboxsdk.utils.BitmapUtils
+
+/**
+ * Test image in label.
+ */
+class ImageInLabelActivity : AppCompatActivity(), OnMapReadyCallback {
+ private lateinit var mapView: MapView
+ public override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_stretchable_image)
+ mapView = findViewById(R.id.mapView)
+ mapView.onCreate(savedInstanceState)
+ mapView.getMapAsync(this)
+ }
+
+ override fun onMapReady(mapboxMap: MapboxMap) {
+ mapboxMap.setStyle(Style.getPredefinedStyle("Streets")) { style: Style ->
+ val us = BitmapUtils.getBitmapFromDrawable(
+ resources.getDrawable(R.drawable.ic_us)
+ )
+ val android =
+ BitmapUtils.getBitmapFromDrawable(resources.getDrawable(R.drawable.ic_android))
+ style.addImage("us", us!!)
+ style.addImage("android", android!!)
+ val point = Point.fromLngLat(-10.0, 0.0)
+ val feature = Feature.fromGeometry(point)
+ val originalCollection = FeatureCollection.fromFeature(feature)
+ val originalSource = GeoJsonSource(ORIGINAL_SOURCE, originalCollection)
+ val originalLayer = SymbolLayer(ORIGINAL_LAYER, ORIGINAL_SOURCE)
+ .withProperties(
+ PropertyFactory.textAllowOverlap(true),
+ PropertyFactory.textField(
+ Expression
+ .format(
+ Expression.formatEntry(
+ Expression.literal("Android: "),
+ FormatOption.formatFontScale(1.0),
+ FormatOption.formatTextColor(Color.BLUE),
+ FormatOption.formatTextFont(
+ arrayOf(
+ "Ubuntu Medium",
+ "Arial Unicode MS Regular"
+ )
+ )
+ ),
+ Expression.formatEntry(Expression.image(Expression.literal("android"))),
+ Expression.formatEntry(
+ Expression.literal("Us: "),
+ FormatOption.formatFontScale(1.5),
+ FormatOption.formatTextColor(Color.YELLOW)
+ ),
+ Expression.formatEntry(Expression.image(Expression.literal("us"))),
+ Expression.formatEntry(
+ Expression.literal("suffix"),
+ FormatOption.formatFontScale(2.0),
+ FormatOption.formatTextColor(Color.CYAN)
+ )
+ )
+ )
+ )
+ style.addSource(originalSource)
+ style.addLayer(originalLayer)
+ }
+ }
+
+ override fun onStart() {
+ super.onStart()
+ mapView.onStart()
+ }
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ super.onPause()
+ mapView.onPause()
+ }
+
+ override fun onStop() {
+ super.onStop()
+ mapView.onStop()
+ }
+
+ public override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onLowMemory() {
+ super.onLowMemory()
+ mapView.onLowMemory()
+ }
+
+ public override fun onDestroy() {
+ super.onDestroy()
+ mapView.onDestroy()
+ }
+
+ companion object {
+ private const val ORIGINAL_SOURCE = "ORIGINAL_SOURCE"
+ private const val ORIGINAL_LAYER = "ORIGINAL_LAYER"
+ }
+}
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/SymbolGeneratorActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/SymbolGeneratorActivity.java
deleted file mode 100644
index eba6ae48d..000000000
--- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/SymbolGeneratorActivity.java
+++ /dev/null
@@ -1,369 +0,0 @@
-package com.mapbox.mapboxsdk.testapp.activity.style;
-
-import static com.mapbox.mapboxsdk.style.expressions.Expression.concat;
-import static com.mapbox.mapboxsdk.style.expressions.Expression.division;
-import static com.mapbox.mapboxsdk.style.expressions.Expression.downcase;
-import static com.mapbox.mapboxsdk.style.expressions.Expression.eq;
-import static com.mapbox.mapboxsdk.style.expressions.Expression.get;
-import static com.mapbox.mapboxsdk.style.expressions.Expression.literal;
-import static com.mapbox.mapboxsdk.style.expressions.Expression.match;
-import static com.mapbox.mapboxsdk.style.expressions.Expression.number;
-import static com.mapbox.mapboxsdk.style.expressions.Expression.pi;
-import static com.mapbox.mapboxsdk.style.expressions.Expression.product;
-import static com.mapbox.mapboxsdk.style.expressions.Expression.rgba;
-import static com.mapbox.mapboxsdk.style.expressions.Expression.step;
-import static com.mapbox.mapboxsdk.style.expressions.Expression.stop;
-import static com.mapbox.mapboxsdk.style.expressions.Expression.string;
-import static com.mapbox.mapboxsdk.style.expressions.Expression.upcase;
-import static com.mapbox.mapboxsdk.style.expressions.Expression.zoom;
-import static com.mapbox.mapboxsdk.style.layers.Property.ICON_ANCHOR_BOTTOM;
-import static com.mapbox.mapboxsdk.style.layers.Property.TEXT_ANCHOR_TOP;
-import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.iconAllowOverlap;
-import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.iconAnchor;
-import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.iconImage;
-import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.iconOffset;
-import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.iconOpacity;
-import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.iconSize;
-import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.textAnchor;
-import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.textColor;
-import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.textField;
-import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.textSize;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.PointF;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import androidx.annotation.NonNull;
-import androidx.appcompat.app.AppCompatActivity;
-
-import com.mapbox.geojson.Feature;
-import com.mapbox.geojson.FeatureCollection;
-import com.mapbox.mapboxsdk.maps.MapView;
-import com.mapbox.mapboxsdk.maps.MapboxMap;
-import com.mapbox.mapboxsdk.maps.OnMapReadyCallback;
-import com.mapbox.mapboxsdk.maps.Style;
-import com.mapbox.mapboxsdk.style.expressions.Expression;
-import com.mapbox.mapboxsdk.style.layers.SymbolLayer;
-import com.mapbox.mapboxsdk.style.sources.GeoJsonSource;
-import com.mapbox.mapboxsdk.style.sources.Source;
-import com.mapbox.mapboxsdk.testapp.R;
-import com.mapbox.mapboxsdk.testapp.utils.ResourceUtils;
-
-import java.lang.ref.WeakReference;
-import java.util.HashMap;
-import java.util.List;
-
-import timber.log.Timber;
-
-/**
- * Test activity showcasing using a symbol generator that generates Bitmaps from Android SDK Views.
- */
-public class SymbolGeneratorActivity extends AppCompatActivity implements OnMapReadyCallback {
-
- private static final String SOURCE_ID = "com.mapbox.mapboxsdk.style.layers.symbol.source.id";
- private static final String LAYER_ID = "com.mapbox.mapboxsdk.style.layers.symbol.layer.id";
- private static final String FEATURE_ID = "brk_name";
- private static final String FEATURE_RANK = "scalerank";
- private static final String FEATURE_NAME = "name_sort";
- private static final String FEATURE_TYPE = "type";
- private static final String FEATURE_REGION = "continent";
-
- private MapView mapView;
- private MapboxMap mapboxMap;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_symbol_generator);
-
- mapView = (MapView) findViewById(R.id.mapView);
- mapView.onCreate(savedInstanceState);
- mapView.getMapAsync(this);
- }
-
- @Override
- public void onMapReady(@NonNull final MapboxMap map) {
- mapboxMap = map;
- map.setStyle(Style.getPredefinedStyle("Outdoor"), style -> {
- addSymbolClickListener();
- new LoadDataTask(SymbolGeneratorActivity.this).execute();
- });
- }
-
- private void addSymbolClickListener() {
- mapboxMap.addOnMapClickListener(point -> {
- PointF screenPoint = mapboxMap.getProjection().toScreenLocation(point);
- List features = mapboxMap.queryRenderedFeatures(screenPoint, LAYER_ID);
- if (!features.isEmpty()) {
- Feature feature = features.get(0);
- // validate symbol flicker regression for #13407
- SymbolLayer layer = mapboxMap.getStyle().getLayerAs(LAYER_ID);
- layer.setProperties(iconOpacity(match(
- get(FEATURE_ID), literal(1.0f),
- stop(feature.getStringProperty(FEATURE_ID), 0.3f)
- )));
- Timber.v("Feature was clicked with data: %s", feature.toJson());
- Toast.makeText(
- SymbolGeneratorActivity.this,
- "hello from: " + feature.getStringProperty(FEATURE_NAME),
- Toast.LENGTH_LONG).show();
- }
-
- return false;
- });
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.menu_generator_symbol, menu);
- return super.onCreateOptionsMenu(menu);
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- if (item.getItemId() == R.id.menu_action_icon_overlap) {
- SymbolLayer layer = mapboxMap.getStyle().getLayerAs(LAYER_ID);
- layer.setProperties(iconAllowOverlap(!layer.getIconAllowOverlap().getValue()));
- return true;
- } else if (item.getItemId() == R.id.menu_action_filter) {
- SymbolLayer layer = mapboxMap.getStyle().getLayerAs(LAYER_ID);
- layer.setFilter(eq(get(FEATURE_RANK), literal(1)));
- Timber.e("Filter that was set: %s", layer.getFilter());
- return true;
- }
- return super.onOptionsItemSelected(item);
- }
-
- @Override
- protected void onStart() {
- super.onStart();
- mapView.onStart();
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- mapView.onResume();
- }
-
- @Override
- protected void onPause() {
- super.onPause();
- mapView.onPause();
- }
-
- @Override
- protected void onStop() {
- super.onStop();
- mapView.onStop();
- }
-
- @Override
- public void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- mapView.onSaveInstanceState(outState);
- }
-
- @Override
- public void onLowMemory() {
- super.onLowMemory();
- mapView.onLowMemory();
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- mapView.onDestroy();
- }
-
- /**
- * Utility class to generate Bitmaps for Symbol.
- *
- * Bitmaps can be added to the map with {@link com.mapbox.mapboxsdk.maps.MapboxMap#addImage(String, Bitmap)}
- *
- */
- private static class SymbolGenerator {
-
- /**
- * Generate a Bitmap from an Android SDK View.
- *
- * @param view the View to be drawn to a Bitmap
- * @return the generated bitmap
- */
- public static Bitmap generate(@NonNull View view) {
- int measureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
- view.measure(measureSpec, measureSpec);
-
- int measuredWidth = view.getMeasuredWidth();
- int measuredHeight = view.getMeasuredHeight();
-
- view.layout(0, 0, measuredWidth, measuredHeight);
- Bitmap bitmap = Bitmap.createBitmap(measuredWidth, measuredHeight, Bitmap.Config.ARGB_8888);
- bitmap.eraseColor(Color.TRANSPARENT);
- Canvas canvas = new Canvas(bitmap);
- view.draw(canvas);
- return bitmap;
- }
- }
-
- private static class LoadDataTask extends AsyncTask {
-
- private WeakReference activity;
-
- LoadDataTask(SymbolGeneratorActivity activity) {
- this.activity = new WeakReference<>(activity);
- }
-
- @Override
- protected FeatureCollection doInBackground(Void... params) {
- Context context = activity.get();
- if (context != null) {
- // read local geojson from raw folder
- String tinyCountriesJson = ResourceUtils.readRawResource(context, R.raw.tiny_countries);
- return FeatureCollection.fromJson(tinyCountriesJson);
-
- }
- return null;
- }
-
- @Override
- protected void onPostExecute(FeatureCollection featureCollection) {
- super.onPostExecute(featureCollection);
- SymbolGeneratorActivity activity = this.activity.get();
- if (featureCollection == null || activity == null) {
- return;
- }
-
- activity.onDataLoaded(featureCollection);
- }
- }
-
- public void onDataLoaded(@NonNull FeatureCollection featureCollection) {
- if (mapView.isDestroyed()) {
- return;
- }
-
- // create expressions
- Expression iconImageExpression = string(get(literal(FEATURE_ID)));
- Expression iconSizeExpression = division(number(get(literal(FEATURE_RANK))), literal(2.0f));
- Expression textSizeExpression = product(get(literal(FEATURE_RANK)), pi());
- Expression textFieldExpression = concat(upcase(literal("a ")), upcase(string(get(literal(FEATURE_TYPE)))),
- downcase(literal(" IN ")), string(get(literal(FEATURE_REGION)))
- );
- Expression textColorExpression = match(get(literal(FEATURE_RANK)),
- literal(1), rgba(255, 0, 0, 1.0f),
- literal(2), rgba(0, 0, 255.0f, 1.0f),
- rgba(0.0f, 255.0f, 0.0f, 1.0f)
- );
-
- rgba(
- division(literal(255), get(FEATURE_RANK)),
- literal(0.0f),
- literal(0.0f),
- literal(1.0f)
- );
-
- // create symbol layer
- SymbolLayer symbolLayer = new SymbolLayer(LAYER_ID, SOURCE_ID)
- .withProperties(
- // icon configuration
- iconImage(iconImageExpression),
- iconAllowOverlap(false),
- iconSize(iconSizeExpression),
- iconAnchor(ICON_ANCHOR_BOTTOM),
- iconOffset(step(zoom(), literal(new float[] {0f, 0f}),
- stop(1, new Float[] {0f, 0f}),
- stop(10, new Float[] {0f, -35f})
- )),
-
- // text field configuration
- textField(textFieldExpression),
- textSize(textSizeExpression),
- textAnchor(TEXT_ANCHOR_TOP),
- textColor(textColorExpression)
- );
-
- // add a geojson source to the map
- Source source = new GeoJsonSource(SOURCE_ID, featureCollection);
- mapboxMap.getStyle().addSource(source);
-
- // add symbol layer
- mapboxMap.getStyle().addLayer(symbolLayer);
-
- // get expressions
- Expression iconImageExpressionResult = symbolLayer.getIconImage().getExpression();
- Expression iconSizeExpressionResult = symbolLayer.getIconSize().getExpression();
- Expression textSizeExpressionResult = symbolLayer.getTextSize().getExpression();
- Expression textFieldExpressionResult = symbolLayer.getTextField().getExpression();
- Expression textColorExpressionResult = symbolLayer.getTextColor().getExpression();
-
- // log expressions
- Timber.e(iconImageExpressionResult.toString());
- Timber.e(iconSizeExpressionResult.toString());
- Timber.e(textSizeExpressionResult.toString());
- Timber.e(textFieldExpressionResult.toString());
- Timber.e(textColorExpressionResult.toString());
-
- // reset expressions
- symbolLayer.setProperties(
- iconImage(iconImageExpressionResult),
- iconSize(iconSizeExpressionResult),
- textSize(textSizeExpressionResult),
- textField(textFieldExpressionResult),
- textColor(textColorExpressionResult)
- );
-
- new GenerateSymbolTask(mapboxMap, this).execute(featureCollection);
- }
-
- private static class GenerateSymbolTask extends AsyncTask> {
-
- private MapboxMap mapboxMap;
- private WeakReference context;
-
- GenerateSymbolTask(MapboxMap mapboxMap, Context context) {
- this.mapboxMap = mapboxMap;
- this.context = new WeakReference<>(context);
- }
-
- @SuppressWarnings("WrongThread")
- @Override
- protected HashMap doInBackground(FeatureCollection... params) {
- HashMap imagesMap = new HashMap<>();
- Context context = this.context.get();
- List features = params[0].features();
- if (context != null && features != null) {
- for (Feature feature : features) {
- String countryName = feature.getStringProperty(FEATURE_ID);
- TextView textView = new TextView(context);
- textView.setBackgroundColor(context.getResources().getColor(R.color.blueAccent));
- textView.setPadding(10, 5, 10, 5);
- textView.setTextColor(Color.WHITE);
- textView.setText(countryName);
- imagesMap.put(countryName, SymbolGenerator.generate(textView));
- }
- }
- return imagesMap;
- }
-
- @Override
- protected void onPostExecute(HashMap bitmapHashMap) {
- super.onPostExecute(bitmapHashMap);
- mapboxMap.getStyle(new Style.OnStyleLoaded() {
- @Override
- public void onStyleLoaded(@NonNull Style style) {
- style.addImagesAsync(bitmapHashMap);
- }
- });
- }
- }
-}
\ No newline at end of file
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/SymbolGeneratorActivity.kt b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/SymbolGeneratorActivity.kt
new file mode 100644
index 000000000..f989f338e
--- /dev/null
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/SymbolGeneratorActivity.kt
@@ -0,0 +1,346 @@
+package com.mapbox.mapboxsdk.testapp.activity.style
+
+import android.content.Context
+import android.graphics.Bitmap
+import android.graphics.Canvas
+import android.graphics.Color
+import android.os.AsyncTask
+import android.os.Bundle
+import android.view.Menu
+import android.view.MenuItem
+import android.view.View
+import android.widget.TextView
+import android.widget.Toast
+import androidx.appcompat.app.AppCompatActivity
+import com.mapbox.geojson.FeatureCollection
+import com.mapbox.mapboxsdk.geometry.LatLng
+import com.mapbox.mapboxsdk.maps.MapView
+import com.mapbox.mapboxsdk.maps.MapboxMap
+import com.mapbox.mapboxsdk.maps.OnMapReadyCallback
+import com.mapbox.mapboxsdk.maps.Style
+import com.mapbox.mapboxsdk.style.expressions.Expression
+import com.mapbox.mapboxsdk.style.layers.Property
+import com.mapbox.mapboxsdk.style.layers.PropertyFactory
+import com.mapbox.mapboxsdk.style.layers.SymbolLayer
+import com.mapbox.mapboxsdk.style.sources.GeoJsonSource
+import com.mapbox.mapboxsdk.style.sources.Source
+import com.mapbox.mapboxsdk.testapp.R
+import com.mapbox.mapboxsdk.testapp.utils.ResourceUtils.readRawResource
+import timber.log.Timber
+import java.lang.ref.WeakReference
+
+/**
+ * Test activity showcasing using a symbol generator that generates Bitmaps from Android SDK Views.
+ */
+class SymbolGeneratorActivity : AppCompatActivity(), OnMapReadyCallback {
+ private lateinit var mapView: MapView
+ private lateinit var mapboxMap: MapboxMap
+ public override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_symbol_generator)
+ mapView = findViewById(R.id.mapView) as MapView
+ mapView.onCreate(savedInstanceState)
+ mapView.getMapAsync(this)
+ }
+
+ override fun onMapReady(map: MapboxMap) {
+ mapboxMap = map
+ map.setStyle(Style.getPredefinedStyle("Outdoor")) { style: Style? ->
+ addSymbolClickListener()
+ LoadDataTask(this@SymbolGeneratorActivity).execute()
+ }
+ }
+
+ private fun addSymbolClickListener() {
+ mapboxMap.addOnMapClickListener { point: LatLng? ->
+ val screenPoint = mapboxMap.projection.toScreenLocation(
+ point!!
+ )
+ val features = mapboxMap.queryRenderedFeatures(screenPoint, LAYER_ID)
+ if (!features.isEmpty()) {
+ val feature = features[0]
+ // validate symbol flicker regression for #13407
+ val layer = mapboxMap.style!!.getLayerAs(LAYER_ID)
+ layer!!.setProperties(
+ PropertyFactory.iconOpacity(
+ Expression.match(
+ Expression.get(FEATURE_ID),
+ Expression.literal(1.0f),
+ Expression.stop(feature.getStringProperty(FEATURE_ID), 0.3f)
+ )
+ )
+ )
+ Timber.v("Feature was clicked with data: %s", feature.toJson())
+ Toast.makeText(
+ this@SymbolGeneratorActivity,
+ "hello from: " + feature.getStringProperty(FEATURE_NAME),
+ Toast.LENGTH_LONG
+ ).show()
+ }
+ false
+ }
+ }
+
+ override fun onCreateOptionsMenu(menu: Menu): Boolean {
+ menuInflater.inflate(R.menu.menu_generator_symbol, menu)
+ return super.onCreateOptionsMenu(menu)
+ }
+
+ override fun onOptionsItemSelected(item: MenuItem): Boolean {
+ if (item.itemId == R.id.menu_action_icon_overlap) {
+ val layer = mapboxMap.style!!.getLayerAs(LAYER_ID)
+ layer!!.setProperties(PropertyFactory.iconAllowOverlap(!layer.iconAllowOverlap.getValue()!!))
+ return true
+ } else if (item.itemId == R.id.menu_action_filter) {
+ val layer = mapboxMap.style!!.getLayerAs(LAYER_ID)
+ layer!!.setFilter(Expression.eq(Expression.get(FEATURE_RANK), Expression.literal(1)))
+ Timber.e("Filter that was set: %s", layer.filter)
+ return true
+ }
+ return super.onOptionsItemSelected(item)
+ }
+
+ override fun onStart() {
+ super.onStart()
+ mapView.onStart()
+ }
+
+ override fun onResume() {
+ super.onResume()
+ mapView.onResume()
+ }
+
+ override fun onPause() {
+ super.onPause()
+ mapView.onPause()
+ }
+
+ override fun onStop() {
+ super.onStop()
+ mapView.onStop()
+ }
+
+ public override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView.onSaveInstanceState(outState)
+ }
+
+ override fun onLowMemory() {
+ super.onLowMemory()
+ mapView.onLowMemory()
+ }
+
+ public override fun onDestroy() {
+ super.onDestroy()
+ mapView.onDestroy()
+ }
+
+ /**
+ * Utility class to generate Bitmaps for Symbol.
+ *
+ *
+ * Bitmaps can be added to the map with [com.mapbox.mapboxsdk.maps.MapboxMap.addImage]
+ *
+ */
+ private object SymbolGenerator {
+ /**
+ * Generate a Bitmap from an Android SDK View.
+ *
+ * @param view the View to be drawn to a Bitmap
+ * @return the generated bitmap
+ */
+ fun generate(view: View): Bitmap {
+ val measureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
+ view.measure(measureSpec, measureSpec)
+ val measuredWidth = view.measuredWidth
+ val measuredHeight = view.measuredHeight
+ view.layout(0, 0, measuredWidth, measuredHeight)
+ val bitmap = Bitmap.createBitmap(measuredWidth, measuredHeight, Bitmap.Config.ARGB_8888)
+ bitmap.eraseColor(Color.TRANSPARENT)
+ val canvas = Canvas(bitmap)
+ view.draw(canvas)
+ return bitmap
+ }
+ }
+
+ private class LoadDataTask internal constructor(activity: SymbolGeneratorActivity) :
+ AsyncTask() {
+ private val activity: WeakReference
+
+ init {
+ this.activity = WeakReference(activity)
+ }
+
+ override fun doInBackground(vararg p0: Void?): FeatureCollection? {
+ val context: Context? = activity.get()
+ if (context != null) {
+ // read local geojson from raw folder
+ val tinyCountriesJson = readRawResource(context, R.raw.tiny_countries)
+ return FeatureCollection.fromJson(tinyCountriesJson)
+ }
+ return null
+ }
+
+ override fun onPostExecute(featureCollection: FeatureCollection?) {
+ super.onPostExecute(featureCollection)
+ val activity = activity.get()
+ if (featureCollection == null || activity == null) {
+ return
+ }
+ activity.onDataLoaded(featureCollection)
+ }
+ }
+
+ fun onDataLoaded(featureCollection: FeatureCollection) {
+ if (mapView.isDestroyed) {
+ return
+ }
+
+ // create expressions
+ val iconImageExpression = Expression.string(Expression.get(Expression.literal(FEATURE_ID)))
+ val iconSizeExpression = Expression.division(
+ Expression.number(
+ Expression.get(
+ Expression.literal(
+ FEATURE_RANK
+ )
+ )
+ ),
+ Expression.literal(2.0f)
+ )
+ val textSizeExpression = Expression.product(
+ Expression.get(
+ Expression.literal(
+ FEATURE_RANK
+ )
+ ),
+ Expression.pi()
+ )
+ val textFieldExpression = Expression.concat(
+ Expression.upcase(Expression.literal("a ")),
+ Expression.upcase(
+ Expression.string(
+ Expression.get(Expression.literal(FEATURE_TYPE))
+ )
+ ),
+ Expression.downcase(Expression.literal(" IN ")),
+ Expression.string(
+ Expression.get(
+ Expression.literal(
+ FEATURE_REGION
+ )
+ )
+ )
+ )
+ val textColorExpression = Expression.match(
+ Expression.get(Expression.literal(FEATURE_RANK)),
+ Expression.literal(1),
+ Expression.rgba(255, 0, 0, 1.0f),
+ Expression.literal(2),
+ Expression.rgba(0, 0, 255.0f, 1.0f),
+ Expression.rgba(0.0f, 255.0f, 0.0f, 1.0f)
+ )
+ Expression.rgba(
+ Expression.division(Expression.literal(255), Expression.get(FEATURE_RANK)),
+ Expression.literal(0.0f),
+ Expression.literal(0.0f),
+ Expression.literal(1.0f)
+ )
+
+ // create symbol layer
+ val symbolLayer = SymbolLayer(LAYER_ID, SOURCE_ID)
+ .withProperties( // icon configuration
+ PropertyFactory.iconImage(iconImageExpression),
+ PropertyFactory.iconAllowOverlap(false),
+ PropertyFactory.iconSize(iconSizeExpression),
+ PropertyFactory.iconAnchor(Property.ICON_ANCHOR_BOTTOM),
+ PropertyFactory.iconOffset(
+ Expression.step(
+ Expression.zoom(),
+ Expression.literal(floatArrayOf(0f, 0f)),
+ Expression.stop(1, arrayOf(0f, 0f)),
+ Expression.stop(10, arrayOf(0f, -35f))
+ )
+ ), // text field configuration
+ PropertyFactory.textField(textFieldExpression),
+ PropertyFactory.textSize(textSizeExpression),
+ PropertyFactory.textAnchor(Property.TEXT_ANCHOR_TOP),
+ PropertyFactory.textColor(textColorExpression)
+ )
+
+ // add a geojson source to the map
+ val source: Source = GeoJsonSource(SOURCE_ID, featureCollection)
+ mapboxMap.style!!.addSource(source)
+
+ // add symbol layer
+ mapboxMap.style!!.addLayer(symbolLayer)
+
+ // get expressions
+ val iconImageExpressionResult = symbolLayer.iconImage.expression
+ val iconSizeExpressionResult = symbolLayer.iconSize.expression
+ val textSizeExpressionResult = symbolLayer.textSize.expression
+ val textFieldExpressionResult = symbolLayer.textField.expression
+ val textColorExpressionResult = symbolLayer.textColor.expression
+
+ // log expressions
+ Timber.e(iconImageExpressionResult.toString())
+ Timber.e(iconSizeExpressionResult.toString())
+ Timber.e(textSizeExpressionResult.toString())
+ Timber.e(textFieldExpressionResult.toString())
+ Timber.e(textColorExpressionResult.toString())
+
+ // reset expressions
+ symbolLayer.setProperties(
+ PropertyFactory.iconImage(iconImageExpressionResult),
+ PropertyFactory.iconSize(iconSizeExpressionResult),
+ PropertyFactory.textSize(textSizeExpressionResult),
+ PropertyFactory.textField(textFieldExpressionResult),
+ PropertyFactory.textColor(textColorExpressionResult)
+ )
+ GenerateSymbolTask(mapboxMap, this).execute(featureCollection)
+ }
+
+ private class GenerateSymbolTask internal constructor(
+ private val mapboxMap: MapboxMap?,
+ context: Context
+ ) : AsyncTask>() {
+ private val context: WeakReference
+
+ init {
+ this.context = WeakReference(context)
+ }
+
+ override fun doInBackground(vararg p0: FeatureCollection?): HashMap? {
+ val imagesMap = HashMap()
+ val context = context.get()
+ val features = p0[0]?.features()
+ if (context != null && features != null) {
+ for (feature in features) {
+ val countryName = feature.getStringProperty(FEATURE_ID)
+ val textView = TextView(context)
+ textView.setBackgroundColor(context.resources.getColor(R.color.blueAccent))
+ textView.setPadding(10, 5, 10, 5)
+ textView.setTextColor(Color.WHITE)
+ textView.text = countryName
+ imagesMap[countryName] = SymbolGenerator.generate(textView)
+ }
+ }
+ return imagesMap
+ }
+
+ override fun onPostExecute(bitmapHashMap: HashMap) {
+ super.onPostExecute(bitmapHashMap)
+ mapboxMap?.getStyle { style -> style.addImagesAsync(bitmapHashMap) }
+ }
+ }
+
+ companion object {
+ private const val SOURCE_ID = "com.mapbox.mapboxsdk.style.layers.symbol.source.id"
+ private const val LAYER_ID = "com.mapbox.mapboxsdk.style.layers.symbol.layer.id"
+ private const val FEATURE_ID = "brk_name"
+ private const val FEATURE_RANK = "scalerank"
+ private const val FEATURE_NAME = "name_sort"
+ private const val FEATURE_TYPE = "type"
+ private const val FEATURE_REGION = "continent"
+ }
+}
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/telemetry/PerformanceMeasurementActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/telemetry/PerformanceMeasurementActivity.java
deleted file mode 100644
index bfa735883..000000000
--- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/telemetry/PerformanceMeasurementActivity.java
+++ /dev/null
@@ -1,189 +0,0 @@
-package com.mapbox.mapboxsdk.testapp.activity.telemetry;
-
-import android.app.ActivityManager;
-import android.content.Context;
-import android.os.Build;
-import android.os.Bundle;
-import android.util.DisplayMetrics;
-import android.view.Display;
-import android.view.WindowManager;
-
-import androidx.annotation.NonNull;
-import androidx.appcompat.app.AppCompatActivity;
-
-import com.google.gson.Gson;
-import com.google.gson.JsonObject;
-import com.mapbox.mapboxsdk.Mapbox;
-import com.mapbox.mapboxsdk.maps.MapView;
-import com.mapbox.mapboxsdk.maps.Style;
-import com.mapbox.mapboxsdk.module.http.HttpRequestUtil;
-import com.mapbox.mapboxsdk.testapp.R;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-import okhttp3.Call;
-import okhttp3.OkHttpClient;
-import timber.log.Timber;
-
-/**
- * Test activity showcasing gathering performance measurement data.
- */
-public class PerformanceMeasurementActivity extends AppCompatActivity {
-
- private MapView mapView;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_map_simple);
- mapView = findViewById(R.id.mapView);
- mapView.onCreate(savedInstanceState);
-
- EventListener eventListener = new EventListener();
- OkHttpClient okHttpClient = new OkHttpClient.Builder()
- .eventListener(eventListener)
- .build();
- HttpRequestUtil.setOkHttpClient(okHttpClient);
-
- mapView.getMapAsync(mapboxMap -> mapboxMap.setStyle(
- new Style.Builder().fromUri(Style.getPredefinedStyle("Streets"))));
- }
-
-
- @Override
- protected void onStart() {
- super.onStart();
- mapView.onStart();
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- mapView.onResume();
- }
-
- @Override
- protected void onPause() {
- super.onPause();
- mapView.onPause();
- }
-
- @Override
- protected void onStop() {
- super.onStop();
- mapView.onStop();
- }
-
- @Override
- public void onLowMemory() {
- super.onLowMemory();
- mapView.onLowMemory();
- }
-
- @Override
- protected void onDestroy() {
- HttpRequestUtil.setOkHttpClient(null);
- super.onDestroy();
- mapView.onDestroy();
- }
-
- @Override
- protected void onSaveInstanceState(@NonNull Bundle outState) {
- super.onSaveInstanceState(outState);
- mapView.onSaveInstanceState(outState);
- }
-
- private static void triggerPerformanceEvent(String style, long elapsed) {
- List> attributes = new ArrayList<>();
- attributes.add(
- new Attribute<>("style_id", style));
- attributes.add(
- new Attribute<>("test_perf_event", "true"));
-
- List> counters = new ArrayList<>();
- counters.add(new Attribute<>("elapsed", elapsed));
-
-
- JsonObject metaData = new JsonObject();
- metaData.addProperty("os", "android");
- metaData.addProperty("manufacturer", Build.MANUFACTURER);
- metaData.addProperty("brand", Build.BRAND);
- metaData.addProperty("device", Build.MODEL);
- metaData.addProperty("version", Build.VERSION.RELEASE);
- metaData.addProperty("abi", Build.CPU_ABI);
- metaData.addProperty("country", Locale.getDefault().getISO3Country());
- metaData.addProperty("ram", getRam());
- metaData.addProperty("screenSize", getWindowSize());
-
- Gson gson = new Gson();
-
- Bundle bundle = new Bundle();
- bundle.putString("attributes", gson.toJson(attributes));
- bundle.putString("counters", gson.toJson(counters));
- bundle.putString("metadata", metaData.toString());
- }
-
- private static String getRam() {
- ActivityManager actManager =
- (ActivityManager) Mapbox.getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
- ActivityManager.MemoryInfo memInfo = new ActivityManager.MemoryInfo();
- actManager.getMemoryInfo(memInfo);
- return String.valueOf(memInfo.totalMem);
- }
-
- private static String getWindowSize() {
- WindowManager windowManager =
- (WindowManager) Mapbox.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
- Display display = windowManager.getDefaultDisplay();
- DisplayMetrics metrics = new DisplayMetrics();
- display.getMetrics(metrics);
- int width = metrics.widthPixels;
- int height = metrics.heightPixels;
-
- return "{" + width + "," + height + "}";
- }
-
- private static class EventListener extends okhttp3.EventListener {
-
- private final Map startTimes = new HashMap<>();
-
- @Override
- public void callStart(Call call) {
- String url = call.request().url().toString();
- startTimes.put(url, System.nanoTime());
- super.callStart(call);
- Timber.e("callStart: %s", url);
- }
-
- @Override
- public void callEnd(Call call) {
- String url = call.request().url().toString();
- Timber.e("callEnd: %s", url);
- Long start = startTimes.get(url);
- if (start != null) {
- long elapsed = System.nanoTime() - start;
- triggerPerformanceEvent(url.substring(0, url.indexOf('?')), elapsed);
- startTimes.remove(start);
- Timber.e("callEnd: %s took %d", url, elapsed);
- }
- super.callEnd(call);
- }
- }
-
- private static class Attribute {
-
- private String name;
-
- private T value;
-
- Attribute(String name, T value) {
- this.name = name;
- this.value = value;
- }
- }
-
-}
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/telemetry/PerformanceMeasurementActivity.kt b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/telemetry/PerformanceMeasurementActivity.kt
new file mode 100644
index 000000000..baa9a61d9
--- /dev/null
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/telemetry/PerformanceMeasurementActivity.kt
@@ -0,0 +1,156 @@
+package com.mapbox.mapboxsdk.testapp.activity.telemetry
+
+import android.app.ActivityManager
+import android.os.Build
+import android.os.Bundle
+import android.util.DisplayMetrics
+import android.view.WindowManager
+import androidx.appcompat.app.AppCompatActivity
+import com.google.gson.Gson
+import com.google.gson.JsonObject
+import com.mapbox.mapboxsdk.Mapbox
+import com.mapbox.mapboxsdk.maps.MapView
+import com.mapbox.mapboxsdk.maps.MapboxMap
+import com.mapbox.mapboxsdk.maps.OnMapReadyCallback
+import com.mapbox.mapboxsdk.maps.Style
+import com.mapbox.mapboxsdk.module.http.HttpRequestUtil
+import com.mapbox.mapboxsdk.testapp.R
+import okhttp3.Call
+import okhttp3.OkHttpClient
+import okhttp3.OkHttpClient.Builder
+import timber.log.Timber
+import java.util.*
+
+/**
+ * Test activity showcasing gathering performance measurement data.
+ */
+class PerformanceMeasurementActivity : AppCompatActivity() {
+ private lateinit var mapView: MapView
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_map_simple)
+ mapView = findViewById(R.id.mapView)
+ mapView.onCreate(savedInstanceState)
+ val eventListener = EventListener()
+ val okHttpClient: OkHttpClient = Builder()
+ .eventListener(eventListener)
+ .build()
+ HttpRequestUtil.setOkHttpClient(okHttpClient)
+ mapView.getMapAsync(
+ OnMapReadyCallback { mapboxMap: MapboxMap ->
+ mapboxMap.setStyle(
+ Style.Builder().fromUri(Style.getPredefinedStyle("Streets"))
+ )
+ }
+ )
+ }
+
+ override fun onStart() {
+ super.onStart()
+ mapView!!.onStart()
+ }
+
+ override fun onResume() {
+ super.onResume()
+ mapView!!.onResume()
+ }
+
+ override fun onPause() {
+ super.onPause()
+ mapView!!.onPause()
+ }
+
+ override fun onStop() {
+ super.onStop()
+ mapView!!.onStop()
+ }
+
+ override fun onLowMemory() {
+ super.onLowMemory()
+ mapView!!.onLowMemory()
+ }
+
+ override fun onDestroy() {
+ HttpRequestUtil.setOkHttpClient(null)
+ super.onDestroy()
+ mapView!!.onDestroy()
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ mapView!!.onSaveInstanceState(outState)
+ }
+
+ private class EventListener : okhttp3.EventListener() {
+ private val startTimes: MutableMap = HashMap()
+ override fun callStart(call: Call) {
+ val url = call.request().url.toString()
+ startTimes[url] = System.nanoTime()
+ super.callStart(call)
+ Timber.e("callStart: %s", url)
+ }
+
+ override fun callEnd(call: Call) {
+ val url = call.request().url.toString()
+ Timber.e("callEnd: %s", url)
+ val start = startTimes[url]
+ if (start != null) {
+ val elapsed = System.nanoTime() - start
+ triggerPerformanceEvent(url.substring(0, url.indexOf('?')), elapsed)
+ startTimes.remove(url)
+ Timber.e("callEnd: %s took %d", url, elapsed)
+ }
+ super.callEnd(call)
+ }
+ }
+
+ private class Attribute internal constructor(private val name: String, private val value: T)
+ companion object {
+ private fun triggerPerformanceEvent(style: String, elapsed: Long) {
+ val attributes: MutableList> = ArrayList()
+ attributes.add(
+ Attribute("style_id", style)
+ )
+ attributes.add(
+ Attribute("test_perf_event", "true")
+ )
+ val counters: MutableList> = ArrayList()
+ counters.add(Attribute("elapsed", elapsed))
+ val metaData = JsonObject()
+ metaData.addProperty("os", "android")
+ metaData.addProperty("manufacturer", Build.MANUFACTURER)
+ metaData.addProperty("brand", Build.BRAND)
+ metaData.addProperty("device", Build.MODEL)
+ metaData.addProperty("version", Build.VERSION.RELEASE)
+ metaData.addProperty("abi", Build.CPU_ABI)
+ metaData.addProperty("country", Locale.getDefault().isO3Country)
+ metaData.addProperty("ram", ram)
+ metaData.addProperty("screenSize", windowSize)
+ val gson = Gson()
+ val bundle = Bundle()
+ bundle.putString("attributes", gson.toJson(attributes))
+ bundle.putString("counters", gson.toJson(counters))
+ bundle.putString("metadata", metaData.toString())
+ }
+
+ private val ram: String
+ private get() {
+ val actManager = Mapbox.getApplicationContext()
+ .getSystemService(ACTIVITY_SERVICE) as ActivityManager
+ val memInfo = ActivityManager.MemoryInfo()
+ actManager.getMemoryInfo(memInfo)
+ return memInfo.totalMem.toString()
+ }
+ private val windowSize: String
+ private get() {
+ val windowManager =
+ Mapbox.getApplicationContext().getSystemService(WINDOW_SERVICE) as WindowManager
+ val display = windowManager.defaultDisplay
+ val metrics = DisplayMetrics()
+ display.getMetrics(metrics)
+ val width = metrics.widthPixels
+ val height = metrics.heightPixels
+ return "{$width,$height}"
+ }
+ }
+}