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));
}
}
}
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);
}
}
}
Aggregations