diff --git a/core-models/src/main/java/com/anytypeio/anytype/core_models/multiplayer/Multiplayer.kt b/core-models/src/main/java/com/anytypeio/anytype/core_models/multiplayer/Multiplayer.kt index 7dfb25fb0d..d66d4b0a7c 100644 --- a/core-models/src/main/java/com/anytypeio/anytype/core_models/multiplayer/Multiplayer.kt +++ b/core-models/src/main/java/com/anytypeio/anytype/core_models/multiplayer/Multiplayer.kt @@ -35,15 +35,15 @@ enum class SpaceMemberPermissions( OWNER(2), NO_PERMISSIONS(3); - fun isOwner() : Boolean { + fun isOwner(): Boolean { return this == OWNER } - fun isOwnerOrEditor() : Boolean { + fun isOwnerOrEditor(): Boolean { return this == OWNER || this == WRITER } - fun isAtLeastReader() : Boolean { + fun isAtLeastReader(): Boolean { return this == OWNER || this == WRITER || this == READER } } @@ -56,6 +56,46 @@ enum class SpaceAccessType(val code: Int) { sealed class SpaceInviteError : Exception() { class SpaceNotFound : SpaceInviteError() - class SpaceDeleted: SpaceInviteError() - class InvalidInvite: SpaceInviteError() + class SpaceDeleted : SpaceInviteError() + class InvalidInvite : SpaceInviteError() +} + +data class SpaceSyncUpdate( + val id: String, + val status: SpaceSyncStatus, + val network: SpaceSyncNetwork, + val error: SpaceSyncError?, + val syncingObjectsCounter: Long +) + +enum class SpaceSyncStatus { + SYNCED, + SYNCING, + ERROR, + OFFLINE +} + +enum class SpaceSyncNetwork { + ANYTYPE, + SELF_HOST, + LOCAL_ONLY +} + +enum class SpaceSyncError { + NULL, + STORAGE_LIMIT_EXCEED, + INCOMPATIBLE_VERSION, + NETWORK_ERROR +} + +data class P2PStatusUpdate( + val spaceId: String, + val status: P2PStatus, + val devicesCounter: Long +) + +enum class P2PStatus { + NOT_CONNECTED, + NOT_POSSIBLE, + CONNECTED } \ No newline at end of file diff --git a/data/src/main/java/com/anytypeio/anytype/data/auth/status/SpaceP2PStatusRemoteChannel.kt b/data/src/main/java/com/anytypeio/anytype/data/auth/status/SpaceP2PStatusRemoteChannel.kt new file mode 100644 index 0000000000..8cda17310a --- /dev/null +++ b/data/src/main/java/com/anytypeio/anytype/data/auth/status/SpaceP2PStatusRemoteChannel.kt @@ -0,0 +1,8 @@ +package com.anytypeio.anytype.data.auth.status + +import com.anytypeio.anytype.core_models.multiplayer.P2PStatusUpdate +import kotlinx.coroutines.flow.Flow + +interface SpaceP2PStatusRemoteChannel { + fun observe(activeSpaceId: String): Flow> +} \ No newline at end of file diff --git a/data/src/main/java/com/anytypeio/anytype/data/auth/status/SpaceStatusRemoteChannel.kt b/data/src/main/java/com/anytypeio/anytype/data/auth/status/SpaceStatusRemoteChannel.kt new file mode 100644 index 0000000000..894c204e71 --- /dev/null +++ b/data/src/main/java/com/anytypeio/anytype/data/auth/status/SpaceStatusRemoteChannel.kt @@ -0,0 +1,8 @@ +package com.anytypeio.anytype.data.auth.status + +import com.anytypeio.anytype.core_models.multiplayer.SpaceSyncUpdate +import kotlinx.coroutines.flow.Flow + +interface SpaceStatusRemoteChannel { + fun observe(activeSpaceId: String): Flow> +} \ No newline at end of file diff --git a/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/SpaceP2PStatusChannel.kt b/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/SpaceP2PStatusChannel.kt new file mode 100644 index 0000000000..6834a45680 --- /dev/null +++ b/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/SpaceP2PStatusChannel.kt @@ -0,0 +1,35 @@ +package com.anytypeio.anytype.middleware.interactor + +import com.anytypeio.anytype.core_models.multiplayer.P2PStatusUpdate +import com.anytypeio.anytype.data.auth.status.SpaceP2PStatusRemoteChannel +import com.anytypeio.anytype.middleware.EventProxy +import com.anytypeio.anytype.middleware.mappers.toCoreModel +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.mapNotNull + +class SpaceP2PStatusChannel(private val events: EventProxy) : SpaceP2PStatusRemoteChannel { + + override fun observe(activeSpaceId: String): Flow> { + return events.flow().mapNotNull { emission -> + emission.messages.mapNotNull { message -> + when { + message.p2pStatusUpdate != null -> { + val event = message.p2pStatusUpdate + checkNotNull(event) + if (event.spaceId == activeSpaceId) { + P2PStatusUpdate( + spaceId = event.spaceId, + status = event.status.toCoreModel(), + devicesCounter = event.devicesCounter + ) + } else { + null + } + } + + else -> null + } + } + } + } +} \ No newline at end of file diff --git a/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/SpaceSyncStatusChannel.kt b/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/SpaceSyncStatusChannel.kt new file mode 100644 index 0000000000..7e07929add --- /dev/null +++ b/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/SpaceSyncStatusChannel.kt @@ -0,0 +1,37 @@ +package com.anytypeio.anytype.middleware.interactor + +import com.anytypeio.anytype.core_models.multiplayer.SpaceSyncUpdate +import com.anytypeio.anytype.data.auth.status.SpaceStatusRemoteChannel +import com.anytypeio.anytype.middleware.EventProxy +import com.anytypeio.anytype.middleware.mappers.toCoreModel +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.mapNotNull + +class SpaceSyncStatusChannel(private val events: EventProxy) : SpaceStatusRemoteChannel { + + override fun observe(activeSpaceId: String): Flow> { + return events.flow().mapNotNull { emission -> + emission.messages.mapNotNull { message -> + when { + message.spaceSyncStatusUpdate != null -> { + val event = message.spaceSyncStatusUpdate + checkNotNull(event) + if (event.id == activeSpaceId) { + SpaceSyncUpdate( + id = event.id, + status = event.status.toCoreModel(), + network = event.network.toCoreModel(), + error = event.error.toCoreModel(), + syncingObjectsCounter = event.syncingObjectsCounter + ) + } else { + null + } + } + + else -> null + } + } + } + } +} \ No newline at end of file diff --git a/middleware/src/main/java/com/anytypeio/anytype/middleware/mappers/Alias.kt b/middleware/src/main/java/com/anytypeio/anytype/middleware/mappers/Alias.kt index 07bbb2bb86..d2febc6061 100644 --- a/middleware/src/main/java/com/anytypeio/anytype/middleware/mappers/Alias.kt +++ b/middleware/src/main/java/com/anytypeio/anytype/middleware/mappers/Alias.kt @@ -90,3 +90,9 @@ typealias MMembershipTierDataPeriodType = anytype.model.MembershipTierData.Perio typealias MNameServiceNameType = anytype.model.NameserviceNameType typealias MEmailVerificationStatus = anytype.model.Membership.EmailVerificationStatus typealias MDetail = anytype.model.Detail + +typealias MSpaceSyncStatus = anytype.Event.Space.Status +typealias MSpaceSyncNetwork = anytype.Event.Space.Network +typealias MSpaceSyncError = anytype.Event.Space.SyncError + +typealias MP2PStatus = anytype.Event.P2PStatus.Status \ No newline at end of file diff --git a/middleware/src/main/java/com/anytypeio/anytype/middleware/mappers/ToCoreModelMappers.kt b/middleware/src/main/java/com/anytypeio/anytype/middleware/mappers/ToCoreModelMappers.kt index ade883e567..32c335ce5f 100644 --- a/middleware/src/main/java/com/anytypeio/anytype/middleware/mappers/ToCoreModelMappers.kt +++ b/middleware/src/main/java/com/anytypeio/anytype/middleware/mappers/ToCoreModelMappers.kt @@ -50,12 +50,15 @@ import com.anytypeio.anytype.core_models.membership.MembershipPaymentMethod import com.anytypeio.anytype.core_models.membership.MembershipPeriodType import com.anytypeio.anytype.core_models.membership.MembershipTierData import com.anytypeio.anytype.core_models.membership.NameServiceNameType +import com.anytypeio.anytype.core_models.multiplayer.P2PStatus import com.anytypeio.anytype.core_models.multiplayer.SpaceMemberPermissions +import com.anytypeio.anytype.core_models.multiplayer.SpaceSyncError +import com.anytypeio.anytype.core_models.multiplayer.SpaceSyncNetwork +import com.anytypeio.anytype.core_models.multiplayer.SpaceSyncStatus import com.anytypeio.anytype.core_models.primitives.SpaceId import com.anytypeio.anytype.core_models.restrictions.DataViewRestriction import com.anytypeio.anytype.core_models.restrictions.DataViewRestrictions import com.anytypeio.anytype.core_models.restrictions.ObjectRestriction -import com.anytypeio.anytype.core_utils.ext.orNull import com.anytypeio.anytype.middleware.interactor.toCoreModels import com.google.gson.GsonBuilder @@ -1066,4 +1069,31 @@ fun MEmailVerificationStatus.toCoreModel(): EmailVerificationStatus { fun MNameServiceNameType.toCoreModel(): NameServiceNameType = when (this) { NameserviceNameType.AnyName -> NameServiceNameType.ANY_NAME } -//endregion \ No newline at end of file +//endregion + +//region SYNC STATUS +fun MSpaceSyncStatus.toCoreModel(): SpaceSyncStatus = when (this) { + MSpaceSyncStatus.Synced -> SpaceSyncStatus.SYNCED + MSpaceSyncStatus.Syncing -> SpaceSyncStatus.SYNCING + MSpaceSyncStatus.Error -> SpaceSyncStatus.ERROR + MSpaceSyncStatus.Offline -> SpaceSyncStatus.OFFLINE +} + +fun MSpaceSyncNetwork.toCoreModel(): SpaceSyncNetwork = when (this) { + anytype.Event.Space.Network.Anytype -> SpaceSyncNetwork.ANYTYPE + anytype.Event.Space.Network.SelfHost -> SpaceSyncNetwork.SELF_HOST + anytype.Event.Space.Network.LocalOnly -> SpaceSyncNetwork.LOCAL_ONLY +} + +fun MSpaceSyncError.toCoreModel(): SpaceSyncError = when (this) { + MSpaceSyncError.Null -> SpaceSyncError.NULL + MSpaceSyncError.StorageLimitExceed -> SpaceSyncError.STORAGE_LIMIT_EXCEED + MSpaceSyncError.IncompatibleVersion -> SpaceSyncError.INCOMPATIBLE_VERSION + MSpaceSyncError.NetworkError -> SpaceSyncError.NETWORK_ERROR +} + +fun MP2PStatus.toCoreModel(): P2PStatus = when (this) { + MP2PStatus.NotConnected -> P2PStatus.NOT_CONNECTED + MP2PStatus.NotPossible -> P2PStatus.NOT_POSSIBLE + MP2PStatus.Connected -> P2PStatus.CONNECTED +}