Convert StateService to suspend functions

Signed-off-by: aqulu <dev@aqu.lu>
This commit is contained in:
aqulu 2020-12-08 19:04:30 +09:00
parent a911492a9e
commit c7efd1feb9
10 changed files with 124 additions and 122 deletions

View File

@ -17,7 +17,7 @@ Translations 🗣:
- -
SDK API changes ⚠️: SDK API changes ⚠️:
- - StateService now exposes suspendable function instead of using MatrixCallback.
Build 🧱: Build 🧱:
- Upgrade some dependencies and Kotlin version - Upgrade some dependencies and Kotlin version

View File

@ -38,6 +38,7 @@ dependencies {
implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'io.reactivex.rxjava2:rxkotlin:2.3.0' implementation 'io.reactivex.rxjava2:rxkotlin:2.3.0'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-rx2:$kotlin_coroutines_version"
// Paging // Paging
implementation "androidx.paging:paging-runtime-ktx:2.1.2" implementation "androidx.paging:paging-runtime-ktx:2.1.2"

View File

@ -17,14 +17,20 @@
package org.matrix.android.sdk.rx package org.matrix.android.sdk.rx
import android.net.Uri import android.net.Uri
import io.reactivex.Completable
import io.reactivex.Observable
import io.reactivex.Single
import kotlinx.coroutines.rx2.rxCompletable
import org.matrix.android.sdk.api.query.QueryStringValue import org.matrix.android.sdk.api.query.QueryStringValue
import org.matrix.android.sdk.api.session.events.model.Event import org.matrix.android.sdk.api.session.events.model.Event
import org.matrix.android.sdk.api.session.identity.ThreePid import org.matrix.android.sdk.api.session.identity.ThreePid
import org.matrix.android.sdk.api.session.room.Room import org.matrix.android.sdk.api.session.room.Room
import org.matrix.android.sdk.api.session.room.members.RoomMemberQueryParams import org.matrix.android.sdk.api.session.room.members.RoomMemberQueryParams
import org.matrix.android.sdk.api.session.room.model.EventAnnotationsSummary import org.matrix.android.sdk.api.session.room.model.EventAnnotationsSummary
import org.matrix.android.sdk.api.session.room.model.GuestAccess
import org.matrix.android.sdk.api.session.room.model.ReadReceipt import org.matrix.android.sdk.api.session.room.model.ReadReceipt
import org.matrix.android.sdk.api.session.room.model.RoomHistoryVisibility import org.matrix.android.sdk.api.session.room.model.RoomHistoryVisibility
import org.matrix.android.sdk.api.session.room.model.RoomJoinRules
import org.matrix.android.sdk.api.session.room.model.RoomMemberSummary import org.matrix.android.sdk.api.session.room.model.RoomMemberSummary
import org.matrix.android.sdk.api.session.room.model.RoomSummary import org.matrix.android.sdk.api.session.room.model.RoomSummary
import org.matrix.android.sdk.api.session.room.notification.RoomNotificationState import org.matrix.android.sdk.api.session.room.notification.RoomNotificationState
@ -32,11 +38,6 @@ import org.matrix.android.sdk.api.session.room.send.UserDraft
import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent
import org.matrix.android.sdk.api.util.Optional import org.matrix.android.sdk.api.util.Optional
import org.matrix.android.sdk.api.util.toOptional import org.matrix.android.sdk.api.util.toOptional
import io.reactivex.Completable
import io.reactivex.Observable
import io.reactivex.Single
import org.matrix.android.sdk.api.session.room.model.GuestAccess
import org.matrix.android.sdk.api.session.room.model.RoomJoinRules
class RxRoom(private val room: Room) { class RxRoom(private val room: Room) {
@ -121,28 +122,28 @@ class RxRoom(private val room: Room) {
room.invite3pid(threePid, it) room.invite3pid(threePid, it)
} }
fun updateTopic(topic: String): Completable = completableBuilder<Unit> { fun updateTopic(topic: String): Completable = rxCompletable {
room.updateTopic(topic, it) room.updateTopic(topic)
} }
fun updateName(name: String): Completable = completableBuilder<Unit> { fun updateName(name: String): Completable = rxCompletable {
room.updateName(name, it) room.updateName(name)
} }
fun updateHistoryReadability(readability: RoomHistoryVisibility): Completable = completableBuilder<Unit> { fun updateHistoryReadability(readability: RoomHistoryVisibility): Completable = rxCompletable {
room.updateHistoryReadability(readability, it) room.updateHistoryReadability(readability)
} }
fun updateJoinRule(joinRules: RoomJoinRules?, guestAccess: GuestAccess?): Completable = completableBuilder<Unit> { fun updateJoinRule(joinRules: RoomJoinRules?, guestAccess: GuestAccess?): Completable = rxCompletable {
room.updateJoinRule(joinRules, guestAccess, it) room.updateJoinRule(joinRules, guestAccess)
} }
fun updateAvatar(avatarUri: Uri, fileName: String): Completable = completableBuilder<Unit> { fun updateAvatar(avatarUri: Uri, fileName: String): Completable = rxCompletable {
room.updateAvatar(avatarUri, fileName, it) room.updateAvatar(avatarUri, fileName)
} }
fun deleteAvatar(): Completable = completableBuilder<Unit> { fun deleteAvatar(): Completable = rxCompletable {
room.deleteAvatar(it) room.deleteAvatar()
} }
} }

