Better binding

This commit is contained in:
Benoit Marty 2020-12-16 11:18:25 +01:00
parent 018574a21e
commit d389581d96
2 changed files with 31 additions and 59 deletions

View File

@ -23,8 +23,6 @@ import android.view.LayoutInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.appcompat.app.AlertDialog
import androidx.core.view.isVisible
import com.airbnb.mvrx.Fail
@ -47,6 +45,7 @@ import im.vector.app.core.platform.VectorBaseFragment
import im.vector.app.core.utils.startSharePlainTextIntent
import im.vector.app.databinding.DialogShareQrCodeBinding
import im.vector.app.databinding.FragmentMatrixProfileBinding
import im.vector.app.databinding.ViewStubRoomMemberProfileHeaderBinding
import im.vector.app.features.crypto.verification.VerificationBottomSheet
import im.vector.app.features.home.AvatarRenderer
import im.vector.app.features.home.room.detail.RoomDetailPendingAction
@ -72,13 +71,7 @@ class RoomMemberProfileFragment @Inject constructor(
) : VectorBaseFragment<FragmentMatrixProfileBinding>(),
RoomMemberProfileController.Callback {
private lateinit var memberProfileStateView: StateView
private lateinit var memberProfileInfoContainer: View
private lateinit var memberProfileDecorationImageView: ImageView
private lateinit var memberProfileAvatarView: ImageView
private lateinit var memberProfileNameView: TextView
private lateinit var memberProfileIdView: TextView
private lateinit var memberProfilePowerLevelView: TextView
private lateinit var headerViews: ViewStubRoomMemberProfileHeaderBinding
private val fragmentArgs: RoomMemberProfileArgs by args()
private val viewModel: RoomMemberProfileViewModel by fragmentViewModel()
@ -98,13 +91,13 @@ class RoomMemberProfileFragment @Inject constructor(
it.layoutResource = R.layout.view_stub_room_member_profile_header
it.inflate()
}
findHeaderSubViews(headerView)
memberProfileStateView.eventCallback = object : StateView.EventCallback {
headerViews = ViewStubRoomMemberProfileHeaderBinding.bind(headerView)
headerViews.memberProfileStateView.eventCallback = object : StateView.EventCallback {
override fun onRetryClicked() {
viewModel.handle(RoomMemberProfileAction.RetryFetchingInfo)
}
}
memberProfileStateView.contentView = memberProfileInfoContainer
headerViews.memberProfileStateView.contentView = headerViews.memberProfileInfoContainer
views.matrixProfileRecyclerView.configureWith(roomMemberProfileController, hasFixedSize = true, disableItemAnimation = true)
roomMemberProfileController.callback = this
appBarStateChangeListener = MatrixItemAppBarStateChangeListener(headerView,
@ -133,19 +126,9 @@ class RoomMemberProfileFragment @Inject constructor(
setupLongClicks()
}
private fun findHeaderSubViews(headerView: View) {
memberProfileStateView = headerView.findViewById(R.id.memberProfileStateView)
memberProfileInfoContainer = headerView.findViewById(R.id.memberProfileInfoContainer)
memberProfileNameView = headerView.findViewById(R.id.roomProfileNameView)
memberProfileIdView = headerView.findViewById(R.id.memberProfileIdView)
memberProfileAvatarView = headerView.findViewById(R.id.roomProfileAvatarView)
memberProfilePowerLevelView = headerView.findViewById(R.id.memberProfilePowerLevelView)
memberProfileDecorationImageView = headerView.findViewById(R.id.roomProfileDecorationImageView)
}
private fun setupLongClicks() {
memberProfileNameView.copyOnLongClick()
memberProfileIdView.copyOnLongClick()
headerViews.memberProfileNameView.copyOnLongClick()
headerViews.memberProfileIdView.copyOnLongClick()
}
private fun handleShowPowerLevelDemoteWarning(event: RoomMemberProfileViewEvents.ShowPowerLevelDemoteWarning) {
@ -202,26 +185,26 @@ class RoomMemberProfileFragment @Inject constructor(
is Incomplete -> {
views.matrixProfileToolbarTitleView.text = state.userId
avatarRenderer.render(MatrixItem.UserItem(state.userId, null, null), views.matrixProfileToolbarAvatarImageView)
memberProfileStateView.state = StateView.State.Loading
headerViews.memberProfileStateView.state = StateView.State.Loading
}
is Fail -> {
avatarRenderer.render(MatrixItem.UserItem(state.userId, null, null), views.matrixProfileToolbarAvatarImageView)
views.matrixProfileToolbarTitleView.text = state.userId
val failureMessage = errorFormatter.toHumanReadable(asyncUserMatrixItem.error)
memberProfileStateView.state = StateView.State.Error(failureMessage)
headerViews.memberProfileStateView.state = StateView.State.Error(failureMessage)
}
is Success -> {
val userMatrixItem = asyncUserMatrixItem()
memberProfileStateView.state = StateView.State.Content
memberProfileIdView.text = userMatrixItem.id
headerViews.memberProfileStateView.state = StateView.State.Content
headerViews.memberProfileIdView.text = userMatrixItem.id
val bestName = userMatrixItem.getBestName()
memberProfileNameView.text = bestName
headerViews.memberProfileNameView.text = bestName
views.matrixProfileToolbarTitleView.text = bestName
avatarRenderer.render(userMatrixItem, memberProfileAvatarView)
avatarRenderer.render(userMatrixItem, headerViews.memberProfileAvatarView)
avatarRenderer.render(userMatrixItem, views.matrixProfileToolbarAvatarImageView)
if (state.isRoomEncrypted) {
memberProfileDecorationImageView.isVisible = true
headerViews.memberProfileDecorationImageView.isVisible = true
if (state.userMXCrossSigningInfo != null) {
// Cross signing is enabled for this user
val icon = if (state.userMXCrossSigningInfo.isTrusted()) {
@ -235,23 +218,23 @@ class RoomMemberProfileFragment @Inject constructor(
R.drawable.ic_shield_black
}
memberProfileDecorationImageView.setImageResource(icon)
headerViews.memberProfileDecorationImageView.setImageResource(icon)
views.matrixProfileDecorationToolbarAvatarImageView.setImageResource(icon)
} else {
// Legacy
if (state.allDevicesAreTrusted) {
memberProfileDecorationImageView.setImageResource(R.drawable.ic_shield_trusted)
headerViews.memberProfileDecorationImageView.setImageResource(R.drawable.ic_shield_trusted)
views.matrixProfileDecorationToolbarAvatarImageView.setImageResource(R.drawable.ic_shield_trusted)
} else {
memberProfileDecorationImageView.setImageResource(R.drawable.ic_shield_warning)
headerViews.memberProfileDecorationImageView.setImageResource(R.drawable.ic_shield_warning)
views.matrixProfileDecorationToolbarAvatarImageView.setImageResource(R.drawable.ic_shield_warning)
}
}
} else {
memberProfileDecorationImageView.isVisible = false
headerViews.memberProfileDecorationImageView.isVisible = false
}
memberProfileAvatarView.setOnClickListener { view ->
headerViews.memberProfileAvatarView.setOnClickListener { view ->
onAvatarClicked(view, userMatrixItem)
}
views.matrixProfileToolbarAvatarImageView.setOnClickListener { view ->
@ -259,7 +242,7 @@ class RoomMemberProfileFragment @Inject constructor(
}
}
}
memberProfilePowerLevelView.setTextOrHide(state.userPowerLevelString())
headerViews.memberProfilePowerLevelView.setTextOrHide(state.userPowerLevelString())
roomMemberProfileController.setData(state)
}

View File

@ -23,8 +23,6 @@ import android.view.LayoutInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.appcompat.app.AlertDialog
import androidx.core.app.ActivityOptionsCompat
import androidx.core.content.pm.ShortcutManagerCompat
@ -45,6 +43,7 @@ import im.vector.app.core.platform.VectorBaseFragment
import im.vector.app.core.utils.copyToClipboard
import im.vector.app.core.utils.startSharePlainTextIntent
import im.vector.app.databinding.FragmentMatrixProfileBinding
import im.vector.app.databinding.ViewStubRoomProfileHeaderBinding
import im.vector.app.features.crypto.util.toImageRes
import im.vector.app.features.home.AvatarRenderer
import im.vector.app.features.home.room.list.actions.RoomListActionsArgs
@ -72,10 +71,7 @@ class RoomProfileFragment @Inject constructor(
VectorBaseFragment<FragmentMatrixProfileBinding>(),
RoomProfileController.Callback {
private lateinit var roomProfileDecorationImageView: ImageView
private lateinit var roomProfileAvatarView: ImageView
private lateinit var roomProfileAliasView: TextView
private lateinit var roomProfileNameView: TextView
private lateinit var headerViews: ViewStubRoomProfileHeaderBinding
private val roomProfileArgs: RoomProfileArgs by args()
private lateinit var roomListQuickActionsSharedActionViewModel: RoomListQuickActionsSharedActionViewModel
@ -98,7 +94,7 @@ class RoomProfileFragment @Inject constructor(
it.layoutResource = R.layout.view_stub_room_profile_header
it.inflate()
}
findHeaderSubViews(headerView)
headerViews = ViewStubRoomProfileHeaderBinding.bind(headerView)
setupWaitingView()
setupToolbar(views.matrixProfileToolbar)
setupRecyclerView()
@ -124,21 +120,14 @@ class RoomProfileFragment @Inject constructor(
setupLongClicks()
}
private fun findHeaderSubViews(headerView: View) {
roomProfileNameView = headerView.findViewById(R.id.roomProfileNameView)
roomProfileAliasView = headerView.findViewById(R.id.roomProfileAliasView)
roomProfileAvatarView = headerView.findViewById(R.id.roomProfileAvatarView)
roomProfileDecorationImageView = headerView.findViewById(R.id.roomProfileDecorationImageView)
}
private fun setupWaitingView() {
views.waitingView.waitingStatusText.setText(R.string.please_wait)
views.waitingView.waitingStatusText.isVisible = true
}
private fun setupLongClicks() {
roomProfileNameView.copyOnLongClick()
roomProfileAliasView.copyOnLongClick()
headerViews.roomProfileNameView.copyOnLongClick()
headerViews.roomProfileAliasView.copyOnLongClick()
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
@ -187,17 +176,17 @@ class RoomProfileFragment @Inject constructor(
Timber.w("The room has been left")
activity?.finish()
} else {
roomProfileNameView.text = it.displayName
headerViews.roomProfileNameView.text = it.displayName
views.matrixProfileToolbarTitleView.text = it.displayName
roomProfileAliasView.setTextOrHide(it.canonicalAlias)
headerViews.roomProfileAliasView.setTextOrHide(it.canonicalAlias)
val matrixItem = it.toMatrixItem()
avatarRenderer.render(matrixItem, roomProfileAvatarView)
avatarRenderer.render(matrixItem, headerViews.roomProfileAvatarView)
avatarRenderer.render(matrixItem, views.matrixProfileToolbarAvatarImageView)
roomProfileDecorationImageView.isVisible = it.roomEncryptionTrustLevel != null
roomProfileDecorationImageView.setImageResource(it.roomEncryptionTrustLevel.toImageRes())
headerViews.roomProfileDecorationImageView.isVisible = it.roomEncryptionTrustLevel != null
headerViews.roomProfileDecorationImageView.setImageResource(it.roomEncryptionTrustLevel.toImageRes())
views.matrixProfileDecorationToolbarAvatarImageView.setImageResource(it.roomEncryptionTrustLevel.toImageRes())
roomProfileAvatarView.setOnClickListener { view ->
headerViews.roomProfileAvatarView.setOnClickListener { view ->
onAvatarClicked(view, matrixItem)
}
views.matrixProfileToolbarAvatarImageView.setOnClickListener { view ->