Search in sources :

Example 1 with RoomThirdPartyInvite

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();
    }
}
Also used : RoomThirdPartyInvite(org.matrix.androidsdk.rest.model.pid.RoomThirdPartyInvite) RoomMember(org.matrix.androidsdk.rest.model.RoomMember) Event(org.matrix.androidsdk.rest.model.Event) ArrayList(java.util.ArrayList) List(java.util.List) HashMap(java.util.HashMap) Map(java.util.Map)

Example 2 with RoomThirdPartyInvite

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;
}
Also used : ForegroundColorSpan(android.text.style.ForegroundColorSpan) JsonPrimitive(com.google.gson.JsonPrimitive) StyleSpan(android.text.style.StyleSpan) JsonObject(com.google.gson.JsonObject) SpannableString(android.text.SpannableString) SpannableString(android.text.SpannableString) RoomThirdPartyInvite(org.matrix.androidsdk.rest.model.pid.RoomThirdPartyInvite) JsonElement(com.google.gson.JsonElement) StyleSpan(android.text.style.StyleSpan) SpannableStringBuilder(android.text.SpannableStringBuilder) MXCryptoError(org.matrix.androidsdk.crypto.MXCryptoError)

Example 3 with RoomThirdPartyInvite

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;
}
Also used : RoomThirdPartyInvite(org.matrix.androidsdk.rest.model.pid.RoomThirdPartyInvite) RoomMember(org.matrix.androidsdk.rest.model.RoomMember) ArrayList(java.util.ArrayList) JsonObject(com.google.gson.JsonObject) Event(org.matrix.androidsdk.rest.model.Event) IOException(java.io.IOException)

Aggregations

RoomThirdPartyInvite (org.matrix.androidsdk.rest.model.pid.RoomThirdPartyInvite)3 JsonObject (com.google.gson.JsonObject)2 ArrayList (java.util.ArrayList)2 Event (org.matrix.androidsdk.rest.model.Event)2 RoomMember (org.matrix.androidsdk.rest.model.RoomMember)2 SpannableString (android.text.SpannableString)1 SpannableStringBuilder (android.text.SpannableStringBuilder)1 ForegroundColorSpan (android.text.style.ForegroundColorSpan)1 StyleSpan (android.text.style.StyleSpan)1 JsonElement (com.google.gson.JsonElement)1 JsonPrimitive (com.google.gson.JsonPrimitive)1 IOException (java.io.IOException)1 HashMap (java.util.HashMap)1 List (java.util.List)1 Map (java.util.Map)1 MXCryptoError (org.matrix.androidsdk.crypto.MXCryptoError)1