Project Volta: Scheduling jobs
*/
@@ -19,25 +14,13 @@ import android.content.Intent;
public class UpdateJobService extends JobService {
@Override
public boolean onStartJob(final JobParameters params) {
- new Thread() {
- @Override
- public void run() {
- // faking the actually run time
- try {
- startService(new Intent(UpdateJobService.this, UpdateService.class));
- Thread.sleep(2000);
- } catch (InterruptedException e) {
- // ignored
- } finally {
- jobFinished(params, false);
- }
- }
- }.start();
- return true;
+ UpdateService.updateNow(this);
+ return false;
}
@Override
public boolean onStopJob(JobParameters params) {
- return false;
+ // TODO this should gracefully stop UpdateService
+ return true;
}
}
diff --git a/app/src/main/java/org/fdroid/fdroid/UpdateService.java b/app/src/main/java/org/fdroid/fdroid/UpdateService.java
index 2b06fb2b6..7e431430e 100644
--- a/app/src/main/java/org/fdroid/fdroid/UpdateService.java
+++ b/app/src/main/java/org/fdroid/fdroid/UpdateService.java
@@ -37,6 +37,8 @@ import android.os.Handler;
import android.os.Looper;
import android.os.Process;
import android.os.SystemClock;
+import android.support.annotation.NonNull;
+import android.support.v4.app.JobIntentService;
import android.support.v4.app.NotificationCompat;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.preference.PreferenceManager;
@@ -60,7 +62,7 @@ import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
-public class UpdateService extends IntentService {
+public class UpdateService extends JobIntentService {
private static final String TAG = "UpdateService";
@@ -81,6 +83,7 @@ public class UpdateService extends IntentService {
public static final int STATUS_INFO = 5;
private static final String STATE_LAST_UPDATED = "lastUpdateCheck";
+ private static final int JOB_ID = 0xfedcba;
private static final int NOTIFY_ID_UPDATING = 0;
@@ -92,10 +95,6 @@ public class UpdateService extends IntentService {
private static boolean updating;
- public UpdateService() {
- super("UpdateService");
- }
-
public static void updateNow(Context context) {
updateRepoNow(context, null);
}
@@ -106,7 +105,7 @@ public class UpdateService extends IntentService {
if (!TextUtils.isEmpty(address)) {
intent.setData(Uri.parse(address));
}
- context.startService(intent);
+ enqueueWork(context, intent);
}
/**
@@ -117,7 +116,16 @@ public class UpdateService extends IntentService {
public static void forceUpdateRepo(Context context) {
Intent intent = new Intent(context, UpdateService.class);
intent.putExtra(EXTRA_FORCED_UPDATE, true);
- context.startService(intent);
+ enqueueWork(context, intent);
+ }
+
+ /**
+ * Add work to the queue for processing now
+ *
+ * @see JobIntentService#enqueueWork(Context, Class, int, Intent)
+ */
+ private static void enqueueWork(Context context, @NonNull Intent intent) {
+ enqueueWork(context, UpdateService.class, JOB_ID, intent);
}
/**
@@ -150,7 +158,7 @@ public class UpdateService extends IntentService {
Utils.debugLog(TAG, "Using android-21 JobScheduler for updates");
JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
ComponentName componentName = new ComponentName(context, UpdateJobService.class);
- JobInfo.Builder builder = new JobInfo.Builder(0xfedcba, componentName)
+ JobInfo.Builder builder = new JobInfo.Builder(JOB_ID, componentName)
.setRequiresDeviceIdle(true)
.setPeriodic(interval);
if (Build.VERSION.SDK_INT >= 26) {
@@ -368,18 +376,13 @@ public class UpdateService extends IntentService {
}
@Override
- protected void onHandleIntent(Intent intent) {
+ protected void onHandleWork(@NonNull Intent intent) {
Process.setThreadPriority(Process.THREAD_PRIORITY_LOWEST);
final long startTime = System.currentTimeMillis();
- boolean manualUpdate = false;
- boolean forcedUpdate = false;
- String address = null;
- if (intent != null) {
- address = intent.getDataString();
- manualUpdate = intent.getBooleanExtra(EXTRA_MANUAL_UPDATE, false);
- forcedUpdate = intent.getBooleanExtra(EXTRA_FORCED_UPDATE, false);
- }
+ boolean manualUpdate = intent.getBooleanExtra(EXTRA_MANUAL_UPDATE, false);
+ boolean forcedUpdate = intent.getBooleanExtra(EXTRA_FORCED_UPDATE, false);
+ String address = intent.getDataString();
try {
final Preferences fdroidPrefs = Preferences.get();
diff --git a/app/src/main/java/org/fdroid/fdroid/net/WifiStateChangeService.java b/app/src/main/java/org/fdroid/fdroid/net/WifiStateChangeService.java
index cdc99524f..023524a9a 100644
--- a/app/src/main/java/org/fdroid/fdroid/net/WifiStateChangeService.java
+++ b/app/src/main/java/org/fdroid/fdroid/net/WifiStateChangeService.java
@@ -47,7 +47,7 @@ import java.util.Locale;
* This also schedules an update to encourage updates happening on
* unmetered networks like typical WiFi rather than networks that can
* cost money or have caps. The logic for checking the state of the
- * internet connection is in {@link org.fdroid.fdroid.UpdateService#onHandleIntent(Intent)}
+ * internet connection is in {@link org.fdroid.fdroid.UpdateService#onHandleWork(Intent)}
*
* Some devices send multiple copies of given events, like a Moto G often
* sends three {@code CONNECTED} events. So they have to be debounced to