tt-rss-android/org.fox.ttrss/src/main/java/org/fox/ttrss/GalleryVideoFragment.java

304 lines
10 KiB
Java

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);
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);
registerForContextMenu(textureView);
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);
try {
resizeSurface(textureView);
mp.setLooping(true);
if (m_userVisibleHint) {
mp.start();
}
} catch (IllegalStateException e) {
e.printStackTrace();
}
}
});
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 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));
}
}