Search in sources :

Example 1 with EventDisplay

use of org.matrix.androidsdk.util.EventDisplay in project matrix-android-sdk by matrix-org.

the class MatrixMessageListFragment method onEvent.

// ==============================================================================================================
// MatrixMessagesFragment methods
// ==============================================================================================================
@Override
public void onEvent(final Event event, final EventTimeline.Direction direction, final RoomState roomState) {
    if (null == event) {
        Log.e(LOG_TAG, "## onEvent() : null event");
        return;
    }
    if (TextUtils.equals(event.eventId, mEventId)) {
        // Save timestamp in case this event will not be added in adapter
        mEventOriginServerTs = event.getOriginServerTs();
    }
    if (direction == EventTimeline.Direction.FORWARDS) {
        if (Event.EVENT_TYPE_REDACTION.equals(event.getType())) {
            MessageRow messageRow = mAdapter.getMessageRow(event.getRedacts());
            if (null != messageRow) {
                Event prunedEvent = mSession.getDataHandler().getStore().getEvent(event.getRedacts(), event.roomId);
                if (null == prunedEvent) {
                    mAdapter.removeEventById(event.getRedacts());
                } else {
                    messageRow.updateEvent(prunedEvent);
                    JsonObject content = messageRow.getEvent().getContentAsJsonObject();
                    boolean hasToRemoved = (null == content) || (null == content.entrySet()) || (0 == content.entrySet().size());
                    // GA issue : the activity can be null
                    if (!hasToRemoved && (null != getActivity())) {
                        EventDisplay eventDisplay = new EventDisplay(getActivity(), prunedEvent, roomState);
                        hasToRemoved = TextUtils.isEmpty(eventDisplay.getTextualDisplay());
                    }
                    // event is removed if it has no more content.
                    if (hasToRemoved) {
                        mAdapter.removeEventById(prunedEvent.eventId);
                    }
                }
                mAdapter.notifyDataSetChanged();
            }
        } else {
            if (canAddEvent(event)) {
                // refresh the listView only when it is a live timeline or a search
                MessageRow newMessageRow = new MessageRow(event, roomState);
                mAdapter.add(newMessageRow, (null == mEventTimeLine) || mEventTimeLine.isLiveTimeline());
                // Move read marker if necessary
                if (isResumed() && mEventTimeLine != null && mEventTimeLine.isLiveTimeline()) {
                    MessageRow currentReadMarkerRow = getReadMarkerMessageRow(newMessageRow);
                    if (canUpdateReadMarker(newMessageRow, currentReadMarkerRow)) {
                        if (0 == mMessageListView.getChildCount()) {
                            mMessageListView.post(new Runnable() {

                                @Override
                                public void run() {
                                    // check if the previous one was displayed
                                    View childView = mMessageListView.getChildAt(mMessageListView.getChildCount() - 2);
                                    // Previous message was the last read
                                    if ((null != childView) && (childView.getTop() >= 0)) {
                                        // Move read marker to the newly sent message
                                        mRoom.setReadMakerEventId(event.eventId);
                                        mAdapter.resetReadMarker();
                                    }
                                }
                            });
                        } else {
                            View childView = mMessageListView.getChildAt(mMessageListView.getChildCount() - 1);
                            // Previous message was the last read
                            if ((null != childView) && (childView.getTop() >= 0)) {
                                // Move read marker to the newly sent message
                                mRoom.setReadMakerEventId(event.eventId);
                                mAdapter.resetReadMarker();
                            }
                        }
                    }
                }
            }
        }
    } else {
        if (canAddEvent(event)) {
            mAdapter.addToFront(new MessageRow(event, roomState));
        }
    }
}
Also used : MessageRow(org.matrix.androidsdk.adapters.MessageRow) MotionEvent(android.view.MotionEvent) Event(org.matrix.androidsdk.rest.model.Event) JsonObject(com.google.gson.JsonObject) EventDisplay(org.matrix.androidsdk.util.EventDisplay) View(android.view.View) AbsListView(android.widget.AbsListView) AutoScrollDownListView(org.matrix.androidsdk.view.AutoScrollDownListView)

Example 2 with EventDisplay

use of org.matrix.androidsdk.util.EventDisplay in project matrix-android-sdk by matrix-org.

the class EventTimeline method storeLiveRoomEvent.

