@@ -4,20 +4,28 @@ import com.google.api.client.googleapis.extensions.android.gms.auth.UserRecovera
4
4
import eu.darken.octi.common.coroutine.AppScope
5
5
import eu.darken.octi.common.coroutine.DispatcherProvider
6
6
import eu.darken.octi.common.debug.logging.Logging.Priority.ERROR
7
+ import eu.darken.octi.common.debug.logging.Logging.Priority.INFO
8
+ import eu.darken.octi.common.debug.logging.Logging.Priority.WARN
7
9
import eu.darken.octi.common.debug.logging.asLog
8
10
import eu.darken.octi.common.debug.logging.log
9
11
import eu.darken.octi.common.debug.logging.logTag
10
12
import eu.darken.octi.common.flow.setupCommonEventHandlers
11
13
import eu.darken.octi.common.flow.shareLatest
12
14
import eu.darken.octi.sync.core.ConnectorHub
13
15
import eu.darken.octi.sync.core.ConnectorId
14
- import eu.darken.octi.sync.core.SyncConnector
16
+ import eu.darken.octi.sync.core.SyncOptions
15
17
import eu.darken.octi.sync.core.SyncSettings
16
18
import kotlinx.coroutines.CoroutineScope
17
19
import kotlinx.coroutines.NonCancellable
18
20
import kotlinx.coroutines.flow.Flow
21
+ import kotlinx.coroutines.flow.catch
22
+ import kotlinx.coroutines.flow.distinctUntilChangedBy
23
+ import kotlinx.coroutines.flow.drop
19
24
import kotlinx.coroutines.flow.first
25
+ import kotlinx.coroutines.flow.launchIn
26
+ import kotlinx.coroutines.flow.map
20
27
import kotlinx.coroutines.flow.mapLatest
28
+ import kotlinx.coroutines.flow.onEach
21
29
import kotlinx.coroutines.plus
22
30
import kotlinx.coroutines.withContext
23
31
import javax.inject.Inject
@@ -39,7 +47,24 @@ class GDriveHub @Inject constructor(
39
47
.setupCommonEventHandlers(TAG ) { " connectors" }
40
48
.shareLatest(scope + dispatcherProvider.Default )
41
49
42
- override val connectors: Flow <Collection <SyncConnector >> = _connectors
50
+ override val connectors: Flow <Collection <GDriveAppDataConnector >> = _connectors
51
+
52
+ init {
53
+ _connectors
54
+ .drop(1 ) // Initial launch
55
+ .distinctUntilChangedBy { connectors -> connectors.map { it.account } }
56
+ .map { connectors -> connectors.filter { it.data.first() == null } }
57
+ .onEach { connectors ->
58
+ // Connectors that have been added and have no data yet
59
+ connectors.forEach { connector ->
60
+ log(TAG , INFO ) { " Syncing initial data for ${connector.account} " }
61
+ connector.sync(SyncOptions ())
62
+ log(TAG , INFO ) { " Initial data sync done for ${connector.account} " }
63
+ }
64
+ }
65
+ .catch { log(TAG , WARN ) { " Initial sync flow failed\n ${it.asLog()} " } }
66
+ .launchIn(scope)
67
+ }
43
68
44
69
override suspend fun owns (connectorId : ConnectorId ): Boolean {
45
70
return _connectors .first().any { it.identifier == connectorId }
0 commit comments