From 6f97399aeb11d6f84326ec5dc34f259986353ad3 Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Sat, 28 Jun 2025 14:11:46 +0200 Subject: [PATCH] Migrate TrackDeletionService to WorkManager. Part of #1315. --- build.gradle | 1 + src/main/AndroidManifest.xml | 5 -- .../AbstractTrackDeleteActivity.java | 31 +++++++-- .../services/TrackDeleteService.java | 67 ------------------- .../services/TrackDeletionWorker.java | 36 ++++++++++ 5 files changed, 64 insertions(+), 76 deletions(-) delete mode 100644 src/main/java/de/dennisguse/opentracks/services/TrackDeleteService.java create mode 100644 src/main/java/de/dennisguse/opentracks/services/TrackDeletionWorker.java diff --git a/build.gradle b/build.gradle index b44850f25..67b7a1b90 100644 --- a/build.gradle +++ b/build.gradle @@ -152,6 +152,7 @@ dependencies { implementation 'androidx.core:core-splashscreen:1.0.1' implementation 'androidx.mediarouter:mediarouter:1.8.1' implementation 'androidx.core:core-location-altitude:1.0.0-alpha03' + implementation 'androidx.work:work-runtime:2.10.2' androidTestImplementation 'androidx.test:core:1.7.0' androidTestImplementation 'androidx.test.ext:junit:1.3.0' diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index f0939f3d2..2b3327011 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -405,11 +405,6 @@ limitations under the License. android:exported="false" android:permission="android.permission.BIND_JOB_SERVICE" /> - - { + if (workInfo != null) { + if (workInfo.getState().isFinished()) { + onDeleteFinished(); + } + } + }); + + workManager.enqueue(deleteRequest); } protected abstract void onDeleteConfirmed(); + protected abstract void onDeleteFinished(); + protected abstract Track.Id getRecordingTrackId(); } diff --git a/src/main/java/de/dennisguse/opentracks/services/TrackDeleteService.java b/src/main/java/de/dennisguse/opentracks/services/TrackDeleteService.java deleted file mode 100644 index 3136ae731..000000000 --- a/src/main/java/de/dennisguse/opentracks/services/TrackDeleteService.java +++ /dev/null @@ -1,67 +0,0 @@ -package de.dennisguse.opentracks.services; - -import android.app.job.JobService; -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.os.Handler; -import android.os.ResultReceiver; - -import androidx.annotation.NonNull; -import androidx.core.app.JobIntentService; - -import java.util.ArrayList; - -import de.dennisguse.opentracks.data.ContentProviderUtils; -import de.dennisguse.opentracks.data.models.Track; - -public class TrackDeleteService extends JobIntentService { - - private static final int JOB_ID = 3; - - private static final String EXTRA_RECEIVER = "extra_receiver"; - - private static final String EXTRA_TRACK_IDS = "extra_track_ids"; - - public static void enqueue(Context context, TrackDeleteResultReceiver receiver, ArrayList toBeDeleted) { - Intent intent = new Intent(context, JobService.class); - intent.putExtra(EXTRA_RECEIVER, receiver); - intent.putParcelableArrayListExtra(EXTRA_TRACK_IDS, toBeDeleted); - enqueueWork(context, TrackDeleteService.class, JOB_ID, intent); - } - - @Override - protected void onHandleWork(@NonNull Intent intent) { - ResultReceiver resultReceiver = intent.getParcelableExtra(EXTRA_RECEIVER); - ArrayList trackIds = intent.getParcelableArrayListExtra(EXTRA_TRACK_IDS); - - ContentProviderUtils contentProviderUtils = new ContentProviderUtils(this); - contentProviderUtils.deleteTracks(this, trackIds); - - resultReceiver.send(TrackDeleteResultReceiver.RESULT_CODE_SUCCESS, new Bundle()); - } - - public static class TrackDeleteResultReceiver extends ResultReceiver { - - public static final int RESULT_CODE_SUCCESS = 1; - - private final Receiver receiver; - - public TrackDeleteResultReceiver(Handler handler, @NonNull Receiver receiver) { - super(handler); - this.receiver = receiver; - } - - @Override - protected void onReceiveResult(int resultCode, Bundle resultData) { - switch (resultCode) { - case RESULT_CODE_SUCCESS -> receiver.onDeleteFinished(); - default -> throw new RuntimeException("Unknown resultCode."); - } - } - - public interface Receiver { - void onDeleteFinished(); - } - } -} diff --git a/src/main/java/de/dennisguse/opentracks/services/TrackDeletionWorker.java b/src/main/java/de/dennisguse/opentracks/services/TrackDeletionWorker.java new file mode 100644 index 000000000..6f8cc8fd8 --- /dev/null +++ b/src/main/java/de/dennisguse/opentracks/services/TrackDeletionWorker.java @@ -0,0 +1,36 @@ +package de.dennisguse.opentracks.services; + +import android.content.Context; + +import androidx.annotation.NonNull; +import androidx.work.Worker; +import androidx.work.WorkerParameters; + +import java.util.Arrays; +import java.util.List; + +import de.dennisguse.opentracks.data.ContentProviderUtils; +import de.dennisguse.opentracks.data.models.Track; + +public class TrackDeletionWorker extends Worker { + + public static final String TRACKIDS_KEY = "TRACKIDS_KEY"; + + private final List trackIds; + + public TrackDeletionWorker(@NonNull Context context, @NonNull WorkerParameters params) { + super(context, params); + + trackIds = Arrays.stream(getInputData().getLongArray(TRACKIDS_KEY)) + .mapToObj(Track.Id::new) + .toList(); + } + + @NonNull + @Override + public Result doWork() { + new ContentProviderUtils(getApplicationContext()).deleteTracks(getApplicationContext(), trackIds); + + return Result.success(); + } +}