Working on webm support

This is currently not working, because I'm using a VideoView that requires a file.
I thought using the volley cached file would be the way to go, but somehow Volley doesn't cache the ByteArrayRequest.
Next commit will be a Volley update, and than this will be fixed.
captchafix
Florens Douwes 11 years ago
parent 02596eb35b
commit 010a1c2cef
  1. 196
      Chan/src/org/floens/chan/ui/fragment/ImageViewFragment.java

@ -1,16 +1,23 @@
package org.floens.chan.ui.fragment;
import java.io.File;
import java.io.IOException;
import org.floens.chan.ChanApplication;
import org.floens.chan.R;
import org.floens.chan.core.model.Post;
import org.floens.chan.core.net.ByteArrayRequest;
import org.floens.chan.core.net.GIFRequest;
import org.floens.chan.ui.activity.ImageViewActivity;
import org.floens.chan.ui.view.GIFView;
import org.floens.chan.ui.view.NetworkPhotoView;
import org.floens.chan.utils.Logger;
import uk.co.senab.photoview.PhotoViewAttacher.OnViewTapListener;
import android.app.Fragment;
import android.content.Context;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
@ -20,99 +27,183 @@ import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.RelativeLayout;
import android.widget.Toast;
import android.widget.VideoView;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.DiskBasedCache;
public class ImageViewFragment extends Fragment implements View.OnLongClickListener, OnViewTapListener, OnClickListener {
private static final String TAG = "ImageViewFragment";
private Context context;
private RelativeLayout wrapper;
private Post post;
private GIFRequest gifRequest;
private ImageViewActivity activity;
private int index;
private ByteArrayRequest movieRequest;
public static ImageViewFragment newInstance(Post post, ImageViewActivity activity, int index) {
ImageViewFragment imageViewFragment = new ImageViewFragment();
imageViewFragment.post = post;
imageViewFragment.activity = activity;
imageViewFragment.index = index;
return imageViewFragment;
}
@Override
public void onSaveInstanceState(Bundle bundle) {
// https://code.google.com/p/android/issues/detail?id=19917
bundle.putString("bug_19917", "bug_19917");
super.onSaveInstanceState(bundle);
}
public void showProgressBar(boolean e) {
activity.showProgressBar(e, index);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
context = inflater.getContext();
wrapper = new RelativeLayout(context);
int padding = (int)context.getResources().getDimension(R.dimen.image_popup_padding);
wrapper.setPadding(padding, padding, padding, padding);
wrapper.setGravity(Gravity.CENTER);
wrapper.setOnClickListener(this);
return wrapper;
if (post == null) {
// No restoring
return null;
} else {
context = inflater.getContext();
wrapper = new RelativeLayout(context);
int padding = (int) context.getResources().getDimension(R.dimen.image_popup_padding);
wrapper.setPadding(padding, padding, padding, padding);
wrapper.setGravity(Gravity.CENTER);
wrapper.setOnClickListener(this);
return wrapper;
}
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (post == null || !post.hasImage) {
throw new IllegalArgumentException("No post / post has no image");
if (post == null) {
// No restoring
} else {
if (!post.hasImage) {
throw new IllegalArgumentException("No post / post has no image");
}
if (post.ext.equals("gif")) {
loadGif();
} else if (post.ext.equals("webm")) {
loadMovie();
} else {
loadOtherImage();
}
}
if (post.ext.equals("gif")) {
gifRequest = new GIFRequest(post.imageUrl, new Response.Listener<GIFView>() {
@Override
public void onResponse(GIFView view) {
wrapper.addView(view, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
view.setOnLongClickListener(ImageViewFragment.this);
view.setOnClickListener(ImageViewFragment.this);
showProgressBar(false);
}
private void loadMovie() {
movieRequest = new ByteArrayRequest(post.imageUrl, new Response.Listener<byte[]>() {
@Override
public void onResponse(byte[] array) {
if (movieRequest != null) {
try {
handleMovieResponse(movieRequest);
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(context, R.string.image_preview_failed, Toast.LENGTH_LONG).show();
}
}
}, new Response.ErrorListener() {
showProgressBar(false);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(context, R.string.image_preview_failed, Toast.LENGTH_LONG).show();
showProgressBar(false);
}
});
movieRequest.setShouldCache(true);
ChanApplication.getVolleyRequestQueue().add(movieRequest);
showProgressBar(true);
}
private void handleMovieResponse(ByteArrayRequest request) throws IOException {
DiskBasedCache cache = (DiskBasedCache) ChanApplication.getVolleyRequestQueue().getCache();
File file = cache.getFileForKey(movieRequest.getCacheKey());
Logger.test(file.getAbsolutePath());
Logger.test(movieRequest.getCacheKey());
// Logger.test(movieRequest.getCacheEntry().toString());
if (file.exists()) {
final VideoView view = new VideoView(context);
view.setOnLongClickListener(this);
view.setOnClickListener(this);
view.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(context, R.string.image_preview_failed, Toast.LENGTH_LONG).show();
showProgressBar(false);
public void onPrepared(MediaPlayer mp) {
mp.setLooping(true);
view.start();
wrapper.addView(view, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
}
}, context);
ChanApplication.getVolleyRequestQueue().add(gifRequest);
showProgressBar(true);
});
view.setVideoPath(file.getAbsolutePath());
} else {
NetworkPhotoView imageView = new NetworkPhotoView(context);
imageView.setImageViewFragment(this);
imageView.setFadeIn(100);
imageView.setImageUrl(post.imageUrl, ChanApplication.getImageLoader());
imageView.setMaxScale(3f);
imageView.setOnLongClickListenerToAttacher(this);
imageView.setOnViewTapListenerToAttacher(this);
wrapper.addView(imageView, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
showProgressBar(true);
Logger.e(TAG, "Cache file doesn't exist");
Toast.makeText(context, R.string.image_preview_failed, Toast.LENGTH_LONG).show();
}
}
private void loadOtherImage() {
NetworkPhotoView imageView = new NetworkPhotoView(context);
imageView.setImageViewFragment(this);
imageView.setFadeIn(100);
imageView.setImageUrl(post.imageUrl, ChanApplication.getImageLoader());
imageView.setMaxScale(3f);
imageView.setOnLongClickListenerToAttacher(this);
imageView.setOnViewTapListenerToAttacher(this);
wrapper.addView(imageView, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
showProgressBar(true);
}
private void loadGif() {
ChanApplication.getVolleyRequestQueue().add(new GIFRequest(post.imageUrl, new Response.Listener<GIFView>() {
@Override
public void onResponse(GIFView view) {
wrapper.addView(view, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
view.setOnLongClickListener(ImageViewFragment.this);
view.setOnClickListener(ImageViewFragment.this);
showProgressBar(false);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(context, R.string.image_preview_failed, Toast.LENGTH_LONG).show();
showProgressBar(false);
}
}, context));
showProgressBar(true);
}
@Override
/*
* TODO: figure out why adding an onLongClick listener removes the error:
* "ImageView no longer exists. You should not use this PhotoViewAttacher any more.");
* PhotoViewAttacher line 300
* "ImageView no longer exists. You should not use this PhotoViewAttacher any more."
* ); PhotoViewAttacher line 300
*/
public boolean onLongClick(View v) {
return false;
@ -128,8 +219,3 @@ public class ImageViewFragment extends Fragment implements View.OnLongClickListe
activity.finish();
}
}

Loading…
Cancel
Save