Move download logic to filecache.

captchafix
Florens Douwes 11 years ago
parent b74f73f316
commit 7cc111ed2e
  1. 299
      Clover/app/src/main/java/org/floens/chan/ui/view/ThumbnailImageView.java
  2. 72
      Clover/app/src/main/java/org/floens/chan/utils/FileCache.java

@ -31,19 +31,15 @@ import com.android.volley.VolleyError;
import com.android.volley.toolbox.ImageLoader.ImageContainer; import com.android.volley.toolbox.ImageLoader.ImageContainer;
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView; import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
import com.koushikdutta.async.future.Future; import com.koushikdutta.async.future.Future;
import com.koushikdutta.async.future.FutureCallback;
import com.koushikdutta.ion.Ion;
import com.koushikdutta.ion.ProgressCallback;
import com.koushikdutta.ion.Response;
import org.floens.chan.ChanApplication; import org.floens.chan.ChanApplication;
import org.floens.chan.R; import org.floens.chan.R;
import org.floens.chan.utils.FileCache;
import org.floens.chan.utils.Logger; import org.floens.chan.utils.Logger;
import org.floens.chan.utils.Utils; import org.floens.chan.utils.Utils;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.concurrent.CancellationException;
import pl.droidsonroids.gif.GifDrawable; import pl.droidsonroids.gif.GifDrawable;
import pl.droidsonroids.gif.GifImageView; import pl.droidsonroids.gif.GifImageView;
@ -121,64 +117,36 @@ public class ThumbnailImageView extends LoadView implements View.OnClickListener
} }
callback.setProgress(true); callback.setProgress(true);
ionRequest = ChanApplication.getFileCache().downloadFile(getContext(), imageUrl, new FileCache.DownloadedCallback() {
@Override
public void onProgress(long downloaded, long total, boolean done) {
if (done) {
callback.setProgress(false);
callback.setLinearProgress(0, 0, true);
thumbnailNeeded = false;
} else {
callback.setLinearProgress(downloaded, total, false);
}
}
File file = ChanApplication.getFileCache().get(imageUrl); @Override
if (file.exists()) { public void onSuccess(File file) {
onBigImage(file); SubsamplingScaleImageView image = new SubsamplingScaleImageView(getContext());
} else { image.setImageFile(file.getAbsolutePath());
ionRequest = Ion.with(getContext()) image.setOnClickListener(ThumbnailImageView.this);
.load(imageUrl)
.progress(new ProgressCallback() {
@Override
public void onProgress(final long downloaded, final long total) {
Utils.runOnUiThread(new Runnable() {
@Override
public void run() {
callback.setLinearProgress(downloaded, total, false);
}
});
}
})
.write(file)
.withResponse()
.setCallback(new FutureCallback<Response<File>>() {
@Override
public void onCompleted(Exception e, Response<File> result) {
if (result != null && result.getHeaders() != null && result.getHeaders().getResponseCode() / 100 != 2) {
if (result.getResult() != null) {
ChanApplication.getFileCache().delete(result.getResult());
}
onNotFoundError();
return;
}
if (e != null && !(e instanceof CancellationException)) {
e.printStackTrace();
if (result != null && result.getResult() != null) {
ChanApplication.getFileCache().delete(result.getResult());
}
onError();
return;
}
if (result != null && result.getResult() != null) {
ChanApplication.getFileCache().put(result.getResult());
onBigImage(result.getResult());
}
}
});
}
}
private void onBigImage(File file) { setView(image, false);
SubsamplingScaleImageView image = new SubsamplingScaleImageView(getContext()); }
image.setImageFile(file.getAbsolutePath());
image.setOnClickListener(this);
setView(image, false); @Override
callback.setProgress(false); public void onFail(boolean notFound) {
callback.setLinearProgress(0, 0, true); if (notFound) {
thumbnailNeeded = false; onNotFoundError();
} else {
onError();
}
}
});
} }
public void setGif(String gifUrl) { public void setGif(String gifUrl) {
@ -188,152 +156,95 @@ public class ThumbnailImageView extends LoadView implements View.OnClickListener
} }
callback.setProgress(true); callback.setProgress(true);
ionRequest = ChanApplication.getFileCache().downloadFile(getContext(), gifUrl, new FileCache.DownloadedCallback() {
@Override
public void onProgress(long downloaded, long total, boolean done) {
if (done) {
callback.setProgress(false);
callback.setLinearProgress(0, 0, true);
thumbnailNeeded = false;
} else {
callback.setLinearProgress(downloaded, total, false);
}
}
File file = ChanApplication.getFileCache().get(gifUrl); @Override
if (file.exists()) { public void onSuccess(File file) {
onGif(file); GifDrawable drawable;
} else { try {
ionRequest = Ion.with(getContext()) drawable = new GifDrawable(file.getAbsolutePath());
.load(gifUrl) } catch (IOException e) {
.progress(new ProgressCallback() { e.printStackTrace();
@Override onError();
public void onProgress(final long downloaded, final long total) { return;
Utils.runOnUiThread(new Runnable() { }
@Override
public void run() {
callback.setLinearProgress(downloaded, total, false);
}
});
}
})
.write(file)
.withResponse()
.setCallback(new FutureCallback<Response<File>>() {
@Override
public void onCompleted(Exception e, Response<File> result) {
if (result != null && result.getHeaders() != null && result.getHeaders().getResponseCode() / 100 != 2) {
if (result.getResult() != null) {
ChanApplication.getFileCache().delete(result.getResult());
}
onNotFoundError();
return;
}
if (e != null && !(e instanceof CancellationException)) {
e.printStackTrace();
if (result != null && result.getResult() != null) {
ChanApplication.getFileCache().delete(result.getResult());
}
onError();
return;
}
if (result != null && result.getResult() != null) {
ChanApplication.getFileCache().put(result.getResult());
onGif(result.getResult());
}
}
});
}
}
private void onGif(File file) {
GifDrawable drawable;
try {
drawable = new GifDrawable(file.getAbsolutePath());
} catch (IOException e) {
e.printStackTrace();
onError();
return;
}
GifImageView view = new GifImageView(getContext()); GifImageView view = new GifImageView(getContext());
view.setImageDrawable(drawable); view.setImageDrawable(drawable);
view.setLayoutParams(Utils.MATCH_PARAMS); view.setLayoutParams(Utils.MATCH_PARAMS);
setView(view, false); setView(view, false);
}
callback.setProgress(false); @Override
callback.setLinearProgress(0, 0, true); public void onFail(boolean notFound) {
thumbnailNeeded = false; if (notFound) {
onNotFoundError();
} else {
onError();
}
}
});
} }
public void setVideo(String videoUrl) { public void setVideo(String videoUrl) {
callback.setProgress(true); callback.setProgress(true);
ionRequest = ChanApplication.getFileCache().downloadFile(getContext(), videoUrl, new FileCache.DownloadedCallback() {
@Override
public void onProgress(long downloaded, long total, boolean done) {
if (done) {
callback.setProgress(false);
callback.setLinearProgress(0, 0, true);
thumbnailNeeded = false;
} else {
callback.setLinearProgress(downloaded, total, false);
}
}
File file = ChanApplication.getFileCache().get(videoUrl); @Override
if (file.exists()) { public void onSuccess(File file) {
onVideo(file); videoView = new VideoView(getContext());
} else { videoView.setZOrderOnTop(true);
ionRequest = Ion.with(getContext()) videoView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
.load(videoUrl) LayoutParams.MATCH_PARENT));
.progress(new ProgressCallback() { videoView.setLayoutParams(Utils.MATCH_PARAMS);
@Override LayoutParams par = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
public void onProgress(final long downloaded, final long total) { par.gravity = Gravity.CENTER;
Utils.runOnUiThread(new Runnable() { videoView.setLayoutParams(par);
@Override
public void run() { videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
callback.setLinearProgress(downloaded, total, false); @Override
} public void onPrepared(MediaPlayer mp) {
}); mp.setLooping(true);
} callback.onVideoLoaded();
}) }
.write(file) });
.withResponse()
.setCallback(new FutureCallback<Response<File>>() { videoView.setVideoPath(file.getAbsolutePath());
@Override
public void onCompleted(Exception e, Response<File> result) { setView(videoView, false);
if (result != null && result.getHeaders() != null && result.getHeaders().getResponseCode() / 100 != 2) {
if (result.getResult() != null) { videoView.start();
ChanApplication.getFileCache().delete(result.getResult()); }
}
onNotFoundError();
return;
}
if (e != null && !(e instanceof CancellationException)) {
e.printStackTrace();
if (result != null && result.getResult() != null) {
ChanApplication.getFileCache().delete(result.getResult());
}
onError();
return;
}
if (result != null && result.getResult() != null) {
ChanApplication.getFileCache().put(result.getResult());
onVideo(result.getResult());
}
}
});
}
}
private void onVideo(File file) {
videoView = new VideoView(getContext());
videoView.setZOrderOnTop(true);
videoView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
videoView.setLayoutParams(Utils.MATCH_PARAMS);
LayoutParams par = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
par.gravity = Gravity.CENTER;
videoView.setLayoutParams(par);
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override @Override
public void onPrepared(MediaPlayer mp) { public void onFail(boolean notFound) {
mp.setLooping(true); if (notFound) {
callback.onVideoLoaded(); onNotFoundError();
} else {
onError();
}
} }
}); });
videoView.setVideoPath(file.getAbsolutePath());
setView(videoView, false);
callback.setProgress(false);
callback.setLinearProgress(0, 0, true);
thumbnailNeeded = false;
videoView.start();
} }
@Override @Override

