diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/widgets/WidgetService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/widgets/WidgetService.kt index bf3ff8959d..8f35ff0e4a 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/widgets/WidgetService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/widgets/WidgetService.kt @@ -17,10 +17,8 @@ package org.matrix.android.sdk.api.session.widgets import androidx.lifecycle.LiveData -import org.matrix.android.sdk.api.MatrixCallback import org.matrix.android.sdk.api.query.QueryStringValue import org.matrix.android.sdk.api.session.events.model.Content -import org.matrix.android.sdk.api.util.Cancelable import org.matrix.android.sdk.api.session.widgets.model.Widget /** @@ -107,20 +105,16 @@ interface WidgetService { * @param roomId the room where you want to create the widget. * @param widgetId the widget to create. * @param content the content of the widget - * @param callback the matrix callback to listen for result. - * @return Cancelable */ - fun createRoomWidget(roomId: String, widgetId: String, content: Content, callback: MatrixCallback): Cancelable + suspend fun createRoomWidget(roomId: String, widgetId: String, content: Content): Widget /** * Deactivate a widget in a room. It makes sure you have the rights to handle this. * * @param roomId: the room where you want to deactivate the widget. * @param widgetId: the widget to deactivate. - * @param callback the matrix callback to listen for result. - * @return Cancelable */ - fun destroyRoomWidget(roomId: String, widgetId: String, callback: MatrixCallback): Cancelable + suspend fun destroyRoomWidget(roomId: String, widgetId: String) /** * Returns true if you can add/remove widgets. It goes through diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/DefaultWidgetService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/DefaultWidgetService.kt index 9f5a9360ee..5912dc7b53 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/DefaultWidgetService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/DefaultWidgetService.kt @@ -17,14 +17,12 @@ package org.matrix.android.sdk.internal.session.widgets import androidx.lifecycle.LiveData -import org.matrix.android.sdk.api.MatrixCallback import org.matrix.android.sdk.api.query.QueryStringValue import org.matrix.android.sdk.api.session.events.model.Content import org.matrix.android.sdk.api.session.widgets.WidgetPostAPIMediator import org.matrix.android.sdk.api.session.widgets.WidgetService import org.matrix.android.sdk.api.session.widgets.WidgetURLFormatter import org.matrix.android.sdk.api.session.widgets.model.Widget -import org.matrix.android.sdk.api.util.Cancelable import javax.inject.Inject import javax.inject.Provider @@ -77,21 +75,19 @@ internal class DefaultWidgetService @Inject constructor(private val widgetManage return widgetManager.getUserWidgets(widgetTypes, excludedTypes) } - override fun createRoomWidget( + override suspend fun createRoomWidget( roomId: String, widgetId: String, - content: Content, - callback: MatrixCallback - ): Cancelable { - return widgetManager.createRoomWidget(roomId, widgetId, content, callback) + content: Content + ): Widget { + return widgetManager.createRoomWidget(roomId, widgetId, content) } - override fun destroyRoomWidget( + override suspend fun destroyRoomWidget( roomId: String, - widgetId: String, - callback: MatrixCallback - ): Cancelable { - return widgetManager.destroyRoomWidget(roomId, widgetId, callback) + widgetId: String + ) { + return widgetManager.destroyRoomWidget(roomId, widgetId) } override fun hasPermissionsToHandleWidgets(roomId: String): Boolean { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/WidgetManager.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/WidgetManager.kt index 73a4cc697d..3244212487 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/WidgetManager.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/WidgetManager.kt @@ -21,7 +21,6 @@ import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleRegistry import androidx.lifecycle.LiveData import androidx.lifecycle.Transformations -import org.matrix.android.sdk.api.MatrixCallback import org.matrix.android.sdk.api.query.QueryStringValue import org.matrix.android.sdk.api.session.accountdata.UserAccountDataEvent import org.matrix.android.sdk.api.session.accountdata.UserAccountDataTypes @@ -34,7 +33,6 @@ import org.matrix.android.sdk.api.session.room.model.PowerLevelsContent import org.matrix.android.sdk.api.session.room.powerlevels.PowerLevelsHelper import org.matrix.android.sdk.api.session.widgets.WidgetManagementFailure import org.matrix.android.sdk.api.session.widgets.model.Widget -import org.matrix.android.sdk.api.util.Cancelable import org.matrix.android.sdk.internal.di.UserId import org.matrix.android.sdk.internal.session.SessionLifecycleObserver import org.matrix.android.sdk.internal.session.SessionScope @@ -43,8 +41,6 @@ import org.matrix.android.sdk.internal.session.room.state.StateEventDataSource import org.matrix.android.sdk.internal.session.user.accountdata.AccountDataDataSource import org.matrix.android.sdk.internal.session.widgets.helper.WidgetFactory import org.matrix.android.sdk.internal.session.widgets.helper.extractWidgetSequence -import org.matrix.android.sdk.internal.task.TaskExecutor -import org.matrix.android.sdk.internal.task.launchToCallback import java.util.HashMap import javax.inject.Inject @@ -52,7 +48,6 @@ import javax.inject.Inject internal class WidgetManager @Inject constructor(private val integrationManager: IntegrationManager, private val accountDataDataSource: AccountDataDataSource, private val stateEventDataSource: StateEventDataSource, - private val taskExecutor: TaskExecutor, private val createWidgetTask: CreateWidgetTask, private val widgetFactory: WidgetFactory, @UserId private val userId: String) @@ -165,37 +160,33 @@ internal class WidgetManager @Inject constructor(private val integrationManager: .toList() } - fun createRoomWidget(roomId: String, widgetId: String, content: Content, callback: MatrixCallback): Cancelable { - return taskExecutor.executorScope.launchToCallback(callback = callback) { - if (!hasPermissionsToHandleWidgets(roomId)) { - throw WidgetManagementFailure.NotEnoughPower - } - val params = CreateWidgetTask.Params( - roomId = roomId, - widgetId = widgetId, - content = content - ) - createWidgetTask.execute(params) - try { - getRoomWidgets(roomId, widgetId = QueryStringValue.Equals(widgetId, QueryStringValue.Case.INSENSITIVE)).first() - } catch (failure: Throwable) { - throw WidgetManagementFailure.CreationFailed - } + suspend fun createRoomWidget(roomId: String, widgetId: String, content: Content): Widget { + if (!hasPermissionsToHandleWidgets(roomId)) { + throw WidgetManagementFailure.NotEnoughPower + } + val params = CreateWidgetTask.Params( + roomId = roomId, + widgetId = widgetId, + content = content + ) + createWidgetTask.execute(params) + try { + return getRoomWidgets(roomId, widgetId = QueryStringValue.Equals(widgetId, QueryStringValue.Case.INSENSITIVE)).first() + } catch (failure: Throwable) { + throw WidgetManagementFailure.CreationFailed } } - fun destroyRoomWidget(roomId: String, widgetId: String, callback: MatrixCallback): Cancelable { - return taskExecutor.executorScope.launchToCallback(callback = callback) { - if (!hasPermissionsToHandleWidgets(roomId)) { - throw WidgetManagementFailure.NotEnoughPower - } - val params = CreateWidgetTask.Params( - roomId = roomId, - widgetId = widgetId, - content = emptyMap() - ) - createWidgetTask.execute(params) + suspend fun destroyRoomWidget(roomId: String, widgetId: String) { + if (!hasPermissionsToHandleWidgets(roomId)) { + throw WidgetManagementFailure.NotEnoughPower } + val params = CreateWidgetTask.Params( + roomId = roomId, + widgetId = widgetId, + content = emptyMap() + ) + createWidgetTask.execute(params) } fun hasPermissionsToHandleWidgets(roomId: String): Boolean { diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt index 3224ef823c..537f625a79 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt @@ -97,12 +97,10 @@ import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent import org.matrix.android.sdk.api.session.room.timeline.getLastMessageContent import org.matrix.android.sdk.api.session.room.timeline.getRelationContent import org.matrix.android.sdk.api.session.room.timeline.getTextEditableContent -import org.matrix.android.sdk.api.session.widgets.model.Widget import org.matrix.android.sdk.api.session.widgets.model.WidgetType import org.matrix.android.sdk.api.util.appendParamToUrl import org.matrix.android.sdk.api.util.toOptional import org.matrix.android.sdk.internal.crypto.model.event.WithHeldCode -import org.matrix.android.sdk.internal.util.awaitCallback import org.matrix.android.sdk.rx.rx import org.matrix.android.sdk.rx.unwrap import timber.log.Timber @@ -487,9 +485,7 @@ class RoomDetailViewModel @AssistedInject constructor( ) try { - val widget = awaitCallback { - session.widgetService().createRoomWidget(roomId, widgetId, widgetEventContent, it) - } + val widget = session.widgetService().createRoomWidget(roomId, widgetId, widgetEventContent) _viewEvents.post(RoomDetailViewEvents.JoinJitsiConference(widget, action.withVideo)) } catch (failure: Throwable) { _viewEvents.post(RoomDetailViewEvents.ShowMessage(stringProvider.getString(R.string.failed_to_add_widget))) @@ -503,7 +499,7 @@ class RoomDetailViewModel @AssistedInject constructor( _viewEvents.post(RoomDetailViewEvents.ShowWaitingView) viewModelScope.launch(Dispatchers.IO) { try { - awaitCallback { session.widgetService().destroyRoomWidget(room.roomId, widgetId, it) } + session.widgetService().destroyRoomWidget(room.roomId, widgetId) // local echo setState { copy( @@ -825,7 +821,7 @@ class RoomDetailViewModel @AssistedInject constructor( } }.exhaustive } - is SendMode.EDIT -> { + is SendMode.EDIT -> { // is original event a reply? val inReplyTo = state.sendMode.timelineEvent.getRelationContent()?.inReplyTo?.eventId if (inReplyTo != null) { @@ -848,7 +844,7 @@ class RoomDetailViewModel @AssistedInject constructor( _viewEvents.post(RoomDetailViewEvents.MessageSent) popDraft() } - is SendMode.QUOTE -> { + is SendMode.QUOTE -> { val messageContent = state.sendMode.timelineEvent.getLastMessageContent() val textMsg = messageContent?.body @@ -869,7 +865,7 @@ class RoomDetailViewModel @AssistedInject constructor( _viewEvents.post(RoomDetailViewEvents.MessageSent) popDraft() } - is SendMode.REPLY -> { + is SendMode.REPLY -> { state.sendMode.timelineEvent.let { room.replyToMessage(it, action.text.toString(), action.autoMarkdown) _viewEvents.post(RoomDetailViewEvents.MessageSent) diff --git a/vector/src/main/java/im/vector/app/features/widgets/WidgetPostAPIHandler.kt b/vector/src/main/java/im/vector/app/features/widgets/WidgetPostAPIHandler.kt index 13d49eb20b..e20c8cf4c6 100644 --- a/vector/src/main/java/im/vector/app/features/widgets/WidgetPostAPIHandler.kt +++ b/vector/src/main/java/im/vector/app/features/widgets/WidgetPostAPIHandler.kt @@ -289,12 +289,13 @@ class WidgetPostAPIHandler @AssistedInject constructor(@Assisted private val roo callback = createWidgetAPICallback(widgetPostAPIMediator, eventData) ) } else { - session.widgetService().createRoomWidget( - roomId = roomId, - widgetId = widgetId, - content = widgetEventContent, - callback = createWidgetAPICallback(widgetPostAPIMediator, eventData) - ) + launchWidgetAPIAction(widgetPostAPIMediator, eventData) { + session.widgetService().createRoomWidget( + roomId = roomId, + widgetId = widgetId, + content = widgetEventContent + ) + } } } diff --git a/vector/src/main/java/im/vector/app/features/widgets/WidgetViewModel.kt b/vector/src/main/java/im/vector/app/features/widgets/WidgetViewModel.kt index d4e63b1338..b6548a6542 100644 --- a/vector/src/main/java/im/vector/app/features/widgets/WidgetViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/widgets/WidgetViewModel.kt @@ -41,7 +41,6 @@ import org.matrix.android.sdk.api.session.integrationmanager.IntegrationManagerS import org.matrix.android.sdk.api.session.room.model.PowerLevelsContent import org.matrix.android.sdk.api.session.room.powerlevels.PowerLevelsHelper import org.matrix.android.sdk.api.session.widgets.WidgetManagementFailure -import org.matrix.android.sdk.internal.util.awaitCallback import org.matrix.android.sdk.rx.mapOptional import org.matrix.android.sdk.rx.rx import org.matrix.android.sdk.rx.unwrap @@ -173,10 +172,8 @@ class WidgetViewModel @AssistedInject constructor(@Assisted val initialState: Wi viewModelScope.launch { val widgetId = initialState.widgetId ?: return@launch try { - awaitCallback { - widgetService.destroyRoomWidget(initialState.roomId, widgetId, it) - _viewEvents.post(WidgetViewEvents.Close()) - } + widgetService.destroyRoomWidget(initialState.roomId, widgetId) + _viewEvents.post(WidgetViewEvents.Close()) } catch (failure: Throwable) { _viewEvents.post(WidgetViewEvents.Failure(failure)) }