View File

@ -33,41 +33,41 @@ interface StateService {
/** /**
* Update the topic of the room * Update the topic of the room
*/ */
fun updateTopic(topic: String, callback: MatrixCallback<Unit>): Cancelable suspend fun updateTopic(topic: String)
/** /**
* Update the name of the room * Update the name of the room
*/ */
fun updateName(name: String, callback: MatrixCallback<Unit>): Cancelable suspend fun updateName(name: String)
/** /**
* Update the canonical alias of the room * Update the canonical alias of the room
* @param alias the canonical alias, or null to reset the canonical alias of this room * @param alias the canonical alias, or null to reset the canonical alias of this room
* @param altAliases the alternative aliases for this room. It should include the canonical alias if any. * @param altAliases the alternative aliases for this room. It should include the canonical alias if any.
*/ */
fun updateCanonicalAlias(alias: String?, altAliases: List<String>, callback: MatrixCallback<Unit>): Cancelable suspend fun updateCanonicalAlias(alias: String?, altAliases: List<String>)
/** /**
* Update the history readability of the room * Update the history readability of the room
*/ */
fun updateHistoryReadability(readability: RoomHistoryVisibility, callback: MatrixCallback<Unit>): Cancelable suspend fun updateHistoryReadability(readability: RoomHistoryVisibility)
/** /**
* Update the join rule and/or the guest access * Update the join rule and/or the guest access
*/ */
fun updateJoinRule(joinRules: RoomJoinRules?, guestAccess: GuestAccess?, callback: MatrixCallback<Unit>): Cancelable suspend fun updateJoinRule(joinRules: RoomJoinRules?, guestAccess: GuestAccess?)
/** /**
* Update the avatar of the room * Update the avatar of the room
*/ */
fun updateAvatar(avatarUri: Uri, fileName: String, callback: MatrixCallback<Unit>): Cancelable suspend fun updateAvatar(avatarUri: Uri, fileName: String)
/** /**
* Delete the avatar of the room * Delete the avatar of the room
*/ */
fun deleteAvatar(callback: MatrixCallback<Unit>): Cancelable suspend fun deleteAvatar()
fun sendStateEvent(eventType: String, stateKey: String?, body: JsonDict, callback: MatrixCallback<Unit>): Cancelable suspend fun sendStateEvent(eventType: String, stateKey: String?, body: JsonDict)
fun getStateEvent(eventType: String, stateKey: QueryStringValue = QueryStringValue.NoCondition): Event? fun getStateEvent(eventType: String, stateKey: QueryStringValue = QueryStringValue.NoCondition): Event?

View File

@ -20,7 +20,7 @@ import android.net.Uri
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import com.squareup.inject.assisted.Assisted import com.squareup.inject.assisted.Assisted
import com.squareup.inject.assisted.AssistedInject import com.squareup.inject.assisted.AssistedInject
import org.matrix.android.sdk.api.MatrixCallback import kotlinx.coroutines.withContext
import org.matrix.android.sdk.api.query.QueryStringValue import org.matrix.android.sdk.api.query.QueryStringValue
import org.matrix.android.sdk.api.session.events.model.Event import org.matrix.android.sdk.api.session.events.model.Event
import org.matrix.android.sdk.api.session.events.model.EventType import org.matrix.android.sdk.api.session.events.model.EventType
@ -32,20 +32,14 @@ import org.matrix.android.sdk.api.session.room.model.RoomHistoryVisibility
import org.matrix.android.sdk.api.session.room.model.RoomJoinRules import org.matrix.android.sdk.api.session.room.model.RoomJoinRules
import org.matrix.android.sdk.api.session.room.model.RoomJoinRulesContent import org.matrix.android.sdk.api.session.room.model.RoomJoinRulesContent
import org.matrix.android.sdk.api.session.room.state.StateService import org.matrix.android.sdk.api.session.room.state.StateService
import org.matrix.android.sdk.api.util.Cancelable
import org.matrix.android.sdk.api.util.JsonDict import org.matrix.android.sdk.api.util.JsonDict
import org.matrix.android.sdk.api.util.Optional import org.matrix.android.sdk.api.util.Optional
import org.matrix.android.sdk.internal.session.content.FileUploader import org.matrix.android.sdk.internal.session.content.FileUploader
import org.matrix.android.sdk.internal.session.room.alias.AddRoomAliasTask import org.matrix.android.sdk.internal.session.room.alias.AddRoomAliasTask
import org.matrix.android.sdk.internal.task.TaskExecutor
import org.matrix.android.sdk.internal.task.configureWith
import org.matrix.android.sdk.internal.task.launchToCallback
import org.matrix.android.sdk.internal.util.MatrixCoroutineDispatchers import org.matrix.android.sdk.internal.util.MatrixCoroutineDispatchers
import org.matrix.android.sdk.internal.util.awaitCallback
internal class DefaultStateService @AssistedInject constructor(@Assisted private val roomId: String, internal class DefaultStateService @AssistedInject constructor(@Assisted private val roomId: String,
private val stateEventDataSource: StateEventDataSource, private val stateEventDataSource: StateEventDataSource,
private val taskExecutor: TaskExecutor,
private val sendStateTask: SendStateTask, private val sendStateTask: SendStateTask,
private val coroutineDispatchers: MatrixCoroutineDispatchers, private val coroutineDispatchers: MatrixCoroutineDispatchers,
private val fileUploader: FileUploader, private val fileUploader: FileUploader,
@ -73,45 +67,41 @@ internal class DefaultStateService @AssistedInject constructor(@Assisted private
return stateEventDataSource.getStateEventsLive(roomId, eventTypes, stateKey) return stateEventDataSource.getStateEventsLive(roomId, eventTypes, stateKey)
} }
override fun sendStateEvent( override suspend fun sendStateEvent(
eventType: String, eventType: String,
stateKey: String?, stateKey: String?,
body: JsonDict, body: JsonDict
callback: MatrixCallback<Unit> ) {
): Cancelable { withContext(coroutineDispatchers.main) {
val params = SendStateTask.Params( val params = SendStateTask.Params(
roomId = roomId, roomId = roomId,
stateKey = stateKey, stateKey = stateKey,
eventType = eventType, eventType = eventType,
body = body body = body
) )
return sendStateTask
.configureWith(params) { sendStateTask.execute(params)
this.callback = callback
} }
.executeBy(taskExecutor)
} }
override fun updateTopic(topic: String, callback: MatrixCallback<Unit>): Cancelable { override suspend fun updateTopic(topic: String) {
return sendStateEvent( sendStateEvent(
eventType = EventType.STATE_ROOM_TOPIC, eventType = EventType.STATE_ROOM_TOPIC,
body = mapOf("topic" to topic), body = mapOf("topic" to topic),
callback = callback,
stateKey = null stateKey = null
) )
} }
override fun updateName(name: String, callback: MatrixCallback<Unit>): Cancelable { override suspend fun updateName(name: String) {
return sendStateEvent( sendStateEvent(
eventType = EventType.STATE_ROOM_NAME, eventType = EventType.STATE_ROOM_NAME,
body = mapOf("name" to name), body = mapOf("name" to name),
callback = callback,
stateKey = null stateKey = null
) )
} }
override fun updateCanonicalAlias(alias: String?, altAliases: List<String>, callback: MatrixCallback<Unit>): Cancelable { override suspend fun updateCanonicalAlias(alias: String?, altAliases: List<String>) {
return sendStateEvent( sendStateEvent(
eventType = EventType.STATE_ROOM_CANONICAL_ALIAS, eventType = EventType.STATE_ROOM_CANONICAL_ALIAS,
body = RoomCanonicalAliasContent( body = RoomCanonicalAliasContent(
canonicalAlias = alias, canonicalAlias = alias,
@ -123,64 +113,52 @@ internal class DefaultStateService @AssistedInject constructor(@Assisted private
// Sort for the cleanup // Sort for the cleanup
.sorted() .sorted()
).toContent(), ).toContent(),
callback = callback,
stateKey = null stateKey = null
) )
} }
override fun updateHistoryReadability(readability: RoomHistoryVisibility, callback: MatrixCallback<Unit>): Cancelable { override suspend fun updateHistoryReadability(readability: RoomHistoryVisibility) {
return sendStateEvent( sendStateEvent(
eventType = EventType.STATE_ROOM_HISTORY_VISIBILITY, eventType = EventType.STATE_ROOM_HISTORY_VISIBILITY,
body = mapOf("history_visibility" to readability), body = mapOf("history_visibility" to readability),
callback = callback,
stateKey = null stateKey = null
) )
} }
override fun updateJoinRule(joinRules: RoomJoinRules?, guestAccess: GuestAccess?, callback: MatrixCallback<Unit>): Cancelable { override suspend fun updateJoinRule(joinRules: RoomJoinRules?, guestAccess: GuestAccess?) {
return taskExecutor.executorScope.launchToCallback(coroutineDispatchers.main, callback) { withContext(coroutineDispatchers.main) {
if (joinRules != null) { if (joinRules != null) {
awaitCallback<Unit> {
sendStateEvent( sendStateEvent(
eventType = EventType.STATE_ROOM_JOIN_RULES, eventType = EventType.STATE_ROOM_JOIN_RULES,
body = RoomJoinRulesContent(joinRules).toContent(), body = RoomJoinRulesContent(joinRules).toContent(),
callback = it,
stateKey = null stateKey = null
) )
} }
}
if (guestAccess != null) { if (guestAccess != null) {
awaitCallback<Unit> {
sendStateEvent( sendStateEvent(
eventType = EventType.STATE_ROOM_GUEST_ACCESS, eventType = EventType.STATE_ROOM_GUEST_ACCESS,
body = RoomGuestAccessContent(guestAccess).toContent(), body = RoomGuestAccessContent(guestAccess).toContent(),
callback = it,
stateKey = null stateKey = null
) )
} }
} }
} }
}
override fun updateAvatar(avatarUri: Uri, fileName: String, callback: MatrixCallback<Unit>): Cancelable { override suspend fun updateAvatar(avatarUri: Uri, fileName: String) {
return taskExecutor.executorScope.launchToCallback(coroutineDispatchers.main, callback) { withContext(coroutineDispatchers.main) {
val response = fileUploader.uploadFromUri(avatarUri, fileName, "image/jpeg") val response = fileUploader.uploadFromUri(avatarUri, fileName, "image/jpeg")
awaitCallback<Unit> {
sendStateEvent( sendStateEvent(
eventType = EventType.STATE_ROOM_AVATAR, eventType = EventType.STATE_ROOM_AVATAR,
body = mapOf("url" to response.contentUri), body = mapOf("url" to response.contentUri),
callback = it,
stateKey = null stateKey = null
) )
} }
} }
}
override fun deleteAvatar(callback: MatrixCallback<Unit>): Cancelable { override suspend fun deleteAvatar() {
return sendStateEvent( sendStateEvent(
eventType = EventType.STATE_ROOM_AVATAR, eventType = EventType.STATE_ROOM_AVATAR,
body = emptyMap(), body = emptyMap(),
callback = callback,
stateKey = null stateKey = null
) )
} }

View File

@ -292,9 +292,7 @@ class RoomDetailViewModel @AssistedInject constructor(
private fun handleSetNewAvatar(action: RoomDetailAction.SetAvatarAction) { private fun handleSetNewAvatar(action: RoomDetailAction.SetAvatarAction) {
viewModelScope.launch(Dispatchers.IO) { viewModelScope.launch(Dispatchers.IO) {
try { try {
awaitCallback<Unit> { room.updateAvatar(action.newAvatarUri, action.newAvatarFileName)
room.updateAvatar(action.newAvatarUri, action.newAvatarFileName, it)
}
_viewEvents.post(RoomDetailViewEvents.ActionSuccess(action)) _viewEvents.post(RoomDetailViewEvents.ActionSuccess(action))
} catch (failure: Throwable) { } catch (failure: Throwable) {
_viewEvents.post(RoomDetailViewEvents.ActionFailure(action, failure)) _viewEvents.post(RoomDetailViewEvents.ActionFailure(action, failure))
@ -854,8 +852,8 @@ class RoomDetailViewModel @AssistedInject constructor(
} }
private fun handleChangeTopicSlashCommand(changeTopic: ParsedCommand.ChangeTopic) { private fun handleChangeTopicSlashCommand(changeTopic: ParsedCommand.ChangeTopic) {
launchSlashCommandFlow { launchSlashCommandFlowSuspendable {
room.updateTopic(changeTopic.topic, it) room.updateTopic(changeTopic.topic)
} }
} }
@ -876,9 +874,9 @@ class RoomDetailViewModel @AssistedInject constructor(
?.content ?.content
?.toModel<PowerLevelsContent>() ?: return ?.toModel<PowerLevelsContent>() ?: return
launchSlashCommandFlow { launchSlashCommandFlowSuspendable {
currentPowerLevelsContent.setUserPowerLevel(setUserPowerLevel.userId, setUserPowerLevel.powerLevel) currentPowerLevelsContent.setUserPowerLevel(setUserPowerLevel.userId, setUserPowerLevel.powerLevel)
room.sendStateEvent(EventType.STATE_ROOM_POWER_LEVELS, null, currentPowerLevelsContent.toContent(), it) room.sendStateEvent(EventType.STATE_ROOM_POWER_LEVELS, null, currentPowerLevelsContent.toContent())
} }
} }
@ -920,6 +918,19 @@ class RoomDetailViewModel @AssistedInject constructor(
lambda.invoke(matrixCallback) lambda.invoke(matrixCallback)
} }
private fun launchSlashCommandFlowSuspendable(block: suspend () -> Unit) {
_viewEvents.post(RoomDetailViewEvents.SlashCommandHandled())
viewModelScope.launch {
val event = try {
block()
RoomDetailViewEvents.SlashCommandResultOk
} catch (failure: Exception) {
RoomDetailViewEvents.SlashCommandResultError(failure)
}
_viewEvents.post(event)
}
}
private fun handleSendReaction(action: RoomDetailAction.SendReaction) { private fun handleSendReaction(action: RoomDetailAction.SendReaction) {
room.sendReaction(action.targetEventId, action.reaction) room.sendReaction(action.targetEventId, action.reaction)
} }

View File

@ -166,9 +166,7 @@ class RoomMemberProfileViewModel @AssistedInject constructor(@Assisted private v
viewModelScope.launch { viewModelScope.launch {
_viewEvents.post(RoomMemberProfileViewEvents.Loading()) _viewEvents.post(RoomMemberProfileViewEvents.Loading())
try { try {
awaitCallback<Unit> { room.sendStateEvent(EventType.STATE_ROOM_POWER_LEVELS, null, currentPowerLevelsContent.toContent())
room.sendStateEvent(EventType.STATE_ROOM_POWER_LEVELS, null, currentPowerLevelsContent.toContent(), it)
}
_viewEvents.post(RoomMemberProfileViewEvents.OnSetPowerLevelSuccess) _viewEvents.post(RoomMemberProfileViewEvents.OnSetPowerLevelSuccess)
} catch (failure: Throwable) { } catch (failure: Throwable) {
_viewEvents.post(RoomMemberProfileViewEvents.Failure(failure)) _viewEvents.post(RoomMemberProfileViewEvents.Failure(failure))

View File

@ -301,21 +301,20 @@ class RoomAliasViewModel @AssistedInject constructor(@Assisted initialState: Roo
private fun updateCanonicalAlias(canonicalAlias: String?, alternativeAliases: List<String>, closeForm: Boolean) { private fun updateCanonicalAlias(canonicalAlias: String?, alternativeAliases: List<String>, closeForm: Boolean) {
postLoading(true) postLoading(true)
room.updateCanonicalAlias(canonicalAlias, alternativeAliases, object : MatrixCallback<Unit> { viewModelScope.launch {
override fun onSuccess(data: Unit) { try {
room.updateCanonicalAlias(canonicalAlias, alternativeAliases)
setState { setState {
copy( copy(
isLoading = false, isLoading = false,
publishManuallyState = if (closeForm) RoomAliasViewState.AddAliasState.Closed else publishManuallyState publishManuallyState = if (closeForm) RoomAliasViewState.AddAliasState.Closed else publishManuallyState
) )
} }
} } catch (failure: Throwable) {
override fun onFailure(failure: Throwable) {
postLoading(false) postLoading(false)
_viewEvents.post(RoomAliasViewEvents.Failure(failure)) _viewEvents.post(RoomAliasViewEvents.Failure(failure))
} }
}) }
} }
private fun handleAddLocalAlias() = withState { state -> private fun handleAddLocalAlias() = withState { state ->

View File

@ -197,8 +197,7 @@ class RoomMemberListViewModel @AssistedInject constructor(@Assisted initialState
room.sendStateEvent( room.sendStateEvent(
eventType = EventType.STATE_ROOM_THIRD_PARTY_INVITE, eventType = EventType.STATE_ROOM_THIRD_PARTY_INVITE,
stateKey = action.stateKey, stateKey = action.stateKey,
body = emptyMap(), body = emptyMap()
callback = NoOpMatrixCallback()
) )
} }
} }

View File

@ -21,6 +21,8 @@ import com.squareup.inject.assisted.Assisted
import com.squareup.inject.assisted.AssistedInject import com.squareup.inject.assisted.AssistedInject
import im.vector.app.R import im.vector.app.R
import im.vector.app.core.resources.StringProvider import im.vector.app.core.resources.StringProvider
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import org.matrix.android.sdk.api.query.QueryStringValue import org.matrix.android.sdk.api.query.QueryStringValue
import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.Session
import org.matrix.android.sdk.api.session.accountdata.UserAccountDataTypes import org.matrix.android.sdk.api.session.accountdata.UserAccountDataTypes
@ -310,12 +312,19 @@ class WidgetPostAPIHandler @AssistedInject constructor(@Assisted private val roo
val params = HashMap<String, Any>() val params = HashMap<String, Any>()
params["status"] = status params["status"] = status
GlobalScope.launch {
try {
room.sendStateEvent( room.sendStateEvent(
eventType = EventType.PLUMBING, eventType = EventType.PLUMBING,
stateKey = null, stateKey = null,
body = params, body = params
callback = createWidgetAPICallback(widgetPostAPIMediator, eventData)
) )
widgetPostAPIMediator.sendSuccess(eventData)
} catch (failure: Exception) {
widgetPostAPIMediator.sendError(stringProvider.getString(R.string.widget_integration_failed_to_send_request), eventData)
}
}
} }
/** /**
@ -333,12 +342,18 @@ class WidgetPostAPIHandler @AssistedInject constructor(@Assisted private val roo
Timber.d(description) Timber.d(description)
val content = eventData["content"] as JsonDict val content = eventData["content"] as JsonDict
val stateKey = "_$userId" val stateKey = "_$userId"
GlobalScope.launch {
try {
room.sendStateEvent( room.sendStateEvent(
eventType = EventType.BOT_OPTIONS, eventType = EventType.BOT_OPTIONS,
stateKey = stateKey, stateKey = stateKey,
body = content, body = content
callback = createWidgetAPICallback(widgetPostAPIMediator, eventData)
) )
widgetPostAPIMediator.sendSuccess(eventData)
} catch (failure: Exception) {
widgetPostAPIMediator.sendError(stringProvider.getString(R.string.widget_integration_failed_to_send_request), eventData)
}
}
} }
/** /**