Skip to content

Commit cb4a1b1

Browse files
frettclaude
andcommitted
Replace local SyncTaskRegistry with gto-support-sync library implementation
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 4cbc5a3 commit cb4a1b1

8 files changed

Lines changed: 26 additions & 211 deletions

File tree

app/src/main/kotlin/org/cru/godtools/ui/dashboard/DashboardPresenter.kt

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@ import dagger.hilt.components.SingletonComponent
2020
import kotlinx.coroutines.coroutineScope
2121
import kotlinx.coroutines.launch
2222
import org.ccci.gto.android.common.sync.SyncTracker
23+
import org.ccci.gto.android.common.sync.rememberSyncTask
24+
import org.ccci.gto.android.common.sync.rememberSyncTaskRegistry
2325
import org.cru.godtools.base.ui.circuit.screen.dashboard.DashboardScreen
2426
import org.cru.godtools.base.ui.circuit.screen.dashboard.page.DashboardPage
2527
import org.cru.godtools.base.ui.circuit.screen.dashboard.page.HomeScreen
2628
import org.cru.godtools.sync.GodToolsSyncService
2729
import org.cru.godtools.ui.dashboard.DashboardPresenter.UiState
28-
import org.cru.godtools.ui.dashboard.SyncTaskRegistry.Companion.rememberSyncRegistry
29-
import org.cru.godtools.ui.dashboard.SyncTaskRegistry.Companion.syncTaskRegistry
3030
import org.cru.godtools.ui.drawer.DrawerMenuPresenter
3131
import org.cru.godtools.ui.drawer.DrawerMenuScreen
3232

