Skip to content

Commit 894e624

Browse files
committed
Merge branch 'master' of github.com:microg/NominatimGeocoderBackend
2 parents 11d8e35 + e622a2f commit 894e624

File tree

11 files changed

+256
-23
lines changed

11 files changed

+256
-23
lines changed

.travis.yml

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
language: android
2+
sudo: false
3+
git:
4+
submodules: false
5+
before_install:
6+
- git submodule update --init --recursive
7+
script:
8+
- jdk_switcher use oraclejdk8
9+
- echo sdk.dir $ANDROID_HOME > local.properties
10+
- export TERM=dumb
11+
- export JAVA_OPTS="-XX:+CMSClassUnloadingEnabled -XX:+HeapDumpOnOutOfMemoryError -Xmx2048m"
12+
- ./gradlew build
13+
android:
14+
components:
15+
- tools
16+
- platform-tools
17+
- build-tools-25.0.2
18+
- android-25
19+
- extra-android-m2repository
20+
before_cache:
21+
- rm -f $HOME/.gradle/caches/modules-2/modules-2.lock
22+
cache:
23+
directories:
24+
- $HOME/.gradle/caches/
25+
- $HOME/.gradle/wrapper/

Android.mk

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
LOCAL_PATH:= $(call my-dir)
2+
3+
include $(CLEAR_VARS)
4+
5+
LOCAL_MODULE := NominatimNlpBackend
6+
LOCAL_MODULE_TAGS := optional
7+
LOCAL_PACKAGE_NAME := NominatimNlpBackend
8+
9+
nominatim_root := $(LOCAL_PATH)
10+
nominatim_out := $(OUT_DIR)/target/common/obj/APPS/$(LOCAL_MODULE)_intermediates
11+
nominatim_build := $(nominatim_root)/build
12+
nominatim_apk := build/outputs/apk/NominatimGeocoderBackend-release-unsigned.apk
13+
14+
$(nominatim_root)/$(nominatim_apk):
15+
rm -Rf $(nominatim_build)
16+
mkdir -p $(nominatim_out)
17+
mkdir -p $(nominatim_build)
18+
ln -sf $(nominatim_out) $(nominatim_build)
19+
cd $(nominatim_root) && JAVA_TOOL_OPTIONS="$(JAVA_TOOL_OPTIONS) -Dfile.encoding=UTF8" ./gradlew assembleRelease
20+
21+
LOCAL_CERTIFICATE := platform
22+
LOCAL_SRC_FILES := $(nominatim_apk)
23+
LOCAL_MODULE_CLASS := APPS
24+
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
25+
26+
include $(BUILD_PREBUILT)

