summaryrefslogtreecommitdiff
path: root/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryVideoFragment.java
diff options
context:
space:
mode:
Diffstat (limited to 'org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryVideoFragment.java')
-rw-r--r--org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryVideoFragment.java326
1 files changed, 326 insertions, 0 deletions
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryVideoFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryVideoFragment.java
new file mode 100644
index 00000000..aba56e39
--- /dev/null
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryVideoFragment.java
@@ -0,0 +1,326 @@
+package org.fox.ttrss;
+
+import android.content.res.Configuration;
+import android.graphics.Rect;
+import android.graphics.SurfaceTexture;
+import android.media.MediaPlayer;
+import android.os.Bundle;
+import android.support.v4.app.ActivityCompat;
+import android.support.v4.view.ViewCompat;
+import android.util.Log;
+import android.view.Display;
+import android.view.LayoutInflater;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.Surface;
+import android.view.TextureView;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.MediaController;
+import android.widget.PopupMenu;
+
+import com.bumptech.glide.Glide;
+import com.bumptech.glide.load.engine.DiskCacheStrategy;
+import com.bumptech.glide.load.resource.drawable.GlideDrawable;
+import com.bumptech.glide.request.RequestListener;
+import com.bumptech.glide.request.target.GlideDrawableImageViewTarget;
+import com.bumptech.glide.request.target.Target;
+
+import java.io.IOException;
+
+public class GalleryVideoFragment extends GalleryBaseFragment {
+ private final String TAG = this.getClass().getSimpleName();
+
+ String m_url;
+ String m_coverUrl;
+ MediaPlayer m_mediaPlayer;
+ private boolean m_userVisibleHint = false;
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ final View view = inflater.inflate(R.layout.fragment_gallery_entry, container, false);
+
+ if (savedInstanceState != null) {
+ m_url = savedInstanceState.getString("url");
+ m_coverUrl = savedInstanceState.getString("coverUrl");
+ }
+
+ Log.d(TAG, "called for URL: " + m_url + " Cover: " + m_coverUrl);
+
+ ImageView imgView = (ImageView) view.findViewById(R.id.flavor_image);
+
+ ViewCompat.setTransitionName(imgView, "gallery:" + m_url);
+
+ //registerForContextMenu(imgView);
+
+ view.findViewById(R.id.flavor_image_overflow).setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ PopupMenu popup = new PopupMenu(getContext(), v);
+ MenuInflater inflater = popup.getMenuInflater();
+ inflater.inflate(R.menu.context_article_content_img, popup.getMenu());
+
+ popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ return onImageMenuItemSelected(item, m_url);
+ }
+ });
+
+ popup.show();
+
+ }
+ });
+
+ final GlideDrawableImageViewTarget glideImage = new GlideDrawableImageViewTarget(imgView);
+
+ Glide.with(this)
+ .load(m_coverUrl)
+ .dontAnimate()
+ .diskCacheStrategy(DiskCacheStrategy.ALL)
+ .skipMemoryCache(false)
+ .listener(new RequestListener<String, GlideDrawable>() {
+ @Override
+ public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
+ ActivityCompat.startPostponedEnterTransition(m_activity);
+
+ initializeVideoPlayer(view);
+ return false;
+ }
+
+ @Override
+ public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
+ ActivityCompat.startPostponedEnterTransition(m_activity);
+
+ initializeVideoPlayer(view);
+ return false;
+ }
+ })
+ .into(glideImage);
+
+ return view;
+ }
+
+ @Override
+ public void setUserVisibleHint(boolean isVisibleToUser) {
+ super.setUserVisibleHint(isVisibleToUser);
+ m_userVisibleHint = isVisibleToUser;
+
+ Log.d(TAG, "setUserVisibleHint: " + isVisibleToUser);
+
+ if (getView() == null) return;
+
+ try {
+
+ if (isVisibleToUser) {
+ if (m_mediaPlayer != null && !m_mediaPlayer.isPlaying()) {
+ m_mediaPlayer.start();
+ }
+
+ } else {
+ if (m_mediaPlayer != null && m_mediaPlayer.isPlaying()) {
+ m_mediaPlayer.pause();
+ }
+ }
+ } catch (IllegalStateException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ private void initializeVideoPlayer(final View view) {
+
+ //Log.d(TAG, "initializeVideoPlayer: " + m_activity + " " + view);
+
+ final MediaController m_mediaController = new MediaController(m_activity);
+ final TextureView textureView = (TextureView) view.findViewById(R.id.flavor_video);
+
+ textureView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ try {
+ if (!m_mediaController.isShowing())
+ m_mediaController.show(5000);
+ else
+ m_mediaController.hide();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ });
+
+ m_mediaController.setAnchorView(textureView);
+
+ textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
+ @Override
+ public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
+ Surface s = new Surface(surface);
+
+ m_mediaPlayer = new MediaPlayer();
+
+ m_mediaController.setMediaPlayer(new MediaController.MediaPlayerControl() {
+ @Override
+ public void start() {
+ m_mediaPlayer.start();
+ }
+
+ @Override
+ public void pause() {
+ m_mediaPlayer.pause();
+ }
+
+ @Override
+ public int getDuration() {
+ return m_mediaPlayer.getDuration();
+ }
+
+ @Override
+ public int getCurrentPosition() {
+ return m_mediaPlayer.getCurrentPosition();
+ }
+
+ @Override
+ public void seekTo(int pos) {
+ m_mediaPlayer.seekTo(pos);
+ }
+
+ @Override
+ public boolean isPlaying() {
+ return m_mediaPlayer.isPlaying();
+ }
+
+ @Override
+ public int getBufferPercentage() {
+ return 0;
+ }
+
+ @Override
+ public boolean canPause() {
+ return true;
+ }
+
+ @Override
+ public boolean canSeekBackward() {
+ return true;
+ }
+
+ @Override
+ public boolean canSeekForward() {
+ return true;
+ }
+
+ @Override
+ public int getAudioSessionId() {
+ return 0;
+ }
+ });
+
+ m_mediaPlayer.setSurface(s);
+
+ try {
+ m_mediaPlayer.setDataSource(m_url);
+ } catch (IOException e) {
+ view.findViewById(R.id.flavor_image_error).setVisibility(View.VISIBLE);
+ e.printStackTrace();
+ }
+
+ m_mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
+ @Override
+ public void onPrepared(MediaPlayer mp) {
+ getView().findViewById(R.id.flavor_image).setVisibility(View.GONE);
+ getView().findViewById(R.id.flavor_image_progress).setVisibility(View.GONE);
+
+ resizeSurface(textureView);
+ mp.setLooping(true);
+
+ if (m_userVisibleHint) {
+ mp.start();
+ }
+ }
+ });
+
+ m_mediaPlayer.prepareAsync();
+ }
+
+ @Override
+ public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
+
+ }
+
+ @Override
+ public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
+ try {
+ m_mediaPlayer.release();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return false;
+ }
+
+ @Override
+ public void onSurfaceTextureUpdated(SurfaceTexture surface) {
+
+ }
+ });
+
+ }
+
+ public void initialize(String url, String coverUrl) {
+ m_url = url;
+ m_coverUrl = coverUrl;
+ }
+
+ /*@Override
+ public boolean onContextItemSelected(MenuItem item) {
+ int position = m_pager.getCurrentItem();
+ String url = m_checkedUrls.get(position);
+
+ if (!onImageMenuItemSelected(item, url))
+ return super.onContextItemSelected(item);
+ else
+ return true;
+ }*/
+
+ @Override
+ public void onSaveInstanceState (Bundle out) {
+ super.onSaveInstanceState(out);
+
+ out.setClassLoader(getClass().getClassLoader());
+ out.putString("url", m_url);
+ out.putString("coverUrl", m_coverUrl);
+ }
+
+ protected void resizeSurface(View surfaceView) {
+ // get the dimensions of the video (only valid when surfaceView is set)
+ float videoWidth = m_mediaPlayer.getVideoWidth();
+ float videoHeight = m_mediaPlayer.getVideoHeight();
+
+ Rect rectangle = new Rect();
+ m_activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(rectangle);
+
+ int actionBarHeight = m_activity.isPortrait() ? m_activity.getSupportActionBar().getHeight() : 0;
+
+ Display display = m_activity.getWindowManager().getDefaultDisplay();
+ float containerWidth = display.getWidth();
+ float containerHeight = display.getHeight() - rectangle.top - actionBarHeight;
+
+ // set dimensions to surfaceView's layout params (maintaining aspect ratio)
+ android.view.ViewGroup.LayoutParams lp = surfaceView.getLayoutParams();
+ lp.width = (int) containerWidth;
+ lp.height = (int) ((videoHeight / videoWidth) * containerWidth);
+ if(lp.height > containerHeight) {
+ lp.width = (int) ((videoWidth / videoHeight) * containerHeight);
+ lp.height = (int) containerHeight;
+ }
+ surfaceView.setLayoutParams(lp);
+ }
+
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+
+ resizeSurface(getView().findViewById(R.id.flavor_video));
+ }
+
+}