package shts.jp.android.nogifeed.utils;
import android.content.Context;
import android.os.Looper;
import android.util.Log;
import java.io.File;
import java.util.List;
import shts.jp.android.nogifeed.models.eventbus.BusHolder;
/**
* 設定された秒数までコールバックを待ち合わせる画像ダウンローダー
* ダウンロードが早く終了しチラついて見える現象を回避するため
*/
public class WaitMinimunImageDownloader extends ImageDownloader {
private static final String TAG = WaitMinimunImageDownloader.class.getSimpleName();
public WaitMinimunImageDownloader(Context context, List<String> urls) { super(context, urls);}
private boolean isTimeUp = false;
private boolean isFinishDownload = false;
private List<Response> responseList;
private final Object LOCK = new Object();
/**
* ダウンロード完了のコールバック
*/
public static class Callback {
/** 1ファイルのダウンロード終了ごとにコールされる */
public static class ResponseDownloadImage {
public final File file;
ResponseDownloadImage(File file) { this.file = file; }
}
/** すべてのファイルのダウンロードが終了したらコールされる */
public static class CompleteDownloadImage {
public List<Response> responseList;
CompleteDownloadImage(List<Response> responseList) { this.responseList = responseList; }
}
}
@Override
final public void onStart() {
super.onStart();
Log.i(TAG, "onStart");
isTimeUp = false;
isFinishDownload = false;
new android.os.Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
@Override
public void run() {
Log.i(TAG, "time up");
synchronized (LOCK) {
isTimeUp = true;
if (isFinishDownload) {
BusHolder.get().post(new Callback.CompleteDownloadImage(responseList));
}
}
}
}, getWaitTime());
}
@Override
final public void onResponse(Response response) {
if (response.result != Response.Result.SUCCESS) {
Log.e(TAG, "failed to download image : response("
+ response.toString() + ")");
}
BusHolder.get().post(new Callback.ResponseDownloadImage(response.file));
}
@Override
final public void onComplete(List<Response> responseList) {
Log.i(TAG, "onComplete");
this.responseList = responseList;
synchronized (LOCK) {
isFinishDownload = true;
if (isTimeUp) {
BusHolder.get().post(new Callback.CompleteDownloadImage(responseList));
}
}
}
/**
* 待ち合わせ時間(ms)
* @return デフォルトは1秒
*/
public int getWaitTime() {
return 1500;
}
}