package shts.jp.android.nogifeed.utils; import android.content.Context; import android.util.Log; import com.loopj.android.http.AsyncHttpClient; import com.loopj.android.http.FileAsyncHttpResponseHandler; import org.apache.http.Header; import java.io.File; import java.util.ArrayList; import java.util.List; class ImageDownloader { private static final String TAG = ImageDownloader.class.getSimpleName(); private static AsyncHttpClient client = new AsyncHttpClient(); private final List<String> urls; private final Context context; private List<FileAsyncHttpResponseHandler> handlers = new ArrayList<>(); private List<Response> responseList = new ArrayList<>(); private int counter = 0; public ImageDownloader(Context context, List<String> urls) { this.context = context; this.urls = urls; for (String url : urls) { handlers.add(createResponseHandler(url)); } } private FileAsyncHttpResponseHandler createResponseHandler(final String url) { final File file = getFileFromUrl(url); return new FileAsyncHttpResponseHandler(file) { @Override public void onFailure(int statusCode, Header[] headers, Throwable throwable, File file) { final Response res = new Response( Response.Result.FAILED, url, statusCode, headers, throwable, file); responseList.add(res); onResponse(res); addCounter(); } @Override public void onSuccess(int statusCode, Header[] headers, File file) { final Response res = new Response( Response.Result.SUCCESS, url, statusCode, headers, null, file); responseList.add(res); onResponse(res); addCounter(); } }; } public final boolean get() { if (!NetworkUtils.enableNetwork(context)) { Log.w(TAG, "cannot start download because of enable network"); return false; } onStart(); final int N = urls.size(); for (int i = 0; i < N; i++) { client.get(urls.get(i), handlers.get(i)); } return true; } private void addCounter() { counter++; if (urls.size() <= counter) { onComplete(responseList); } } public static final class Response { enum Result { SUCCESS, FAILED} final Result result; final String url; final int statusCode; final Header[] headers; final Throwable throwable; final File file; Response(Result result, String url, int statusCode, Header[] headers, Throwable throwable, File file) { this.result = result; this.url = url; this.statusCode = statusCode; this.headers = headers; this.throwable = throwable; this.file = file; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("result(").append(result.name()).append(") "); sb.append("url(").append(url).append(") "); sb.append("statusCode(").append(statusCode).append(") "); sb.append("headers(").append((headers == null?"null":headers)).append(") "); sb.append("throwable(").append(throwable).append(") "); sb.append("file(").append(file).append(") "); return sb.toString(); } public File getFile() { return file; } } public File getFileFromUrl(String url) { // デフォルトは標準のダウンロードフォルダを指定 return new File(SdCardUtils.getDownloadFilePath(url)); } public void onStart() {} public void onResponse(Response response) {} public void onComplete(List<Response> responseList) {} }