From 29dd824e3b09adc1f1318f23bee0053a26dd4927 Mon Sep 17 00:00:00 2001 From: Peng Liu Date: Mon, 23 Sep 2019 14:54:57 +0300 Subject: =?UTF-8?q?[android]=20Migrate=20Android=20SDK=20to=20GL=20JS?= =?UTF-8?q?=E2=80=93powered=20feedback=20form=20(#15623)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [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. --- .../mapboxsdk/maps/AttributionDialogManager.java | 62 +++++++++++--- .../maps/AttributionDialogManagerTest.java | 99 ++++++++++++++++++++++ 2 files changed, 148 insertions(+), 13 deletions(-) create mode 100644 platform/android/MapboxGLAndroidSDK/src/test/java/com/mapbox/mapboxsdk/maps/AttributionDialogManagerTest.java 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; *

*/ 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)); + } + + +} -- cgit v1.2.1