Adds space list modal
This commit is contained in:
parent
0325754d12
commit
15c89f918e
@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
|
||||||
|
<style name="SpaceListModalImageShapeOverlay">
|
||||||
|
<item name="cornerFamily">rounded</item>
|
||||||
|
<item name="cornerSize">8dp</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
</resources>
|
@ -366,6 +366,10 @@ class HomeDetailFragment @Inject constructor(
|
|||||||
views.groupToolbarTitleView.setText(tab.titleRes)
|
views.groupToolbarTitleView.setText(tab.titleRes)
|
||||||
updateSelectedFragment(tab)
|
updateSelectedFragment(tab)
|
||||||
invalidateOptionsMenu()
|
invalidateOptionsMenu()
|
||||||
|
|
||||||
|
views.groupToolbarTitleView.setOnClickListener {
|
||||||
|
println("TODO: open modal from here")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun HomeTab.toFragmentTag() = "FRAGMENT_TAG_$this"
|
private fun HomeTab.toFragmentTag() = "FRAGMENT_TAG_$this"
|
||||||
@ -377,8 +381,10 @@ class HomeDetailFragment @Inject constructor(
|
|||||||
childFragmentManager.fragments
|
childFragmentManager.fragments
|
||||||
.filter { it != fragmentToShow }
|
.filter { it != fragmentToShow }
|
||||||
.forEach {
|
.forEach {
|
||||||
|
if (it.id != R.id.space_modal_fragment) {
|
||||||
detach(it)
|
detach(it)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (fragmentToShow == null) {
|
if (fragmentToShow == null) {
|
||||||
when (tab) {
|
when (tab) {
|
||||||
is HomeTab.RoomList -> {
|
is HomeTab.RoomList -> {
|
||||||
|
@ -0,0 +1,55 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 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.home
|
||||||
|
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import im.vector.app.databinding.ItemModalSpaceBinding
|
||||||
|
import org.matrix.android.sdk.api.session.room.model.RoomSummary
|
||||||
|
import org.matrix.android.sdk.api.util.toMatrixItem
|
||||||
|
|
||||||
|
class SpaceListAdapter(
|
||||||
|
private val spaces: MutableList<RoomSummary>,
|
||||||
|
private val avatarRenderer: AvatarRenderer,
|
||||||
|
) : RecyclerView.Adapter<SpaceListAdapter.ViewHolder>() {
|
||||||
|
|
||||||
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
||||||
|
val itemView = ItemModalSpaceBinding.inflate(LayoutInflater.from(parent.context), parent, false)
|
||||||
|
return ViewHolder(itemView)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
||||||
|
holder.bind(spaces[position])
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getItemCount() = spaces.size
|
||||||
|
|
||||||
|
fun replaceList(spaces: List<RoomSummary>) {
|
||||||
|
this.spaces.clear()
|
||||||
|
this.spaces.addAll(spaces)
|
||||||
|
notifyDataSetChanged()
|
||||||
|
}
|
||||||
|
|
||||||
|
inner class ViewHolder(private val binding: ItemModalSpaceBinding) : RecyclerView.ViewHolder(binding.root) {
|
||||||
|
|
||||||
|
fun bind(space: RoomSummary) {
|
||||||
|
avatarRenderer.render(space.toMatrixItem(), binding.avatar)
|
||||||
|
binding.name.text = space.name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,69 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2022 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.home
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import android.widget.LinearLayout
|
||||||
|
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.platform.VectorBaseFragment
|
||||||
|
import im.vector.app.databinding.FragmentSpaceListModalBinding
|
||||||
|
import im.vector.app.features.spaces.SpaceListViewModel
|
||||||
|
import im.vector.app.features.spaces.SpaceSummaryController
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
@AndroidEntryPoint
|
||||||
|
class SpaceListModalFragment : VectorBaseFragment<FragmentSpaceListModalBinding>() {
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
lateinit var spaceModalController: SpaceSummaryController
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
lateinit var avatarRenderer: AvatarRenderer
|
||||||
|
|
||||||
|
private lateinit var binding: FragmentSpaceListModalBinding
|
||||||
|
|
||||||
|
private val viewModel: SpaceListViewModel by fragmentViewModel()
|
||||||
|
|
||||||
|
override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentSpaceListModalBinding {
|
||||||
|
binding = FragmentSpaceListModalBinding.inflate(inflater)
|
||||||
|
return binding
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
|
super.onViewCreated(view, savedInstanceState)
|
||||||
|
setupRecyclerView()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun setupRecyclerView() {
|
||||||
|
binding.roomList.layoutManager = LinearLayoutManager(context)
|
||||||
|
binding.roomList.adapter = SpaceListAdapter(mutableListOf(), avatarRenderer)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun invalidate() {
|
||||||
|
withState(viewModel) { state ->
|
||||||
|
state.rootSpacesOrdered?.let {
|
||||||
|
(binding.roomList.adapter as SpaceListAdapter).replaceList(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -76,19 +76,16 @@ class SpaceListFragment @Inject constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun onDragReleased(model: SpaceSummaryItem?, itemView: View?) {
|
override fun onDragReleased(model: SpaceSummaryItem?, itemView: View?) {
|
||||||
// Timber.v("VAL: onModelMoved from $fromPositionM to $toPositionM ${model?.matrixItem?.getBestName()}")
|
|
||||||
if (toPositionM == null || fromPositionM == null) return
|
if (toPositionM == null || fromPositionM == null) return
|
||||||
val movingSpace = model?.matrixItem?.id ?: return
|
val movingSpace = model?.matrixItem?.id ?: return
|
||||||
viewModel.handle(SpaceListAction.MoveSpace(movingSpace, toPositionM!! - fromPositionM!!))
|
viewModel.handle(SpaceListAction.MoveSpace(movingSpace, toPositionM!! - fromPositionM!!))
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun clearView(model: SpaceSummaryItem?, itemView: View?) {
|
override fun clearView(model: SpaceSummaryItem?, itemView: View?) {
|
||||||
// Timber.v("VAL: clearView ${model?.matrixItem?.getBestName()}")
|
|
||||||
itemView?.elevation = initialElevation ?: 0f
|
itemView?.elevation = initialElevation ?: 0f
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onModelMoved(fromPosition: Int, toPosition: Int, modelBeingMoved: SpaceSummaryItem?, itemView: View?) {
|
override fun onModelMoved(fromPosition: Int, toPosition: Int, modelBeingMoved: SpaceSummaryItem?, itemView: View?) {
|
||||||
// Timber.v("VAL: onModelMoved incremental from $fromPosition to $toPosition ${modelBeingMoved?.matrixItem?.getBestName()}")
|
|
||||||
if (fromPositionM == null) {
|
if (fromPositionM == null) {
|
||||||
fromPositionM = fromPosition
|
fromPositionM = fromPosition
|
||||||
}
|
}
|
||||||
@ -97,7 +94,6 @@ class SpaceListFragment @Inject constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun isDragEnabledForModel(model: SpaceSummaryItem?): Boolean {
|
override fun isDragEnabledForModel(model: SpaceSummaryItem?): Boolean {
|
||||||
// Timber.v("VAL: isDragEnabledForModel ${model?.matrixItem?.getBestName()}")
|
|
||||||
return model?.canDrag == true
|
return model?.canDrag == true
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -0,0 +1,92 @@
|
|||||||
|
/*
|
||||||
|
* 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.spaces
|
||||||
|
|
||||||
|
import com.airbnb.epoxy.EpoxyController
|
||||||
|
import im.vector.app.R
|
||||||
|
import im.vector.app.RoomGroupingMethod
|
||||||
|
import im.vector.app.core.resources.ColorProvider
|
||||||
|
import im.vector.app.core.resources.StringProvider
|
||||||
|
import im.vector.app.core.ui.list.genericFooterItem
|
||||||
|
import im.vector.app.core.ui.list.genericHeaderItem
|
||||||
|
import im.vector.app.features.grouplist.groupSummaryItem
|
||||||
|
import im.vector.app.features.grouplist.homeSpaceSummaryItem
|
||||||
|
import im.vector.app.features.home.AvatarRenderer
|
||||||
|
import im.vector.app.features.home.room.list.UnreadCounterBadgeView
|
||||||
|
import im.vector.app.group
|
||||||
|
import im.vector.app.space
|
||||||
|
import im.vector.lib.core.utils.epoxy.charsequence.toEpoxyCharSequence
|
||||||
|
import org.matrix.android.sdk.api.extensions.orFalse
|
||||||
|
import org.matrix.android.sdk.api.session.group.model.GroupSummary
|
||||||
|
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.model.SpaceChildInfo
|
||||||
|
import org.matrix.android.sdk.api.session.room.summary.RoomAggregateNotificationCount
|
||||||
|
import org.matrix.android.sdk.api.util.toMatrixItem
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
class SpaceModalController @Inject constructor(
|
||||||
|
private val avatarRenderer: AvatarRenderer,
|
||||||
|
// private val colorProvider: ColorProvider,
|
||||||
|
// private val stringProvider: StringProvider
|
||||||
|
) : EpoxyController() {
|
||||||
|
|
||||||
|
var callback: Callback? = null
|
||||||
|
private var viewState: SpaceListViewState? = null
|
||||||
|
|
||||||
|
fun update(viewState: SpaceListViewState) {
|
||||||
|
this.viewState = viewState
|
||||||
|
requestModelBuild()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun buildModels() {
|
||||||
|
viewState?.apply {
|
||||||
|
buildGroupModels(selectedGroupingMethod, rootSpacesOrdered, expandedStates)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun buildGroupModels(selected: RoomGroupingMethod,
|
||||||
|
rootSpaces: List<RoomSummary>?,
|
||||||
|
expandedStates: Map<String, Boolean>) {
|
||||||
|
val host = this
|
||||||
|
|
||||||
|
rootSpaces?.forEach { spaceSummary ->
|
||||||
|
val isSelected = selected is RoomGroupingMethod.BySpace && spaceSummary.roomId == selected.space()?.roomId
|
||||||
|
val expanded = expandedStates[spaceSummary.roomId] == true
|
||||||
|
|
||||||
|
spaceSummaryItem {
|
||||||
|
avatarRenderer(host.avatarRenderer)
|
||||||
|
id(spaceSummary.roomId)
|
||||||
|
expanded(expanded)
|
||||||
|
matrixItem(spaceSummary.toMatrixItem())
|
||||||
|
selected(isSelected)
|
||||||
|
canDrag(true)
|
||||||
|
listener { host.callback?.onSpaceSelected(spaceSummary) }
|
||||||
|
countState(
|
||||||
|
UnreadCounterBadgeView.State(
|
||||||
|
spaceSummary.notificationCount,
|
||||||
|
spaceSummary.highlightCount > 0
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Callback {
|
||||||
|
fun onSpaceSelected(spaceSummary: RoomSummary?)
|
||||||
|
}
|
||||||
|
}
|
7
vector/src/main/res/drawable/bg_space_modal.xml
Normal file
7
vector/src/main/res/drawable/bg_space_modal.xml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<solid android:color="#FFF"/>
|
||||||
|
<corners
|
||||||
|
android:bottomLeftRadius="12dp"
|
||||||
|
android:bottomRightRadius="12dp" />
|
||||||
|
</shape>
|
10
vector/src/main/res/drawable/ic_plus.xml
Normal file
10
vector/src/main/res/drawable/ic_plus.xml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:pathData="M12.7822,4.2963C12.7822,3.8641 12.4318,3.5137 11.9996,3.5137C11.5673,3.5137 11.217,3.8641 11.217,4.2963V11.2173L4.2963,11.2173C3.8641,11.2173 3.5137,11.5676 3.5137,11.9999C3.5137,12.4321 3.8641,12.7825 4.2963,12.7825H11.217V19.7038C11.217,20.136 11.5673,20.4864 11.9996,20.4864C12.4318,20.4864 12.7822,20.136 12.7822,19.7038V12.7825H19.7038C20.136,12.7825 20.4864,12.4321 20.4864,11.9999C20.4864,11.5676 20.136,11.2173 19.7038,11.2173L12.7822,11.2173V4.2963Z"
|
||||||
|
android:fillColor="#17191C"
|
||||||
|
android:fillType="evenOdd"/>
|
||||||
|
</vector>
|
@ -18,7 +18,7 @@
|
|||||||
android:minHeight="48dp"
|
android:minHeight="48dp"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
app:layout_constraintTop_toBottomOf="@id/homeKeysBackupBanner"
|
app:layout_constraintTop_toBottomOf="@id/homeKeysBackupBanner"
|
||||||
tools:visibility="visible" />
|
tools:visibility="gone" />
|
||||||
|
|
||||||
<com.google.android.material.appbar.MaterialToolbar
|
<com.google.android.material.appbar.MaterialToolbar
|
||||||
android:id="@+id/groupToolbar"
|
android:id="@+id/groupToolbar"
|
||||||
@ -70,7 +70,7 @@
|
|||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
tools:background="@drawable/bg_unread_highlight"
|
tools:background="@drawable/bg_unread_highlight"
|
||||||
tools:text="4"
|
tools:text="4"
|
||||||
tools:visibility="visible" />
|
tools:visibility="gone" />
|
||||||
|
|
||||||
</RelativeLayout>
|
</RelativeLayout>
|
||||||
|
|
||||||
@ -107,7 +107,7 @@
|
|||||||
android:textColor="?vctr_content_primary"
|
android:textColor="?vctr_content_primary"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
tools:text="@tools:sample/lorem/random"
|
tools:text="@tools:sample/lorem/random"
|
||||||
tools:visibility="visible" />
|
tools:visibility="gone" />
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
@ -135,7 +135,7 @@
|
|||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@id/syncStateView"
|
app:layout_constraintTop_toBottomOf="@id/syncStateView"
|
||||||
tools:visibility="visible" />
|
tools:visibility="gone" />
|
||||||
|
|
||||||
<androidx.fragment.app.FragmentContainerView
|
<androidx.fragment.app.FragmentContainerView
|
||||||
android:id="@+id/roomListContainer"
|
android:id="@+id/roomListContainer"
|
||||||
@ -144,6 +144,21 @@
|
|||||||
app:layout_constraintBottom_toTopOf="@id/bottomNavigationView"
|
app:layout_constraintBottom_toTopOf="@id/bottomNavigationView"
|
||||||
app:layout_constraintTop_toBottomOf="@id/homeKeysBackupBanner" />
|
app:layout_constraintTop_toBottomOf="@id/homeKeysBackupBanner" />
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:background="#000"
|
||||||
|
android:alpha="0.5"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/appBarLayout"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent" />
|
||||||
|
|
||||||
|
<androidx.fragment.app.FragmentContainerView
|
||||||
|
android:id="@+id/space_modal_fragment"
|
||||||
|
android:name="im.vector.app.features.home.SpaceListModalFragment"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/appBarLayout" />
|
||||||
|
|
||||||
<com.google.android.material.bottomnavigation.BottomNavigationView
|
<com.google.android.material.bottomnavigation.BottomNavigationView
|
||||||
android:id="@+id/bottomNavigationView"
|
android:id="@+id/bottomNavigationView"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
|
51
vector/src/main/res/layout/fragment_space_list_modal.xml
Normal file
51
vector/src/main/res/layout/fragment_space_list_modal.xml
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="@drawable/bg_space_modal"
|
||||||
|
android:paddingTop="16dp"
|
||||||
|
android:paddingBottom="16dp">
|
||||||
|
|
||||||
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
|
android:id="@+id/room_list"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
tools:itemCount="3"
|
||||||
|
tools:listitem="@layout/item_modal_space" />
|
||||||
|
|
||||||
|
<com.google.android.material.imageview.ShapeableImageView
|
||||||
|
android:id="@+id/add_space_icon_background"
|
||||||
|
android:layout_width="42dp"
|
||||||
|
android:layout_height="42dp"
|
||||||
|
android:layout_marginStart="16dp"
|
||||||
|
android:layout_marginTop="12dp"
|
||||||
|
android:background="#4D8D97A5"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/room_list"
|
||||||
|
app:shapeAppearanceOverlay="@style/SpaceListModalImageShapeOverlay" />
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="24dp"
|
||||||
|
android:layout_height="24dp"
|
||||||
|
android:importantForAccessibility="no"
|
||||||
|
android:src="@drawable/ic_plus"
|
||||||
|
app:layout_constraintBottom_toBottomOf="@id/add_space_icon_background"
|
||||||
|
app:layout_constraintEnd_toEndOf="@id/add_space_icon_background"
|
||||||
|
app:layout_constraintStart_toStartOf="@id/add_space_icon_background"
|
||||||
|
app:layout_constraintTop_toTopOf="@id/add_space_icon_background"
|
||||||
|
app:tint="#000" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
style="@style/Widget.Vector.TextView.Body.Medium"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="16dp"
|
||||||
|
android:text="@string/add_space"
|
||||||
|
android:textSize="17sp"
|
||||||
|
app:layout_constraintBottom_toBottomOf="@id/add_space_icon_background"
|
||||||
|
app:layout_constraintStart_toEndOf="@id/add_space_icon_background"
|
||||||
|
app:layout_constraintTop_toTopOf="@id/add_space_icon_background" />
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
@ -36,13 +36,13 @@
|
|||||||
android:textColor="?vctr_content_primary"
|
android:textColor="?vctr_content_primary"
|
||||||
android:textStyle="bold"
|
android:textStyle="bold"
|
||||||
app:layout_constraintBottom_toTopOf="@id/groupBottomSeparator"
|
app:layout_constraintBottom_toTopOf="@id/groupBottomSeparator"
|
||||||
app:layout_constraintEnd_toStartOf="@id/groupAvatarChevron"
|
app:layout_constraintEnd_toStartOf="@id/chevron"
|
||||||
app:layout_constraintStart_toEndOf="@id/groupAvatarImageView"
|
app:layout_constraintStart_toEndOf="@id/groupAvatarImageView"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
tools:text="@tools:sample/lorem/random" />
|
tools:text="@tools:sample/lorem/random" />
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/groupAvatarChevron"
|
android:id="@+id/chevron"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginEnd="21dp"
|
android:layout_marginEnd="21dp"
|
||||||
|
64
vector/src/main/res/layout/item_modal_space.xml
Normal file
64
vector/src/main/res/layout/item_modal_space.xml
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingTop="12dp"
|
||||||
|
android:paddingBottom="12dp">
|
||||||
|
|
||||||
|
<com.google.android.material.imageview.ShapeableImageView
|
||||||
|
android:id="@+id/avatar"
|
||||||
|
android:layout_width="42dp"
|
||||||
|
android:layout_height="42dp"
|
||||||
|
android:layout_marginStart="16dp"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:shapeAppearanceOverlay="@style/SpaceListModalImageShapeOverlay"
|
||||||
|
tools:background="#42A5F5" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/name"
|
||||||
|
style="@style/Widget.Vector.TextView.Body.Medium"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="16dp"
|
||||||
|
android:textSize="17sp"
|
||||||
|
app:layout_constraintBottom_toBottomOf="@id/avatar"
|
||||||
|
app:layout_constraintStart_toEndOf="@id/avatar"
|
||||||
|
app:layout_constraintTop_toTopOf="@id/avatar"
|
||||||
|
tools:text="Space name" />
|
||||||
|
|
||||||
|
<im.vector.app.features.home.room.list.UnreadCounterBadgeView
|
||||||
|
android:id="@+id/counter_badge"
|
||||||
|
style="@style/Widget.Vector.TextView.Micro"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginEnd="16dp"
|
||||||
|
android:minWidth="16dp"
|
||||||
|
android:minHeight="16dp"
|
||||||
|
android:paddingStart="4dp"
|
||||||
|
android:paddingEnd="4dp"
|
||||||
|
android:textColor="?colorOnError"
|
||||||
|
android:visibility="gone"
|
||||||
|
app:layout_constraintEnd_toStartOf="@id/chevron"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
tools:background="@drawable/bg_unread_highlight"
|
||||||
|
tools:text="147"
|
||||||
|
tools:visibility="visible" />
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/chevron"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginEnd="20dp"
|
||||||
|
android:importantForAccessibility="no"
|
||||||
|
android:src="@drawable/ic_arrow_right"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:tint="?vctr_content_primary"
|
||||||
|
tools:ignore="MissingPrefix" />
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
@ -120,12 +120,12 @@
|
|||||||
android:padding="4dp"
|
android:padding="4dp"
|
||||||
android:src="@drawable/ic_more_vertical"
|
android:src="@drawable/ic_more_vertical"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toStartOf="@id/groupAvatarChevron"
|
app:layout_constraintEnd_toStartOf="@id/chevron"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
app:tint="?vctr_content_secondary" />
|
app:tint="?vctr_content_secondary" />
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/groupAvatarChevron"
|
android:id="@+id/chevron"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginEnd="21dp"
|
android:layout_marginEnd="21dp"
|
||||||
|
@ -101,12 +101,12 @@
|
|||||||
android:padding="4dp"
|
android:padding="4dp"
|
||||||
android:src="@drawable/ic_more_vertical"
|
android:src="@drawable/ic_more_vertical"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toStartOf="@id/groupAvatarChevron"
|
app:layout_constraintEnd_toStartOf="@id/chevron"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
app:tint="?vctr_content_secondary" />
|
app:tint="?vctr_content_secondary" />
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/groupAvatarChevron"
|
android:id="@+id/chevron"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginEnd="21dp"
|
android:layout_marginEnd="21dp"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user