Search in sources :

Example 16 with Event

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

Example 17 with Event

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

Example 18 with Event

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

Example 19 with Event

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

Example 20 with Event

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

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