package com.badoo.chateau.core.repos.messages; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import com.badoo.barf.data.repo.annotations.Handles; import com.badoo.chateau.core.model.Message; import com.badoo.chateau.core.repos.messages.MessageQueries.GetUndeliveredQuery; import com.badoo.chateau.core.repos.messages.MessageQueries.LoadQuery; import com.badoo.chateau.core.repos.messages.MessageQueries.SendQuery; import com.badoo.chateau.core.repos.messages.MessageQueries.SubscribeQuery; import java.util.List; import rx.Observable; /** * Defines a data source providing messages for the {@link MessageRepository} */ public interface MessageDataSource<M extends Message> { class LoadResult<M extends Message> { private final List<M> mMessages; private final boolean mCanLoadOlder; private final boolean mCanLoadNewer; public LoadResult(@NonNull List<M> messages, boolean canLoadOlder, boolean canLoadNewer) { mMessages = messages; mCanLoadOlder = canLoadOlder; mCanLoadNewer = canLoadNewer; } @NonNull public List<M> getMessages() { return mMessages; } public boolean canLoadOlder() { return mCanLoadOlder; } public boolean canLoadNewer() { return mCanLoadNewer; } } class Update<M extends Message> { private final String mConversationId; private final Action mAction; private final M mNewMessage; private final M mOldMessage; public Update(@NonNull String conversationId, @NonNull Action action, @Nullable M oldMessage, @Nullable M newMessage) { mConversationId = conversationId; mAction = action; mNewMessage = newMessage; mOldMessage = oldMessage; } @NonNull public String getConversationId() { return mConversationId; } public Action getAction() { return mAction; } public M getNewMessage() { return mNewMessage; } public M getOldMessage() { return mOldMessage; } public enum Action { ADDED, UPDATED, READ, REMOVED, INVALIDATE_ALL } @Override public String toString() { return "Update{" + "mConversationId='" + mConversationId + '\'' + ", mAction=" + mAction + ", mNewMessage=" + mNewMessage + ", mOldMessage=" + mOldMessage + '}'; } } /** * Instructs the data source to load more messages. */ @NonNull @Handles(LoadQuery.class) Observable<LoadResult<M>> load(@NonNull LoadQuery<M> query); /** * Returns an Observable that will emit all messages that have failed to be delivered. */ @NonNull @Handles(GetUndeliveredQuery.class) Observable<List<M>> getUndelivered(@NonNull GetUndeliveredQuery<M> query); /** * Sends a new message */ @NonNull @Handles(SendQuery.class) Observable<Void> send(@NonNull SendQuery<M> query); /** * Returns an observable that will emit the messages in the data source as well as updates if the data changes. * These updates contain the entire data set. */ @NonNull @Handles(SubscribeQuery.class) Observable<Update<M>> subscribe(@NonNull SubscribeQuery<M> query); }