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 bbded269a084374e3da8375d51890b28b1d847df..f95099cac41385f3064d591193e1343c297dd6a3 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 6ae09bfa97f7e15a0c247c856f2a31315e886870..5a7c5aaae12dc893fcb815824ed05ffe4a356f2d 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 6cedc05405d98604b55252b157c974fb9800c2b2..ad76e1b906879bd80b95efed215650e14eded0c3 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 37815325cc0c77a1ddd11ba3f736ccbd78fad22a..0000000000000000000000000000000000000000 --- 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 18ece5ada327b399c38d8093c5fb1579b7cf8825..203038ffce2c6579c20734a7261c77cf6dfe21d9 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 c137e471133bce62eced4768f5a97856aa3b45fe..52924510a5d04620ee3eda750307a3eaffb13c3c 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 05961383a06482e87facd8ff54ccacfd6bba315e..0000000000000000000000000000000000000000 --- 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 bcc468ab7709bf00621d73000778b1f894156629..11fbb37d1a39926c98db6e9634b05efd0bba2194 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 66878e20a100fbff8eb885ddcebcde58e6c57b50..983ed2df4bfd2c0f0f0a7acbe668a196930f5bdd 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 2aa6f0500d8fcf675b232ed608ec318fc7f1639e..bfda58da06687ba4fbc69a4872a5889ff489c56a 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() })