Search in sources :

Example 26 with Event

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();
    }
}
Also used : Event(org.matrix.androidsdk.rest.model.Event)

Example 27 with Event

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);
        }
    });
}
Also used : RoomMember(org.matrix.androidsdk.rest.model.RoomMember) Event(org.matrix.androidsdk.rest.model.Event) Handler(android.os.Handler) MXDataHandler(org.matrix.androidsdk.MXDataHandler) MatrixError(org.matrix.androidsdk.rest.model.MatrixError)

Example 28 with 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;
}
Also used : Event(org.matrix.androidsdk.rest.model.Event) ReceiptData(org.matrix.androidsdk.rest.model.ReceiptData)

Example 29 with Event

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;
}
Also used : Event(org.matrix.androidsdk.rest.model.Event)

Example 30 with Event

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);
                }
            }
        }
    }
}
Also used : MXEventDecryptionResult(org.matrix.androidsdk.crypto.MXEventDecryptionResult) MXDecryptionException(org.matrix.androidsdk.crypto.MXDecryptionException) ArrayList(java.util.ArrayList) Event(org.matrix.androidsdk.rest.model.Event)

Aggregations

Event (org.matrix.androidsdk.rest.model.Event)73 ArrayList (java.util.ArrayList)31 JsonObject (com.google.gson.JsonObject)28 Room (org.matrix.androidsdk.data.Room)27 MatrixError (org.matrix.androidsdk.rest.model.MatrixError)27 HashMap (java.util.HashMap)23 CountDownLatch (java.util.concurrent.CountDownLatch)22 RoomState (org.matrix.androidsdk.data.RoomState)21 Test (org.junit.Test)20 MXEventListener (org.matrix.androidsdk.listeners.MXEventListener)19 Context (android.content.Context)14 MotionEvent (android.view.MotionEvent)9 EventTimeline (org.matrix.androidsdk.data.EventTimeline)9 IMXStore (org.matrix.androidsdk.data.store.IMXStore)7 ReceiptData (org.matrix.androidsdk.rest.model.ReceiptData)6 RoomMember (org.matrix.androidsdk.rest.model.RoomMember)6 Credentials (org.matrix.androidsdk.rest.model.login.Credentials)6 Uri (android.net.Uri)5 File (java.io.File)4 MessageRow (org.matrix.androidsdk.adapters.MessageRow)4