synchronously schedule background work, to avoid cancelling race condition
This commit is contained in:
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user