Skip to content

Commit a42d2ac

Browse files
committed
Revert lost changes
1 parent 16e002c commit a42d2ac

File tree

6 files changed

+141
-10
lines changed

6 files changed

+141
-10
lines changed

android/engine/src/main/java/org/smartregister/fhircore/engine/datastore/PreferenceDataStore.kt

+10-7
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,24 @@
11
package org.smartregister.fhircore.engine.datastore
22

33
import android.content.Context
4+
import androidx.datastore.core.DataStore
45
import androidx.datastore.preferences.core.Preferences
56
import androidx.datastore.preferences.core.edit
67
import androidx.datastore.preferences.core.emptyPreferences
78
import androidx.datastore.preferences.core.stringPreferencesKey
9+
import androidx.datastore.preferences.preferencesDataStore
810
import dagger.hilt.android.qualifiers.ApplicationContext
911
import kotlinx.coroutines.flow.catch
1012
import kotlinx.coroutines.flow.map
11-
import org.smartregister.fhircore.engine.datastore.mockdata.SerializablePractitionerDetails
12-
import org.smartregister.fhircore.engine.datastore.mockdata.SerializableUserInfo
13-
import org.smartregister.fhircore.engine.ui.bottomsheet.RegisterBottomSheetFragment.Companion.TAG
14-
import timber.log.Timber
1513
import java.io.IOException
1614
import javax.inject.Inject
1715
import javax.inject.Singleton
1816

17+
const val DATASTORE_NAME = "preferences_datastore"
18+
val Context.dataStore : DataStore<Preferences> by preferencesDataStore(name = DATASTORE_NAME)
19+
1920
@Singleton
20-
class DataStoresPreference @Inject constructor(@ApplicationContext val context: Context ) {
21+
class PreferenceDataStore @Inject constructor(@ApplicationContext val context: Context ) {
2122
fun <T> read(key: Preferences.Key<T>) = context.dataStore.data
2223
.catch { exception ->
2324
if (exception is IOException) {
@@ -36,7 +37,9 @@ class DataStoresPreference @Inject constructor(@ApplicationContext val context:
3637
}
3738

3839
companion object Keys {
39-
val APP_ID = stringPreferencesKey("appId")
40-
val LANG = stringPreferencesKey("lang")
40+
val appIdKeyName = "appId"
41+
val langKeyName = "lang"
42+
val APP_ID by lazy { stringPreferencesKey(appIdKeyName) }
43+
val LANG by lazy { stringPreferencesKey(langKeyName) }
4144
}
4245
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package org.smartregister.fhircore.engine.datastore
2+
3+
import android.content.Context
4+
import androidx.datastore.core.DataStore
5+
import androidx.datastore.dataStore
6+
import dagger.hilt.android.qualifiers.ApplicationContext
7+
import kotlinx.coroutines.flow.catch
8+
import javax.inject.Inject
9+
import org.smartregister.fhircore.engine.datastore.mockdata.SerializablePractitionerDetails
10+
import org.smartregister.fhircore.engine.datastore.mockdata.SerializableUserInfo
11+
import org.smartregister.fhircore.engine.datastore.serializers.PractitionerDetailsDataStoreSerializer
12+
import org.smartregister.fhircore.engine.datastore.serializers.UserInfoDataStoreSerializer
13+
import timber.log.Timber
14+
import java.io.IOException
15+
import javax.inject.Singleton
16+
17+
private const val PRACTITIONER_DETAILS_DATASTORE_JSON = "practitioner_details.json"
18+
private const val USER_INFO_DATASTORE_JSON = "user_info.json"
19+
private const val TAG = "Proto DataStore"
20+
21+
val Context.practitionerProtoStore: DataStore<SerializablePractitionerDetails> by dataStore(
22+
fileName = PRACTITIONER_DETAILS_DATASTORE_JSON,
23+
serializer = PractitionerDetailsDataStoreSerializer
24+
)
25+
26+
val Context.userInfoProtoStore: DataStore<SerializableUserInfo> by dataStore(
27+
fileName = USER_INFO_DATASTORE_JSON,
28+
serializer = UserInfoDataStoreSerializer
29+
)
30+
@Singleton
31+
class ProtoDataStore @Inject constructor(@ApplicationContext val context: Context) {
32+
33+
val practitioner = context.practitionerProtoStore.data
34+
.catch { exception ->
35+
if (exception is IOException) {
36+
Timber.tag(TAG).e(exception, "Error reading practitioner details preferences.")
37+
emit(SerializablePractitionerDetails())
38+
} else {
39+
throw exception
40+
}
41+
}
42+
43+
suspend fun writePractitioner(serializablePractitionerDetails: SerializablePractitionerDetails) {
44+
context.practitionerProtoStore.updateData { practitionerData ->
45+
practitionerData.copy(
46+
name = serializablePractitionerDetails.name,
47+
id = serializablePractitionerDetails.id
48+
)
49+
}
50+
}
51+
52+
val userInfo = context.userInfoProtoStore.data
53+
.catch { exception ->
54+
if (exception is IOException) {
55+
Timber.tag(TAG).e(exception, "Error reading practitioner details preferences.")
56+
emit(SerializableUserInfo())
57+
} else {
58+
throw exception
59+
}
60+
}
61+
62+
suspend fun writeUserInfo(serializableUserInfo: SerializableUserInfo) {
63+
context.userInfoProtoStore.updateData { userInfo ->
64+
userInfo.copy(
65+
name = serializableUserInfo.name
66+
)
67+
}
68+
}
69+
70+
}

android/engine/src/main/java/org/smartregister/fhircore/engine/datastore/serializers/PractitionerDetailsDataStoreSerializer.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import androidx.datastore.core.Serializer
44
import kotlinx.serialization.json.Json
55
import org.apache.commons.lang3.SerializationException
66
import org.smartregister.fhircore.engine.datastore.mockdata.SerializablePractitionerDetails
7+
import timber.log.Timber
78
import java.io.InputStream
89
import java.io.OutputStream
910

@@ -18,7 +19,7 @@ object PractitionerDetailsDataStoreSerializer: Serializer<SerializablePractition
1819
string = input.readBytes().decodeToString()
1920
)
2021
} catch (e: SerializationException) {
21-
e.printStackTrace()
22+
Timber.tag(SerializerConstants.PROTOSTORE_SERIALIZER_TAG).d(e)
2223
defaultValue
2324
}
2425
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package org.smartregister.fhircore.engine.datastore.serializers
2+
3+
object SerializerConstants {
4+
const val PROTOSTORE_SERIALIZER_TAG = "Proto DataStore"
5+
}

android/engine/src/main/java/org/smartregister/fhircore/engine/datastore/serializers/UserInfoDataStoreSerializer.kt

+3-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import androidx.datastore.core.Serializer
44
import kotlinx.serialization.json.Json
55
import org.apache.commons.lang3.SerializationException
66
import org.smartregister.fhircore.engine.datastore.mockdata.SerializableUserInfo
7+
import org.smartregister.fhircore.engine.ui.bottomsheet.RegisterBottomSheetFragment
8+
import timber.log.Timber
79
import java.io.InputStream
810
import java.io.OutputStream
911

@@ -18,7 +20,7 @@ object UserInfoDataStoreSerializer: Serializer<SerializableUserInfo> {
1820
string = input.readBytes().decodeToString()
1921
)
2022
} catch (e: SerializationException) {
21-
e.printStackTrace()
23+
Timber.tag(SerializerConstants.PROTOSTORE_SERIALIZER_TAG).d(e)
2224
defaultValue
2325
}
2426
}
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,54 @@
11
package org.smartregister.fhircore.engine.datastore
22