build.gradle

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,12 @@ repositories {
5050
dependencies {
5151
compile 'org.microg:unifiednlp-api:1.5.3'
5252
compile 'org.microg:address-formatter:0.2'
53+
compile 'com.android.support:preference-v7:25.1.0'
5354
}
5455

5556
android {
56-
compileSdkVersion 24
57-
buildToolsVersion "24.0.3"
57+
compileSdkVersion 25
58+
buildToolsVersion "25.0.2"
5859

5960
defaultConfig {
6061
versionName getMyVersionName()

gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#Wed Jan 14 11:55:04 CET 2015
1+
#Fri Jan 27 15:08:17 CET 2017
22
distributionBase=GRADLE_USER_HOME
33
distributionPath=wrapper/dists
44
zipStoreBase=GRADLE_USER_HOME

src/main/AndroidManifest.xml

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@
22
<manifest package="org.microg.nlp.backend.nominatim"
33
xmlns:android="http://schemas.android.com/apk/res/android">
44

5-
<uses-permission android:name="android.permission.INTERNET"/>
5+
<uses-permission android:name="android.permission.INTERNET" />
66

77
<uses-sdk
88
android:minSdkVersion="9"
9-
android:targetSdkVersion="23"/>
9+
android:targetSdkVersion="25"/>
10+
1011
<application
1112
android:allowBackup="false"
1213
android:icon="@drawable/ic_launcher"
@@ -15,8 +16,19 @@
1516
android:name=".BackendService"
1617
android:label="@string/backend_name">
1718
<intent-filter>
18-
<action android:name="org.microg.nlp.GEOCODER_BACKEND"/>
19+
<action android:name="org.microg.nlp.GEOCODER_BACKEND" />
1920
</intent-filter>
21+
<meta-data
22+
android:name="org.microg.nlp.BACKEND_SETTINGS_ACTIVITY"
23+
android:value="org.microg.nlp.backend.nominatim.SettingsActivity" />
2024
</service>
25+
26+
<activity android:name=".SettingsActivity"
27+
android:theme="@style/SettingsTheme">
28+
<intent-filter>
29+
<action android:name="android.intent.action.MAIN" />
30+
</intent-filter>
31+
</activity>
2132
</application>
33+
2234
</manifest>

src/main/java/org/microg/nlp/backend/nominatim/BackendService.java

Lines changed: 48 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,12 @@
1717
package org.microg.nlp.backend.nominatim;
1818

1919
import android.content.Context;
20+
import android.content.SharedPreferences;
21+
import android.content.pm.PackageManager;
2022
import android.location.Address;
2123
import android.net.Uri;
24+
import android.os.Build;
25+
import android.preference.PreferenceManager;
2226
import android.util.Log;
2327

2428
import org.json.JSONArray;
@@ -38,22 +42,25 @@
3842
import java.util.List;
3943
import java.util.Locale;
4044
import java.util.Map;
45+
import java.util.Objects;
4146
import java.util.concurrent.atomic.AtomicBoolean;
4247

4348
import static android.os.Build.VERSION.RELEASE;
4449
import static org.microg.nlp.backend.nominatim.BuildConfig.VERSION_NAME;
4550

4651
public class BackendService extends GeocoderBackendService {
47-
private static final String TAG = "NominatimBackend";
48-
private static final String SERVICE_URL_MAPQUEST = "http://open.mapquestapi.com/nominatim/v1/";
49-
private static final String SERVICE_URL_OSM = "http://nominatim.openstreetmap.org/";
52+
private static final String TAG = "NominatimGeocoder";
53+
54+
private static final String SERVICE_URL_MAPQUEST = "https://open.mapquestapi.com/nominatim/v1";
55+
private static final String SERVICE_URL_OSM = "https://nominatim.openstreetmap.org";
56+
5057
private static final String REVERSE_GEOCODE_URL =
51-
"%sreverse?format=json&accept-language=%s&lat=%f&lon=%f";
58+
"%s/reverse?%sformat=json&accept-language=%s&lat=%f&lon=%f";
5259
private static final String SEARCH_GEOCODE_URL =
53-
"%ssearch?format=json&accept-language=%s&addressdetails=1&bounded=1&q=%s&limit=%d";
60+
"%s/search?%sformat=json&accept-language=%s&addressdetails=1&bounded=1&q=%s&limit=%d";
5461
private static final String SEARCH_GEOCODE_WITH_BOX_URL =
55-
"%ssearch?format=json&accept-language=%s&addressdetails=1&bounded=1&q=%s&limit=%d" +
56-
"&viewbox=%f,%f,%f,%f";
62+
SEARCH_GEOCODE_URL + "&viewbox=%f,%f,%f,%f";
63+
5764
private static final String WIRE_LATITUDE = "lat";
5865
private static final String WIRE_LONGITUDE = "lon";
5966
private static final String WIRE_ADDRESS = "address";
@@ -70,6 +77,9 @@ public class BackendService extends GeocoderBackendService {
7077

7178
private Formatter formatter;
7279

80+
private String mApiUrl;
81+
private String mAPIKey;
82+
7383
@Override
7484
public void onCreate() {
7585
super.onCreate();
@@ -78,12 +88,34 @@ public void onCreate() {
7888
} catch (IOException e) {
7989
Log.w(TAG, "Could not initialize address formatter", e);
8090
}
91+
readPrefs();
92+
}
93+
94+
@Override
95+
protected void onOpen() {
96+
super.onOpen();
97+
readPrefs();
8198
}
8299

100+
private void readPrefs() {
101+
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
102+
103+
if (sp.getString(SettingsActivity.PrefsFragment.apiChoiceToken, "OSM").equals("OSM")) {
104+
mApiUrl = SERVICE_URL_OSM;
105+
// No API key for OSM
106+
mAPIKey = "";
107+
} else {
108+
mApiUrl = SERVICE_URL_MAPQUEST;
109+
mAPIKey = "key=" + sp.getString(SettingsActivity.PrefsFragment.mapQuestApiKeyToken, "NA")
110+
+ "&";
111+
}
112+
}
113+
114+
83115
@Override
84116
protected List<Address> getFromLocation(double latitude, double longitude, int maxResults,
85-
String locale) {
86-
String url = String.format(Locale.US, REVERSE_GEOCODE_URL, SERVICE_URL_OSM,
117+
String locale) {
118+
String url = String.format(Locale.US, REVERSE_GEOCODE_URL, mApiUrl, mAPIKey,
87119
locale.split("_")[0], latitude, longitude);
88120
try {
89121
JSONObject result = new JSONObject(new AsyncGetRequest(this,
@@ -120,10 +152,10 @@ protected List<Address> getFromLocationName(String locationName, int maxResults,
120152
String url;
121153
if (lowerLeftLatitude == 0 && lowerLeftLongitude == 0 && upperRightLatitude == 0 &&
122154
upperRightLongitude == 0) {
123-
url = String.format(Locale.US, SEARCH_GEOCODE_URL, SERVICE_URL_OSM,
155+
url = String.format(Locale.US, SEARCH_GEOCODE_URL, mApiUrl, mAPIKey,
124156
locale.split("_")[0], query, maxResults);
125157
} else {
126-
url = String.format(Locale.US, SEARCH_GEOCODE_WITH_BOX_URL, SERVICE_URL_OSM,
158+
url = String.format(Locale.US, SEARCH_GEOCODE_WITH_BOX_URL, mApiUrl, mAPIKey,
127159
locale.split("_")[0], query, maxResults, lowerLeftLongitude,
128160
upperRightLatitude, upperRightLongitude, lowerLeftLatitude);
129161
}
@@ -202,8 +234,8 @@ public Iterator<T> iterator() {
202234
}
203235

204236
private class AsyncGetRequest extends Thread {
205-
public static final String USER_AGENT = "User-Agent";
206-
public static final String USER_AGENT_TEMPLATE = "UnifiedNlp/%s (Linux; Android %s)";
237+
static final String USER_AGENT = "User-Agent";
238+
static final String USER_AGENT_TEMPLATE = "UnifiedNlp/%s (Linux; Android %s)";
207239
private final AtomicBoolean done = new AtomicBoolean(false);
208240
private final Context context;
209241
private final String url;
@@ -232,12 +264,12 @@ public void run() {
232264
}
233265
}
234266

235-
public AsyncGetRequest asyncStart() {
267+
AsyncGetRequest asyncStart() {
236268
start();
237269
return this;
238270
}
239271

240-
public byte[] retrieveAllBytes() {
272+
byte[] retrieveAllBytes() {
241273
if (!done.get()) {
242274
synchronized (done) {
243275
while (!done.get()) {
@@ -252,7 +284,7 @@ public byte[] retrieveAllBytes() {
252284
return result;
253285
}
254286

255-
public String retrieveString() {
287+
String retrieveString() {
256288
return new String(retrieveAllBytes());
257289
}
258290

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package org.microg.nlp.backend.nominatim;
2+
3+
import android.content.SharedPreferences;
4+
import android.os.Bundle;
5+
6+
import android.support.v7.app.AppCompatActivity;
7+
import android.support.v7.preference.ListPreference;
8+
import android.support.v7.preference.Preference;
9+
import android.support.v7.preference.PreferenceFragmentCompat;
10+
11+
public class SettingsActivity extends AppCompatActivity {
12+
@Override
13+
protected void onCreate(Bundle savedInstanceState) {
14+
super.onCreate(savedInstanceState);
15+
16+
if (getSupportActionBar() != null) {
17+
getSupportActionBar().setTitle(R.string.app_name);
18+
getSupportActionBar().show();
19+
}
20+
21+
// Display the fragment as the main content.
22+
getSupportFragmentManager()
23+
.beginTransaction()
24+
.replace(android.R.id.content, new PrefsFragment())
25+
.commit();
26+
}
27+
28+
public static class PrefsFragment extends PreferenceFragmentCompat {
29+
public static final String catApiKeyToken = "cat_api_preference";
30+
public static final String apiChoiceToken = "api_server_choice";
31+
public static final String mapQuestApiKeyToken = "api_preference";
32+
33+
private SharedPreferences shPref;
34+
private SharedPreferences.OnSharedPreferenceChangeListener listener;
35+
36+
private Preference mApiChoicePref;
37+
private Preference mCatAPIKeyPref;
38+
private Preference mMapQuestApiKeyPref;
39+
40+
@Override
41+
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
42+
shPref = getPreferenceManager().getSharedPreferences();
43+
44+
// Load the preferences from an XML resource
45+
addPreferencesFromResource(R.xml.preferences);
46+
47+
mApiChoicePref = findPreference(apiChoiceToken);
48+
mCatAPIKeyPref = findPreference(catApiKeyToken);
49+
mMapQuestApiKeyPref = findPreference(mapQuestApiKeyToken);
50+
51+
refreshPrefs();
52+
53+
// Need explicit reference.
54+
// See :
55+
// http://stackoverflow.com/a/3104265
56+
listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
57+
@Override
58+
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
59+
updatePreference(findPreference(key), key);
60+
}
61+
};
62+
shPref.registerOnSharedPreferenceChangeListener(listener);
63+
64+
mApiChoicePref.setSummary(shPref.getString(apiChoiceToken, "OSM"));
65+
mMapQuestApiKeyPref.setSummary(shPref.getString(mapQuestApiKeyToken, ""));
66+
}
67+
68+
private void refreshPrefs() {
69+
String apiServer = shPref.getString(apiChoiceToken, "OSM");
70+
if (apiServer.equals("OSM")) {
71+
getPreferenceScreen().removePreference(mCatAPIKeyPref);
72+
} else {
73+
getPreferenceScreen().addPreference(mCatAPIKeyPref);
74+
}
75+
}
76+
77+
private void updatePreference(Preference preference, String key) {
78+
refreshPrefs();
79+
80+
if (preference == null) {
81+
return;
82+
}
83+
84+
if (preference instanceof ListPreference) {
85+
ListPreference listPreference = (ListPreference) preference;
86+
listPreference.setSummary(listPreference.getEntry());
87+
return;
88+
}
89+
90+
preference.setSummary(shPref.getString(key, "Default"));
91+
}
92+
}
93+
}

src/main/res/values/arrays.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<resources>
3+
<string-array name="ApiChoice">
4+
<item>OSM</item>
5+
<item>MapQuest</item>
6+
</string-array>
7+
</resources>

src/main/res/values/strings.xml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<resources>
3-
<string name="app_name">NominatimGeocoderBackend</string>
3+
<string name="app_name">Nominatim Geocoder Backend</string>
44
<string name="backend_name">Nominatim</string>
5+
6+
<string name="choose_server">Choose Nominatim API Server</string>
7+
<string name="server_access">MapQuest Server Access</string>
8+
<string name="api_title">MapQuest Developer API Key</string>
9+
<string name="api_summary">MapQuest Developer API Key</string>
10+
<string name="api_dialog_title">Enter your MapQuest developer API key.</string>
511
</resources>

src/main/res/values/themes.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<resources>
3+
<style name="SettingsTheme" parent="Theme.AppCompat.Light.DarkActionBar">
4+
<item name="preferenceTheme">@style/PreferenceFragment</item>
5+
</style>
6+
</resources>

0 commit comments

Comments
 (0)