package com.philosophicalhacker.philhackernews.daggermodules;
import android.content.Context;
import android.database.Cursor;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import com.philosophicalhacker.philhackernews.data.DataConverter;
import com.philosophicalhacker.philhackernews.data.LoaderInitializingOnSubscribe;
import com.philosophicalhacker.philhackernews.data.cache.HackerNewsData;
import com.philosophicalhacker.philhackernews.data.repository.CacheOnlyCommentRepository;
import com.philosophicalhacker.philhackernews.data.repository.CacheOnlyStoryRepository;
import com.philosophicalhacker.philhackernews.data.repository.CommentRepository;
import com.philosophicalhacker.philhackernews.data.repository.StoryRepository;
import com.philosophicalhacker.philhackernews.model.Item;
import com.philosophicalhacker.philhackernews.ui.commentslist.CommentsFragment;
import com.philosophicalhacker.philhackernews.ui.storieslist.StoriesFragment;
import java.util.List;
import dagger.Module;
import dagger.Provides;
import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
/**
* Provides dependencies required for Loading HackerNews Data
*
* Created by MattDupree on 7/16/15.
*/
@Module(injects = {StoriesFragment.class,
CommentsFragment.class},
addsTo = PhilHackerNewsAppModule.class,
complete = false)
public class RepositoryModule {
private static final int API_STORY_LOADER = 0;
private LoaderManager mLoaderManager;
public RepositoryModule(LoaderManager loaderManager) {
mLoaderManager = loaderManager;
}
@Provides
LoaderManager provideLoaderManager() {
return mLoaderManager;
}
@Provides
CursorLoader provideStoryLoader(Context context) {
return new CursorLoader(context, HackerNewsData.Items.CONTENT_URI, null,
HackerNewsData.Items.TYPE + "= ?", new String[] {Item.TYPE_STORY},
HackerNewsData.Items.SortOrder.SCORE_DESC_SORT_ORDER);
}
@Provides
Observable<List<Item>> provideApiStoriesObservable(LoaderManager loaderManager,
CursorLoader storyLoader,
DataConverter<List<Item>, Cursor> cursorDataConverter) {
return Observable.create(new LoaderInitializingOnSubscribe<>(API_STORY_LOADER, loaderManager, storyLoader, cursorDataConverter))
.observeOn(AndroidSchedulers.mainThread());
}
@Provides
StoryRepository provideStoryRepository(Observable<List<Item>> apiStoriesObservable) {
return new CacheOnlyStoryRepository(apiStoriesObservable);
}
@Provides
CommentRepository provideCommentRepository(LoaderManager loaderManager, Context context,
DataConverter<List<Item>, Cursor> dataConverter) {
return new CacheOnlyCommentRepository(loaderManager, context, dataConverter);
}
}