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

Commit

Permalink
[android] Migrate Android SDK to GL JS–powered feedback form (#15623)
Browse files Browse the repository at this point in the history
* [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.
  • Loading branch information
pengdev authored Sep 23, 2019
1 parent 66c1d84 commit 29dd824
Show file tree
Hide file tree
Showing 2 changed files with 148 additions and 13 deletions.
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));
}


}

0 comments on commit 29dd824

Please sign in to comment.