Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 99 additions & 2 deletions app/src/main/java/net/osmtracker/activity/DisplayTrackMap.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package net.osmtracker.activity;

import android.app.Activity;
import android.content.ContentUris;
import android.content.Intent;
import android.content.SharedPreferences;
Expand All @@ -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;
Expand All @@ -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();

Expand Down Expand Up @@ -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
*/
Expand Down Expand Up @@ -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);
Expand All @@ -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
Expand Down Expand Up @@ -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.
*/
Expand Down
98 changes: 58 additions & 40 deletions app/src/main/java/net/osmtracker/activity/TrackLogger.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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();

Expand Down Expand Up @@ -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());
Expand Down Expand Up @@ -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();
}

Expand Down Expand Up @@ -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);
}

/**
Expand Down
10 changes: 8 additions & 2 deletions app/src/main/java/net/osmtracker/activity/TrackManager.java
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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()}
Expand Down Expand Up @@ -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)});
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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();
}
Loading
Loading