diff --git a/README.md b/README.md
index 68654b18..91306fba 100644
--- a/README.md
+++ b/README.md
@@ -108,9 +108,6 @@ Some code/libraries/resources are used in the project:
* [Material Dialogs](https://github.com/afollestad/material-dialogs)
Aidan Follestad
Apache License, Version 2.0
-* [Android-Job](https://github.com/evernote/android-job)
- Evernote Corporation
- Apache License, Version 2.0
* [android-ColorPickerPreference](https://github.com/attenzione/android-ColorPickerPreference)
Daniel Nilsson and Sergey Margaritov
Apache License, Version 2.0
diff --git a/app/build.gradle b/app/build.gradle
index aab878f0..2a6c4e95 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -97,7 +97,7 @@ dependencies {
implementation('com.github.afollestad.material-dialogs:core:0.9.6.0@aar') {
transitive = true
}
- implementation 'com.evernote:android-job:1.4.3'
+ implementation 'androidx.work:work-runtime:2.7.1'
implementation "androidx.lifecycle:lifecycle-viewmodel:2.5.1"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index de666339..c1777966 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -273,6 +273,18 @@
android:authorities="@string/search_history_authority"
android:exported="false" />
+
+
+
+
+
log.d(tag, message));
- JobManager.create(this).addJobCreator(new ScheduledJobCreator());
+ public Configuration getWorkManagerConfiguration() {
+ return new Configuration.Builder()
+ .setMinimumLoggingLevel(android.util.Log.DEBUG)
+ .build();
}
}
diff --git a/app/src/main/java/org/transdroid/core/service/AppUpdateJob.java b/app/src/main/java/org/transdroid/core/service/AppUpdateJob.java
index 7cc99a09..f28471b9 100644
--- a/app/src/main/java/org/transdroid/core/service/AppUpdateJob.java
+++ b/app/src/main/java/org/transdroid/core/service/AppUpdateJob.java
@@ -16,13 +16,19 @@
*/
package org.transdroid.core.service;
+import static java.security.AccessController.getContext;
+
import android.content.Context;
import androidx.annotation.NonNull;
-import com.evernote.android.job.Job;
-import com.evernote.android.job.JobManager;
-import com.evernote.android.job.JobRequest;
+import androidx.work.Constraints;
+import androidx.work.Operation;
+import androidx.work.PeriodicWorkRequest;
+import androidx.work.Worker;
+import androidx.work.WorkManager;
+import androidx.work.NetworkType;
+import androidx.work.WorkerParameters;
import org.transdroid.core.app.settings.NotificationSettings;
import org.transdroid.core.app.settings.NotificationSettings_;
@@ -31,37 +37,48 @@ import org.transdroid.core.app.settings.SystemSettings_;
import org.transdroid.core.gui.log.Log_;
import org.transdroid.core.gui.navigation.NavigationHelper_;
+import java.util.UUID;
import java.util.concurrent.TimeUnit;
-public class AppUpdateJob extends Job {
+public class AppUpdateJob extends Worker {
static final String TAG = "app_update_checker";
- private static Integer scheduledJobId;
+ private static UUID scheduledJobId;
+
+ public AppUpdateJob(@NonNull Context context, @NonNull WorkerParameters workerParams) {
+ super(context, workerParams);
+
+ }
- public static void schedule(Context context) {
+ public static void schedule(Context context) {
NotificationSettings notificationSettings = NotificationSettings_.getInstance_(context);
SystemSettings systemSettings = SystemSettings_.getInstance_(context);
NavigationHelper_ navigationHelper = NavigationHelper_.getInstance_(context);
if (systemSettings.checkForUpdates() && navigationHelper.enableUpdateChecker()) {
Log_.getInstance_(context).d(TAG, "Schedule app update checker job");
NotificationChannels.ensureAppUpdateChannel(context, notificationSettings);
- scheduledJobId = new JobRequest.Builder(AppUpdateJob.TAG)
- .setPeriodic(TimeUnit.DAYS.toMillis(1))
- .setRequiredNetworkType(JobRequest.NetworkType.CONNECTED)
- .setUpdateCurrent(true)
- .build()
- .schedule();
+ Constraints constraints = new Constraints.Builder()
+ .setRequiredNetworkType(NetworkType.CONNECTED)
+ .build();
+ PeriodicWorkRequest appUpdate = new PeriodicWorkRequest.Builder(AppUpdateJob.class, 1, TimeUnit.DAYS)
+ .addTag(AppUpdateJob.TAG)
+ .setConstraints(constraints)
+ .build();
+ WorkManager.getInstance(context).cancelAllWorkByTag(AppUpdateJob.TAG);
+ WorkManager.getInstance(context).enqueue(appUpdate);
+ scheduledJobId = appUpdate.getId();
} else if (scheduledJobId != null) {
- Log_.getInstance_(context).d(TAG, "Cancel rss checker job");
- JobManager.instance().cancel(scheduledJobId);
+ Log_.getInstance_(context).d(TAG, "Cancel app update checker job");
+ WorkManager.getInstance(context).cancelWorkById(scheduledJobId);
+ scheduledJobId = null;
}
}
@NonNull
@Override
- protected Result onRunJob(@NonNull Params params) {
- return AppUpdateJobRunner_.getInstance_(getContext()).run();
+ public Result doWork() {
+ return AppUpdateJobRunner_.getInstance_(getApplicationContext()).run();
}
}
diff --git a/app/src/main/java/org/transdroid/core/service/AppUpdateJobRunner.java b/app/src/main/java/org/transdroid/core/service/AppUpdateJobRunner.java
index e2b070ce..0d2d9d27 100644
--- a/app/src/main/java/org/transdroid/core/service/AppUpdateJobRunner.java
+++ b/app/src/main/java/org/transdroid/core/service/AppUpdateJobRunner.java
@@ -26,7 +26,8 @@ import android.net.Uri;
import androidx.core.app.NotificationCompat;
-import com.evernote.android.job.Job;
+import androidx.work.ListenableWorker;
+import androidx.work.Worker;
import org.androidannotations.annotations.Bean;
import org.androidannotations.annotations.EBean;
@@ -73,16 +74,16 @@ public class AppUpdateJobRunner {
@SystemService
protected NotificationManager notificationManager;
- Job.Result run() {
+ Worker.Result run() {
// Only run this service if app updates are handled via transdroid.org at all
if (!navigationHelper.enableUpdateChecker())
- return Job.Result.FAILURE;
+ return Worker.Result.failure();
if (!connectivityHelper.shouldPerformBackgroundActions() || !systemSettings.checkForUpdates()) {
log.d(this, "Skip the app update service, as background data is disabled, the service is explicitly " +
"disabled or we are not connected.");
- return Job.Result.RESCHEDULE;
+ return Worker.Result.retry();
}
Date lastChecked = systemSettings.getLastCheckedForAppUpdates();
@@ -91,7 +92,7 @@ public class AppUpdateJobRunner {
if (lastChecked != null && lastChecked.after(lastDay.getTime())) {
log.d(this, "Skip the update service, as we already checked the last 24 hours (or to be exact at "
+ lastChecked.toString() + ").");
- return Job.Result.RESCHEDULE;
+ return Worker.Result.retry();
}
DefaultHttpClient httpclient = new DefaultHttpClient();
@@ -124,7 +125,7 @@ public class AppUpdateJobRunner {
// New version of the search module?
try {
PackageInfo searchPackage = context.getPackageManager().getPackageInfo("org.transdroid.search", 0);
- log.d(this, "Local Transdroid Seach is at " + searchPackage.getLongVersionCode()
+ log.d(this, "Local Transdroid Search is at " + searchPackage.getLongVersionCode()
+ " and the reported latest version is " + searchVersion);
if (searchPackage.getLongVersionCode() < searchVersion) {
// New version available! Notify the user.
@@ -145,10 +146,10 @@ public class AppUpdateJobRunner {
} catch (Exception e) {
// Cannot check right now for some reason; log and ignore
log.d(this, "Cannot retrieve latest app or search module version code from the site: " + e.toString());
- return Job.Result.FAILURE;
+ return Worker.Result.failure();
}
- return Job.Result.SUCCESS;
+ return Worker.Result.success();
}
/**
diff --git a/app/src/main/java/org/transdroid/core/service/RssCheckerJob.java b/app/src/main/java/org/transdroid/core/service/RssCheckerJob.java
index bab72d75..268cc914 100644
--- a/app/src/main/java/org/transdroid/core/service/RssCheckerJob.java
+++ b/app/src/main/java/org/transdroid/core/service/RssCheckerJob.java
@@ -16,45 +16,62 @@
*/
package org.transdroid.core.service;
+import static java.security.AccessController.getContext;
+
import android.content.Context;
import androidx.annotation.NonNull;
-import com.evernote.android.job.Job;
-import com.evernote.android.job.JobManager;
-import com.evernote.android.job.JobRequest;
+import androidx.work.Constraints;
+import androidx.work.PeriodicWorkRequest;
+import androidx.work.Worker;
+import androidx.work.WorkManager;
+import androidx.work.NetworkType;
+import androidx.work.WorkerParameters;
import org.transdroid.core.app.settings.NotificationSettings;
import org.transdroid.core.app.settings.NotificationSettings_;
import org.transdroid.core.gui.log.Log_;
-public class RssCheckerJob extends Job {
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
+
+public class RssCheckerJob extends Worker {
static final String TAG = "rss_checker";
- private static Integer scheduledJobId;
+ private static UUID scheduledJobId;
+
+ public RssCheckerJob(@NonNull Context context, @NonNull WorkerParameters workerParams) {
+ super(context, workerParams);
+ }
public static void schedule(Context context) {
NotificationSettings notificationSettings = NotificationSettings_.getInstance_(context);
if (notificationSettings.isEnabledForRss()) {
Log_.getInstance_(context).d(TAG, "Schedule rss checker job");
NotificationChannels.ensureRssCheckerChannel(context, notificationSettings);
- scheduledJobId = new JobRequest.Builder(RssCheckerJob.TAG)
- .setPeriodic(notificationSettings.getInvervalInMilliseconds())
- .setRequiredNetworkType(JobRequest.NetworkType.CONNECTED)
- .setUpdateCurrent(true)
- .build()
- .schedule();
+ Constraints constraints = new Constraints.Builder()
+ .setRequiredNetworkType(NetworkType.CONNECTED)
+ .build();
+ PeriodicWorkRequest rssChecker = new PeriodicWorkRequest.Builder(RssCheckerJob.class, notificationSettings.getInvervalInMilliseconds(), TimeUnit.MILLISECONDS)
+ .addTag(RssCheckerJob.TAG)
+ .setConstraints(constraints)
+ .build();
+ WorkManager.getInstance(context).cancelAllWorkByTag(RssCheckerJob.TAG);
+ WorkManager.getInstance(context).enqueue(rssChecker);
+ scheduledJobId = rssChecker.getId();
} else if (scheduledJobId != null) {
Log_.getInstance_(context).d(TAG, "Cancel rss checker job");
- JobManager.instance().cancel(scheduledJobId);
+ WorkManager.getInstance(context).cancelWorkById(scheduledJobId);
+ scheduledJobId = null;
}
}
@NonNull
@Override
- protected Result onRunJob(@NonNull Params params) {
- return RssCheckerJobRunner_.getInstance_(getContext()).run();
+ public Result doWork() {
+ return RssCheckerJobRunner_.getInstance_(getApplicationContext()).run();
}
}
diff --git a/app/src/main/java/org/transdroid/core/service/RssCheckerJobRunner.java b/app/src/main/java/org/transdroid/core/service/RssCheckerJobRunner.java
index b8fb04a4..48998ee8 100644
--- a/app/src/main/java/org/transdroid/core/service/RssCheckerJobRunner.java
+++ b/app/src/main/java/org/transdroid/core/service/RssCheckerJobRunner.java
@@ -22,8 +22,7 @@ import android.content.Context;
import android.content.Intent;
import androidx.core.app.NotificationCompat;
-
-import com.evernote.android.job.Job;
+import androidx.work.Worker;
import org.androidannotations.annotations.Bean;
import org.androidannotations.annotations.EBean;
@@ -59,12 +58,12 @@ public class RssCheckerJobRunner {
@SystemService
protected NotificationManager notificationManager;
- Job.Result run() {
+ Worker.Result run() {
if (!connectivityHelper.shouldPerformBackgroundActions() || !notificationSettings.isEnabledForRss()) {
log.d(this,
"Skip the RSS checker service, as background data is disabled, the service is disabled or we are not connected.");
- return Job.Result.RESCHEDULE;
+ return Worker.Result.retry();
}
// Check every RSS feed for new items
@@ -117,7 +116,7 @@ public class RssCheckerJobRunner {
if (unread == 0) {
// No new items; just exit
- return Job.Result.SUCCESS;
+ return Worker.Result.success();
}
// Provide a notification, since there are new RSS items
@@ -140,7 +139,7 @@ public class RssCheckerJobRunner {
}
notificationManager.notify(80001, builder.build());
- return Job.Result.SUCCESS;
+ return Worker.Result.success();
}
}
diff --git a/app/src/main/java/org/transdroid/core/service/ScheduledJobCreator.java b/app/src/main/java/org/transdroid/core/service/ScheduledJobCreator.java
deleted file mode 100644
index e6209c05..00000000
--- a/app/src/main/java/org/transdroid/core/service/ScheduledJobCreator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright 2010-2018 Eric Kok et al.
- *
- * Transdroid is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * Transdroid is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Transdroid. If not, see .
- */
-package org.transdroid.core.service;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import com.evernote.android.job.Job;
-import com.evernote.android.job.JobCreator;
-
-public class ScheduledJobCreator implements JobCreator {
-
- @Nullable
- @Override
- public Job create(@NonNull String tag) {
- switch (tag) {
- case AppUpdateJob.TAG:
- return new AppUpdateJob();
- case RssCheckerJob.TAG:
- return new RssCheckerJob();
- case ServerCheckerJob.TAG:
- return new ServerCheckerJob();
- default:
- return null;
- }
- }
-
-}
diff --git a/app/src/main/java/org/transdroid/core/service/ServerCheckerJob.java b/app/src/main/java/org/transdroid/core/service/ServerCheckerJob.java
index 0903a14e..ebdab8fb 100644
--- a/app/src/main/java/org/transdroid/core/service/ServerCheckerJob.java
+++ b/app/src/main/java/org/transdroid/core/service/ServerCheckerJob.java
@@ -20,41 +20,58 @@ import android.content.Context;
import androidx.annotation.NonNull;
-import com.evernote.android.job.Job;
-import com.evernote.android.job.JobManager;
-import com.evernote.android.job.JobRequest;
+import androidx.annotation.WorkerThread;
+import androidx.work.Constraints;
+import androidx.work.PeriodicWorkRequest;
+import androidx.work.Worker;
+import androidx.work.WorkManager;
+import androidx.work.NetworkType;
+import androidx.work.WorkerParameters;
import org.transdroid.core.app.settings.NotificationSettings;
import org.transdroid.core.app.settings.NotificationSettings_;
import org.transdroid.core.gui.log.Log_;
-public class ServerCheckerJob extends Job {
+import java.time.Period;
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
+
+public class ServerCheckerJob extends Worker {
static final String TAG = "server_checker";
- private static Integer scheduledJobId;
+ private static UUID scheduledJobId;
+
+ public ServerCheckerJob(@NonNull Context context, @NonNull WorkerParameters workerParams) {
+ super(context, workerParams);
+ }
public static void schedule(Context context) {
NotificationSettings notificationSettings = NotificationSettings_.getInstance_(context);
if (notificationSettings.isEnabledForTorrents()) {
Log_.getInstance_(context).d(TAG, "Schedule server checker job");
NotificationChannels.ensureServerCheckerChannel(context, notificationSettings);
- scheduledJobId = new JobRequest.Builder(ServerCheckerJob.TAG)
- .setPeriodic(notificationSettings.getInvervalInMilliseconds())
- .setRequiredNetworkType(JobRequest.NetworkType.CONNECTED)
- .setUpdateCurrent(true)
- .build()
- .schedule();
+ Constraints constraints = new Constraints.Builder()
+ .setRequiredNetworkType(NetworkType.CONNECTED)
+ .build();
+ PeriodicWorkRequest serverChecker = new PeriodicWorkRequest.Builder(ServerCheckerJob.class, notificationSettings.getInvervalInMilliseconds(), TimeUnit.MILLISECONDS)
+ .addTag(ServerCheckerJob.TAG)
+ .setConstraints(constraints)
+ .build();
+ WorkManager.getInstance(context).cancelAllWorkByTag(ServerCheckerJob.TAG);
+ WorkManager.getInstance(context).enqueue(serverChecker);
+ scheduledJobId = serverChecker.getId();
} else if (scheduledJobId != null) {
Log_.getInstance_(context).d(TAG, "Cancel server checker job");
- JobManager.instance().cancel(scheduledJobId);
+ WorkManager.getInstance(context).cancelWorkById(scheduledJobId);
+ scheduledJobId = null;
}
}
@NonNull
@Override
- protected Result onRunJob(@NonNull Params params) {
- return ServerCheckerJobRunner_.getInstance_(getContext()).run();
+ public Result doWork() {
+ return ServerCheckerJobRunner_.getInstance_(getApplicationContext()).run();
}
}
diff --git a/app/src/main/java/org/transdroid/core/service/ServerCheckerJobRunner.java b/app/src/main/java/org/transdroid/core/service/ServerCheckerJobRunner.java
index c6b00d0b..e19f398a 100644
--- a/app/src/main/java/org/transdroid/core/service/ServerCheckerJobRunner.java
+++ b/app/src/main/java/org/transdroid/core/service/ServerCheckerJobRunner.java
@@ -22,7 +22,7 @@ import android.content.Context;
import android.content.Intent;
import android.text.TextUtils;
import androidx.core.app.NotificationCompat;
-import com.evernote.android.job.Job;
+import androidx.work.Worker;
import org.androidannotations.annotations.Bean;
import org.androidannotations.annotations.EBean;
import org.androidannotations.annotations.RootContext;
@@ -61,12 +61,12 @@ public class ServerCheckerJobRunner {
@SystemService
protected NotificationManager notificationManager;
- Job.Result run() {
+ Worker.Result run() {
if (!connectivityHelper.shouldPerformBackgroundActions() || !notificationSettings.isEnabledForTorrents()) {
log.d(this,
"Skip the server checker service, as background data is disabled, the service is disabled or we are not connected.");
- return Job.Result.RESCHEDULE;
+ return Worker.Result.retry();
}
int notifyBase = 10000;
@@ -207,7 +207,7 @@ public class ServerCheckerJobRunner {
}
- return Job.Result.SUCCESS;
+ return Worker.Result.success();
}
private Boolean findLastDoneStat(JSONArray lastStats, Torrent torrent) {