/*
* Copyright 2014 OpenMarket Ltd
* Copyright 2017 Vector Creations 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 org.matrix.androidsdk.rest.model;
import android.text.TextUtils;
import org.matrix.androidsdk.util.Log;
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.security.acl.LastOwnerException;
import java.util.Comparator;
/**
* Class representing a room member: a user with membership information.
*/
public class RoomMember implements Externalizable {
public static final String MEMBERSHIP_JOIN = "join";
public static final String MEMBERSHIP_INVITE = "invite";
public static final String MEMBERSHIP_LEAVE = "leave";
public static final String MEMBERSHIP_BAN = "ban";
public String displayname;
public String avatarUrl;
public String membership;
public Invite thirdPartyInvite;
// tells that the inviter starts a direct chat room
public Boolean is_direct;
private String userId = null;
// timestamp of the event which has created this member
private long mOriginServerTs = -1;
// the id of the sender which has created this member
private String mInviter;
// the event used to build the room member
private String mOriginalEventId = null;
@Override
public void readExternal(ObjectInput input) throws IOException, ClassNotFoundException {
if (input.readBoolean()) {
displayname = input.readUTF();
}
if (input.readBoolean()) {
avatarUrl = input.readUTF();
}
if (input.readBoolean()) {
membership = input.readUTF();
}
if (input.readBoolean()) {
thirdPartyInvite = (Invite)input.readObject();
}
if (input.readBoolean()) {
is_direct = input.readBoolean();
}
if (input.readBoolean()) {
userId = input.readUTF();
}
mOriginServerTs = input.readLong();
if (input.readBoolean()) {
mInviter = input.readUTF();
}
if (input.readBoolean()) {
mOriginalEventId = input.readUTF();
}
}
@Override
public void writeExternal(ObjectOutput output) throws IOException {
output.writeBoolean(null != displayname);
if (null != displayname) {
output.writeUTF(displayname);
}
output.writeBoolean(null != avatarUrl);
if (null != avatarUrl) {
output.writeUTF(avatarUrl);
}
output.writeBoolean(null != membership);
if (null != membership) {
output.writeUTF(membership);
}
output.writeBoolean(null != thirdPartyInvite);
if (null != thirdPartyInvite) {
output.writeObject(thirdPartyInvite);
}
output.writeBoolean(null != is_direct);
if (null != is_direct) {
output.writeBoolean(is_direct);
}
output.writeBoolean(null != userId);
if (null != userId) {
output.writeUTF(userId);
}
output.writeLong(mOriginServerTs);
output.writeBoolean(null != mInviter);
if (null != mInviter) {
output.writeUTF(mInviter);
}
output.writeBoolean(null != mOriginalEventId);
if (null != mOriginalEventId) {
output.writeUTF(mOriginalEventId);
}
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public void setOriginServerTs(long aTs) {
mOriginServerTs = aTs;
}
public long getOriginServerTs() {
return mOriginServerTs;
}
public void setOriginalEventId(String eventId) {
mOriginalEventId = eventId;
}
public String getOriginalEventId() {
return mOriginalEventId;
}
public String getInviterId() {
return mInviter;
}
public void setInviterId(String userId) {
mInviter = userId;
}
public String getThirdPartyInviteToken() {
if ((null != thirdPartyInvite) && (null != thirdPartyInvite.signed)) {
return thirdPartyInvite.signed.token;
}
return null;
}
// Comparator to order members alphabetically
public static Comparator<RoomMember> alphaComparator = new Comparator<RoomMember>() {
@Override
public int compare(RoomMember member1, RoomMember member2) {
String lhs = member1.getName();
String rhs = member2.getName();
if (lhs == null) {
return -1;
}
else if (rhs == null) {
return 1;
}
if (lhs.startsWith("@")) {
lhs = lhs.substring(1);
}
if (rhs.startsWith("@")) {
rhs = rhs.substring(1);
}
return String.CASE_INSENSITIVE_ORDER.compare(lhs, rhs);
}
};
/**
* Test if a room member fields matches with a pattern.
* The check is done with the displayname and the userId.
* @param aPattern the pattern to search.
* @return true if it matches.
*/
public boolean matchWithPattern(String aPattern) {
if (TextUtils.isEmpty(aPattern) || TextUtils.isEmpty(aPattern.trim())) {
return false;
}
boolean res = false;
if (!TextUtils.isEmpty(displayname)) {
res = (displayname.toLowerCase().indexOf(aPattern) >= 0);
}
if (!res && !TextUtils.isEmpty(userId)) {
res = (userId.toLowerCase().indexOf(aPattern) >= 0);
}
return res;
}
/**
* Test if a room member matches with a reg ex.
* The check is done with the displayname and the userId.
* @param aRegEx the reg ex
* @return true if it matches.
*/
public boolean matchWithRegEx(String aRegEx) {
if (TextUtils.isEmpty(aRegEx)) {
return false;
}
boolean res = false;
if (!TextUtils.isEmpty(displayname)) {
res = displayname.matches(aRegEx);
}
if (!res && !TextUtils.isEmpty(userId)) {
res = userId.matches(aRegEx);
}
return res;
}
/**
* Compare two members.
* The members are equals if each field have the same value.
* @param otherMember the member to compare.
* @return true if they define the same member.
*/
public boolean equals(RoomMember otherMember) {
// compare to null
if (null == otherMember) {
return false;
}
// compare display name
boolean isEqual = TextUtils.equals(displayname, otherMember.displayname);
if (isEqual) {
isEqual = TextUtils.equals(avatarUrl, otherMember.avatarUrl);
}
if (isEqual) {
isEqual = TextUtils.equals(membership, otherMember.membership);
}
if (isEqual) {
isEqual = TextUtils.equals(userId, otherMember.userId);
}
return isEqual;
}
public String getName() {
if (displayname != null) {
return displayname;
}
if (userId != null) {
return userId;
}
return null;
}
public RoomMember deepCopy() {
RoomMember copy = new RoomMember();
copy.displayname = displayname;
copy.avatarUrl = avatarUrl;
copy.membership = membership;
copy.userId = userId;
copy.mOriginalEventId = mOriginalEventId;
return copy;
}
public boolean hasLeft() {
return RoomMember.MEMBERSHIP_BAN.equals(membership) || RoomMember.MEMBERSHIP_LEAVE.equals(membership);
}
}