diff --git a/app/build.gradle b/app/build.gradle index 173abd36..726dbe95 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -161,6 +161,8 @@ def requireWifi = project.requireWifi ?: 'false'; // database unencrypted so that it can be easily inspected using Stetho. def encryptionPassword = project.encryptionPassword ?: ''; +def syncAccountName = "sync"; + logger.info('Default server hostname: ${server}') logger.info("Default OpenMRS root URL: ${openmrsRootUrl}") logger.info("Default OpenMRS user: ${openmrsUser}") @@ -208,6 +210,7 @@ android { buildConfigField 'String', 'CONTENT_AUTHORITY', '"' + contentAuthority + '"' resValue 'string', 'account_type', appId buildConfigField 'String', 'ACCOUNT_TYPE', '"' + appId + '"' + buildConfigField 'String', 'ACCOUNT_NAME', '"' + syncAccountName + '"' // Set the SQLite database encryption password. buildConfigField 'String', 'ENCRYPTION_PASSWORD', '"' + encryptionPassword + '"' diff --git a/app/src/main/java/org/projectbuendia/client/diagnostics/BuendiaApiHealthCheck.java b/app/src/main/java/org/projectbuendia/client/diagnostics/BuendiaApiHealthCheck.java index 046d0026..a9ede4fa 100644 --- a/app/src/main/java/org/projectbuendia/client/diagnostics/BuendiaApiHealthCheck.java +++ b/app/src/main/java/org/projectbuendia/client/diagnostics/BuendiaApiHealthCheck.java @@ -158,6 +158,7 @@ public BuendiaModuleHealthCheckRunnable(Handler handler) { case HttpURLConnection.HTTP_FORBIDDEN: case HttpURLConnection.HTTP_UNAUTHORIZED: reportIssue(HealthIssue.SERVER_AUTHENTICATION_ISSUE); + stopImpl(); break; case HttpURLConnection.HTTP_NOT_FOUND: default: diff --git a/app/src/main/java/org/projectbuendia/client/sync/SyncAccountService.java b/app/src/main/java/org/projectbuendia/client/sync/SyncAccountService.java index d6a1ba23..f4683fa2 100644 --- a/app/src/main/java/org/projectbuendia/client/sync/SyncAccountService.java +++ b/app/src/main/java/org/projectbuendia/client/sync/SyncAccountService.java @@ -39,7 +39,6 @@ */ public class SyncAccountService extends Service { - public static final String ACCOUNT_NAME = "sync"; private static final Logger LOG = Logger.create(); private static final long SYNC_PERIOD = 5*60; // 5 minutes (in seconds) @Inject static AppSettings sSettings; @@ -88,7 +87,7 @@ public static void startFullSync() { /** Gets the app's sync account (call initialize() before using this). */ public static Account getAccount() { - return new Account(ACCOUNT_NAME, BuildConfig.ACCOUNT_TYPE); + return new Account(BuildConfig.ACCOUNT_NAME, BuildConfig.ACCOUNT_TYPE); } /** Starts an sync of just the observations. */ diff --git a/app/src/main/java/org/projectbuendia/client/sync/SyncAdapter.java b/app/src/main/java/org/projectbuendia/client/sync/SyncAdapter.java index 91db0c12..4dd77e05 100644 --- a/app/src/main/java/org/projectbuendia/client/sync/SyncAdapter.java +++ b/app/src/main/java/org/projectbuendia/client/sync/SyncAdapter.java @@ -27,6 +27,8 @@ import android.support.annotation.StringRes; import android.util.TimingLogger; +import com.android.volley.AuthFailureError; + import org.joda.time.Instant; import org.projectbuendia.client.App; import org.projectbuendia.client.R; @@ -221,6 +223,11 @@ public SyncAdapter(Context context, boolean autoInitialize, boolean allowParalle LOG.e(e, "Error during sync"); syncResult.stats.numIoExceptions++; getContext().sendBroadcast(syncFailedIntent); + + if (e.getCause().getCause() instanceof AuthFailureError) { + ContentResolver.setIsSyncable(account, Contracts.CONTENT_AUTHORITY, 0); + ContentResolver.setSyncAutomatically(account, Contracts.CONTENT_AUTHORITY, false); + } return; } finally { LOG.i("Releasing savepoint %s", SYNC_SAVEPOINT_NAME); diff --git a/app/src/main/java/org/projectbuendia/client/ui/SettingsActivity.java b/app/src/main/java/org/projectbuendia/client/ui/SettingsActivity.java index 003f9440..9070f6a5 100644 --- a/app/src/main/java/org/projectbuendia/client/ui/SettingsActivity.java +++ b/app/src/main/java/org/projectbuendia/client/ui/SettingsActivity.java @@ -11,7 +11,9 @@ package org.projectbuendia.client.ui; +import android.accounts.Account; import android.annotation.TargetApi; +import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; @@ -26,8 +28,10 @@ import android.view.MenuItem; import org.projectbuendia.client.App; +import org.projectbuendia.client.BuildConfig; import org.projectbuendia.client.R; import org.projectbuendia.client.models.AppModel; +import org.projectbuendia.client.providers.Contracts; import org.projectbuendia.client.ui.login.LoginActivity; import java.util.List; @@ -69,6 +73,11 @@ public class SettingsActivity extends PreferenceActivity { static final Preference.OnPreferenceChangeListener sPrefListener = new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference pref, Object value) { + //Enable sync + Account account = new Account(BuildConfig.ACCOUNT_NAME, BuildConfig.ACCOUNT_TYPE); + ContentResolver.setIsSyncable(account, Contracts.CONTENT_AUTHORITY, 1); + ContentResolver.setSyncAutomatically(account, Contracts.CONTENT_AUTHORITY, true); + updatePrefSummary(pref, value); if (updatingPrefValues) return true; // prevent endless recursion