Search in sources :

Example 51 with Event

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

Example 52 with Event

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

Example 53 with Event

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

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

Example 55 with Event

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

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