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