diff --git a/config/checkstyle/checkstyle-suppressions.xml b/config/checkstyle/checkstyle-suppressions.xml
index 66a36e08..e5beb7e2 100644
--- a/config/checkstyle/checkstyle-suppressions.xml
+++ b/config/checkstyle/checkstyle-suppressions.xml
@@ -15,4 +15,6 @@
+
+
diff --git a/core/build.gradle b/core/build.gradle
index ee42e4b1..dc9bab8c 100644
--- a/core/build.gradle
+++ b/core/build.gradle
@@ -21,7 +21,7 @@ group = GROUP
version = VERSION_NAME
project.archivesBaseName = POM_ARTIFACT_ID
-ext.tangram_version = "0.4.9-SNAPSHOT"
+ext.tangram_version = "0.4.9"
release {
tagTemplate = 'mapzen-core${version}'
diff --git a/core/gradle.properties b/core/gradle.properties
index 5f2c3020..239158b2 100644
--- a/core/gradle.properties
+++ b/core/gradle.properties
@@ -1,22 +1,6 @@
-version=0.0.1-SNAPSHOT
-
POM_ARTIFACT_ID=mapzen-core
POM_NAME=Mapzen Android Core
POM_PACKAGING=aar
GROUP=com.mapzen
-VERSION_NAME=0.0.1-SNAPSHOT
-
POM_DESCRIPTION=Core classes used by the Mapzen Android SDK and Mapzen Places API.
-
-POM_URL=https://github.com/mapzen/android
-POM_SCM_URL=http://github.com/mapzen/android
-POM_SCM_CONNECTION=scm:git:git://github.com/mapzen/android.git
-POM_SCM_DEV_CONNECTION=scm:git:git@github.com:mapzen/android.git
-
-POM_LICENCE_NAME=The Apache Software License, Version 2.0
-POM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt
-POM_LICENCE_DIST=repo
-
-POM_DEVELOPER_ID=Mapzen
-POM_DEVELOPER_NAME=Mapzen
diff --git a/core/src/main/java/com/mapzen/android/core/ApiKeyConstants.java b/core/src/main/java/com/mapzen/android/core/ApiKeyConstants.java
deleted file mode 100644
index cd56dec0..00000000
--- a/core/src/main/java/com/mapzen/android/core/ApiKeyConstants.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.mapzen.android.core;
-
-/**
- * Api key constants.
- */
-public class ApiKeyConstants {
- public static final String API_KEY_RES_NAME = "mapzen_api_key";
- public static final String API_KEY_RES_TYPE = "string";
- public static final String API_KEY = "api_key";
-}
diff --git a/core/src/main/java/com/mapzen/android/core/MapzenManager.java b/core/src/main/java/com/mapzen/android/core/MapzenManager.java
new file mode 100644
index 00000000..4923a631
--- /dev/null
+++ b/core/src/main/java/com/mapzen/android/core/MapzenManager.java
@@ -0,0 +1,70 @@
+package com.mapzen.android.core;
+
+import android.content.Context;
+import android.content.res.Resources;
+
+/**
+ * {@code MapzenManager} assists with Mapzen API key management. When created it reads the API key
+ * set in string resources if one has been declared by the application.
+ *
+ *
+ * <resources>
+ * <string name="mapzen_api_key">[YOUR_MAPZEN_API_KEY]</string>
+ * </resources>
+ *
+ *
+ * If an API key is set in code via {@link #setApiKey(String)} it will override the declared as a
+ * string resource.
+ *
+ * Finally, if an API key is explicitly passed into a specific component when created it will
+ * supersede any key stored by this class.
+ *
+ *
+ * MapzenSearch mapzenSearch = new MapzenSearch(context, "mapzen-XXXXXXX")
+ *
+ */
+public class MapzenManager {
+ public static final String API_KEY_RES_NAME = "mapzen_api_key";
+ public static final String API_KEY_RES_TYPE = "string";
+ public static final String API_KEY_PARAM_NAME = "api_key";
+
+ static MapzenManager instance;
+
+ /**
+ * Get singleton instance.
+ */
+ public static MapzenManager instance(Context context) {
+ if (instance == null) {
+ instance = new MapzenManager(context);
+ }
+
+ return instance;
+ }
+
+ private String apiKey;
+
+ /**
+ * Creates a new instance of the manager.
+ */
+ private MapzenManager(Context context) {
+ final Resources resources = context.getResources();
+ int id = resources.getIdentifier(API_KEY_RES_NAME, API_KEY_RES_TYPE, context.getPackageName());
+ if (id > 0) {
+ apiKey = resources.getString(id);
+ }
+ }
+
+ /**
+ * Returns the currently active API key stored by this class.
+ */
+ public String getApiKey() {
+ return apiKey;
+ }
+
+ /**
+ * Sets a new API key value. This will override any previous key including those declared in xml.
+ */
+ public void setApiKey(String apiKey) {
+ this.apiKey = apiKey;
+ }
+}
diff --git a/core/src/main/java/com/mapzen/android/graphics/MapInitializer.java b/core/src/main/java/com/mapzen/android/graphics/MapInitializer.java
index 4b462703..662b7219 100644
--- a/core/src/main/java/com/mapzen/android/graphics/MapInitializer.java
+++ b/core/src/main/java/com/mapzen/android/graphics/MapInitializer.java
@@ -1,6 +1,6 @@
package com.mapzen.android.graphics;
-import com.mapzen.android.core.ApiKeyConstants;
+import com.mapzen.android.core.MapzenManager;
import com.mapzen.android.graphics.model.BubbleWrapStyle;
import com.mapzen.android.graphics.model.MapStyle;
import com.mapzen.tangram.MapController;
@@ -85,9 +85,7 @@ private void loadMap(final MapView mapView, MapStyle mapStyle, boolean styleExpl
private void loadMap(final MapView mapView, String sceneFile, final OnMapReadyCallback callback,
String apiKey) {
if (apiKey == null) {
- final int resId = context.getResources().getIdentifier(ApiKeyConstants.API_KEY_RES_NAME,
- ApiKeyConstants.API_KEY_RES_TYPE, context.getPackageName());
- apiKey = context.getString(resId);
+ apiKey = MapzenManager.instance(context).getApiKey();
}
final ArrayList sceneUpdates = new ArrayList<>(1);
diff --git a/core/src/main/java/com/mapzen/android/search/SearchInitializer.java b/core/src/main/java/com/mapzen/android/search/SearchInitializer.java
index dfcf4211..b0e99df5 100644
--- a/core/src/main/java/com/mapzen/android/search/SearchInitializer.java
+++ b/core/src/main/java/com/mapzen/android/search/SearchInitializer.java
@@ -1,19 +1,13 @@
package com.mapzen.android.search;
-
-import com.mapzen.android.core.ApiKeyConstants;
+import com.mapzen.android.core.MapzenManager;
import android.content.Context;
-import android.content.res.Resources;
-import android.util.Log;
/**
* Handles setting the api key and a request handler for given {@link MapzenSearch} objects.
*/
public class SearchInitializer {
-
- private static final String TAG = SearchInitializer.class.getSimpleName();
-
private SearchRequestHandler requestHandler = new SearchRequestHandler();
/**
@@ -23,16 +17,7 @@ public class SearchInitializer {
* @param context
*/
public void initSearch(MapzenSearch search, Context context) {
- Resources res = context.getResources();
- final String packageName = context.getPackageName();
- try {
- final int apiKeyId = res.getIdentifier(ApiKeyConstants.API_KEY_RES_NAME,
- ApiKeyConstants.API_KEY_RES_TYPE, packageName);
- final String apiKey = res.getString(apiKeyId);
- initSearch(search, apiKey);
- } catch (Resources.NotFoundException e) {
- Log.e(TAG, e.getLocalizedMessage());
- }
+ initSearch(search, MapzenManager.instance(context).getApiKey());
}
/**
diff --git a/core/src/main/java/com/mapzen/android/search/SearchRequestHandler.java b/core/src/main/java/com/mapzen/android/search/SearchRequestHandler.java
index 70602a8c..e31018c2 100644
--- a/core/src/main/java/com/mapzen/android/search/SearchRequestHandler.java
+++ b/core/src/main/java/com/mapzen/android/search/SearchRequestHandler.java
@@ -1,6 +1,6 @@
package com.mapzen.android.search;
-import com.mapzen.android.core.ApiKeyConstants;
+import com.mapzen.android.core.MapzenManager;
import com.mapzen.pelias.PeliasRequestHandler;
import java.util.HashMap;
@@ -34,7 +34,7 @@ public String getApiKey() {
@Override public Map queryParamsForRequest() {
HashMap params = new HashMap<>();
- params.put(ApiKeyConstants.API_KEY, apiKey);
+ params.put(MapzenManager.API_KEY_PARAM_NAME, apiKey);
return params;
}
}
diff --git a/core/src/test/java/com/mapzen/android/core/MapzenManagerTest.java b/core/src/test/java/com/mapzen/android/core/MapzenManagerTest.java
new file mode 100644
index 00000000..27399a5e
--- /dev/null
+++ b/core/src/test/java/com/mapzen/android/core/MapzenManagerTest.java
@@ -0,0 +1,109 @@
+package com.mapzen.android.core;
+
+import com.mapzen.BuildConfig;
+import com.mapzen.android.core.test.R;
+
+import org.junit.After;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.support.annotation.NonNull;
+
+import static com.mapzen.android.core.MapzenManager.API_KEY_RES_NAME;
+import static com.mapzen.android.core.MapzenManager.API_KEY_RES_TYPE;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest(BuildConfig.class)
+public class MapzenManagerTest {
+ @After public void tearDown() throws Exception {
+ MapzenManager.instance = null;
+ }
+
+ @Test public void shouldNotBeNull() throws Exception {
+ Context context = mock(Context.class);
+ Resources resources = new TestResources();
+ when(context.getResources()).thenReturn(resources);
+ MapzenManager mapzenManager = MapzenManager.instance(context);
+ assertThat(mapzenManager).isNotNull();
+ }
+
+ @Test public void getApiKey_shouldReturnNullIfNotSet() throws Exception {
+ Context context = mock(Context.class);
+ Resources resources = new TestResources();
+ when(context.getResources()).thenReturn(resources);
+ MapzenManager mapzenManager = MapzenManager.instance(context);
+ assertThat(mapzenManager.getApiKey()).isNull();
+ }
+
+ @Test public void getApiKey_shouldReturnNullIfResourceNotFound() throws Exception {
+ Context context = mock(Context.class);
+ Resources resources = new TestResourcesNotFound();
+ when(context.getResources()).thenReturn(resources);
+ MapzenManager mapzenManager = MapzenManager.instance(context);
+ assertThat(mapzenManager.getApiKey()).isNull();
+ }
+
+ @Test public void getApiKey_shouldReturnStringResourceValue() throws Exception {
+ Context context = mock(Context.class);
+ TestResources resources = new TestResources();
+ resources.testApiKey = "mapzen-fake-api-key";
+ when(context.getResources()).thenReturn(resources);
+ MapzenManager mapzenManager = MapzenManager.instance(context);
+ assertThat(mapzenManager.getApiKey()).isEqualTo("mapzen-fake-api-key");
+ }
+
+ @Test public void setApiKey_shouldOverrideStringResourcesValue() throws Exception {
+ Context context = mock(Context.class);
+ TestResources resources = new TestResources();
+ resources.testApiKey = "mapzen-fake-api-key";
+ when(context.getResources()).thenReturn(resources);
+ MapzenManager mapzenManager = MapzenManager.instance(context);
+ mapzenManager.setApiKey("mapzen-fake-api-key-2");
+ assertThat(mapzenManager.getApiKey()).isEqualTo("mapzen-fake-api-key-2");
+ }
+
+ private class TestResources extends Resources {
+ private String testApiKey;
+
+ TestResources() {
+ super(null, null, null);
+ }
+
+ @Override public int getIdentifier(String name, String defType, String defPackage) {
+ if (API_KEY_RES_NAME.equals(name) && API_KEY_RES_TYPE.equals(defType)) {
+ return R.id.mapzen_api_key;
+ }
+
+ return 0;
+ }
+
+ @NonNull @Override public String getString(int id) throws NotFoundException {
+ if (id == R.id.mapzen_api_key) {
+ return testApiKey;
+ }
+
+ throw new NotFoundException();
+ }
+ }
+
+ private class TestResourcesNotFound extends Resources {
+ TestResourcesNotFound() {
+ super(null, null, null);
+ }
+
+ @Override public int getIdentifier(String name, String defType, String defPackage) {
+ return 0;
+ }
+
+ @NonNull @Override public String getString(int id) throws NotFoundException {
+ throw new NotFoundException();
+ }
+ }
+}
diff --git a/core/src/test/java/com/mapzen/android/core/test/R.java b/core/src/test/java/com/mapzen/android/core/test/R.java
new file mode 100644
index 00000000..92f91890
--- /dev/null
+++ b/core/src/test/java/com/mapzen/android/core/test/R.java
@@ -0,0 +1,7 @@
+package com.mapzen.android.core.test;
+
+public final class R {
+ public static final class id {
+ public static final int mapzen_api_key = 0x00000001;
+ }
+}
diff --git a/core/src/test/java/com/mapzen/android/search/MapzenSearchTest.java b/core/src/test/java/com/mapzen/android/search/MapzenSearchTest.java
index f81eed86..e69d44cd 100644
--- a/core/src/test/java/com/mapzen/android/search/MapzenSearchTest.java
+++ b/core/src/test/java/com/mapzen/android/search/MapzenSearchTest.java
@@ -24,9 +24,10 @@ public class MapzenSearchTest {
MapzenSearch search = new MapzenSearch(context, pelias);
@Test public void shouldCreatePelias() {
- MapzenSearch mzSearch = new MapzenSearch(context, "API_KEY");
+ MapzenSearch mzSearch = new MapzenSearch(context, "API_KEY_PARAM_NAME");
assertThat(mzSearch.getPelias()).isNotNull();
- assertThat(mzSearch.searchInitializer.getRequestHandler().getApiKey()).isEqualTo("API_KEY");
+ assertThat(mzSearch.searchInitializer.getRequestHandler().getApiKey())
+ .isEqualTo("API_KEY_PARAM_NAME");
}
@Test public void suggest_shouldCallPelias() {
diff --git a/core/src/test/java/com/mapzen/android/search/SearchRequestHandlerTest.java b/core/src/test/java/com/mapzen/android/search/SearchRequestHandlerTest.java
index 39933026..403b3134 100644
--- a/core/src/test/java/com/mapzen/android/search/SearchRequestHandlerTest.java
+++ b/core/src/test/java/com/mapzen/android/search/SearchRequestHandlerTest.java
@@ -1,6 +1,6 @@
package com.mapzen.android.search;
-import com.mapzen.android.core.ApiKeyConstants;
+import com.mapzen.android.core.MapzenManager;
import org.junit.Test;
@@ -17,6 +17,7 @@ public class SearchRequestHandlerTest {
@Test public void queryParamsForRequest_shouldReturnApiKey() {
adapter.setApiKey("TEST_KEY");
- assertThat(adapter.queryParamsForRequest().get(ApiKeyConstants.API_KEY)).isEqualTo("TEST_KEY");
+ assertThat(adapter.queryParamsForRequest().get(MapzenManager.API_KEY_PARAM_NAME))
+ .isEqualTo("TEST_KEY");
}
}
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 00000000..e7f78f9f
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1,15 @@
+version=1.3.0-SNAPSHOT
+
+VERSION_NAME=1.3.0-SNAPSHOT
+
+POM_URL=https://github.com/mapzen/android
+POM_SCM_URL=http://github.com/mapzen/android
+POM_SCM_CONNECTION=scm:git:git://github.com/mapzen/android.git
+POM_SCM_DEV_CONNECTION=scm:git:git@github.com:mapzen/android.git
+
+POM_LICENCE_NAME=The Apache Software License, Version 2.0
+POM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt
+POM_LICENCE_DIST=repo
+
+POM_DEVELOPER_ID=Mapzen
+POM_DEVELOPER_NAME=Mapzen
diff --git a/mapzen-android-sdk/build.gradle b/mapzen-android-sdk/build.gradle
index b110f869..9df23167 100644
--- a/mapzen-android-sdk/build.gradle
+++ b/mapzen-android-sdk/build.gradle
@@ -81,7 +81,7 @@ task verify(dependsOn: ['compileDebugSources',
'lint'])
dependencies {
- compile 'com.mapzen:mapzen-core:0.0.1-SNAPSHOT'
+ compile 'com.mapzen:mapzen-core:1.3.0-SNAPSHOT'
compile ('com.mapzen:on-the-road:1.2.0-SNAPSHOT') {
exclude group: 'com.squareup.retrofit2', module: 'converter-gson'
}
diff --git a/mapzen-android-sdk/gradle.properties b/mapzen-android-sdk/gradle.properties
index 6e2e8f48..9e55f2b8 100644
--- a/mapzen-android-sdk/gradle.properties
+++ b/mapzen-android-sdk/gradle.properties
@@ -1,22 +1,6 @@
-version=1.3.0-SNAPSHOT
-
POM_ARTIFACT_ID=mapzen-android-sdk
POM_NAME=Mapzen Android SDK
POM_PACKAGING=aar
GROUP=com.mapzen
-VERSION_NAME=1.3.0-SNAPSHOT
-
POM_DESCRIPTION=Unified SDK for Mapzen tools and services on Android.
-
-POM_URL=https://github.com/mapzen/android
-POM_SCM_URL=http://github.com/mapzen/android
-POM_SCM_CONNECTION=scm:git:git://github.com/mapzen/android.git
-POM_SCM_DEV_CONNECTION=scm:git:git@github.com:mapzen/android.git
-
-POM_LICENCE_NAME=The Apache Software License, Version 2.0
-POM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt
-POM_LICENCE_DIST=repo
-
-POM_DEVELOPER_ID=Mapzen
-POM_DEVELOPER_NAME=Mapzen
diff --git a/mapzen-android-sdk/src/main/java/com/mapzen/android/core/AndroidModule.java b/mapzen-android-sdk/src/main/java/com/mapzen/android/core/AndroidModule.java
index a2f8c94d..8ee421db 100644
--- a/mapzen-android-sdk/src/main/java/com/mapzen/android/core/AndroidModule.java
+++ b/mapzen-android-sdk/src/main/java/com/mapzen/android/core/AndroidModule.java
@@ -4,7 +4,6 @@
import android.content.Context;
import android.content.res.Resources;
-import android.util.Log;
import javax.inject.Singleton;
@@ -15,8 +14,6 @@
* Dependency injection module for components that depend on an Android {@link Context}.
*/
@Module public class AndroidModule {
- private static final String TAG = AndroidModule.class.getSimpleName();
-
private final Context context;
/**
@@ -46,18 +43,9 @@
/**
* Provides HTTP handler to append API key to outgoing turn-by-turn requests.
*/
- @Provides @Singleton public TurnByTurnHttpHandler provideTurnByTurnHttpHandler(Resources res) {
- TurnByTurnHttpHandler handler = new TurnByTurnHttpHandler();
- final String packageName = context.getPackageName();
- try {
- final int apiKeyId = res.getIdentifier(ApiKeyConstants.API_KEY_RES_NAME,
- ApiKeyConstants.API_KEY_RES_TYPE, packageName);
- final String apiKey = res.getString(apiKeyId);
- handler.setApiKey(apiKey);
- } catch (Resources.NotFoundException e) {
- Log.e(TAG, e.getLocalizedMessage());
- }
+ @Provides @Singleton public TurnByTurnHttpHandler provideTurnByTurnHttpHandler() {
+ final TurnByTurnHttpHandler handler = new TurnByTurnHttpHandler();
+ handler.setApiKey(MapzenManager.instance(context).getApiKey());
return handler;
}
-
}
diff --git a/mapzen-places-api/build.gradle b/mapzen-places-api/build.gradle
index f8e30bbe..7b025a64 100644
--- a/mapzen-places-api/build.gradle
+++ b/mapzen-places-api/build.gradle
@@ -79,7 +79,7 @@ task verify(dependsOn: ['compileDebugSources',
dependencies {
compile 'com.android.support:appcompat-v7:25.1.0'
- compile 'com.mapzen:mapzen-core:0.0.1-SNAPSHOT'
+ compile 'com.mapzen:mapzen-core:1.3.0-SNAPSHOT'
testCompile 'junit:junit:4.12'
testCompile 'org.assertj:assertj-core:1.7.1'
diff --git a/mapzen-places-api/gradle.properties b/mapzen-places-api/gradle.properties
index 22170b3a..e93cae5d 100644
--- a/mapzen-places-api/gradle.properties
+++ b/mapzen-places-api/gradle.properties
@@ -1,22 +1,6 @@
-version=0.0.1-SNAPSHOT
-
POM_ARTIFACT_ID=mapzen-places-api
POM_NAME=Mapzen Places API
POM_PACKAGING=aar
GROUP=com.mapzen
-VERSION_NAME=0.0.1-SNAPSHOT
-
-POM_DESCRIPTION=Mapzen Places API.
-
-POM_URL=https://github.com/mapzen/android
-POM_SCM_URL=http://github.com/mapzen/android
-POM_SCM_CONNECTION=scm:git:git://github.com/mapzen/android.git
-POM_SCM_DEV_CONNECTION=scm:git:git@github.com:mapzen/android.git
-
-POM_LICENCE_NAME=The Apache Software License, Version 2.0
-POM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt
-POM_LICENCE_DIST=repo
-
-POM_DEVELOPER_ID=Mapzen
-POM_DEVELOPER_NAME=Mapzen
+POM_DESCRIPTION=Add information about millions of open data locations to your Android app.
diff --git a/mapzen-places-api/src/main/java/com/mapzen/places/api/internal/PeliasCallbackHandler.java b/mapzen-places-api/src/main/java/com/mapzen/places/api/internal/PeliasCallbackHandler.java
index 3f6e3380..0540a363 100644
--- a/mapzen-places-api/src/main/java/com/mapzen/places/api/internal/PeliasCallbackHandler.java
+++ b/mapzen-places-api/src/main/java/com/mapzen/places/api/internal/PeliasCallbackHandler.java
@@ -4,8 +4,6 @@
import com.mapzen.pelias.gson.Result;
import com.mapzen.places.api.Place;
-import java.util.List;
-
import retrofit2.Response;
/**
@@ -26,14 +24,21 @@ class PeliasCallbackHandler {
/**
* Creates a {@link Place} from a {@link Feature} with a name that matches the given title and
- * notifies the listener that a place has been successfully retrieved.
- * @param title
- * @param features
- * @param listener
+ * notifies the listener that a place has been successfully retrieved. If the response body or
+ * response body features do not exist, the listener is notified of a fetch failure.
+ *
+ * @param title the name of the POI to match.
+ * @param response response returned from the Pelias service.
+ * @param listener object to be notified of success or failure.
*/
- public void handleSuccess(String title, List features,
+ void handleSuccess(String title, Response response,
OnPlaceDetailsFetchedListener listener) {
- for (Feature feature : features) {
+ if (!isValidResponse(response)) {
+ listener.onFetchFailure();
+ return;
+ }
+
+ for (Feature feature : response.body().getFeatures()) {
if (feature.properties.name.equals(title)) {
Place place = converter.getFetchedPlace(feature);
String details = getDetails(feature, title);
@@ -47,15 +52,16 @@ public void handleSuccess(String title, List features,
* feature in the response) and notifies the listener that a place has been successfully
* retrieved. If the response body or response body features do not exist, the listener is
* notified of a fetch failure.
- * @param response
- * @param listener
+ *
+ * @param response response returned from the Pelias service.
+ * @param listener object to be notified of success or failure.
*/
- public void handleSuccess(Response response, OnPlaceDetailsFetchedListener listener) {
- if (response.body() == null || response.body().getFeatures() == null ||
- response.body().getFeatures().isEmpty()) {
+ void handleSuccess(Response response, OnPlaceDetailsFetchedListener listener) {
+ if (!isValidResponse(response)) {
listener.onFetchFailure();
return;
}
+
Feature feature = response.body().getFeatures().get(0);
String title = feature.properties.name;
Place place = converter.getFetchedPlace(feature);
@@ -63,11 +69,23 @@ public void handleSuccess(Response response, OnPlaceDetailsFetchedListen
listener.onFetchSuccess(place, details);
}
+ /**
+ * Verifies whether the response body returned by the Pelias service is valid (contains features).
+ *
+ * @param response Pelias service response.
+ * @return {@code true} if the response is valid; {@code false} otherwise.
+ */
+ private boolean isValidResponse(Response response) {
+ return response.body() != null &&
+ response.body().getFeatures() != null &&
+ !response.body().getFeatures().isEmpty();
+ }
+
/**
* Notify the listener of a fetch failure.
* @param listener
*/
- public void handleFailure(OnPlaceDetailsFetchedListener listener) {
+ void handleFailure(OnPlaceDetailsFetchedListener listener) {
listener.onFetchFailure();
}
diff --git a/mapzen-places-api/src/main/java/com/mapzen/places/api/internal/PeliasPlaceDetailFetcher.java b/mapzen-places-api/src/main/java/com/mapzen/places/api/internal/PeliasPlaceDetailFetcher.java
index c40449da..c1821cd7 100644
--- a/mapzen-places-api/src/main/java/com/mapzen/places/api/internal/PeliasPlaceDetailFetcher.java
+++ b/mapzen-places-api/src/main/java/com/mapzen/places/api/internal/PeliasPlaceDetailFetcher.java
@@ -32,8 +32,7 @@ public PeliasPlaceDetailFetcher(Pelias pelias, PeliasCallbackHandler callbackHan
final OnPlaceDetailsFetchedListener listener) {
pelias.reverse(coordinates.latitude, coordinates.longitude, new Callback() {
@Override public void onResponse(Call call, Response response) {
- callbackHandler.handleSuccess(properties.get(PROPERTY_NAME),
- response.body().getFeatures(), listener);
+ callbackHandler.handleSuccess(properties.get(PROPERTY_NAME), response, listener);
}
@Override public void onFailure(Call call, Throwable t) {
diff --git a/mapzen-places-api/src/test/java/com/mapzen/places/api/internal/PeliasCallbackHandlerTest.java b/mapzen-places-api/src/test/java/com/mapzen/places/api/internal/PeliasCallbackHandlerTest.java
index 6de23f8a..994fbcb9 100644
--- a/mapzen-places-api/src/test/java/com/mapzen/places/api/internal/PeliasCallbackHandlerTest.java
+++ b/mapzen-places-api/src/test/java/com/mapzen/places/api/internal/PeliasCallbackHandlerTest.java
@@ -21,21 +21,39 @@ public class PeliasCallbackHandlerTest {
@Test
public void handleSuccess_titleFeatures_shouldCallListenerForMatchingTitle() throws Exception {
String title = "Place";
- List features = getTestFeatures("NotPlace", "Place");
+ Response response = getTestResponse("NotPlace", "Place");
TestDetailsListener listener = new TestDetailsListener();
- callbackHandler.handleSuccess(title, features, listener);
+ callbackHandler.handleSuccess(title, response, listener);
assertThat(listener.place.getName()).isEqualTo(title);
}
@Test
public void handleSuccess_titleFeatures_shouldCreateCorrectDetails() throws Exception {
String title = "Place";
- List features = getTestFeatures("NotPlace", "", "Place", "Place, Label");
+ Response response = getTestResponse("NotPlace", "", "Place", "Place, Label");
TestDetailsListener listener = new TestDetailsListener();
- callbackHandler.handleSuccess(title, features, listener);
+ callbackHandler.handleSuccess(title, response, listener);
assertThat(listener.details).isEqualTo("Place\nLabel");
}
+ @Test
+ public void handleSuccess_titleFeatures_shouldCallFetchFailure() {
+ String title = "Place";
+ TestDetailsListener listener = new TestDetailsListener();
+ Place place = new PlaceImpl.Builder().build();
+ listener.place = place;
+ callbackHandler.handleSuccess(title, Response.success(null), listener);
+ assertThat(listener.place).isNull();
+ listener.place = place;
+ Result result = new Result();
+ callbackHandler.handleSuccess(title, Response.success(result), listener);
+ assertThat(listener.place).isNull();
+ listener.place = place;
+ result.setFeatures(new ArrayList());
+ callbackHandler.handleSuccess(title, Response.success(result), listener);
+ assertThat(listener.place).isNull();
+ }
+
@Test
public void handleSuccess_response_shouldCallFetchSuccess() {
Response response = getTestResponse("Place", "OtherPlace");
@@ -102,13 +120,6 @@ private List getTestFeatures(String name1, String details1, String name
return features;
}
- private List getTestFeatures(String name1, String name2) {
- List features = new ArrayList<>();
- features.add(getTestFeature(name1, ""));
- features.add(getTestFeature(name2, ""));
- return features;
- }
-
private Feature getTestFeature(String name, String label) {
Feature feature = new Feature();
feature.properties = new Properties();
diff --git a/samples/mapzen-android-sdk-sample/build.gradle b/samples/mapzen-android-sdk-sample/build.gradle
index e9c0bf5d..df0c0be8 100644
--- a/samples/mapzen-android-sdk-sample/build.gradle
+++ b/samples/mapzen-android-sdk-sample/build.gradle
@@ -1,7 +1,7 @@
apply plugin: 'com.android.application'
apply plugin: 'checkstyle'
-def API_KEY = hasProperty('apiKey') ? '"' + apiKey + '"' : "null";
+def MAPZEN_API_KEY = hasProperty('mapzenApiKey') ? '"' + mapzenApiKey + '"' : "null";
android {
compileSdkVersion 25
@@ -13,7 +13,7 @@ android {
targetSdkVersion 25
versionCode 1
versionName "1.0"
- buildConfigField "String", "API_KEY", API_KEY
+ buildConfigField "String", "MAPZEN_API_KEY", MAPZEN_API_KEY
}
buildTypes {
release {
diff --git a/samples/mapzen-android-sdk-sample/src/main/java/com/mapzen/android/sdk/sample/MapzenSearchViewActivity.java b/samples/mapzen-android-sdk-sample/src/main/java/com/mapzen/android/sdk/sample/MapzenSearchViewActivity.java
index 36f9df01..8d818369 100644
--- a/samples/mapzen-android-sdk-sample/src/main/java/com/mapzen/android/sdk/sample/MapzenSearchViewActivity.java
+++ b/samples/mapzen-android-sdk-sample/src/main/java/com/mapzen/android/sdk/sample/MapzenSearchViewActivity.java
@@ -56,7 +56,7 @@ public class MapzenSearchViewActivity extends AppCompatActivity {
}
});
- final String apiKey = BuildConfig.API_KEY;
+ final String apiKey = BuildConfig.MAPZEN_API_KEY;
mapzenSearch = new MapzenSearch(this, apiKey);
mapzenSearch.setLocationProvider(peliasLocationProvider);
diff --git a/samples/mapzen-android-sdk-sample/src/main/java/com/mapzen/android/sdk/sample/RouterActivity.java b/samples/mapzen-android-sdk-sample/src/main/java/com/mapzen/android/sdk/sample/RouterActivity.java
index 9b62be02..0d403031 100644
--- a/samples/mapzen-android-sdk-sample/src/main/java/com/mapzen/android/sdk/sample/RouterActivity.java
+++ b/samples/mapzen-android-sdk-sample/src/main/java/com/mapzen/android/sdk/sample/RouterActivity.java
@@ -2,10 +2,10 @@
import com.mapzen.android.graphics.MapFragment;
import com.mapzen.android.graphics.MapzenMap;
-import com.mapzen.android.routing.MapzenRouter;
import com.mapzen.android.graphics.OnMapReadyCallback;
import com.mapzen.android.graphics.model.Marker;
import com.mapzen.android.graphics.model.Polyline;
+import com.mapzen.android.routing.MapzenRouter;
import com.mapzen.model.ValhallaLocation;
import com.mapzen.tangram.LngLat;
import com.mapzen.tangram.TouchInput;
@@ -36,7 +36,7 @@ public class RouterActivity extends AppCompatActivity {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_route);
- final String apiKey = BuildConfig.API_KEY;
+ final String apiKey = BuildConfig.MAPZEN_API_KEY;
if (apiKey != null) {
router = new MapzenRouter(this, apiKey);
} else {
diff --git a/samples/mapzen-places-api-sample/build.gradle b/samples/mapzen-places-api-sample/build.gradle
index 44666db0..3644c925 100644
--- a/samples/mapzen-places-api-sample/build.gradle
+++ b/samples/mapzen-places-api-sample/build.gradle
@@ -1,6 +1,8 @@
apply plugin: 'com.android.application'
apply plugin: 'checkstyle'
+def MAPZEN_API_KEY = hasProperty('mapzenApiKey') ? '"' + mapzenApiKey + '"' : "null";
+
android {
compileSdkVersion 25
buildToolsVersion '25.0.2'
@@ -11,8 +13,7 @@ android {
targetSdkVersion 25
versionCode 1
versionName "1.0"
-
- testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+ buildConfigField "String", "MAPZEN_API_KEY", MAPZEN_API_KEY
}
buildTypes {
release {
diff --git a/samples/mapzen-places-api-sample/src/main/java/com/mapzen/places/api/sample/MainActivity.java b/samples/mapzen-places-api-sample/src/main/java/com/mapzen/places/api/sample/MainActivity.java
index 6d00c643..9ea77419 100644
--- a/samples/mapzen-places-api-sample/src/main/java/com/mapzen/places/api/sample/MainActivity.java
+++ b/samples/mapzen-places-api-sample/src/main/java/com/mapzen/places/api/sample/MainActivity.java
@@ -1,5 +1,7 @@
package com.mapzen.places.api.sample;
+import com.mapzen.android.core.MapzenManager;
+
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
@@ -51,6 +53,10 @@ public class MainActivity extends AppCompatActivity {
configureListView();
+ if (BuildConfig.MAPZEN_API_KEY != null) {
+ MapzenManager.instance(this).setApiKey(BuildConfig.MAPZEN_API_KEY);
+ }
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
checkRuntimePermissions();
}
diff --git a/samples/mapzen-places-api-sample/src/main/res/values/strings.xml b/samples/mapzen-places-api-sample/src/main/res/values/strings.xml
index e5e43ed4..8698b7b2 100644
--- a/samples/mapzen-places-api-sample/src/main/res/values/strings.xml
+++ b/samples/mapzen-places-api-sample/src/main/res/values/strings.xml
@@ -1,5 +1,5 @@
- Mapzen Places API
+ Mapzen Places
GeoDataApi
Places.GeoDataApi example usage
This app needs location permissions to work properly.
diff --git a/scripts/deploy-android-sdk-sample-app.sh b/scripts/deploy-android-sdk-sample-app.sh
index d14b995d..453caddc 100755
--- a/scripts/deploy-android-sdk-sample-app.sh
+++ b/scripts/deploy-android-sdk-sample-app.sh
@@ -2,6 +2,6 @@
#
# Builds mapzen android sdk sample app and uploads APK to s3://android.mapzen.com/mapzen-android-sdk-sample-snapshots/.
-./gradlew assembleDebug -PapiKey=$API_KEY
+./gradlew assembleDebug -PmapzenApiKey=$MAPZEN_API_KEY
s3cmd put samples/mapzen-android-sdk-sample/build/outputs/apk/samples_mapzen-android-sdk-sample-debug.apk s3://android.mapzen.com/mapzen-android-sdk-sample-latest.apk
s3cmd put samples/mapzen-android-sdk-sample/build/outputs/apk/samples_mapzen-android-sdk-sample-debug.apk s3://android.mapzen.com/mapzen-android-sdk-sample-snapshots/mapzen-android-sdk-sample-$CIRCLE_BUILD_NUM.apk
diff --git a/scripts/deploy-places-api-sample-app.sh b/scripts/deploy-places-api-sample-app.sh
index 1c0cfe4f..efe32674 100755
--- a/scripts/deploy-places-api-sample-app.sh
+++ b/scripts/deploy-places-api-sample-app.sh
@@ -2,6 +2,6 @@
#
# Builds mapzen places api sample app and uploads APK to s3://android.mapzen.com/mapzen-places-api-sample-snapshots/.
-./gradlew assembleDebug -PapiKey=$API_KEY
+./gradlew assembleDebug -PmapzenApiKey=$MAPZEN_API_KEY
s3cmd put samples/mapzen-places-api-sample/build/outputs/apk/samples_mapzen-places-api-sample-debug.apk s3://android.mapzen.com/mapzen-places-api-sample-latest.apk
s3cmd put samples/mapzen-places-api-sample/build/outputs/apk/samples_mapzen-places-api-sample-debug.apk s3://android.mapzen.com/places-api-sample-snapshots/mapzen-places-api-sample-$CIRCLE_BUILD_NUM.apk