summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeng Liu <peng.liu@mapbox.com>2019-09-23 14:54:57 +0300
committerGitHub <noreply@github.com>2019-09-23 14:54:57 +0300
commit29dd824e3b09adc1f1318f23bee0053a26dd4927 (patch)
tree83739943b70394ab83335d1988af02829ede7bae
parent66c1d8489027ee2f9d7a3981ad970a3941a0f223 (diff)
downloadqtlocation-mapboxgl-29dd824e3b09adc1f1318f23bee0053a26dd4927.tar.gz
[android] Migrate Android SDK to GL JS–powered feedback form (#15623)
* [android] Add debug info. * [android] Generate feedback url. * [android] Add unit test for buildMapFeedbackMapUrl. * [android] Remove debug logging. * [android] Add github issue link to the TODO. * [android] Change getPackageName to application context.
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/AttributionDialogManager.java62
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/maps/AttributionDialogManagerTest.java99
2 files changed, 148 insertions, 13 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/AttributionDialogManager.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/AttributionDialogManager.java
index 4f523948da..5384a29fca 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/AttributionDialogManager.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/AttributionDialogManager.java
@@ -26,6 +26,8 @@ import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
/**
* Responsible for managing attribution interactions on the map.
@@ -36,9 +38,10 @@ import java.util.Set;
* </p>
*/
public class AttributionDialogManager implements View.OnClickListener, DialogInterface.OnClickListener {
-
private static final String MAP_FEEDBACK_URL = "https://apps.mapbox.com/feedback";
- private static final String MAP_FEEDBACK_LOCATION_FORMAT = MAP_FEEDBACK_URL + "/#/%f/%f/%d";
+ private static final String MAP_FEEDBACK_URL_OLD = "https://www.mapbox.com/map-feedback";
+ private static final String MAP_FEEDBACK_URL_LOCATION_FRAGMENT_FORMAT = "/%f/%f/%f/%f/%d";
+ private static final String MAP_FEEDBACK_STYLE_URI_REGEX = "^(.*://[^:^/]*)/(.*)/(.*)";
@NonNull
private final Context context;
@@ -90,7 +93,7 @@ public class AttributionDialogManager implements View.OnClickListener, DialogInt
if (isLatestEntry(which)) {
showTelemetryDialog();
} else {
- showMapFeedbackWebPage(which);
+ showMapAttributionWebPage(which);
}
}
@@ -138,21 +141,54 @@ public class AttributionDialogManager implements View.OnClickListener, DialogInt
builder.show();
}
- private void showMapFeedbackWebPage(int which) {
+ private void showMapAttributionWebPage(int which) {
Attribution[] attributions = attributionSet.toArray(new Attribution[attributionSet.size()]);
String url = attributions[which].getUrl();
- if (url.contains(MAP_FEEDBACK_URL)) {
- url = buildMapFeedbackMapUrl(mapboxMap.getCameraPosition());
+ if (url.contains(MAP_FEEDBACK_URL_OLD) || url.contains(MAP_FEEDBACK_URL)) {
+ url = buildMapFeedbackMapUrl(Mapbox.getAccessToken());
}
showWebPage(url);
}
@NonNull
- private String buildMapFeedbackMapUrl(@Nullable CameraPosition cameraPosition) {
- // appends current location to the map feedback url if available
- return cameraPosition != null ? String.format(Locale.getDefault(),
- MAP_FEEDBACK_LOCATION_FORMAT, cameraPosition.target.getLongitude(), cameraPosition.target.getLatitude(),
- (int) cameraPosition.zoom) : MAP_FEEDBACK_URL;
+ String buildMapFeedbackMapUrl(@Nullable String accessToken) {
+ // TODO Add Android Maps SDK version to the query parameter, currently the version API is not available.
+ // TODO Keep track of this issue at [#15632](https://github.com/mapbox/mapbox-gl-native/issues/15632)
+
+ Uri.Builder builder = Uri.parse(MAP_FEEDBACK_URL).buildUpon();
+
+ CameraPosition cameraPosition = mapboxMap.getCameraPosition();
+ if (cameraPosition != null) {
+ builder.encodedFragment(String.format(Locale.getDefault(), MAP_FEEDBACK_URL_LOCATION_FRAGMENT_FORMAT,
+ cameraPosition.target.getLongitude(), cameraPosition.target.getLatitude(),
+ cameraPosition.zoom, cameraPosition.bearing, (int) cameraPosition.tilt));
+ }
+
+ String packageName = context.getApplicationContext().getPackageName();
+ if (packageName != null) {
+ builder.appendQueryParameter("referrer", packageName);
+ }
+
+ if (accessToken != null) {
+ builder.appendQueryParameter("access_token", accessToken);
+ }
+
+ Style style = mapboxMap.getStyle();
+ if (style != null) {
+ String styleUri = style.getUri();
+ Pattern pattern = Pattern.compile(MAP_FEEDBACK_STYLE_URI_REGEX);
+ Matcher matcher = pattern.matcher(styleUri);
+
+ if (matcher.find()) {
+ String styleOwner = matcher.group(2);
+ String styleId = matcher.group(3);
+
+ builder.appendQueryParameter("owner", styleOwner)
+ .appendQueryParameter("id", styleId);
+ }
+ }
+
+ return builder.build().toString();
}
private void showWebPage(@NonNull String url) {
@@ -189,10 +225,10 @@ public class AttributionDialogManager implements View.OnClickListener, DialogInt
Style style = mapboxMap.getStyle();
if (style != null) {
- for (Source source : mapboxMap.getStyle().getSources()) {
+ for (Source source : style.getSources()) {
attribution = source.getAttribution();
if (!attribution.isEmpty()) {
- attributions.add(source.getAttribution());
+ attributions.add(attribution);
}
}
}
diff --git a/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/maps/AttributionDialogManagerTest.java b/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/maps/AttributionDialogManagerTest.java
new file mode 100644
index 0000000000..9b4eeb27aa
--- /dev/null
+++ b/platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/maps/AttributionDialogManagerTest.java
@@ -0,0 +1,99 @@
+package com.mapbox.mapboxsdk.maps;
+
+import android.content.Context;
+
+import com.mapbox.mapboxsdk.camera.CameraPosition;
+import com.mapbox.mapboxsdk.geometry.LatLng;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.robolectric.RobolectricTestRunner;
+
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+@RunWith(RobolectricTestRunner.class)
+public class AttributionDialogManagerTest {
+ @InjectMocks
+ Context context = mock(Context.class);
+
+ @InjectMocks
+ MapboxMap mapboxMap = mock(MapboxMap.class);
+
+ @InjectMocks
+ Style style = mock(Style.class);
+
+ private AttributionDialogManager attributionDialogManager;
+ private CameraPosition cameraPosition;
+
+ private static final String ASSERT_MAPBOX_TOKEN = "TestAccessToken";
+
+ private static final String ASSERT_MAPBOX_STYLE_URI = "mapbox://styles/mapbox/streets-v11";
+ private static final String ASSERT_MAPBOX_LOCAL_STYLE_URI = "asset://style.json";
+
+ private static final String ASSERT_MAPBOX_PACKAGE_NAME = "com.mapbox.attributionmanagertest";
+
+ private static final String ASSERT_MAPBOX_FEEDBACK_FINAL_URL =
+ "https://apps.mapbox.com/feedback?referrer=com.mapbox.attributionmanagertest&"
+ + "access_token=TestAccessToken&owner=mapbox&id=streets-v11"
+ + "#/22.200001/11.100000/12.000000/24.000000/5";
+ private static final String ASSERT_MAPBOX_FEEDHACK_FINAL_URL_LOCAL_STYLE =
+ "https://apps.mapbox.com/feedback?referrer=com.mapbox.attributionmanagertest&"
+ + "access_token=TestAccessToken#/22.200001/11.100000/12.000000/24.000000/5";
+ private static final String ASSERT_MAPBOX_FEEDBACL_FINAL_URL_NULL_CAMERA_POSITION =
+ "https://apps.mapbox.com/feedback?referrer=com.mapbox.attributionmanagertest&access_token=TestAccessToken";
+
+ @Before
+ public void beforeTest() {
+ attributionDialogManager = new AttributionDialogManager(context, mapboxMap);
+ cameraPosition = new CameraPosition.Builder(CameraPosition.DEFAULT)
+ .tilt(5.0f).zoom(12).bearing(24.0f).target(new LatLng(11.1f, 22.2f)).build();
+ }
+
+ @Test
+ public void testSanity() {
+ assertNotNull("AttributionDialogManager should not be null", attributionDialogManager);
+ }
+
+ @Test
+ public void testBuildMapFeedbackMapUrl() {
+ when(context.getApplicationContext()).thenReturn(context);
+ when(context.getPackageName()).thenReturn(ASSERT_MAPBOX_PACKAGE_NAME);
+ when(style.getUri()).thenReturn(ASSERT_MAPBOX_STYLE_URI);
+ when(mapboxMap.getCameraPosition()).thenReturn(cameraPosition);
+ when(mapboxMap.getStyle()).thenReturn(style);
+
+ Assert.assertEquals(ASSERT_MAPBOX_FEEDBACK_FINAL_URL,
+ attributionDialogManager.buildMapFeedbackMapUrl(ASSERT_MAPBOX_TOKEN));
+ }
+
+ @Test
+ public void testBuildMapFeedbackMapUrlWithLocalStyleJson() {
+ when(context.getApplicationContext()).thenReturn(context);
+ when(context.getPackageName()).thenReturn(ASSERT_MAPBOX_PACKAGE_NAME);
+ when(style.getUri()).thenReturn(ASSERT_MAPBOX_LOCAL_STYLE_URI);
+ when(mapboxMap.getCameraPosition()).thenReturn(cameraPosition);
+ when(mapboxMap.getStyle()).thenReturn(style);
+
+ Assert.assertEquals(ASSERT_MAPBOX_FEEDHACK_FINAL_URL_LOCAL_STYLE,
+ attributionDialogManager.buildMapFeedbackMapUrl(ASSERT_MAPBOX_TOKEN));
+ }
+
+ @Test
+ public void testBuildMapFeedbackMapUrlWithNullCameraPosition() {
+ when(context.getApplicationContext()).thenReturn(context);
+ when(context.getPackageName()).thenReturn(ASSERT_MAPBOX_PACKAGE_NAME);
+ when(style.getUri()).thenReturn(ASSERT_MAPBOX_LOCAL_STYLE_URI);
+ when(mapboxMap.getCameraPosition()).thenReturn(null);
+ when(mapboxMap.getStyle()).thenReturn(style);
+
+ Assert.assertEquals(ASSERT_MAPBOX_FEEDBACL_FINAL_URL_NULL_CAMERA_POSITION,
+ attributionDialogManager.buildMapFeedbackMapUrl(ASSERT_MAPBOX_TOKEN));
+ }
+
+
+}