Skip to content
This repository has been archived by the owner on Aug 8, 2023. It is now read-only.

[android] Migrate Android SDK to GL JS–powered feedback form #15623

Merged
merged 6 commits into from
Sep 23, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@
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.
Expand All @@ -36,9 +38,10 @@
* </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;
Expand Down Expand Up @@ -90,7 +93,7 @@ public void onClick(DialogInterface dialog, int which) {
if (isLatestEntry(which)) {
showTelemetryDialog();
} else {
showMapFeedbackWebPage(which);
showMapAttributionWebPage(which);
}
}

Expand Down Expand Up @@ -138,21 +141,54 @@ public void onClick(@NonNull DialogInterface dialog, int which) {
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) {
Expand Down Expand Up @@ -189,10 +225,10 @@ private Set<Attribution> build() {

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);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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));
}


}