Various fixes on spaces explore
+ MxTo bottom sheet Fix regression when using state button
This commit is contained in:
parent
f704539c89
commit
19223826fe
@ -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()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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 {
|
||||||
|
@ -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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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) })
|
||||||
|
@ -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))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
|
@ -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))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user