@ -1,8 +1,18 @@
package org.floens.chan.utils; package org.floens.chan.utils;
import android.content.Context;
import android.util.Log; import android.util.Log;
import com.koushikdutta.async.future.Future;
import com.koushikdutta.async.future.FutureCallback;
import com.koushikdutta.ion.Ion;
import com.koushikdutta.ion.ProgressCallback;
import com.koushikdutta.ion.Response;
import org.floens.chan.ChanApplication;
import java.io.File; import java.io.File;
import java.util.concurrent.CancellationException;
public class FileCache { public class FileCache {
private static final String TAG = "FileCache"; private static final String TAG = "FileCache";
@ -39,6 +49,60 @@ public class FileCache {
return file.delete(); return file.delete();
} }
public Future<Response<File>> downloadFile(Context context, String url, final DownloadedCallback callback) {
File file = get(url);
if (file.exists()) {
file.setLastModified(Time.get());
callback.onProgress(0, 0, true);
callback.onSuccess(file);
return null;
} else {
return Ion.with(context)
.load(url)
.progress(new ProgressCallback() {
@Override
public void onProgress(final long downloaded, final long total) {
Utils.runOnUiThread(new Runnable() {
@Override
public void run() {
callback.onProgress(downloaded, total, false);
}
});
}
})
.write(file)
.withResponse()
.setCallback(new FutureCallback<Response<File>>() {
@Override
public void onCompleted(Exception e, Response<File> result) {
callback.onProgress(0, 0, true);
if (result != null && result.getHeaders() != null && result.getHeaders().getResponseCode() / 100 != 2) {
if (result.getResult() != null) {
delete(result.getResult());
}
callback.onFail(true);
return;
}
if (e != null && !(e instanceof CancellationException)) {
e.printStackTrace();
if (result != null && result.getResult() != null) {
delete(result.getResult());
}
callback.onFail(false);
return;
}
if (result != null && result.getResult() != null) {
ChanApplication.getFileCache().put(result.getResult());
callback.onSuccess(result.getResult());
}
}
});
}
}
private void trim() { private void trim() {
int tries = 0; int tries = 0;
while (size > maxSize && tries++ < 10) { while (size > maxSize && tries++ < 10) {
@ -83,4 +147,12 @@ public class FileCache {
} }
} }
} }
public interface DownloadedCallback {
public void onProgress(long downloaded, long total, boolean done);
public void onSuccess(File file);
public void onFail(boolean notFound);
}
} }

Loading…
Cancel
Save