diff --git a/src/main/java/de/dennisguse/opentracks/TrackListActivity.java b/src/main/java/de/dennisguse/opentracks/TrackListActivity.java index 3066c8776..c586caaa1 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackListActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackListActivity.java @@ -241,7 +241,7 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co startActivity(newIntent); connection.unbind(this); - }).startAndBind(this); + }).startAndBind(this, true); }); viewBinding.trackListFabAction.setOnLongClickListener((view) -> { if (!recordingStatus.isRecording()) { diff --git a/src/main/java/de/dennisguse/opentracks/TrackRecordedActivity.java b/src/main/java/de/dennisguse/opentracks/TrackRecordedActivity.java index 3229afd34..8fbb75273 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackRecordedActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackRecordedActivity.java @@ -213,7 +213,7 @@ public class TrackRecordedActivity extends AbstractTrackDeleteActivity implement connection.unbind(this); finish(); - }).startAndBind(this); + }).startAndBind(this, true); return true; } diff --git a/src/main/java/de/dennisguse/opentracks/TrackStoppedActivity.java b/src/main/java/de/dennisguse/opentracks/TrackStoppedActivity.java index 7aaa56656..762e004ea 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackStoppedActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackStoppedActivity.java @@ -145,7 +145,7 @@ public class TrackStoppedActivity extends AbstractTrackDeleteActivity implements connection.unbind(this); finish(); - }).startAndBind(this); + }).startAndBind(this, true); } @Override diff --git a/src/main/java/de/dennisguse/opentracks/publicapi/AbstractAPIActivity.java b/src/main/java/de/dennisguse/opentracks/publicapi/AbstractAPIActivity.java index 6d47fd76e..6157af87b 100644 --- a/src/main/java/de/dennisguse/opentracks/publicapi/AbstractAPIActivity.java +++ b/src/main/java/de/dennisguse/opentracks/publicapi/AbstractAPIActivity.java @@ -34,7 +34,7 @@ public abstract class AbstractAPIActivity extends AppCompatActivity { if (PreferencesUtils.isPublicAPIenabled()) { Log.i(TAG, "Received and trying to execute requested action."); new TrackRecordingServiceConnection(serviceConnectedCallback) - .startAndBind(this); + .startAndBind(this, true); } else { Toast.makeText(this, getString(R.string.settings_public_api_disabled_toast), Toast.LENGTH_LONG).show(); Log.w(TAG, "Public API is disabled; ignoring request."); diff --git a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java index fd2f8ac8d..8bfd3d660 100644 --- a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java +++ b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java @@ -129,7 +129,8 @@ public class TrackRecordingService extends Service implements TrackPointCreator. trackRecordingManager = null; // Reverse order from onCreate - showNotification(false); //TODO Why? + stopForeground(true); + notificationManager.stop(); notificationManager = null; @@ -205,7 +206,7 @@ public class TrackRecordingService extends Service implements TrackPointCreator. private void startSensors() { wakeLock = SystemUtils.acquireWakeLock(this, wakeLock); trackPointCreator.start(this, handler); - showNotification(true); + startForeground(TrackRecordingServiceNotificationManager.NOTIFICATION_ID, notificationManager.setGPSonlyStarted(this)); } public void endCurrentTrack() { @@ -247,7 +248,8 @@ public class TrackRecordingService extends Service implements TrackPointCreator. if (!isRecording()) return; trackPointCreator.stop(); - showNotification(false); + stopForeground(true); + notificationManager.cancelNotification(); wakeLock = SystemUtils.releaseWakeLock(wakeLock); } @@ -273,19 +275,6 @@ public class TrackRecordingService extends Service implements TrackPointCreator. } } - private void showNotification(boolean isGpsStarted) { - if (isRecording()) { - startForeground(TrackRecordingServiceNotificationManager.NOTIFICATION_ID, notificationManager.setRecording(this, recordingStatus.getTrackId())); - } - if (!isRecording() && isGpsStarted) { - startForeground(TrackRecordingServiceNotificationManager.NOTIFICATION_ID, notificationManager.setGPSonlyStarted(this)); - } - if (!isRecording() && !isGpsStarted) { - stopForeground(true); - notificationManager.cancelNotification(); - } - } - public Marker.Id insertMarker(String name, String category, String description, String photoUrl) { if (!isRecording()) { return null; diff --git a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceConnection.java b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceConnection.java index 5e035bdcb..15dc2bc28 100644 --- a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceConnection.java +++ b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceConnection.java @@ -28,6 +28,7 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; import de.dennisguse.opentracks.BuildConfig; import de.dennisguse.opentracks.R; @@ -66,15 +67,21 @@ public class TrackRecordingServiceConnection implements ServiceConnection, Death /** * Starts and binds the service. + * + * @param foreground is the service expected to call `startForeground()`? */ - public void startAndBind(Context context) { + public void startAndBind(Context context, boolean foreground) { if (trackRecordingService != null) { // Service is already started and bound. return; } Log.i(TAG, "Starting the service."); - context.startService(new Intent(context, TrackRecordingService.class)); + if (foreground) { + ContextCompat.startForegroundService(context, new Intent(context, TrackRecordingService.class)); + } else { + context.startService(new Intent(context, TrackRecordingService.class)); + } startConnection(context); } @@ -88,7 +95,7 @@ public class TrackRecordingServiceConnection implements ServiceConnection, Death @Deprecated public void startAndBindWithCallback(Context context) { if (trackRecordingService == null) { - startAndBind(context); + startAndBind(context, false); return; } if (callback != null) { diff --git a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceNotificationManager.java b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceNotificationManager.java index c3513bf71..4d31df235 100644 --- a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceNotificationManager.java +++ b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceNotificationManager.java @@ -68,6 +68,7 @@ class TrackRecordingServiceNotificationManager implements SharedPreferences.OnSh } void stop() { + cancelNotification(); PreferencesUtils.unregisterOnSharedPreferenceChangeListener(this); }