Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixes 182 and 195 removed deprecation warnings and adds support for Android 34. #197

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions geocoding_android/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
## 3.1.0

* Fixes deprecation build warnings.
* Adds Android API 34 support.

## 3.0.0

* **BREAKING CHANGES**:
Expand Down
2 changes: 1 addition & 1 deletion geocoding_android/android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ android {
namespace("com.baseflow.geocoding")
}

compileSdkVersion 33
compileSdk 33

compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
Expand Down
1 change: 0 additions & 1 deletion geocoding_android/android/gradle.properties
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
org.gradle.jvmargs=-Xmx1536M
android.enableR8=true
android.useAndroidX=true
android.enableJetifier=true
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#Tue Jan 30 14:47:38 CET 2024
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.baseflow.geocoding;

import android.location.Address;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import java.util.List;

public interface GeocodeListenerAdapter {
void onGeocode(@Nullable List<Address> addresses);

void onError(@Nullable String errorMessage);
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,27 @@
package com.baseflow.geocoding;

import androidx.annotation.Nullable;

import android.content.Context;
import android.location.Address;
import android.location.Geocoder;
import android.os.Build;

import androidx.annotation.RequiresApi;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

/** Geocoding components to lookup address or coordinates. */

/**
* Geocoding components to lookup address or coordinates.
*/
class Geocoding {
private final Context androidContext;
@Nullable private Locale locale;
@Nullable
private Locale locale;

/**
* Uses the given {@code androidContext} to execute geocoding features
Expand All @@ -31,31 +40,92 @@ void setLocaleIdentifier(@Nullable Locale locale) {
* Returns a list of Address objects matching the supplied address string.
*
* @param address the address string for the search
* @param callback the GeocodeListenerAdapter that listens for success or error
* @return a list of Address objects. Returns null or empty list if no matches were found or there is no backend service available.
* @throws java.io.IOException if the network is unavailable or any other I/O problem occurs.
*/
List<Address> placemarkFromAddress(String address) throws IOException {

void placemarkFromAddress(String address, GeocodeListenerAdapter callback) {
final Geocoder geocoder = createGeocoder(androidContext, locale);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
getAddressesWithGeocodeListener(geocoder, address, 5, callback);
} else {
try {
List<Address> addresses = deprecatedGetFromLocationName(geocoder, address);
callback.onGeocode(addresses);
} catch (IOException ex) {
callback.onError(ex.getMessage());
}
}
}

@SuppressWarnings("deprecation")
private List<Address> deprecatedGetFromLocationName(Geocoder geocoder, String address) throws IOException {
return geocoder.getFromLocationName(address, 5);
}

@RequiresApi(api = Build.VERSION_CODES.TIRAMISU)
private void getAddressesWithGeocodeListener(Geocoder geocoder, String address, int maxResults, GeocodeListenerAdapter callback) {
geocoder.getFromLocationName(address, maxResults, new Geocoder.GeocodeListener() {
@Override
public void onGeocode(List<Address> geocodedAddresses) {
callback.onGeocode(geocodedAddresses);
}

@Override
public void onError(@Nullable String errorMessage) {
callback.onError(errorMessage);
}
});
}


/**
* Returns a list of Address objects matching the supplied coordinates.
*
* @param latitude the latitude point for the search
* @param latitude the latitude point for the search
* @param longitude the longitude point for the search
* @param callback the GeocodeListenerAdapter that listens for success or error
* @return a list of Address objects. Returns null or empty list if no matches were found or there is no backend service available.
* @throws IOException if the network is unavailable or any other I/O problem occurs.
*/
List<Address> placemarkFromCoordinates(
void placemarkFromCoordinates(
double latitude,
double longitude
) throws IOException {
double longitude,
GeocodeListenerAdapter callback
) {
final Geocoder geocoder = createGeocoder(androidContext, locale);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
getLocationWithGeocodeListener(geocoder, latitude, longitude, 5, callback);
} else {
try {
List<Address> addresses = deprecatedGetFromLocation(geocoder, latitude, longitude);
callback.onGeocode(addresses);
} catch (IOException ex) {
callback.onError(ex.getMessage());
}}
}

@SuppressWarnings("deprecation")
private List<Address> deprecatedGetFromLocation(Geocoder geocoder,
double latitude,
double longitude) throws IOException {
return geocoder.getFromLocation(latitude, longitude, 5);
}

@RequiresApi(api = Build.VERSION_CODES.TIRAMISU)
private void getLocationWithGeocodeListener(Geocoder geocoder, double latitude, double longitude, int maxResults, GeocodeListenerAdapter callback) {
geocoder.getFromLocation(latitude, longitude, maxResults, new Geocoder.GeocodeListener() {
@Override
public void onGeocode(List<Address> geocodedAddresses) {
callback.onGeocode(geocodedAddresses);
}

@Override
public void onError(@Nullable String errorMessage) {
callback.onError(errorMessage);
}
});
}

private static Geocoder createGeocoder(Context androidContext, @Nullable Locale locale) {
return (locale != null)
? new Geocoder(androidContext, locale)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@ final class MethodCallHandlerImpl implements MethodCallHandler {

@Override
public void onMethodCall(
final MethodCall call,
@NonNull final Result result
final MethodCall call,
@NonNull final Result result
) {
switch (call.method) {
case "setLocaleIdentifier":
Expand Down Expand Up @@ -111,91 +111,96 @@ private void onLocationFromAddress(MethodCall call, Result result) {
null);
}

try {
final List<Address> addresses = geocoding.placemarkFromAddress(address);
geocoding.placemarkFromAddress(address, new GeocodeListenerAdapter() {

@Override
public void onGeocode(List<Address> addresses) {
if (addresses != null && addresses.size() > 0) {
result.success(AddressMapper.toLocationHashMapList(addresses));
} else {
result.error(
"NOT_FOUND",
TimHoogstrate marked this conversation as resolved.
Show resolved Hide resolved
String.format("No coordinates found for '%s'", address),
null);
}
}

if (addresses == null || addresses.isEmpty()) {
@Override
public void onError(String errorMessage) {
result.error(
"NOT_FOUND",
String.format("No coordinates found for '%s'", address),
"IO_ERROR",
String.format(errorMessage),
null);
return;
}

result.success(AddressMapper.toLocationHashMapList(addresses));
} catch (IOException ex) {
result.error(
"IO_ERROR",
String.format("A network error occurred trying to lookup the address '%s'.", address),
null
);
}
});
}

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

if (address == null || address.isEmpty()) {
result.error(
"ARGUMENT_ERROR",
"Supply a valid value for the 'address' parameter.",
null);
"ARGUMENT_ERROR",
"Supply a valid value for the 'address' parameter.",
null);
}

try {
final List<Address> addresses = geocoding.placemarkFromAddress(address);
geocoding.placemarkFromAddress(address, new GeocodeListenerAdapter() {

@Override
public void onGeocode(List<Address> addresses) {
if (addresses != null && addresses.size() > 0) {
result.success(AddressMapper.toAddressHashMapList(addresses));
} else {
result.error(
"NOT_FOUND",
TimHoogstrate marked this conversation as resolved.
Show resolved Hide resolved
String.format("No coordinates found for '%s'", address),
null);
}
}

if (addresses == null || addresses.isEmpty()) {
@Override
public void onError(String errorMessage) {
result.error(
"NOT_FOUND",
String.format("No coordinates found for '%s'", address),
null);
return;
"IO_ERROR",
String.format(errorMessage),
null);
}

result.success(AddressMapper.toAddressHashMapList(addresses));
} catch (IOException e) {
result.error(
"IO_ERROR",
String.format("A network error occurred trying to lookup the address '%s'.", address),
null
);
}
});
}

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

try {
final List<Address> addresses = geocoding.placemarkFromCoordinates(
latitude,
longitude);

if (addresses == null || addresses.isEmpty()) {
result.error(
"NOT_FOUND",
String.format(
Locale.ENGLISH,
"No address information found for supplied coordinates (latitude: %f, longitude: %f).",
latitude,
longitude
),
null);
return;
}
result.success(AddressMapper.toAddressHashMapList(addresses));
} catch (IOException ex) {
result.error(
"IO_ERROR",
String.format(
Locale.ENGLISH,
"A network error occurred trying to lookup the supplied coordinates (latitude: %f, longitude: %f).",
latitude,
longitude
),
null
);
}
geocoding.placemarkFromCoordinates(
latitude,
longitude, new GeocodeListenerAdapter() {

@Override
public void onGeocode(List<Address> addresses) {
if (addresses != null && addresses.size() > 0) {
result.success(AddressMapper.toAddressHashMapList(addresses));
} else {
result.error(
"NOT_FOUND",
TimHoogstrate marked this conversation as resolved.
Show resolved Hide resolved
String.format(
Locale.ENGLISH,
"No address information found for supplied coordinates (latitude: %f, longitude: %f).",
latitude,
longitude
),
null);
}
}

@Override
public void onError(String errorMessage) {
result.error(
"IO_ERROR",
String.format(errorMessage),
null);
}
});
}
}
2 changes: 1 addition & 1 deletion geocoding_android/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: geocoding_android
description: A Flutter Geocoding plugin which provides easy geocoding and reverse-geocoding features.
version: 3.0.0
version: 3.1.0
repository: https://github.com/baseflow/flutter-geocoding/tree/main/geocoding_android
issue_tracker: https://github.com/Baseflow/flutter-geocoding/issues

Expand Down