converting profile module to engine

This commit is contained in:
Adam Brown 2022-10-09 21:37:43 +01:00
parent 0b02e6d028
commit b987d1e21c
9 changed files with 69 additions and 38 deletions

View File

@ -191,7 +191,7 @@ internal class FeatureModules internal constructor(
storeModule.value.messageStore(), storeModule.value.messageStore(),
) )
} }
val profileModule by unsafeLazy { ProfileModule(matrixModules.profile, matrixModules.sync, matrixModules.room, trackingModule.errorTracker) } val profileModule by unsafeLazy { ProfileModule(matrixModules.engine, trackingModule.errorTracker) }
val notificationsModule by unsafeLazy { val notificationsModule by unsafeLazy {
NotificationsModule( NotificationsModule(
imageLoaderModule.iconLoader(), imageLoaderModule.iconLoader(),
@ -459,7 +459,6 @@ internal class MatrixModules(
val sync by unsafeLazy { matrix.syncService() } val sync by unsafeLazy { matrix.syncService() }
val room by unsafeLazy { matrix.roomService() } val room by unsafeLazy { matrix.roomService() }
val profile by unsafeLazy { matrix.profileService() }
} }
internal class DomainModules( internal class DomainModules(

View File

@ -24,6 +24,10 @@ interface ChatEngine {
suspend fun registerPushToken(token: String, gatewayUrl: String) suspend fun registerPushToken(token: String, gatewayUrl: String)
suspend fun joinRoom(roomId: RoomId)
suspend fun rejectJoinRoom(roomId: RoomId)
fun mediaDecrypter(): MediaDecrypter fun mediaDecrypter(): MediaDecrypter
fun pushHandler(): PushHandler fun pushHandler(): PushHandler

View File

@ -1,9 +1,7 @@
applyAndroidComposeLibraryModule(project) applyAndroidComposeLibraryModule(project)
dependencies { dependencies {
implementation project(":matrix:services:sync") implementation project(":chat-engine")
implementation project(":matrix:services:room")
implementation project(":matrix:services:profile")
implementation project(":features:settings") implementation project(":features:settings")
implementation project(':domains:store') implementation project(':domains:store')
implementation project(":domains:android:compose-core") implementation project(":domains:android:compose-core")

View File

@ -2,19 +2,15 @@ package app.dapk.st.profile
import app.dapk.st.core.ProvidableModule import app.dapk.st.core.ProvidableModule
import app.dapk.st.core.extensions.ErrorTracker import app.dapk.st.core.extensions.ErrorTracker
import app.dapk.st.matrix.room.ProfileService import app.dapk.st.engine.ChatEngine
import app.dapk.st.matrix.room.RoomService
import app.dapk.st.matrix.sync.SyncService
class ProfileModule( class ProfileModule(
private val profileService: ProfileService, private val chatEngine: ChatEngine,
private val syncService: SyncService,
private val roomService: RoomService,
private val errorTracker: ErrorTracker, private val errorTracker: ErrorTracker,
) : ProvidableModule { ) : ProvidableModule {
fun profileViewModel(): ProfileViewModel { fun profileViewModel(): ProfileViewModel {
return ProfileViewModel(profileService, syncService, roomService, errorTracker) return ProfileViewModel(chatEngine, errorTracker)
} }
} }

View File

@ -21,8 +21,8 @@ import app.dapk.st.core.Lce
import app.dapk.st.core.LifecycleEffect import app.dapk.st.core.LifecycleEffect
import app.dapk.st.core.components.CenteredLoading import app.dapk.st.core.components.CenteredLoading
import app.dapk.st.design.components.* import app.dapk.st.design.components.*
import app.dapk.st.matrix.sync.InviteMeta import app.dapk.st.engine.RoomInvite
import app.dapk.st.matrix.sync.RoomInvite import app.dapk.st.engine.RoomInvite.InviteMeta
import app.dapk.st.settings.SettingsActivity import app.dapk.st.settings.SettingsActivity
@Composable @Composable

View File

@ -3,9 +3,8 @@ package app.dapk.st.profile
import app.dapk.st.core.Lce import app.dapk.st.core.Lce
import app.dapk.st.design.components.Route import app.dapk.st.design.components.Route
import app.dapk.st.design.components.SpiderPage import app.dapk.st.design.components.SpiderPage
import app.dapk.st.matrix.common.RoomId import app.dapk.st.engine.Me
import app.dapk.st.matrix.room.ProfileService import app.dapk.st.engine.RoomInvite
import app.dapk.st.matrix.sync.RoomInvite
data class ProfileScreenState( data class ProfileScreenState(
val page: SpiderPage<out Page>, val page: SpiderPage<out Page>,
@ -14,12 +13,12 @@ data class ProfileScreenState(
sealed interface Page { sealed interface Page {
data class Profile(val content: Lce<Content>) : Page { data class Profile(val content: Lce<Content>) : Page {
data class Content( data class Content(
val me: ProfileService.Me, val me: Me,
val invitationsCount: Int, val invitationsCount: Int,
) )
} }
data class Invitations(val content: Lce<List<RoomInvite>>): Page data class Invitations(val content: Lce<List<RoomInvite>>) : Page
object Routes { object Routes {
val profile = Route<Profile>("Profile") val profile = Route<Profile>("Profile")

View File

@ -5,25 +5,20 @@ import androidx.lifecycle.viewModelScope
import app.dapk.st.core.Lce import app.dapk.st.core.Lce
import app.dapk.st.core.extensions.ErrorTracker import app.dapk.st.core.extensions.ErrorTracker
import app.dapk.st.design.components.SpiderPage import app.dapk.st.design.components.SpiderPage
import app.dapk.st.engine.ChatEngine
import app.dapk.st.matrix.common.RoomId import app.dapk.st.matrix.common.RoomId
import app.dapk.st.matrix.room.ProfileService
import app.dapk.st.matrix.room.RoomService
import app.dapk.st.matrix.sync.SyncService
import app.dapk.st.viewmodel.DapkViewModel import app.dapk.st.viewmodel.DapkViewModel
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.* import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
class ProfileViewModel( class ProfileViewModel(
private val profileService: ProfileService, private val chatEngine: ChatEngine,
private val syncService: SyncService,
private val roomService: RoomService,
private val errorTracker: ErrorTracker, private val errorTracker: ErrorTracker,
) : DapkViewModel<ProfileScreenState, ProfileEvent>( ) : DapkViewModel<ProfileScreenState, ProfileEvent>(
ProfileScreenState(SpiderPage(Page.Routes.profile, "Profile", null, Page.Profile(Lce.Loading()), hasToolbar = false)) ProfileScreenState(SpiderPage(Page.Routes.profile, "Profile", null, Page.Profile(Lce.Loading()), hasToolbar = false))
) { ) {
private var syncingJob: Job? = null
private var currentPageJob: Job? = null private var currentPageJob: Job? = null
fun start() { fun start() {
@ -31,15 +26,13 @@ class ProfileViewModel(
} }
private fun goToProfile() { private fun goToProfile() {
syncingJob = syncService.startSyncing().launchIn(viewModelScope)
combine( combine(
flow { flow {
val result = runCatching { profileService.me(forceRefresh = true) } val result = runCatching { chatEngine.me(forceRefresh = true) }
.onFailure { errorTracker.track(it, "Loading profile") } .onFailure { errorTracker.track(it, "Loading profile") }
emit(result) emit(result)
}, },
syncService.invites(), chatEngine.invites(),
transform = { me, invites -> me to invites } transform = { me, invites -> me to invites }
) )
.onEach { (me, invites) -> .onEach { (me, invites) ->
@ -57,7 +50,7 @@ class ProfileViewModel(
fun goToInvitations() { fun goToInvitations() {
updateState { copy(page = SpiderPage(Page.Routes.invitation, "Invitations", Page.Routes.profile, Page.Invitations(Lce.Loading()))) } updateState { copy(page = SpiderPage(Page.Routes.invitation, "Invitations", Page.Routes.profile, Page.Invitations(Lce.Loading()))) }
syncService.invites() chatEngine.invites()
.onEach { .onEach {
updatePageState<Page.Invitations> { updatePageState<Page.Invitations> {
copy(content = Lce.Content(it)) copy(content = Lce.Content(it))
@ -89,13 +82,13 @@ class ProfileViewModel(
} }
fun acceptRoomInvite(roomId: RoomId) { fun acceptRoomInvite(roomId: RoomId) {
launchCatching { roomService.joinRoom(roomId) }.fold( launchCatching { chatEngine.joinRoom(roomId) }.fold(
onError = {} onError = {}
) )
} }
fun rejectRoomInvite(roomId: RoomId) { fun rejectRoomInvite(roomId: RoomId) {
launchCatching { roomService.rejectJoinRoom(roomId) }.fold( launchCatching { chatEngine.rejectJoinRoom(roomId) }.fold(
onError = { onError = {
Log.e("!!!", it.message, it) Log.e("!!!", it.message, it)
} }
@ -115,7 +108,7 @@ class ProfileViewModel(
} }
fun stop() { fun stop() {
syncingJob?.cancel() currentPageJob?.cancel()
} }
} }

View File

@ -0,0 +1,25 @@
package app.dapk.st.engine
import app.dapk.st.matrix.sync.SyncService
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onStart
class InviteUseCase(
private val syncService: SyncService
) {
fun invites() = invitesDatasource()
private fun invitesDatasource() = combine(
syncService.startSyncing().map { false }.onStart { emit(true) },
syncService.invites().map { it.map { it.engine() } }
) { isFirstLoad, invites ->
when {
isFirstLoad && invites.isEmpty() -> null
else -> invites
}
}.filterNotNull()
}

View File

@ -39,12 +39,11 @@ class MatrixEngine internal constructor(
private val sendMessageUseCase: Lazy<SendMessageUseCase>, private val sendMessageUseCase: Lazy<SendMessageUseCase>,
private val matrixMediaDecrypter: Lazy<MatrixMediaDecrypter>, private val matrixMediaDecrypter: Lazy<MatrixMediaDecrypter>,
private val matrixPushHandler: Lazy<MatrixPushHandler>, private val matrixPushHandler: Lazy<MatrixPushHandler>,
private val inviteUseCase: Lazy<InviteUseCase>,
) : ChatEngine { ) : ChatEngine {
override fun directory() = directoryUseCase.value.state() override fun directory() = directoryUseCase.value.state()
override fun invites(): Flow<InviteState> { override fun invites() = inviteUseCase.value.invites()
return matrix.value.syncService().invites().map { it.map { it.engine() } }
}
override suspend fun messages(roomId: RoomId, disableReadReceipts: Boolean): Flow<MessengerState> { override suspend fun messages(roomId: RoomId, disableReadReceipts: Boolean): Flow<MessengerState> {
return timelineUseCase.value.foo(roomId, isReadReceiptsDisabled = disableReadReceipts) return timelineUseCase.value.foo(roomId, isReadReceiptsDisabled = disableReadReceipts)
@ -81,6 +80,14 @@ class MatrixEngine internal constructor(
matrix.value.pushService().registerPush(token, gatewayUrl) matrix.value.pushService().registerPush(token, gatewayUrl)
} }
override suspend fun joinRoom(roomId: RoomId) {
matrix.value.roomService().joinRoom(roomId)
}
override suspend fun rejectJoinRoom(roomId: RoomId) {
matrix.value.roomService().rejectJoinRoom(roomId)
}
override fun mediaDecrypter(): MediaDecrypter { override fun mediaDecrypter(): MediaDecrypter {
val mediaDecrypter = matrixMediaDecrypter.value val mediaDecrypter = matrixMediaDecrypter.value
return object : MediaDecrypter { return object : MediaDecrypter {
@ -163,7 +170,17 @@ class MatrixEngine internal constructor(
val mediaDecrypter = unsafeLazy { MatrixMediaDecrypter(base64) } val mediaDecrypter = unsafeLazy { MatrixMediaDecrypter(base64) }
val pushHandler = unsafeLazy { MatrixPushHandler(backgroundScheduler, credentialsStore, lazyMatrix.value.syncService(), roomStore) } val pushHandler = unsafeLazy { MatrixPushHandler(backgroundScheduler, credentialsStore, lazyMatrix.value.syncService(), roomStore) }
return MatrixEngine(directoryUseCase, lazyMatrix, timelineUseCase, sendMessageUseCase, mediaDecrypter, pushHandler) val invitesUseCase = unsafeLazy { InviteUseCase(lazyMatrix.value.syncService()) }
return MatrixEngine(
directoryUseCase,
lazyMatrix,
timelineUseCase,
sendMessageUseCase,
mediaDecrypter,
pushHandler,
invitesUseCase,
)
} }
} }