use of org.matrix.androidsdk.rest.model.Event in project matrix-android-sdk by matrix-org.
the class MXMemoryStore method unreadEvents.
/**
* Provides the unread events list.
*
* @param roomId the room id.
* @param types an array of event types strings (Event.EVENT_TYPE_XXX).
* @return the unread events list.
*/
@Override
public List<Event> unreadEvents(String roomId, List<String> types) {
List<Event> res = null;
synchronized (mReceiptsByRoomIdLock) {
if (mReceiptsByRoomId.containsKey(roomId)) {
Map<String, ReceiptData> receiptsByUserId = mReceiptsByRoomId.get(roomId);
if (receiptsByUserId.containsKey(mCredentials.userId)) {
ReceiptData data = receiptsByUserId.get(mCredentials.userId);
res = eventsAfter(roomId, data.eventId, mCredentials.userId, types);
}
}
}
if (null == res) {
res = new ArrayList<>();
}
return res;
}
use of org.matrix.androidsdk.rest.model.Event in project matrix-android-sdk by matrix-org.
the class MXMemoryStore method isEventRead.
/**
* Check if an event has been read by an user.
*
* @param roomId the room Id
* @param userId the user id
* @param eventIdTotest the event id
* @return true if the user has read the message.
*/
@Override
public boolean isEventRead(String roomId, String userId, String eventIdTotest) {
boolean res = false;
// sanity check
if ((null != roomId) && (null != userId)) {
synchronized (mReceiptsByRoomIdLock) {
synchronized (mRoomEventsLock) {
if (mReceiptsByRoomId.containsKey(roomId) && mRoomEvents.containsKey(roomId)) {
Map<String, ReceiptData> receiptsByUserId = mReceiptsByRoomId.get(roomId);
LinkedHashMap<String, Event> eventsMap = mRoomEvents.get(roomId);
// check if the event is known
if (eventsMap.containsKey(eventIdTotest) && receiptsByUserId.containsKey(userId)) {
ReceiptData data = receiptsByUserId.get(userId);
ArrayList<String> eventIds = new ArrayList<>(eventsMap.keySet());
// the message has been read if it was sent before the latest read one
res = eventIds.indexOf(eventIdTotest) <= eventIds.indexOf(data.eventId);
} else if (receiptsByUserId.containsKey(userId)) {
// the event is not known so assume it is has been flushed
res = true;
}
}
}
}
}
return res;
}
use of org.matrix.androidsdk.rest.model.Event in project matrix-android-sdk by matrix-org.
the class MXMemoryStore method getLatestEvent.
/**
* Get the latest event from the given room (to update summary for example)
*
* @param roomId the room id
* @return the event
*/
@Override
public Event getLatestEvent(String roomId) {
Event event = null;
if (null != roomId) {
synchronized (mRoomEventsLock) {
LinkedHashMap<String, Event> events = mRoomEvents.get(roomId);
if (events != null) {
Iterator<Event> it = events.values().iterator();
if (it.hasNext()) {
Event lastEvent = null;
while (it.hasNext()) {
lastEvent = it.next();
}
event = lastEvent;
}
}
}
}
return event;
}
use of org.matrix.androidsdk.rest.model.Event in project matrix-android-sdk by matrix-org.
the class MXMemoryStore method storeRoomEvents.
@Override
public void storeRoomEvents(String roomId, TokensChunkResponse<Event> eventsResponse, EventTimeline.Direction direction) {
try {
if (null != roomId) {
synchronized (mRoomEventsLock) {
LinkedHashMap<String, Event> events = mRoomEvents.get(roomId);
if (events == null) {
events = new LinkedHashMap<>();
mRoomEvents.put(roomId, events);
}
if (direction == EventTimeline.Direction.FORWARDS) {
mRoomTokens.put(roomId, eventsResponse.start);
for (Event event : eventsResponse.chunk) {
events.put(event.eventId, event);
}
} else {
// BACKWARD
Collection<Event> eventsList = events.values();
// no stored events
if (events.size() == 0) {
// insert the catchup events in reverse order
for (int index = eventsResponse.chunk.size() - 1; index >= 0; index--) {
Event backEvent = eventsResponse.chunk.get(index);
events.put(backEvent.eventId, backEvent);
}
// define a token
mRoomTokens.put(roomId, eventsResponse.start);
} else {
LinkedHashMap<String, Event> events2 = new LinkedHashMap<>();
// insert the catchup events in reverse order
for (int index = eventsResponse.chunk.size() - 1; index >= 0; index--) {
Event backEvent = eventsResponse.chunk.get(index);
events2.put(backEvent.eventId, backEvent);
}
// add the previous added Events
for (Event event : eventsList) {
events2.put(event.eventId, event);
}
// store the new list
mRoomEvents.put(roomId, events2);
}
}
}
}
} catch (OutOfMemoryError e) {
dispatchOOM(e);
}
}
use of org.matrix.androidsdk.rest.model.Event in project matrix-android-sdk by matrix-org.
the class MatrixMessageListFragment method onReceiptEvent.
@Override
public void onReceiptEvent(List<String> senderIds) {
// avoid useless refresh
boolean shouldRefresh = true;
try {
IMXStore store = mSession.getDataHandler().getStore();
int firstPos = mMessageListView.getFirstVisiblePosition();
int lastPos = mMessageListView.getLastVisiblePosition();
ArrayList<String> senders = new ArrayList<>();
ArrayList<String> eventIds = new ArrayList<>();
for (int index = firstPos; index <= lastPos; index++) {
Event event = mAdapter.getItem(index).getEvent();
if ((null != event.getSender()) && (null != event.eventId)) {
senders.add(event.getSender());
eventIds.add(event.eventId);
}
}
shouldRefresh = false;
// check if the receipt will trigger a refresh
for (String sender : senderIds) {
if (!TextUtils.equals(sender, mSession.getMyUserId())) {
ReceiptData receipt = store.getReceipt(mRoom.getRoomId(), sender);
// sanity check
if (null != receipt) {
// test if the event is displayed
int pos = eventIds.indexOf(receipt.eventId);
// if displayed
if (pos >= 0) {
// the sender is not displayed as a reader (makes sense...)
shouldRefresh = !TextUtils.equals(senders.get(pos), sender);
if (shouldRefresh) {
break;
}
}
}
}
}
} catch (Exception e) {
Log.e(LOG_TAG, "onReceiptEvent failed with " + e.getMessage());
}
if (shouldRefresh) {
mAdapter.notifyDataSetChanged();
}
}
Aggregations