synchronously schedule background work, to avoid cancelling race condition

This commit is contained in:
Vincent Breitmoser
2018-07-13 14:52:50 +02:00
parent de3123b2c3
commit 84f20f6646
3 changed files with 21 additions and 6 deletions

View File

@@ -102,7 +102,7 @@ public class KeychainApplication extends Application {
TlsCertificatePinning.addPinnedCertificate("api.keybase.io", getAssets(), "api.keybase.io.CA.cer"); TlsCertificatePinning.addPinnedCertificate("api.keybase.io", getAssets(), "api.keybase.io.CA.cer");
TlsCertificatePinning.addPinnedCertificate("keyserver.ubuntu.com", getAssets(), "DigiCertGlobalRootCA.cer"); TlsCertificatePinning.addPinnedCertificate("keyserver.ubuntu.com", getAssets(), "DigiCertGlobalRootCA.cer");
KeyserverSyncManager.updateKeyserverSyncSchedule(this, Constants.DEBUG_KEYSERVER_SYNC); KeyserverSyncManager.updateKeyserverSyncScheduleAsync(this, Constants.DEBUG_KEYSERVER_SYNC);
TemporaryFileProvider.scheduleCleanupImmediately(); TemporaryFileProvider.scheduleCleanupImmediately();
} }

View File

@@ -21,6 +21,7 @@ package org.sufficientlysecure.keychain.keysync;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import android.content.Context; import android.content.Context;
import android.os.AsyncTask;
import android.os.Build.VERSION; import android.os.Build.VERSION;
import android.os.Build.VERSION_CODES; import android.os.Build.VERSION_CODES;
@@ -28,6 +29,7 @@ import androidx.work.Constraints.Builder;
import androidx.work.NetworkType; import androidx.work.NetworkType;
import androidx.work.OneTimeWorkRequest; import androidx.work.OneTimeWorkRequest;
import androidx.work.PeriodicWorkRequest; import androidx.work.PeriodicWorkRequest;
import androidx.work.SynchronousWorkManager;
import androidx.work.WorkManager; import androidx.work.WorkManager;
import org.sufficientlysecure.keychain.util.Preferences; import org.sufficientlysecure.keychain.util.Preferences;
import timber.log.Timber; import timber.log.Timber;
@@ -39,17 +41,30 @@ public class KeyserverSyncManager {
private static final String PERIODIC_WORK_TAG = "keyserverSync"; private static final String PERIODIC_WORK_TAG = "keyserverSync";
public static void updateKeyserverSyncSchedule(Context context, boolean forceReschedule) { public static void updateKeyserverSyncScheduleAsync(Context context, boolean forceReschedule) {
Preferences prefs = Preferences.getPreferences(context); Preferences prefs = Preferences.getPreferences(context);
if (!forceReschedule && prefs.isKeyserverSyncScheduled() != prefs.isKeyserverSyncEnabled()) { if (!forceReschedule && prefs.isKeyserverSyncScheduled() != prefs.isKeyserverSyncEnabled()) {
return; return;
} }
WorkManager workManager = WorkManager.getInstance();
new AsyncTask<Void,Void,Void>() {
@Override
protected Void doInBackground(Void... voids) {
updateKeyserverSyncSchedule(context, forceReschedule);
return null;
}
}.execute();
}
private static void updateKeyserverSyncSchedule(Context context, boolean forceReschedule) {
Preferences prefs = Preferences.getPreferences(context);
// for some reason, the task is not actually scheduled sometimes unless we use the synchronous interface.
SynchronousWorkManager workManager = WorkManager.getInstance().synchronous();
if (workManager == null) { if (workManager == null) {
Timber.e("WorkManager unavailable!"); Timber.e("WorkManager unavailable!");
return; return;
} }
workManager.cancelAllWorkByTag(PERIODIC_WORK_TAG); workManager.cancelAllWorkByTagSync(PERIODIC_WORK_TAG);
if (!prefs.isKeyserverSyncEnabled()) { if (!prefs.isKeyserverSyncEnabled()) {
return; return;
@@ -67,7 +82,7 @@ public class KeyserverSyncManager {
.setConstraints(constraints.build()) .setConstraints(constraints.build())
.addTag(PERIODIC_WORK_TAG) .addTag(PERIODIC_WORK_TAG)
.build(); .build();
workManager.enqueue(workRequest); workManager.enqueueSync(workRequest);
prefs.setKeyserverSyncScheduled(true); prefs.setKeyserverSyncScheduled(true);
} }

View File

@@ -415,7 +415,7 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
@Override @Override
public void onStop() { public void onStop() {
super.onStop(); super.onStop();
KeyserverSyncManager.updateKeyserverSyncSchedule(getActivity(), true); KeyserverSyncManager.updateKeyserverSyncScheduleAsync(getActivity(), true);
} }
@Override @Override