From d0c6d90d3fa3dece211d28a31434a51408cc0841 Mon Sep 17 00:00:00 2001 From: Alain Knaff Date: Sat, 16 May 2026 16:12:30 +0200 Subject: [PATCH] Start / Stop button on map screen --- .../osmtracker/activity/DisplayTrackMap.java | 101 +++++++++++++++++- .../net/osmtracker/activity/TrackLogger.java | 98 ++++++++++------- .../net/osmtracker/activity/TrackManager.java | 10 +- .../gps/GPSLoggerConnectionListener.java | 9 ++ .../gps/GPSLoggerServiceConnection.java | 24 ++--- app/src/main/res/drawable-mdpi/started.png | Bin 0 -> 3212 bytes app/src/main/res/drawable-mdpi/stopped.png | Bin 0 -> 3228 bytes app/src/main/res/layout/displaytrackmap.xml | 23 +++- app/src/main/res/values/accessibility.xml | 1 + 9 files changed, 200 insertions(+), 66 deletions(-) create mode 100644 app/src/main/java/net/osmtracker/service/gps/GPSLoggerConnectionListener.java create mode 100644 app/src/main/res/drawable-mdpi/started.png create mode 100644 app/src/main/res/drawable-mdpi/stopped.png 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 0000000000000000000000000000000000000000..6181d034d326cb7208557d155823c658e257c1ea GIT binary patch literal 3212 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 O0000 + + - \ 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