diff --git a/app/src/main/java/net/osmtracker/activity/DisplayTrackMap.java b/app/src/main/java/net/osmtracker/activity/DisplayTrackMap.java
index 2d178e419..5ba576001 100644
--- a/app/src/main/java/net/osmtracker/activity/DisplayTrackMap.java
+++ b/app/src/main/java/net/osmtracker/activity/DisplayTrackMap.java
@@ -1,6 +1,5 @@
package net.osmtracker.activity;
-import android.app.Activity;
import android.content.ContentUris;
import android.content.Intent;
import android.content.SharedPreferences;
@@ -12,18 +11,24 @@
import android.os.Handler;
import android.util.DisplayMetrics;
import android.util.Log;
+import android.view.View;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.MotionEvent;
+import android.widget.ImageView;
import androidx.preference.PreferenceManager;
import net.osmtracker.OSMTracker;
import net.osmtracker.R;
+import net.osmtracker.db.DataHelper;
import net.osmtracker.db.TrackContentProvider;
import net.osmtracker.overlay.WayPointsOverlay;
import net.osmtracker.overlay.Polylines;
+import net.osmtracker.service.gps.GPSLoggerConnectionListener;
+import net.osmtracker.service.gps.GPSLoggerServiceConnection;
+import net.osmtracker.service.gps.GPSLogger;
import org.osmdroid.api.IMapController;
import org.osmdroid.config.Configuration;
@@ -50,7 +55,7 @@
* @author Viesturs Zarins
*
*/
-public class DisplayTrackMap extends Activity {
+public class DisplayTrackMap extends GPSLoggerConnectionListener {
private static final String TAG = DisplayTrackMap.class.getSimpleName();
@@ -146,6 +151,11 @@ public class DisplayTrackMap extends Activity {
*/
private boolean zoomedToTrackAlready = false;
+ /**
+ * Are we currently tracking?
+ */
+ private boolean isTracking;
+
/**
* the last position we know
*/
@@ -173,6 +183,75 @@ public class DisplayTrackMap extends Activity {
*/
private SharedPreferences prefs = null;
+ private ImageView startStopButton = null;
+
+ private GPSLogger gpsLogger;
+
+ private GPSLoggerServiceConnection gpsLoggerConnection;
+
+ private synchronized GPSLoggerServiceConnection getGpsLoggerConnection() {
+ if(gpsLoggerConnection == null)
+ gpsLoggerConnection = new GPSLoggerServiceConnection(this);
+ return gpsLoggerConnection;
+ }
+
+ private synchronized void unbindGpsLoggerConnection() {
+ if(gpsLoggerConnection != null) {
+ unbindService(gpsLoggerConnection);
+ gpsLoggerConnection=null;
+ }
+ }
+
+ @Override
+ public long getCurrentTrackId() {
+ return currentTrackId;
+ }
+
+ @Override
+ public void setGpsLogger(GPSLogger l) {
+ gpsLogger = l;
+ if(l == null)
+ isTracking = false;
+ updateTrackingIcon();
+ }
+
+ private boolean isTracking() {
+ if(gpsLogger != null &&
+ gpsLogger.isTracking())
+ isTracking = true;
+ return isTracking;
+ }
+
+ private void updateTrackingIcon() {
+ if(startStopButton != null)
+ startStopButton.setImageResource(isTracking() ?
+ R.drawable.started :
+ R.drawable.stopped);
+ }
+
+ private void toggleStartStop() {
+ DataHelper dataHelper = new DataHelper(this);
+ boolean forceTracking = false;
+ if(isTracking()) {
+ // currently tracking => stop it
+ Intent intent = new Intent(OSMTracker.INTENT_STOP_TRACKING);
+ intent.setPackage(getPackageName());
+ sendBroadcast(intent);
+
+ isTracking = false;
+ dataHelper.stopTracking(currentTrackId);
+ } else {
+ // currently not tracking => start it
+ Intent intent = new Intent(this, GPSLogger.class);
+ intent.putExtra(TrackContentProvider.Schema.COL_TRACK_ID, currentTrackId);
+ startService(intent);
+ bindService(intent, getGpsLoggerConnection(), 0);
+ isTracking = true;
+ TrackManager.setActiveTrack(this, currentTrackId);
+ }
+ updateTrackingIcon();
+ }
+
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -183,6 +262,9 @@ public void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.displaytrackmap);
currentTrackId = getIntent().getExtras().getLong(TrackContentProvider.Schema.COL_TRACK_ID);
+ long activeTrackId =
+ DataHelper.getActiveTrackId(getContentResolver());
+ isTracking = currentTrackId == activeTrackId;
setTitle(getTitle() + ": #" + currentTrackId);
// Initialize OSM view
@@ -232,8 +314,23 @@ public void onChange(boolean selfChange) {
osmViewController.animateTo(currentPosition,CENTER_DEFAULT_ZOOM_LEVEL, ANIMATION_DURATION_MS);
}
});
+ startStopButton =
+ (ImageView)findViewById(R.id.displaytrackmap_imgStartStop);
+ if(activeTrackId == currentTrackId ||
+ activeTrackId == TrackManager.TRACK_ID_NO_TRACK) {
+ updateTrackingIcon();
+ startStopButton.setOnClickListener(view -> toggleStartStop());
+ } else {
+ startStopButton.setVisibility(View.INVISIBLE);
+ }
}
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ unbindGpsLoggerConnection();
+ }
+
/**
* Sets the map tile provider according to the user's demands in the settings.
*/
diff --git a/app/src/main/java/net/osmtracker/activity/TrackLogger.java b/app/src/main/java/net/osmtracker/activity/TrackLogger.java
index 45c4a1f34..c7be3024e 100644
--- a/app/src/main/java/net/osmtracker/activity/TrackLogger.java
+++ b/app/src/main/java/net/osmtracker/activity/TrackLogger.java
@@ -46,6 +46,7 @@
import net.osmtracker.listener.PressureListener;
import net.osmtracker.listener.SensorListener;
import net.osmtracker.receiver.MediaButtonReceiver;
+import net.osmtracker.service.gps.GPSLoggerConnectionListener;
import net.osmtracker.service.gps.GPSLogger;
import net.osmtracker.service.gps.GPSLoggerServiceConnection;
import net.osmtracker.util.CustomLayoutsUtils;
@@ -67,7 +68,7 @@
* @author Nicolas Guillaumin
*
*/
-public class TrackLogger extends Activity {
+public class TrackLogger extends GPSLoggerConnectionListener {
private static final String TAG = TrackLogger.class.getSimpleName();
@@ -332,30 +333,33 @@ protected void onResume() {
OSMTracker.Preferences.VAL_GPS_CHECKSTARTUP)) {
checkGPSProvider();
}
-
- // Register GPS status update for upper controls
- ((GpsStatusRecord) findViewById(R.id.gpsStatus)).requestLocationUpdates(true);
-
- // Start GPS Logger service
- startService(gpsLoggerServiceIntent);
-
- // Bind to GPS service.
- // We can't use BIND_AUTO_CREATE here, because when we'll ubound
- // later, we want to keep the service alive in background
- bindService(gpsLoggerServiceIntent, gpsLoggerConnection, 0);
+ if(currentTrackId ==
+ DataHelper.getActiveTrackId(getContentResolver())) {
+ // Register GPS status update for upper controls
+ ((GpsStatusRecord) findViewById(R.id.gpsStatus)).requestLocationUpdates(true);
+
+ // Start GPS Logger service
+ startService(gpsLoggerServiceIntent);
+
+ // Bind to GPS service.
+ // We can't use BIND_AUTO_CREATE here, because when we'll ubound
+ // later, we want to keep the service alive in background
+ bindService(gpsLoggerServiceIntent, gpsLoggerConnection, 0);
- // connect the sensor listener
- sensorListener.register(this);
+ // connect the sensor listener
+ sensorListener.register(this);
- // connect the pressure listener
- pressureListener.register(this, prefs.getBoolean(OSMTracker.Preferences.KEY_USE_BAROMETER,OSMTracker.Preferences.VAL_USE_BAROMETER));
+ // connect the pressure listener
+ pressureListener.register(this, prefs.getBoolean(OSMTracker.Preferences.KEY_USE_BAROMETER,OSMTracker.Preferences.VAL_USE_BAROMETER));
- setEnabledActionButtons(buttonsEnabled);
- if(!buttonsEnabled){
- Toast.makeText(this, R.string.tracklogger_waiting_gps, Toast.LENGTH_LONG).show();
+ setEnabledActionButtons(buttonsEnabled);
+ if(!buttonsEnabled){
+ Toast.makeText(this, R.string.tracklogger_waiting_gps, Toast.LENGTH_LONG).show();
+ }
+ mAudioManager.registerMediaButtonEventReceiver(mediaButtonReceiver);
+ gpsStarted = true;
}
- mAudioManager.registerMediaButtonEventReceiver(mediaButtonReceiver);
//save the layout file name if it change, in tags array
String layoutName = CustomLayoutsUtils.getCurrentLayoutName(getApplicationContext());
@@ -387,32 +391,35 @@ public void onClick(DialogInterface dialog, int which) {
}
}
+ boolean gpsStarted = false;
+
@Override
protected void onPause() {
-
- // Un-register GPS status update for upper controls
- ((GpsStatusRecord) findViewById(R.id.gpsStatus)).requestLocationUpdates(false);
-
- if (gpsLogger != null) {
- if (!gpsLogger.isTracking()) {
- Log.v(TAG, "Service is not tracking, trying to stopService()");
- unbindService(gpsLoggerConnection);
- stopService(gpsLoggerServiceIntent);
- } else {
- unbindService(gpsLoggerConnection);
+ if(gpsStarted) {
+ // Un-register GPS status update for upper controls
+ ((GpsStatusRecord) findViewById(R.id.gpsStatus)).requestLocationUpdates(false);
+
+ if (gpsLogger != null) {
+ if (!gpsLogger.isTracking()) {
+ Log.v(TAG, "Service is not tracking, trying to stopService()");
+ unbindService(gpsLoggerConnection);
+ stopService(gpsLoggerServiceIntent);
+ } else {
+ unbindService(gpsLoggerConnection);
+ }
}
- }
- if (sensorListener!=null) {
- sensorListener.unregister();
- }
-
- if (pressureListener != null) {
- pressureListener.unregister();
- }
+ if (sensorListener!=null) {
+ sensorListener.unregister();
+ }
- mAudioManager.unregisterMediaButtonEventReceiver(mediaButtonReceiver);
+ if (pressureListener != null) {
+ pressureListener.unregister();
+ }
+ mAudioManager.unregisterMediaButtonEventReceiver(mediaButtonReceiver);
+ gpsStarted = false;
+ }
super.onPause();
}
@@ -666,6 +673,17 @@ public GPSLogger getGpsLogger() {
*/
public void setGpsLogger(GPSLogger l) {
this.gpsLogger = l;
+ if(l == null) {
+ setEnabledActionButtons(false);
+ return;
+ }
+
+ // Update record status regarding of current tracking state
+ GpsStatusRecord gpsStatusRecord = (GpsStatusRecord) findViewById(R.id.gpsStatus);
+ if (gpsStatusRecord != null)
+ gpsStatusRecord.manageRecordingIndicator(getGpsLogger().isTracking());
+ if (!gpsLogger.isTracking())
+ setEnabledActionButtons(false);
}
/**
diff --git a/app/src/main/java/net/osmtracker/activity/TrackManager.java b/app/src/main/java/net/osmtracker/activity/TrackManager.java
index 4f9f23189..d0fc94716 100644
--- a/app/src/main/java/net/osmtracker/activity/TrackManager.java
+++ b/app/src/main/java/net/osmtracker/activity/TrackManager.java
@@ -1,5 +1,6 @@
package net.osmtracker.activity;
+import android.app.Activity;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.ActivityCompat;
@@ -76,7 +77,7 @@ public class TrackManager extends AppCompatActivity
private static final String PREV_VISIBLE = "prev_visible";
/** Constant used if no track is active (-1)*/
- private static final long TRACK_ID_NO_TRACK = -1;
+ public static final long TRACK_ID_NO_TRACK = -1;
// The active track being recorded, if any, or {TRACK_ID_NO_TRACK};
// value is updated in {@link #onResume()}
@@ -774,12 +775,17 @@ private void setActiveTrack(long trackId){
// to be sure that no tracking will be in progress when we set a new track
stopActiveTrack();
+ setActiveTrack(this, trackId);
+ }
+ public static void setActiveTrack(Activity activity, long trackId){
// set the track active
ContentValues values = new ContentValues();
values.put(TrackContentProvider.Schema.COL_ACTIVE,
TrackContentProvider.Schema.VAL_TRACK_ACTIVE);
- getContentResolver().update(TrackContentProvider.CONTENT_URI_TRACK, values,
+ activity
+ .getContentResolver()
+ .update(TrackContentProvider.CONTENT_URI_TRACK, values,
TrackContentProvider.Schema.COL_ID + " = ?",
new String[] {Long.toString(trackId)});
}
diff --git a/app/src/main/java/net/osmtracker/service/gps/GPSLoggerConnectionListener.java b/app/src/main/java/net/osmtracker/service/gps/GPSLoggerConnectionListener.java
new file mode 100644
index 000000000..f01a97e5d
--- /dev/null
+++ b/app/src/main/java/net/osmtracker/service/gps/GPSLoggerConnectionListener.java
@@ -0,0 +1,9 @@
+package net.osmtracker.service.gps;
+
+import android.app.Activity;
+
+public abstract class GPSLoggerConnectionListener extends Activity {
+ public abstract void setGpsLogger(GPSLogger l);
+
+ public abstract long getCurrentTrackId();
+}
diff --git a/app/src/main/java/net/osmtracker/service/gps/GPSLoggerServiceConnection.java b/app/src/main/java/net/osmtracker/service/gps/GPSLoggerServiceConnection.java
index e7d22f67b..338100caf 100644
--- a/app/src/main/java/net/osmtracker/service/gps/GPSLoggerServiceConnection.java
+++ b/app/src/main/java/net/osmtracker/service/gps/GPSLoggerServiceConnection.java
@@ -1,9 +1,7 @@
package net.osmtracker.service.gps;
import net.osmtracker.OSMTracker;
-import net.osmtracker.R;
-import net.osmtracker.activity.TrackLogger;
-import net.osmtracker.layout.GpsStatusRecord;
+import net.osmtracker.service.gps.GPSLoggerConnectionListener;
import net.osmtracker.db.TrackContentProvider;
import android.content.ComponentName;
@@ -20,34 +18,26 @@
public class GPSLoggerServiceConnection implements ServiceConnection {
/**
- * Reference to TrackLogger activity
+ * Reference to client activity
*/
- private TrackLogger activity;
+ private GPSLoggerConnectionListener activity;
- public GPSLoggerServiceConnection(TrackLogger tl) {
+ public GPSLoggerServiceConnection(GPSLoggerConnectionListener tl) {
activity = tl;
}
@Override
public void onServiceDisconnected(ComponentName name) {
- activity.setEnabledActionButtons(false);
activity.setGpsLogger(null);
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
-
- activity.setGpsLogger( ((GPSLogger.GPSLoggerBinder) service).getService());
+ GPSLogger gpsLogger = ((GPSLogger.GPSLoggerBinder) service).getService();
+ activity.setGpsLogger(gpsLogger);
- // Update record status regarding of current tracking state
- GpsStatusRecord gpsStatusRecord = (GpsStatusRecord) activity.findViewById(R.id.gpsStatus);
- if (gpsStatusRecord != null) {
- gpsStatusRecord.manageRecordingIndicator(activity.getGpsLogger().isTracking());
- }
-
// If not already tracking, start tracking
- if (!activity.getGpsLogger().isTracking()) {
- activity.setEnabledActionButtons(false);
+ if (!gpsLogger.isTracking()) {
Intent intent = new Intent(OSMTracker.INTENT_START_TRACKING);
intent.putExtra(TrackContentProvider.Schema.COL_TRACK_ID, activity.getCurrentTrackId());
intent.setPackage(activity.getPackageName());
diff --git a/app/src/main/res/drawable-mdpi/started.png b/app/src/main/res/drawable-mdpi/started.png
new file mode 100644
index 000000000..6181d034d
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/started.png differ
diff --git a/app/src/main/res/drawable-mdpi/stopped.png b/app/src/main/res/drawable-mdpi/stopped.png
new file mode 100644
index 000000000..327f476e0
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/stopped.png differ
diff --git a/app/src/main/res/layout/displaytrackmap.xml b/app/src/main/res/layout/displaytrackmap.xml
index ca862d5d7..2c135c8f6 100644
--- a/app/src/main/res/layout/displaytrackmap.xml
+++ b/app/src/main/res/layout/displaytrackmap.xml
@@ -21,18 +21,31 @@
app:layout_constraintVertical_bias="1.0"/>
+
+
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values/accessibility.xml b/app/src/main/res/values/accessibility.xml
index a5f171e2b..ffffc7d33 100644
--- a/app/src/main/res/values/accessibility.xml
+++ b/app/src/main/res/values/accessibility.xml
@@ -6,6 +6,7 @@
Zoom in
Zoom out
Zoom center
+ Start / Stop
Satellite signal strength indicator
Record in progress indicator