Skip to content

Commit 5f191d9

Browse files
authored
Fix coroutine scope (#4820)
* Inject the session scope instead of the application scope where it's possible. * Create AppCoroutineScope annotation to let developers explicitly choose the appropriate CoroutineScope when injecting one.
1 parent 36c7c7a commit 5f191d9

File tree

58 files changed

+172
-72
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

58 files changed

+172
-72
lines changed

app/src/main/kotlin/io/element/android/x/di/AppModule.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import io.element.android.libraries.di.AppScope
2727
import io.element.android.libraries.di.ApplicationContext
2828
import io.element.android.libraries.di.CacheDirectory
2929
import io.element.android.libraries.di.SingleIn
30+
import io.element.android.libraries.di.annotations.AppCoroutineScope
3031
import io.element.android.x.BuildConfig
3132
import io.element.android.x.R
3233
import kotlinx.coroutines.CoroutineName
@@ -56,6 +57,7 @@ object AppModule {
5657
}
5758

5859
@Provides
60+
@AppCoroutineScope
5961
@SingleIn(AppScope::class)
6062
fun providesAppCoroutineScope(): CoroutineScope {
6163
return MainScope() + CoroutineName("ElementX Scope")

appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ import io.element.android.libraries.architecture.waitForNavTargetAttached
6565
import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher
6666
import io.element.android.libraries.di.AppScope
6767
import io.element.android.libraries.di.SessionScope
68+
import io.element.android.libraries.di.annotations.SessionCoroutineScope
6869
import io.element.android.libraries.matrix.api.MatrixClient
6970
import io.element.android.libraries.matrix.api.core.EventId
7071
import io.element.android.libraries.matrix.api.core.MAIN_SPACE
@@ -104,7 +105,8 @@ class LoggedInFlowNode @AssistedInject constructor(
104105
private val secureBackupEntryPoint: SecureBackupEntryPoint,
105106
private val userProfileEntryPoint: UserProfileEntryPoint,
106107
private val ftueEntryPoint: FtueEntryPoint,
107-
private val coroutineScope: CoroutineScope,
108+
@SessionCoroutineScope
109+
private val sessionCoroutineScope: CoroutineScope,
108110
private val ftueService: FtueService,
109111
private val roomDirectoryEntryPoint: RoomDirectoryEntryPoint,
110112
private val shareEntryPoint: ShareEntryPoint,
@@ -175,7 +177,7 @@ class LoggedInFlowNode @AssistedInject constructor(
175177
appNavigationStateService.onNavigateToSession(id, matrixClient.sessionId)
176178
// TODO We do not support Space yet, so directly navigate to main space
177179
appNavigationStateService.onNavigateToSpace(id, MAIN_SPACE)
178-
loggedInFlowProcessor.observeEvents(coroutineScope)
180+
loggedInFlowProcessor.observeEvents(sessionCoroutineScope)
179181
matrixClient.sessionVerificationService().setListener(verificationListener)
180182

181183
ftueService.state
@@ -313,7 +315,7 @@ class LoggedInFlowNode @AssistedInject constructor(
313315
}
314316

315317
override fun onForwardedToSingleRoom(roomId: RoomId) {
316-
coroutineScope.launch { attachRoom(roomId.toRoomIdOrAlias(), clearBackstack = false) }
318+
sessionCoroutineScope.launch { attachRoom(roomId.toRoomIdOrAlias(), clearBackstack = false) }
317319
}
318320

319321
override fun onPermalinkClick(data: PermalinkData, pushToBackstack: Boolean) {

appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomLoadedFlowNode.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import io.element.android.libraries.architecture.NodeInputs
3030
import io.element.android.libraries.architecture.inputs
3131
import io.element.android.libraries.di.DaggerComponentOwner
3232
import io.element.android.libraries.di.SessionScope
33+
import io.element.android.libraries.di.annotations.SessionCoroutineScope
3334
import io.element.android.libraries.matrix.api.MatrixClient
3435
import io.element.android.libraries.matrix.api.core.EventId
3536
import io.element.android.libraries.matrix.api.core.RoomId
@@ -50,7 +51,8 @@ class JoinedRoomLoadedFlowNode @AssistedInject constructor(
5051
private val messagesEntryPoint: MessagesEntryPoint,
5152
private val roomDetailsEntryPoint: RoomDetailsEntryPoint,
5253
private val appNavigationStateService: AppNavigationStateService,
53-
private val appCoroutineScope: CoroutineScope,
54+
@SessionCoroutineScope
55+
private val sessionCoroutineScope: CoroutineScope,
5456
private val matrixClient: MatrixClient,
5557
private val activeRoomsHolder: ActiveRoomsHolder,
5658
roomComponentFactory: RoomComponentFactory,
@@ -92,7 +94,7 @@ class JoinedRoomLoadedFlowNode @AssistedInject constructor(
9294
trackVisitedRoom()
9395
},
9496
onResume = {
95-
appCoroutineScope.launch {
97+
sessionCoroutineScope.launch {
9698
inputs.room.subscribeToSync()
9799
}
98100
},

appnav/src/test/kotlin/io/element/android/appnav/JoinedRoomLoadedFlowNodeTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ class JoinedRoomLoadedFlowNodeTest {
109109
messagesEntryPoint = messagesEntryPoint,
110110
roomDetailsEntryPoint = roomDetailsEntryPoint,
111111
appNavigationStateService = FakeAppNavigationStateService(),
112-
appCoroutineScope = this,
112+
sessionCoroutineScope = this,
113113
roomComponentFactory = FakeRoomComponentFactory(),
114114
matrixClient = FakeMatrixClient(),
115115
activeRoomsHolder = activeRoomsHolder,

features/cachecleaner/impl/src/main/kotlin/io/element/android/features/cachecleaner/impl/DefaultCacheCleaner.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import io.element.android.libraries.core.coroutine.CoroutineDispatchers
1313
import io.element.android.libraries.core.extensions.runCatchingExceptions
1414
import io.element.android.libraries.di.AppScope
1515
import io.element.android.libraries.di.CacheDirectory
16+
import io.element.android.libraries.di.annotations.AppCoroutineScope
1617
import kotlinx.coroutines.CoroutineScope
1718
import kotlinx.coroutines.launch
1819
import timber.log.Timber
@@ -24,7 +25,8 @@ import javax.inject.Inject
2425
*/
2526
@ContributesBinding(AppScope::class)
2627
class DefaultCacheCleaner @Inject constructor(
27-
private val scope: CoroutineScope,
28+
@AppCoroutineScope
29+
private val coroutineScope: CoroutineScope,
2830
private val dispatchers: CoroutineDispatchers,
2931
@CacheDirectory private val cacheDir: File,
3032
) : CacheCleaner {
@@ -33,7 +35,7 @@ class DefaultCacheCleaner @Inject constructor(
3335
}
3436

3537
override fun clearCache() {
36-
scope.launch(dispatchers.io) {
38+
coroutineScope.launch(dispatchers.io) {
3739
runCatchingExceptions {
3840
SUBDIRS_TO_CLEANUP.forEach {
3941
File(cacheDir.path, it).apply {

features/cachecleaner/impl/src/test/kotlin/io/element/android/features/cachecleaner/impl/DefaultCacheCleanerTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class DefaultCacheCleanerTest {
5555
}
5656

5757
private fun TestScope.aCacheCleaner() = DefaultCacheCleaner(
58-
scope = this,
58+
coroutineScope = this,
5959
dispatchers = this.testCoroutineDispatchers(true),
6060
cacheDir = temporaryFolder.root,
6161
)

features/call/impl/src/main/kotlin/io/element/android/features/call/impl/receivers/DeclineCallBroadcastReceiver.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import io.element.android.features.call.impl.di.CallBindings
1616
import io.element.android.features.call.impl.notifications.CallNotificationData
1717
import io.element.android.features.call.impl.utils.ActiveCallManager
1818
import io.element.android.libraries.architecture.bindings
19+
import io.element.android.libraries.di.annotations.AppCoroutineScope
1920
import kotlinx.coroutines.CoroutineScope
2021
import kotlinx.coroutines.launch
2122
import javax.inject.Inject
@@ -30,8 +31,8 @@ class DeclineCallBroadcastReceiver : BroadcastReceiver() {
3031
@Inject
3132
lateinit var activeCallManager: ActiveCallManager
3233

33-
@Inject
34-
lateinit var appCoroutineScope: CoroutineScope
34+
@AppCoroutineScope
35+
@Inject lateinit var appCoroutineScope: CoroutineScope
3536

3637
override fun onReceive(context: Context, intent: Intent?) {
3738
val notificationData = intent?.let { IntentCompat.getParcelableExtra(it, EXTRA_NOTIFICATION_DATA, CallNotificationData::class.java) }

features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/CallScreenPresenter.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import io.element.android.libraries.architecture.AsyncData
3232
import io.element.android.libraries.architecture.Presenter
3333
import io.element.android.libraries.architecture.runCatchingUpdatingState
3434
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
35+
import io.element.android.libraries.di.annotations.AppCoroutineScope
3536
import io.element.android.libraries.matrix.api.MatrixClient
3637
import io.element.android.libraries.matrix.api.MatrixClientProvider
3738
import io.element.android.libraries.matrix.api.core.RoomId
@@ -64,6 +65,7 @@ class CallScreenPresenter @AssistedInject constructor(
6465
private val languageTagProvider: LanguageTagProvider,
6566
private val appForegroundStateService: AppForegroundStateService,
6667
private val activeRoomsHolder: ActiveRoomsHolder,
68+
@AppCoroutineScope
6769
private val appCoroutineScope: CoroutineScope,
6870
) : Presenter<CallScreenState> {
6971
@AssistedFactory

features/call/impl/src/main/kotlin/io/element/android/features/call/impl/ui/IncomingCallActivity.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import io.element.android.features.enterprise.api.EnterpriseService
2323
import io.element.android.libraries.architecture.bindings
2424
import io.element.android.libraries.core.meta.BuildMeta
2525
import io.element.android.libraries.designsystem.theme.ElementThemeApp
26+
import io.element.android.libraries.di.annotations.AppCoroutineScope
2627
import io.element.android.libraries.preferences.api.store.AppPreferencesStore
2728
import kotlinx.coroutines.CoroutineScope
2829
import kotlinx.coroutines.flow.filter
@@ -57,8 +58,8 @@ class IncomingCallActivity : AppCompatActivity() {
5758
@Inject
5859
lateinit var buildMeta: BuildMeta
5960

60-
@Inject
61-
lateinit var appCoroutineScope: CoroutineScope
61+
@AppCoroutineScope
62+
@Inject lateinit var appCoroutineScope: CoroutineScope
6263

6364
override fun onCreate(savedInstanceState: Bundle?) {
6465
super.onCreate(savedInstanceState)

features/call/impl/src/main/kotlin/io/element/android/features/call/impl/utils/ActiveCallManager.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import io.element.android.libraries.core.extensions.runCatchingExceptions
2525
import io.element.android.libraries.di.AppScope
2626
import io.element.android.libraries.di.ApplicationContext
2727
import io.element.android.libraries.di.SingleIn
28+
import io.element.android.libraries.di.annotations.AppCoroutineScope
2829
import io.element.android.libraries.matrix.api.MatrixClientProvider
2930
import io.element.android.libraries.matrix.api.core.SessionId
3031
import io.element.android.libraries.matrix.ui.media.ImageLoaderHolder
@@ -87,6 +88,7 @@ interface ActiveCallManager {
8788
@ContributesBinding(AppScope::class)
8889
class DefaultActiveCallManager @Inject constructor(
8990
@ApplicationContext context: Context,
91+
@AppCoroutineScope
9092
private val coroutineScope: CoroutineScope,
9193
private val onMissedCallNotificationHandler: OnMissedCallNotificationHandler,
9294
private val ringingCallNotificationCreator: RingingCallNotificationCreator,

0 commit comments

Comments
 (0)