forked from upstream-mirrors/OpenTracks
Merge pull request #1793 from OpenTracksApp/crash#1708
Bugfix: sensors were started twice.
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
+1
-4
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user