2019-01-18 10:12:08 +00:00
/ *
2019-01-25 13:04:59 +00:00
* Copyright 2019 New Vector Ltd
2019-01-18 10:12:08 +00:00
*
2019-01-25 13:04:59 +00:00
* 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
2019-01-18 10:12:08 +00:00
*
2019-01-25 13:04:59 +00:00
* 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 .
2019-01-18 10:12:08 +00:00
* /
2019-01-15 14:47:03 +00:00
package im.vector.riotredesign.features.home.room.detail.timeline
import android.text.TextUtils
2019-01-18 15:26:17 +00:00
import im.vector.matrix.android.api.session.room.timeline.TimelineEvent
2019-01-15 14:47:03 +00:00
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.riotredesign.R
import im.vector.riotredesign.core.resources.StringProvider
//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 , roomMember . avatarUrl , 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
}
}
}