From e21879756b4e36b9f7f59ed108782cb7f91bc761 Mon Sep 17 00:00:00 2001 From: y20k Date: Mon, 29 Aug 2016 21:43:49 +0200 Subject: [PATCH] older locations fixes are now grey (my location) - refining the locations tracking. - some logging statements for debugging --- .../y20k/trackbook/MainActivityFragment.java | 50 ++++++++++++------- .../org/y20k/trackbook/TrackerService.java | 23 ++++++--- .../trackbook/helpers/LocationHelper.java | 39 ++++++++++++--- .../org/y20k/trackbook/helpers/MapHelper.java | 10 +++- .../ic_my_loacation_dot_blue_24dp.xml | 5 -- .../drawable/ic_my_location_dot_blue_24dp.xml | 13 +++++ .../drawable/ic_my_location_dot_grey_24dp.xml | 13 +++++ app/src/main/res/values/colors.xml | 4 ++ app/src/main/res/values/strings.xml | 1 + 9 files changed, 118 insertions(+), 40 deletions(-) delete mode 100644 app/src/main/res/drawable/ic_my_loacation_dot_blue_24dp.xml create mode 100644 app/src/main/res/drawable/ic_my_location_dot_blue_24dp.xml create mode 100644 app/src/main/res/drawable/ic_my_location_dot_grey_24dp.xml diff --git a/app/src/main/java/org/y20k/trackbook/MainActivityFragment.java b/app/src/main/java/org/y20k/trackbook/MainActivityFragment.java index 49a1e4e..e7b840c 100644 --- a/app/src/main/java/org/y20k/trackbook/MainActivityFragment.java +++ b/app/src/main/java/org/y20k/trackbook/MainActivityFragment.java @@ -60,12 +60,11 @@ public class MainActivityFragment extends Fragment implements TrackbookKeys { private Activity mActivity; private MapView mMapView; private IMapController mController; - private CompassOverlay mCompassOverlay = null; private LocationManager mLocationManager; private LocationListener mGPSListener; private LocationListener mNetworkListener; - private Location mCurrentBestLocation; private ItemizedIconOverlay mMyLocationOverlay; + private Location mCurrentBestLocation; /* Constructor (default) */ @@ -86,14 +85,28 @@ public class MainActivityFragment extends Fragment implements TrackbookKeys { // acquire reference to Location Manager mLocationManager = (LocationManager) mActivity.getSystemService(Context.LOCATION_SERVICE); - // get last know location - List locationProviders = mLocationManager.getProviders(true); - if (locationProviders.size() > 0) { - mCurrentBestLocation = LocationHelper.determineLastKnownLocation(mLocationManager); - } else { + // check if location services are available + if (mLocationManager.getProviders(true).size() == 0) { + // ask user to turn on location services promptUserForLocation(); } + // CASE 1: get saved location if possible + if (savedInstanceState != null) { + Location savedLocation = savedInstanceState.getParcelable(INSTANCE_CURRENT_LOCATION); + // check if saved location is still current + if (LocationHelper.isNewLocation(savedLocation)) { + mCurrentBestLocation = savedLocation; + } else { + mCurrentBestLocation = null; + } + } + + // CASE 2: get last known location if no saved location or saved location is too old + if (mCurrentBestLocation == null && mLocationManager.getProviders(true).size() > 0) { + mCurrentBestLocation = LocationHelper.determineLastKnownLocation(mLocationManager); + } + } @@ -131,13 +144,13 @@ public class MainActivityFragment extends Fragment implements TrackbookKeys { } // add compass to map - mCompassOverlay = new CompassOverlay(mActivity, new InternalCompassOrientationProvider(mActivity), mMapView); - mCompassOverlay.enableCompass(); - mMapView.getOverlays().add(mCompassOverlay); + CompassOverlay compassOverlay = new CompassOverlay(mActivity, new InternalCompassOrientationProvider(mActivity), mMapView); + compassOverlay.enableCompass(); + mMapView.getOverlays().add(compassOverlay); // mark user's location on map if (mCurrentBestLocation != null) { - mMyLocationOverlay = MapHelper.createMyLocationOverlay(mActivity, mCurrentBestLocation); + mMyLocationOverlay = MapHelper.createMyLocationOverlay(mActivity, mCurrentBestLocation, LocationHelper.isNewLocation(mCurrentBestLocation)); mMapView.getOverlays().add(mMyLocationOverlay); } @@ -205,7 +218,7 @@ public class MainActivityFragment extends Fragment implements TrackbookKeys { // mark user's new location on map and remove last marker mMapView.getOverlays().remove(mMyLocationOverlay); - mMyLocationOverlay = MapHelper.createMyLocationOverlay(mActivity, mCurrentBestLocation); + mMyLocationOverlay = MapHelper.createMyLocationOverlay(mActivity, mCurrentBestLocation, LocationHelper.isNewLocation(mCurrentBestLocation)); mMapView.getOverlays().add(mMyLocationOverlay); return true; @@ -232,8 +245,11 @@ public class MainActivityFragment extends Fragment implements TrackbookKeys { private void startFindingLocation() { // listener that responds to location updates - mGPSListener = createLocationsListener(); - mNetworkListener = createLocationsListener(); + mGPSListener = createLocationListener(); + mNetworkListener = createLocationListener(); + + // inform user that Trackbook is getting location updates + Toast.makeText(mActivity, mActivity.getString(R.string.toast_message_acquiring_location), Toast.LENGTH_LONG).show(); // start listener List locationProviders = mLocationManager.getProviders(true); @@ -280,17 +296,17 @@ public class MainActivityFragment extends Fragment implements TrackbookKeys { /* Creates listener for changes in location status */ - private LocationListener createLocationsListener() { + private LocationListener createLocationListener() { return new LocationListener() { public void onLocationChanged(Location location) { // check if the new location is better if (LocationHelper.isBetterLocation(location, mCurrentBestLocation)) { // save location mCurrentBestLocation = location; - + LogHelper.v(LOG_TAG, "Location isBetterLocation(!): " + location.getProvider()); // TODO remove // mark user's new location on map and remove last marker mMapView.getOverlays().remove(mMyLocationOverlay); - mMyLocationOverlay = MapHelper.createMyLocationOverlay(mActivity, mCurrentBestLocation); + mMyLocationOverlay = MapHelper.createMyLocationOverlay(mActivity, mCurrentBestLocation, LocationHelper.isNewLocation(mCurrentBestLocation)); mMapView.getOverlays().add(mMyLocationOverlay); } } diff --git a/app/src/main/java/org/y20k/trackbook/TrackerService.java b/app/src/main/java/org/y20k/trackbook/TrackerService.java index 1aaef13..3d2cf8e 100644 --- a/app/src/main/java/org/y20k/trackbook/TrackerService.java +++ b/app/src/main/java/org/y20k/trackbook/TrackerService.java @@ -37,8 +37,6 @@ import org.y20k.trackbook.helpers.TrackbookKeys; */ public class TrackerService extends Service implements TrackbookKeys { - // TODO study this https://developer.android.com/guide/topics/location/strategies.html - /* Define log tag */ private static final String LOG_TAG = TrackerService.class.getSimpleName(); @@ -91,10 +89,11 @@ public class TrackerService extends Service implements TrackbookKeys { } }; - - mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mLocationListener); - - + try { + mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mLocationListener); + } catch (SecurityException e) { + e.printStackTrace(); + } mTimer = new CountDownTimer(CONSTANT_MAXIMAL_DURATION, CONSTANT_TRACKING_INTERVAL) { @Override @@ -113,7 +112,11 @@ public class TrackerService extends Service implements TrackbookKeys { // ACTION STOP else if (intent.getAction().equals(ACTION_STOP)) { // Remove the listener you previously added - mLocationManager.removeUpdates(mLocationListener); + try { + mLocationManager.removeUpdates(mLocationListener); + } catch (SecurityException e) { + e.printStackTrace(); + } Log.v(LOG_TAG, "Service received command: STOP"); } @@ -136,7 +139,11 @@ public class TrackerService extends Service implements TrackbookKeys { Log.v(LOG_TAG, "onDestroy called."); // Remove the listener you previously added - mLocationManager.removeUpdates(mLocationListener); + try { + mLocationManager.removeUpdates(mLocationListener); + } catch (SecurityException e) { + e.printStackTrace(); + } // cancel notification stopForeground(true); diff --git a/app/src/main/java/org/y20k/trackbook/helpers/LocationHelper.java b/app/src/main/java/org/y20k/trackbook/helpers/LocationHelper.java index 8b4b149..31106b5 100644 --- a/app/src/main/java/org/y20k/trackbook/helpers/LocationHelper.java +++ b/app/src/main/java/org/y20k/trackbook/helpers/LocationHelper.java @@ -18,6 +18,7 @@ package org.y20k.trackbook.helpers; import android.location.Location; import android.location.LocationManager; +import android.os.SystemClock; import java.util.List; @@ -27,8 +28,13 @@ import java.util.List; */ public final class LocationHelper { + /* Define log tag */ + private static final String LOG_TAG = LocationHelper.class.getSimpleName(); + + /* Main class variables */ - private static final int TWO_MINUTES = 1000 * 60 * 2; +// private static final int TWO_MINUTES = 1000 * 1000 * 60 * 2; + private static final long TWO_MINUTES = 2L * 60000000000L; // 5 minutes /* Determines last known location */ @@ -64,12 +70,13 @@ public final class LocationHelper { } // return best estimate location - if (isBetterLocation(gpsLocation, networkLocation)) { - return gpsLocation; - } else { + if (isBetterLocation(networkLocation, gpsLocation)) { + LogHelper.v(LOG_TAG, "Best last known location came from: " + networkLocation.getProvider()); // TODO remove return networkLocation; + } else { + LogHelper.v(LOG_TAG, "Best last known location came from: " + gpsLocation.getProvider()); // TODO remove + return gpsLocation; } - } @@ -83,15 +90,17 @@ public final class LocationHelper { } // check whether the new location fix is newer or older - long timeDelta = location.getTime() - currentBestLocation.getTime(); + long timeDelta = location.getElapsedRealtimeNanos() - currentBestLocation.getElapsedRealtimeNanos(); boolean isSignificantlyNewer = timeDelta > TWO_MINUTES; boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES; boolean isNewer = timeDelta > 0; // if it's been more than two minutes since the current location, use the new location because the user has likely moved if (isSignificantlyNewer) { + LogHelper.v(LOG_TAG, "Location isSignificantlyNewer: " + location.getProvider()); // TODO remove return true; } else if (isSignificantlyOlder) { + LogHelper.v(LOG_TAG, "Location isSignificantlyOlder: " + location.getProvider()); // TODO remove return false; } @@ -102,21 +111,35 @@ public final class LocationHelper { boolean isSignificantlyLessAccurate = accuracyDelta > 200; // check if the old and new location are from the same provider - boolean isFromSameProvider = isSameProvider(location.getProvider(), - currentBestLocation.getProvider()); + boolean isFromSameProvider = isSameProvider(location.getProvider(), currentBestLocation.getProvider()); // determine location quality using a combination of timeliness and accuracy if (isMoreAccurate) { + LogHelper.v(LOG_TAG, "Location isMoreAccurate: " + location.getProvider()); // TODO remove return true; } else if (isNewer && !isLessAccurate) { + LogHelper.v(LOG_TAG, "Location isNewer && !isLessAccurate: " + location.getProvider()); // TODO remove return true; } else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) { + LogHelper.v(LOG_TAG, "Location isNewer && !isSignificantlyLessAccurate && isFromSameProvider: " + location.getProvider()); // TODO remove return true; } + LogHelper.v(LOG_TAG, "Location is not better: " + location.getProvider()); // TODO remove return false; } + /* Checks if given location is newer than two minutes */ + public static boolean isNewLocation(Location location) { + if (location == null) { + return false; + } else { + long locationTime = SystemClock.elapsedRealtimeNanos() - location.getElapsedRealtimeNanos(); + return locationTime < TWO_MINUTES; + } + } + + /* Checks whether two location providers are the same */ private static boolean isSameProvider(String provider1, String provider2) { // credit: the isSameProvider method was sample code from: https://developer.android.com/guide/topics/location/strategies.html diff --git a/app/src/main/java/org/y20k/trackbook/helpers/MapHelper.java b/app/src/main/java/org/y20k/trackbook/helpers/MapHelper.java index bd069ac..ff98d58 100644 --- a/app/src/main/java/org/y20k/trackbook/helpers/MapHelper.java +++ b/app/src/main/java/org/y20k/trackbook/helpers/MapHelper.java @@ -39,13 +39,19 @@ public final class MapHelper { /* Creates icon overlay for current position */ - public static ItemizedIconOverlay createMyLocationOverlay(Context context, Location currentBestLocation) { + public static ItemizedIconOverlay createMyLocationOverlay(Context context, Location currentBestLocation, boolean locationIsNew) { final GeoPoint position = new GeoPoint(currentBestLocation.getLatitude(), currentBestLocation.getLongitude()); final ArrayList overlayItems = new ArrayList<>(); + LogHelper.v(LOG_TAG, "Location is new? " + locationIsNew + " Provider: " + currentBestLocation.getProvider()); // TODO remove // create marker - Drawable newMarker = AppCompatDrawableManager.get().getDrawable(context, R.drawable.ic_my_loacation_dot_blue_24dp); + Drawable newMarker; + if (locationIsNew) { + newMarker = AppCompatDrawableManager.get().getDrawable(context, R.drawable.ic_my_location_dot_blue_24dp); + } else { + newMarker = AppCompatDrawableManager.get().getDrawable(context, R.drawable.ic_my_location_dot_grey_24dp); + } OverlayItem overlayItem = new OverlayItem(context.getString(R.string.marker_my_location_title), context.getString(R.string.marker_my_location_description), position); overlayItem.setMarker(newMarker); overlayItems.add(overlayItem); diff --git a/app/src/main/res/drawable/ic_my_loacation_dot_blue_24dp.xml b/app/src/main/res/drawable/ic_my_loacation_dot_blue_24dp.xml deleted file mode 100644 index ecf4b25..0000000 --- a/app/src/main/res/drawable/ic_my_loacation_dot_blue_24dp.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable/ic_my_location_dot_blue_24dp.xml b/app/src/main/res/drawable/ic_my_location_dot_blue_24dp.xml new file mode 100644 index 0000000..730c19e --- /dev/null +++ b/app/src/main/res/drawable/ic_my_location_dot_blue_24dp.xml @@ -0,0 +1,13 @@ + + + + diff --git a/app/src/main/res/drawable/ic_my_location_dot_grey_24dp.xml b/app/src/main/res/drawable/ic_my_location_dot_grey_24dp.xml new file mode 100644 index 0000000..95a2828 --- /dev/null +++ b/app/src/main/res/drawable/ic_my_location_dot_grey_24dp.xml @@ -0,0 +1,13 @@ + + + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 8f686fc..b6a17ce 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -9,4 +9,8 @@ #FFFFFFFF + #FF607d8b + + #FF455a64 + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 54b51a6..50fee6e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -14,6 +14,7 @@ Permissions granted. Unable to start Trackbook. Location is turned off. + Acquiring current location. My Location.