package com.badoo.chateau.example.data.repos.messages.cache; import android.support.annotation.NonNull; import com.badoo.chateau.core.repos.messages.MessageDataSource.LoadResult; import com.badoo.chateau.core.repos.messages.MessageDataSource.Update; import com.badoo.chateau.core.repos.messages.MessageQueries.LoadQuery; import com.badoo.chateau.example.data.model.ExampleMessage; import java.util.ArrayList; import java.util.List; /** * Entry in the messages memory cache representing one */ public class CacheEntry { private static final boolean DEBUG = true; private static final String TAG = CacheEntry.class.getSimpleName(); private final List<ExampleMessage> mMessages = new ArrayList<>(); private boolean mCanLoadOlder; private boolean mCanLoadNewer; CacheEntry() { } @NonNull public List<ExampleMessage> getMessages() { return mMessages; } public void update(@NonNull Update<ExampleMessage> update) { switch (update.getAction()) { case ADDED: mMessages.add(update.getNewMessage()); break; case UPDATED: replace(update.getNewMessage(), update.getOldMessage()); } } public void update(@NonNull LoadQuery<ExampleMessage> query, @NonNull LoadResult<ExampleMessage> result) { switch (query.getType()) { case ALL: mMessages.clear(); mMessages.addAll(result.getMessages()); mCanLoadOlder = result.canLoadOlder(); mCanLoadNewer = result.canLoadNewer(); break; case OLDER: mMessages.addAll(0, result.getMessages()); mCanLoadOlder = result.canLoadOlder(); break; case NEWER: mMessages.addAll(result.getMessages()); mCanLoadNewer = result.canLoadNewer(); break; } } public boolean canLoadOlder() { return mCanLoadOlder; } public boolean canLoadNewer() { return mCanLoadNewer; } public ExampleMessage oldest() { return mMessages.isEmpty()? null : mMessages.get(0); } public ExampleMessage newest() { return mMessages.isEmpty()? null : mMessages.get(mMessages.size() - 1); } private void replace(ExampleMessage newMessage, ExampleMessage oldMessage) { if (oldMessage == null) { oldMessage = newMessage; } for (int i = mMessages.size() - 1; i >= 0; i--) { ExampleMessage candidate = mMessages.get(i); final boolean idMatches = !candidate.isUnconfirmed() && candidate.getId().equals(oldMessage.getId()); final boolean localIdMatches = candidate.isUnconfirmed() && candidate.getLocalId().equals(oldMessage.getLocalId()); if (idMatches || localIdMatches) { mMessages.set(i, newMessage); return; } } } }