diff --git a/library/ui-strings/src/main/res/values/strings.xml b/library/ui-strings/src/main/res/values/strings.xml index 4722db0632..1a14030f24 100644 --- a/library/ui-strings/src/main/res/values/strings.xml +++ b/library/ui-strings/src/main/res/values/strings.xml @@ -3211,6 +3211,7 @@ Displaying polls Load more polls + Error fetching polls. Share location diff --git a/vector/src/main/java/im/vector/app/core/error/ErrorFormatter.kt b/vector/src/main/java/im/vector/app/core/error/ErrorFormatter.kt index 78aaa058e9..c1e201cfc4 100644 --- a/vector/src/main/java/im/vector/app/core/error/ErrorFormatter.kt +++ b/vector/src/main/java/im/vector/app/core/error/ErrorFormatter.kt @@ -20,6 +20,7 @@ import android.content.ActivityNotFoundException import im.vector.app.R import im.vector.app.core.resources.StringProvider import im.vector.app.features.call.dialpad.DialPadLookup +import im.vector.app.features.roomprofile.polls.RoomPollsLoadingError import im.vector.app.features.voice.VoiceFailure import im.vector.app.features.voicebroadcast.VoiceBroadcastFailure import im.vector.app.features.voicebroadcast.VoiceBroadcastFailure.RecordingError @@ -138,6 +139,7 @@ class DefaultErrorFormatter @Inject constructor( stringProvider.getString(R.string.login_signin_matrix_id_error_invalid_matrix_id) is VoiceFailure -> voiceMessageError(throwable) is VoiceBroadcastFailure -> voiceBroadcastMessageError(throwable) + is RoomPollsLoadingError -> stringProvider.getString(R.string.room_polls_loading_error) is ActivityNotFoundException -> stringProvider.getString(R.string.error_no_external_application_found) else -> throwable.localizedMessage diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileActivity.kt b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileActivity.kt index 3c37c92650..3ee1ed867c 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileActivity.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileActivity.kt @@ -76,6 +76,8 @@ class RoomProfileActivity : return ActivitySimpleBinding.inflate(layoutInflater) } + override fun getCoordinatorLayout() = views.coordinatorLayout + override fun initUiAndData() { sharedActionViewModel = viewModelProvider.get(RoomProfileSharedActionViewModel::class.java) roomProfileArgs = intent?.extras?.getParcelableCompat(Mavericks.KEY_ARG) ?: return diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsLoadingError.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsLoadingError.kt new file mode 100644 index 0000000000..71365087f1 --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsLoadingError.kt @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.features.roomprofile.polls + +class RoomPollsLoadingError : Throwable() diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsViewEvent.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsViewEvent.kt index 231123563a..cb2069d824 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsViewEvent.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsViewEvent.kt @@ -18,4 +18,6 @@ package im.vector.app.features.roomprofile.polls import im.vector.app.core.platform.VectorViewEvents -sealed class RoomPollsViewEvent : VectorViewEvents +sealed class RoomPollsViewEvent : VectorViewEvents { + object LoadingError : RoomPollsViewEvent() +} diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsViewModel.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsViewModel.kt index aca2ca4e61..d7efab83ae 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsViewModel.kt @@ -47,9 +47,10 @@ class RoomPollsViewModel @AssistedInject constructor( companion object : MavericksViewModelFactory by hiltMavericksViewModelFactory() init { - updateLoadedPollStatus(initialState.roomId) - syncPolls(initialState.roomId) - observePolls() + val roomId = initialState.roomId + updateLoadedPollStatus(roomId) + syncPolls(roomId) + observePolls(roomId) } private fun updateLoadedPollStatus(roomId: String) { @@ -65,13 +66,18 @@ class RoomPollsViewModel @AssistedInject constructor( private fun syncPolls(roomId: String) { viewModelScope.launch { setState { copy(isSyncing = true) } - syncPollsUseCase.execute(roomId) + val result = runCatching { + syncPollsUseCase.execute(roomId) + } + if (result.isFailure) { + _viewEvents.post(RoomPollsViewEvent.LoadingError) + } setState { copy(isSyncing = false) } } } - private fun observePolls() = withState { viewState -> - getPollsUseCase.execute(viewState.roomId) + private fun observePolls(roomId: String) { + getPollsUseCase.execute(roomId) .onEach { setState { copy(polls = it) } } .launchIn(viewModelScope) } @@ -86,14 +92,19 @@ class RoomPollsViewModel @AssistedInject constructor( private fun handleLoadMore() = withState { viewState -> viewModelScope.launch { setState { copy(isLoadingMore = true) } - val result = loadMorePollsUseCase.execute(viewState.roomId) - setState { - copy( - isLoadingMore = false, - canLoadMore = result.canLoadMore, - nbLoadedDays = result.nbLoadedDays, - ) + val result = runCatching { + val status = loadMorePollsUseCase.execute(viewState.roomId) + setState { + copy( + canLoadMore = status.canLoadMore, + nbLoadedDays = status.nbLoadedDays, + ) + } } + if (result.isFailure) { + _viewEvents.post(RoomPollsViewEvent.LoadingError) + } + setState { copy(isLoadingMore = false) } } } } diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/ui/RoomPollsListFragment.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/ui/RoomPollsListFragment.kt index 7fa38a0c53..05155626c8 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/ui/RoomPollsListFragment.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/ui/RoomPollsListFragment.kt @@ -30,7 +30,9 @@ import im.vector.app.core.platform.VectorBaseFragment import im.vector.app.core.resources.StringProvider import im.vector.app.databinding.FragmentRoomPollsListBinding import im.vector.app.features.roomprofile.polls.RoomPollsAction +import im.vector.app.features.roomprofile.polls.RoomPollsLoadingError import im.vector.app.features.roomprofile.polls.RoomPollsType +import im.vector.app.features.roomprofile.polls.RoomPollsViewEvent import im.vector.app.features.roomprofile.polls.RoomPollsViewModel import im.vector.app.features.roomprofile.polls.RoomPollsViewState import timber.log.Timber @@ -55,10 +57,19 @@ abstract class RoomPollsListFragment : override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + observeViewEvents() setupList() setupLoadMoreButton() } + private fun observeViewEvents() { + viewModel.observeViewEvents { viewEvent -> + when (viewEvent) { + RoomPollsViewEvent.LoadingError -> showErrorInSnackbar(RoomPollsLoadingError()) + } + } + } + abstract fun getEmptyListTitle(canLoadMore: Boolean, nbLoadedDays: Int): String abstract fun getRoomPollsType(): RoomPollsType