From 8c53dd5346a3fd73d420deebfc7732c1597dc4ad Mon Sep 17 00:00:00 2001 From: Taras Smakula <tarassmakula@gmail.com> Date: Tue, 2 Jan 2024 17:00:42 +0200 Subject: [PATCH] Add ignored label --- .../ignored/list/IgnoredUsersViewHolder.kt | 7 +- .../feature/people/list/PeopleAdapter.kt | 2 +- .../feature/people/list/PeopleViewHolder.kt | 38 ++++++++- .../circles/view/PeopleTabUserListItemView.kt | 25 ------ .../res/layout/list_item_people_default.xml | 83 +++++++++++++++++-- .../res/layout/list_item_people_ignored.xml | 48 +++++++++-- .../layout/view_people_tab_user_list_item.xml | 53 ------------ app/src/main/res/values/strings.xml | 3 +- .../core/extensions/ImageViewExtensions.kt | 5 +- .../core/feature/user/UserDialogFragment.kt | 3 +- 10 files changed, 167 insertions(+), 100 deletions(-) delete mode 100644 app/src/main/java/org/futo/circles/view/PeopleTabUserListItemView.kt delete mode 100644 app/src/main/res/layout/view_people_tab_user_list_item.xml diff --git a/app/src/main/java/org/futo/circles/feature/ignored/list/IgnoredUsersViewHolder.kt b/app/src/main/java/org/futo/circles/feature/ignored/list/IgnoredUsersViewHolder.kt index bbded269a..f95099cac 100644 --- a/app/src/main/java/org/futo/circles/feature/ignored/list/IgnoredUsersViewHolder.kt +++ b/app/src/main/java/org/futo/circles/feature/ignored/list/IgnoredUsersViewHolder.kt @@ -3,6 +3,7 @@ package org.futo.circles.feature.ignored.list import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import org.futo.circles.core.base.list.ViewBindingHolder +import org.futo.circles.core.extensions.loadUserProfileIcon import org.futo.circles.core.extensions.onClick import org.futo.circles.core.model.CirclesUserSummary import org.futo.circles.databinding.ListItemPeopleIgnoredBinding @@ -21,6 +22,10 @@ class IgnoredUsersViewHolder( } fun bind(data: CirclesUserSummary) { - binding.userItem.bind(data) + with(binding) { + tvUserName.text = data.name + tvUserId.text = data.id + ivUserImage.loadUserProfileIcon(data.avatarUrl, data.id) + } } } \ No newline at end of file diff --git a/app/src/main/java/org/futo/circles/feature/people/list/PeopleAdapter.kt b/app/src/main/java/org/futo/circles/feature/people/list/PeopleAdapter.kt index 6ae09bfa9..5a7c5aaae 100644 --- a/app/src/main/java/org/futo/circles/feature/people/list/PeopleAdapter.kt +++ b/app/src/main/java/org/futo/circles/feature/people/list/PeopleAdapter.kt @@ -19,7 +19,7 @@ class PeopleAdapter( override fun getItemViewType(position: Int): Int = getItem(position).type.ordinal override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PeopleViewHolder { - return when (PeopleItemType.values()[viewType]) { + return when (PeopleItemType.entries[viewType]) { PeopleItemType.Header -> PeopleHeaderViewHolder(parent) PeopleItemType.RequestNotification -> FollowRequestNotificationViewHolder( parent = parent, onClicked = { onOpenRequestsClicked() } diff --git a/app/src/main/java/org/futo/circles/feature/people/list/PeopleViewHolder.kt b/app/src/main/java/org/futo/circles/feature/people/list/PeopleViewHolder.kt index 6cedc0540..ad76e1b90 100644 --- a/app/src/main/java/org/futo/circles/feature/people/list/PeopleViewHolder.kt +++ b/app/src/main/java/org/futo/circles/feature/people/list/PeopleViewHolder.kt @@ -8,7 +8,10 @@ import org.futo.circles.core.base.list.ViewBindingHolder import org.futo.circles.core.base.list.context import org.futo.circles.core.databinding.ListItemInviteHeaderBinding import org.futo.circles.core.databinding.ListItemInviteNotificationBinding +import org.futo.circles.core.extensions.gone +import org.futo.circles.core.extensions.loadUserProfileIcon import org.futo.circles.core.extensions.onClick +import org.futo.circles.core.extensions.setIsVisible import org.futo.circles.databinding.ListItemPeopleDefaultBinding import org.futo.circles.model.PeopleHeaderItem import org.futo.circles.model.PeopleListItem @@ -35,11 +38,40 @@ class PeopleDefaultUserViewHolder( } override fun bind(data: PeopleListItem) { - (data as? PeopleUserListItem)?.let { binding.userItem.bind(it.user) } + val userItem = (data as? PeopleUserListItem) ?: return + if (userItem.isIgnored) setUnBlurClick(userItem) + with(binding) { + tvUserName.text = userItem.user.name + tvUserId.text = userItem.user.id + ivUserImage.loadUserProfileIcon( + userItem.user.avatarUrl, + userItem.user.id, + applyBlur = userItem.isIgnored + ) + tvIgnoredLabel.setIsVisible(userItem.isIgnored) + binding.tvShowProfileImage.setIsVisible(userItem.isIgnored) + } } override fun bindPayload(data: PeopleUserListItemPayload) { - data.user?.let { binding.userItem.bind(it) } + with(binding) { + data.user?.let { + tvUserName.text = it.name + tvUserId.text = it.id + ivUserImage.loadUserProfileIcon(it.avatarUrl, it.id) + } + } + } + + private fun setUnBlurClick(userItem: PeopleUserListItem) { + binding.ivUserImage.setOnClickListener { + binding.ivUserImage.loadUserProfileIcon( + userItem.user.avatarUrl, + userItem.user.id, + applyBlur = false + ) + binding.tvShowProfileImage.gone() + } } } @@ -59,7 +91,7 @@ class FollowRequestNotificationViewHolder( override fun bind(data: PeopleListItem) { if (data !is PeopleRequestNotificationListItem) return binding.tvInvitesMessage.text = - context.getString(R.string.show_follow_requests_format, data.requestsCount) + context.getString(R.string.show_connection_invites_format, data.requestsCount) } } diff --git a/app/src/main/java/org/futo/circles/view/PeopleTabUserListItemView.kt b/app/src/main/java/org/futo/circles/view/PeopleTabUserListItemView.kt deleted file mode 100644 index 37815325c..000000000 --- a/app/src/main/java/org/futo/circles/view/PeopleTabUserListItemView.kt +++ /dev/null @@ -1,25 +0,0 @@ -package org.futo.circles.view - -import android.content.Context -import android.util.AttributeSet -import android.view.LayoutInflater -import androidx.constraintlayout.widget.ConstraintLayout -import org.futo.circles.core.extensions.loadUserProfileIcon -import org.futo.circles.core.model.CirclesUserSummary -import org.futo.circles.databinding.ViewPeopleTabUserListItemBinding - -class PeopleTabUserListItemView( - context: Context, - attrs: AttributeSet? = null -) : ConstraintLayout(context, attrs) { - - val binding = ViewPeopleTabUserListItemBinding.inflate(LayoutInflater.from(context), this) - - fun bind(user: CirclesUserSummary) { - with(binding) { - tvUserName.text = user.name - tvUserId.text = user.id - ivUserImage.loadUserProfileIcon(user.avatarUrl, user.id) - } - } -} \ No newline at end of file diff --git a/app/src/main/res/layout/list_item_people_default.xml b/app/src/main/res/layout/list_item_people_default.xml index 18ece5ada..203038ffc 100644 --- a/app/src/main/res/layout/list_item_people_default.xml +++ b/app/src/main/res/layout/list_item_people_default.xml @@ -1,14 +1,85 @@ <?xml version="1.0" encoding="utf-8"?> -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" +<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="?selectableItemBackground" android:clickable="true" android:focusable="true"> - <org.futo.circles.view.PeopleTabUserListItemView - android:id="@+id/userItem" - android:layout_width="match_parent" - android:layout_height="wrap_content" /> -</FrameLayout> \ No newline at end of file + <com.google.android.material.imageview.ShapeableImageView + android:id="@+id/ivUserImage" + android:layout_width="72dp" + android:layout_height="72dp" + android:layout_marginStart="8dp" + android:layout_marginTop="4dp" + android:layout_marginBottom="4dp" + android:scaleType="centerCrop" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.App.CornerSize50Percent" + tools:background="@color/blue" /> + + <TextView + android:id="@+id/tvShowProfileImage" + style="@style/body" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:drawablePadding="-4dp" + android:text="@string/show" + android:textColor="@color/white" + android:visibility="gone" + app:drawableTint="@color/white" + app:drawableTopCompat="@drawable/ic_seen" + app:layout_constraintBottom_toBottomOf="@id/ivUserImage" + app:layout_constraintEnd_toEndOf="@id/ivUserImage" + app:layout_constraintStart_toStartOf="@id/ivUserImage" + app:layout_constraintTop_toTopOf="@id/ivUserImage" + tools:visibility="visible" /> + + <TextView + android:id="@+id/tvUserName" + style="@style/title2" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + android:layout_marginEnd="8dp" + android:ellipsize="end" + android:lines="1" + app:layout_constraintBottom_toTopOf="@id/tvUserId" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toEndOf="@id/ivUserImage" + app:layout_constraintTop_toTopOf="@id/ivUserImage" + app:layout_constraintVertical_chainStyle="packed" + tools:text="Android01" /> + + <TextView + android:id="@+id/tvUserId" + style="@style/subheadline" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:ellipsize="end" + android:lines="1" + app:layout_constraintBottom_toTopOf="@id/tvIgnoredLabel" + app:layout_constraintEnd_toEndOf="@id/tvUserName" + app:layout_constraintStart_toStartOf="@id/tvUserName" + app:layout_constraintTop_toBottomOf="@id/tvUserName" + tools:text="Android01@domain" /> + + <TextView + android:id="@+id/tvIgnoredLabel" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:text="@string/ignored" + android:visibility="gone" + app:layout_constraintBottom_toBottomOf="@id/ivUserImage" + app:layout_constraintEnd_toEndOf="@id/tvUserName" + app:layout_constraintStart_toStartOf="@id/tvUserName" + app:layout_constraintTop_toBottomOf="@id/tvUserId" + tools:visibility="visible" /> + + +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/list_item_people_ignored.xml b/app/src/main/res/layout/list_item_people_ignored.xml index c137e4711..52924510a 100644 --- a/app/src/main/res/layout/list_item_people_ignored.xml +++ b/app/src/main/res/layout/list_item_people_ignored.xml @@ -1,19 +1,53 @@ <?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:paddingVertical="4dp"> - <org.futo.circles.view.PeopleTabUserListItemView - android:id="@+id/userItem" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginEnd="100dp" + <com.google.android.material.imageview.ShapeableImageView + android:id="@+id/ivUserImage" + android:layout_width="72dp" + android:layout_height="72dp" + android:layout_marginStart="8dp" + android:layout_marginTop="4dp" + android:layout_marginBottom="4dp" + android:scaleType="centerCrop" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent" + app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.App.CornerSize50Percent" + tools:background="@color/blue" /> + + <TextView + android:id="@+id/tvUserName" + style="@style/title2" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + android:ellipsize="end" + android:lines="1" + app:layout_constraintBottom_toTopOf="@id/tvUserId" + app:layout_constraintEnd_toStartOf="@id/btnUnIgnore" + app:layout_constraintStart_toEndOf="@id/ivUserImage" + app:layout_constraintTop_toTopOf="@id/ivUserImage" + app:layout_constraintVertical_chainStyle="packed" + tools:text="Android01" /> + + <TextView + android:id="@+id/tvUserId" + style="@style/subheadline" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:ellipsize="end" + android:lines="1" + app:layout_constraintBottom_toBottomOf="@id/ivUserImage" + app:layout_constraintEnd_toEndOf="@id/tvUserName" + app:layout_constraintStart_toStartOf="@id/tvUserName" + app:layout_constraintTop_toBottomOf="@id/tvUserName" + tools:text="Android01@domain" /> + <com.google.android.material.button.MaterialButton android:id="@+id/btnUnIgnore" diff --git a/app/src/main/res/layout/view_people_tab_user_list_item.xml b/app/src/main/res/layout/view_people_tab_user_list_item.xml deleted file mode 100644 index 05961383a..000000000 --- a/app/src/main/res/layout/view_people_tab_user_list_item.xml +++ /dev/null @@ -1,53 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<merge 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" - tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout"> - - <com.google.android.material.imageview.ShapeableImageView - android:id="@+id/ivUserImage" - android:layout_width="72dp" - android:layout_height="0dp" - android:layout_marginStart="8dp" - android:layout_marginTop="4dp" - android:layout_marginBottom="4dp" - android:scaleType="centerCrop" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintDimensionRatio="w,1:1" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" - app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.App.CornerSize50Percent" - tools:background="@color/blue" /> - - <TextView - android:id="@+id/tvUserName" - style="@style/title2" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginStart="8dp" - android:layout_marginEnd="8dp" - android:ellipsize="end" - android:lines="1" - app:layout_constraintBottom_toTopOf="@id/tvUserId" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toEndOf="@id/ivUserImage" - app:layout_constraintTop_toTopOf="@id/ivUserImage" - app:layout_constraintVertical_chainStyle="packed" - tools:text="Android01" /> - - <TextView - android:id="@+id/tvUserId" - style="@style/subheadline" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:ellipsize="end" - android:lines="1" - app:layout_constraintBottom_toBottomOf="@id/ivUserImage" - app:layout_constraintEnd_toEndOf="@id/tvUserName" - app:layout_constraintStart_toStartOf="@id/tvUserName" - app:layout_constraintTop_toBottomOf="@id/tvUserName" - tools:text="Android01@domain" /> - -</merge> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bcc468ab7..11fbb37d1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -202,8 +202,9 @@ <string name="media_usage_format">%s of %s used</string> <string name="group_invites_notification_format">Show %d Group invitations</string> <string name="circle_invites_notification_format">Show %d Circle invitations</string> - <string name="show_follow_requests_format">Show %d follow requests</string> + <string name="show_connection_invites_format">Show %d connection invites</string> <string name="my_connections">My Connections</string> + <string name="ignored">Ignored</string> <!-- Rich text editor --> <string name="rich_text_editor_format_bold">Apply bold format</string> diff --git a/core/src/main/java/org/futo/circles/core/extensions/ImageViewExtensions.kt b/core/src/main/java/org/futo/circles/core/extensions/ImageViewExtensions.kt index 66878e20a..983ed2df4 100644 --- a/core/src/main/java/org/futo/circles/core/extensions/ImageViewExtensions.kt +++ b/core/src/main/java/org/futo/circles/core/extensions/ImageViewExtensions.kt @@ -80,13 +80,14 @@ fun ImageView.loadRoomProfileIcon( fun ImageView.loadUserProfileIcon( url: String?, userId: String, - session: Session? = null + session: Session? = null, + applyBlur: Boolean = false ) { post { val svgString = Jdenticon.toSvg(userId, measuredWidth) val svg = SVG.getFromString(svgString) val placeholder = PictureDrawable(svg.renderToPicture()) - loadMatrixImage(url, placeholder = placeholder, session = session) + loadMatrixImage(url, placeholder = placeholder, session = session, applyBlur = applyBlur) } } diff --git a/core/src/main/java/org/futo/circles/core/feature/user/UserDialogFragment.kt b/core/src/main/java/org/futo/circles/core/feature/user/UserDialogFragment.kt index 2aa6f0500..bfda58da0 100644 --- a/core/src/main/java/org/futo/circles/core/feature/user/UserDialogFragment.kt +++ b/core/src/main/java/org/futo/circles/core/feature/user/UserDialogFragment.kt @@ -26,6 +26,7 @@ import org.futo.circles.core.feature.user.list.UsersCirclesAdapter import org.futo.circles.core.model.IgnoreUser import org.futo.circles.core.model.UnfollowTimeline import org.futo.circles.core.model.UnfollowUser +import org.futo.circles.core.provider.MatrixSessionProvider import org.futo.circles.core.view.EmptyTabPlaceholderView import org.matrix.android.sdk.api.session.user.model.User @@ -131,7 +132,7 @@ class UserDialogFragment : BaseFullscreenDialogFragment(DialogFragmentUserBindin }) viewModel.isUserIgnoredLiveData?.observeData(this) { isUserIgnored = it - binding.toolbar.invalidateMenu() + setupMenu() } viewModel.unFollowUserLiveData.observeResponse(this, success = { onBackPressed() }) -- GitLab