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