Skip to content

Commit 00d5a41

Browse files
authored
Merge pull request #14 from be-neth/n76/issue4/refactor
N76/issue4/refactor : Choose API server
2 parents 4d0dccb + 12135b9 commit 00d5a41

File tree

9 files changed

+214
-28
lines changed

9 files changed

+214
-28
lines changed

build.gradle

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@
1616

1717
buildscript {
1818
repositories {
19-
mavenCentral()
19+
jcenter()
2020
}
2121
dependencies {
22-
classpath 'com.android.tools.build:gradle:1.1.3'
22+
classpath 'com.android.tools.build:gradle:2.2.3'
2323
}
2424
}
2525

@@ -31,11 +31,12 @@ repositories {
3131

3232
dependencies {
3333
compile 'org.microg:unifiednlp-api:1.3.2'
34+
compile 'com.android.support:preference-v7:25.1.0'
3435
}
3536

3637
android {
37-
compileSdkVersion 22
38-
buildToolsVersion "22.0.0"
38+
compileSdkVersion 25
39+
buildToolsVersion "25.0.2"
3940
}
4041

4142
if (file('user.gradle').exists()) {
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
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
55
zipStorePath=wrapper/dists
6-
distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip
6+
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip

src/main/AndroidManifest.xml

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3-
android:versionName="1.1.1"
4-
android:versionCode="10101"
5-
package="org.microg.nlp.backend.nominatim">
3+
android:versionName="1.1.1"
4+
android:versionCode="10101"
5+
package="org.microg.nlp.backend.nominatim">
66

7-
<uses-permission android:name="android.permission.INTERNET"/>
7+
<uses-permission android:name="android.permission.INTERNET" />
88

99
<uses-sdk
1010
android:minSdkVersion="9"
11-
android:targetSdkVersion="22"/>
11+
android:targetSdkVersion="25" />
12+
1213
<application
1314
android:allowBackup="false"
1415
android:icon="@drawable/ic_launcher"
@@ -17,8 +18,20 @@
1718
android:name=".BackendService"
1819
android:label="@string/backend_name">
1920
<intent-filter>
20-
<action android:name="org.microg.nlp.GEOCODER_BACKEND"/>
21+
<action android:name="org.microg.nlp.GEOCODER_BACKEND" />
2122
</intent-filter>
23+
<meta-data
24+
android:name="org.microg.nlp.BACKEND_SETTINGS_ACTIVITY"
25+
android:value="org.microg.nlp.backend.nominatim.SettingsActivity" />
2226
</service>
27+
28+
<activity android:name=".SettingsActivity"
29+
android:theme="@style/SettingsTheme"
30+
>
31+
<intent-filter>
32+
<action android:name="android.intent.action.MAIN" />
33+
</intent-filter>
34+
</activity>
2335
</application>
36+
2437
</manifest>

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

Lines changed: 50 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package org.microg.nlp.backend.nominatim;
22

33
import android.content.Context;
4+
import android.content.SharedPreferences;
45
import android.content.pm.PackageManager;
56
import android.location.Address;
67
import android.net.Uri;
78
import android.os.Build;
9+
import android.preference.PreferenceManager;
810
import android.util.Log;
911

1012
import org.json.JSONArray;
@@ -21,19 +23,22 @@
2123
import java.util.ArrayList;
2224
import java.util.List;
2325
import java.util.Locale;
26+
import java.util.Objects;
2427
import java.util.concurrent.atomic.AtomicBoolean;
2528

2629
public class BackendService extends GeocoderBackendService {
27-
private static final String TAG = "NominatimGeocoderBackend";
28-
private static final String SERVICE_URL_MAPQUEST = "http://open.mapquestapi.com/nominatim/v1/";
29-
private static final String SERVICE_URL_OSM = " http://nominatim.openstreetmap.org/";
30+
private static final String TAG = "NominatimGeocoder";
31+
32+
private static final String SERVICE_URL_MAPQUEST = "https://open.mapquestapi.com/nominatim/v1";
33+
private static final String SERVICE_URL_OSM = "https://nominatim.openstreetmap.org";
34+
3035
private static final String REVERSE_GEOCODE_URL =
31-
"%sreverse?format=json&accept-language=%s&lat=%f&lon=%f";
36+
"%s/reverse?%sformat=json&accept-language=%s&lat=%f&lon=%f";
3237
private static final String SEARCH_GEOCODE_URL =
33-
"%ssearch?format=json&accept-language=%s&addressdetails=1&bounded=1&q=%s&limit=%d";
38+
"%s/search?%sformat=json&accept-language=%s&addressdetails=1&bounded=1&q=%s&limit=%d";
3439
private static final String SEARCH_GEOCODE_WITH_BOX_URL =
35-
"%ssearch?format=json&accept-language=%s&addressdetails=1&bounded=1&q=%s&limit=%d" +
36-
"&viewbox=%f,%f,%f,%f";
40+
SEARCH_GEOCODE_URL + "&viewbox=%f,%f,%f,%f";
41+
3742
private static final String WIRE_LATITUDE = "lat";
3843
private static final String WIRE_LONGITUDE = "lon";
3944
private static final String WIRE_ADDRESS = "address";
@@ -48,10 +53,40 @@ public class BackendService extends GeocoderBackendService {
4853
private static final String WIRE_COUNTRYNAME = "country";
4954
private static final String WIRE_COUNTRYCODE = "country_code";
5055

56+
private String mApiUrl;
57+
private String mAPIKey;
58+
59+
@Override
60+
public void onCreate() {
61+
super.onCreate();
62+
readPrefs();
63+
}
64+
65+
@Override
66+
protected void onOpen() {
67+
super.onOpen();
68+
readPrefs();
69+
}
70+
71+
private void readPrefs() {
72+
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
73+
74+
if (sp.getString(SettingsActivity.PrefsFragment.apiChoiceToken, "OSM").equals("OSM")) {
75+
mApiUrl = SERVICE_URL_OSM;
76+
// No API key for OSM
77+
mAPIKey = "";
78+
} else {
79+
mApiUrl = SERVICE_URL_MAPQUEST;
80+
mAPIKey = "key=" + sp.getString(SettingsActivity.PrefsFragment.mapQuestApiKeyToken, "NA")
81+
+ "&";
82+
}
83+
}
84+
85+
5186
@Override
5287
protected List<Address> getFromLocation(double latitude, double longitude, int maxResults,
5388
String locale) {
54-
String url = String.format(Locale.US, REVERSE_GEOCODE_URL, SERVICE_URL_MAPQUEST,
89+
String url = String.format(Locale.US, REVERSE_GEOCODE_URL, mApiUrl, mAPIKey,
5590
locale.split("_")[0], latitude, longitude);
5691
try {
5792
JSONObject result = new JSONObject(new AsyncGetRequest(this,
@@ -88,10 +123,10 @@ protected List<Address> getFromLocationName(String locationName, int maxResults,
88123
String url;
89124
if (lowerLeftLatitude == 0 && lowerLeftLongitude == 0 && upperRightLatitude == 0 &&
90125
upperRightLongitude == 0) {
91-
url = String.format(Locale.US, SEARCH_GEOCODE_URL, SERVICE_URL_MAPQUEST,
126+
url = String.format(Locale.US, SEARCH_GEOCODE_URL, mApiUrl, mAPIKey,
92127
locale.split("_")[0], query, maxResults);
93128
} else {
94-
url = String.format(Locale.US, SEARCH_GEOCODE_WITH_BOX_URL, SERVICE_URL_MAPQUEST,
129+
url = String.format(Locale.US, SEARCH_GEOCODE_WITH_BOX_URL, mApiUrl, mAPIKey,
95130
locale.split("_")[0], query, maxResults, lowerLeftLongitude,
96131
upperRightLatitude, upperRightLongitude, lowerLeftLatitude);
97132
}
@@ -165,8 +200,8 @@ private Address parseResponse(Locale locale, JSONObject result) throws JSONExcep
165200
}
166201

167202
private class AsyncGetRequest extends Thread {
168-
public static final String USER_AGENT = "User-Agent";
169-
public static final String USER_AGENT_TEMPLATE = "UnifiedNlp/%s (Linux; Android %s)";
203+
static final String USER_AGENT = "User-Agent";
204+
static final String USER_AGENT_TEMPLATE = "UnifiedNlp/%s (Linux; Android %s)";
170205
private final AtomicBoolean done = new AtomicBoolean(false);
171206
private final Context context;
172207
private final String url;
@@ -196,12 +231,12 @@ public void run() {
196231
}
197232
}
198233

199-
public AsyncGetRequest asyncStart() {
234+
AsyncGetRequest asyncStart() {
200235
start();
201236
return this;
202237
}
203238

204-
public byte[] retrieveAllBytes() {
239+
byte[] retrieveAllBytes() {
205240
if (!done.get()) {
206241
synchronized (done) {
207242
while (!done.get()) {
@@ -216,7 +251,7 @@ public byte[] retrieveAllBytes() {
216251
return result;
217252
}
218253

219-
public String retrieveString() {
254+
String retrieveString() {
220255
return new String(retrieveAllBytes());
221256
}
222257

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>

src/main/res/xml/preferences.xml

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
3+
4+
<ListPreference
5+
android:defaultValue="OSM"
6+
android:title="@string/choose_server"
7+
android:entries="@array/ApiChoice"
8+
android:entryValues="@array/ApiChoice"
9+
android:key="api_server_choice"
10+
/>
11+
12+
<PreferenceCategory
13+
android:key="cat_api_preference"
14+
android:title="@string/server_access">
15+
16+
<EditTextPreference
17+
android:key="api_preference"
18+
android:title="@string/api_title"
19+
android:dialogTitle="@string/api_dialog_title"
20+
android:defaultValue=""
21+
/>
22+
23+
</PreferenceCategory>
24+
25+
</PreferenceScreen>

0 commit comments

Comments
 (0)