forked from upstream-mirrors/OpenTracks
@@ -152,6 +152,7 @@ dependencies {
|
|||||||
implementation 'androidx.core:core-splashscreen:1.0.1'
|
implementation 'androidx.core:core-splashscreen:1.0.1'
|
||||||
implementation 'androidx.mediarouter:mediarouter:1.8.1'
|
implementation 'androidx.mediarouter:mediarouter:1.8.1'
|
||||||
implementation 'androidx.core:core-location-altitude:1.0.0-alpha03'
|
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:core:1.7.0'
|
||||||
androidTestImplementation 'androidx.test.ext:junit:1.3.0'
|
androidTestImplementation 'androidx.test.ext:junit:1.3.0'
|
||||||
|
|||||||
@@ -405,11 +405,6 @@ limitations under the License.
|
|||||||
android:exported="false"
|
android:exported="false"
|
||||||
android:permission="android.permission.BIND_JOB_SERVICE" />
|
android:permission="android.permission.BIND_JOB_SERVICE" />
|
||||||
|
|
||||||
<service
|
|
||||||
android:name=".services.TrackDeleteService"
|
|
||||||
android:exported="false"
|
|
||||||
android:permission="android.permission.BIND_JOB_SERVICE"/>
|
|
||||||
|
|
||||||
<!--Necessary for SDK < 33 to (re-)store per app locale information-->
|
<!--Necessary for SDK < 33 to (re-)store per app locale information-->
|
||||||
<service
|
<service
|
||||||
android:name="androidx.appcompat.app.AppLocalesMetadataHolderService"
|
android:name="androidx.appcompat.app.AppLocalesMetadataHolderService"
|
||||||
|
|||||||
@@ -16,15 +16,19 @@
|
|||||||
|
|
||||||
package de.dennisguse.opentracks;
|
package de.dennisguse.opentracks;
|
||||||
|
|
||||||
import android.os.Handler;
|
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import androidx.work.Data;
|
||||||
|
import androidx.work.OneTimeWorkRequest;
|
||||||
|
import androidx.work.WorkManager;
|
||||||
|
import androidx.work.WorkRequest;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import de.dennisguse.opentracks.data.models.Track;
|
import de.dennisguse.opentracks.data.models.Track;
|
||||||
import de.dennisguse.opentracks.services.TrackDeleteService;
|
import de.dennisguse.opentracks.services.TrackDeletionWorker;
|
||||||
import de.dennisguse.opentracks.ui.aggregatedStatistics.ConfirmDeleteDialogFragment;
|
import de.dennisguse.opentracks.ui.aggregatedStatistics.ConfirmDeleteDialogFragment;
|
||||||
import de.dennisguse.opentracks.ui.aggregatedStatistics.ConfirmDeleteDialogFragment.ConfirmDeleteCaller;
|
import de.dennisguse.opentracks.ui.aggregatedStatistics.ConfirmDeleteDialogFragment.ConfirmDeleteCaller;
|
||||||
|
|
||||||
@@ -37,7 +41,7 @@ import de.dennisguse.opentracks.ui.aggregatedStatistics.ConfirmDeleteDialogFragm
|
|||||||
* @author Jimmy Shih
|
* @author Jimmy Shih
|
||||||
*/
|
*/
|
||||||
//TODO Check if this class is still such a good idea; inheritance might limit maintainability
|
//TODO Check if this class is still such a good idea; inheritance might limit maintainability
|
||||||
public abstract class AbstractTrackDeleteActivity extends AbstractActivity implements ConfirmDeleteCaller, TrackDeleteService.TrackDeleteResultReceiver.Receiver {
|
public abstract class AbstractTrackDeleteActivity extends AbstractActivity implements ConfirmDeleteCaller {
|
||||||
|
|
||||||
protected void deleteTracks(Track.Id... trackIds) {
|
protected void deleteTracks(Track.Id... trackIds) {
|
||||||
ConfirmDeleteDialogFragment.showDialog(getSupportFragmentManager(), trackIds);
|
ConfirmDeleteDialogFragment.showDialog(getSupportFragmentManager(), trackIds);
|
||||||
@@ -55,10 +59,29 @@ public abstract class AbstractTrackDeleteActivity extends AbstractActivity imple
|
|||||||
Toast.makeText(this, getString(R.string.track_delete_not_recording), Toast.LENGTH_LONG).show();
|
Toast.makeText(this, getString(R.string.track_delete_not_recording), Toast.LENGTH_LONG).show();
|
||||||
}
|
}
|
||||||
|
|
||||||
TrackDeleteService.enqueue(this, new TrackDeleteService.TrackDeleteResultReceiver(new Handler(), this), trackIdList);
|
WorkManager workManager = WorkManager.getInstance(this);
|
||||||
|
WorkRequest deleteRequest = new OneTimeWorkRequest.Builder(TrackDeletionWorker.class)
|
||||||
|
.setInputData(new Data.Builder()
|
||||||
|
.putLongArray(TrackDeletionWorker.TRACKIDS_KEY, Arrays.stream(trackIds).mapToLong(Track.Id::id).toArray())
|
||||||
|
.build())
|
||||||
|
.build();
|
||||||
|
|
||||||
|
workManager
|
||||||
|
.getWorkInfoByIdLiveData(deleteRequest.getId())
|
||||||
|
.observe(this, workInfo -> {
|
||||||
|
if (workInfo != null) {
|
||||||
|
if (workInfo.getState().isFinished()) {
|
||||||
|
onDeleteFinished();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
workManager.enqueue(deleteRequest);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract void onDeleteConfirmed();
|
protected abstract void onDeleteConfirmed();
|
||||||
|
|
||||||
|
protected abstract void onDeleteFinished();
|
||||||
|
|
||||||
protected abstract Track.Id getRecordingTrackId();
|
protected abstract Track.Id getRecordingTrackId();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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<Track.Id> 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<Track.Id> 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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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<Track.Id> 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user