From 84f20f6646832755e8406381d05d757e22a645cb Mon Sep 17 00:00:00 2001 From: Vincent Breitmoser Date: Fri, 13 Jul 2018 14:52:50 +0200 Subject: [PATCH] synchronously schedule background work, to avoid cancelling race condition --- .../keychain/KeychainApplication.java | 2 +- .../keysync/KeyserverSyncManager.java | 23 +++++++++++++++---- .../keychain/ui/SettingsActivity.java | 2 +- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java index 3cd3353ea..b51071e3e 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java @@ -102,7 +102,7 @@ public class KeychainApplication extends Application { TlsCertificatePinning.addPinnedCertificate("api.keybase.io", getAssets(), "api.keybase.io.CA.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(); } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keysync/KeyserverSyncManager.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keysync/KeyserverSyncManager.java index 228a50518..8ce36ff9e 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keysync/KeyserverSyncManager.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keysync/KeyserverSyncManager.java @@ -21,6 +21,7 @@ package org.sufficientlysecure.keychain.keysync; import java.util.concurrent.TimeUnit; import android.content.Context; +import android.os.AsyncTask; import android.os.Build.VERSION; import android.os.Build.VERSION_CODES; @@ -28,6 +29,7 @@ import androidx.work.Constraints.Builder; import androidx.work.NetworkType; import androidx.work.OneTimeWorkRequest; import androidx.work.PeriodicWorkRequest; +import androidx.work.SynchronousWorkManager; import androidx.work.WorkManager; import org.sufficientlysecure.keychain.util.Preferences; import timber.log.Timber; @@ -39,17 +41,30 @@ public class KeyserverSyncManager { 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); if (!forceReschedule && prefs.isKeyserverSyncScheduled() != prefs.isKeyserverSyncEnabled()) { return; } - WorkManager workManager = WorkManager.getInstance(); + + new AsyncTask() { + @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) { Timber.e("WorkManager unavailable!"); return; } - workManager.cancelAllWorkByTag(PERIODIC_WORK_TAG); + workManager.cancelAllWorkByTagSync(PERIODIC_WORK_TAG); if (!prefs.isKeyserverSyncEnabled()) { return; @@ -67,7 +82,7 @@ public class KeyserverSyncManager { .setConstraints(constraints.build()) .addTag(PERIODIC_WORK_TAG) .build(); - workManager.enqueue(workRequest); + workManager.enqueueSync(workRequest); prefs.setKeyserverSyncScheduled(true); } diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsActivity.java index 46b5f3a7d..f12943f14 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/SettingsActivity.java @@ -415,7 +415,7 @@ public class SettingsActivity extends AppCompatPreferenceActivity { @Override public void onStop() { super.onStop(); - KeyserverSyncManager.updateKeyserverSyncSchedule(getActivity(), true); + KeyserverSyncManager.updateKeyserverSyncScheduleAsync(getActivity(), true); } @Override