3-
class DataStoreHelperTest {
3+
import android.content.Context
4+
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
5+
import androidx.test.core.app.ApplicationProvider
6+
import dagger.hilt.android.testing.HiltAndroidRule
7+
import dagger.hilt.android.testing.HiltAndroidTest
8+
import kotlinx.coroutines.flow.first
9+
import kotlinx.coroutines.flow.map
10+
import kotlinx.coroutines.test.runTest
11+
import org.junit.Before
12+
import org.junit.Rule
13+
import org.junit.Test
14+
import org.smartregister.fhircore.engine.robolectric.RobolectricTest
15+
16+
@HiltAndroidTest
17+
internal class PreferenceDataStoreTest : RobolectricTest() {
18+
private val testContext: Context = ApplicationProvider.getApplicationContext()
19+
20+
@get:Rule(order = 0) val hiltRule = HiltAndroidRule(this)
21+
@get:Rule(order = 1) val instantTaskExecutorRule = InstantTaskExecutorRule()
22+
23+
private lateinit var preferenceDataStore: PreferenceDataStore
24+
25+
private val keys = PreferenceDataStore.Keys
26+
27+
@Before
28+
fun setUp() {
29+
hiltRule.inject()
30+
preferenceDataStore = PreferenceDataStore(testContext)
31+
}
32+
33+
@Test
34+
fun testReadAppId() {
35+
val expectedValue = ""
36+
runTest {
37+
val valueFlow = preferenceDataStore.read(keys.APP_ID)
38+
valueFlow.map { value ->
39+
assert(value == expectedValue)
40+
}
41+
}
42+
}
43+
44+
@Test
45+
fun testWriteAppId() {
46+
val newAppId = "new_app_id"
47+
val key = keys.APP_ID
48+
49+
runTest {
50+
preferenceDataStore.write(key, newAppId)
51+
assert(preferenceDataStore.read(keys.APP_ID).first() == newAppId)
52+
}
53+
}
454
}

0 commit comments

Comments
 (0)