Skip to content

Commit ce92433

Browse files
leandroBorgesFerreiraLeandro Ferreira
andauthored
Android sync (#520)
* Implementing android sync * Sync working * Ktlint fix * Update RoomDocumentRepository.kt --------- Co-authored-by: Leandro Ferreira <[email protected]>
1 parent c542f83 commit ce92433

File tree

25 files changed

+181
-90
lines changed

25 files changed

+181
-90
lines changed

.editorconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ ktlint_standard_property-naming = disabled
3030
ktlint_standard_import-ordering = disabled
3131
ktlint_standard_no-multi-spaces = disabled
3232
ktlint_standard_chain-method-continuation = disabled
33+
ktlint_standard_class-signature = disabled
3334

3435

3536

application/common_flows/wide_screen_common/src/commonMain/kotlin/io/writeopia/notes/desktop/components/App.kt renamed to application/common_flows/wide_screen_common/src/commonMain/kotlin/io/writeopia/notes/desktop/components/DesktopApp.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ import io.writeopia.notemenu.navigation.NAVIGATION_TYPE
5050
import io.writeopia.notemenu.navigation.navigateToNotes
5151
import io.writeopia.notemenu.ui.screen.menu.EditFileScreen
5252
import io.writeopia.notemenu.ui.screen.menu.RoundedVerticalDivider
53+
import io.writeopia.sdk.persistence.core.di.RepositoryInjector
5354
import io.writeopia.sql.WriteopiaDb
5455
import io.writeopia.sqldelight.di.SqlDelightDaoInjector
5556
import io.writeopia.sqldelight.di.WriteopiaDbInjector
@@ -81,6 +82,8 @@ fun DesktopApp(
8182
WriteopiaDbInjector.initialize(writeopiaDb)
8283
}
8384

85+
RepositoryInjector.initialize(SqlDelightDaoInjector.singleton())
86+
8487
val editorInjector = remember {
8588
EditorKmpInjector.desktop(
8689
selectionState = selectionState,
@@ -100,7 +103,7 @@ fun DesktopApp(
100103
}
101104

102105
val documentsGraphInjection =
103-
DocumentsGraphInjection(repositoryInjection = SqlDelightDaoInjector.singleton())
106+
DocumentsGraphInjection(repositoryInjection = RepositoryInjector.singleton())
104107

105108
val globalShellViewModel: GlobalShellViewModel =
106109
sideMenuInjector.provideSideMenuViewModel(keyboardEventFlow)

application/composeApp/src/androidMain/kotlin/io/writeopia/navigation/NavigationActivity.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import io.writeopia.persistence.room.injection.AppRoomDaosInjection
2929
import io.writeopia.persistence.room.injection.RoomRepositoryInjection
3030
import io.writeopia.persistence.room.injection.WriteopiaRoomInjector
3131
import io.writeopia.sdk.network.injector.WriteopiaConnectionInjector
32+
import io.writeopia.sdk.persistence.core.di.RepositoryInjector
3233
import io.writeopia.ui.image.ImageLoadConfig
3334

3435
class NavigationActivity : ComponentActivity() {
@@ -66,19 +67,19 @@ fun NavigationGraph(
6667
SharedPreferencesInjector.init(sharedPreferences)
6768
WriteopiaRoomInjector.init(database)
6869

70+
RepositoryInjector.initialize(RoomRepositoryInjection.singleton())
71+
6972
val uiConfigInjection = UiConfigurationInjector.singleton()
7073

7174
val appDaosInjection = AppRoomDaosInjection.singleton()
7275
WriteopiaConnectionInjector.setBaseUrl(BuildConfig.BASE_URL)
7376
val uiConfigViewModel = uiConfigInjection.provideUiConfigurationViewModel()
74-
val repositoryInjection = RoomRepositoryInjection.singleton()
75-
val editorInjector = EditorKmpInjector.mobile(repositoryInjection)
76-
val notesMenuInjection = NotesMenuKmpInjection.mobile(repositoryInjection)
77+
val editorInjector = EditorKmpInjector.mobile()
78+
val notesMenuInjection = NotesMenuKmpInjection.mobile()
7779

7880
val searchInjector = remember {
7981
MobileSearchInjection(
8082
appRoomDaosInjection = appDaosInjection,
81-
roomInjector = repositoryInjection
8283
)
8384
}
8485

application/composeApp/src/iosMain/kotlin/io/writeopia/MainViewController.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import io.writeopia.navigation.MobileNavigationViewModel
1717
import io.writeopia.notemenu.di.NotesMenuKmpInjection
1818
import io.writeopia.notemenu.di.UiConfigurationInjector
1919
import io.writeopia.notemenu.navigation.navigateToNotes
20+
import io.writeopia.sdk.persistence.core.di.RepositoryInjector
2021
import io.writeopia.sqldelight.database.DatabaseCreation
2122
import io.writeopia.sqldelight.database.DatabaseFactory
2223
import io.writeopia.sqldelight.database.driver.DriverFactory
@@ -41,19 +42,19 @@ fun MainViewController() = ComposeUIViewController {
4142
val database = databaseState.writeopiaDb
4243

4344
WriteopiaDbInjector.initialize(database)
45+
RepositoryInjector.initialize(SqlDelightDaoInjector.singleton())
4446

4547
val uiConfigurationInjector = remember { UiConfigurationInjector.singleton() }
46-
val sqlDelightDaoInjector = remember { SqlDelightDaoInjector.singleton() }
4748
val searchInjection = remember { KmpSearchInjection.singleton() }
4849

4950
val uiConfigurationViewModel = uiConfigurationInjector
5051
.provideUiConfigurationViewModel()
5152

5253
val notesMenuInjection = remember {
53-
NotesMenuKmpInjection.mobile(sqlDelightDaoInjector)
54+
NotesMenuKmpInjection.mobile()
5455
}
5556

56-
val editorInjector = EditorKmpInjector.mobile(sqlDelightDaoInjector)
57+
val editorInjector = EditorKmpInjector.mobile()
5758

5859
val navigationViewModel = viewModel { MobileNavigationViewModel() }
5960

application/core/documents/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ kotlin {
3434
implementation(project(":writeopia"))
3535
implementation(project(":writeopia_models"))
3636
implementation(project(":plugins:writeopia_persistence_core"))
37-
3837
implementation(project(":plugins:writeopia_serialization"))
38+
implementation(project(":plugins:writeopia_network"))
3939

4040
implementation(project(":application:core:utils"))
4141
implementation(project(":application:core:auth_core"))
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package io.writeopia.core.folders.di
2+
3+
import io.writeopia.auth.core.di.AuthCoreInjectionNeo
4+
import io.writeopia.core.folders.api.DocumentsApi
5+
import io.writeopia.core.folders.sync.DocumentConflictHandler
6+
import io.writeopia.core.folders.sync.WorkspaceSync
7+
import io.writeopia.di.AppConnectionInjection
8+
import io.writeopia.sdk.network.injector.WriteopiaConnectionInjector
9+
import io.writeopia.sdk.persistence.core.di.RepositoryInjector
10+
11+
class WorkspaceInjection private constructor(
12+
private val authCoreInjection: AuthCoreInjectionNeo = AuthCoreInjectionNeo.singleton(),
13+
private val appConnectionInjection: AppConnectionInjection = AppConnectionInjection.singleton(),
14+
private val connectionInjector: WriteopiaConnectionInjector =
15+
WriteopiaConnectionInjector.singleton(),
16+
private val repositoryInjection: RepositoryInjector = RepositoryInjector.singleton(),
17+
) {
18+
19+
fun provideWorkspaceSync(): WorkspaceSync {
20+
val documentRepo = repositoryInjection.provideDocumentRepository()
21+
return WorkspaceSync(
22+
folderRepository = FoldersInjector.singleton().provideFoldersRepository(),
23+
documentRepository = documentRepo,
24+
authRepository = authCoreInjection.provideAuthRepository(),
25+
documentsApi = DocumentsApi(
26+
appConnectionInjection.provideHttpClient(),
27+
connectionInjector.baseUrl()
28+
),
29+
documentConflictHandler = DocumentConflictHandler(
30+
documentRepository = documentRepo,
31+
folderRepository = FoldersInjector.singleton().provideFoldersRepository(),
32+
authCoreInjection.provideAuthRepository()
33+
),
34+
)
35+
}
36+
37+
companion object {
38+
private var instance: WorkspaceInjection? = null
39+
40+
fun singleton() = instance ?: WorkspaceInjection().also {
41+
instance = it
42+
}
43+
}
44+
}

application/core/documents/src/commonMain/kotlin/io/writeopia/core/folders/repository/folder/RoomFolderRepository.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,8 @@ class RoomFolderRepository(
9898
SelectedIds.ids.remove(parentId)
9999
}
100100

101-
override suspend fun localOutDatedFolders(workspaceId: String): List<Folder> {
102-
TODO("Not yet implemented")
103-
}
101+
override suspend fun localOutDatedFolders(workspaceId: String): List<Folder> =
102+
folderRoomDao.getFoldersForWorkspace(workspaceId)
104103

105104
override suspend fun search(query: String, workspaceId: String): List<Folder> =
106105
folderRoomDao.search(query, workspaceId)

application/core/documents/src/commonMain/kotlin/io/writeopia/core/folders/sync/WorkspaceSync.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ class WorkspaceSync(
1717

1818
suspend fun syncWorkspace(workspaceId: String): ResultData<Unit> {
1919
try {
20+
println("start to sync workspace")
2021
val authToken = authRepository.getAuthToken() ?: return ResultData.Error(null)
2122
val workspace = authRepository.getWorkspace() ?: return ResultData.Idle()
2223

@@ -37,7 +38,8 @@ class WorkspaceSync(
3738
documentRepository.loadOutdatedDocumentsForWorkspace(workspaceId)
3839
val localOutdatedFolders = folderRepository.localOutDatedFolders(workspaceId)
3940

40-
println("local outdated docs: ${localOutdatedFolders.size}")
41+
println("local outdated folders: ${localOutdatedFolders.size}")
42+
println("local outdated docs: ${localOutdatedDocs.size}")
4143

4244
val documentsNotSent = documentConflictHandler.handleConflict(
4345
localOutdatedDocs,

application/core/persistence_room/src/commonMain/kotlin/io/writeopia/persistence/room/data/daos/FolderDaoDelegator.kt

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -17,33 +17,27 @@ class FolderDaoDelegator(
1717
delegate.upsertFolder(folderEntity.toRoomEntity().toEntity())
1818
}
1919

20-
override suspend fun getFolderById(id: String): Folder? {
21-
return delegate.getFolderById(id)?.toCommonEntity()?.toModel(0)
22-
}
20+
override suspend fun getFolderById(id: String): Folder? =
21+
delegate.getFolderById(id)?.toCommonEntity()?.toModel(0)
2322

24-
override suspend fun search(query: String, workspaceId: String): List<Folder> {
25-
return delegate.search(query, workspaceId).map { it.toCommonEntity().toModel(0) }
26-
}
23+
override suspend fun search(query: String, workspaceId: String): List<Folder> =
24+
delegate.search(query, workspaceId).map { it.toCommonEntity().toModel(0) }
2725

28-
override suspend fun getLastUpdated(): List<Folder> {
29-
return delegate.getLastUpdated().map { it.toCommonEntity().toModel(0) }
30-
}
26+
override suspend fun getFoldersForWorkspace(workspaceId: String): List<Folder> =
27+
delegate.getFoldersByWorkspaceId(workspaceId).map { it.toCommonEntity().toModel(0) }
3128

32-
override suspend fun getFolderByParentId(id: String): List<Folder> {
33-
return delegate.getFolderByParentId(id).map { it.toCommonEntity().toModel(0) }
34-
}
29+
override suspend fun getLastUpdated(): List<Folder> =
30+
delegate.getLastUpdated().map { it.toCommonEntity().toModel(0) }
3531

36-
override fun listenForFolderByParentId(id: String): Flow<List<Folder>> {
37-
return delegate.listenForFolderByParentId(id).map { list ->
32+
override suspend fun getFolderByParentId(id: String): List<Folder> =
33+
delegate.getFolderByParentId(id).map { it.toCommonEntity().toModel(0) }
34+
35+
override fun listenForFolderByParentId(id: String): Flow<List<Folder>> =
36+
delegate.listenForFolderByParentId(id).map { list ->
3837
list.map { it.toCommonEntity().toModel(0) }
3938
}
40-
}
4139

42-
override suspend fun deleteById(id: String): Int {
43-
return delegate.deleteById(id)
44-
}
40+
override suspend fun deleteById(id: String): Int = delegate.deleteById(id)
4541

46-
override suspend fun deleteByParentId(id: String): Int {
47-
return delegate.deleteByParentId(id)
48-
}
42+
override suspend fun deleteByParentId(id: String): Int = delegate.deleteByParentId(id)
4943
}

application/core/persistence_room/src/commonMain/kotlin/io/writeopia/persistence/room/data/daos/FolderRoomDao.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ interface FolderRoomDao {
2222
@Query("SELECT * FROM $FOLDER_ENTITY ORDER BY last_updated_at LIMIT 15")
2323
suspend fun getLastUpdated(): List<FolderEntity>
2424

25+
@Query("SELECT * FROM $FOLDER_ENTITY WHERE workspace_id = :workspaceId")
26+
fun getFoldersByWorkspaceId(workspaceId: String): List<FolderEntity>
27+
2528
@Query("SELECT * FROM $FOLDER_ENTITY WHERE parent_id = :id")
2629
suspend fun getFolderByParentId(id: String): List<FolderEntity>
2730

0 commit comments

Comments
 (0)