convert VideoFragment to kotlin
This commit is contained in:
parent
e2938a59ec
commit
4a2ecc15a0
2 changed files with 364 additions and 415 deletions
|
@ -1,415 +0,0 @@
|
|||
package com.simplemobiletools.gallery.fragments;
|
||||
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.Resources;
|
||||
import android.media.AudioManager;
|
||||
import android.media.MediaPlayer;
|
||||
import android.media.MediaPlayer.OnPreparedListener;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.util.Log;
|
||||
import android.view.Display;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.SurfaceHolder;
|
||||
import android.view.SurfaceView;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.WindowManager;
|
||||
import android.view.animation.Animation;
|
||||
import android.view.animation.AnimationUtils;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.SeekBar;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.simplemobiletools.gallery.Config;
|
||||
import com.simplemobiletools.gallery.Constants;
|
||||
import com.simplemobiletools.gallery.R;
|
||||
import com.simplemobiletools.gallery.Utils;
|
||||
import com.simplemobiletools.gallery.models.Medium;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Locale;
|
||||
|
||||
public class VideoFragment extends ViewPagerFragment
|
||||
implements View.OnClickListener, SurfaceHolder.Callback, MediaPlayer.OnCompletionListener, MediaPlayer.OnVideoSizeChangedListener,
|
||||
SeekBar.OnSeekBarChangeListener, OnPreparedListener {
|
||||
private static final String TAG = VideoFragment.class.getSimpleName();
|
||||
private static final String PROGRESS = "progress";
|
||||
|
||||
private MediaPlayer mMediaPlayer;
|
||||
private SurfaceView mSurfaceView;
|
||||
private SurfaceHolder mSurfaceHolder;
|
||||
private ImageView mPlayOutline;
|
||||
private TextView mCurrTimeView;
|
||||
private TextView mDurationView;
|
||||
private Handler mTimerHandler;
|
||||
private SeekBar mSeekBar;
|
||||
private Medium mMedium;
|
||||
private View mTimeHolder;
|
||||
private View mView;
|
||||
|
||||
private boolean mIsPlaying;
|
||||
private boolean mIsDragged;
|
||||
private boolean mIsFullscreen;
|
||||
private boolean mIsFragmentVisible;
|
||||
private int mCurrTime;
|
||||
private int mDuration;
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
mView = inflater.inflate(R.layout.pager_video_item, container, false);
|
||||
|
||||
mMedium = (Medium) getArguments().getSerializable(Constants.MEDIUM);
|
||||
if (savedInstanceState != null) {
|
||||
mCurrTime = savedInstanceState.getInt(PROGRESS);
|
||||
}
|
||||
|
||||
mIsFullscreen = (getActivity().getWindow().getDecorView().getSystemUiVisibility() & View.SYSTEM_UI_FLAG_FULLSCREEN) ==
|
||||
View.SYSTEM_UI_FLAG_FULLSCREEN;
|
||||
setupPlayer();
|
||||
mView.setOnClickListener(this);
|
||||
|
||||
return mView;
|
||||
}
|
||||
|
||||
private void setupPlayer() {
|
||||
if (getActivity() == null)
|
||||
return;
|
||||
|
||||
mPlayOutline = (ImageView) mView.findViewById(R.id.video_play_outline);
|
||||
mPlayOutline.setOnClickListener(this);
|
||||
|
||||
mSurfaceView = (SurfaceView) mView.findViewById(R.id.video_surface);
|
||||
mSurfaceView.setOnClickListener(this);
|
||||
mSurfaceHolder = mSurfaceView.getHolder();
|
||||
mSurfaceHolder.addCallback(this);
|
||||
|
||||
initTimeHolder();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setMenuVisibility(boolean menuVisible) {
|
||||
super.setMenuVisibility(menuVisible);
|
||||
mIsFragmentVisible = menuVisible;
|
||||
if (menuVisible) {
|
||||
if (getContext() != null && Config.Companion.newInstance(getContext()).getAutoplayVideos()) {
|
||||
playVideo();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void itemDragged() {
|
||||
pauseVideo();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void systemUiVisibilityChanged(boolean toFullscreen) {
|
||||
if (mIsFullscreen != toFullscreen) {
|
||||
mIsFullscreen = toFullscreen;
|
||||
checkFullscreen();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateItem() {
|
||||
setVideoSize();
|
||||
initTimeHolder();
|
||||
}
|
||||
|
||||
private void initTimeHolder() {
|
||||
mTimeHolder = mView.findViewById(R.id.video_time_holder);
|
||||
final Resources res = getResources();
|
||||
final int height = Utils.Companion.getNavBarHeight(res);
|
||||
final int left = mTimeHolder.getPaddingLeft();
|
||||
final int top = mTimeHolder.getPaddingTop();
|
||||
int right = (int) getResources().getDimension(R.dimen.timer_padding);
|
||||
int bottom = 0;
|
||||
|
||||
if (Utils.Companion.hasNavBar(getActivity())) {
|
||||
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
|
||||
bottom += height;
|
||||
} else {
|
||||
right += height;
|
||||
}
|
||||
mTimeHolder.setPadding(left, top, right, bottom);
|
||||
}
|
||||
|
||||
mCurrTimeView = (TextView) mView.findViewById(R.id.video_curr_time);
|
||||
mDurationView = (TextView) mView.findViewById(R.id.video_duration);
|
||||
mSeekBar = (SeekBar) mView.findViewById(R.id.video_seekbar);
|
||||
mSeekBar.setOnSeekBarChangeListener(this);
|
||||
|
||||
if (mIsFullscreen)
|
||||
mTimeHolder.setVisibility(View.INVISIBLE);
|
||||
}
|
||||
|
||||
private void setupTimeHolder() {
|
||||
mSeekBar.setMax(mDuration);
|
||||
mDurationView.setText(getTimeString(mDuration));
|
||||
mTimerHandler = new Handler();
|
||||
setupTimer();
|
||||
}
|
||||
|
||||
private void setupTimer() {
|
||||
getActivity().runOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (mMediaPlayer != null && !mIsDragged && mIsPlaying) {
|
||||
mCurrTime = mMediaPlayer.getCurrentPosition() / 1000;
|
||||
mSeekBar.setProgress(mCurrTime);
|
||||
mCurrTimeView.setText(getTimeString(mCurrTime));
|
||||
}
|
||||
|
||||
mTimerHandler.postDelayed(this, 1000);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSaveInstanceState(Bundle outState) {
|
||||
super.onSaveInstanceState(outState);
|
||||
outState.putInt(PROGRESS, mCurrTime);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
switch (v.getId()) {
|
||||
case R.id.video_play_outline:
|
||||
togglePlayPause();
|
||||
break;
|
||||
default:
|
||||
mIsFullscreen = !mIsFullscreen;
|
||||
checkFullscreen();
|
||||
|
||||
if (getListener() == null)
|
||||
setListener((FragmentClickListener) getActivity());
|
||||
getListener().fragmentClicked();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void checkFullscreen() {
|
||||
int anim = R.anim.fade_in;
|
||||
if (mIsFullscreen) {
|
||||
anim = R.anim.fade_out;
|
||||
mSeekBar.setOnSeekBarChangeListener(null);
|
||||
} else {
|
||||
mSeekBar.setOnSeekBarChangeListener(this);
|
||||
}
|
||||
|
||||
final Animation animation = AnimationUtils.loadAnimation(getContext(), anim);
|
||||
mTimeHolder.startAnimation(animation);
|
||||
}
|
||||
|
||||
private void togglePlayPause() {
|
||||
if (getActivity() == null || !isAdded())
|
||||
return;
|
||||
|
||||
mIsPlaying = !mIsPlaying;
|
||||
if (mIsPlaying) {
|
||||
playVideo();
|
||||
} else {
|
||||
pauseVideo();
|
||||
}
|
||||
}
|
||||
|
||||
private void playVideo() {
|
||||
mIsPlaying = true;
|
||||
if (mMediaPlayer != null) {
|
||||
mMediaPlayer.start();
|
||||
}
|
||||
|
||||
mPlayOutline.setImageDrawable(null);
|
||||
getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
|
||||
}
|
||||
|
||||
private void pauseVideo() {
|
||||
mIsPlaying = false;
|
||||
if (mMediaPlayer != null) {
|
||||
mMediaPlayer.pause();
|
||||
}
|
||||
|
||||
mPlayOutline.setImageDrawable(getResources().getDrawable(R.mipmap.play_outline_big));
|
||||
getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
|
||||
}
|
||||
|
||||
private void initMediaPlayer() {
|
||||
if (mMediaPlayer != null)
|
||||
return;
|
||||
|
||||
try {
|
||||
mMediaPlayer = new MediaPlayer();
|
||||
mMediaPlayer.setDataSource(getContext(), Uri.parse(mMedium.getPath()));
|
||||
mMediaPlayer.setDisplay(mSurfaceHolder);
|
||||
mMediaPlayer.setOnCompletionListener(this);
|
||||
mMediaPlayer.setOnVideoSizeChangedListener(this);
|
||||
mMediaPlayer.setOnPreparedListener(this);
|
||||
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
|
||||
mMediaPlayer.prepareAsync();
|
||||
} catch (IOException e) {
|
||||
Log.e(TAG, "init media player " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
private void setProgress(int seconds) {
|
||||
mMediaPlayer.seekTo(seconds * 1000);
|
||||
mSeekBar.setProgress(seconds);
|
||||
mCurrTimeView.setText(getTimeString(seconds));
|
||||
}
|
||||
|
||||
private void addPreviewImage() {
|
||||
mMediaPlayer.start();
|
||||
mMediaPlayer.pause();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPause() {
|
||||
super.onPause();
|
||||
pauseVideo();
|
||||
mIsFragmentVisible = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
if (getActivity() != null && !getActivity().isChangingConfigurations()) {
|
||||
cleanup();
|
||||
}
|
||||
}
|
||||
|
||||
private void cleanup() {
|
||||
pauseVideo();
|
||||
|
||||
if (mCurrTimeView != null)
|
||||
mCurrTimeView.setText(getTimeString(0));
|
||||
|
||||
if (mMediaPlayer != null) {
|
||||
mMediaPlayer.release();
|
||||
mMediaPlayer = null;
|
||||
}
|
||||
|
||||
if (mSeekBar != null)
|
||||
mSeekBar.setProgress(0);
|
||||
|
||||
if (mTimerHandler != null)
|
||||
mTimerHandler.removeCallbacksAndMessages(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void surfaceCreated(SurfaceHolder holder) {
|
||||
initMediaPlayer();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void surfaceDestroyed(SurfaceHolder holder) {
|
||||
if (mMediaPlayer != null) {
|
||||
mMediaPlayer.release();
|
||||
mMediaPlayer = null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCompletion(MediaPlayer mp) {
|
||||
mSeekBar.setProgress(mSeekBar.getMax());
|
||||
mCurrTimeView.setText(getTimeString(mDuration));
|
||||
pauseVideo();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
|
||||
setVideoSize();
|
||||
}
|
||||
|
||||
private void setVideoSize() {
|
||||
if (getActivity() == null)
|
||||
return;
|
||||
|
||||
final float videoProportion = (float) mMediaPlayer.getVideoWidth() / (float) mMediaPlayer.getVideoHeight();
|
||||
final Display display = getActivity().getWindowManager().getDefaultDisplay();
|
||||
int screenWidth;
|
||||
int screenHeight;
|
||||
|
||||
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) {
|
||||
final DisplayMetrics realMetrics = new DisplayMetrics();
|
||||
display.getRealMetrics(realMetrics);
|
||||
screenWidth = realMetrics.widthPixels;
|
||||
screenHeight = realMetrics.heightPixels;
|
||||
} else {
|
||||
screenWidth = display.getWidth();
|
||||
screenHeight = display.getHeight();
|
||||
}
|
||||
|
||||
final float screenProportion = (float) screenWidth / (float) screenHeight;
|
||||
|
||||
final android.view.ViewGroup.LayoutParams lp = mSurfaceView.getLayoutParams();
|
||||
if (videoProportion > screenProportion) {
|
||||
lp.width = screenWidth;
|
||||
lp.height = (int) ((float) screenWidth / videoProportion);
|
||||
} else {
|
||||
lp.width = (int) (videoProportion * (float) screenHeight);
|
||||
lp.height = screenHeight;
|
||||
}
|
||||
mSurfaceView.setLayoutParams(lp);
|
||||
}
|
||||
|
||||
private String getTimeString(int duration) {
|
||||
final StringBuilder sb = new StringBuilder(8);
|
||||
final int hours = duration / (60 * 60);
|
||||
final int minutes = (duration % (60 * 60)) / 60;
|
||||
final int seconds = ((duration % (60 * 60)) % 60);
|
||||
|
||||
if (duration > 3600) {
|
||||
sb.append(String.format(Locale.getDefault(), "%02d", hours)).append(":");
|
||||
}
|
||||
|
||||
sb.append(String.format(Locale.getDefault(), "%02d", minutes));
|
||||
sb.append(":").append(String.format(Locale.getDefault(), "%02d", seconds));
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
|
||||
if (mMediaPlayer != null && fromUser) {
|
||||
setProgress(progress);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStartTrackingTouch(SeekBar seekBar) {
|
||||
if (mMediaPlayer == null)
|
||||
initMediaPlayer();
|
||||
|
||||
mMediaPlayer.pause();
|
||||
mIsDragged = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStopTrackingTouch(SeekBar seekBar) {
|
||||
if (!mIsPlaying) {
|
||||
togglePlayPause();
|
||||
} else {
|
||||
mMediaPlayer.start();
|
||||
}
|
||||
|
||||
mIsDragged = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPrepared(MediaPlayer mp) {
|
||||
mDuration = mp.getDuration() / 1000;
|
||||
addPreviewImage();
|
||||
setupTimeHolder();
|
||||
setProgress(mCurrTime);
|
||||
|
||||
if (mIsFragmentVisible && Config.Companion.newInstance(getContext()).getAutoplayVideos())
|
||||
playVideo();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,364 @@
|
|||
package com.simplemobiletools.gallery.fragments
|
||||
|
||||
import android.content.res.Configuration
|
||||
import android.media.AudioManager
|
||||
import android.media.MediaPlayer
|
||||
import android.media.MediaPlayer.OnPreparedListener
|
||||
import android.net.Uri
|
||||
import android.os.Bundle
|
||||
import android.os.Handler
|
||||
import android.util.DisplayMetrics
|
||||
import android.util.Log
|
||||
import android.view.*
|
||||
import android.view.animation.AnimationUtils
|
||||
import android.widget.SeekBar
|
||||
import android.widget.TextView
|
||||
import com.simplemobiletools.gallery.Config
|
||||
import com.simplemobiletools.gallery.Constants
|
||||
import com.simplemobiletools.gallery.R
|
||||
import com.simplemobiletools.gallery.Utils
|
||||
import com.simplemobiletools.gallery.models.Medium
|
||||
import kotlinx.android.synthetic.main.pager_video_item.view.*
|
||||
import java.io.IOException
|
||||
import java.util.*
|
||||
|
||||
class VideoFragment : ViewPagerFragment(), View.OnClickListener, SurfaceHolder.Callback, MediaPlayer.OnCompletionListener,
|
||||
MediaPlayer.OnVideoSizeChangedListener, SeekBar.OnSeekBarChangeListener, OnPreparedListener {
|
||||
|
||||
private var mMediaPlayer: MediaPlayer? = null
|
||||
private var mSurfaceView: SurfaceView? = null
|
||||
private var mSurfaceHolder: SurfaceHolder? = null
|
||||
private var mCurrTimeView: TextView? = null
|
||||
private var mTimerHandler: Handler? = null
|
||||
private var mSeekBar: SeekBar? = null
|
||||
private var mTimeHolder: View? = null
|
||||
|
||||
private var mIsPlaying = false
|
||||
private var mIsDragged = false
|
||||
private var mIsFullscreen = false
|
||||
private var mIsFragmentVisible = false
|
||||
private var mCurrTime = 0
|
||||
private var mDuration = 0
|
||||
|
||||
lateinit var mView: View
|
||||
lateinit var mMedium: Medium
|
||||
|
||||
companion object {
|
||||
private val TAG = VideoFragment::class.java.simpleName
|
||||
private val PROGRESS = "progress"
|
||||
}
|
||||
|
||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
|
||||
mView = inflater.inflate(R.layout.pager_video_item, container, false)
|
||||
|
||||
mMedium = arguments.getSerializable(Constants.MEDIUM) as Medium
|
||||
if (savedInstanceState != null) {
|
||||
mCurrTime = savedInstanceState.getInt(PROGRESS)
|
||||
}
|
||||
|
||||
mIsFullscreen = activity.window.decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_FULLSCREEN == View.SYSTEM_UI_FLAG_FULLSCREEN
|
||||
setupPlayer()
|
||||
mView.setOnClickListener(this)
|
||||
|
||||
return mView
|
||||
}
|
||||
|
||||
private fun setupPlayer() {
|
||||
if (activity == null)
|
||||
return
|
||||
|
||||
mView.video_play_outline.setOnClickListener(this)
|
||||
|
||||
mSurfaceView = mView.video_surface
|
||||
mSurfaceView!!.setOnClickListener(this)
|
||||
mSurfaceHolder = mSurfaceView!!.holder
|
||||
mSurfaceHolder!!.addCallback(this)
|
||||
|
||||
initTimeHolder()
|
||||
}
|
||||
|
||||
override fun setMenuVisibility(menuVisible: Boolean) {
|
||||
super.setMenuVisibility(menuVisible)
|
||||
mIsFragmentVisible = menuVisible
|
||||
if (menuVisible) {
|
||||
if (context != null && Config.newInstance(context).autoplayVideos) {
|
||||
playVideo()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun itemDragged() {
|
||||
pauseVideo()
|
||||
}
|
||||
|
||||
override fun systemUiVisibilityChanged(toFullscreen: Boolean) {
|
||||
if (mIsFullscreen != toFullscreen) {
|
||||
mIsFullscreen = toFullscreen
|
||||
checkFullscreen()
|
||||
}
|
||||
}
|
||||
|
||||
override fun updateItem() {
|
||||
setVideoSize()
|
||||
initTimeHolder()
|
||||
}
|
||||
|
||||
private fun initTimeHolder() {
|
||||
mTimeHolder = mView.video_time_holder
|
||||
val res = resources
|
||||
val height = Utils.getNavBarHeight(res)
|
||||
val left = mTimeHolder!!.paddingLeft
|
||||
val top = mTimeHolder!!.paddingTop
|
||||
var right = res.getDimension(R.dimen.timer_padding).toInt()
|
||||
var bottom = 0
|
||||
|
||||
if (Utils.hasNavBar(activity)) {
|
||||
if (res.configuration.orientation == Configuration.ORIENTATION_PORTRAIT) {
|
||||
bottom += height
|
||||
} else {
|
||||
right += height
|
||||
}
|
||||
mTimeHolder!!.setPadding(left, top, right, bottom)
|
||||
}
|
||||
|
||||
mCurrTimeView = mView.video_curr_time
|
||||
mSeekBar = mView.video_seekbar
|
||||
mSeekBar!!.setOnSeekBarChangeListener(this)
|
||||
|
||||
if (mIsFullscreen)
|
||||
mTimeHolder!!.visibility = View.INVISIBLE
|
||||
}
|
||||
|
||||
private fun setupTimeHolder() {
|
||||
mSeekBar!!.max = mDuration
|
||||
mView.video_duration.text = getTimeString(mDuration)
|
||||
mTimerHandler = Handler()
|
||||
setupTimer()
|
||||
}
|
||||
|
||||
private fun setupTimer() {
|
||||
activity.runOnUiThread(object : Runnable {
|
||||
override fun run() {
|
||||
if (mMediaPlayer != null && !mIsDragged && mIsPlaying) {
|
||||
mCurrTime = mMediaPlayer!!.currentPosition / 1000
|
||||
mSeekBar!!.progress = mCurrTime
|
||||
mCurrTimeView!!.text = getTimeString(mCurrTime)
|
||||
}
|
||||
|
||||
mTimerHandler!!.postDelayed(this, 1000)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
override fun onSaveInstanceState(outState: Bundle) {
|
||||
super.onSaveInstanceState(outState)
|
||||
outState.putInt(PROGRESS, mCurrTime)
|
||||
}
|
||||
|
||||
override fun onClick(v: View) {
|
||||
when (v.id) {
|
||||
R.id.video_play_outline -> togglePlayPause()
|
||||
else -> {
|
||||
mIsFullscreen = !mIsFullscreen
|
||||
checkFullscreen()
|
||||
listener.fragmentClicked()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun checkFullscreen() {
|
||||
var anim = R.anim.fade_in
|
||||
if (mIsFullscreen) {
|
||||
anim = R.anim.fade_out
|
||||
mSeekBar!!.setOnSeekBarChangeListener(null)
|
||||
} else {
|
||||
mSeekBar!!.setOnSeekBarChangeListener(this)
|
||||
}
|
||||
|
||||
val animation = AnimationUtils.loadAnimation(context, anim)
|
||||
mTimeHolder!!.startAnimation(animation)
|
||||
}
|
||||
|
||||
private fun togglePlayPause() {
|
||||
if (activity == null || !isAdded)
|
||||
return
|
||||
|
||||
mIsPlaying = !mIsPlaying
|
||||
if (mIsPlaying) {
|
||||
playVideo()
|
||||
} else {
|
||||
pauseVideo()
|
||||
}
|
||||
}
|
||||
|
||||
private fun playVideo() {
|
||||
mIsPlaying = true
|
||||
mMediaPlayer?.start()
|
||||
mView.video_play_outline.setImageDrawable(null)
|
||||
activity.window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
|
||||
}
|
||||
|
||||
private fun pauseVideo() {
|
||||
mIsPlaying = false
|
||||
mMediaPlayer?.pause()
|
||||
mView.video_play_outline.setImageDrawable(resources.getDrawable(R.mipmap.play_outline_big))
|
||||
activity.window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
|
||||
}
|
||||
|
||||
private fun initMediaPlayer() {
|
||||
if (mMediaPlayer != null)
|
||||
return
|
||||
|
||||
try {
|
||||
mMediaPlayer = MediaPlayer().apply {
|
||||
setDataSource(context, Uri.parse(mMedium.path))
|
||||
setDisplay(mSurfaceHolder)
|
||||
setOnCompletionListener(this@VideoFragment)
|
||||
setOnVideoSizeChangedListener(this@VideoFragment)
|
||||
setOnPreparedListener(this@VideoFragment)
|
||||
setAudioStreamType(AudioManager.STREAM_MUSIC)
|
||||
prepareAsync()
|
||||
}
|
||||
} catch (e: IOException) {
|
||||
Log.e(TAG, "init media player failed " + e)
|
||||
}
|
||||
}
|
||||
|
||||
private fun setProgress(seconds: Int) {
|
||||
mMediaPlayer!!.seekTo(seconds * 1000)
|
||||
mSeekBar!!.progress = seconds
|
||||
mCurrTimeView!!.text = getTimeString(seconds)
|
||||
}
|
||||
|
||||
private fun addPreviewImage() {
|
||||
mMediaPlayer!!.start()
|
||||
mMediaPlayer!!.pause()
|
||||
}
|
||||
|
||||
override fun onPause() {
|
||||
super.onPause()
|
||||
pauseVideo()
|
||||
mIsFragmentVisible = false
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
if (activity != null && !activity.isChangingConfigurations) {
|
||||
cleanup()
|
||||
}
|
||||
}
|
||||
|
||||
private fun cleanup() {
|
||||
pauseVideo()
|
||||
mCurrTimeView?.text = getTimeString(0)
|
||||
mMediaPlayer?.release()
|
||||
mMediaPlayer = null
|
||||
mSeekBar?.progress = 0
|
||||
mTimerHandler?.removeCallbacksAndMessages(null)
|
||||
}
|
||||
|
||||
override fun surfaceCreated(holder: SurfaceHolder) {
|
||||
initMediaPlayer()
|
||||
}
|
||||
|
||||
override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) {
|
||||
|
||||
}
|
||||
|
||||
override fun surfaceDestroyed(holder: SurfaceHolder) {
|
||||
mMediaPlayer?.release()
|
||||
mMediaPlayer = null
|
||||
}
|
||||
|
||||
override fun onCompletion(mp: MediaPlayer) {
|
||||
mSeekBar!!.progress = mSeekBar!!.max
|
||||
mCurrTimeView!!.text = getTimeString(mDuration)
|
||||
pauseVideo()
|
||||
}
|
||||
|
||||
override fun onVideoSizeChanged(mp: MediaPlayer, width: Int, height: Int) {
|
||||
setVideoSize()
|
||||
}
|
||||
|
||||
private fun setVideoSize() {
|
||||
if (activity == null)
|
||||
return
|
||||
|
||||
val videoProportion = mMediaPlayer!!.videoWidth.toFloat() / mMediaPlayer!!.videoHeight.toFloat()
|
||||
val display = activity.windowManager.defaultDisplay
|
||||
val screenWidth: Int
|
||||
val screenHeight: Int
|
||||
|
||||
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) {
|
||||
val realMetrics = DisplayMetrics()
|
||||
display.getRealMetrics(realMetrics)
|
||||
screenWidth = realMetrics.widthPixels
|
||||
screenHeight = realMetrics.heightPixels
|
||||
} else {
|
||||
screenWidth = display.width
|
||||
screenHeight = display.height
|
||||
}
|
||||
|
||||
val screenProportion = screenWidth.toFloat() / screenHeight.toFloat()
|
||||
|
||||
val lp = mSurfaceView!!.layoutParams
|
||||
if (videoProportion > screenProportion) {
|
||||
lp.width = screenWidth
|
||||
lp.height = (screenWidth.toFloat() / videoProportion).toInt()
|
||||
} else {
|
||||
lp.width = (videoProportion * screenHeight.toFloat()).toInt()
|
||||
lp.height = screenHeight
|
||||
}
|
||||
mSurfaceView!!.layoutParams = lp
|
||||
}
|
||||
|
||||
private fun getTimeString(duration: Int): String {
|
||||
val sb = StringBuilder(8)
|
||||
val hours = duration / (60 * 60)
|
||||
val minutes = duration % (60 * 60) / 60
|
||||
val seconds = duration % (60 * 60) % 60
|
||||
|
||||
if (duration > 3600) {
|
||||
sb.append(String.format(Locale.getDefault(), "%02d", hours)).append(":")
|
||||
}
|
||||
|
||||
sb.append(String.format(Locale.getDefault(), "%02d", minutes))
|
||||
sb.append(":").append(String.format(Locale.getDefault(), "%02d", seconds))
|
||||
|
||||
return sb.toString()
|
||||
}
|
||||
|
||||
override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
|
||||
if (mMediaPlayer != null && fromUser) {
|
||||
setProgress(progress)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onStartTrackingTouch(seekBar: SeekBar) {
|
||||
if (mMediaPlayer == null)
|
||||
initMediaPlayer()
|
||||
|
||||
mMediaPlayer!!.pause()
|
||||
mIsDragged = true
|
||||
}
|
||||
|
||||
override fun onStopTrackingTouch(seekBar: SeekBar) {
|
||||
if (!mIsPlaying) {
|
||||
togglePlayPause()
|
||||
} else {
|
||||
mMediaPlayer!!.start()
|
||||
}
|
||||
|
||||
mIsDragged = false
|
||||
}
|
||||
|
||||
override fun onPrepared(mp: MediaPlayer) {
|
||||
mDuration = mp.duration / 1000
|
||||
addPreviewImage()
|
||||
setupTimeHolder()
|
||||
setProgress(mCurrTime)
|
||||
|
||||
if (mIsFragmentVisible && Config.newInstance(context).autoplayVideos)
|
||||
playVideo()
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue