package fr.ydelouis.selfoss.util;
import android.content.Context;
import android.graphics.Bitmap;
import android.util.Base64;
import android.util.Log;
import android.widget.ImageView;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
import com.nostra13.universalimageloader.core.download.ImageDownloader;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
import org.androidannotations.annotations.AfterInject;
import org.androidannotations.annotations.Bean;
import org.androidannotations.annotations.EBean;
import org.androidannotations.annotations.RootContext;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.Charset;
import fr.ydelouis.selfoss.config.model.Config;
import fr.ydelouis.selfoss.config.model.ConfigManager;
import fr.ydelouis.selfoss.entity.Article;
import fr.ydelouis.selfoss.entity.Source;
import fr.ydelouis.selfoss.rest.SelfossApiRequestFactory;
@EBean
public class SelfossImageLoader implements ImageDownloader {
@Bean protected ConfigManager configManager;
@RootContext protected Context context;
@Bean protected SelfossApiRequestFactory requestFactory;
private ImageLoader loader;
@AfterInject
protected void init() {
DisplayImageOptions options = new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(true)
.displayer(new FadeInBitmapDisplayer(500, true, false, false))
.build();
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
.defaultDisplayImageOptions(options)
.imageDownloader(this)
.build();
loader = com.nostra13.universalimageloader.core.ImageLoader.getInstance();
if (!loader.isInited()) {
loader.init(config);
}
}
public String faviconUrl(String favicon) {
Config config = configManager.get();
String url = config != null ? config.getUrl() : "";
return getScheme() + url + "/favicons/" + favicon;
}
private String getScheme() {
Config config = configManager.get();
boolean useHttps = config != null && config.useHttps();
return useHttps ? "https://" : "http://";
}
public String faviconUrl(Article article) {
return faviconUrl(article.getIcon());
}
public String faviconUrl(Source source) {
return faviconUrl(source.getIcon());
}
public void displayFavicon(Article article, ImageLoadingListener listener) {
loader.loadImage(faviconUrl(article), listener);
}
public void displayFavicon(Article article, ImageView imageView) {
loader.displayImage(faviconUrl(article), imageView);
}
public void displayFavicon(Source source, ImageView imageView) {
loader.displayImage(faviconUrl(source), imageView);
}
public void displayImage(Article article, ImageView image) {
loader.displayImage(article.getImageUrl(), image);
}
public Bitmap loadImageSync(String imageUrl) {
return loader.loadImageSync(imageUrl);
}
@Override
public InputStream getStream(String imageUrl, Object extra) throws IOException {
Config config = configManager.get();
Log.d("Plop", imageUrl);
URL url = new URL(imageUrl);
URLConnection http = url.openConnection();
if (config != null && config.requireAuth()) {
String auth = config.getUsername() + ":" + config.getPassword();
String authHeader = "Basic " + Base64.encodeToString(auth.getBytes(Charset.forName("US-ASCII")), Base64.DEFAULT);
http.setRequestProperty("Authorization", authHeader);
}
return http.getInputStream();
}
}