Skip to content

Commit 99c82a4

Browse files
authored
life: smoother health repository exanimating (fixes #11280) (#11267)
1 parent 6cc6b40 commit 99c82a4

7 files changed

Lines changed: 99 additions & 36 deletions

File tree

app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ android {
1111
applicationId "org.ole.planet.myplanet"
1212
minSdk = 26
1313
targetSdk = 36
14-
versionCode = 4608
15-
versionName = "0.46.8"
14+
versionCode = 4609
15+
versionName = "0.46.9"
1616
ndkVersion = '26.3.11579264'
1717
vectorDrawables.useSupportLibrary = true
1818
}

app/src/main/java/org/ole/planet/myplanet/di/RepositoryModule.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ import org.ole.planet.myplanet.repository.EventsRepository
1919
import org.ole.planet.myplanet.repository.EventsRepositoryImpl
2020
import org.ole.planet.myplanet.repository.FeedbackRepository
2121
import org.ole.planet.myplanet.repository.FeedbackRepositoryImpl
22+
import org.ole.planet.myplanet.repository.HealthRepository
23+
import org.ole.planet.myplanet.repository.HealthRepositoryImpl
2224
import org.ole.planet.myplanet.repository.LifeRepository
2325
import org.ole.planet.myplanet.repository.LifeRepositoryImpl
2426
import org.ole.planet.myplanet.repository.NotificationsRepository
@@ -76,6 +78,10 @@ abstract class RepositoryModule {
7678
@Singleton
7779
abstract fun bindFeedbackRepository(impl: FeedbackRepositoryImpl): FeedbackRepository
7880

81+
@Binds
82+
@Singleton
83+
abstract fun bindHealthRepository(impl: HealthRepositoryImpl): HealthRepository
84+
7985
@Binds
8086
@Singleton
8187
abstract fun bindLifeRepository(impl: LifeRepositoryImpl): LifeRepository
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package org.ole.planet.myplanet.repository
2+
3+
import org.ole.planet.myplanet.model.RealmHealthExamination
4+
import org.ole.planet.myplanet.model.RealmUser
5+
6+
interface HealthRepository {
7+
suspend fun getHealthEntry(userId: String): Pair<RealmUser?, RealmHealthExamination?>
8+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.ole.planet.myplanet.repository
2+
3+
import javax.inject.Inject
4+
import org.ole.planet.myplanet.data.DatabaseService
5+
import org.ole.planet.myplanet.model.RealmHealthExamination
6+
import org.ole.planet.myplanet.model.RealmUser
7+
8+
class HealthRepositoryImpl @Inject constructor(
9+
databaseService: DatabaseService
10+
) : RealmRepository(databaseService), HealthRepository {
11+
override suspend fun getHealthEntry(userId: String): Pair<RealmUser?, RealmHealthExamination?> {
12+
return withRealm { realm ->
13+
val user = realm.where(RealmUser::class.java).equalTo("id", userId).findFirst()
14+
val userCopy = if (user != null) realm.copyFromRealm(user) else null
15+
16+
var pojo = realm.where(RealmHealthExamination::class.java).equalTo("_id", userId).findFirst()
17+
if (pojo == null) {
18+
pojo = realm.where(RealmHealthExamination::class.java).equalTo("userId", userId).findFirst()
19+
}
20+
val pojoCopy = if (pojo != null) realm.copyFromRealm(pojo) else null
21+
22+
Pair(userCopy, pojoCopy)
23+
}
24+
}
25+
}

app/src/main/java/org/ole/planet/myplanet/repository/UserRepository.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ interface UserRepository {
2424
endMillis: Long,
2525
): Map<Int, Int>
2626
suspend fun saveUser(jsonDoc: JsonObject?, settings: SharedPreferences, key: String? = null, iv: String? = null): RealmUser?
27+
suspend fun ensureUserSecurityKeys(userId: String): RealmUser?
2728
suspend fun updateSecurityData(
2829
name: String,
2930
userId: String?,

app/src/main/java/org/ole/planet/myplanet/repository/UserRepositoryImpl.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,19 @@ class UserRepositoryImpl @Inject constructor(
143143
}
144144
}
145145

146+
override suspend fun ensureUserSecurityKeys(userId: String): RealmUser? {
147+
return withRealm { realm ->
148+
val user = realm.where(RealmUser::class.java).equalTo("id", userId).findFirst()
149+
if (user != null && (user.key == null || user.iv == null)) {
150+
realm.executeTransaction {
151+
if (user.key == null) user.key = AndroidDecrypter.generateKey()
152+
if (user.iv == null) user.iv = AndroidDecrypter.generateIv()
153+
}
154+
}
155+
if (user != null) realm.copyFromRealm(user) else null
156+
}
157+
}
158+
146159
override suspend fun updateSecurityData(
147160
name: String,
148161
userId: String?,

app/src/main/java/org/ole/planet/myplanet/ui/health/AddExaminationActivity.kt

Lines changed: 44 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ import org.ole.planet.myplanet.model.RealmHealthExamination
3030
import org.ole.planet.myplanet.model.RealmMyHealth
3131
import org.ole.planet.myplanet.model.RealmMyHealth.RealmMyHealthProfile
3232
import org.ole.planet.myplanet.model.RealmUser
33+
import org.ole.planet.myplanet.repository.HealthRepository
34+
import org.ole.planet.myplanet.repository.UserRepository
3335
import org.ole.planet.myplanet.services.UserSessionManager
3436
import org.ole.planet.myplanet.utils.AndroidDecrypter.Companion.decrypt
3537
import org.ole.planet.myplanet.utils.AndroidDecrypter.Companion.encrypt
@@ -50,6 +52,10 @@ class AddExaminationActivity : AppCompatActivity(), CompoundButton.OnCheckedChan
5052
lateinit var databaseService: DatabaseService
5153
@Inject
5254
lateinit var userSessionManager: UserSessionManager
55+
@Inject
56+
lateinit var healthRepository: HealthRepository
57+
@Inject
58+
lateinit var userRepository: UserRepository
5359
private lateinit var binding: ActivityAddExaminationBinding
5460
lateinit var mRealm: Realm
5561
var userId: String? = null
@@ -87,38 +93,9 @@ class AddExaminationActivity : AppCompatActivity(), CompoundButton.OnCheckedChan
8793
mapConditions = HashMap()
8894
mRealm = databaseService.createManagedRealmInstance()
8995
userId = intent.getStringExtra("userId")
90-
pojo = mRealm.where(RealmHealthExamination::class.java).equalTo("_id", userId).findFirst()
91-
if (pojo == null) {
92-
pojo = mRealm.where(RealmHealthExamination::class.java).equalTo("userId", userId).findFirst()
93-
}
94-
user = mRealm.where(RealmUser::class.java).equalTo("id", userId).findFirst()
95-
if (user != null && (user?.key == null || user?.iv == null)) {
96-
val startedTransaction = !mRealm.isInTransaction
97-
if (startedTransaction) {
98-
mRealm.beginTransaction()
99-
}
100-
try {
101-
user?.key = generateKey()
102-
user?.iv = generateIv()
103-
if (startedTransaction) {
104-
mRealm.commitTransaction()
105-
}
106-
} catch (e: Exception) {
107-
if (startedTransaction && mRealm.isInTransaction) {
108-
mRealm.cancelTransaction()
109-
}
110-
throw e
111-
}
112-
}
113-
if (pojo != null && !TextUtils.isEmpty(pojo?.data)) {
114-
health = JsonUtils.gson.fromJson(decrypt(pojo?.data, user?.key, user?.iv), RealmMyHealth::class.java)
115-
}
116-
if (health == null) {
117-
initHealth()
118-
}
119-
initExamination()
120-
validateFields()
121-
findViewById<View>(R.id.btn_save).setOnClickListener {
96+
val btnSave = findViewById<View>(R.id.btn_save)
97+
btnSave.isEnabled = false
98+
btnSave.setOnClickListener {
12299
if(!allowSubmission){
123100
scrollToView(binding.etBloodpressure)
124101
}
@@ -127,6 +104,33 @@ class AddExaminationActivity : AppCompatActivity(), CompoundButton.OnCheckedChan
127104
}
128105
saveData()
129106
}
107+
108+
lifecycleScope.launch {
109+
if (userId != null) {
110+
val (u, p) = healthRepository.getHealthEntry(userId!!)
111+
user = u
112+
pojo = p
113+
114+
val updatedUser = userRepository.ensureUserSecurityKeys(userId!!)
115+
if (updatedUser != null) {
116+
user = updatedUser
117+
}
118+
}
119+
120+
if (pojo != null && !TextUtils.isEmpty(pojo?.data)) {
121+
try {
122+
health = JsonUtils.gson.fromJson(decrypt(pojo?.data, user?.key, user?.iv), RealmMyHealth::class.java)
123+
} catch (e: Exception) {
124+
e.printStackTrace()
125+
}
126+
}
127+
if (health == null) {
128+
initHealth()
129+
}
130+
initExamination()
131+
validateFields()
132+
btnSave.isEnabled = true
133+
}
130134
}
131135

132136
private fun initExamination() {
@@ -280,7 +284,8 @@ class AddExaminationActivity : AppCompatActivity(), CompoundButton.OnCheckedChan
280284
createPojo()
281285
if (examination == null) {
282286
val odUserId = generateIv()
283-
examination = mRealm.createObject(RealmHealthExamination::class.java, odUserId)
287+
examination = RealmHealthExamination()
288+
examination?._id = odUserId
284289
examination?.userId = odUserId
285290
}
286291
examination?.profileId = health?.userKey
@@ -321,6 +326,10 @@ class AddExaminationActivity : AppCompatActivity(), CompoundButton.OnCheckedChan
321326
} catch (e: Exception) {
322327
e.printStackTrace()
323328
}
329+
330+
pojo?.let { mRealm.copyToRealmOrUpdate(it) }
331+
examination?.let { mRealm.copyToRealmOrUpdate(it) }
332+
324333
if (startedTransaction) {
325334
mRealm.commitTransaction()
326335
}
@@ -411,7 +420,8 @@ class AddExaminationActivity : AppCompatActivity(), CompoundButton.OnCheckedChan
411420
private fun createPojo() {
412421
try {
413422
if (pojo == null) {
414-
pojo = mRealm.createObject(RealmHealthExamination::class.java, userId)
423+
pojo = RealmHealthExamination()
424+
pojo?._id = userId
415425
pojo?.userId = user?._id
416426
}
417427
health?.lastExamination = Date().time

0 commit comments

Comments
 (0)