package com.badoo.chateau.core.repos.conversations; import android.support.annotation.NonNull; import com.badoo.barf.data.repo.annotations.Handles; import com.badoo.chateau.core.model.Conversation; import com.badoo.chateau.core.repos.conversations.ConversationQueries.CreateConversationQuery; import com.badoo.chateau.core.repos.conversations.ConversationQueries.CreateGroupConversationQuery; import com.badoo.chateau.core.repos.conversations.ConversationQueries.DeleteConversationsQuery; import com.badoo.chateau.core.repos.conversations.ConversationQueries.GetConversationQuery; import com.badoo.chateau.core.repos.conversations.ConversationQueries.LoadConversationsQuery; import com.badoo.chateau.core.repos.conversations.ConversationQueries.MarkConversationReadQuery; import com.badoo.chateau.core.repos.conversations.ConversationQueries.SubscribeToUpdatesQuery; import java.util.List; import rx.Observable; /** * Defines a data source providing conversations */ public interface ConversationDataSource<C extends Conversation> { /** * Class used to indicate what can be subsequently loaded after a call to {@link #load(LoadConversationsQuery)} */ class LoadResult<C extends Conversation> { private final List<C> mConversations; private final boolean mCanMoveBackwards; private final boolean mCanMoveForwards; public LoadResult(@NonNull List<C> conversations, boolean canMoveBackwards, boolean canMoveForwards) { mCanMoveBackwards = canMoveBackwards; mCanMoveForwards = canMoveForwards; mConversations = conversations; } public List<C> getConversations() { return mConversations; } public boolean canMoveBackwards() { return mCanMoveBackwards; } public boolean canMoveForwards() { return mCanMoveForwards; } @Override public String toString() { return "LoadResult{" + "mConversations=" + mConversations.size() + ", mCanMoveBackwards=" + mCanMoveBackwards + ", mCanMoveForwards=" + mCanMoveForwards + '}'; } } /** * Loads conversations and publishes updates via {@link #subscribe(SubscribeToUpdatesQuery)}. The returned observable * contains a single boolean indicating if it is possible to get more conversations in this direction. For example if a request was made * with chunkBefore, <code>true</code> would be published if requesting using chunkBefore for the oldest conversation could return more * data. <code>true</code> will always be returned if chunkBefore and chunkAfter are <code>null</code> */ @Handles(LoadConversationsQuery.class) @NonNull Observable<LoadResult<C>> load(LoadConversationsQuery<C> query); /** * Marks a conversation as read up to the latest message */ @Handles(MarkConversationReadQuery.class) @NonNull Observable<Void> markRead(MarkConversationReadQuery query); /** * Marks a conversation as read up to the latest message */ @Handles(DeleteConversationsQuery.class) @NonNull Observable<List<C>> delete(DeleteConversationsQuery<C> query); /** * Notifies when new data is available to be loaded */ @Handles(SubscribeToUpdatesQuery.class) @NonNull Observable<Boolean> subscribe(SubscribeToUpdatesQuery query); /** * Returns an single conversation matching the query if it exists. */ @Handles(GetConversationQuery.class) @NonNull Observable<C> get(GetConversationQuery query); //TODO Move to example app ext. data source /** * Creates a conversation for a given list of users */ @Handles(CreateConversationQuery.class) @NonNull Observable<C> create(CreateConversationQuery<C> query); //TODO Move to example app ext. data source /** * Creates a conversation for a given list of users */ @Handles(CreateGroupConversationQuery.class) @NonNull Observable<C> create(CreateGroupConversationQuery<C> query); }