diff --git a/changelog.d/5397.bugfix b/changelog.d/5397.bugfix new file mode 100644 index 00000000000..c900e9813fe --- /dev/null +++ b/changelog.d/5397.bugfix @@ -0,0 +1 @@ +Fix widget permission and get wiget result diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt index f1641839146..486b1aa0fd3 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt @@ -869,11 +869,11 @@ class TimelineFragment @Inject constructor( } private fun joinJitsiRoom(jitsiWidget: Widget, enableVideo: Boolean) { - navigator.openRoomWidget(requireContext(), timelineArgs.roomId, jitsiWidget, mapOf(JitsiCallViewModel.ENABLE_VIDEO_OPTION to enableVideo)) + navigator.openRoomWidget(requireContext(), null, timelineArgs.roomId, jitsiWidget, mapOf(JitsiCallViewModel.ENABLE_VIDEO_OPTION to enableVideo)) } private fun openStickerPicker(event: RoomDetailViewEvents.OpenStickerPicker) { - navigator.openStickerPicker(requireContext(), stickerActivityResultLauncher, timelineArgs.roomId, event.widget) + navigator.openStickerPicker(requireContext(), widgetActivityResultLauncher, timelineArgs.roomId, event.widget) } private fun startOpenFileIntent(action: RoomDetailViewEvents.OpenFile) { @@ -1395,9 +1395,10 @@ class TimelineFragment @Inject constructor( } } - private val stickerActivityResultLauncher = registerStartForActivityResult { activityResult -> + private val widgetActivityResultLauncher = registerStartForActivityResult { activityResult -> val data = activityResult.data ?: return@registerStartForActivityResult if (activityResult.resultCode == Activity.RESULT_OK) { + // The msgType can be check to handle other widget actions WidgetActivity.getOutput(data).toModel() ?.let { content -> timelineViewModel.handle(RoomDetailAction.SendSticker(content)) @@ -2654,7 +2655,7 @@ class TimelineFragment @Inject constructor( } private fun onViewWidgetsClicked() { - RoomWidgetsBottomSheet.newInstance() + RoomWidgetsBottomSheet.newInstance(widgetActivityResultLauncher) .show(childFragmentManager, "ROOM_WIDGETS_BOTTOM_SHEET") } @@ -2663,7 +2664,7 @@ class TimelineFragment @Inject constructor( .activeRoomWidgets() ?.find { it.type == WidgetType.ElementCall } ?.also { widget -> - navigator.openRoomWidget(requireContext(), state.roomId, widget) + navigator.openRoomWidget(requireContext(), null, state.roomId, widget) } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/widget/RoomWidgetsBottomSheet.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/widget/RoomWidgetsBottomSheet.kt index 72f9688ad86..5cc73950c06 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/widget/RoomWidgetsBottomSheet.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/widget/RoomWidgetsBottomSheet.kt @@ -16,10 +16,12 @@ package im.vector.app.features.home.room.detail.widget +import android.content.Intent import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.activity.result.ActivityResultLauncher import com.airbnb.mvrx.parentFragmentViewModel import com.airbnb.mvrx.withState import dagger.hilt.android.AndroidEntryPoint @@ -40,7 +42,7 @@ import javax.inject.Inject * Bottom sheet displaying active widgets in a room. */ @AndroidEntryPoint -class RoomWidgetsBottomSheet : +class RoomWidgetsBottomSheet(private val widgetActivityResultLauncher: ActivityResultLauncher) : VectorBaseBottomSheetDialogFragment(), RoomWidgetsController.Listener { @@ -73,7 +75,7 @@ class RoomWidgetsBottomSheet : } override fun didSelectWidget(widget: Widget) = withState(timelineViewModel) { - navigator.openRoomWidget(requireContext(), it.roomId, widget) + navigator.openRoomWidget(requireContext(), widgetActivityResultLauncher, it.roomId, widget) dismiss() } @@ -83,8 +85,8 @@ class RoomWidgetsBottomSheet : } companion object { - fun newInstance(): RoomWidgetsBottomSheet { - return RoomWidgetsBottomSheet() + fun newInstance(widgetActivityResultLauncher: ActivityResultLauncher): RoomWidgetsBottomSheet { + return RoomWidgetsBottomSheet(widgetActivityResultLauncher) } } } diff --git a/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt b/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt index 38db6422876..7840716b64a 100644 --- a/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt +++ b/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt @@ -452,7 +452,13 @@ class DefaultNavigator @Inject constructor( activityResultLauncher.launch(intent) } - override fun openRoomWidget(context: Context, roomId: String, widget: Widget, options: Map?) { + override fun openRoomWidget( + context: Context, + activityResultLauncher: ActivityResultLauncher?, + roomId: String, + widget: Widget, + options: Map? + ) { if (widget.type is WidgetType.Jitsi) { // Jitsi SDK is now for API 23+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { @@ -470,7 +476,12 @@ class DefaultNavigator @Inject constructor( context.startActivity(WidgetActivity.newIntent(context, widgetArgs)) } else { val widgetArgs = widgetArgsBuilder.buildRoomWidgetArgs(roomId, widget) - context.startActivity(WidgetActivity.newIntent(context, widgetArgs)) + val intent = WidgetActivity.newIntent(context, widgetArgs) + activityResultLauncher?.let { + it.launch(intent) + } ?: run { + context.startActivity(intent) + } } } diff --git a/vector/src/main/java/im/vector/app/features/navigation/Navigator.kt b/vector/src/main/java/im/vector/app/features/navigation/Navigator.kt index 8e01b3ed501..68ac68c3dc1 100644 --- a/vector/src/main/java/im/vector/app/features/navigation/Navigator.kt +++ b/vector/src/main/java/im/vector/app/features/navigation/Navigator.kt @@ -155,7 +155,13 @@ interface Navigator { screen: String? ) - fun openRoomWidget(context: Context, roomId: String, widget: Widget, options: Map? = null) + fun openRoomWidget( + context: Context, + activityResultLauncher: ActivityResultLauncher?, + roomId: String, + widget: Widget, + options: Map? = null + ) fun openMediaViewer( activity: Activity, diff --git a/vector/src/main/java/im/vector/app/features/widgets/WidgetFragment.kt b/vector/src/main/java/im/vector/app/features/widgets/WidgetFragment.kt index ed1bace70c8..af1dd8f7e8e 100644 --- a/vector/src/main/java/im/vector/app/features/widgets/WidgetFragment.kt +++ b/vector/src/main/java/im/vector/app/features/widgets/WidgetFragment.kt @@ -86,8 +86,10 @@ class WidgetFragment @Inject constructor( override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) views.widgetWebView.setupForWidget(requireActivity(), checkWebViewPermissionsUseCase, this) - if (fragmentArgs.kind.isAdmin()) { - viewModel.getPostAPIMediator().setWebView(views.widgetWebView) + withState(viewModel) { state -> + if (state.status == WidgetStatus.WIDGET_ALLOWED) { + viewModel.getPostAPIMediator().setWebView(views.widgetWebView) + } } viewModel.observeViewEvents { Timber.v("Observed view events: $it") @@ -118,8 +120,10 @@ class WidgetFragment @Inject constructor( } override fun onDestroyView() { - if (fragmentArgs.kind.isAdmin()) { - viewModel.getPostAPIMediator().clearWebView() + withState(viewModel) { state -> + if (state.status == WidgetStatus.WIDGET_ALLOWED) { + viewModel.getPostAPIMediator().clearWebView() + } } views.widgetWebView.clearAfterWidget() super.onDestroyView() 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 ecd6ca2fd6f..a4d614c3b01 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 @@ -77,12 +77,12 @@ class WidgetViewModel @AssistedInject constructor( init { integrationManagerService.addListener(this) - if (initialState.widgetKind.isAdmin()) { - widgetPostAPIHandler = widgetPostAPIHandlerFactory.create(initialState.roomId).apply { - navigationCallback = this@WidgetViewModel - } - postAPIMediator.setHandler(widgetPostAPIHandler) + // WidgetStatus is still unknown + // Nevertheless, we can create the Handler without using it later + widgetPostAPIHandler = widgetPostAPIHandlerFactory.create(initialState.roomId).apply { + navigationCallback = this@WidgetViewModel } + postAPIMediator.setHandler(widgetPostAPIHandler) if (!integrationManagerService.isIntegrationEnabled()) { _viewEvents.post(WidgetViewEvents.Close(null)) } @@ -248,8 +248,10 @@ class WidgetViewModel @AssistedInject constructor( } private fun handleWebViewLoadingSuccess(action: WidgetAction.OnWebViewLoadingSuccess) { - if (initialState.widgetKind.isAdmin()) { - postAPIMediator.injectAPI() + withState { state -> + if (state.status == WidgetStatus.WIDGET_ALLOWED) { + postAPIMediator.injectAPI() + } } setState { copy(webviewLoadedUrl = Success(action.url)) } }