diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java index 52b420f35..4ac7bae21 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/Constants.java @@ -151,7 +151,7 @@ public final class Constants { public static final String SYNC_CONTACTS = "syncContacts"; public static final String SYNC_KEYSERVER = "syncKeyserver"; public static final String ENABLE_WIFI_SYNC_ONLY = "enableWifiSyncOnly"; - public static final String SYNC_IS_SCHEDULED = "syncIsScheduled"; + public static final String SYNC_WORK_UUID = "syncWorkUuid"; // other settings public static final String EXPERIMENTAL_ENABLE_LINKED_IDENTITIES = "experimentalEnableLinkedIdentities"; public static final String EXPERIMENTAL_ENABLE_KEYBASE = "experimentalEnableKeybase"; diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java index c8149ba76..29bb8bade 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/KeychainApplication.java @@ -104,7 +104,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.updateKeyserverSyncScheduleAsync(this, Constants.DEBUG_KEYSERVER_SYNC); + KeyserverSyncManager.updateKeyserverSyncScheduleAsync(this, false); 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 3506105b8..4c01bfdf8 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keysync/KeyserverSyncManager.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/keysync/KeyserverSyncManager.java @@ -18,19 +18,23 @@ package org.sufficientlysecure.keychain.keysync; +import java.util.UUID; import java.util.concurrent.TimeUnit; import android.content.Context; import android.os.AsyncTask; import android.os.Build.VERSION; import android.os.Build.VERSION_CODES; +import android.support.annotation.WorkerThread; import androidx.work.Constraints.Builder; import androidx.work.NetworkType; import androidx.work.OneTimeWorkRequest; import androidx.work.PeriodicWorkRequest; +import androidx.work.State; import androidx.work.SynchronousWorkManager; import androidx.work.WorkManager; +import androidx.work.WorkStatus; import org.sufficientlysecure.keychain.util.Preferences; import timber.log.Timber; @@ -42,11 +46,6 @@ public class KeyserverSyncManager { private static final String PERIODIC_WORK_TAG = "keyserverSync"; public static void updateKeyserverSyncScheduleAsync(Context context, boolean forceReschedule) { - Preferences prefs = Preferences.getPreferences(context); - if (!forceReschedule && prefs.isKeyserverSyncScheduled() != prefs.isKeyserverSyncEnabled()) { - return; - } - new AsyncTask() { @Override protected Void doInBackground(Void... voids) { @@ -56,21 +55,37 @@ public class KeyserverSyncManager { }.execute(); } + @WorkerThread 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. WorkManager workManager = WorkManager.getInstance(); if (workManager == null) { Timber.e("WorkManager unavailable!"); return; } SynchronousWorkManager synchronousWorkManager = workManager.synchronous(); + + UUID workUuid = prefs.getKeyserverSyncWorkUuid(); + WorkStatus status = workUuid != null ? synchronousWorkManager.getStatusByIdSync(workUuid) : null; + boolean workIsScheduled = status != null && status.getState() != State.CANCELLED; + if (workIsScheduled == prefs.isKeyserverSyncEnabled()) { + if (!forceReschedule) { + Timber.d("Key sync already scheduled, no changes necessary"); + return; + } + Timber.d("Key sync already scheduled, but forcing reschedule"); + } + + Timber.d("Cancelling sync tasks…"); synchronousWorkManager.cancelAllWorkByTagSync(PERIODIC_WORK_TAG); if (!prefs.isKeyserverSyncEnabled()) { + Timber.d("Key sync disabled"); return; } + Timber.d("Scheduling periodic key sync"); + Builder constraints = new Builder() .setRequiredNetworkType(prefs.getWifiOnlySync() ? NetworkType.UNMETERED : NetworkType.CONNECTED) .setRequiresBatteryNotLow(true); @@ -85,7 +100,8 @@ public class KeyserverSyncManager { .build(); synchronousWorkManager.enqueueSync(workRequest); - prefs.setKeyserverSyncScheduled(true); + Timber.d("Work id: %s", workRequest.getId()); + prefs.setKeyserverSyncScheduled(workRequest.getId()); } public static void debugRunSyncNow() { diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java index f2f308d65..8dd09205e 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/Preferences.java @@ -21,6 +21,7 @@ package org.sufficientlysecure.keychain.util; import java.net.Proxy; import java.util.ArrayList; import java.util.ListIterator; +import java.util.UUID; import android.annotation.SuppressLint; import android.content.Context; @@ -33,7 +34,6 @@ import android.support.annotation.Nullable; import com.google.auto.value.AutoValue; import org.sufficientlysecure.keychain.Constants; import org.sufficientlysecure.keychain.Constants.Pref; -import org.sufficientlysecure.keychain.analytics.AnalyticsManager; import org.sufficientlysecure.keychain.keyimport.HkpKeyserverAddress; import timber.log.Timber; @@ -350,12 +350,14 @@ public class Preferences { return mSharedPreferences.getBoolean(Pref.SYNC_KEYSERVER, true); } - public boolean isKeyserverSyncScheduled() { - return mSharedPreferences.getBoolean(Pref.SYNC_IS_SCHEDULED, false); + public UUID getKeyserverSyncWorkUuid() { + String uuidString = mSharedPreferences.getString(Pref.SYNC_WORK_UUID, null); + return uuidString != null ? UUID.fromString(uuidString) : null; } - public void setKeyserverSyncScheduled(boolean isScheduled) { - mSharedPreferences.edit().putBoolean(Pref.SYNC_IS_SCHEDULED, isScheduled).apply(); + public void setKeyserverSyncScheduled(UUID uuid) { + String value = uuid != null ? uuid.toString() : null; + mSharedPreferences.edit().putString(Pref.SYNC_WORK_UUID, value).apply(); } public boolean isAnalyticsAskedPolitely() {