diff --git a/build.gradle b/build.gradle
index 39e4b4e..dad5f8a 100644
--- a/build.gradle
+++ b/build.gradle
@@ -16,10 +16,10 @@
buildscript {
repositories {
- mavenCentral()
+ jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:1.1.3'
+ classpath 'com.android.tools.build:gradle:2.2.3'
}
}
@@ -31,11 +31,12 @@ repositories {
dependencies {
compile 'org.microg:unifiednlp-api:1.3.2'
+ compile 'com.android.support:preference-v7:25.1.0'
}
android {
- compileSdkVersion 22
- buildToolsVersion "22.0.0"
+ compileSdkVersion 25
+ buildToolsVersion "25.0.2"
}
if (file('user.gradle').exists()) {
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index f383232..7dff301 100755
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Wed Jan 14 11:55:04 CET 2015
+#Fri Jan 27 15:08:17 CET 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml
index 15a7e95..b250e75 100644
--- a/src/main/AndroidManifest.xml
+++ b/src/main/AndroidManifest.xml
@@ -1,14 +1,15 @@
+ android:versionName="1.1.1"
+ android:versionCode="10101"
+ package="org.microg.nlp.backend.nominatim">
-
+
+ android:targetSdkVersion="25" />
+
-
+
+
+
+
+
+
+
+
+
diff --git a/src/main/java/org/microg/nlp/backend/nominatim/BackendService.java b/src/main/java/org/microg/nlp/backend/nominatim/BackendService.java
index 0a4ec07..9a32c5d 100644
--- a/src/main/java/org/microg/nlp/backend/nominatim/BackendService.java
+++ b/src/main/java/org/microg/nlp/backend/nominatim/BackendService.java
@@ -1,10 +1,12 @@
package org.microg.nlp.backend.nominatim;
import android.content.Context;
+import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.location.Address;
import android.net.Uri;
import android.os.Build;
+import android.preference.PreferenceManager;
import android.util.Log;
import org.json.JSONArray;
@@ -21,19 +23,22 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
+import java.util.Objects;
import java.util.concurrent.atomic.AtomicBoolean;
public class BackendService extends GeocoderBackendService {
- private static final String TAG = "NominatimGeocoderBackend";
- private static final String SERVICE_URL_MAPQUEST = "http://open.mapquestapi.com/nominatim/v1/";
- private static final String SERVICE_URL_OSM = " http://nominatim.openstreetmap.org/";
+ private static final String TAG = "NominatimGeocoder";
+
+ private static final String SERVICE_URL_MAPQUEST = "https://open.mapquestapi.com/nominatim/v1";
+ private static final String SERVICE_URL_OSM = "https://nominatim.openstreetmap.org";
+
private static final String REVERSE_GEOCODE_URL =
- "%sreverse?format=json&accept-language=%s&lat=%f&lon=%f";
+ "%s/reverse?%sformat=json&accept-language=%s&lat=%f&lon=%f";
private static final String SEARCH_GEOCODE_URL =
- "%ssearch?format=json&accept-language=%s&addressdetails=1&bounded=1&q=%s&limit=%d";
+ "%s/search?%sformat=json&accept-language=%s&addressdetails=1&bounded=1&q=%s&limit=%d";
private static final String SEARCH_GEOCODE_WITH_BOX_URL =
- "%ssearch?format=json&accept-language=%s&addressdetails=1&bounded=1&q=%s&limit=%d" +
- "&viewbox=%f,%f,%f,%f";
+ SEARCH_GEOCODE_URL + "&viewbox=%f,%f,%f,%f";
+
private static final String WIRE_LATITUDE = "lat";
private static final String WIRE_LONGITUDE = "lon";
private static final String WIRE_ADDRESS = "address";
@@ -48,10 +53,40 @@ public class BackendService extends GeocoderBackendService {
private static final String WIRE_COUNTRYNAME = "country";
private static final String WIRE_COUNTRYCODE = "country_code";
+ private String mApiUrl;
+ private String mAPIKey;
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ readPrefs();
+ }
+
+ @Override
+ protected void onOpen() {
+ super.onOpen();
+ readPrefs();
+ }
+
+ private void readPrefs() {
+ SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
+
+ if (sp.getString(SettingsActivity.PrefsFragment.apiChoiceToken, "OSM").equals("OSM")) {
+ mApiUrl = SERVICE_URL_OSM;
+ // No API key for OSM
+ mAPIKey = "";
+ } else {
+ mApiUrl = SERVICE_URL_MAPQUEST;
+ mAPIKey = "key=" + sp.getString(SettingsActivity.PrefsFragment.mapQuestApiKeyToken, "NA")
+ + "&";
+ }
+ }
+
+
@Override
protected List
getFromLocation(double latitude, double longitude, int maxResults,
String locale) {
- String url = String.format(Locale.US, REVERSE_GEOCODE_URL, SERVICE_URL_MAPQUEST,
+ String url = String.format(Locale.US, REVERSE_GEOCODE_URL, mApiUrl, mAPIKey,
locale.split("_")[0], latitude, longitude);
try {
JSONObject result = new JSONObject(new AsyncGetRequest(this,
@@ -88,10 +123,10 @@ protected List getFromLocationName(String locationName, int maxResults,
String url;
if (lowerLeftLatitude == 0 && lowerLeftLongitude == 0 && upperRightLatitude == 0 &&
upperRightLongitude == 0) {
- url = String.format(Locale.US, SEARCH_GEOCODE_URL, SERVICE_URL_MAPQUEST,
+ url = String.format(Locale.US, SEARCH_GEOCODE_URL, mApiUrl, mAPIKey,
locale.split("_")[0], query, maxResults);
} else {
- url = String.format(Locale.US, SEARCH_GEOCODE_WITH_BOX_URL, SERVICE_URL_MAPQUEST,
+ url = String.format(Locale.US, SEARCH_GEOCODE_WITH_BOX_URL, mApiUrl, mAPIKey,
locale.split("_")[0], query, maxResults, lowerLeftLongitude,
upperRightLatitude, upperRightLongitude, lowerLeftLatitude);
}
@@ -165,8 +200,8 @@ private Address parseResponse(Locale locale, JSONObject result) throws JSONExcep
}
private class AsyncGetRequest extends Thread {
- public static final String USER_AGENT = "User-Agent";
- public static final String USER_AGENT_TEMPLATE = "UnifiedNlp/%s (Linux; Android %s)";
+ static final String USER_AGENT = "User-Agent";
+ static final String USER_AGENT_TEMPLATE = "UnifiedNlp/%s (Linux; Android %s)";
private final AtomicBoolean done = new AtomicBoolean(false);
private final Context context;
private final String url;
@@ -196,12 +231,12 @@ public void run() {
}
}
- public AsyncGetRequest asyncStart() {
+ AsyncGetRequest asyncStart() {
start();
return this;
}
- public byte[] retrieveAllBytes() {
+ byte[] retrieveAllBytes() {
if (!done.get()) {
synchronized (done) {
while (!done.get()) {
@@ -216,7 +251,7 @@ public byte[] retrieveAllBytes() {
return result;
}
- public String retrieveString() {
+ String retrieveString() {
return new String(retrieveAllBytes());
}
diff --git a/src/main/java/org/microg/nlp/backend/nominatim/SettingsActivity.java b/src/main/java/org/microg/nlp/backend/nominatim/SettingsActivity.java
new file mode 100644
index 0000000..5387039
--- /dev/null
+++ b/src/main/java/org/microg/nlp/backend/nominatim/SettingsActivity.java
@@ -0,0 +1,93 @@
+package org.microg.nlp.backend.nominatim;
+
+import android.content.SharedPreferences;
+import android.os.Bundle;
+
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.preference.ListPreference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceFragmentCompat;
+
+public class SettingsActivity extends AppCompatActivity {
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ if (getSupportActionBar() != null) {
+ getSupportActionBar().setTitle(R.string.app_name);
+ getSupportActionBar().show();
+ }
+
+ // Display the fragment as the main content.
+ getSupportFragmentManager()
+ .beginTransaction()
+ .replace(android.R.id.content, new PrefsFragment())
+ .commit();
+ }
+
+ public static class PrefsFragment extends PreferenceFragmentCompat {
+ public static final String catApiKeyToken = "cat_api_preference";
+ public static final String apiChoiceToken = "api_server_choice";
+ public static final String mapQuestApiKeyToken = "api_preference";
+
+ private SharedPreferences shPref;
+ private SharedPreferences.OnSharedPreferenceChangeListener listener;
+
+ private Preference mApiChoicePref;
+ private Preference mCatAPIKeyPref;
+ private Preference mMapQuestApiKeyPref;
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ shPref = getPreferenceManager().getSharedPreferences();
+
+ // Load the preferences from an XML resource
+ addPreferencesFromResource(R.xml.preferences);
+
+ mApiChoicePref = findPreference(apiChoiceToken);
+ mCatAPIKeyPref = findPreference(catApiKeyToken);
+ mMapQuestApiKeyPref = findPreference(mapQuestApiKeyToken);
+
+ refreshPrefs();
+
+ // Need explicit reference.
+ // See :
+ // http://stackoverflow.com/a/3104265
+ listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
+ @Override
+ public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
+ updatePreference(findPreference(key), key);
+ }
+ };
+ shPref.registerOnSharedPreferenceChangeListener(listener);
+
+ mApiChoicePref.setSummary(shPref.getString(apiChoiceToken, "OSM"));
+ mMapQuestApiKeyPref.setSummary(shPref.getString(mapQuestApiKeyToken, ""));
+ }
+
+ private void refreshPrefs() {
+ String apiServer = shPref.getString(apiChoiceToken, "OSM");
+ if (apiServer.equals("OSM")) {
+ getPreferenceScreen().removePreference(mCatAPIKeyPref);
+ } else {
+ getPreferenceScreen().addPreference(mCatAPIKeyPref);
+ }
+ }
+
+ private void updatePreference(Preference preference, String key) {
+ refreshPrefs();
+
+ if (preference == null) {
+ return;
+ }
+
+ if (preference instanceof ListPreference) {
+ ListPreference listPreference = (ListPreference) preference;
+ listPreference.setSummary(listPreference.getEntry());
+ return;
+ }
+
+ preference.setSummary(shPref.getString(key, "Default"));
+ }
+ }
+}
diff --git a/src/main/res/values/arrays.xml b/src/main/res/values/arrays.xml
new file mode 100644
index 0000000..320730f
--- /dev/null
+++ b/src/main/res/values/arrays.xml
@@ -0,0 +1,7 @@
+
+
+
+ - OSM
+ - MapQuest
+
+
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index ec5cbfd..d81b026 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -1,5 +1,11 @@
- NominatimGeocoderBackend
+ Nominatim Geocoder Backend
Nominatim
+
+ Choose Nominatim API Server
+ MapQuest Server Access
+ MapQuest Developer API Key
+ MapQuest Developer API Key
+ Enter your MapQuest developer API key.
diff --git a/src/main/res/values/themes.xml b/src/main/res/values/themes.xml
new file mode 100644
index 0000000..e3090d8
--- /dev/null
+++ b/src/main/res/values/themes.xml
@@ -0,0 +1,6 @@
+
+
+
+
diff --git a/src/main/res/xml/preferences.xml b/src/main/res/xml/preferences.xml
new file mode 100644
index 0000000..5b781b7
--- /dev/null
+++ b/src/main/res/xml/preferences.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file