Skip to content

Commit 6df9399

Browse files
Merge pull request #16658 from nextcloud/fix/coroutine-scope-lifecycle
fix(coroutine): lifecycle scope usages
2 parents a09f523 + b73b0ae commit 6df9399

19 files changed

Lines changed: 329 additions & 340 deletions

app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadHelper.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -515,9 +515,7 @@ class FileUploadHelper {
515515
* @param user Needed for creating client
516516
*/
517517
fun removeDuplicatedFile(duplicatedFile: OCFile, client: OwnCloudClient, user: User, onCompleted: () -> Unit) {
518-
val job = CoroutineScope(Dispatchers.IO)
519-
520-
job.launch {
518+
ioScope.launch {
521519
val removeFileOperation = RemoveFileOperation(
522520
duplicatedFile,
523521
false,

app/src/main/java/com/nextcloud/ui/ImageDetailFragment.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import androidx.annotation.VisibleForTesting
2020
import androidx.core.content.ContextCompat
2121
import androidx.core.net.toUri
2222
import androidx.fragment.app.Fragment
23+
import androidx.lifecycle.lifecycleScope
2324
import com.nextcloud.android.common.ui.theme.utils.ColorRole
2425
import com.nextcloud.client.NominatimClient
2526
import com.nextcloud.client.account.User
@@ -154,7 +155,7 @@ class ImageDetailFragment :
154155
binding.imageLocation.visibility = View.VISIBLE
155156

156157
// launch reverse geocoding request
157-
CoroutineScope(Dispatchers.IO).launch {
158+
lifecycleScope.launch(Dispatchers.IO) {
158159
val geocodingResult = nominatimClient.reverseGeocode(location.first, location.second)
159160
if (geocodingResult != null) {
160161
withContext(Dispatchers.Main) {

app/src/main/java/com/owncloud/android/ui/activities/ActivitiesActivity.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import android.os.Bundle
1212
import android.view.MenuItem
1313
import android.view.View
1414
import androidx.core.view.size
15+
import androidx.lifecycle.lifecycleScope
1516
import androidx.recyclerview.widget.LinearLayoutManager
1617
import androidx.recyclerview.widget.RecyclerView
1718
import com.nextcloud.client.network.ConnectivityService
@@ -75,7 +76,7 @@ class ActivitiesActivity :
7576
// We set lastGiven variable to undefined here since when manually refreshing
7677
// activities data we want to clear the list and reset the pagination.
7778
lastGiven = ActivitiesContract.ActionListener.UNDEFINED.toLong()
78-
actionListener?.loadActivities(lastGiven)
79+
actionListener?.loadActivities(lifecycleScope, lastGiven)
7980
}
8081
}
8182

@@ -101,7 +102,7 @@ class ActivitiesActivity :
101102
addOnScrollListener(getOnScrollListener(layoutManager))
102103
}
103104

104-
actionListener?.loadActivities(ActivitiesContract.ActionListener.UNDEFINED.toLong())
105+
actionListener?.loadActivities(lifecycleScope, ActivitiesContract.ActionListener.UNDEFINED.toLong())
105106
}
106107

107108
private fun getOnScrollListener(layoutManager: LinearLayoutManager) = object : RecyclerView.OnScrollListener() {
@@ -117,7 +118,7 @@ class ActivitiesActivity :
117118
lastGiven > 0
118119
) {
119120
// Almost reached the end, continue to load new activities
120-
actionListener?.loadActivities(lastGiven)
121+
actionListener?.loadActivities(lifecycleScope, lastGiven)
121122
}
122123
}
123124
}

app/src/main/java/com/owncloud/android/ui/activities/ActivitiesContract.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ package com.owncloud.android.ui.activities
1010
import com.nextcloud.common.NextcloudClient
1111
import com.owncloud.android.datamodel.OCFile
1212
import com.owncloud.android.ui.activity.BaseActivity
13+
import kotlinx.coroutines.CoroutineScope
1314

1415
interface ActivitiesContract {
1516
interface View {
@@ -24,7 +25,7 @@ interface ActivitiesContract {
2425
}
2526

2627
interface ActionListener {
27-
fun loadActivities(lastGiven: Long)
28+
fun loadActivities(lifecycleScope: CoroutineScope, lastGiven: Long)
2829

2930
fun openActivity(fileUrl: String, baseActivity: BaseActivity)
3031

app/src/main/java/com/owncloud/android/ui/activities/ActivitiesPresenter.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import com.owncloud.android.ui.activities.data.activities.ActivitiesRepository.L
1414
import com.owncloud.android.ui.activities.data.files.FilesRepository
1515
import com.owncloud.android.ui.activities.data.files.FilesRepository.ReadRemoteFileCallback
1616
import com.owncloud.android.ui.activity.BaseActivity
17+
import kotlinx.coroutines.CoroutineScope
1718

1819
class ActivitiesPresenter internal constructor(
1920
private val activitiesRepository: ActivitiesRepository,
@@ -22,13 +23,14 @@ class ActivitiesPresenter internal constructor(
2223
) : ActivitiesContract.ActionListener {
2324
private var activityStopped = false
2425

25-
override fun loadActivities(lastGiven: Long) {
26+
override fun loadActivities(lifecycleScope: CoroutineScope, lastGiven: Long) {
2627
if (ActivitiesContract.ActionListener.UNDEFINED.toLong() == lastGiven) {
2728
activitiesView.showLoadingMessage()
2829
} else {
2930
activitiesView.setProgressIndicatorState(true)
3031
}
3132
activitiesRepository.getActivities(
33+
lifecycleScope,
3234
lastGiven,
3335
object : LoadActivitiesCallback {
3436
override fun onActivitiesLoaded(activities: List<Any>, client: NextcloudClient, lastGiven: Long) {

app/src/main/java/com/owncloud/android/ui/activities/data/activities/ActivitiesRepository.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,13 @@
88
package com.owncloud.android.ui.activities.data.activities
99

1010
import com.nextcloud.common.NextcloudClient
11+
import kotlinx.coroutines.CoroutineScope
1112

12-
/**
13-
* Main entry point for accessing activities data.
14-
*/
1513
interface ActivitiesRepository {
1614
interface LoadActivitiesCallback {
1715
fun onActivitiesLoaded(activities: List<Any>, client: NextcloudClient, lastGiven: Long)
1816
fun onActivitiesLoadedError(error: String)
1917
}
2018

21-
fun getActivities(lastGiven: Long, callback: LoadActivitiesCallback)
19+
fun getActivities(lifecycleScope: CoroutineScope, lastGiven: Long, callback: LoadActivitiesCallback)
2220
}

app/src/main/java/com/owncloud/android/ui/activities/data/activities/ActivitiesServiceApi.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
package com.owncloud.android.ui.activities.data.activities
99

1010
import com.nextcloud.common.NextcloudClient
11+
import kotlinx.coroutines.CoroutineScope
1112

1213
/**
1314
* Defines an interface to the Activities service API. All ([Activity]) data requests should
@@ -19,5 +20,9 @@ interface ActivitiesServiceApi {
1920
fun onError(error: String)
2021
}
2122

22-
fun getAllActivities(lastGiven: Long, callback: ActivitiesServiceCallback<List<Any>>)
23+
fun getAllActivities(
24+
lifecycleScope: CoroutineScope,
25+
lastGiven: Long,
26+
callback: ActivitiesServiceCallback<List<Any>>
27+
)
2328
}

app/src/main/java/com/owncloud/android/ui/activities/data/activities/ActivitiesServiceApiImpl.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,12 @@ import org.apache.commons.httpclient.HttpStatus
2929
@Suppress("TooGenericExceptionThrown")
3030
class ActivitiesServiceApiImpl(private val accountManager: UserAccountManager) : ActivitiesServiceApi {
3131

32-
override fun getAllActivities(lastGiven: Long, callback: ActivitiesServiceCallback<List<Any>>) {
33-
CoroutineScope(Dispatchers.Main).launch {
32+
override fun getAllActivities(
33+
lifecycleScope: CoroutineScope,
34+
lastGiven: Long,
35+
callback: ActivitiesServiceCallback<List<Any>>
36+
) {
37+
lifecycleScope.launch(Dispatchers.Main) {
3438
val result = runCatching {
3539
withContext(Dispatchers.IO) { fetchActivities(lastGiven) }
3640
}

app/src/main/java/com/owncloud/android/ui/activities/data/activities/RemoteActivitiesRepository.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@ package com.owncloud.android.ui.activities.data.activities
1010
import com.nextcloud.common.NextcloudClient
1111
import com.owncloud.android.ui.activities.data.activities.ActivitiesRepository.LoadActivitiesCallback
1212
import com.owncloud.android.ui.activities.data.activities.ActivitiesServiceApi.ActivitiesServiceCallback
13+
import kotlinx.coroutines.CoroutineScope
1314

1415
class RemoteActivitiesRepository(private val activitiesServiceApi: ActivitiesServiceApi) : ActivitiesRepository {
15-
override fun getActivities(lastGiven: Long, callback: LoadActivitiesCallback) {
16+
override fun getActivities(lifecycleScope: CoroutineScope, lastGiven: Long, callback: LoadActivitiesCallback) {
1617
activitiesServiceApi.getAllActivities(
18+
lifecycleScope,
1719
lastGiven,
1820
object : ActivitiesServiceCallback<List<Any>> {
1921
override fun onLoaded(activities: List<Any>, client: NextcloudClient, lastGiven: Long) {

app/src/main/java/com/owncloud/android/ui/activities/data/files/FilesServiceApiImpl.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,20 @@
88
*/
99
package com.owncloud.android.ui.activities.data.files
1010

11+
import androidx.lifecycle.lifecycleScope
1112
import com.nextcloud.client.account.UserAccountManager
1213
import com.nextcloud.client.network.ClientFactory
1314
import com.nextcloud.client.network.ClientFactory.CreationException
1415
import com.owncloud.android.MainApp
1516
import com.owncloud.android.R
1617
import com.owncloud.android.datamodel.OCFile
18+
import com.owncloud.android.lib.common.utils.Log_OC
1719
import com.owncloud.android.lib.resources.files.ReadFileRemoteOperation
1820
import com.owncloud.android.lib.resources.files.model.RemoteFile
19-
import com.owncloud.android.lib.common.utils.Log_OC
2021
import com.owncloud.android.operations.RefreshFolderOperation
2122
import com.owncloud.android.ui.activities.data.files.FilesServiceApi.FilesServiceCallback
2223
import com.owncloud.android.ui.activity.BaseActivity
2324
import com.owncloud.android.utils.FileStorageUtils
24-
import kotlinx.coroutines.CoroutineScope
2525
import kotlinx.coroutines.Dispatchers
2626
import kotlinx.coroutines.launch
2727
import kotlinx.coroutines.withContext
@@ -33,7 +33,7 @@ class FilesServiceApiImpl(private val accountManager: UserAccountManager, privat
3333
FilesServiceApi {
3434

3535
override fun readRemoteFile(fileUrl: String, activity: BaseActivity, callback: FilesServiceCallback<OCFile>) {
36-
CoroutineScope(Dispatchers.Main).launch {
36+
activity.lifecycleScope.launch(Dispatchers.Main) {
3737
val result = runCatching {
3838
withContext(Dispatchers.IO) { fetchRemoteFile(fileUrl, activity) }
3939
}

0 commit comments

Comments
 (0)