diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 11fbb37d1a39926c98db6e9634b05efd0bba2194..265530ea73f1a1db179ee46ca30f612a65332e54 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -103,7 +103,6 @@ <string name="add_link">Add link</string> <string name="switch_user">Switch User</string> <string name="search_people">Search people</string> - <string name="wants_to_follow_you">wants to follow you</string> <string name="notification_unknown_room_name">Room</string> <string name="notification_new_invitation">New Invitation</string> <string name="sent_a_video">Video</string> diff --git a/core/src/main/java/org/futo/circles/core/feature/room/invites/InvitesDataSource.kt b/core/src/main/java/org/futo/circles/core/feature/room/invites/InvitesDataSource.kt index 8c557703f183425a62fee4180dae1df189304ae3..bfb75278ca2c52401e6d0a5fa21b7edba227e9e2 100644 --- a/core/src/main/java/org/futo/circles/core/feature/room/invites/InvitesDataSource.kt +++ b/core/src/main/java/org/futo/circles/core/feature/room/invites/InvitesDataSource.kt @@ -14,16 +14,22 @@ import org.futo.circles.core.extensions.createResult import org.futo.circles.core.extensions.getKnownUsersFlow import org.futo.circles.core.feature.room.knoks.KnockRequestsDataSource import org.futo.circles.core.feature.workspace.SharedCircleDataSource +import org.futo.circles.core.mapping.toCirclesUserSummary +import org.futo.circles.core.model.ConnectionInviteListItem import org.futo.circles.core.model.FollowRequestListItem import org.futo.circles.core.model.GALLERY_TYPE import org.futo.circles.core.model.GROUP_TYPE +import org.futo.circles.core.model.InviteHeader +import org.futo.circles.core.model.InviteListItem import org.futo.circles.core.model.InviteTypeArg import org.futo.circles.core.model.RoomInviteListItem import org.futo.circles.core.model.TIMELINE_TYPE +import org.futo.circles.core.model.convertToCircleRoomType import org.futo.circles.core.model.toCircleUser import org.futo.circles.core.model.toRoomInviteListItem import org.futo.circles.core.provider.MatrixSessionProvider import org.matrix.android.sdk.api.session.getRoom +import org.matrix.android.sdk.api.session.getUserOrDefault 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.RoomType @@ -40,15 +46,45 @@ class InvitesDataSource @Inject constructor( private val roomIdsToUnblurProfile = MutableStateFlow<Set<String>>(emptySet()) fun getInvitesFlow(type: InviteTypeArg) = when (type) { - InviteTypeArg.People -> getProfileRoomMembersKnockFlow() + InviteTypeArg.People -> getPeopleInvites() else -> getRoomInvitesFlow(type) } + private fun getPeopleInvites() = combine( + getProfileSpaceInvitesFlow(), + getProfileRoomMembersKnockFlow() + ) { invites, knocks -> + val list = mutableListOf<InviteListItem>() + if (invites.isNotEmpty()) { + list.add(InviteHeader.connectInvitesHeader) + list.addAll(invites) + } + if (knocks.isNotEmpty()) { + list.add(InviteHeader.followRequestHeader) + list.addAll(knocks) + } + list + } + private fun getProfileRoomMembersKnockFlow(): Flow<List<FollowRequestListItem>> = knockRequestsDataSource.getKnockRequestsListItemsLiveData(profileRoomId)?.map { list -> list.map { FollowRequestListItem(it.toCircleUser(), it.message) } }?.asFlow() ?: flowOf() + private fun getProfileSpaceInvitesFlow(): Flow<List<ConnectionInviteListItem>> = + session?.roomService()?.getRoomSummariesLive( + roomSummaryQueryParams { + excludeType = null + memberships = listOf(Membership.INVITE) + })?.map { + it.filter { it.roomType == RoomType.SPACE }.map { + ConnectionInviteListItem( + it.roomId, + session.getUserOrDefault(it.inviterId ?: "").toCirclesUserSummary() + ) + } + }?.asFlow() ?: flowOf() + private fun getRoomInvitesFlow( inviteType: InviteTypeArg ): Flow<List<RoomInviteListItem>> = combine( @@ -72,7 +108,7 @@ class InvitesDataSource @Inject constructor( } }.map { it.toRoomInviteListItem( - inviteType, + convertToCircleRoomType(it.roomType), shouldBlurIconFor(it, knownUsersIds, roomIdsToUnblur) ) } diff --git a/core/src/main/java/org/futo/circles/core/feature/room/invites/InvitesDialogFragment.kt b/core/src/main/java/org/futo/circles/core/feature/room/invites/InvitesDialogFragment.kt index 580649a0cc4be76356caa8c4675cf23b9f8bbb46..93a961d460189a48a2b22b3ae6fb30769d1eff69 100644 --- a/core/src/main/java/org/futo/circles/core/feature/room/invites/InvitesDialogFragment.kt +++ b/core/src/main/java/org/futo/circles/core/feature/room/invites/InvitesDialogFragment.kt @@ -15,8 +15,11 @@ import org.futo.circles.core.extensions.observeResponse import org.futo.circles.core.extensions.showNoInternetConnection import org.futo.circles.core.feature.room.invites.list.InvitesAdapter import org.futo.circles.core.model.CircleRoomTypeArg +import org.futo.circles.core.model.ConnectionInviteListItem +import org.futo.circles.core.model.FollowRequestListItem import org.futo.circles.core.model.InviteListItem import org.futo.circles.core.model.InviteTypeArg +import org.futo.circles.core.model.RoomInviteListItem import org.futo.circles.core.view.EmptyTabPlaceholderView @AndroidEntryPoint @@ -66,7 +69,7 @@ class InvitesDialogFragment : BaseFullscreenDialogFragment(DialogFragmentInvites InviteTypeArg.Circle -> R.string.circle_invitations InviteTypeArg.Group -> R.string.group_invitations InviteTypeArg.Photo -> R.string.gallery_invitations - InviteTypeArg.People -> R.string.follow_requests + InviteTypeArg.People -> R.string.connection_invites_requests } ) @@ -74,16 +77,26 @@ class InvitesDialogFragment : BaseFullscreenDialogFragment(DialogFragmentInvites private fun onInviteClicked(item: InviteListItem, isAccepted: Boolean) { if (showNoInternetConnection()) return - when (item.inviteType) { - InviteTypeArg.Circle -> if (isAccepted) onAcceptCircleInviteClicked(item.id) - else viewModel.rejectRoomInvite(item.id) + when (item) { + is ConnectionInviteListItem -> viewModel.onConnectionInviteAnswered( + item.roomId, isAccepted + ) + + is FollowRequestListItem -> viewModel.onFollowRequestAnswered(item.id, isAccepted) + is RoomInviteListItem -> when (item.roomType) { + CircleRoomTypeArg.Circle -> handleCircleInvite(item.id, isAccepted) + else -> handleRoomInvite(item.id, isAccepted, item.roomType) + } - InviteTypeArg.Group -> handleRoomInvite(item.id, isAccepted, CircleRoomTypeArg.Group) - InviteTypeArg.Photo -> handleRoomInvite(item.id, isAccepted, CircleRoomTypeArg.Photo) - InviteTypeArg.People -> viewModel.onFollowRequestAnswered(item.id, isAccepted) + else -> {} } } + private fun handleCircleInvite(roomId: String, isAccepted: Boolean) { + if (isAccepted) onAcceptCircleInviteClicked(roomId) + else viewModel.rejectRoomInvite(roomId) + } + private fun handleRoomInvite(roomId: String, isAccepted: Boolean, type: CircleRoomTypeArg) { if (isAccepted) viewModel.acceptRoomInvite(roomId, type) else viewModel.rejectRoomInvite(roomId) diff --git a/core/src/main/java/org/futo/circles/core/feature/room/invites/InvitesViewModel.kt b/core/src/main/java/org/futo/circles/core/feature/room/invites/InvitesViewModel.kt index bc0ab872ecab923b92a97c2dd29e25bb14a5437f..eafb2308fca561599efef7c1e5c35387b1cdacba 100644 --- a/core/src/main/java/org/futo/circles/core/feature/room/invites/InvitesViewModel.kt +++ b/core/src/main/java/org/futo/circles/core/feature/room/invites/InvitesViewModel.kt @@ -9,6 +9,7 @@ import org.futo.circles.core.extensions.Response import org.futo.circles.core.extensions.getOrThrow import org.futo.circles.core.extensions.launchBg import org.futo.circles.core.feature.room.invite.ManageInviteRequestsDataSource +import org.futo.circles.core.feature.workspace.SharedCircleDataSource import org.futo.circles.core.model.CircleRoomTypeArg import org.futo.circles.core.model.InviteTypeArg import javax.inject.Inject @@ -17,7 +18,8 @@ import javax.inject.Inject class InvitesViewModel @Inject constructor( savedStateHandle: SavedStateHandle, private val dataSource: InvitesDataSource, - private val manageInviteRequestsDataSource: ManageInviteRequestsDataSource + private val manageInviteRequestsDataSource: ManageInviteRequestsDataSource, + private val sharedCircleDataSource: SharedCircleDataSource ) : ViewModel() { private val inviteType: InviteTypeArg = savedStateHandle.getOrThrow("type") @@ -41,7 +43,6 @@ class InvitesViewModel @Inject constructor( } } - fun onFollowRequestAnswered(userId: String, accepted: Boolean) { launchBg { val result = if (accepted) dataSource.acceptFollowRequest(userId) @@ -50,10 +51,18 @@ class InvitesViewModel @Inject constructor( } } - fun unblurProfileIcon(roomId: String) { dataSource.unblurProfileImageFor(roomId) } + fun onConnectionInviteAnswered(roomId: String, accepted: Boolean) { + if (accepted) + launchBg { + val result = sharedCircleDataSource.acceptSharedCircleInvite(roomId) + inviteResultLiveData.postValue(result) + } + else rejectRoomInvite(roomId) + } + } \ No newline at end of file diff --git a/core/src/main/java/org/futo/circles/core/feature/room/invites/list/InvitesAdapter.kt b/core/src/main/java/org/futo/circles/core/feature/room/invites/list/InvitesAdapter.kt index 95e490b3b28c0fb954c76c2589aa010f52ff3e70..3a619e8e3319105b34e09652423c85f678868eb9 100644 --- a/core/src/main/java/org/futo/circles/core/feature/room/invites/list/InvitesAdapter.kt +++ b/core/src/main/java/org/futo/circles/core/feature/room/invites/list/InvitesAdapter.kt @@ -2,22 +2,36 @@ package org.futo.circles.core.feature.room.invites.list import android.view.ViewGroup import org.futo.circles.core.base.list.BaseRvAdapter +import org.futo.circles.core.model.CircleRoomTypeArg +import org.futo.circles.core.model.ConnectionInviteListItem +import org.futo.circles.core.model.FollowRequestListItem +import org.futo.circles.core.model.InviteHeader import org.futo.circles.core.model.InviteListItem -import org.futo.circles.core.model.InviteTypeArg +import org.futo.circles.core.model.RoomInviteListItem +enum class InviteViewType { Circle, Group, Photo, Header, PeopleInvite, PeopleKnock } class InvitesAdapter( private val onInviteClicked: (InviteListItem, Boolean) -> Unit, private val onUnblurProfileIconClicked: (InviteListItem) -> Unit ) : BaseRvAdapter<InviteListItem, InviteViewHolder>(DefaultIdEntityCallback()) { - override fun getItemViewType(position: Int): Int = getItem(position).inviteType.ordinal + override fun getItemViewType(position: Int): Int = when (val item = getItem(position)) { + is ConnectionInviteListItem -> InviteViewType.PeopleInvite.ordinal + is FollowRequestListItem -> InviteViewType.PeopleKnock.ordinal + is InviteHeader -> InviteViewType.Header.ordinal + is RoomInviteListItem -> when (item.roomType) { + CircleRoomTypeArg.Circle -> InviteViewType.Circle.ordinal + CircleRoomTypeArg.Group -> InviteViewType.Group.ordinal + CircleRoomTypeArg.Photo -> InviteViewType.Photo.ordinal + } + } override fun onCreateViewHolder( parent: ViewGroup, viewType: Int - ) = when (InviteTypeArg.entries[viewType]) { - InviteTypeArg.Circle -> InvitedCircleViewHolder( + ) = when (InviteViewType.entries[viewType]) { + InviteViewType.Circle -> InvitedCircleViewHolder( parent = parent, onInviteClicked = { position, isAccepted -> onInviteClicked(getItem(position), isAccepted) @@ -26,7 +40,7 @@ class InvitesAdapter( onUnblurProfileIconClicked(getItem(position)) }) - InviteTypeArg.Group -> InvitedGroupViewHolder( + InviteViewType.Group -> InvitedGroupViewHolder( parent = parent, onInviteClicked = { position, isAccepted -> onInviteClicked(getItem(position), isAccepted) @@ -35,16 +49,24 @@ class InvitesAdapter( onUnblurProfileIconClicked(getItem(position)) }) - InviteTypeArg.Photo -> InvitedGalleryViewHolder( + InviteViewType.Photo -> + InvitedGalleryViewHolder( + parent = parent, + onInviteClicked = { position, isAccepted -> + onInviteClicked(getItem(position), isAccepted) + }, + onShowProfileIconClicked = { position -> + onUnblurProfileIconClicked(getItem(position)) + }) + + InviteViewType.Header -> InviteHeaderViewHolder(parent) + InviteViewType.PeopleInvite -> ConnectionInviteViewHolder( parent = parent, - onInviteClicked = { position, isAccepted -> + onRequestClicked = { position, isAccepted -> onInviteClicked(getItem(position), isAccepted) - }, - onShowProfileIconClicked = { position -> - onUnblurProfileIconClicked(getItem(position)) }) - InviteTypeArg.People -> FollowRequestViewHolder( + InviteViewType.PeopleKnock -> FollowRequestViewHolder( parent = parent, onRequestClicked = { position, isAccepted -> onInviteClicked(getItem(position), isAccepted) diff --git a/core/src/main/java/org/futo/circles/core/feature/room/invites/list/InvitesViewHolder.kt b/core/src/main/java/org/futo/circles/core/feature/room/invites/list/InvitesViewHolder.kt index a828270461566ab84e7693aea41eed144a709eda..751bdaa70c61224f955fb02fb67a64b58110485f 100644 --- a/core/src/main/java/org/futo/circles/core/feature/room/invites/list/InvitesViewHolder.kt +++ b/core/src/main/java/org/futo/circles/core/feature/room/invites/list/InvitesViewHolder.kt @@ -6,6 +6,8 @@ import androidx.recyclerview.widget.RecyclerView import org.futo.circles.core.R import org.futo.circles.core.base.list.ViewBindingHolder import org.futo.circles.core.base.list.context +import org.futo.circles.core.databinding.ListItemConnectionInviteBinding +import org.futo.circles.core.databinding.ListItemInviteHeaderBinding import org.futo.circles.core.databinding.ListItemInvitedCircleBinding import org.futo.circles.core.databinding.ListItemInvitedGalleryBinding import org.futo.circles.core.databinding.ListItemInvitedGroupBinding @@ -17,6 +19,7 @@ import org.futo.circles.core.extensions.setIsEncryptedIcon import org.futo.circles.core.extensions.setIsVisible import org.futo.circles.core.model.CirclesUserSummary import org.futo.circles.core.model.FollowRequestListItem +import org.futo.circles.core.model.InviteHeader import org.futo.circles.core.model.InviteListItem import org.futo.circles.core.model.RoomInviteListItem @@ -159,3 +162,44 @@ class FollowRequestViewHolder( } } } + +class ConnectionInviteViewHolder( + parent: ViewGroup, + private val onRequestClicked: (Int, Boolean) -> Unit +) : InviteViewHolder(inflate(parent, ListItemConnectionInviteBinding::inflate)) { + + private companion object : ViewBindingHolder + + private val binding = baseBinding as ListItemConnectionInviteBinding + + init { + onClick(binding.btnAccept) { position -> onRequestClicked(position, true) } + onClick(binding.btnDecline) { position -> onRequestClicked(position, false) } + } + + override fun bind(data: InviteListItem) { + val user = (data as? FollowRequestListItem)?.user ?: return + bindUser(user) + } + + private fun bindUser(user: CirclesUserSummary) { + with(binding) { + tvUserName.text = user.name + ivUserImage.loadUserProfileIcon(user.avatarUrl, user.id) + } + } +} + +class InviteHeaderViewHolder( + parent: ViewGroup, +) : InviteViewHolder(inflate(parent, ListItemInviteHeaderBinding::inflate)) { + + private companion object : ViewBindingHolder + + private val binding = baseBinding as ListItemInviteHeaderBinding + + override fun bind(data: InviteListItem) { + if (data !is InviteHeader) return + binding.tvHeader.text = context.getString(data.titleRes) + } +} diff --git a/core/src/main/java/org/futo/circles/core/feature/workspace/SharedCircleDataSource.kt b/core/src/main/java/org/futo/circles/core/feature/workspace/SharedCircleDataSource.kt index 900d9666415c83b3ce7f184f6104cc320c480712..08f95dd54097e356cb57459e241e41339c567839 100644 --- a/core/src/main/java/org/futo/circles/core/feature/workspace/SharedCircleDataSource.kt +++ b/core/src/main/java/org/futo/circles/core/feature/workspace/SharedCircleDataSource.kt @@ -1,12 +1,12 @@ package org.futo.circles.core.feature.workspace +import org.futo.circles.core.extensions.createResult import org.futo.circles.core.extensions.getRoomOwner import org.futo.circles.core.feature.room.RoomRelationsBuilder import org.futo.circles.core.model.PROFILE_SPACE_ACCOUNT_DATA_KEY import org.futo.circles.core.provider.MatrixSessionProvider import org.futo.circles.core.utils.getJoinedRoomById import org.futo.circles.core.utils.getTimelineRoomFor -import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.getRoomSummary import org.matrix.android.sdk.api.session.room.model.RoomSummary import javax.inject.Inject @@ -56,9 +56,10 @@ class SharedCircleDataSource @Inject constructor( return sharedCirclesTimelineIds.contains(timelineId) } - private suspend fun acceptSharedCircleInvite(session: Session, roomId: String) { - session.roomService().joinRoom(roomId) - val sharedCirclesSpaceId = getSharedCirclesSpaceId() ?: return + suspend fun acceptSharedCircleInvite(roomId: String) = createResult { + MatrixSessionProvider.getSessionOrThrow().roomService().joinRoom(roomId) + val sharedCirclesSpaceId = + getSharedCirclesSpaceId() ?: throw IllegalArgumentException("Profile space not found") roomRelationsBuilder.setRelations(roomId, sharedCirclesSpaceId) } } \ No newline at end of file diff --git a/core/src/main/java/org/futo/circles/core/model/CircleRoomTypeArg.kt b/core/src/main/java/org/futo/circles/core/model/CircleRoomTypeArg.kt index ee94c2cd42a961c66ec675a39988e4b25d7dbbbd..1178ad13a17c6665048692b2edd468f35a40e866 100644 --- a/core/src/main/java/org/futo/circles/core/model/CircleRoomTypeArg.kt +++ b/core/src/main/java/org/futo/circles/core/model/CircleRoomTypeArg.kt @@ -6,4 +6,11 @@ fun CircleRoomTypeArg.toShareUrlType() = when (this) { CircleRoomTypeArg.Circle -> ShareUrlTypeArg.TIMELINE CircleRoomTypeArg.Group -> ShareUrlTypeArg.GROUP CircleRoomTypeArg.Photo -> ShareUrlTypeArg.GALLERY -} \ No newline at end of file +} + +fun convertToCircleRoomType(roomType: String?) = when (roomType) { + GROUP_TYPE -> CircleRoomTypeArg.Group + TIMELINE_TYPE -> CircleRoomTypeArg.Circle + GALLERY_TYPE -> CircleRoomTypeArg.Photo + else -> CircleRoomTypeArg.Group +} diff --git a/core/src/main/java/org/futo/circles/core/model/InviteListItem.kt b/core/src/main/java/org/futo/circles/core/model/InviteListItem.kt index 51039bda2e837edb1e882ea34a11e1574198ed06..7cd4a690ab9cd53b2b134e99c83132c364d5b7de 100644 --- a/core/src/main/java/org/futo/circles/core/model/InviteListItem.kt +++ b/core/src/main/java/org/futo/circles/core/model/InviteListItem.kt @@ -1,5 +1,6 @@ package org.futo.circles.core.model +import org.futo.circles.core.R import org.futo.circles.core.base.list.IdEntity import org.futo.circles.core.extensions.notEmptyDisplayName import org.futo.circles.core.mapping.toRoomInfo @@ -8,32 +9,46 @@ import org.matrix.android.sdk.api.session.getUserOrDefault import org.matrix.android.sdk.api.session.room.model.RoomSummary sealed class InviteListItem( - override val id: String, - open val inviteType: InviteTypeArg + override val id: String ) : IdEntity<String> + +data class InviteHeader( + val titleRes: Int +) : InviteListItem(titleRes.toString()) { + companion object { + val connectInvitesHeader = InviteHeader(R.string.invites) + val followRequestHeader = InviteHeader(R.string.requests) + } +} + data class RoomInviteListItem( val roomId: String, - override val inviteType: InviteTypeArg, + val roomType: CircleRoomTypeArg, val info: RoomInfo, val isEncrypted: Boolean, val inviterName: String, val shouldBlurIcon: Boolean -) : InviteListItem(roomId, inviteType) +) : InviteListItem(roomId) data class FollowRequestListItem( val user: CirclesUserSummary, val reasonMessage: String? -) : InviteListItem(user.id, InviteTypeArg.People) +) : InviteListItem(user.id) + +data class ConnectionInviteListItem( + val roomId: String, + val user: CirclesUserSummary, +) : InviteListItem(roomId) -fun RoomSummary.toRoomInviteListItem(inviteType: InviteTypeArg, shouldBlurIcon: Boolean) = +fun RoomSummary.toRoomInviteListItem(roomType: CircleRoomTypeArg, shouldBlurIcon: Boolean) = RoomInviteListItem( roomId = roomId, info = toRoomInfo(), inviterName = getInviterName(), isEncrypted = isEncrypted, shouldBlurIcon = shouldBlurIcon, - inviteType = inviteType + roomType = roomType ) fun RoomSummary.getInviterName() = diff --git a/core/src/main/res/layout/list_item_connection_invite.xml b/core/src/main/res/layout/list_item_connection_invite.xml new file mode 100644 index 0000000000000000000000000000000000000000..1e9d9a3718c80298b10a6da164b3cf8106cb96ea --- /dev/null +++ b/core/src/main/res/layout/list_item_connection_invite.xml @@ -0,0 +1,81 @@ +<?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:paddingHorizontal="8dp" + android:paddingVertical="4dp" + tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout"> + + <com.google.android.material.imageview.ShapeableImageView + android:id="@+id/ivUserImage" + android:layout_width="72dp" + android:layout_height="72dp" + android:scaleType="centerCrop" + 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/tvInvitesToConnect" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toEndOf="@id/ivUserImage" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_chainStyle="packed" + tools:text="Android01" /> + + <TextView + android:id="@+id/tvInvitesToConnect" + style="@style/subheadline" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:ellipsize="end" + android:lines="1" + android:text="@string/invites_you_to_connect" + android:textSize="13sp" + app:layout_constraintEnd_toEndOf="@id/tvUserName" + app:layout_constraintStart_toStartOf="@id/tvUserName" + app:layout_constraintTop_toBottomOf="@id/tvUserName" /> + + + <com.google.android.material.button.MaterialButton + android:id="@+id/btnAccept" + style="@style/AccentButtonStyle" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="4dp" + android:layout_marginEnd="8dp" + android:padding="0dp" + android:text="@string/accept" + android:textSize="14sp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toStartOf="@id/btnDecline" + app:layout_constraintStart_toEndOf="@id/ivUserImage" + app:layout_constraintTop_toBottomOf="@id/tvInvitesToConnect" + + /> + + <com.google.android.material.button.MaterialButton + android:id="@+id/btnDecline" + style="@style/NegativeButtonStyle" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:padding="0dp" + android:text="@string/decline" + android:textSize="14sp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toEndOf="@id/btnAccept" + app:layout_constraintTop_toTopOf="@id/btnAccept" /> + +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/core/src/main/res/layout/list_item_people_request.xml b/core/src/main/res/layout/list_item_people_request.xml index 1c760fdfa8cbd57782b08c81a5b2a581ead3625e..7315a0483d7eb54de5ca420b9fbab1f1ec389c92 100644 --- a/core/src/main/res/layout/list_item_people_request.xml +++ b/core/src/main/res/layout/list_item_people_request.xml @@ -41,7 +41,7 @@ android:layout_height="wrap_content" android:ellipsize="end" android:lines="1" - android:text="@string/wants_to_follow_you" + android:text="@string/requests_to_follow_you" android:textSize="13sp" app:layout_constraintEnd_toEndOf="@id/tvUserName" app:layout_constraintStart_toStartOf="@id/tvUserName" diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index e9c97fd11bd275fb56b3d8518f5376fca79aba89..6af3af1dbc7b45cd6304d5bf464c2174712f2b6d 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -145,7 +145,7 @@ <string name="create">Create</string> <string name="show">Show</string> <string name="gallery_invites_notification_format">Show %d Gallery invitations</string> - <string name="follow_requests">Follow requests</string> + <string name="connection_invites_requests">Connection invites/requests</string> <string name="group_invitations">Group invitations</string> <string name="gallery_invitations">Gallery invitations</string> <string name="circle_invitations">Circle invitations</string> @@ -162,4 +162,8 @@ <string name="user_ignored">User ignored</string> <string name="user_unignored">User un ignored</string> <string name="not_following_any_circles_format">Not following any Circles for %s</string> + <string name="requests_to_follow_you">requests to follow you</string> + <string name="invites_you_to_connect">invites you to connect</string> + <string name="invites">Invites</string> + <string name="requests">Requests</string> </resources> \ No newline at end of file