package fr.ydelouis.selfoss.adapter;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.view.View;
import com.j256.ormlite.dao.RuntimeExceptionDao;
import org.androidannotations.annotations.AfterInject;
import org.androidannotations.annotations.Background;
import org.androidannotations.annotations.Bean;
import org.androidannotations.annotations.EBean;
import org.androidannotations.annotations.OrmLiteDao;
import org.androidannotations.annotations.RootContext;
import org.androidannotations.annotations.UiThread;
import java.util.List;
import fr.ydelouis.selfoss.entity.Article;
import fr.ydelouis.selfoss.entity.ArticleType;
import fr.ydelouis.selfoss.entity.Filter;
import fr.ydelouis.selfoss.entity.Source;
import fr.ydelouis.selfoss.entity.Tag;
import fr.ydelouis.selfoss.model.ArticleDao;
import fr.ydelouis.selfoss.model.ArticleProvider;
import fr.ydelouis.selfoss.model.DatabaseHelper;
import fr.ydelouis.selfoss.model.TagDao;
import fr.ydelouis.selfoss.sync.ArticleSync;
import fr.ydelouis.selfoss.view.ArticleView;
import fr.ydelouis.selfoss.view.ArticleView_;
@EBean
public class ArticleAdapter extends PagedAdapter<Article> implements ArticleProvider.Listener {
private static final int ANTICIPATION = 5;
@RootContext protected Context context;
@Bean protected ArticleProvider provider;
@OrmLiteDao(helper = DatabaseHelper.class)
protected TagDao tagDao;
@OrmLiteDao(helper = DatabaseHelper.class)
protected RuntimeExceptionDao<Source, Integer> sourceDao;
private BroadcastReceiver updateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (ArticleDao.ACTION_UPDATE.equals(intent.getAction())) {
updateArticle((Article) intent.getParcelableExtra(ArticleDao.EXTRA_ARTICLE));
}
}
};
private BroadcastReceiver syncReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (ArticleSync.ACTION_NEW_SYNCED.equals(intent.getAction())
|| ArticleSync.ACTION_SYNC.equals(intent.getAction())) {
loadNewInBackground();
}
}
};
private BroadcastReceiver tableClearReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
reset();
}
};
public ArticleAdapter() {
setAnticipation(ANTICIPATION);
}
@AfterInject
protected void init() {
provider.setListener(this);
}
public void registerReceivers() {
IntentFilter syncIntentFilter = new IntentFilter(ArticleSync.ACTION_SYNC);
syncIntentFilter.addAction(ArticleSync.ACTION_NEW_SYNCED);
context.registerReceiver(syncReceiver, syncIntentFilter);
context.registerReceiver(updateReceiver, new IntentFilter(ArticleDao.ACTION_UPDATE));
context.registerReceiver(tableClearReceiver, new IntentFilter(DatabaseHelper.ACTION_TABLES_CLEARED));
}
public void unregisterReceivers() {
context.unregisterReceiver(updateReceiver);
context.unregisterReceiver(syncReceiver);
context.unregisterReceiver(tableClearReceiver);
}
@Override
public View getView(int position, View convertView) {
ArticleView view = (ArticleView) convertView;
if (view == null) {
view = ArticleView_.build(context);
}
Article article = getItem(position);
Source source = sourceDao.queryForId(article.getSourceId());
List<Tag> tags = null;
if (source != null) {
tags = tagDao.queryForNames(source.getTags());
}
view.bind(article, tags);
return view;
}
@Override
public void loadNextItems() {
super.loadNextItems();
loadNextInBackground();
}
@Background
protected void loadNextInBackground() {
int count = getItemCount();
Article lastArticle = null;
if (count > 0) {
lastArticle = getItem(count-1);
}
provider.loadNext(count, lastArticle);
}
@Override
@UiThread
public void onNextLoaded(List<Article> articles) {
onItemsLoaded(articles, false);
}
@Override
public void loadNewItems() {
super.loadNewItems();
if (getCount() > 0) {
loadNewInBackground();
} else {
loadNextInBackground();
}
}
@Background
protected void loadNewInBackground() {
Article firstArticle = null;
if (getCount() > 0) {
firstArticle = getItem(0);
}
provider.loadNew(firstArticle);
}
@Override
@UiThread
public void onNewLoaded(List<Article> articles) {
onItemsLoaded(articles, true);
}
private void updateArticle(Article article) {
if (isInList(article)) {
replace(article);
}
}
private boolean isInList(Article article) {
return article.isCached() == provider.getFilter().getType().equals(ArticleType.Newest);
}
public void setFilter(Filter filter) {
provider.setFilter(filter);
reset();
}
@Override
public long getItemId(int position) {
if (super.getItemId(position) == -1)
return -1;
return getItem(position).getId();
}
}