Search in sources :

Example 1 with TokensChunkResponse

use of org.matrix.androidsdk.rest.model.TokensChunkResponse in project matrix-android-sdk by matrix-org.

the class MXMemoryStore method getEarlierMessages.

@Override
public TokensChunkResponse<Event> getEarlierMessages(final String roomId, final String fromToken, final int limit) {
    // For older requests (providing a token), returning null for now
    if (null != roomId) {
        ArrayList<Event> eventsList;
        synchronized (mRoomEventsLock) {
            LinkedHashMap<String, Event> events = mRoomEvents.get(roomId);
            if ((events == null) || (events.size() == 0)) {
                return null;
            }
            // reach the end of the stored items
            if (TextUtils.equals(mRoomTokens.get(roomId), fromToken)) {
                return null;
            }
            // check if the token is known in the sublist
            eventsList = new ArrayList<>(events.values());
        }
        ArrayList<Event> subEventsList = new ArrayList<>();
        // search from the latest to the oldest events
        Collections.reverse(eventsList);
        TokensChunkResponse<Event> response = new TokensChunkResponse<>();
        // start the latest event and there is enough events to provide to the caller ?
        if ((null == fromToken) && (eventsList.size() <= limit)) {
            subEventsList = eventsList;
        } else {
            int index = 0;
            if (null != fromToken) {
                // search if token is one of the stored events
                for (; (index < eventsList.size()) && (!TextUtils.equals(fromToken, eventsList.get(index).mToken)); index++) ;
                index++;
            }
            // found it ?
            if (index < eventsList.size()) {
                for (; index < eventsList.size(); index++) {
                    Event event = eventsList.get(index);
                    subEventsList.add(event);
                    // loop until to find an event with a token
                    if ((subEventsList.size() >= limit) && (event.mToken != null)) {
                        break;
                    }
                }
            }
        }
        // unknown token
        if (subEventsList.size() == 0) {
            return null;
        }
        response.chunk = subEventsList;
        Event firstEvent = subEventsList.get(0);
        Event lastEvent = subEventsList.get(subEventsList.size() - 1);
        response.start = firstEvent.mToken;
        // unknown last event token, use the latest known one
        if ((null == lastEvent.mToken) && !TextUtils.isEmpty(mRoomTokens.get(roomId))) {
            lastEvent.mToken = mRoomTokens.get(roomId);
        }
        response.end = lastEvent.mToken;
        return response;
    }
    return null;
}
Also used : TokensChunkResponse(org.matrix.androidsdk.rest.model.TokensChunkResponse) ArrayList(java.util.ArrayList) Event(org.matrix.androidsdk.rest.model.Event)

Aggregations

ArrayList (java.util.ArrayList)1 Event (org.matrix.androidsdk.rest.model.Event)1 TokensChunkResponse (org.matrix.androidsdk.rest.model.TokensChunkResponse)1