use of org.matrix.androidsdk.rest.model.Event in project matrix-android-sdk by matrix-org.
the class MXMemoryStore method storeReceipt.
/**
* Store the receipt for an user in a room.
* The receipt validity is checked i.e the receipt is not for an already read message.
*
* @param receipt The event
* @param roomId The roomId
* @return true if the receipt has been stored
*/
@Override
public boolean storeReceipt(ReceiptData receipt, String roomId) {
try {
// sanity check
if (TextUtils.isEmpty(roomId) || (null == receipt)) {
return false;
}
Map<String, ReceiptData> receiptsByUserId;
synchronized (mReceiptsByRoomIdLock) {
if (!mReceiptsByRoomId.containsKey(roomId)) {
receiptsByUserId = new HashMap<>();
mReceiptsByRoomId.put(roomId, receiptsByUserId);
} else {
receiptsByUserId = mReceiptsByRoomId.get(roomId);
}
}
ReceiptData curReceipt = null;
if (receiptsByUserId.containsKey(receipt.userId)) {
curReceipt = receiptsByUserId.get(receipt.userId);
}
if (null == curReceipt) {
// Log.d(LOG_TAG, "## storeReceipt() : there was no receipt from this user");
receiptsByUserId.put(receipt.userId, receipt);
return true;
}
if (TextUtils.equals(receipt.eventId, curReceipt.eventId)) {
// Log.d(LOG_TAG, "## storeReceipt() : receipt for the same event");
return false;
}
if (receipt.originServerTs < curReceipt.originServerTs) {
// Log.d(LOG_TAG, "## storeReceipt() : the receipt is older that the current one");
return false;
}
// check if the read receipt is not for an already read message
if (TextUtils.equals(receipt.userId, mCredentials.userId)) {
synchronized (mReceiptsByRoomIdLock) {
LinkedHashMap<String, Event> eventsMap = mRoomEvents.get(roomId);
// test if the event is know
if ((null != eventsMap) && eventsMap.containsKey(receipt.eventId)) {
ArrayList<String> eventIds = new ArrayList<>(eventsMap.keySet());
int curEventPos = eventIds.indexOf(curReceipt.eventId);
int newEventPos = eventIds.indexOf(receipt.eventId);
if (curEventPos >= newEventPos) {
Log.d(LOG_TAG, "## storeReceipt() : the read message is already read (cur pos " + curEventPos + " receipt event pos " + newEventPos + ")");
return false;
}
}
}
}
// Log.d(LOG_TAG, "## storeReceipt() : updated");
receiptsByUserId.put(receipt.userId, receipt);
} catch (OutOfMemoryError e) {
dispatchOOM(e);
}
return true;
}
use of org.matrix.androidsdk.rest.model.Event in project matrix-android-sdk by matrix-org.
the class MXMemoryStore method getUnknownDeviceEvents.
@Override
public List<Event> getUnknownDeviceEvents(String roomId) {
if (null == roomId) {
return null;
}
List<Event> unknownDeviceEvents = new ArrayList<>();
synchronized (mRoomEventsLock) {
LinkedHashMap<String, Event> events = mRoomEvents.get(roomId);
// contain some events
if ((null != events) && (events.size() > 0)) {
ArrayList<Event> eventsList = new ArrayList<>(events.values());
for (int index = events.size() - 1; index >= 0; index--) {
Event event = eventsList.get(index);
if (event.isUnkownDevice()) {
unknownDeviceEvents.add(event);
}
}
Collections.reverse(unknownDeviceEvents);
}
}
return unknownDeviceEvents;
}
use of org.matrix.androidsdk.rest.model.Event in project matrix-android-sdk by matrix-org.
the class MXMemoryStore method getUndeliverableEvents.
@Override
public List<Event> getUndeliverableEvents(String roomId) {
if (null == roomId) {
return null;
}
List<Event> undeliverableRoomEvents = new ArrayList<>();
synchronized (mRoomEventsLock) {
LinkedHashMap<String, Event> events = mRoomEvents.get(roomId);
// contain some events
if ((null != events) && (events.size() > 0)) {
ArrayList<Event> eventsList = new ArrayList<>(events.values());
for (int index = events.size() - 1; index >= 0; index--) {
Event event = eventsList.get(index);
if (event.isUndeliverable()) {
undeliverableRoomEvents.add(event);
}
}
Collections.reverse(undeliverableRoomEvents);
}
}
return undeliverableRoomEvents;
}
use of org.matrix.androidsdk.rest.model.Event in project matrix-android-sdk by matrix-org.
the class MatrixMessageListFragment method resendUnsentMessages.
/**
* Resend the unsent messages
*/
public void resendUnsentMessages() {
// check if the call is done in the right thread
if (Looper.getMainLooper().getThread() != Thread.currentThread()) {
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
resendUnsentMessages();
}
});
return;
}
List<Event> unsent = mRoom.getUnsentEvents();
for (Event unsentMessage : unsent) {
resend(unsentMessage);
}
}
use of org.matrix.androidsdk.rest.model.Event in project matrix-android-sdk by matrix-org.
the class MatrixMessageListFragment method redactEvent.
/**
* Redact an event from its event id.
*
* @param eventId the event id.
*/
protected void redactEvent(final String eventId) {
// Do nothing on success, the event will be hidden when the redaction event comes down the event stream
mMatrixMessagesFragment.redact(eventId, new ApiCallback<Event>() {
@Override
public void onSuccess(final Event redactedEvent) {
if (null != redactedEvent) {
getUiHandler().post(new Runnable() {
@Override
public void run() {
// create a dummy redacted event to manage the redaction.
// some redacted events are not removed from the history but they are pruned.
Event redacterEvent = new Event();
redacterEvent.roomId = redactedEvent.roomId;
redacterEvent.redacts = redactedEvent.eventId;
redacterEvent.setType(Event.EVENT_TYPE_REDACTION);
onEvent(redacterEvent, EventTimeline.Direction.FORWARDS, mRoom.getLiveState());
if (null != mEventSendingListener) {
try {
mEventSendingListener.onMessageRedacted(redactedEvent);
} catch (Exception e) {
Log.e(LOG_TAG, "redactEvent fails : " + e.getMessage());
}
}
}
});
}
}
private void onError() {
if (null != getActivity()) {
Toast.makeText(getActivity(), getActivity().getString(R.string.could_not_redact), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onNetworkError(Exception e) {
onError();
}
@Override
public void onMatrixError(MatrixError e) {
onError();
}
@Override
public void onUnexpectedError(Exception e) {
onError();
}
});
}
Aggregations