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 @@ + + + + + + + + + + + + + + + + +