use of org.matrix.androidsdk.rest.model.pid.RoomThirdPartyInvite in project matrix-android-sdk by matrix-org.
the class RoomState method readExternal.
@Override
public void readExternal(ObjectInput input) throws IOException, ClassNotFoundException {
if (input.readBoolean()) {
roomId = input.readUTF();
}
if (input.readBoolean()) {
powerLevels = (PowerLevels) input.readObject();
}
if (input.readBoolean()) {
aliases = (List<String>) input.readObject();
}
List<Event> roomAliasesEvents = (List<Event>) input.readObject();
for (Event e : roomAliasesEvents) {
mRoomAliases.put(e.stateKey, e);
}
mAliasesByDomain = (Map<String, List<String>>) input.readObject();
if (input.readBoolean()) {
mMergedAliasesList = (List<String>) input.readObject();
}
Map<String, List<Event>> stateEvents = (Map<String, List<Event>>) input.readObject();
if (null != stateEvents) {
mStateEvents = new HashMap<>(stateEvents);
}
if (input.readBoolean()) {
alias = input.readUTF();
}
if (input.readBoolean()) {
name = input.readUTF();
}
if (input.readBoolean()) {
topic = input.readUTF();
}
if (input.readBoolean()) {
url = input.readUTF();
}
if (input.readBoolean()) {
avatar_url = input.readUTF();
}
if (input.readBoolean()) {
creator = input.readUTF();
}
if (input.readBoolean()) {
join_rule = input.readUTF();
}
if (input.readBoolean()) {
guest_access = input.readUTF();
}
if (input.readBoolean()) {
history_visibility = input.readUTF();
}
if (input.readBoolean()) {
roomAliasName = input.readUTF();
}
if (input.readBoolean()) {
visibility = input.readUTF();
}
if (input.readBoolean()) {
algorithm = input.readUTF();
}
mNotificationCount = input.readInt();
mHighlightCount = input.readInt();
if (input.readBoolean()) {
token = input.readUTF();
}
List<RoomMember> members = (List<RoomMember>) input.readObject();
for (RoomMember r : members) {
mMembers.put(r.getUserId(), r);
}
List<RoomThirdPartyInvite> invites = (List<RoomThirdPartyInvite>) input.readObject();
for (RoomThirdPartyInvite i : invites) {
mThirdPartyInvites.put(i.token, i);
}
List<RoomMember> inviteTokens = (List<RoomMember>) input.readObject();
for (RoomMember r : inviteTokens) {
mMembersWithThirdPartyInviteTokenCache.put(r.getThirdPartyInviteToken(), r);
}
if (input.readBoolean()) {
mMembership = input.readUTF();
}
mIsLive = input.readBoolean();
if (input.readBoolean()) {
mIsConferenceUserRoom = input.readBoolean();
}
if (input.readBoolean()) {
groups = (List<String>) input.readObject();
}
}
use of org.matrix.androidsdk.rest.model.pid.RoomThirdPartyInvite in project matrix-android-sdk by matrix-org.
the class EventDisplay method getTextualDisplay.
/**
* Stringify the linked event.
*
* @param displayNameColor the display name highlighted color.
* @return The text or null if it isn't possible.
*/
public CharSequence getTextualDisplay(Integer displayNameColor) {
CharSequence text = null;
try {
JsonObject jsonEventContent = mEvent.getContentAsJsonObject();
String userDisplayName = getUserDisplayName(mEvent.getSender(), mRoomState);
String eventType = mEvent.getType();
if (mEvent.isCallEvent()) {
if (Event.EVENT_TYPE_CALL_INVITE.equals(eventType)) {
boolean isVideo = false;
// detect call type from the sdp
try {
JsonObject offer = jsonEventContent.get("offer").getAsJsonObject();
JsonElement sdp = offer.get("sdp");
String sdpValue = sdp.getAsString();
isVideo = sdpValue.contains("m=video");
} catch (Exception e) {
Log.e(LOG_TAG, "getTextualDisplay : " + e.getMessage());
}
if (isVideo) {
return mContext.getString(R.string.notice_placed_video_call, userDisplayName);
} else {
return mContext.getString(R.string.notice_placed_voice_call, userDisplayName);
}
} else if (Event.EVENT_TYPE_CALL_ANSWER.equals(eventType)) {
return mContext.getString(R.string.notice_answered_call, userDisplayName);
} else if (Event.EVENT_TYPE_CALL_HANGUP.equals(eventType)) {
return mContext.getString(R.string.notice_ended_call, userDisplayName);
} else {
return eventType;
}
} else if (Event.EVENT_TYPE_STATE_HISTORY_VISIBILITY.equals(eventType)) {
CharSequence subpart;
String historyVisibility = (null != jsonEventContent.get("history_visibility")) ? jsonEventContent.get("history_visibility").getAsString() : RoomState.HISTORY_VISIBILITY_SHARED;
if (TextUtils.equals(historyVisibility, RoomState.HISTORY_VISIBILITY_SHARED)) {
subpart = mContext.getString(R.string.notice_room_visibility_shared);
} else if (TextUtils.equals(historyVisibility, RoomState.HISTORY_VISIBILITY_INVITED)) {
subpart = mContext.getString(R.string.notice_room_visibility_invited);
} else if (TextUtils.equals(historyVisibility, RoomState.HISTORY_VISIBILITY_JOINED)) {
subpart = mContext.getString(R.string.notice_room_visibility_joined);
} else if (TextUtils.equals(historyVisibility, RoomState.HISTORY_VISIBILITY_WORLD_READABLE)) {
subpart = mContext.getString(R.string.notice_room_visibility_world_readable);
} else {
subpart = mContext.getString(R.string.notice_room_visibility_unknown, historyVisibility);
}
text = mContext.getString(R.string.notice_made_future_room_visibility, userDisplayName, subpart);
} else if (Event.EVENT_TYPE_RECEIPT.equals(eventType)) {
// the read receipt should not be displayed
text = "Read Receipt";
} else if (Event.EVENT_TYPE_MESSAGE.equals(eventType)) {
String msgtype = (null != jsonEventContent.get("msgtype")) ? jsonEventContent.get("msgtype").getAsString() : "";
// all m.room.message events should support the 'body' key fallback, so use it.
text = jsonEventContent.get("body") == null ? null : jsonEventContent.get("body").getAsString();
// check for html formatting
if (jsonEventContent.has("formatted_body") && jsonEventContent.has("format")) {
String format = jsonEventContent.getAsJsonPrimitive("format").getAsString();
if (Message.FORMAT_MATRIX_HTML.equals(format)) {
String htmlBody = jsonEventContent.getAsJsonPrimitive("formatted_body").getAsString();
// an issue has been created https://github.com/vector-im/vector-android/issues/38
if (!TextUtils.isEmpty(htmlBody) && !htmlBody.contains("<ol>") && !htmlBody.contains("<li>")) {
text = Html.fromHtml(jsonEventContent.getAsJsonPrimitive("formatted_body").getAsString());
}
}
}
// avoid empty image name
if (TextUtils.equals(msgtype, Message.MSGTYPE_IMAGE) && TextUtils.isEmpty(text)) {
text = mContext.getString(R.string.summary_user_sent_image, userDisplayName);
} else if (TextUtils.equals(msgtype, Message.MSGTYPE_EMOTE)) {
text = "* " + userDisplayName + " " + text;
} else if (TextUtils.isEmpty(text)) {
text = "";
} else if (mPrependAuthor) {
text = new SpannableStringBuilder(mContext.getString(R.string.summary_message, userDisplayName, text));
if (null != displayNameColor) {
((SpannableStringBuilder) text).setSpan(new ForegroundColorSpan(displayNameColor), 0, userDisplayName.length() + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
((SpannableStringBuilder) text).setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 0, userDisplayName.length() + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
} else if (Event.EVENT_TYPE_STICKER.equals(eventType)) {
// all m.stickers events should support the 'body' key fallback, so use it.
text = jsonEventContent.get("body") == null ? null : jsonEventContent.get("body").getAsString();
if (TextUtils.isEmpty(text)) {
text = mContext.getString(R.string.summary_user_sent_sticker, userDisplayName);
}
} else if (Event.EVENT_TYPE_MESSAGE_ENCRYPTION.equals(eventType)) {
text = mContext.getString(R.string.notice_end_to_end, userDisplayName, mEvent.getWireEventContent().algorithm);
} else if (Event.EVENT_TYPE_MESSAGE_ENCRYPTED.equals(eventType)) {
// don't display
if (mEvent.isRedacted()) {
String redactedInfo = EventDisplay.getRedactionMessage(mContext, mEvent, mRoomState);
if (TextUtils.isEmpty(redactedInfo)) {
return null;
} else {
return redactedInfo;
}
} else {
String message = null;
if (null != mEvent.getCryptoError()) {
String errorDescription;
MXCryptoError error = mEvent.getCryptoError();
if (TextUtils.equals(error.errcode, MXCryptoError.UNKNOWN_INBOUND_SESSION_ID_ERROR_CODE)) {
errorDescription = mContext.getResources().getString(R.string.notice_crypto_error_unkwown_inbound_session_id);
} else {
errorDescription = error.getLocalizedMessage();
}
message = mContext.getString(R.string.notice_crypto_unable_to_decrypt, errorDescription);
}
if (TextUtils.isEmpty(message)) {
message = mContext.getString(R.string.encrypted_message);
}
SpannableString spannableStr = new SpannableString(message);
spannableStr.setSpan(new android.text.style.StyleSpan(Typeface.ITALIC), 0, message.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
text = spannableStr;
}
} else if (Event.EVENT_TYPE_STATE_ROOM_TOPIC.equals(eventType)) {
String topic = jsonEventContent.getAsJsonPrimitive("topic").getAsString();
if (mEvent.isRedacted()) {
String redactedInfo = EventDisplay.getRedactionMessage(mContext, mEvent, mRoomState);
if (TextUtils.isEmpty(redactedInfo)) {
return null;
}
topic = redactedInfo;
}
if (!TextUtils.isEmpty(topic)) {
text = mContext.getString(R.string.notice_topic_changed, userDisplayName, topic);
} else {
text = mContext.getString(R.string.notice_room_topic_removed, userDisplayName);
}
} else if (Event.EVENT_TYPE_STATE_ROOM_NAME.equals(eventType)) {
JsonPrimitive nameAsJson = jsonEventContent.getAsJsonPrimitive("name");
String roomName = (null == nameAsJson) ? null : nameAsJson.getAsString();
if (mEvent.isRedacted()) {
String redactedInfo = EventDisplay.getRedactionMessage(mContext, mEvent, mRoomState);
if (TextUtils.isEmpty(redactedInfo)) {
return null;
}
roomName = redactedInfo;
}
if (!TextUtils.isEmpty(roomName)) {
text = mContext.getString(R.string.notice_room_name_changed, userDisplayName, roomName);
} else {
text = mContext.getString(R.string.notice_room_name_removed, userDisplayName);
}
} else if (Event.EVENT_TYPE_STATE_ROOM_THIRD_PARTY_INVITE.equals(eventType)) {
RoomThirdPartyInvite invite = JsonUtils.toRoomThirdPartyInvite(mEvent.getContent());
String displayName = invite.display_name;
if (mEvent.isRedacted()) {
String redactedInfo = EventDisplay.getRedactionMessage(mContext, mEvent, mRoomState);
if (TextUtils.isEmpty(redactedInfo)) {
return null;
}
displayName = redactedInfo;
}
text = mContext.getString(R.string.notice_room_third_party_invite, userDisplayName, displayName);
} else if (Event.EVENT_TYPE_STATE_ROOM_MEMBER.equals(eventType)) {
text = getMembershipNotice(mContext, mEvent, mRoomState);
}
} catch (Exception e) {
Log.e(LOG_TAG, "getTextualDisplay() " + e.getMessage());
}
return text;
}
use of org.matrix.androidsdk.rest.model.pid.RoomThirdPartyInvite in project matrix-android-sdk by matrix-org.
the class RoomState method applyState.
/**
* Apply the given event (relevant for state changes) to our state.
*
* @param store the store to use
* @param event the event
* @param direction how the event should affect the state: Forwards for applying, backwards for un-applying (applying the previous state)
* @return true if the event is managed
*/
public boolean applyState(IMXStore store, Event event, EventTimeline.Direction direction) {
if (event.stateKey == null) {
return false;
}
JsonObject contentToConsider = (direction == EventTimeline.Direction.FORWARDS) ? event.getContentAsJsonObject() : event.getPrevContentAsJsonObject();
String eventType = event.getType();
try {
if (Event.EVENT_TYPE_STATE_ROOM_NAME.equals(eventType)) {
name = JsonUtils.toRoomState(contentToConsider).name;
} else if (Event.EVENT_TYPE_STATE_ROOM_TOPIC.equals(eventType)) {
topic = JsonUtils.toRoomState(contentToConsider).topic;
} else if (Event.EVENT_TYPE_STATE_ROOM_CREATE.equals(eventType)) {
creator = JsonUtils.toRoomState(contentToConsider).creator;
} else if (Event.EVENT_TYPE_STATE_ROOM_JOIN_RULES.equals(eventType)) {
join_rule = JsonUtils.toRoomState(contentToConsider).join_rule;
} else if (Event.EVENT_TYPE_STATE_ROOM_GUEST_ACCESS.equals(eventType)) {
guest_access = JsonUtils.toRoomState(contentToConsider).guest_access;
} else if (Event.EVENT_TYPE_STATE_ROOM_ALIASES.equals(eventType)) {
if (!TextUtils.isEmpty(event.stateKey)) {
// backward compatibility
aliases = JsonUtils.toRoomState(contentToConsider).aliases;
// sanity check
if (null != aliases) {
mAliasesByDomain.put(event.stateKey, aliases);
mRoomAliases.put(event.stateKey, event);
} else {
mAliasesByDomain.put(event.stateKey, new ArrayList<String>());
}
}
} else if (Event.EVENT_TYPE_MESSAGE_ENCRYPTION.equals(eventType)) {
algorithm = JsonUtils.toRoomState(contentToConsider).algorithm;
// This flag should not be cleared if a later m.room.encryption event changes the configuration. This is to avoid a situation where a MITM can simply ask participants to disable encryption. In short: once encryption is enabled in a room, it can never be disabled.
if (null == algorithm) {
algorithm = "";
}
} else if (Event.EVENT_TYPE_STATE_CANONICAL_ALIAS.equals(eventType)) {
// SPEC-125
alias = JsonUtils.toRoomState(contentToConsider).alias;
} else if (Event.EVENT_TYPE_STATE_HISTORY_VISIBILITY.equals(eventType)) {
// SPEC-134
history_visibility = JsonUtils.toRoomState(contentToConsider).history_visibility;
} else if (Event.EVENT_TYPE_STATE_ROOM_AVATAR.equals(eventType)) {
url = JsonUtils.toRoomState(contentToConsider).url;
} else if (Event.EVENT_TYPE_STATE_RELATED_GROUPS.equals(eventType)) {
groups = JsonUtils.toRoomState(contentToConsider).groups;
} else if (Event.EVENT_TYPE_STATE_ROOM_MEMBER.equals(eventType)) {
RoomMember member = JsonUtils.toRoomMember(contentToConsider);
String userId = event.stateKey;
if (null == userId) {
Log.e(LOG_TAG, "## applyState() : null stateKey in " + roomId);
} else if (null == member) {
// the member has already been removed
if (null == getMember(userId)) {
Log.e(LOG_TAG, "## applyState() : the user " + userId + " is not anymore a member of " + roomId);
return false;
}
removeMember(userId);
} else {
try {
member.setUserId(userId);
member.setOriginServerTs(event.getOriginServerTs());
member.setOriginalEventId(event.eventId);
member.mSender = event.getSender();
if ((null != store) && (direction == EventTimeline.Direction.FORWARDS)) {
store.storeRoomStateEvent(roomId, event);
}
RoomMember currentMember = getMember(userId);
// duplicated message ?
if (member.equals(currentMember)) {
Log.e(LOG_TAG, "## applyState() : seems being a duplicated event for " + userId + " in room " + roomId);
return false;
}
// when a member leaves a room, his avatar / display name is not anymore provided
if (null != currentMember) {
if (TextUtils.equals(member.membership, RoomMember.MEMBERSHIP_LEAVE) || TextUtils.equals(member.membership, (RoomMember.MEMBERSHIP_BAN))) {
if (null == member.getAvatarUrl()) {
member.setAvatarUrl(currentMember.getAvatarUrl());
}
if (null == member.displayname) {
member.displayname = currentMember.displayname;
}
// remove the cached display name
if (null != mMemberDisplayNameByUserId) {
mMemberDisplayNameByUserId.remove(userId);
}
// test if the user has been kicked
if (!TextUtils.equals(event.getSender(), event.stateKey) && TextUtils.equals(currentMember.membership, RoomMember.MEMBERSHIP_JOIN) && TextUtils.equals(member.membership, RoomMember.MEMBERSHIP_LEAVE)) {
member.membership = RoomMember.MEMBERSHIP_KICK;
}
}
}
if ((direction == EventTimeline.Direction.FORWARDS) && (null != store)) {
store.updateUserWithRoomMemberEvent(member);
}
// Cache room member event that is successor of a third party invite event
if (!TextUtils.isEmpty(member.getThirdPartyInviteToken())) {
mMembersWithThirdPartyInviteTokenCache.put(member.getThirdPartyInviteToken(), member);
}
} catch (Exception e) {
Log.e(LOG_TAG, "## applyState() - EVENT_TYPE_STATE_ROOM_MEMBER failed " + e.getMessage());
}
setMember(userId, member);
}
} else if (Event.EVENT_TYPE_STATE_ROOM_POWER_LEVELS.equals(eventType)) {
powerLevels = JsonUtils.toPowerLevels(contentToConsider);
} else if (Event.EVENT_TYPE_STATE_ROOM_THIRD_PARTY_INVITE.equals(event.getType())) {
if (null != contentToConsider) {
RoomThirdPartyInvite thirdPartyInvite = JsonUtils.toRoomThirdPartyInvite(contentToConsider);
thirdPartyInvite.token = event.stateKey;
if ((direction == EventTimeline.Direction.FORWARDS) && (null != store)) {
store.storeRoomStateEvent(roomId, event);
}
if (!TextUtils.isEmpty(thirdPartyInvite.token)) {
mThirdPartyInvites.put(thirdPartyInvite.token, thirdPartyInvite);
}
}
}
// they are saved elsewhere
if (!TextUtils.isEmpty(eventType) && !Event.EVENT_TYPE_STATE_ROOM_MEMBER.equals(eventType)) {
List<Event> eventsList = mStateEvents.get(eventType);
if (null == eventsList) {
eventsList = new ArrayList<>();
mStateEvents.put(eventType, eventsList);
}
eventsList.add(event);
}
} catch (Exception e) {
Log.e(LOG_TAG, "applyState failed with error " + e.getMessage());
}
return true;
}
Aggregations