package fr.ydelouis.selfoss.rest; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Color; import org.androidannotations.annotations.AfterInject; import org.androidannotations.annotations.Bean; import org.androidannotations.annotations.EBean; import org.androidannotations.annotations.OrmLiteDao; import org.androidannotations.annotations.RootContext; import org.androidannotations.annotations.rest.RestService; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.List; import fr.ydelouis.selfoss.entity.Article; import fr.ydelouis.selfoss.entity.ArticleType; import fr.ydelouis.selfoss.entity.Tag; import fr.ydelouis.selfoss.model.ArticleSyncActionDao; import fr.ydelouis.selfoss.model.DatabaseHelper; import fr.ydelouis.selfoss.sync.ArticleSyncAction; import fr.ydelouis.selfoss.util.ArticleContentParser; import fr.ydelouis.selfoss.util.SelfossImageLoader; @EBean public class SelfossRestWrapper { @RestService protected SelfossRest rest; @OrmLiteDao(helper = DatabaseHelper.class) protected ArticleSyncActionDao articleSyncActionDao; @Bean protected SelfossImageLoader imageLoader; public List<Article> listArticles(int offset, int count) { return preProcess(rest.listArticles(offset, count)); } public List<Article> listUpdatedArticles(int offset, int count, String updateTime) { String encodedUpdateTime = updateTime; try { encodedUpdateTime = URLEncoder.encode(updateTime, "UTF-8"); } catch (UnsupportedEncodingException ignored) {} return preProcess(rest.listUpdatedArticles(offset, count, encodedUpdateTime)); } public List<Article> listArticles(Tag tag, int offset, int count) { return preProcess(rest.listArticles(tag, offset, count)); } public List<Article> listArticles(int sourceId, int offset, int count) { return preProcess(rest.listArticles(sourceId, offset, count)); } public List<Article> listArticles(ArticleType type, Tag tag, int offset, int count) { return preProcess(rest.listArticles(type, tag, offset, count)); } public List<Article> listArticles(ArticleType type, int sourceId, int offset, int count) { return preProcess(rest.listArticles(type, sourceId, offset, count)); } public List<Article> listArticles(ArticleType type, int offset, int count) { return preProcess(rest.listArticles(type, offset, count)); } public List<Article> listUnreadArticles(int offset, int count) { return preProcess(rest.listUnreadArticles(offset, count)); } public List<Article> listStarredArticles(int offset, int count) { return preProcess(rest.listStarredArticles(offset, count)); } private List<Article> preProcess(List<Article> articles) { if (articles != null) { for (Article article : articles) { preProcess(article); } } return articles; } private void preProcess(Article article) { applySyncAction(article); extractImage(article); } private void applySyncAction(Article article) { ArticleSyncAction syncAction = articleSyncActionDao.queryForArticle(article); if (syncAction != null) { syncAction.getAction().execute(article); } } private void extractImage(Article article) { ArticleContentParser parser = new ArticleContentParser(article); List<String> imageUrls = parser.getImagesUrls(); for (String imageUrl : imageUrls) { if (isImageDisplayable(imageUrl)) { article.setImageUrl(imageUrl); return; } } } private boolean isImageDisplayable(String imageUrl) { Bitmap bitmap = imageLoader.loadImageSync(imageUrl); return isDisplayable(bitmap); } private boolean isDisplayable(Bitmap bitmap) { if (bitmap == null) { return false; } if (bitmap.getWidth() < 50 || bitmap.getHeight() < 50) { return false; } for (int x = 0; x < bitmap.getWidth(); x++) { for (int y = 0; y < bitmap.getHeight(); y++) { if (bitmap.getPixel(x, y) != Color.WHITE) { return true; } } } return false; } }