Skip to content

Commit 1f257ed

Browse files
authored
Merge branch 'master' into refactor-my-library-div
2 parents 142bfcf + b6c762f commit 1f257ed

File tree

14 files changed

+173
-114
lines changed

14 files changed

+173
-114
lines changed

app/src/main/java/org/ole/planet/myplanet/datamanager/MyDownloadService.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import java.io.IOException
2424
import kotlin.math.roundToInt
2525
import kotlinx.coroutines.CoroutineScope
2626
import kotlinx.coroutines.Dispatchers
27+
import kotlinx.coroutines.SupervisorJob
2728
import kotlinx.coroutines.launch
2829
import okhttp3.ResponseBody
2930
import org.ole.planet.myplanet.MainApplication.Companion.createLog
@@ -50,6 +51,9 @@ class MyDownloadService : Service() {
5051
private var totalDownloadsCount = 0
5152
private var completedDownloadsCount = 0
5253

54+
private val downloadJob = SupervisorJob()
55+
private val downloadScope = CoroutineScope(downloadJob + Dispatchers.IO)
56+
5357
override fun onBind(intent: Intent?): IBinder? = null
5458

5559
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
@@ -75,7 +79,7 @@ class MyDownloadService : Service() {
7579

7680
updateNotificationForBatchDownload()
7781

78-
CoroutineScope(Dispatchers.IO).launch {
82+
downloadScope.launch {
7983
urls.forEachIndexed { index, url ->
8084
currentIndex = index
8185
initDownload(url, fromSync)
@@ -343,6 +347,7 @@ class MyDownloadService : Service() {
343347
stopForeground(true)
344348
} catch (_: Exception) {
345349
}
350+
downloadJob.cancel()
346351
notificationManager?.cancel(ONGOING_NOTIFICATION_ID)
347352
super.onDestroy()
348353
}

app/src/main/java/org/ole/planet/myplanet/datamanager/Service.kt

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import java.util.concurrent.Executors
1515
import javax.inject.Inject
1616
import kotlinx.coroutines.CoroutineScope
1717
import kotlinx.coroutines.Dispatchers
18-
import kotlinx.coroutines.SupervisorJob
1918
import kotlinx.coroutines.launch
2019
import kotlinx.coroutines.withContext
2120
import okhttp3.ResponseBody
@@ -25,6 +24,8 @@ import org.ole.planet.myplanet.R
2524
import org.ole.planet.myplanet.callback.SecurityDataCallback
2625
import org.ole.planet.myplanet.callback.SuccessListener
2726
import org.ole.planet.myplanet.di.ApiInterfaceEntryPoint
27+
import org.ole.planet.myplanet.di.ApplicationScope
28+
import org.ole.planet.myplanet.di.ApplicationScopeEntryPoint
2829
import org.ole.planet.myplanet.di.AutoSyncEntryPoint
2930
import org.ole.planet.myplanet.model.MyPlanet
3031
import org.ole.planet.myplanet.model.RealmCommunity
@@ -52,19 +53,25 @@ import retrofit2.Response
5253

5354
class Service @Inject constructor(
5455
private val context: Context,
55-
private val retrofitInterface: ApiInterface
56+
private val retrofitInterface: ApiInterface,
57+
@ApplicationScope private val serviceScope: CoroutineScope,
5658
) {
5759
constructor(context: Context) : this(
5860
context,
5961
EntryPointAccessors.fromApplication(
6062
context.applicationContext,
6163
ApiInterfaceEntryPoint::class.java
62-
).apiInterface()
64+
).apiInterface(),
65+
EntryPointAccessors.fromApplication(
66+
context.applicationContext,
67+
ApplicationScopeEntryPoint::class.java
68+
).applicationScope(),
6369
)
70+
6471
private val preferences: SharedPreferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
65-
private val serviceScope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
6672
private val serverAvailabilityCache = ConcurrentHashMap<String, Pair<Boolean, Long>>()
67-
private val configurationManager = ConfigurationManager(context, preferences, retrofitInterface)
73+
private val configurationManager =
74+
ConfigurationManager(context, preferences, retrofitInterface)
6875
private fun getUploadToShelfService(): UploadToShelfService {
6976
val entryPoint = EntryPointAccessors.fromApplication(
7077
context.applicationContext,
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.ole.planet.myplanet.di
2+
3+
import dagger.hilt.EntryPoint
4+
import dagger.hilt.InstallIn
5+
import dagger.hilt.components.SingletonComponent
6+
import kotlinx.coroutines.CoroutineScope
7+
8+
@EntryPoint
9+
@InstallIn(SingletonComponent::class)
10+
interface ApplicationScopeEntryPoint {
11+
@ApplicationScope
12+
fun applicationScope(): CoroutineScope
13+
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,10 @@ object ServiceModule {
4343
databaseService: DatabaseService,
4444
@AppPreferences preferences: SharedPreferences,
4545
apiInterface: ApiInterface,
46-
improvedSyncManager: Lazy<ImprovedSyncManager>
46+
improvedSyncManager: Lazy<ImprovedSyncManager>,
47+
@ApplicationScope scope: CoroutineScope
4748
): SyncManager {
48-
return SyncManager(context, databaseService, preferences, apiInterface, improvedSyncManager)
49+
return SyncManager(context, databaseService, preferences, apiInterface, improvedSyncManager, scope)
4950
}
5051

5152
@Provides

app/src/main/java/org/ole/planet/myplanet/service/AutoSyncWorker.kt

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import androidx.work.Worker
99
import androidx.work.WorkerParameters
1010
import dagger.hilt.android.EntryPointAccessors
1111
import java.util.Date
12+
import java.util.concurrent.ExecutorService
13+
import java.util.concurrent.Executors
1214
import org.ole.planet.myplanet.MainApplication
1315
import org.ole.planet.myplanet.callback.SuccessListener
1416
import org.ole.planet.myplanet.callback.SyncListener
@@ -26,11 +28,11 @@ class AutoSyncWorker(
2628
private val context: Context,
2729
workerParams: WorkerParameters
2830
) : Worker(context, workerParams), SyncListener, CheckVersionCallback, SuccessListener {
29-
3031
private lateinit var preferences: SharedPreferences
3132
private lateinit var syncManager: SyncManager
3233
private lateinit var uploadManager: UploadManager
3334
private lateinit var uploadToShelfService: UploadToShelfService
35+
private val backgroundExecutor: ExecutorService = Executors.newSingleThreadExecutor()
3436

3537
override fun doWork(): Result {
3638
preferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
@@ -78,22 +80,24 @@ class AutoSyncWorker(
7880
}
7981
if (!MainApplication.isSyncRunning) {
8082
MainApplication.isSyncRunning = true
81-
uploadManager.uploadExamResult(this)
82-
uploadManager.uploadFeedback(this)
83-
uploadManager.uploadAchievement()
84-
uploadManager.uploadResourceActivities("")
85-
uploadManager.uploadUserActivities(this)
86-
uploadManager.uploadCourseActivities()
87-
uploadManager.uploadSearchActivity()
88-
uploadManager.uploadRating()
89-
uploadManager.uploadResource(this)
90-
uploadManager.uploadNews()
91-
uploadManager.uploadTeams()
92-
uploadManager.uploadTeamTask()
93-
uploadManager.uploadMeetups()
94-
uploadManager.uploadCrashLog()
95-
uploadManager.uploadSubmissions()
96-
uploadManager.uploadActivities { MainApplication.isSyncRunning = false }
83+
backgroundExecutor.execute {
84+
uploadManager.uploadExamResult(this@AutoSyncWorker)
85+
uploadManager.uploadFeedback(this@AutoSyncWorker)
86+
uploadManager.uploadAchievement()
87+
uploadManager.uploadResourceActivities("")
88+
uploadManager.uploadUserActivities(this@AutoSyncWorker)
89+
uploadManager.uploadCourseActivities()
90+
uploadManager.uploadSearchActivity()
91+
uploadManager.uploadRating()
92+
uploadManager.uploadResource(this@AutoSyncWorker)
93+
uploadManager.uploadNews()
94+
uploadManager.uploadTeams()
95+
uploadManager.uploadTeamTask()
96+
uploadManager.uploadMeetups()
97+
uploadManager.uploadCrashLog()
98+
uploadManager.uploadSubmissions()
99+
uploadManager.uploadActivities { MainApplication.isSyncRunning = false }
100+
}
97101
}
98102
}
99103
}
@@ -103,6 +107,11 @@ class AutoSyncWorker(
103107
settings.edit { putLong("lastUsageUploaded", Date().time) }
104108
}
105109

110+
override fun onStopped() {
111+
super.onStopped()
112+
backgroundExecutor.shutdown()
113+
}
114+
106115
private fun isAppInForeground(context: Context): Boolean {
107116
val activityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
108117
val runningProcesses = activityManager.runningAppProcesses ?: return false

app/src/main/java/org/ole/planet/myplanet/service/SyncManager.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import org.ole.planet.myplanet.datamanager.ApiInterface
3737
import org.ole.planet.myplanet.datamanager.DatabaseService
3838
import org.ole.planet.myplanet.datamanager.ManagerSync
3939
import org.ole.planet.myplanet.di.AppPreferences
40+
import org.ole.planet.myplanet.di.ApplicationScope
4041
import org.ole.planet.myplanet.model.RealmMeetup.Companion.insert
4142
import org.ole.planet.myplanet.model.RealmMyCourse.Companion.insertMyCourses
4243
import org.ole.planet.myplanet.model.RealmMyCourse.Companion.saveConcatenatedLinksToPrefs
@@ -64,15 +65,15 @@ class SyncManager @Inject constructor(
6465
private val databaseService: DatabaseService,
6566
@AppPreferences private val settings: SharedPreferences,
6667
private val apiInterface: ApiInterface,
67-
private val improvedSyncManager: Lazy<ImprovedSyncManager>
68+
private val improvedSyncManager: Lazy<ImprovedSyncManager>,
69+
@ApplicationScope private val syncScope: CoroutineScope
6870
) {
6971
private var td: Thread? = null
7072
lateinit var mRealm: Realm
7173
private var isSyncing = false
7274
private val stringArray = arrayOfNulls<String>(4)
7375
private var listener: SyncListener? = null
7476
private var backgroundSync: Job? = null
75-
private val syncScope = CoroutineScope(Dispatchers.IO + SupervisorJob())
7677
private var betaSync = false
7778
private val improvedSyncInitialized = AtomicBoolean(false)
7879

app/src/main/java/org/ole/planet/myplanet/service/UploadManager.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,9 +187,11 @@ class UploadManager @Inject constructor(
187187
submissionsToUpload.processInBatches { data ->
188188
try {
189189
val response: JsonObject? = if (TextUtils.isEmpty(data._id)) {
190-
apiInterface?.postDoc(UrlUtils.header, "application/json", "${UrlUtils.getUrl()}/submissions", data.serialized)?.execute()?.body()
190+
apiInterface.postDoc(UrlUtils.header, "application/json", "${UrlUtils.getUrl()}/submissions", data.serialized)
191+
.execute().body()
191192
} else {
192-
apiInterface?.putDoc(UrlUtils.header, "application/json", "${UrlUtils.getUrl()}/submissions/${data._id}", data.serialized)?.execute()?.body()
193+
apiInterface.putDoc(UrlUtils.header, "application/json", "${UrlUtils.getUrl()}/submissions/${data._id}", data.serialized)
194+
.execute().body()
193195
}
194196

195197
if (response != null && data.id != null) {

app/src/main/java/org/ole/planet/myplanet/service/UserProfileDbHandler.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ class UserProfileDbHandler @Inject constructor(
7070
val parentCode = model?.parentCode
7171
val planetCode = model?.planetCode
7272

73-
realmService.withRealmAsync { realm ->
73+
realmService.executeTransactionAsync { realm ->
7474
val offlineActivities = realm.createObject(RealmOfflineActivity::class.java, UUID.randomUUID().toString())
7575
offlineActivities.userId = userId
7676
offlineActivities.userName = userName
@@ -96,7 +96,7 @@ class UserProfileDbHandler @Inject constructor(
9696
fun logoutAsync() {
9797
GlobalScope.launch(Dispatchers.IO) {
9898
try {
99-
realmService.withRealmAsync { realm ->
99+
realmService.executeTransactionAsync { realm ->
100100
RealmOfflineActivity.getRecentLogin(realm)
101101
?.logoutTime = Date().time
102102
}
@@ -145,6 +145,9 @@ class UserProfileDbHandler @Inject constructor(
145145
}
146146

147147
fun setResourceOpenCount(item: RealmMyLibrary, type: String?) {
148+
val itemTitle = item.title
149+
val itemResourceId = item.resourceId
150+
148151
GlobalScope.launch(Dispatchers.IO) {
149152
try {
150153
val model = getUserModelCopy()
@@ -155,10 +158,8 @@ class UserProfileDbHandler @Inject constructor(
155158
val userName = model?.name
156159
val parentCode = model?.parentCode
157160
val planetCode = model?.planetCode
158-
val itemTitle = item.title
159-
val itemResourceId = item.resourceId
160161

161-
realmService.withRealmAsync { realm ->
162+
realmService.executeTransactionAsync { realm ->
162163
val offlineActivities = realm.createObject(RealmResourceActivity::class.java, "${UUID.randomUUID()}")
163164
offlineActivities.user = userName
164165
offlineActivities.parentCode = parentCode

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

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,9 @@ class LoginActivity : SyncActivity(), TeamListAdapter.OnItemClickListener {
173173
binding.inputPassword.error = getString(R.string.err_msg_password)
174174
} else {
175175
val enterUserName = binding.inputName.text.toString().trimEnd()
176-
val user = mRealm.where(RealmUserModel::class.java).equalTo("name", enterUserName).findFirst()
176+
val user = databaseService.withRealm { realm ->
177+
realm.where(RealmUserModel::class.java).equalTo("name", enterUserName).findFirst()?.let { realm.copyFromRealm(it) }
178+
}
177179
if (user == null || !user.isArchived) {
178180
submitForm(enterUserName, binding.inputPassword.text.toString())
179181
} else {
@@ -287,8 +289,10 @@ class LoginActivity : SyncActivity(), TeamListAdapter.OnItemClickListener {
287289
}
288290

289291
fun updateTeamDropdown() {
290-
val teams: List<RealmMyTeam>? = mRealm.where(RealmMyTeam::class.java)
291-
?.isEmpty("teamId")?.equalTo("status", "active")?.findAll()
292+
val teams: List<RealmMyTeam>? = databaseService.withRealm { realm ->
293+
realm.where(RealmMyTeam::class.java)
294+
.isEmpty("teamId").equalTo("status", "active").findAll()?.let { realm.copyFromRealm(it) }
295+
}
292296

293297
if (!teams.isNullOrEmpty()) {
294298
binding.team.visibility = View.VISIBLE
@@ -407,7 +411,9 @@ class LoginActivity : SyncActivity(), TeamListAdapter.OnItemClickListener {
407411
fun getTeamMembers() {
408412
selectedTeamId = prefData.getSelectedTeamId().toString()
409413
if (selectedTeamId?.isNotEmpty() == true) {
410-
users = RealmMyTeam.getUsers(selectedTeamId, mRealm, "membership")
414+
users = databaseService.withRealm { realm ->
415+
RealmMyTeam.getUsers(selectedTeamId, realm, "membership").map { realm.copyFromRealm(it) }.toMutableList()
416+
}
411417
val userList = (users as? MutableList<RealmUserModel>)?.map {
412418
User(it.name ?: "", it.name ?: "", "", it.userImage ?: "", "team")
413419
} ?: emptyList()
@@ -444,7 +450,9 @@ class LoginActivity : SyncActivity(), TeamListAdapter.OnItemClickListener {
444450
binding.inputName.setText(user.name)
445451
} else {
446452
if (user.source == "guest"){
447-
val model = RealmUserModel.createGuestUser(user.name, mRealm, settings)?.let { mRealm.copyFromRealm(it) }
453+
val model = databaseService.withRealm { realm ->
454+
RealmUserModel.createGuestUser(user.name, realm, settings)?.let { realm.copyFromRealm(it) }
455+
}
448456
if (model == null) {
449457
toast(this, getString(R.string.unable_to_login))
450458
} else {
@@ -469,7 +477,9 @@ class LoginActivity : SyncActivity(), TeamListAdapter.OnItemClickListener {
469477
builder.setNegativeButton("cancel") { dialog: DialogInterface, _: Int -> dialog.dismiss() }
470478
builder.setPositiveButton("continue") { dialog: DialogInterface, _: Int ->
471479
dialog.dismiss()
472-
val model = RealmUserModel.createGuestUser(username, mRealm, settings)?.let { mRealm.copyFromRealm(it) }
480+
val model = databaseService.withRealm { realm ->
481+
RealmUserModel.createGuestUser(username, realm, settings)?.let { realm.copyFromRealm(it) }
482+
}
473483
if (model == null) {
474484
toast(this, getString(R.string.unable_to_login))
475485
} else {

0 commit comments

Comments
 (0)