| //This Handy-Dandy class acquired and tweaked from http://stackoverflow.com/a/3145655/309558 |
| package org.wordpress.android.util.helpers; |
| |
| import android.annotation.SuppressLint; |
| import android.app.Activity; |
| import android.content.Context; |
| import android.location.Location; |
| import android.location.LocationListener; |
| import android.location.LocationManager; |
| import android.os.Bundle; |
| |
| import java.util.Timer; |
| import java.util.TimerTask; |
| |
| public class LocationHelper { |
| Timer mTimer; |
| LocationManager mLocationManager; |
| LocationResult mLocationResult; |
| boolean mGpsEnabled = false; |
| boolean mNetworkEnabled = false; |
| |
| @SuppressLint("MissingPermission") |
| public boolean getLocation(Activity activity, LocationResult result) { |
| mLocationResult = result; |
| if (mLocationManager == null) { |
| mLocationManager = (LocationManager) activity.getSystemService(Context.LOCATION_SERVICE); |
| } |
| |
| // exceptions will be thrown if provider is not permitted. |
| try { |
| mGpsEnabled = mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); |
| } catch (Exception ex) { |
| } |
| try { |
| mNetworkEnabled = mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); |
| } catch (Exception ex) { |
| } |
| |
| // don't start listeners if no provider is enabled |
| if (!mGpsEnabled && !mNetworkEnabled) { |
| return false; |
| } |
| |
| if (mGpsEnabled) { |
| mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps); |
| } |
| |
| if (mNetworkEnabled) { |
| mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNetwork); |
| } |
| |
| mTimer = new Timer(); |
| mTimer.schedule(new GetLastLocation(), 30000); |
| return true; |
| } |
| |
| LocationListener locationListenerGps = new LocationListener() { |
| @SuppressLint("MissingPermission") |
| public void onLocationChanged(Location location) { |
| mTimer.cancel(); |
| mLocationResult.gotLocation(location); |
| mLocationManager.removeUpdates(this); |
| mLocationManager.removeUpdates(locationListenerNetwork); |
| } |
| |
| public void onProviderDisabled(String provider) { |
| } |
| |
| public void onProviderEnabled(String provider) { |
| } |
| |
| public void onStatusChanged(String provider, int status, Bundle extras) { |
| } |
| }; |
| |
| LocationListener locationListenerNetwork = new LocationListener() { |
| @SuppressLint("MissingPermission") |
| public void onLocationChanged(Location location) { |
| mTimer.cancel(); |
| mLocationResult.gotLocation(location); |
| mLocationManager.removeUpdates(this); |
| mLocationManager.removeUpdates(locationListenerGps); |
| } |
| |
| public void onProviderDisabled(String provider) { |
| } |
| |
| public void onProviderEnabled(String provider) { |
| } |
| |
| public void onStatusChanged(String provider, int status, Bundle extras) { |
| } |
| }; |
| |
| class GetLastLocation extends TimerTask { |
| @Override |
| @SuppressLint("MissingPermission") |
| public void run() { |
| mLocationManager.removeUpdates(locationListenerGps); |
| mLocationManager.removeUpdates(locationListenerNetwork); |
| |
| Location net_loc = null, gps_loc = null; |
| if (mGpsEnabled) { |
| gps_loc = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); |
| } |
| if (mNetworkEnabled) { |
| net_loc = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); |
| } |
| |
| // if there are both values use the latest one |
| if (gps_loc != null && net_loc != null) { |
| if (gps_loc.getTime() > net_loc.getTime()) { |
| mLocationResult.gotLocation(gps_loc); |
| } else { |
| mLocationResult.gotLocation(net_loc); |
| } |
| return; |
| } |
| |
| if (gps_loc != null) { |
| mLocationResult.gotLocation(gps_loc); |
| return; |
| } |
| if (net_loc != null) { |
| mLocationResult.gotLocation(net_loc); |
| return; |
| } |
| mLocationResult.gotLocation(null); |
| } |
| } |
| |
| public static abstract class LocationResult { |
| public abstract void gotLocation(Location location); |
| } |
| |
| @SuppressLint("MissingPermission") |
| public void cancelTimer() { |
| if (mTimer != null) { |
| mTimer.cancel(); |
| mLocationManager.removeUpdates(locationListenerGps); |
| mLocationManager.removeUpdates(locationListenerNetwork); |
| } |
| } |
| } |