diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/di/FhirEngineModule.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/di/FhirEngineModule.kt
index f39ef440b6..2b6afdaab7 100644
--- a/android/engine/src/main/java/org/smartregister/fhircore/engine/di/FhirEngineModule.kt
+++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/di/FhirEngineModule.kt
@@ -55,7 +55,7 @@ class FhirEngineModule {
FhirEngineProvider.init(
FhirEngineConfiguration(
enableEncryptionIfSupported = !BuildConfig.DEBUG,
- databaseErrorStrategy = DatabaseErrorStrategy.UNSPECIFIED,
+ databaseErrorStrategy = DatabaseErrorStrategy.RECREATE_AT_OPEN,
ServerConfiguration(
baseUrl = configService.provideAuthConfiguration().fhirServerBaseUrl,
authenticator = tokenAuthenticator,
diff --git a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/SecureSharedPreference.kt b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/SecureSharedPreference.kt
index 0a237208b7..9fcdc526e8 100644
--- a/android/engine/src/main/java/org/smartregister/fhircore/engine/util/SecureSharedPreference.kt
+++ b/android/engine/src/main/java/org/smartregister/fhircore/engine/util/SecureSharedPreference.kt
@@ -17,6 +17,7 @@
package org.smartregister.fhircore.engine.util
import android.content.Context
+import android.content.SharedPreferences
import androidx.core.content.edit
import androidx.security.crypto.EncryptedSharedPreferences
import androidx.security.crypto.MasterKey
@@ -34,8 +35,20 @@ import org.smartregister.fhircore.engine.util.extension.encodeJson
@Singleton
class SecureSharedPreference @Inject constructor(@ApplicationContext val context: Context) {
+ private val secureSharedPreferences: SharedPreferences by lazy {
+ initEncryptedSharedPreferences()
+ }
+
+ @VisibleForTesting
+ fun initEncryptedSharedPreferences() =
+ runCatching { createEncryptedSharedPreferences() }
+ .getOrElse {
+ resetSharedPrefs()
+ createEncryptedSharedPreferences()
+ }
- private val secureSharedPreferences =
+ @VisibleForTesting
+ fun createEncryptedSharedPreferences() =
EncryptedSharedPreferences.create(
context,
SECURE_STORAGE_FILE_NAME,
diff --git a/android/engine/src/test/java/org/smartregister/fhircore/engine/util/SecureSharedPreferenceTest.kt b/android/engine/src/test/java/org/smartregister/fhircore/engine/util/SecureSharedPreferenceTest.kt
index eb0a10a63a..b015f3464c 100644
--- a/android/engine/src/test/java/org/smartregister/fhircore/engine/util/SecureSharedPreferenceTest.kt
+++ b/android/engine/src/test/java/org/smartregister/fhircore/engine/util/SecureSharedPreferenceTest.kt
@@ -48,6 +48,34 @@ internal class SecureSharedPreferenceTest : RobolectricTest() {
secureSharedPreference = spyk(SecureSharedPreference(application))
}
+ @Test
+ fun testInitEncryptedSharedPreferences() {
+ val result = secureSharedPreference.initEncryptedSharedPreferences()
+ Assert.assertNotNull(result)
+ }
+
+ @Test
+ fun testInitEncryptedSharedPreferencesHandlesException() {
+ every { secureSharedPreference.createEncryptedSharedPreferences() } throws
+ RuntimeException("Exception") andThenAnswer
+ {
+ callOriginal()
+ }
+
+ val result = secureSharedPreference.initEncryptedSharedPreferences()
+
+ Assert.assertNotNull(result)
+
+ verify(exactly = 2) { secureSharedPreference.createEncryptedSharedPreferences() }
+ verify(exactly = 1) { secureSharedPreference.resetSharedPrefs() }
+ }
+
+ @Test
+ fun testCreateEncryptedSharedPreferences() {
+ val result = secureSharedPreference.createEncryptedSharedPreferences()
+ Assert.assertNotNull(result)
+ }
+
@Test
fun testSaveCredentialsAndRetrieveSessionToken() {
secureSharedPreference.saveCredentials(username = "userName", password = "!@#$".toCharArray())
diff --git a/android/quest/src/main/AndroidManifest.xml b/android/quest/src/main/AndroidManifest.xml
index ff169b7773..2c2d7676f4 100644
--- a/android/quest/src/main/AndroidManifest.xml
+++ b/android/quest/src/main/AndroidManifest.xml
@@ -20,8 +20,11 @@
android:theme="@style/AppTheme.NoActionBar"
android:usesCleartextTraffic="false"
android:windowSoftInputMode="adjustResize"
+ android:allowBackup="false"
+ android:fullBackupContent="false"
+ android:dataExtractionRules="@xml/data_extraction_rules"
tools:ignore="UnusedAttribute,LockedOrientationActivity"
- tools:replace="android:theme">
+ tools:replace="android:allowBackup,android:theme">
diff --git a/android/quest/src/main/res/xml/data_extraction_rules.xml b/android/quest/src/main/res/xml/data_extraction_rules.xml
new file mode 100644
index 0000000000..805fc3affa
--- /dev/null
+++ b/android/quest/src/main/res/xml/data_extraction_rules.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+