Various fixes on spaces explore

+ MxTo bottom sheet Fix regression when using state button
This commit is contained in:
Valere 2021-05-06 11:54:26 +02:00
parent f704539c89
commit 19223826fe
9 changed files with 84 additions and 41 deletions

View File

@ -127,24 +127,29 @@ internal class DefaultSpaceService @Inject constructor(
), ),
second = response.rooms second = response.rooms
?.filter { it.roomId != spaceId } ?.filter { it.roomId != spaceId }
?.map { childSummary -> ?.flatMap { childSummary ->
val childStateEv = response.events response.events
?.firstOrNull { it.stateKey == childSummary.roomId && it.type == EventType.STATE_SPACE_CHILD } ?.filter { it.stateKey == childSummary.roomId && it.type == EventType.STATE_SPACE_CHILD }
val childStateEvContent = childStateEv?.content.toModel<SpaceChildContent>() ?.map { childStateEv ->
SpaceChildInfo( // create a child entry for everytime this room is the child of a space
childRoomId = childSummary.roomId, // beware that a room could appear then twice in this list
isKnown = true, val childStateEvContent = childStateEv.content.toModel<SpaceChildContent>()
roomType = childSummary.roomType, SpaceChildInfo(
name = childSummary.name, childRoomId = childSummary.roomId,
topic = childSummary.topic, isKnown = true,
avatarUrl = childSummary.avatarUrl, roomType = childSummary.roomType,
order = childStateEvContent?.order, name = childSummary.name,
autoJoin = childStateEvContent?.autoJoin ?: false, topic = childSummary.topic,
viaServers = childStateEvContent?.via ?: emptyList(), avatarUrl = childSummary.avatarUrl,
activeMemberCount = childSummary.numJoinedMembers, order = childStateEvContent?.order,
parentRoomId = childStateEv?.roomId autoJoin = childStateEvContent?.autoJoin ?: false,
) viaServers = childStateEvContent?.via ?: emptyList(),
}.orEmpty() activeMemberCount = childSummary.numJoinedMembers,
parentRoomId = childStateEv.roomId
)
}.orEmpty()
}
.orEmpty()
) )
} }
} }

View File

