From 00b470b01238651f9ed5dc4041437900a8cc7ab1 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 2 Jan 2019 17:08:20 +0100 Subject: [PATCH] adding some video player initialization code --- .../pro/activities/VideoPlayerActivity.kt | 151 ++++++++++++++++-- .../gallery/pro/fragments/VideoFragment.kt | 4 - 2 files changed, 139 insertions(+), 16 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/VideoPlayerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/VideoPlayerActivity.kt index 0523cd742..ca5f3f129 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/VideoPlayerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/activities/VideoPlayerActivity.kt @@ -3,12 +3,23 @@ package com.simplemobiletools.gallery.pro.activities import android.content.pm.ActivityInfo import android.content.res.Configuration import android.graphics.Color +import android.graphics.Point +import android.graphics.SurfaceTexture import android.graphics.drawable.ColorDrawable import android.net.Uri import android.os.Bundle import android.util.DisplayMetrics import android.view.* import android.widget.SeekBar +import com.google.android.exoplayer2.* +import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory +import com.google.android.exoplayer2.source.ExtractorMediaSource +import com.google.android.exoplayer2.source.TrackGroupArray +import com.google.android.exoplayer2.trackselection.TrackSelectionArray +import com.google.android.exoplayer2.upstream.ContentDataSource +import com.google.android.exoplayer2.upstream.DataSource +import com.google.android.exoplayer2.upstream.DataSpec +import com.google.android.exoplayer2.video.VideoListener import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_STORAGE import com.simplemobiletools.commons.helpers.isPiePlus @@ -17,12 +28,14 @@ import com.simplemobiletools.gallery.pro.extensions.* import kotlinx.android.synthetic.main.activity_video_player.* import kotlinx.android.synthetic.main.bottom_video_time_holder.* -open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListener { +open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListener, TextureView.SurfaceTextureListener { private var mIsFullscreen = false private var mCurrTime = 0 private var mDuration = 0 + private var mVideoSize = Point(0, 0) private var mUri: Uri? = null + private var mExoPlayer: SimpleExoPlayer? = null private var mTouchDownX = 0f private var mTouchDownY = 0f @@ -55,6 +68,19 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen updateTextColors(video_player_holder) } + override fun onCreateOptionsMenu(menu: Menu): Boolean { + menuInflater.inflate(R.menu.menu_video_player, menu) + return true + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + R.id.menu_change_orientation -> changeOrientation() + else -> return super.onOptionsItemSelected(item) + } + return true + } + private fun initPlayer() { mUri = intent.data ?: return supportActionBar?.title = getFilenameFromUri(mUri!!) @@ -85,23 +111,110 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen false } } + + initExoPlayer() + video_surface.surfaceTextureListener = this + video_surface.setOnClickListener { + fullscreenToggled(!mIsFullscreen) + } } - override fun onCreateOptionsMenu(menu: Menu): Boolean { - menuInflater.inflate(R.menu.menu_video_player, menu) - return true + private fun initExoPlayer() { + val dataSpec = DataSpec(mUri) + val fileDataSource = ContentDataSource(applicationContext) + try { + fileDataSource.open(dataSpec) + } catch (e: Exception) { + showErrorToast(e) + } + + val factory = DataSource.Factory { fileDataSource } + val audioSource = ExtractorMediaSource(fileDataSource.uri, factory, DefaultExtractorsFactory(), null, null) + mExoPlayer = ExoPlayerFactory.newSimpleInstance(applicationContext) + mExoPlayer!!.seekParameters = SeekParameters.CLOSEST_SYNC + mExoPlayer!!.audioStreamType = C.STREAM_TYPE_MUSIC + mExoPlayer!!.prepare(audioSource) + initExoPlayerListeners() } - override fun onOptionsItemSelected(item: MenuItem): Boolean { - if (mUri == null) { - return true - } + private fun initExoPlayerListeners() { + mExoPlayer!!.addListener(object : Player.EventListener { + override fun onPlaybackParametersChanged(playbackParameters: PlaybackParameters?) {} - when (item.itemId) { - R.id.menu_change_orientation -> changeOrientation() - else -> return super.onOptionsItemSelected(item) + override fun onSeekProcessed() {} + + override fun onTracksChanged(trackGroups: TrackGroupArray?, trackSelections: TrackSelectionArray?) {} + + override fun onPlayerError(error: ExoPlaybackException?) {} + + override fun onLoadingChanged(isLoading: Boolean) {} + + override fun onPositionDiscontinuity(reason: Int) {} + + override fun onRepeatModeChanged(repeatMode: Int) {} + + override fun onShuffleModeEnabledChanged(shuffleModeEnabled: Boolean) {} + + override fun onTimelineChanged(timeline: Timeline?, manifest: Any?, reason: Int) {} + + override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) { + when (playbackState) { + Player.STATE_READY -> videoPrepared() + Player.STATE_ENDED -> videoCompleted() + } + } + }) + + mExoPlayer!!.addVideoListener(object : VideoListener { + override fun onVideoSizeChanged(width: Int, height: Int, unappliedRotationDegrees: Int, pixelWidthHeightRatio: Float) { + mVideoSize.x = width + mVideoSize.y = height + setVideoSize() + } + + override fun onRenderedFirstFrame() {} + }) + } + + private fun videoPrepared() { + mDuration = (mExoPlayer!!.duration / 1000).toInt() + video_duration.text = mDuration.getFormattedDuration() + setPosition(mCurrTime) + } + + private fun setPosition(seconds: Int) { + mExoPlayer?.seekTo(seconds * 1000L) + video_seekbar.progress = seconds + video_curr_time.text = seconds.getFormattedDuration() + } + + private fun videoCompleted() { + + } + + private fun setVideoSize() { + val videoProportion = mVideoSize.x.toFloat() / mVideoSize.y.toFloat() + val display = windowManager.defaultDisplay + val screenWidth: Int + val screenHeight: Int + + val realMetrics = DisplayMetrics() + display.getRealMetrics(realMetrics) + screenWidth = realMetrics.widthPixels + screenHeight = realMetrics.heightPixels + + val screenProportion = screenWidth.toFloat() / screenHeight.toFloat() + + video_surface.layoutParams.apply { + if (videoProportion > screenProportion) { + width = screenWidth + height = (screenWidth.toFloat() / videoProportion).toInt() + } else { + width = (videoProportion * screenHeight.toFloat()).toInt() + height = screenHeight + } + video_surface.layoutParams = this } - return true } private fun changeOrientation() { @@ -189,4 +302,18 @@ open class VideoPlayerActivity : SimpleActivity(), SeekBar.OnSeekBarChangeListen override fun onStopTrackingTouch(seekBar: SeekBar?) { } + + override fun onSurfaceTextureUpdated(surface: SurfaceTexture?) { + } + + override fun onSurfaceTextureDestroyed(surface: SurfaceTexture?) = false + + override fun onSurfaceTextureAvailable(surface: SurfaceTexture?, width: Int, height: Int) { + Thread { + mExoPlayer?.setVideoSurface(Surface(video_surface!!.surfaceTexture)) + }.start() + } + + override fun onSurfaceTextureSizeChanged(surface: SurfaceTexture?, width: Int, height: Int) { + } } diff --git a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/VideoFragment.kt b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/VideoFragment.kt index 5d28ff477..e79ea6774 100644 --- a/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/VideoFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/gallery/pro/fragments/VideoFragment.kt @@ -17,7 +17,6 @@ import com.google.android.exoplayer2.* import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory import com.google.android.exoplayer2.source.ExtractorMediaSource import com.google.android.exoplayer2.source.TrackGroupArray -import com.google.android.exoplayer2.trackselection.DefaultTrackSelector import com.google.android.exoplayer2.trackselection.TrackSelectionArray import com.google.android.exoplayer2.upstream.ContentDataSource import com.google.android.exoplayer2.upstream.DataSource @@ -56,7 +55,6 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S private var mIsFullscreen = false private var mIsFragmentVisible = false private var mWasFragmentInit = false - private var mIsExoPlayerInitialized = false private var mIsPanorama = false private var mWasVideoStarted = false private var mCurrTime = 0 @@ -305,7 +303,6 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S override fun onTracksChanged(trackGroups: TrackGroupArray?, trackSelections: TrackSelectionArray?) {} override fun onPlayerError(error: ExoPlaybackException?) { - mIsExoPlayerInitialized = false } override fun onLoadingChanged(isLoading: Boolean) {} @@ -319,7 +316,6 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S override fun onTimelineChanged(timeline: Timeline?, manifest: Any?, reason: Int) {} override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) { - mIsExoPlayerInitialized = playbackState == Player.STATE_READY || playbackState == Player.STATE_ENDED when (playbackState) { Player.STATE_READY -> videoPrepared() Player.STATE_ENDED -> videoCompleted()