Skip to content

Commit f17724f

Browse files
authored
sync: smoother community repository realm handling (fixes #11278) (#11269)
1 parent 3a9bfdc commit f17724f

9 files changed

Lines changed: 88 additions & 34 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 = 4606
15-
versionName = "0.46.6"
14+
versionCode = 4607
15+
versionName = "0.46.7"
1616
ndkVersion = '26.3.11579264'
1717
vectorDrawables.useSupportLibrary = true
1818
}

app/src/main/java/org/ole/planet/myplanet/data/DataService.kt

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import org.ole.planet.myplanet.di.DatabaseServiceEntryPoint
2525
import org.ole.planet.myplanet.di.RepositoryEntryPoint
2626
import org.ole.planet.myplanet.model.MyPlanet
2727
import org.ole.planet.myplanet.model.RealmCommunity
28+
import org.ole.planet.myplanet.repository.CommunityRepository
2829
import org.ole.planet.myplanet.repository.UserRepository
2930
import org.ole.planet.myplanet.services.ConfigurationManager
3031
import org.ole.planet.myplanet.services.UploadToShelfService
@@ -46,6 +47,7 @@ class DataService constructor(
4647
@param:ApplicationScope private val serviceScope: CoroutineScope,
4748
private val userRepository: UserRepository,
4849
private val uploadToShelfService: UploadToShelfService,
50+
private val communityRepository: CommunityRepository,
4951
) {
5052
constructor(context: Context) : this(
5153
context,
@@ -69,6 +71,10 @@ class DataService constructor(
6971
context.applicationContext,
7072
AutoSyncEntryPoint::class.java
7173
).uploadToShelfService(),
74+
EntryPointAccessors.fromApplication(
75+
context.applicationContext,
76+
RepositoryEntryPoint::class.java
77+
).communityRepository(),
7278
)
7379

7480
private val preferences: SharedPreferences = context.getSharedPreferences(Constants.PREFS_NAME, Context.MODE_PRIVATE)
@@ -204,26 +210,7 @@ class DataService constructor(
204210
println("Realm transaction started")
205211

206212
val transactionResult = runCatching {
207-
withContext(Dispatchers.IO) {
208-
databaseService.withRealm { backgroundRealm ->
209-
backgroundRealm.executeTransaction { realm1 ->
210-
realm1.delete(RealmCommunity::class.java)
211-
for (j in arr) {
212-
var jsonDoc = j.asJsonObject
213-
jsonDoc = JsonUtils.getJsonObject("doc", jsonDoc)
214-
val id = JsonUtils.getString("_id", jsonDoc)
215-
val community = realm1.createObject(RealmCommunity::class.java, id)
216-
if (JsonUtils.getString("name", jsonDoc) == "learning") {
217-
community.weight = 0
218-
}
219-
community.localDomain = JsonUtils.getString("localDomain", jsonDoc)
220-
community.name = JsonUtils.getString("name", jsonDoc)
221-
community.parentDomain = JsonUtils.getString("parentDomain", jsonDoc)
222-
community.registrationRequest = JsonUtils.getString("registrationRequest", jsonDoc)
223-
}
224-
}
225-
}
226-
}
213+
communityRepository.replaceAll(arr)
227214
}
228215

229216
val endTime = System.currentTimeMillis()

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import kotlinx.coroutines.CoroutineScope
1010
import org.ole.planet.myplanet.data.DataService
1111
import org.ole.planet.myplanet.data.DatabaseService
1212
import org.ole.planet.myplanet.data.api.ApiInterface
13+
import org.ole.planet.myplanet.repository.CommunityRepository
1314
import org.ole.planet.myplanet.repository.UserRepository
1415
import org.ole.planet.myplanet.services.UploadToShelfService
1516

@@ -24,15 +25,17 @@ object DataServiceModule {
2425
databaseService: DatabaseService,
2526
@ApplicationScope scope: CoroutineScope,
2627
userRepository: UserRepository,
27-
uploadToShelfService: UploadToShelfService
28+
uploadToShelfService: UploadToShelfService,
29+
communityRepository: CommunityRepository
2830
): DataService {
2931
return DataService(
3032
context,
3133
apiInterface,
3234
databaseService,
3335
scope,
3436
userRepository,
35-
uploadToShelfService
37+
uploadToShelfService,
38+
communityRepository
3639
)
3740
}
3841
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package org.ole.planet.myplanet.di
33
import dagger.hilt.EntryPoint
44
import dagger.hilt.InstallIn
55
import dagger.hilt.components.SingletonComponent
6+
import org.ole.planet.myplanet.repository.CommunityRepository
67
import org.ole.planet.myplanet.repository.ConfigurationsRepository
78
import org.ole.planet.myplanet.repository.UserRepository
89

@@ -11,4 +12,5 @@ import org.ole.planet.myplanet.repository.UserRepository
1112
interface RepositoryEntryPoint {
1213
fun userRepository(): UserRepository
1314
fun configurationsRepository(): ConfigurationsRepository
15+
fun communityRepository(): CommunityRepository
1416
}

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
@@ -9,6 +9,8 @@ import org.ole.planet.myplanet.repository.ActivitiesRepository
99
import org.ole.planet.myplanet.repository.ActivitiesRepositoryImpl
1010
import org.ole.planet.myplanet.repository.ChatRepository
1111
import org.ole.planet.myplanet.repository.ChatRepositoryImpl
12+
import org.ole.planet.myplanet.repository.CommunityRepository
13+
import org.ole.planet.myplanet.repository.CommunityRepositoryImpl
1214
import org.ole.planet.myplanet.repository.ConfigurationsRepository
1315
import org.ole.planet.myplanet.repository.ConfigurationsRepositoryImpl
1416
import org.ole.planet.myplanet.repository.CoursesRepository
@@ -54,6 +56,10 @@ abstract class RepositoryModule {
5456
@Singleton
5557
abstract fun bindChatRepository(impl: ChatRepositoryImpl): ChatRepository
5658

59+
@Binds
60+
@Singleton
61+
abstract fun bindCommunityRepository(impl: CommunityRepositoryImpl): CommunityRepository
62+
5763
@Binds
5864
@Singleton
5965
abstract fun bindConfigurationsRepository(impl: ConfigurationsRepositoryImpl): ConfigurationsRepository
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package org.ole.planet.myplanet.repository
2+
3+
import com.google.gson.JsonArray
4+
import org.ole.planet.myplanet.model.RealmCommunity
5+
6+
interface CommunityRepository {
7+
suspend fun replaceAll(rows: JsonArray)
8+
suspend fun getAllSorted(): List<RealmCommunity>
9+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package org.ole.planet.myplanet.repository
2+
3+
import com.google.gson.JsonArray
4+
import io.realm.Sort
5+
import org.ole.planet.myplanet.data.DatabaseService
6+
import org.ole.planet.myplanet.model.RealmCommunity
7+
import org.ole.planet.myplanet.utils.JsonUtils
8+
import javax.inject.Inject
9+
10+
class CommunityRepositoryImpl @Inject constructor(
11+
databaseService: DatabaseService
12+
) : RealmRepository(databaseService), CommunityRepository {
13+
14+
override suspend fun replaceAll(rows: JsonArray) {
15+
executeTransaction { realm ->
16+
realm.delete(RealmCommunity::class.java)
17+
for (j in rows) {
18+
var jsonDoc = j.asJsonObject
19+
jsonDoc = JsonUtils.getJsonObject("doc", jsonDoc)
20+
val id = JsonUtils.getString("_id", jsonDoc)
21+
val community = realm.createObject(RealmCommunity::class.java, id)
22+
if (JsonUtils.getString("name", jsonDoc) == "learning") {
23+
community.weight = 0
24+
}
25+
community.localDomain = JsonUtils.getString("localDomain", jsonDoc)
26+
community.name = JsonUtils.getString("name", jsonDoc)
27+
community.parentDomain = JsonUtils.getString("parentDomain", jsonDoc)
28+
community.registrationRequest = JsonUtils.getString("registrationRequest", jsonDoc)
29+
}
30+
}
31+
}
32+
33+
override suspend fun getAllSorted(): List<RealmCommunity> {
34+
return withRealm { realm ->
35+
realm.where(RealmCommunity::class.java)
36+
.sort("weight", Sort.ASCENDING)
37+
.findAll()
38+
.let { realm.copyFromRealm(it) }
39+
}
40+
}
41+
}

app/src/main/java/org/ole/planet/myplanet/ui/sync/ServerDialogExtensions.kt

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@ import android.widget.CompoundButton
99
import android.widget.RadioGroup
1010
import androidx.core.widget.doAfterTextChanged
1111
import androidx.recyclerview.widget.LinearLayoutManager
12+
import androidx.lifecycle.lifecycleScope
1213
import com.afollestad.materialdialogs.DialogAction
1314
import com.afollestad.materialdialogs.MaterialDialog
1415
import io.realm.Sort
16+
import kotlinx.coroutines.launch
1517
import org.ole.planet.myplanet.BuildConfig
1618
import org.ole.planet.myplanet.R
1719
import org.ole.planet.myplanet.databinding.DialogServerUrlBinding
@@ -301,17 +303,17 @@ fun SyncActivity.setupManualConfigEnabled(binding: DialogServerUrlBinding, dialo
301303
editor.putString("serverProtocol", getString(R.string.http_protocol)).apply()
302304
showConfigurationUIElements(binding, true, dialog)
303305

304-
val communities: List<RealmCommunity> = databaseService.withRealm { realm ->
305-
realm.where(RealmCommunity::class.java).sort("weight", Sort.ASCENDING).findAll().let { realm.copyFromRealm(it) }
306-
}
307-
val nonEmptyCommunities = communities.filter { !TextUtils.isEmpty(it.name) }
308-
binding.spnCloud.adapter = ArrayAdapter(this, R.layout.spinner_item_white, nonEmptyCommunities)
309-
binding.spnCloud.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
310-
override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
311-
onChangeServerUrl()
312-
}
306+
lifecycleScope.launch {
307+
val communities = communityRepository.getAllSorted()
308+
val nonEmptyCommunities = communities.filter { !TextUtils.isEmpty(it.name) }
309+
binding.spnCloud.adapter = ArrayAdapter(this@setupManualConfigEnabled, R.layout.spinner_item_white, nonEmptyCommunities)
310+
binding.spnCloud.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
311+
override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
312+
onChangeServerUrl()
313+
}
313314

314-
override fun onNothingSelected(parent: AdapterView<*>?) {}
315+
override fun onNothingSelected(parent: AdapterView<*>?) {}
316+
}
315317
}
316318

317319
binding.switchServerUrl.setOnCheckedChangeListener { _: CompoundButton?, b: Boolean ->

app/src/main/java/org/ole/planet/myplanet/ui/sync/SyncActivity.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ import org.ole.planet.myplanet.data.DatabaseService
5656
import org.ole.planet.myplanet.databinding.DialogServerUrlBinding
5757
import org.ole.planet.myplanet.model.MyPlanet
5858
import org.ole.planet.myplanet.model.ServerAddress
59+
import org.ole.planet.myplanet.repository.CommunityRepository
5960
import org.ole.planet.myplanet.repository.ConfigurationsRepository
6061
import org.ole.planet.myplanet.repository.ResourcesRepository
6162
import org.ole.planet.myplanet.services.SharedPrefManager
@@ -137,6 +138,9 @@ abstract class SyncActivity : ProcessUserDataActivity(), ConfigurationsRepositor
137138
@Inject
138139
lateinit var configurationsRepository: ConfigurationsRepository
139140

141+
@Inject
142+
lateinit var communityRepository: CommunityRepository
143+
140144
@Inject
141145
open lateinit var resourcesRepository: ResourcesRepository
142146

0 commit comments

Comments
 (0)