catching remove pusher errors in the notification targets screen

- displays a dialog with a human readable version of the error
This commit is contained in:
Adam Brown 2021-09-23 12:27:56 +01:00
parent efec63e979
commit 4c4f2fce74
3 changed files with 43 additions and 2 deletions

View File

@ -0,0 +1,23 @@
/*
* Copyright (c) 2021 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.settings.push
import im.vector.app.core.platform.VectorViewEvents
sealed class PushGatewayViewEvents : VectorViewEvents {
data class RemovePusherFailed(val cause: Throwable): PushGatewayViewEvents()
}

View File

@ -24,9 +24,11 @@ import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import com.airbnb.mvrx.fragmentViewModel import com.airbnb.mvrx.fragmentViewModel
import com.airbnb.mvrx.withState import com.airbnb.mvrx.withState
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import im.vector.app.R import im.vector.app.R
import im.vector.app.core.extensions.cleanup import im.vector.app.core.extensions.cleanup
import im.vector.app.core.extensions.configureWith import im.vector.app.core.extensions.configureWith
import im.vector.app.core.extensions.exhaustive
import im.vector.app.core.platform.VectorBaseFragment import im.vector.app.core.platform.VectorBaseFragment
import im.vector.app.databinding.FragmentGenericRecyclerBinding import im.vector.app.databinding.FragmentGenericRecyclerBinding
import org.matrix.android.sdk.api.session.pushers.Pusher import org.matrix.android.sdk.api.session.pushers.Pusher
@ -69,6 +71,17 @@ class PushGatewaysFragment @Inject constructor(
override fun onRemovePushTapped(pusher: Pusher) = viewModel.handle(PushGatewayAction.RemovePusher(pusher)) override fun onRemovePushTapped(pusher: Pusher) = viewModel.handle(PushGatewayAction.RemovePusher(pusher))
} }
views.genericRecyclerView.configureWith(epoxyController, dividerDrawable = R.drawable.divider_horizontal) views.genericRecyclerView.configureWith(epoxyController, dividerDrawable = R.drawable.divider_horizontal)
viewModel.observeViewEvents {
when(it) {
is PushGatewayViewEvents.RemovePusherFailed -> {
MaterialAlertDialogBuilder(requireContext())
.setTitle(R.string.dialog_title_error)
.setMessage(errorFormatter.toHumanReadable(it.cause))
.setPositiveButton(android.R.string.ok, null)
.show()
}
}.exhaustive
}
} }
override fun onDestroyView() { override fun onDestroyView() {

View File

@ -29,6 +29,7 @@ import dagger.assisted.AssistedFactory
import im.vector.app.core.extensions.exhaustive import im.vector.app.core.extensions.exhaustive
import im.vector.app.core.platform.EmptyViewEvents import im.vector.app.core.platform.EmptyViewEvents
import im.vector.app.core.platform.VectorViewModel import im.vector.app.core.platform.VectorViewModel
import im.vector.app.features.home.HomeActivityViewEvents
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.Session
import org.matrix.android.sdk.api.session.pushers.Pusher import org.matrix.android.sdk.api.session.pushers.Pusher
@ -40,7 +41,7 @@ data class PushGatewayViewState(
class PushGatewaysViewModel @AssistedInject constructor(@Assisted initialState: PushGatewayViewState, class PushGatewaysViewModel @AssistedInject constructor(@Assisted initialState: PushGatewayViewState,
private val session: Session) private val session: Session)
: VectorViewModel<PushGatewayViewState, PushGatewayAction, EmptyViewEvents>(initialState) { : VectorViewModel<PushGatewayViewState, PushGatewayAction, PushGatewayViewEvents>(initialState) {
@AssistedFactory @AssistedFactory
interface Factory { interface Factory {
@ -79,7 +80,11 @@ class PushGatewaysViewModel @AssistedInject constructor(@Assisted initialState:
private fun removePusher(pusher: Pusher) { private fun removePusher(pusher: Pusher) {
viewModelScope.launch { viewModelScope.launch {
kotlin.runCatching {
session.removePusher(pusher.pushKey, pusher.appId) session.removePusher(pusher.pushKey, pusher.appId)
}.onFailure {
_viewEvents.post(PushGatewayViewEvents.RemovePusherFailed(it))
}
} }
} }