package org.sorz.lab.smallcloudemoji.tasks; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.util.LruCache; import org.sorz.lab.smallcloudemoji.adapters.StoreSourceAdapter; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.Date; /** * Set icon of source on store list from internet or local cache. */ public class LoadIStoreIconAsyncTask extends AsyncTask<String, Void, Bitmap> { final private static int MAX_FILE_LENGTH = 512 * 1024; // 512 KiB final private static int MAX_CACHE_PERIOD = 3600 * 24 * 30; // 30 days private final Context context; private final int position; private final StoreSourceAdapter.ViewHolder viewHolder; private final LruCache<String, Bitmap> memoryCache; public LoadIStoreIconAsyncTask(Context context, StoreSourceAdapter.ViewHolder viewHolder, LruCache<String, Bitmap> memoryCache) { this.context = context; this.viewHolder = viewHolder; this.memoryCache = memoryCache; position = viewHolder.position; } @Override protected Bitmap doInBackground(String... params) { String iconUrl = params[0]; // Try to retrieve from memory cache. Bitmap icon = memoryCache.get(iconUrl); if (icon != null) return icon; // Try to retrieve from file cache. File cacheFile = new File(context.getCacheDir(), "icon-" + iconUrl.hashCode() + ".webp"); long currentTime = new Date().getTime(); if (cacheFile.exists()) { if (currentTime - cacheFile.lastModified() < MAX_CACHE_PERIOD) { icon = BitmapFactory.decodeFile(cacheFile.getPath()); memoryCache.put(iconUrl, icon); return icon; } else { // Cache expired. //noinspection ResultOfMethodCallIgnored cacheFile.delete(); } } // Download from URL. HttpURLConnection connection = null; InputStream inputStream = null; OutputStream outputStream = null; try { URL url = new URL(iconUrl); connection = (HttpURLConnection) url.openConnection(); if (connection.getContentLength() > MAX_FILE_LENGTH) { return null; } inputStream = new BufferedInputStream(connection.getInputStream()); icon = BitmapFactory.decodeStream(inputStream); memoryCache.put(iconUrl, icon); outputStream = new BufferedOutputStream(new FileOutputStream(cacheFile)); icon.compress(Bitmap.CompressFormat.WEBP, 80, outputStream); return icon; } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (inputStream != null) inputStream.close(); if (outputStream != null) outputStream.close(); } catch (IOException e) { // Ignore it } if (connection != null) connection.disconnect(); } return null; } @Override protected void onPostExecute(Bitmap result) { if (viewHolder.position == position) { viewHolder.icon.setImageBitmap(result); } } }