Skip to content
This repository was archived by the owner on Aug 24, 2025. It is now read-only.

Commit 81a7882

Browse files
authored
Merge pull request #1793 from OpenTracksApp/crash#1708
Bugfix: sensors were started twice.
2 parents 47ceb29 + 2fe452c commit 81a7882

4 files changed

Lines changed: 53 additions & 36 deletions

File tree

src/main/java/de/dennisguse/opentracks/TrackListActivity.java

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import android.location.LocationManager;
2626
import android.os.Bundle;
2727
import android.provider.Settings;
28+
import android.util.Log;
2829
import android.view.KeyEvent;
2930
import android.view.Menu;
3031
import android.view.MenuItem;
@@ -73,7 +74,7 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co
7374
private static final String TAG = TrackListActivity.class.getSimpleName();
7475

7576
// The following are set in onCreate
76-
private TrackRecordingServiceConnection trackRecordingServiceConnection;
77+
private TrackRecordingServiceConnection recordingStatusConnection;
7778
private TrackListAdapter adapter;
7879

7980
private TrackListBinding viewBinding;
@@ -138,13 +139,6 @@ public void onDestroy() {
138139
.observe(TrackListActivity.this, this::onGpsStatusChanged);
139140

140141
updateGpsMenuItem(true, recordingStatus.isRecording());
141-
142-
if (service.getGpsStatusObservable().getValue().isGpsStarted()) {
143-
return;
144-
}
145-
146-
//TODO Not cool to do this in a callback that might be called more than once!
147-
service.tryStartSensors();
148142
};
149143