/**
 * Store a live room event.
 *
 * @param event                   The event to be stored.
 * @param checkRedactedStateEvent true to check if this event redacts a state event
 */
private void storeLiveRoomEvent(Event event, boolean checkRedactedStateEvent) {
    boolean store = false;
    String myUserId = mDataHandler.getCredentials().userId;
    if (Event.EVENT_TYPE_REDACTION.equals(event.getType())) {
        if (event.getRedacts() != null) {
            Event eventToPrune = mStore.getEvent(event.getRedacts(), event.roomId);
            // when an event is redacted, some fields must be kept.
            if (null != eventToPrune) {
                store = true;
                // remove expected keys
                eventToPrune.prune(event);
                // store the prune event
                storeEvent(eventToPrune);
                // store the redaction event too (for the read markers management)
                storeEvent(event);
                // or the redacted event is received with roomSync.timeline.limited
                if (checkRedactedStateEvent && eventToPrune.stateKey != null) {
                    checkStateEventRedaction(event);
                }
                // search the latest displayable event
                // to replace the summary text
                ArrayList<Event> events = new ArrayList<>(mStore.getRoomMessages(event.roomId));
                for (int index = events.size() - 1; index >= 0; index--) {
                    Event anEvent = events.get(index);
                    if (RoomSummary.isSupportedEvent(anEvent)) {
                        // Decrypt event if necessary
                        if (TextUtils.equals(anEvent.getType(), Event.EVENT_TYPE_MESSAGE_ENCRYPTED)) {
                            if (null != mDataHandler.getCrypto()) {
                                mDataHandler.decryptEvent(anEvent, getTimelineId());
                            }
                        }
                        EventDisplay eventDisplay = new EventDisplay(mStore.getContext(), anEvent, mState);
                        // ensure that message can be displayed
                        if (!TextUtils.isEmpty(eventDisplay.getTextualDisplay())) {
                            event = anEvent;
                            break;
                        }
                    }
                }
            } else {
                // or the redacted event is received with roomSync.timeline.limited
                if (checkRedactedStateEvent) {
                    checkStateEventRedaction(event);
                }
            }
        }
    } else {
        // the candidate events are not stored.
        store = !event.isCallEvent() || !Event.EVENT_TYPE_CALL_CANDIDATES.equals(event.getType());
        // if the user leaves a room,
        if (Event.EVENT_TYPE_STATE_ROOM_MEMBER.equals(event.getType()) && myUserId.equals(event.stateKey)) {
            String membership = event.getContent().getAsJsonObject().getAsJsonPrimitive("membership").getAsString();
            if (RoomMember.MEMBERSHIP_LEAVE.equals(membership) || RoomMember.MEMBERSHIP_BAN.equals(membership)) {
                store = mIsHistorical;
            // delete the room and warn the listener of the leave event only at the end of the events chunk processing
            }
        }
    }
    if (store) {
        storeEvent(event);
    }
    // warn the listener that a new room has been created
    if (Event.EVENT_TYPE_STATE_ROOM_CREATE.equals(event.getType())) {
        mDataHandler.onNewRoom(event.roomId);
    }
    // warn the listeners that a room has been joined
    if (Event.EVENT_TYPE_STATE_ROOM_MEMBER.equals(event.getType()) && myUserId.equals(event.stateKey)) {
        String membership = event.getContent().getAsJsonObject().getAsJsonPrimitive("membership").getAsString();
        if (RoomMember.MEMBERSHIP_JOIN.equals(membership)) {
            mDataHandler.onJoinRoom(event.roomId);
        } else if (RoomMember.MEMBERSHIP_INVITE.equals(membership)) {
            mDataHandler.onNewRoom(event.roomId);
        }
    }
}
Also used : ArrayList(java.util.ArrayList) Event(org.matrix.androidsdk.rest.model.Event) EventDisplay(org.matrix.androidsdk.util.EventDisplay)

Aggregations

Event (org.matrix.androidsdk.rest.model.Event)2 EventDisplay (org.matrix.androidsdk.util.EventDisplay)2 MotionEvent (android.view.MotionEvent)1 View (android.view.View)1 AbsListView (android.widget.AbsListView)1 JsonObject (com.google.gson.JsonObject)1 ArrayList (java.util.ArrayList)1 MessageRow (org.matrix.androidsdk.adapters.MessageRow)1 AutoScrollDownListView (org.matrix.androidsdk.view.AutoScrollDownListView)1