package de.geeksfactory.opacclient.networking; import android.content.Context; import android.os.AsyncTask; import android.util.Log; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.util.EntityUtils; import java.io.IOException; import java.util.HashSet; import de.geeksfactory.opacclient.objects.CoverHolder; import de.geeksfactory.opacclient.utils.Base64; import de.geeksfactory.opacclient.utils.ISBNTools; public abstract class CoverDownloadTask extends AsyncTask<Void, Integer, CoverHolder> { protected static HashSet<String> rejectImages = new HashSet<>(); protected int width = 0; protected int height = 0; static { rejectImages.add( "R0lGODlhOwBLAIAAALy8vf///yH5BAEAAAEALAAAAAA7AEsAAAL/jI+py+0Po5y0" + "2ouz3rz7D2rASJbmiYYGyralGrhyqrbTW4+rGeEhmeA5fCCg4sQgfowLFkLpYTaE" + "O10OIJFCO9KhtYq9Zr+xbpTsDYNh5iR5y2k33/JNPUhHn9UP7T3zd+Cnx0U4xwdn" + "Z3iUx7e0iIcYeDFZJgkJiCnYyKZZ9VRZUTnouDd2WVqYegjqaTHKebUa6SSLKdOJ" + "5GYDY0nVWtvrqxSa61PciytMwbss+uvMjBxNXW19jZ29bHVJu/MNvqmTCK4WhvbF" + "bS65EnPqXiaIJ26Eg/6HVW8+327fHg9kVpBw5xylc6eu3jeBTwh28bewIJh807RZ" + "vIgxo8aNRxw7ZlNXbt04RvT+lXQjL57KciT/nRuY5iW8YzJPQjx5xKVCeCoNurTE" + "0+QukBNZAsu3ECbKnhIBBnwaMWFBVx6rWr2KdUIBADs="); rejectImages.add( "R0lGODlhOwBLAIABALy8vf///yH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEKAAEA" + "LAAAAAA7AEsAAAJHjI+py+0Po5y02ouz3rz7D4biSJbmiabqyrbuC8fyTNf2jef6z" + "vf+DwwKh8Si8YhMKpfMpvMJjUqn1Kr1is1qt9yu9wsO6woAOw=="); } protected CoverHolder item; protected Context context; protected HttpClient httpClient; public CoverDownloadTask(Context context, CoverHolder item, HttpClient httpClient) { this.item = item; this.context = context; this.httpClient = httpClient; } @Override protected CoverHolder doInBackground(Void... voids) { if (item.getCover() != null && item.getCoverBitmap() == null) { try { if (width == 0 && height == 0) { // Use default float density = context.getResources().getDisplayMetrics().density; width = height = (int) density * 56; } HttpGet httpget = new HttpGet(ISBNTools.getBestSizeCoverUrl(item.getCover(), width, height)); HttpResponse response; try { response = httpClient.execute(httpget); if (response.getStatusLine().getStatusCode() >= 400) { item.setCover(null); } HttpEntity entity = response.getEntity(); byte[] bytes = EntityUtils.toByteArray(entity); if (rejectImages.contains(Base64.encodeBytes(bytes))) { // OPACs like VuFind have a 'cover proxy' that returns a simple GIF with // the text 'no image available' if no cover was found. We don't want to // display this image but the media type, // so we detect it. We do this here // instead of in the API implementation because only this way it can be // done asynchronously. item.setCover(null); } else { if (bytes.length > 64) { item.setCoverBitmap(bytes); } else { // When images embedded from Amazon aren't available, a // 1x1 // pixel image is returned (iOPAC) item.setCover(null); } } } catch (IOException e) { e.printStackTrace(); } } catch (OutOfMemoryError e) { item.setCoverBitmap(null); item.setCover(null); Log.i("CoverDownloadTask", "OutOfMemoryError"); return item; } catch (Exception e) { e.printStackTrace(); } } return item; } protected abstract void onPostExecute(CoverHolder result); }