use of org.matrix.androidsdk.rest.model.Event in project matrix-android-sdk by matrix-org.
the class Room method deleteEvents.
/**
* Delete an events list.
*
* @param events the events list
*/
public void deleteEvents(List<Event> events) {
if ((null != getStore()) && (null != events) && events.size() > 0) {
// reset the timestamp
for (Event event : events) {
getStore().deleteEvent(event);
}
// update the summary
Event latestEvent = getStore().getLatestEvent(getRoomId());
// if there is an oldest event, use it to set a summary
if (latestEvent != null) {
if (RoomSummary.isSupportedEvent(latestEvent)) {
RoomSummary summary = getStore().getSummary(getRoomId());
if (null != summary) {
summary.setLatestReceivedEvent(latestEvent, getState());
} else {
summary = new RoomSummary(null, latestEvent, getState(), mDataHandler.getUserId());
}
getStore().storeSummary(summary);
}
}
getStore().commit();
}
}
use of org.matrix.androidsdk.rest.model.Event in project matrix-android-sdk by matrix-org.
the class Room method getMemberEvent.
public void getMemberEvent(final String userId, final ApiCallback<Event> callback) {
final Event event;
final RoomMember member = getMember(userId);
if ((null != member) && (null != member.getOriginalEventId())) {
event = mMemberEventByEventId.get(member.getOriginalEventId());
if (null == event) {
mDataHandler.getDataRetriever().getRoomsRestClient().getEvent(getRoomId(), member.getOriginalEventId(), new ApiCallback<Event>() {
@Override
public void onSuccess(Event event) {
if (null != event) {
mMemberEventByEventId.put(event.eventId, event);
}
callback.onSuccess(event);
}
@Override
public void onNetworkError(Exception e) {
callback.onNetworkError(e);
}
@Override
public void onMatrixError(MatrixError e) {
callback.onMatrixError(e);
}
@Override
public void onUnexpectedError(Exception e) {
callback.onUnexpectedError(e);
}
});
return;
}
} else {
event = null;
}
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
callback.onSuccess(event);
}
});
}
use of org.matrix.androidsdk.rest.model.Event in project matrix-android-sdk by matrix-org.
the class Room method sendReadMarkers.
/**
* Send the read markers
*
* @param aReadMarkerEventId the new read marker event id (if null use the latest known event id)
* @param aReadReceiptEventId the new read receipt event id (if null use the latest known event id)
* @param aRespCallback asynchronous response callback
* @return true if the request is sent, false otherwise
*/
public boolean sendReadMarkers(final String aReadMarkerEventId, final String aReadReceiptEventId, final ApiCallback<Void> aRespCallback) {
final Event lastEvent = (null != getStore()) ? getStore().getLatestEvent(getRoomId()) : null;
// reported by GA
if (null == lastEvent) {
Log.e(LOG_TAG, "## sendReadMarkers(): no last event");
return false;
}
Log.d(LOG_TAG, "## sendReadMarkers(): readMarkerEventId " + aReadMarkerEventId + " readReceiptEventId " + aReadReceiptEventId + " in room " + getRoomId());
boolean hasUpdate = false;
String readMarkerEventId = aReadMarkerEventId;
if (!TextUtils.isEmpty(aReadMarkerEventId)) {
if (!MXSession.isMessageId(aReadMarkerEventId)) {
Log.e(LOG_TAG, "## sendReadMarkers() : invalid event id " + readMarkerEventId);
// Read marker is invalid, ignore it
readMarkerEventId = null;
} else {
// Check if the read marker is updated
RoomSummary summary = getStore().getSummary(getRoomId());
if ((null != summary) && !TextUtils.equals(readMarkerEventId, summary.getReadMarkerEventId())) {
// Make sure the new read marker event is newer than the current one
final Event newReadMarkerEvent = getStore().getEvent(readMarkerEventId, getRoomId());
final Event currentReadMarkerEvent = getStore().getEvent(summary.getReadMarkerEventId(), getRoomId());
if (newReadMarkerEvent == null || currentReadMarkerEvent == null || newReadMarkerEvent.getOriginServerTs() > currentReadMarkerEvent.getOriginServerTs()) {
// Event is not in store (assume it is in the past), or is older than current one
Log.d(LOG_TAG, "## sendReadMarkers(): set new read marker event id " + readMarkerEventId + " in room " + getRoomId());
summary.setReadMarkerEventId(readMarkerEventId);
getStore().flushSummary(summary);
hasUpdate = true;
}
}
}
}
final String readReceiptEventId = (null == aReadReceiptEventId) ? lastEvent.eventId : aReadReceiptEventId;
// check if the read receipt event id is already read
if ((null != getStore()) && !getStore().isEventRead(getRoomId(), getDataHandler().getUserId(), readReceiptEventId)) {
// check if the event id update is allowed
if (handleReceiptData(new ReceiptData(mMyUserId, readReceiptEventId, System.currentTimeMillis()))) {
// (asap there is a valid network connection)
if (TextUtils.equals(lastEvent.eventId, readReceiptEventId)) {
clearUnreadCounters(getStore().getSummary(getRoomId()));
}
hasUpdate = true;
}
}
if (hasUpdate) {
setReadMarkers(readMarkerEventId, readReceiptEventId, aRespCallback);
}
return hasUpdate;
}
use of org.matrix.androidsdk.rest.model.Event in project matrix-android-sdk by matrix-org.
the class Room method markAllAsRead.
/**
* Mark all the messages as read.
* It also move the read marker to the latest known messages if updateReadMarker is set to true
*
* @param updateReadMarker true to move the read marker to the latest known event
* @param aRespCallback the asynchronous callback
* @return true if the request is sent, false otherwise
*/
private boolean markAllAsRead(boolean updateReadMarker, final ApiCallback<Void> aRespCallback) {
final Event lastEvent = (null != getStore()) ? getStore().getLatestEvent(getRoomId()) : null;
boolean res = sendReadMarkers(updateReadMarker ? ((null != lastEvent) ? lastEvent.eventId : null) : getReadMarkerEventId(), null, aRespCallback);
if (!res) {
RoomSummary summary = (null != getStore()) ? getStore().getSummary(getRoomId()) : null;
if (null != summary) {
if ((0 != summary.getUnreadEventsCount()) || (0 != summary.getHighlightCount()) || (0 != summary.getNotificationCount())) {
Log.e(LOG_TAG, "## markAllAsRead() : the summary events counters should be cleared for " + getRoomId() + " should have been cleared");
Event latestEvent = getStore().getLatestEvent(getRoomId());
summary.setLatestReceivedEvent(latestEvent);
if (null != latestEvent) {
summary.setReadReceiptEventId(latestEvent.eventId);
} else {
summary.setReadReceiptEventId(null);
}
summary.setUnreadEventsCount(0);
summary.setHighlightCount(0);
summary.setNotificationCount(0);
getStore().flushSummary(summary);
}
} else {
Log.e(LOG_TAG, "## sendReadReceipt() : no summary for " + getRoomId());
}
if ((0 != getLiveState().getNotificationCount()) || (0 != getLiveState().getHighlightCount())) {
Log.e(LOG_TAG, "## markAllAsRead() : the notification messages count for " + getRoomId() + " should have been cleared");
getLiveState().setNotificationCount(0);
getLiveState().setHighlightCount(0);
if (null != getStore()) {
getStore().storeLiveStateForRoom(getRoomId());
}
}
}
return res;
}
use of org.matrix.androidsdk.rest.model.Event in project matrix-android-sdk by matrix-org.
the class MXMegolmDecryption method onNewSession.
/**
* Check if the some messages can be decrypted with a new session
*
* @param senderKey the session sender key
* @param sessionId the session id
*/
public void onNewSession(String senderKey, String sessionId) {
String k = senderKey + "|" + sessionId;
HashMap<String, ArrayList<Event>> pending = mPendingEvents.get(k);
if (null != pending) {
// Have another go at decrypting events sent with this session.
mPendingEvents.remove(k);
Set<String> timelineIds = pending.keySet();
for (String timelineId : timelineIds) {
ArrayList<Event> events = pending.get(timelineId);
for (Event event : events) {
MXEventDecryptionResult result = null;
try {
result = decryptEvent(event, TextUtils.isEmpty(timelineId) ? null : timelineId);
} catch (MXDecryptionException e) {
Log.e(LOG_TAG, "## onNewSession() : Still can't decrypt " + event.eventId + ". Error " + e.getMessage());
event.setCryptoError(e.getCryptoError());
}
if (null != result) {
final Event fEvent = event;
final MXEventDecryptionResult fResut = result;
mSession.getCrypto().getUIHandler().post(new Runnable() {
@Override
public void run() {
fEvent.setClearData(fResut);
mSession.getDataHandler().onEventDecrypted(fEvent);
}
});
Log.d(LOG_TAG, "## onNewSession() : successful re-decryption of " + event.eventId);
}
}
}
}
}
Aggregations