150144
@Override
@@ -154,7 +148,7 @@ protected void onCreate(Bundle savedInstanceState) {
154148

155149
requestRequiredPermissions();
156150

157-
trackRecordingServiceConnection = new TrackRecordingServiceConnection(bindChangedCallback);
151+
recordingStatusConnection = new TrackRecordingServiceConnection(bindChangedCallback);
158152

159153
viewBinding.aggregatedStatsButton.setOnClickListener((view) -> startActivity(IntentUtils.newIntent(this, AggregatedStatisticsActivity.class)));
160154
viewBinding.sensorStartButton.setOnClickListener((view) -> {
@@ -163,9 +157,14 @@ protected void onCreate(Bundle savedInstanceState) {
163157
startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
164158
} else {
165159
if (gpsStatusValue.isGpsStarted()) {
166-
trackRecordingServiceConnection.unbindAndStop(this);
160+
recordingStatusConnection.unbindAndStop(this);
161+
recordingStatusConnection.startConnection(this); //TODO We need to stay listening!
167162
} else {
168-
trackRecordingServiceConnection.startAndBindWithCallback(this);
163+
new TrackRecordingServiceConnection((service, connection) -> {
164+
service.tryStartSensors();
165+
166+
connection.unbind(this);
167+
}).startAndBindWithCallback(this);
169168
}
170169
}
171170
});
@@ -182,6 +181,7 @@ protected void onCreate(Bundle savedInstanceState) {
182181
}
183182

184183
// Not Recording -> Recording
184+
Log.i(TAG, "Starting recording");
185185
updateGpsMenuItem(false, true);
186186
new TrackRecordingServiceConnection((service, connection) -> {
187187
Track.Id trackId = service.startNewTrack();
@@ -201,7 +201,7 @@ protected void onCreate(Bundle savedInstanceState) {
201201
// Recording -> Stop
202202
ActivityUtils.vibrate(this, 1000);
203203
updateGpsMenuItem(false, false);
204-
trackRecordingServiceConnection.stopRecording(TrackListActivity.this);
204+
recordingStatusConnection.stopRecording(TrackListActivity.this);
205205
viewBinding.trackListFabAction.setImageResource(R.drawable.ic_baseline_record_24);
206206
viewBinding.trackListFabAction.setBackgroundTintList(ContextCompat.getColorStateList(this, R.color.red_dark));
207207
return true;
@@ -220,7 +220,7 @@ protected void onStart() {
220220
super.onStart();
221221

222222
PreferencesUtils.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
223-
trackRecordingServiceConnection.startConnection(this);
223+
recordingStatusConnection.startConnection(this);
224224
}
225225

226226
@Override
@@ -240,14 +240,14 @@ protected void onStop() {
240240
super.onStop();
241241

242242
PreferencesUtils.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
243-
trackRecordingServiceConnection.unbind(this);
243+
recordingStatusConnection.unbind(this);
244244
}
245245

246246
@Override
247247
protected void onDestroy() {
248248
super.onDestroy();
249249
viewBinding = null;
250-
trackRecordingServiceConnection = null;
250+
recordingStatusConnection = null;
251251
adapter = null;
252252
}
253253

src/main/java/de/dennisguse/opentracks/sensors/driver/BarometerInternal.java

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,38 +13,41 @@
1313
import de.dennisguse.opentracks.data.models.AtmosphericPressure;
1414
import de.dennisguse.opentracks.sensors.GainManager;
1515

16-
public class BarometerInternal implements SensorEventListener {
16+
public class BarometerInternal {
1717

1818
private static final String TAG = BarometerInternal.class.getSimpleName();
1919

2020
private static final int SAMPLING_PERIOD = (int) TimeUnit.SECONDS.toMicros(5);
2121

2222
private GainManager observer;
2323

24-
@Override
25-
public void onSensorChanged(SensorEvent event) {
26-
if (!isConnected()) {
27-
Log.w(TAG, "Not connected to sensor, cannot process data.");
28-
return;
29-
}
24+
private final SensorEventListener listener = new SensorEventListener() {
25+
@Override
26+
public void onSensorChanged(SensorEvent event) {
27+
if (!isConnected()) {
28+
Log.w(TAG, "Not connected to sensor, cannot process data.");
29+
return;
30+
}
3031

31-
observer.onSensorValueChanged(AtmosphericPressure.ofHPA(event.values[0]));
32-
}
32+
observer.onSensorValueChanged(AtmosphericPressure.ofHPA(event.values[0]));
33+
}
3334

34-
@Override
35-
public void onAccuracyChanged(Sensor sensor, int accuracy) {
36-
Log.w(TAG, "Sensor accuracy changes are (currently) ignored.");
37-
}
35+
@Override
36+
public void onAccuracyChanged(Sensor sensor, int accuracy) {
37+
Log.w(TAG, "Sensor accuracy changes are (currently) ignored.");
38+
}
39+
};
3840

3941
public void connect(Context context, Handler handler, GainManager observer) {
4042
SensorManager sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
4143
Sensor pressureSensor = sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE);
4244
if (pressureSensor == null) {
4345
Log.w(TAG, "No pressure sensor available.");
4446
this.observer = null;
47+
return;
4548
}
4649

47-
if (sensorManager.registerListener(this, pressureSensor, SAMPLING_PERIOD, handler)) {
50+
if (sensorManager.registerListener(listener, pressureSensor, SAMPLING_PERIOD, handler)) {
4851
this.observer = observer;
4952
return;
5053
}
@@ -54,7 +57,7 @@ public void connect(Context context, Handler handler, GainManager observer) {
5457

5558
public void disconnect(Context context) {
5659
SensorManager sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
57-
sensorManager.unregisterListener(this);
60+
sensorManager.unregisterListener(listener);
5861
observer = null;
5962
}
6063

src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,9 @@ public void onDestroy() {
125125
if (isRecording()) {
126126
endCurrentTrack();
127127
}
128+
if (isSensorStarted()) {
129+
stopSensors();
130+
}
128131

129132
PreferencesUtils.unregisterOnSharedPreferenceChangeListener(this);
130133

@@ -163,6 +166,7 @@ public Track.Id startNewTrack() {
163166
Log.w(TAG, "Ignore startNewTrack. Already recording.");
164167
return null;
165168
}
169+
Log.i(TAG, "startNewTrack");
166170

167171
// Set recording status
168172
Track.Id trackId = trackRecordingManager.startNewTrack();
@@ -177,6 +181,7 @@ public void resumeTrack(Track.Id trackId) {
177181
Log.w(TAG, "Cannot resume a non-existing track.");
178182
return;
179183
}
184+
Log.i(TAG, "resumeTrack");
180185

181186
updateRecordingStatus(RecordingStatus.record(trackId));
182187

@@ -193,12 +198,19 @@ private void startRecording() {
193198
}
194199

195200
public void tryStartSensors() {
196-
if (isRecording()) return;
201+
if (isSensorStarted()) return;
202+
203+
Log.i(TAG, "tryStartSensors");
197204

198205
startSensors();
199206
}
200207

201-
private void startSensors() {
208+
private synchronized void startSensors() {
209+
if (isSensorStarted()) {
210+
Log.i(TAG, "sensors already started; skipping");
211+
return;
212+
}
213+
Log.i(TAG, "startSensors");
202214
wakeLock = SystemUtils.acquireWakeLock(this, wakeLock);
203215
trackPointCreator.start(this, handler);
204216
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
@@ -239,6 +251,7 @@ void stopSensors() {
239251
stopForeground(true);
240252
notificationManager.cancelNotification();
241253
wakeLock = SystemUtils.releaseWakeLock(wakeLock);
254+
gpsStatusObservable.postValue(STATUS_GPS_DEFAULT);
242255
}
243256

244257
@Override
@@ -336,6 +349,10 @@ public boolean isRecording() {
336349
return recordingStatus.isRecording();
337350
}
338351

352+
private boolean isSensorStarted() {
353+
return wakeLock != null;
354+
}
355+
339356
@Override
340357
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, @Nullable String key) {
341358
voiceAnnouncementManager.onSharedPreferenceChanged(sharedPreferences, key);

src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceConnection.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -127,9 +127,6 @@ public void unbind(Context context) {
127127
setTrackRecordingService(null);
128128
}
129129

130-
/**
131-
* Unbinds and stops the service.
132-
*/
133130
public void unbindAndStop(Context context) {
134131
unbind(context);
135132
context.stopService(new Intent(context, TrackRecordingService.class));
@@ -153,7 +150,7 @@ private void setTrackRecordingService(TrackRecordingService value) {
153150

154151
@Override
155152
public void onServiceConnected(ComponentName className, IBinder service) {
156-
Log.i(TAG, "Connected to the service.");
153+
Log.i(TAG, "Connected to the service: " + service);
157154
try {
158155
service.linkToDeath(this, 0);
159156
} catch (RemoteException e) {

0 commit comments

Comments
 (0)