Bugfix: sensors were started twice.
This commit is contained in:
Dennis Guse
2023-12-26 09:04:29 +01:00
committed by GitHub
4 changed files with 53 additions and 36 deletions
@@ -25,6 +25,7 @@ import android.graphics.drawable.AnimatedVectorDrawable;
import android.location.LocationManager; import android.location.LocationManager;
import android.os.Bundle; import android.os.Bundle;
import android.provider.Settings; import android.provider.Settings;
import android.util.Log;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
@@ -73,7 +74,7 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co
private static final String TAG = TrackListActivity.class.getSimpleName(); private static final String TAG = TrackListActivity.class.getSimpleName();
// The following are set in onCreate // The following are set in onCreate
private TrackRecordingServiceConnection trackRecordingServiceConnection; private TrackRecordingServiceConnection recordingStatusConnection;
private TrackListAdapter adapter; private TrackListAdapter adapter;
private TrackListBinding viewBinding; private TrackListBinding viewBinding;
@@ -138,13 +139,6 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co
.observe(TrackListActivity.this, this::onGpsStatusChanged); .observe(TrackListActivity.this, this::onGpsStatusChanged);
updateGpsMenuItem(true, recordingStatus.isRecording()); updateGpsMenuItem(true, recordingStatus.isRecording());
if (service.getGpsStatusObservable().getValue().isGpsStarted()) {
return;
}
//TODO Not cool to do this in a callback that might be called more than once!
service.tryStartSensors();
}; };
@Override @Override
@@ -154,7 +148,7 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co
requestRequiredPermissions(); requestRequiredPermissions();
trackRecordingServiceConnection = new TrackRecordingServiceConnection(bindChangedCallback); recordingStatusConnection = new TrackRecordingServiceConnection(bindChangedCallback);
viewBinding.aggregatedStatsButton.setOnClickListener((view) -> startActivity(IntentUtils.newIntent(this, AggregatedStatisticsActivity.class))); viewBinding.aggregatedStatsButton.setOnClickListener((view) -> startActivity(IntentUtils.newIntent(this, AggregatedStatisticsActivity.class)));
viewBinding.sensorStartButton.setOnClickListener((view) -> { viewBinding.sensorStartButton.setOnClickListener((view) -> {
@@ -163,9 +157,14 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co
startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)); startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
} else { } else {
if (gpsStatusValue.isGpsStarted()) { if (gpsStatusValue.isGpsStarted()) {
trackRecordingServiceConnection.unbindAndStop(this); recordingStatusConnection.unbindAndStop(this);
recordingStatusConnection.startConnection(this); //TODO We need to stay listening!
} else { } else {
trackRecordingServiceConnection.startAndBindWithCallback(this); new TrackRecordingServiceConnection((service, connection) -> {
service.tryStartSensors();
connection.unbind(this);
}).startAndBindWithCallback(this);
} }
} }
}); });
@@ -182,6 +181,7 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co
} }
// Not Recording -> Recording // Not Recording -> Recording
Log.i(TAG, "Starting recording");
updateGpsMenuItem(false, true); updateGpsMenuItem(false, true);
new TrackRecordingServiceConnection((service, connection) -> { new TrackRecordingServiceConnection((service, connection) -> {
Track.Id trackId = service.startNewTrack(); Track.Id trackId = service.startNewTrack();
@@ -201,7 +201,7 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co
// Recording -> Stop // Recording -> Stop
ActivityUtils.vibrate(this, 1000); ActivityUtils.vibrate(this, 1000);
updateGpsMenuItem(false, false); updateGpsMenuItem(false, false);
trackRecordingServiceConnection.stopRecording(TrackListActivity.this); recordingStatusConnection.stopRecording(TrackListActivity.this);
viewBinding.trackListFabAction.setImageResource(R.drawable.ic_baseline_record_24); viewBinding.trackListFabAction.setImageResource(R.drawable.ic_baseline_record_24);
viewBinding.trackListFabAction.setBackgroundTintList(ContextCompat.getColorStateList(this, R.color.red_dark)); viewBinding.trackListFabAction.setBackgroundTintList(ContextCompat.getColorStateList(this, R.color.red_dark));
return true; return true;
@@ -220,7 +220,7 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co
super.onStart(); super.onStart();
PreferencesUtils.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); PreferencesUtils.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
trackRecordingServiceConnection.startConnection(this); recordingStatusConnection.startConnection(this);
} }
@Override @Override
@@ -240,14 +240,14 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co
super.onStop(); super.onStop();
PreferencesUtils.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); PreferencesUtils.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
trackRecordingServiceConnection.unbind(this); recordingStatusConnection.unbind(this);
} }
@Override @Override
protected void onDestroy() { protected void onDestroy() {
super.onDestroy(); super.onDestroy();
viewBinding = null; viewBinding = null;
trackRecordingServiceConnection = null; recordingStatusConnection = null;
adapter = null; adapter = null;
} }
@@ -13,7 +13,7 @@ import java.util.concurrent.TimeUnit;
import de.dennisguse.opentracks.data.models.AtmosphericPressure; import de.dennisguse.opentracks.data.models.AtmosphericPressure;
import de.dennisguse.opentracks.sensors.GainManager; import de.dennisguse.opentracks.sensors.GainManager;
public class BarometerInternal implements SensorEventListener { public class BarometerInternal {
private static final String TAG = BarometerInternal.class.getSimpleName(); private static final String TAG = BarometerInternal.class.getSimpleName();
@@ -21,20 +21,22 @@ public class BarometerInternal implements SensorEventListener {
private GainManager observer; private GainManager observer;
@Override private final SensorEventListener listener = new SensorEventListener() {
public void onSensorChanged(SensorEvent event) { @Override
if (!isConnected()) { public void onSensorChanged(SensorEvent event) {
Log.w(TAG, "Not connected to sensor, cannot process data."); if (!isConnected()) {
return; Log.w(TAG, "Not connected to sensor, cannot process data.");
return;
}
observer.onSensorValueChanged(AtmosphericPressure.ofHPA(event.values[0]));
} }
observer.onSensorValueChanged(AtmosphericPressure.ofHPA(event.values[0])); @Override
} public void onAccuracyChanged(Sensor sensor, int accuracy) {
Log.w(TAG, "Sensor accuracy changes are (currently) ignored.");
@Override }
public void onAccuracyChanged(Sensor sensor, int accuracy) { };
Log.w(TAG, "Sensor accuracy changes are (currently) ignored.");
}
public void connect(Context context, Handler handler, GainManager observer) { public void connect(Context context, Handler handler, GainManager observer) {
SensorManager sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE); SensorManager sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
@@ -42,9 +44,10 @@ public class BarometerInternal implements SensorEventListener {
if (pressureSensor == null) { if (pressureSensor == null) {
Log.w(TAG, "No pressure sensor available."); Log.w(TAG, "No pressure sensor available.");
this.observer = null; this.observer = null;
return;
} }
if (sensorManager.registerListener(this, pressureSensor, SAMPLING_PERIOD, handler)) { if (sensorManager.registerListener(listener, pressureSensor, SAMPLING_PERIOD, handler)) {
this.observer = observer; this.observer = observer;
return; return;
} }
@@ -54,7 +57,7 @@ public class BarometerInternal implements SensorEventListener {
public void disconnect(Context context) { public void disconnect(Context context) {
SensorManager sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE); SensorManager sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
sensorManager.unregisterListener(this); sensorManager.unregisterListener(listener);
observer = null; observer = null;
} }
@@ -125,6 +125,9 @@ public class TrackRecordingService extends Service implements TrackPointCreator.
if (isRecording()) { if (isRecording()) {
endCurrentTrack(); endCurrentTrack();
} }
if (isSensorStarted()) {
stopSensors();
}
PreferencesUtils.unregisterOnSharedPreferenceChangeListener(this); PreferencesUtils.unregisterOnSharedPreferenceChangeListener(this);
@@ -163,6 +166,7 @@ public class TrackRecordingService extends Service implements TrackPointCreator.
Log.w(TAG, "Ignore startNewTrack. Already recording."); Log.w(TAG, "Ignore startNewTrack. Already recording.");
return null; return null;
} }
Log.i(TAG, "startNewTrack");
// Set recording status // Set recording status
Track.Id trackId = trackRecordingManager.startNewTrack(); Track.Id trackId = trackRecordingManager.startNewTrack();
@@ -177,6 +181,7 @@ public class TrackRecordingService extends Service implements TrackPointCreator.
Log.w(TAG, "Cannot resume a non-existing track."); Log.w(TAG, "Cannot resume a non-existing track.");
return; return;
} }
Log.i(TAG, "resumeTrack");
updateRecordingStatus(RecordingStatus.record(trackId)); updateRecordingStatus(RecordingStatus.record(trackId));
@@ -193,12 +198,19 @@ public class TrackRecordingService extends Service implements TrackPointCreator.
} }
public void tryStartSensors() { public void tryStartSensors() {
if (isRecording()) return; if (isSensorStarted()) return;
Log.i(TAG, "tryStartSensors");
startSensors(); startSensors();
} }
private void startSensors() { private synchronized void startSensors() {
if (isSensorStarted()) {
Log.i(TAG, "sensors already started; skipping");
return;
}
Log.i(TAG, "startSensors");
wakeLock = SystemUtils.acquireWakeLock(this, wakeLock); wakeLock = SystemUtils.acquireWakeLock(this, wakeLock);
trackPointCreator.start(this, handler); trackPointCreator.start(this, handler);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
@@ -239,6 +251,7 @@ public class TrackRecordingService extends Service implements TrackPointCreator.
stopForeground(true); stopForeground(true);
notificationManager.cancelNotification(); notificationManager.cancelNotification();
wakeLock = SystemUtils.releaseWakeLock(wakeLock); wakeLock = SystemUtils.releaseWakeLock(wakeLock);
gpsStatusObservable.postValue(STATUS_GPS_DEFAULT);
} }
@Override @Override
@@ -336,6 +349,10 @@ public class TrackRecordingService extends Service implements TrackPointCreator.
return recordingStatus.isRecording(); return recordingStatus.isRecording();
} }
private boolean isSensorStarted() {
return wakeLock != null;
}
@Override @Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, @Nullable String key) { public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, @Nullable String key) {
voiceAnnouncementManager.onSharedPreferenceChanged(sharedPreferences, key); voiceAnnouncementManager.onSharedPreferenceChanged(sharedPreferences, key);
@@ -127,9 +127,6 @@ public class TrackRecordingServiceConnection implements ServiceConnection, Death
setTrackRecordingService(null); setTrackRecordingService(null);
} }
/**
* Unbinds and stops the service.
*/
public void unbindAndStop(Context context) { public void unbindAndStop(Context context) {
unbind(context); unbind(context);
context.stopService(new Intent(context, TrackRecordingService.class)); context.stopService(new Intent(context, TrackRecordingService.class));
@@ -153,7 +150,7 @@ public class TrackRecordingServiceConnection implements ServiceConnection, Death
@Override @Override
public void onServiceConnected(ComponentName className, IBinder service) { public void onServiceConnected(ComponentName className, IBinder service) {
Log.i(TAG, "Connected to the service."); Log.i(TAG, "Connected to the service: " + service);
try { try {
service.linkToDeath(this, 0); service.linkToDeath(this, 0);
} catch (RemoteException e) { } catch (RemoteException e) {