@ -194,7 +194,7 @@ class SpaceRoomListSectionBuilder(
} else { } else {
liveData(context = viewModelScope.coroutineContext + Dispatchers.IO) { liveData(context = viewModelScope.coroutineContext + Dispatchers.IO) {
val spaceSum = tryOrNull { session.spaceService().querySpaceChildren(selectedSpace.roomId, suggestedOnly = true) } val spaceSum = tryOrNull { session.spaceService().querySpaceChildren(selectedSpace.roomId, suggestedOnly = true) }
val value = spaceSum?.second ?: emptyList() val value = spaceSum?.second.orEmpty().distinctBy { it.childRoomId }
// i need to check if it's already joined. // i need to check if it's already joined.
val filtered = value.filter { val filtered = value.filter {
session.getRoomSummary(it.childRoomId)?.membership?.isActive() != true session.getRoomSummary(it.childRoomId)?.membership?.isActive() != true

View File

@ -56,7 +56,7 @@ class MatrixToBottomSheet :
injector.inject(this) injector.inject(this)
} }
private var interactionListener: InteractionListener? = null var interactionListener: InteractionListener? = null
override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): BottomSheetMatrixToCardBinding { override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): BottomSheetMatrixToCardBinding {
return BottomSheetMatrixToCardBinding.inflate(inflater, container, false) return BottomSheetMatrixToCardBinding.inflate(inflater, container, false)

View File

@ -120,6 +120,7 @@ class MatrixToBottomSheetViewModel @AssistedInject constructor(
?.roomSummary() ?.roomSummary()
// don't take if not active, as it could be outdated // don't take if not active, as it could be outdated
?.takeIf { it.membership.isActive() } ?.takeIf { it.membership.isActive() }
// XXX fix that
val forceRefresh = true val forceRefresh = true
if (!forceRefresh && knownRoom != null) { if (!forceRefresh && knownRoom != null) {
setState { setState {
@ -147,7 +148,7 @@ class MatrixToBottomSheetViewModel @AssistedInject constructor(
topic = peekResult.topic ?: "", topic = peekResult.topic ?: "",
memberCount = peekResult.numJoinedMembers, memberCount = peekResult.numJoinedMembers,
alias = peekResult.alias, alias = peekResult.alias,
membership = Membership.NONE, membership = knownRoom?.membership ?: Membership.NONE,
roomType = peekResult.roomType, roomType = peekResult.roomType,
viaServers = peekResult.viaServers.takeIf { it.isNotEmpty() } ?: permalinkData.viaParameters viaServers = peekResult.viaServers.takeIf { it.isNotEmpty() } ?: permalinkData.viaParameters
).also { ).also {

View File

@ -21,7 +21,6 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.core.view.isGone import androidx.core.view.isGone
import androidx.core.view.isInvisible
import androidx.core.view.isVisible import androidx.core.view.isVisible
import com.airbnb.mvrx.Fail import com.airbnb.mvrx.Fail
import com.airbnb.mvrx.Loading import com.airbnb.mvrx.Loading
@ -31,6 +30,7 @@ import com.airbnb.mvrx.parentFragmentViewModel
import com.airbnb.mvrx.withState import com.airbnb.mvrx.withState
import im.vector.app.R import im.vector.app.R
import im.vector.app.core.extensions.setTextOrHide import im.vector.app.core.extensions.setTextOrHide
import im.vector.app.core.platform.ButtonStateView
import im.vector.app.core.platform.VectorBaseFragment import im.vector.app.core.platform.VectorBaseFragment
import im.vector.app.databinding.FragmentMatrixToRoomSpaceCardBinding import im.vector.app.databinding.FragmentMatrixToRoomSpaceCardBinding
import im.vector.app.features.home.AvatarRenderer import im.vector.app.features.home.AvatarRenderer
@ -50,11 +50,18 @@ class MatrixToRoomSpaceFragment @Inject constructor(
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
views.matrixToCardMainButton.debouncedClicks { views.matrixToCardMainButton.callback = object : ButtonStateView.Callback {
mainButtonClicked() override fun onButtonClicked() {
mainButtonClicked()
}
override fun onRetryClicked() = onButtonClicked()
} }
views.matrixToCardSecondaryButton.debouncedClicks { views.matrixToCardSecondaryButton.callback = object : ButtonStateView.Callback {
secondaryButtonClicked() override fun onButtonClicked() {
secondaryButtonClicked()
}
override fun onRetryClicked() = onButtonClicked()
} }
} }
@ -182,21 +189,17 @@ class MatrixToRoomSpaceFragment @Inject constructor(
when (state.startChattingState) { when (state.startChattingState) {
Uninitialized -> { Uninitialized -> {
views.matrixToCardButtonLoading.isVisible = false views.matrixToCardMainButton.render(ButtonStateView.State.Button)
// views.matrixToCardMainButton.isVisible = false
} }
is Success -> { is Success -> {
views.matrixToCardButtonLoading.isVisible = false views.matrixToCardMainButton.render(ButtonStateView.State.Button)
views.matrixToCardMainButton.isVisible = true
} }
is Fail -> { is Fail -> {
views.matrixToCardButtonLoading.isVisible = false views.matrixToCardMainButton.render(ButtonStateView.State.Error)
views.matrixToCardMainButton.isVisible = true
// TODO display some error copy? // TODO display some error copy?
} }
is Loading -> { is Loading -> {
views.matrixToCardButtonLoading.isVisible = true views.matrixToCardMainButton.render(ButtonStateView.State.Loading)
views.matrixToCardMainButton.isInvisible = true
} }
} }
} }

View File

@ -38,6 +38,7 @@ class SpaceDirectoryController @Inject constructor(
interface InteractionListener { interface InteractionListener {
fun onButtonClick(spaceChildInfo: SpaceChildInfo) fun onButtonClick(spaceChildInfo: SpaceChildInfo)
fun onSpaceChildClick(spaceChildInfo: SpaceChildInfo) fun onSpaceChildClick(spaceChildInfo: SpaceChildInfo)
fun onRoomClick(spaceChildInfo: SpaceChildInfo)
} }
var listener: InteractionListener? = null var listener: InteractionListener? = null
@ -81,6 +82,8 @@ class SpaceDirectoryController @Inject constructor(
apply { apply {
if (isSpace) { if (isSpace) {
itemClickListener(View.OnClickListener { listener?.onSpaceChildClick(info) }) itemClickListener(View.OnClickListener { listener?.onSpaceChildClick(info) })
} else {
itemClickListener(View.OnClickListener { listener?.onRoomClick(info) })
} }
} }
buttonClickListener(View.OnClickListener { listener?.onButtonClick(info) }) buttonClickListener(View.OnClickListener { listener?.onButtonClick(info) })

View File

@ -21,15 +21,17 @@ import android.os.Parcelable
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.fragment.app.FragmentOnAttachListener
import com.airbnb.mvrx.activityViewModel import com.airbnb.mvrx.activityViewModel
import com.airbnb.mvrx.withState import com.airbnb.mvrx.withState
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.platform.OnBackPressed import im.vector.app.core.platform.OnBackPressed
import im.vector.app.core.platform.VectorBaseFragment import im.vector.app.core.platform.VectorBaseFragment
import im.vector.app.databinding.FragmentRoomDirectoryPickerBinding import im.vector.app.databinding.FragmentRoomDirectoryPickerBinding
import im.vector.app.features.matrixto.MatrixToBottomSheet
import kotlinx.parcelize.Parcelize import kotlinx.parcelize.Parcelize
import org.matrix.android.sdk.api.session.room.model.RoomType
import org.matrix.android.sdk.api.session.room.model.SpaceChildInfo import org.matrix.android.sdk.api.session.room.model.SpaceChildInfo
import javax.inject.Inject import javax.inject.Inject
@ -42,13 +44,19 @@ class SpaceDirectoryFragment @Inject constructor(
private val epoxyController: SpaceDirectoryController private val epoxyController: SpaceDirectoryController
) : VectorBaseFragment<FragmentRoomDirectoryPickerBinding>(), ) : VectorBaseFragment<FragmentRoomDirectoryPickerBinding>(),
SpaceDirectoryController.InteractionListener, SpaceDirectoryController.InteractionListener,
OnBackPressed { OnBackPressed, MatrixToBottomSheet.InteractionListener {
override fun getBinding(inflater: LayoutInflater, container: ViewGroup?) = override fun getBinding(inflater: LayoutInflater, container: ViewGroup?) =
FragmentRoomDirectoryPickerBinding.inflate(layoutInflater, container, false) FragmentRoomDirectoryPickerBinding.inflate(layoutInflater, container, false)
private val viewModel by activityViewModel(SpaceDirectoryViewModel::class) private val viewModel by activityViewModel(SpaceDirectoryViewModel::class)
private var fragmentOnAttachListener = FragmentOnAttachListener { _, fragment ->
if (fragment is MatrixToBottomSheet) {
fragment.interactionListener = this
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
@ -60,16 +68,24 @@ class SpaceDirectoryFragment @Inject constructor(
} }
epoxyController.listener = this epoxyController.listener = this
views.roomDirectoryPickerList.configureWith(epoxyController) views.roomDirectoryPickerList.configureWith(epoxyController)
childFragmentManager.addFragmentOnAttachListener(fragmentOnAttachListener)
} }
override fun onDestroyView() { override fun onDestroyView() {
childFragmentManager.removeFragmentOnAttachListener(fragmentOnAttachListener)
epoxyController.listener = null epoxyController.listener = null
views.roomDirectoryPickerList.cleanup() views.roomDirectoryPickerList.cleanup()
super.onDestroyView() super.onDestroyView()
} }
override fun invalidate() = withState(viewModel) { override fun invalidate() = withState(viewModel) { state ->
epoxyController.setData(it) epoxyController.setData(state)
val title = state.hierarchyStack.lastOrNull()?.let { currentParent ->
state.spaceSummaryApiResult.invoke()?.firstOrNull { it.childRoomId == currentParent }
}?.name ?: getString(R.string.space_explore_activity_title)
views.toolbar.title = title
} }
override fun onButtonClick(spaceChildInfo: SpaceChildInfo) { override fun onButtonClick(spaceChildInfo: SpaceChildInfo) {
@ -77,8 +93,14 @@ class SpaceDirectoryFragment @Inject constructor(
} }
override fun onSpaceChildClick(spaceChildInfo: SpaceChildInfo) { override fun onSpaceChildClick(spaceChildInfo: SpaceChildInfo) {
if (spaceChildInfo.roomType == RoomType.SPACE) { viewModel.handle(SpaceDirectoryViewAction.ExploreSubSpace(spaceChildInfo))
viewModel.handle(SpaceDirectoryViewAction.ExploreSubSpace(spaceChildInfo)) }
override fun onRoomClick(spaceChildInfo: SpaceChildInfo) {
// This is temporary for now to at least display something for the space beta
// It's not ideal as it's doing some peeking that is not needed.
viewModel.session.permalinkService().createRoomPermalink(spaceChildInfo.childRoomId)?.let {
MatrixToBottomSheet.withLink(it, this).show(childFragmentManager, "ShowChild")
} }
} }
@ -86,4 +108,8 @@ class SpaceDirectoryFragment @Inject constructor(
viewModel.handle(SpaceDirectoryViewAction.HandleBack) viewModel.handle(SpaceDirectoryViewAction.HandleBack)
return true return true
} }
override fun navigateToRoom(roomId: String) {
viewModel.handle(SpaceDirectoryViewAction.NavigateToRoom(roomId))
}
} }

View File

@ -22,5 +22,6 @@ import org.matrix.android.sdk.api.session.room.model.SpaceChildInfo
sealed class SpaceDirectoryViewAction : VectorViewModelAction { sealed class SpaceDirectoryViewAction : VectorViewModelAction {
data class ExploreSubSpace(val spaceChildInfo: SpaceChildInfo) : SpaceDirectoryViewAction() data class ExploreSubSpace(val spaceChildInfo: SpaceChildInfo) : SpaceDirectoryViewAction()
data class JoinOrOpen(val spaceChildInfo: SpaceChildInfo) : SpaceDirectoryViewAction() data class JoinOrOpen(val spaceChildInfo: SpaceChildInfo) : SpaceDirectoryViewAction()
data class NavigateToRoom(val roomId: String) : SpaceDirectoryViewAction()
object HandleBack : SpaceDirectoryViewAction() object HandleBack : SpaceDirectoryViewAction()
} }

View File

@ -40,7 +40,7 @@ import timber.log.Timber
class SpaceDirectoryViewModel @AssistedInject constructor( class SpaceDirectoryViewModel @AssistedInject constructor(
@Assisted initialState: SpaceDirectoryState, @Assisted initialState: SpaceDirectoryState,
private val session: Session val session: Session
) : VectorViewModel<SpaceDirectoryState, SpaceDirectoryViewAction, SpaceDirectoryViewEvents>(initialState) { ) : VectorViewModel<SpaceDirectoryState, SpaceDirectoryViewAction, SpaceDirectoryViewEvents>(initialState) {
@AssistedFactory @AssistedFactory
@ -91,6 +91,7 @@ class SpaceDirectoryViewModel @AssistedInject constructor(
private fun observeJoinedRooms() { private fun observeJoinedRooms() {
val queryParams = roomSummaryQueryParams { val queryParams = roomSummaryQueryParams {
memberships = listOf(Membership.JOIN) memberships = listOf(Membership.JOIN)
excludeType = null
} }
session session
.rx() .rx()
@ -135,6 +136,9 @@ class SpaceDirectoryViewModel @AssistedInject constructor(
is SpaceDirectoryViewAction.JoinOrOpen -> { is SpaceDirectoryViewAction.JoinOrOpen -> {
handleJoinOrOpen(action.spaceChildInfo) handleJoinOrOpen(action.spaceChildInfo)
} }
is SpaceDirectoryViewAction.NavigateToRoom -> {
_viewEvents.post(SpaceDirectoryViewEvents.NavigateToRoom(action.roomId))
}
} }
} }