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