| package org.wordpress.android.util; |
| |
| import android.content.Context; |
| import android.location.Address; |
| import android.location.Geocoder; |
| |
| import java.io.IOException; |
| import java.util.List; |
| import java.util.Locale; |
| |
| public final class GeocoderUtils { |
| private GeocoderUtils() { |
| throw new AssertionError(); |
| } |
| |
| public static Geocoder getGeocoder(Context context) { |
| // first make sure a Geocoder service exists on this device (requires API 9) |
| if (!Geocoder.isPresent()) { |
| return null; |
| } |
| |
| Geocoder gcd; |
| |
| try { |
| gcd = new Geocoder(context, LanguageUtils.getCurrentDeviceLanguage(context)); |
| } catch (NullPointerException cannotIstantiateEx) { |
| AppLog.e(AppLog.T.UTILS, "Cannot instantiate Geocoder", cannotIstantiateEx); |
| return null; |
| } |
| |
| return gcd; |
| } |
| |
| public static Address getAddressFromCoords(Context context, double latitude, double longitude) { |
| Address address = null; |
| List<Address> addresses = null; |
| |
| Geocoder gcd = getGeocoder(context); |
| |
| if (gcd == null) { |
| return null; |
| } |
| |
| try { |
| addresses = gcd.getFromLocation(latitude, longitude, 1); |
| } catch (IOException e) { |
| // may get "Unable to parse response from server" IOException here if Geocoder |
| // service is hit too frequently |
| AppLog.e(AppLog.T.UTILS, |
| "Unable to parse response from server. Is Geocoder service hitting the server too frequently?", |
| e |
| ); |
| } |
| |
| // addresses may be null or empty if network isn't connected |
| if (addresses != null && addresses.size() > 0) { |
| address = addresses.get(0); |
| } |
| |
| return address; |
| } |
| |
| public static Address getAddressFromLocationName(Context context, String locationName) { |
| int maxResults = 1; |
| Address address = null; |
| List<Address> addresses = null; |
| |
| Geocoder gcd = getGeocoder(context); |
| |
| if (gcd == null) { |
| return null; |
| } |
| |
| try { |
| addresses = gcd.getFromLocationName(locationName, maxResults); |
| } catch (IOException e) { |
| AppLog.e(AppLog.T.UTILS, "Failed to get coordinates from location", e); |
| } |
| |
| // addresses may be null or empty if network isn't connected |
| if (addresses != null && addresses.size() > 0) { |
| address = addresses.get(0); |
| } |
| |
| return address; |
| } |
| |
| public static String getLocationNameFromAddress(Address address) { |
| String locality = "", adminArea = "", country = ""; |
| if (address.getLocality() != null) { |
| locality = address.getLocality(); |
| } |
| |
| if (address.getAdminArea() != null) { |
| adminArea = address.getAdminArea(); |
| } |
| |
| if (address.getCountryName() != null) { |
| country = address.getCountryName(); |
| } |
| |
| return ((locality.equals("")) ? locality : locality + ", ") |
| + ((adminArea.equals("")) ? adminArea : adminArea + " ") + country; |
| } |
| |
| public static double[] getCoordsFromAddress(Address address) { |
| double[] coordinates = new double[2]; |
| |
| if (address.hasLatitude() && address.hasLongitude()) { |
| coordinates[0] = address.getLatitude(); |
| coordinates[1] = address.getLongitude(); |
| } |
| |
| return coordinates; |
| } |
| } |