forked from GitHub-Mirror/riotX-android
131 lines
6.7 KiB
Kotlin
131 lines
6.7 KiB
Kotlin
/*
|
|
* Copyright 2019 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.riotredesign.features.home.room.detail.timeline.factory
|
|
|
|
import android.text.TextUtils
|
|
import im.vector.matrix.android.api.session.events.model.toModel
|
|
import im.vector.matrix.android.api.session.room.model.Membership
|
|
import im.vector.matrix.android.api.session.room.model.RoomMember
|
|
import im.vector.matrix.android.api.session.room.timeline.TimelineEvent
|
|
import im.vector.riotredesign.R
|
|
import im.vector.riotredesign.core.resources.StringProvider
|
|
import im.vector.riotredesign.features.home.room.detail.timeline.item.NoticeItem
|
|
import im.vector.riotredesign.features.home.room.detail.timeline.item.NoticeItem_
|
|
|
|
|
|
//TODO : complete with call membership events¬
|
|
class RoomMemberItemFactory(private val stringProvider: StringProvider) {
|
|
|
|
fun create(event: TimelineEvent): NoticeItem? {
|
|
val roomMember = event.roomMember ?: return null
|
|
val noticeText = buildRoomMemberNotice(event) ?: return null
|
|
return NoticeItem_()
|
|
.noticeText(noticeText)
|
|
.avatarUrl(roomMember.avatarUrl)
|
|
.memberName(roomMember.displayName)
|
|
}
|
|
|
|
private fun buildRoomMemberNotice(event: TimelineEvent): String? {
|
|
val eventContent: RoomMember? = event.root.content.toModel()
|
|
val prevEventContent: RoomMember? = event.root.prevContent.toModel()
|
|
val isMembershipEvent = prevEventContent?.membership != eventContent?.membership
|
|
return if (isMembershipEvent) {
|
|
buildMembershipNotice(event, eventContent, prevEventContent)
|
|
} else {
|
|
buildProfileNotice(event, eventContent, prevEventContent)
|
|
}
|
|
}
|
|
|
|
private fun buildProfileNotice(event: TimelineEvent, eventContent: RoomMember?, prevEventContent: RoomMember?): String? {
|
|
val displayText = StringBuilder()
|
|
// Check display name has been changed
|
|
if (!TextUtils.equals(eventContent?.displayName, prevEventContent?.displayName)) {
|
|
val displayNameText = when {
|
|
prevEventContent?.displayName.isNullOrEmpty() ->
|
|
stringProvider.getString(R.string.notice_display_name_set, event.root.sender, eventContent?.displayName)
|
|
eventContent?.displayName.isNullOrEmpty() ->
|
|
stringProvider.getString(R.string.notice_display_name_removed, event.root.sender, prevEventContent?.displayName)
|
|
else ->
|
|
stringProvider.getString(R.string.notice_display_name_changed_from,
|
|
event.root.sender, prevEventContent?.displayName, eventContent?.displayName)
|
|
}
|
|
displayText.append(displayNameText)
|
|
}
|
|
// Check whether the avatar has been changed
|
|
if (!TextUtils.equals(eventContent?.avatarUrl, prevEventContent?.avatarUrl)) {
|
|
val displayAvatarText = if (displayText.isNotEmpty()) {
|
|
displayText.append(" ")
|
|
stringProvider.getString(R.string.notice_avatar_changed_too)
|
|
} else {
|
|
stringProvider.getString(R.string.notice_avatar_url_changed, event.roomMember?.displayName)
|
|
}
|
|
displayText.append(displayAvatarText)
|
|
}
|
|
return displayText.toString()
|
|
}
|
|
|
|
private fun buildMembershipNotice(event: TimelineEvent, eventContent: RoomMember?, prevEventContent: RoomMember?): String? {
|
|
val senderDisplayName = event.roomMember?.displayName ?: return null
|
|
val targetDisplayName = eventContent?.displayName ?: event.root.sender
|
|
return when {
|
|
Membership.INVITE == eventContent?.membership -> {
|
|
// TODO get userId
|
|
val selfUserId: String = ""
|
|
when {
|
|
eventContent.thirdPartyInvite != null ->
|
|
stringProvider.getString(R.string.notice_room_third_party_registered_invite,
|
|
targetDisplayName, eventContent.thirdPartyInvite?.displayName)
|
|
TextUtils.equals(event.root.stateKey, selfUserId) ->
|
|
stringProvider.getString(R.string.notice_room_invite_you, senderDisplayName)
|
|
event.root.stateKey.isNullOrEmpty() ->
|
|
stringProvider.getString(R.string.notice_room_invite_no_invitee, senderDisplayName)
|
|
else ->
|
|
stringProvider.getString(R.string.notice_room_invite, senderDisplayName, targetDisplayName)
|
|
}
|
|
}
|
|
Membership.JOIN == eventContent?.membership ->
|
|
stringProvider.getString(R.string.notice_room_join, senderDisplayName)
|
|
Membership.LEAVE == eventContent?.membership ->
|
|
// 2 cases here: this member may have left voluntarily or they may have been "left" by someone else ie. kicked
|
|
return if (TextUtils.equals(event.root.sender, event.root.stateKey)) {
|
|
if (prevEventContent?.membership == Membership.INVITE) {
|
|
stringProvider.getString(R.string.notice_room_reject, senderDisplayName)
|
|
} else {
|
|
stringProvider.getString(R.string.notice_room_leave, senderDisplayName)
|
|
}
|
|
} else if (prevEventContent?.membership == Membership.INVITE) {
|
|
stringProvider.getString(R.string.notice_room_withdraw, senderDisplayName, targetDisplayName)
|
|
} else if (prevEventContent?.membership == Membership.JOIN) {
|
|
stringProvider.getString(R.string.notice_room_kick, senderDisplayName, targetDisplayName)
|
|
} else if (prevEventContent?.membership == Membership.BAN) {
|
|
stringProvider.getString(R.string.notice_room_unban, senderDisplayName, targetDisplayName)
|
|
} else {
|
|
null
|
|
}
|
|
Membership.BAN == eventContent?.membership ->
|
|
stringProvider.getString(R.string.notice_room_ban, senderDisplayName, targetDisplayName)
|
|
Membership.KNOCK == eventContent?.membership ->
|
|
stringProvider.getString(R.string.notice_room_kick, senderDisplayName, targetDisplayName)
|
|
else -> null
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|