Skip to content

Commit be37c6f

Browse files
Fixes 182 and 195 removed deprecation warnings and adds support for Android 34. (#197)
* Fixes 182 and removed deprecation warnings. Upgrades compileSDKVersion * Implemented error states * Updated changelog * Update MethodCallHandlerImpl.java * fix formatting * Update MethodCallHandlerImpl.java * Update geocoding_android/android/src/main/java/com/baseflow/geocoding/MethodCallHandlerImpl.java Co-authored-by: Maurits van Beusekom <maurits@baseflow.com> * Update geocoding_android/android/src/main/java/com/baseflow/geocoding/GeocodeListenerAdapter.java Co-authored-by: Maurits van Beusekom <maurits@baseflow.com> * Update geocoding_android/android/src/main/java/com/baseflow/geocoding/MethodCallHandlerImpl.java Co-authored-by: Maurits van Beusekom <maurits@baseflow.com> * Update geocoding_android/android/src/main/java/com/baseflow/geocoding/MethodCallHandlerImpl.java Co-authored-by: Maurits van Beusekom <maurits@baseflow.com> * Isolated deprecated code --------- Co-authored-by: Maurits van Beusekom <maurits@baseflow.com>
1 parent 1738a02 commit be37c6f

File tree

8 files changed

+174
-80
lines changed

8 files changed

+174
-80
lines changed

geocoding_android/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## 3.1.0
2+
3+
* Fixes deprecation build warnings.
4+
* Adds Android API 34 support.
5+
16
## 3.0.0
27

38
* **BREAKING CHANGES**:

geocoding_android/android/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ android {
2626
namespace("com.baseflow.geocoding")
2727
}
2828

29-
compileSdkVersion 33
29+
compileSdk 33
3030

3131
compileOptions {
3232
sourceCompatibility JavaVersion.VERSION_1_8
Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
11
org.gradle.jvmargs=-Xmx1536M
2-
android.enableR8=true
32
android.useAndroidX=true
43
android.enableJetifier=true

geocoding_android/android/gradle/wrapper/gradle-wrapper.properties

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1+
#Tue Jan 30 14:47:38 CET 2024
12
distributionBase=GRADLE_USER_HOME
23
distributionPath=wrapper/dists
4+
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
35
zipStoreBase=GRADLE_USER_HOME
46
zipStorePath=wrapper/dists
5-
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.baseflow.geocoding;
2+
3+
import android.location.Address;
4+
5+
import androidx.annotation.NonNull;
6+
import androidx.annotation.Nullable;
7+
8+
import java.util.List;
9+
10+
public interface GeocodeListenerAdapter {
11+
void onGeocode(@Nullable List<Address> addresses);
12+
13+
void onError(@Nullable String errorMessage);
14+
}

geocoding_android/android/src/main/java/com/baseflow/geocoding/Geocoding.java

Lines changed: 80 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,27 @@
11
package com.baseflow.geocoding;
22

33
import androidx.annotation.Nullable;
4+
45
import android.content.Context;
56
import android.location.Address;
67
import android.location.Geocoder;
8+
import android.os.Build;
9+
10+
import androidx.annotation.RequiresApi;
711

812
import java.io.IOException;
13+
import java.util.ArrayList;
914
import java.util.List;
1015
import java.util.Locale;
1116

12-
/** Geocoding components to lookup address or coordinates. */
17+
18+
/**
19+
* Geocoding components to lookup address or coordinates.
20+
*/
1321
class Geocoding {
1422
private final Context androidContext;
15-
@Nullable private Locale locale;
23+
@Nullable
24+
private Locale locale;
1625

1726
/**
1827
* Uses the given {@code androidContext} to execute geocoding features
@@ -31,31 +40,92 @@ void setLocaleIdentifier(@Nullable Locale locale) {
3140
* Returns a list of Address objects matching the supplied address string.
3241
*
3342
* @param address the address string for the search
43+
* @param callback the GeocodeListenerAdapter that listens for success or error
3444
* @return a list of Address objects. Returns null or empty list if no matches were found or there is no backend service available.
35-
* @throws java.io.IOException if the network is unavailable or any other I/O problem occurs.
3645
*/
37-
List<Address> placemarkFromAddress(String address) throws IOException {
38-
46+
void placemarkFromAddress(String address, GeocodeListenerAdapter callback) {
3947
final Geocoder geocoder = createGeocoder(androidContext, locale);
48+
49+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
50+
getAddressesWithGeocodeListener(geocoder, address, 5, callback);
51+
} else {
52+
try {
53+
List<Address> addresses = deprecatedGetFromLocationName(geocoder, address);
54+
callback.onGeocode(addresses);
55+
} catch (IOException ex) {
56+
callback.onError(ex.getMessage());
57+
}
58+
}
59+
}
60+
61+
@SuppressWarnings("deprecation")
62+
private List<Address> deprecatedGetFromLocationName(Geocoder geocoder, String address) throws IOException {
4063
return geocoder.getFromLocationName(address, 5);
4164
}
4265

66+
@RequiresApi(api = Build.VERSION_CODES.TIRAMISU)
67+
private void getAddressesWithGeocodeListener(Geocoder geocoder, String address, int maxResults, GeocodeListenerAdapter callback) {
68+
geocoder.getFromLocationName(address, maxResults, new Geocoder.GeocodeListener() {
69+
@Override
70+
public void onGeocode(List<Address> geocodedAddresses) {
71+
callback.onGeocode(geocodedAddresses);
72+
}
73+
74+
@Override
75+
public void onError(@Nullable String errorMessage) {
76+
callback.onError(errorMessage);
77+
}
78+
});
79+
}
80+
81+
4382
/**
4483
* Returns a list of Address objects matching the supplied coordinates.
4584
*
46-
* @param latitude the latitude point for the search
85+
* @param latitude the latitude point for the search
4786
* @param longitude the longitude point for the search
87+
* @param callback the GeocodeListenerAdapter that listens for success or error
4888
* @return a list of Address objects. Returns null or empty list if no matches were found or there is no backend service available.
49-
* @throws IOException if the network is unavailable or any other I/O problem occurs.
5089
*/
51-
List<Address> placemarkFromCoordinates(
90+
void placemarkFromCoordinates(
5291
double latitude,
53-
double longitude
54-
) throws IOException {
92+
double longitude,
93+
GeocodeListenerAdapter callback
94+
) {
5595
final Geocoder geocoder = createGeocoder(androidContext, locale);
96+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
97+
getLocationWithGeocodeListener(geocoder, latitude, longitude, 5, callback);
98+
} else {
99+
try {
100+
List<Address> addresses = deprecatedGetFromLocation(geocoder, latitude, longitude);
101+
callback.onGeocode(addresses);
102+
} catch (IOException ex) {
103+
callback.onError(ex.getMessage());
104+
}}
105+
}
106+
107+
@SuppressWarnings("deprecation")
108+
private List<Address> deprecatedGetFromLocation(Geocoder geocoder,
109+
double latitude,
110+
double longitude) throws IOException {
56111
return geocoder.getFromLocation(latitude, longitude, 5);
57112
}
58113

114+
@RequiresApi(api = Build.VERSION_CODES.TIRAMISU)
115+
private void getLocationWithGeocodeListener(Geocoder geocoder, double latitude, double longitude, int maxResults, GeocodeListenerAdapter callback) {
116+
geocoder.getFromLocation(latitude, longitude, maxResults, new Geocoder.GeocodeListener() {
117+
@Override
118+
public void onGeocode(List<Address> geocodedAddresses) {
119+
callback.onGeocode(geocodedAddresses);
120+
}
121+
122+
@Override
123+
public void onError(@Nullable String errorMessage) {
124+
callback.onError(errorMessage);
125+
}
126+
});
127+
}
128+
59129
private static Geocoder createGeocoder(Context androidContext, @Nullable Locale locale) {
60130
return (locale != null)
61131
? new Geocoder(androidContext, locale)

geocoding_android/android/src/main/java/com/baseflow/geocoding/MethodCallHandlerImpl.java

Lines changed: 71 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ final class MethodCallHandlerImpl implements MethodCallHandler {
3939

4040
@Override
4141
public void onMethodCall(
42-
final MethodCall call,
43-
@NonNull final Result result
42+
final MethodCall call,
43+
@NonNull final Result result
4444
) {
4545
switch (call.method) {
4646
case "setLocaleIdentifier":
@@ -111,91 +111,96 @@ private void onLocationFromAddress(MethodCall call, Result result) {
111111
null);
112112
}
113113

114-
try {
115-
final List<Address> addresses = geocoding.placemarkFromAddress(address);
114+
geocoding.placemarkFromAddress(address, new GeocodeListenerAdapter() {
115+
116+
@Override
117+
public void onGeocode(List<Address> addresses) {
118+
if (addresses != null && addresses.size() > 0) {
119+
result.success(AddressMapper.toLocationHashMapList(addresses));
120+
} else {
121+
result.error(
122+
"NOT_FOUND",
123+
String.format("No coordinates found for '%s'", address),
124+
null);
125+
}
126+
}
116127

117-
if (addresses == null || addresses.isEmpty()) {
128+
@Override
129+
public void onError(String errorMessage) {
118130
result.error(
119-
"NOT_FOUND",
120-
String.format("No coordinates found for '%s'", address),
131+
"IO_ERROR",
132+
String.format(errorMessage),
121133
null);
122-
return;
123134
}
124-
125-
result.success(AddressMapper.toLocationHashMapList(addresses));
126-
} catch (IOException ex) {
127-
result.error(
128-
"IO_ERROR",
129-
String.format("A network error occurred trying to lookup the address '%s'.", address),
130-
null
131-
);
132-
}
135+
});
133136
}
134137

135138
private void onPlacemarkFromAddress(final MethodCall call, final Result result) {
136139
final String address = call.argument("address");
137140

138141
if (address == null || address.isEmpty()) {
139142
result.error(
140-
"ARGUMENT_ERROR",
141-
"Supply a valid value for the 'address' parameter.",
142-
null);
143+
"ARGUMENT_ERROR",
144+
"Supply a valid value for the 'address' parameter.",
145+
null);
143146
}
144147

145-
try {
146-
final List<Address> addresses = geocoding.placemarkFromAddress(address);
148+
geocoding.placemarkFromAddress(address, new GeocodeListenerAdapter() {
149+
150+
@Override
151+
public void onGeocode(List<Address> addresses) {
152+
if (addresses != null && addresses.size() > 0) {
153+
result.success(AddressMapper.toAddressHashMapList(addresses));
154+
} else {
155+
result.error(
156+
"NOT_FOUND",
157+
String.format("No coordinates found for '%s'", address),
158+
null);
159+
}
160+
}
147161

148-
if (addresses == null || addresses.isEmpty()) {
162+
@Override
163+
public void onError(String errorMessage) {
149164
result.error(
150-
"NOT_FOUND",
151-
String.format("No coordinates found for '%s'", address),
152-
null);
153-
return;
165+
"IO_ERROR",
166+
String.format(errorMessage),
167+
null);
154168
}
155-
156-
result.success(AddressMapper.toAddressHashMapList(addresses));
157-
} catch (IOException e) {
158-
result.error(
159-
"IO_ERROR",
160-
String.format("A network error occurred trying to lookup the address '%s'.", address),
161-
null
162-
);
163-
}
169+
});
164170
}
165171

166172
private void onPlacemarkFromCoordinates(final MethodCall call, final Result result) {
167173
final double latitude = call.argument("latitude");
168174
final double longitude = call.argument("longitude");
169175

170-
try {
171-
final List<Address> addresses = geocoding.placemarkFromCoordinates(
172-
latitude,
173-
longitude);
174-
175-
if (addresses == null || addresses.isEmpty()) {
176-
result.error(
177-
"NOT_FOUND",
178-
String.format(
179-
Locale.ENGLISH,
180-
"No address information found for supplied coordinates (latitude: %f, longitude: %f).",
181-
latitude,
182-
longitude
183-
),
184-
null);
185-
return;
186-
}
187-
result.success(AddressMapper.toAddressHashMapList(addresses));
188-
} catch (IOException ex) {
189-
result.error(
190-
"IO_ERROR",
191-
String.format(
192-
Locale.ENGLISH,
193-
"A network error occurred trying to lookup the supplied coordinates (latitude: %f, longitude: %f).",
194-
latitude,
195-
longitude
196-
),
197-
null
198-
);
199-
}
176+
geocoding.placemarkFromCoordinates(
177+
latitude,
178+
longitude, new GeocodeListenerAdapter() {
179+
180+
@Override
181+
public void onGeocode(List<Address> addresses) {
182+
if (addresses != null && addresses.size() > 0) {
183+
result.success(AddressMapper.toAddressHashMapList(addresses));
184+
} else {
185+
result.error(
186+
"NOT_FOUND",
187+
String.format(
188+
Locale.ENGLISH,
189+
"No address information found for supplied coordinates (latitude: %f, longitude: %f).",
190+
latitude,
191+
longitude
192+
),
193+
null);
194+
}
195+
}
196+
197+
@Override
198+
public void onError(String errorMessage) {
199+
result.error(
200+
"IO_ERROR",
201+
String.format(errorMessage),
202+
null);
203+
}
204+
});
200205
}
201206
}

geocoding_android/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: geocoding_android
22
description: A Flutter Geocoding plugin which provides easy geocoding and reverse-geocoding features.
3-
version: 3.0.0
3+
version: 3.1.0
44
repository: https://github.com/baseflow/flutter-geocoding/tree/main/geocoding_android
55
issue_tracker: https://github.com/Baseflow/flutter-geocoding/issues
66

0 commit comments

Comments
 (0)