@@ -53,16 +53,8 @@ class DashboardPresenter @AssistedInject internal constructor(
5353

5454
@Composable
5555
override fun present(): UiState {
56-
val syncRegistry = rememberSyncRegistry()
57-
DisposableEffect(syncRegistry) {
58-
circuitContext.syncTaskRegistry = syncRegistry
59-
val id = syncRegistry.registerSyncTask { syncData(it) }
60-
61-
onDispose {
62-
circuitContext.syncTaskRegistry = null
63-
syncRegistry.unregisterSyncTask(id)
64-
}
65-
}
56+
val syncRegistry = circuitContext.rememberSyncTaskRegistry()
57+
syncRegistry.rememberSyncTask { syncData(it) }
6658

6759
return UiState(
6860
drawerState = drawerMenuPresenter.present(),

app/src/main/kotlin/org/cru/godtools/ui/dashboard/SyncTaskRegistry.kt

Lines changed: 0 additions & 41 deletions
This file was deleted.

app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsPresenter.kt

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package org.cru.godtools.ui.dashboard.lessons
22

33
import android.content.Context
44
import androidx.compose.runtime.Composable
5-
import androidx.compose.runtime.DisposableEffect
65
import androidx.compose.runtime.LaunchedEffect
76
import androidx.compose.runtime.collectAsState
87
import androidx.compose.runtime.getValue
@@ -39,6 +38,7 @@ import kotlinx.coroutines.flow.map
3938
import org.ccci.gto.android.common.dagger.coroutines.DispatcherType
4039
import org.ccci.gto.android.common.dagger.coroutines.DispatcherType.Type.IO
4140
import org.ccci.gto.android.common.sync.SyncTracker
41+
import org.ccci.gto.android.common.sync.rememberSyncTask
4242
import org.cru.godtools.analytics.model.OpenAnalyticsActionEvent
4343
import org.cru.godtools.analytics.model.OpenAnalyticsActionEvent.Companion.ACTION_OPEN_LESSON
4444
import org.cru.godtools.analytics.model.OpenAnalyticsActionEvent.Companion.SOURCE_LESSONS
@@ -51,7 +51,6 @@ import org.cru.godtools.db.repository.TranslationsRepository
5151
import org.cru.godtools.model.Language
5252
import org.cru.godtools.model.Language.Companion.filterByDisplayAndNativeName
5353
import org.cru.godtools.sync.GodToolsSyncService
54-
import org.cru.godtools.ui.dashboard.SyncTaskRegistry.Companion.syncTaskRegistry
5554
import org.cru.godtools.ui.dashboard.filters.FilterMenu
5655
import org.cru.godtools.ui.dashboard.lessons.LessonsPresenter.UiState
5756
import org.cru.godtools.ui.settings.country.CountrySettingsScreen
@@ -219,12 +218,7 @@ class LessonsPresenter @AssistedInject internal constructor(
219218

220219
@Composable
221220
private fun RegisterSyncTask(locale: Locale) {
222-
val syncRegistry = circuitContext.syncTaskRegistry
223-
DisposableEffect(syncRegistry, locale) {
224-
if (syncRegistry == null) return@DisposableEffect onDispose { }
225-
val id = syncRegistry.registerSyncTask { force -> syncData(locale, force) }
226-
onDispose { syncRegistry.unregisterSyncTask(id) }
227-
}
221+
circuitContext.rememberSyncTask(locale) { syncData(locale, it) }
228222
}
229223

230224
private fun SyncTracker.syncData(locale: Locale, force: Boolean = false) = launchSync {

app/src/main/kotlin/org/cru/godtools/ui/dashboard/tools/ToolsPresenter.kt

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package org.cru.godtools.ui.dashboard.tools
22

33
import androidx.compose.runtime.Composable
4-
import androidx.compose.runtime.DisposableEffect
54
import androidx.compose.runtime.collectAsState
65
import androidx.compose.runtime.getValue
76
import androidx.compose.runtime.key
@@ -26,6 +25,7 @@ import kotlinx.coroutines.coroutineScope
2625
import kotlinx.coroutines.flow.first
2726
import kotlinx.coroutines.launch
2827
import org.ccci.gto.android.common.sync.SyncTracker
28+
import org.ccci.gto.android.common.sync.rememberSyncTask
2929
import org.cru.godtools.analytics.model.OpenAnalyticsActionEvent
3030
import org.cru.godtools.analytics.model.OpenAnalyticsActionEvent.Companion.ACTION_OPEN_TOOL_DETAILS
3131
import org.cru.godtools.analytics.model.OpenAnalyticsActionEvent.Companion.SOURCE_ALL_TOOLS
@@ -39,7 +39,6 @@ import org.cru.godtools.sync.GodToolsSyncService
3939
import org.cru.godtools.ui.banner.Banner
4040
import org.cru.godtools.ui.banner.BannerPresenter
4141
import org.cru.godtools.ui.banner.favoritetools.FavoriteToolsBannerPresenter
42-
import org.cru.godtools.ui.dashboard.SyncTaskRegistry.Companion.syncTaskRegistry
4342
import org.cru.godtools.ui.dashboard.tools.ToolFiltersStateProducer.Filters
4443
import org.cru.godtools.ui.dashboard.tools.ToolsPresenter.UiState
4544
import org.cru.godtools.ui.dashboard.tools.ToolsPresenter.UiState.Mode
@@ -95,7 +94,8 @@ class ToolsPresenter @AssistedInject internal constructor(
9594
val filters = toolFiltersStateProducer.produce(mode)
9695
val selectedLocale by rememberUpdatedState(filters.languageFilter.selectedItem?.code)
9796

98-
RegisterSyncTask(selectedLocale)
97+
val appLocale by settings.appLanguageFlow.collectAsState()
98+
RegisterSyncTask(selectedLocale ?: appLocale)
9999

100100
val featuredTools = rememberFeaturedTools(
101101
mode = mode,
@@ -128,13 +128,8 @@ class ToolsPresenter @AssistedInject internal constructor(
128128
}
129129

130130
@Composable
131-
private fun RegisterSyncTask(selectedLocale: Locale?) {
132-
val syncRegistry = circuitContext.syncTaskRegistry
133-
DisposableEffect(syncRegistry, selectedLocale) {
134-
if (syncRegistry == null) return@DisposableEffect onDispose { }
135-
val id = syncRegistry.registerSyncTask { force -> syncData(selectedLocale ?: settings.appLanguage, force) }
136-
onDispose { syncRegistry.unregisterSyncTask(id) }
137-
}
131+
private fun RegisterSyncTask(locale: Locale) {
132+
circuitContext.rememberSyncTask(locale) { syncData(locale, it) }
138133
}
139134

140135
@Composable

app/src/test/kotlin/org/cru/godtools/ui/dashboard/DashboardPresenterTest.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,14 @@ import kotlinx.coroutines.sync.Mutex
2424
import kotlinx.coroutines.sync.withLock
2525
import kotlinx.coroutines.test.runTest
2626
import org.ccci.gto.android.common.androidx.compose.ui.platform.AndroidUiDispatcherUtil
27+
import org.ccci.gto.android.common.sync.SyncTaskRegistry
2728
import org.ccci.gto.support.turbine.awaitItemMatching
2829
import org.cru.godtools.base.ui.circuit.screen.dashboard.DashboardScreen
2930
import org.cru.godtools.base.ui.circuit.screen.dashboard.page.HomeScreen
3031
import org.cru.godtools.base.ui.circuit.screen.dashboard.page.LessonsScreen
3132
import org.cru.godtools.sync.GodToolsSyncService
3233
import org.cru.godtools.ui.dashboard.DashboardPresenter.UiEvent
3334
import org.cru.godtools.ui.dashboard.DashboardPresenter.UiState
34-
import org.cru.godtools.ui.dashboard.SyncTaskRegistry.Companion.syncTaskRegistry
3535
import org.cru.godtools.ui.drawer.DrawerMenuPresenter
3636
import org.cru.godtools.ui.drawer.DrawerMenuScreen
3737
import org.cru.godtools.ui.tooldetails.ToolDetailsScreen
@@ -152,12 +152,12 @@ class DashboardPresenterTest {
152152
// region SideEffect - SyncTaskRegistry
153153
@Test
154154
fun `SideEffect - SyncTaskRegistry - set on CircuitContext while presenter is active`() = runTest {
155-
assertNull(circuitContext.syncTaskRegistry)
155+
assertNull(circuitContext.tag<SyncTaskRegistry>())
156156
presenter.test {
157157
awaitInitialState()
158-
assertNotNull(circuitContext.syncTaskRegistry)
158+
assertNotNull(circuitContext.tag<SyncTaskRegistry>())
159159
}
160-
assertNull(circuitContext.syncTaskRegistry)
160+
assertNull(circuitContext.tag<SyncTaskRegistry>())
161161
}
162162
// endregion SideEffect - SyncTaskRegistry
163163

app/src/test/kotlin/org/cru/godtools/ui/dashboard/SyncTaskRegistryTest.kt

Lines changed: 0 additions & 121 deletions
This file was deleted.

app/src/test/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsPresenterTest.kt

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import kotlinx.coroutines.test.TestScope
4040
import kotlinx.coroutines.test.UnconfinedTestDispatcher
4141
import kotlinx.coroutines.test.runTest
4242
import org.ccci.gto.android.common.androidx.compose.ui.platform.AndroidUiDispatcherUtil
43+
import org.ccci.gto.android.common.sync.SyncTaskRegistry
4344
import org.ccci.gto.android.common.sync.SyncTracker
4445
import org.ccci.gto.android.common.util.content.equalsIntent
4546
import org.ccci.gto.support.turbine.awaitItemMatching
@@ -58,8 +59,6 @@ import org.cru.godtools.model.Translation
5859
import org.cru.godtools.model.randomTool
5960
import org.cru.godtools.model.randomTranslation
6061
import org.cru.godtools.sync.GodToolsSyncService
61-
import org.cru.godtools.ui.dashboard.SyncTaskRegistry
62-
import org.cru.godtools.ui.dashboard.SyncTaskRegistry.Companion.syncTaskRegistry
6362
import org.cru.godtools.ui.dashboard.filters.FilterMenu
6463
import org.cru.godtools.ui.dashboard.lessons.LessonsPresenter.UiEvent
6564
import org.cru.godtools.ui.dashboard.lessons.LessonsPresenter.UiState
@@ -85,10 +84,6 @@ class LessonsPresenterTest {
8584
private var isPersonalizationEnabled = true
8685

8786
private val testScope = TestScope()
88-
@OptIn(InternalCircuitApi::class)
89-
private val circuitContext = CircuitContext(null).apply {
90-
syncTaskRegistry = SyncTaskRegistry(SyncTracker(testScope.backgroundScope))
91-
}
9287
private val context: Context = ApplicationProvider.getApplicationContext()
9388
private val eventBus: EventBus = mockk(relaxUnitFun = true)
9489
private val remoteConfig: FirebaseRemoteConfig = mockk {
@@ -105,6 +100,7 @@ class LessonsPresenterTest {
105100
private val syncService: GodToolsSyncService = mockk {
106101
coEvery { syncToolOrder(any(), any(), any()) } coAnswers { toolOrderSync.receive() }
107102
}
103+
private val syncTaskRegistry = SyncTaskRegistry(SyncTracker(testScope.backgroundScope))
108104
private val lessonsFlowProducer: LessonsFlowProducer = mockk {
109105
every { getFlow(any(), any()) } returns flowOf(emptyList())
110106
every { getFlow(any(), Locale.ENGLISH) } returns enLessonsFlow
@@ -117,6 +113,8 @@ class LessonsPresenterTest {
117113
}
118114

119115
private val backStack = SaveableBackStack(LessonsScreen)
116+
@OptIn(InternalCircuitApi::class)
117+
private val circuitContext = CircuitContext(null).apply { putTag(syncTaskRegistry) }
120118
private val navigator = FakeNavigator(backStack)
121119

122120
private val presenter = LessonsPresenter(
@@ -475,7 +473,7 @@ class LessonsPresenterTest {
475473
toolOrderSync.send(true)
476474
coVerify { syncService.syncToolOrder(Locale.ENGLISH, "US", false) }
477475

478-
circuitContext.syncTaskRegistry!!.triggerSyncTasks(force = true)
476+
syncTaskRegistry.triggerSyncTasks(force = true)
479477
toolOrderSync.send(true)
480478
coVerify { syncService.syncToolOrder(Locale.ENGLISH, "US", true) }
481479
}

0 commit comments

Comments
 (0)