Modal changes space children
This commit is contained in:
parent
952e3102d8
commit
20a72e640b
|
@ -137,6 +137,7 @@ class HomeDetailFragment @Inject constructor(
|
|||
}
|
||||
is RoomGroupingMethod.BySpace -> {
|
||||
onSpaceChange(roomGroupingMethod.spaceSummary)
|
||||
sharedActionViewModel.space.value = roomGroupingMethod.spaceSummary
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,8 +16,13 @@
|
|||
|
||||
package im.vector.app.features.home
|
||||
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import im.vector.app.core.platform.VectorSharedActionViewModel
|
||||
import org.matrix.android.sdk.api.session.Session
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomSummary
|
||||
import javax.inject.Inject
|
||||
|
||||
class HomeSharedActionViewModel @Inject constructor(val session: Session) : VectorSharedActionViewModel<HomeActivitySharedAction>()
|
||||
class HomeSharedActionViewModel @Inject constructor(val session: Session) : VectorSharedActionViewModel<HomeActivitySharedAction>() {
|
||||
|
||||
val space = MutableLiveData<RoomSummary>()
|
||||
}
|
||||
|
|
|
@ -24,10 +24,14 @@ import androidx.recyclerview.widget.LinearLayoutManager
|
|||
import com.airbnb.mvrx.fragmentViewModel
|
||||
import com.airbnb.mvrx.withState
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
import im.vector.app.core.extensions.observeNotNull
|
||||
import im.vector.app.core.platform.VectorBaseFragment
|
||||
import im.vector.app.databinding.FragmentSpaceListModalBinding
|
||||
import im.vector.app.features.spaces.SpaceListAction
|
||||
import im.vector.app.features.spaces.SpaceListViewModel
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomSummary
|
||||
import org.matrix.android.sdk.api.util.MatrixItem
|
||||
import org.matrix.android.sdk.api.util.toMatrixItem
|
||||
import javax.inject.Inject
|
||||
|
||||
@AndroidEntryPoint
|
||||
|
@ -52,6 +56,7 @@ class SpaceListModalFragment : VectorBaseFragment<FragmentSpaceListModalBinding>
|
|||
sharedActionViewModel = activityViewModelProvider.get(HomeSharedActionViewModel::class.java)
|
||||
setupRecyclerView()
|
||||
setupAddSpace()
|
||||
observeSpaceChange()
|
||||
}
|
||||
|
||||
private fun setupRecyclerView() {
|
||||
|
@ -70,6 +75,10 @@ class SpaceListModalFragment : VectorBaseFragment<FragmentSpaceListModalBinding>
|
|||
}
|
||||
}
|
||||
|
||||
private fun observeSpaceChange() = sharedActionViewModel.space.observeNotNull(viewLifecycleOwner) {
|
||||
viewModel.setSpace(it)
|
||||
}
|
||||
|
||||
override fun invalidate() {
|
||||
withState(viewModel) { state ->
|
||||
state.rootSpacesOrdered?.let {
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
package im.vector.app.features.spaces
|
||||
|
||||
import androidx.lifecycle.asFlow
|
||||
import com.airbnb.mvrx.Async
|
||||
import com.airbnb.mvrx.Loading
|
||||
import com.airbnb.mvrx.MavericksViewModelFactory
|
||||
import com.airbnb.mvrx.Success
|
||||
|
@ -54,6 +55,7 @@ import org.matrix.android.sdk.api.session.group.groupSummaryQueryParams
|
|||
import org.matrix.android.sdk.api.session.room.RoomSortOrder
|
||||
import org.matrix.android.sdk.api.session.room.accountdata.RoomAccountDataTypes
|
||||
import org.matrix.android.sdk.api.session.room.model.Membership
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomSummary
|
||||
import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams
|
||||
import org.matrix.android.sdk.api.session.room.spaceSummaryQueryParams
|
||||
import org.matrix.android.sdk.api.session.room.summary.RoomAggregateNotificationCount
|
||||
|
@ -71,6 +73,8 @@ class SpaceListViewModel @AssistedInject constructor(@Assisted initialState: Spa
|
|||
private val analyticsTracker: AnalyticsTracker
|
||||
) : VectorViewModel<SpaceListViewState, SpaceListAction, SpaceListViewEvents>(initialState) {
|
||||
|
||||
private var currentSpace: RoomSummary? = null
|
||||
|
||||
@AssistedFactory
|
||||
interface Factory : MavericksAssistedViewModelFactory<SpaceListViewModel, SpaceListViewState> {
|
||||
override fun create(initialState: SpaceListViewState): SpaceListViewModel
|
||||
|
@ -273,6 +277,8 @@ class SpaceListViewModel @AssistedInject constructor(@Assisted initialState: Spa
|
|||
_viewEvents.post(SpaceListViewEvents.AddSpace)
|
||||
}
|
||||
|
||||
var asyncSpaceList: Async<List<RoomSummary>>? = null
|
||||
|
||||
private fun observeSpaceSummaries() {
|
||||
val params = spaceSummaryQueryParams {
|
||||
memberships = listOf(Membership.JOIN, Membership.INVITE)
|
||||
|
@ -287,22 +293,24 @@ class SpaceListViewModel @AssistedInject constructor(@Assisted initialState: Spa
|
|||
.asFlow()
|
||||
) { spaces, _ ->
|
||||
spaces
|
||||
}.execute { async ->
|
||||
asyncSpaceList = async
|
||||
val currentSpaceChildren = currentSpace?.let { space -> async.invoke()?.filter { it.flattenParentIds.contains(space.roomId) } }
|
||||
val rootSpaces = async.invoke().orEmpty().filter { it.flattenParentIds.isEmpty() }
|
||||
val displaySpaces = currentSpaceChildren ?: rootSpaces
|
||||
val orders = displaySpaces.associate {
|
||||
it.roomId to session.getRoom(it.roomId)
|
||||
?.roomAccountDataService()
|
||||
?.getAccountDataEvent(RoomAccountDataTypes.EVENT_TYPE_SPACE_ORDER)
|
||||
?.content.toModel<SpaceOrderContent>()
|
||||
?.safeOrder()
|
||||
}
|
||||
copy(
|
||||
asyncSpaces = async,
|
||||
rootSpacesOrdered = displaySpaces.sortedWith(TopLevelSpaceComparator(orders)),
|
||||
spaceOrderInfo = orders
|
||||
)
|
||||
}
|
||||
.execute { async ->
|
||||
val rootSpaces = async.invoke().orEmpty().filter { it.flattenParentIds.isEmpty() }
|
||||
val orders = rootSpaces.associate {
|
||||
it.roomId to session.getRoom(it.roomId)
|
||||
?.roomAccountDataService()
|
||||
?.getAccountDataEvent(RoomAccountDataTypes.EVENT_TYPE_SPACE_ORDER)
|
||||
?.content.toModel<SpaceOrderContent>()
|
||||
?.safeOrder()
|
||||
}
|
||||
copy(
|
||||
asyncSpaces = async,
|
||||
rootSpacesOrdered = rootSpaces.sortedWith(TopLevelSpaceComparator(orders)),
|
||||
spaceOrderInfo = orders
|
||||
)
|
||||
}
|
||||
|
||||
// clear local echos on update
|
||||
session.accountDataService()
|
||||
|
@ -314,4 +322,29 @@ class SpaceListViewModel @AssistedInject constructor(@Assisted initialState: Spa
|
|||
)
|
||||
}
|
||||
}
|
||||
|
||||
private fun emitSpaceViewState() = asyncSpaceList?.let { async ->
|
||||
val currentSpaceChildren = currentSpace?.let { space -> asyncSpaceList?.invoke()?.filter { it.flattenParentIds.contains(space.roomId) } }
|
||||
val rootSpaces = asyncSpaceList?.invoke().orEmpty().filter { it.flattenParentIds.isEmpty() }
|
||||
val displaySpaces = currentSpaceChildren ?: rootSpaces
|
||||
val orders = displaySpaces.associate {
|
||||
it.roomId to session.getRoom(it.roomId)
|
||||
?.roomAccountDataService()
|
||||
?.getAccountDataEvent(RoomAccountDataTypes.EVENT_TYPE_SPACE_ORDER)
|
||||
?.content.toModel<SpaceOrderContent>()
|
||||
?.safeOrder()
|
||||
}
|
||||
setState {
|
||||
copy(
|
||||
asyncSpaces = async,
|
||||
rootSpacesOrdered = displaySpaces.sortedWith(TopLevelSpaceComparator(orders)),
|
||||
spaceOrderInfo = orders
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
fun setSpace(space: RoomSummary) {
|
||||
this.currentSpace = space
|
||||
emitSpaceViewState()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:color="?attr/vctr_content_secondary">
|
||||
|
||||
<!--this creates the mask with the ripple effect-->
|
||||
<item
|
||||
android:id="@+id/mask"
|
||||
android:drawable="@android:color/white" />
|
||||
|
||||
</ripple>
|
|
@ -50,7 +50,7 @@
|
|||
android:id="@+id/add_space_clickbox"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:background="@drawable/ripple_selector_key_pf"
|
||||
android:background="@drawable/ripple_grey"
|
||||
app:layout_constraintTop_toBottomOf="@id/bottom_divider"
|
||||
app:layout_constraintBottom_toBottomOf="parent" />
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/ripple_selector_key_pf"
|
||||
android:background="@drawable/ripple_grey"
|
||||
android:paddingTop="12dp"
|
||||
android:paddingBottom="12dp">
|
||||
|
||||
|
|
Loading…
Reference in New Issue