add some initial handling for 360 videos
This commit is contained in:
parent
1ad517a813
commit
7bc48bee0b
3 changed files with 98 additions and 74 deletions
|
@ -3,7 +3,6 @@ package com.simplemobiletools.gallery.fragments
|
|||
import android.content.res.Configuration
|
||||
import android.graphics.Point
|
||||
import android.graphics.SurfaceTexture
|
||||
import android.media.AudioManager
|
||||
import android.media.MediaMetadataRetriever
|
||||
import android.net.Uri
|
||||
import android.os.Bundle
|
||||
|
@ -44,7 +43,6 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
private var mTextureView: TextureView? = null
|
||||
private var mCurrTimeView: TextView? = null
|
||||
private var mSeekBar: SeekBar? = null
|
||||
private var mTimeHolder: View? = null
|
||||
private var mView: View? = null
|
||||
private var mExoPlayer: SimpleExoPlayer? = null
|
||||
private var mVideoSize = Point(0, 0)
|
||||
|
@ -57,6 +55,7 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
private var mIsFragmentVisible = false
|
||||
private var mWasFragmentInit = false
|
||||
private var mIsExoPlayerInitialized = false
|
||||
private var mIsPanorama = false
|
||||
private var mCurrTime = 0
|
||||
private var mDuration = 0
|
||||
|
||||
|
@ -65,8 +64,9 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
private var mStoredBottomActions = true
|
||||
private var mStoredExtendedDetails = 0
|
||||
|
||||
private lateinit var brightnessSideScroll: MediaSideScroll
|
||||
private lateinit var volumeSideScroll: MediaSideScroll
|
||||
private lateinit var mTimeHolder: View
|
||||
private lateinit var mBrightnessSideScroll: MediaSideScroll
|
||||
private lateinit var mVolumeSideScroll: MediaSideScroll
|
||||
|
||||
lateinit var medium: Medium
|
||||
|
||||
|
@ -74,11 +74,21 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
mView = inflater.inflate(R.layout.pager_video_item, container, false).apply {
|
||||
instant_prev_item.setOnClickListener { listener?.goToPrevItem() }
|
||||
instant_next_item.setOnClickListener { listener?.goToNextItem() }
|
||||
video_curr_time.setOnClickListener { skip(false) }
|
||||
video_duration.setOnClickListener { skip(true) }
|
||||
video_holder.setOnClickListener { toggleFullscreen() }
|
||||
|
||||
// adding an empty click listener just to avoid ripple animation at toggling fullscreen
|
||||
video_seekbar.setOnClickListener { }
|
||||
|
||||
mTimeHolder = video_time_holder
|
||||
mBrightnessSideScroll = video_brightness_controller
|
||||
mVolumeSideScroll = video_volume_controller
|
||||
}
|
||||
|
||||
storeStateVariables()
|
||||
medium = arguments!!.getSerializable(MEDIUM) as Medium
|
||||
Glide.with(context!!).load(medium.path).into(mView!!.video_preview)
|
||||
|
||||
// setMenuVisibility is not called at VideoActivity (third party intent)
|
||||
if (!mIsFragmentVisible && activity is VideoActivity) {
|
||||
|
@ -86,49 +96,58 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
}
|
||||
|
||||
mIsFullscreen = activity!!.window.decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_FULLSCREEN == View.SYSTEM_UI_FLAG_FULLSCREEN
|
||||
|
||||
setupPlayer()
|
||||
if (savedInstanceState != null) {
|
||||
mCurrTime = savedInstanceState.getInt(PROGRESS)
|
||||
}
|
||||
|
||||
checkFullscreen()
|
||||
mWasFragmentInit = true
|
||||
|
||||
mView!!.apply {
|
||||
brightnessSideScroll = video_brightness_controller
|
||||
brightnessSideScroll.initialize(activity!!, slide_info, true, container) { x, y ->
|
||||
video_holder.performClick()
|
||||
}
|
||||
|
||||
volumeSideScroll = video_volume_controller
|
||||
volumeSideScroll.initialize(activity!!, slide_info, false, container) { x, y ->
|
||||
video_holder.performClick()
|
||||
}
|
||||
|
||||
video_curr_time.setOnClickListener { skip(false) }
|
||||
video_duration.setOnClickListener { skip(true) }
|
||||
Glide.with(context!!).load(medium.path).into(video_preview)
|
||||
}
|
||||
|
||||
mExoPlayer = ExoPlayerFactory.newSimpleInstance(context, DefaultTrackSelector())
|
||||
mExoPlayer!!.seekParameters = SeekParameters.CLOSEST_SYNC
|
||||
initExoPlayerListeners()
|
||||
|
||||
initTimeHolder()
|
||||
medium.path.getVideoResolution()?.apply {
|
||||
mVideoSize.x = x
|
||||
mVideoSize.y = y
|
||||
setVideoSize()
|
||||
mIsPanorama = x == y * 2
|
||||
if (mIsPanorama) {
|
||||
mView!!.apply {
|
||||
panorama_outline.beVisible()
|
||||
video_play_outline.beGone()
|
||||
mVolumeSideScroll.beGone()
|
||||
mBrightnessSideScroll.beGone()
|
||||
Glide.with(context!!).load(medium.path).into(video_preview)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!mIsPanorama) {
|
||||
setupPlayer()
|
||||
if (savedInstanceState != null) {
|
||||
mCurrTime = savedInstanceState.getInt(PROGRESS)
|
||||
}
|
||||
|
||||
checkFullscreen()
|
||||
mWasFragmentInit = true
|
||||
|
||||
mExoPlayer = ExoPlayerFactory.newSimpleInstance(context, DefaultTrackSelector())
|
||||
mExoPlayer!!.seekParameters = SeekParameters.CLOSEST_SYNC
|
||||
initExoPlayerListeners()
|
||||
|
||||
if (mVideoSize.x != 0 && mVideoSize.y != 0) {
|
||||
setVideoSize()
|
||||
}
|
||||
|
||||
mView!!.apply {
|
||||
mBrightnessSideScroll.initialize(activity!!, slide_info, true, container) { x, y ->
|
||||
video_holder.performClick()
|
||||
}
|
||||
|
||||
mVolumeSideScroll.initialize(activity!!, slide_info, false, container) { x, y ->
|
||||
video_holder.performClick()
|
||||
}
|
||||
|
||||
video_surface.onGlobalLayout {
|
||||
if (mIsFragmentVisible && context?.config?.autoplayVideos == true) {
|
||||
playVideo()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
setupVideoDuration()
|
||||
|
||||
mView!!.video_surface.onGlobalLayout {
|
||||
if (mIsFragmentVisible && context?.config?.autoplayVideos == true) {
|
||||
playVideo()
|
||||
}
|
||||
}
|
||||
|
||||
return mView
|
||||
}
|
||||
|
||||
|
@ -139,8 +158,8 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
val allowVideoGestures = config.allowVideoGestures
|
||||
val allowInstantChange = config.allowInstantChange
|
||||
mView!!.apply {
|
||||
video_volume_controller.beVisibleIf(allowVideoGestures)
|
||||
video_brightness_controller.beVisibleIf(allowVideoGestures)
|
||||
video_volume_controller.beVisibleIf(allowVideoGestures && !mIsPanorama)
|
||||
video_brightness_controller.beVisibleIf(allowVideoGestures && !mIsPanorama)
|
||||
|
||||
instant_prev_item.beVisibleIf(allowInstantChange)
|
||||
instant_next_item.beVisibleIf(allowInstantChange)
|
||||
|
@ -154,7 +173,7 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
initTimeHolder()
|
||||
}
|
||||
|
||||
mView!!.video_time_holder.setBackgroundResource(if (config.bottomActions) 0 else R.drawable.gradient_background)
|
||||
mTimeHolder.setBackgroundResource(if (config.bottomActions) 0 else R.drawable.gradient_background)
|
||||
storeStateVariables()
|
||||
}
|
||||
|
||||
|
@ -208,9 +227,7 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
mTextureView = mView!!.video_surface
|
||||
mTextureView!!.setOnClickListener { toggleFullscreen() }
|
||||
mTextureView!!.surfaceTextureListener = this
|
||||
mView!!.video_holder.setOnClickListener { toggleFullscreen() }
|
||||
|
||||
initTimeHolder()
|
||||
checkExtendedDetails()
|
||||
}
|
||||
|
||||
|
@ -227,7 +244,7 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
|
||||
val factory = DataSource.Factory { fileDataSource }
|
||||
val audioSource = ExtractorMediaSource(fileDataSource.uri, factory, DefaultExtractorsFactory(), null, null)
|
||||
mExoPlayer!!.audioStreamType = AudioManager.STREAM_MUSIC
|
||||
mExoPlayer!!.audioStreamType = C.STREAM_TYPE_MUSIC
|
||||
mExoPlayer!!.prepare(audioSource)
|
||||
}
|
||||
|
||||
|
@ -297,15 +314,12 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
bottom += resources.getDimension(R.dimen.bottom_actions_height).toInt()
|
||||
}
|
||||
|
||||
mTimeHolder!!.setPadding(left, top, right, bottom)
|
||||
mTimeHolder.setPadding(left, top, right, bottom)
|
||||
|
||||
mCurrTimeView = mView!!.video_curr_time
|
||||
mSeekBar = mView!!.video_seekbar
|
||||
mSeekBar!!.setOnSeekBarChangeListener(this)
|
||||
|
||||
if (mIsFullscreen) {
|
||||
mTimeHolder!!.beInvisible()
|
||||
}
|
||||
mTimeHolder.beInvisibleIf(mIsFullscreen)
|
||||
}
|
||||
|
||||
private fun hasNavBar(): Boolean {
|
||||
|
@ -367,7 +381,7 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
AnimationUtils.loadAnimation(activity, anim).apply {
|
||||
duration = 150
|
||||
fillAfter = true
|
||||
mTimeHolder?.startAnimation(this)
|
||||
mTimeHolder.startAnimation(this)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -431,7 +445,7 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
private fun videoEnded() = mExoPlayer?.currentPosition ?: 0 >= mExoPlayer?.duration ?: 0
|
||||
|
||||
private fun setProgress(seconds: Int) {
|
||||
mExoPlayer!!.seekTo(seconds * 1000L)
|
||||
mExoPlayer?.seekTo(seconds * 1000L)
|
||||
mSeekBar!!.progress = seconds
|
||||
mCurrTimeView!!.text = seconds.getFormattedDuration()
|
||||
}
|
||||
|
@ -555,7 +569,7 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
}
|
||||
|
||||
private fun skip(forward: Boolean) {
|
||||
if (mExoPlayer == null) {
|
||||
if (mExoPlayer == null || mIsPanorama) {
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -613,7 +627,7 @@ class VideoFragment : ViewPagerFragment(), TextureView.SurfaceTextureListener, S
|
|||
|
||||
private fun getExtendedDetailsY(height: Int): Float {
|
||||
val smallMargin = resources.getDimension(R.dimen.small_margin)
|
||||
val fullscreenOffset = smallMargin + if (mIsFullscreen) 0 else mTimeHolder!!.height
|
||||
val fullscreenOffset = smallMargin + if (mIsFullscreen) 0 else mTimeHolder.height
|
||||
return context!!.realScreenSize.y.toFloat() - height - fullscreenOffset
|
||||
}
|
||||
}
|
||||
|
|
|
@ -30,8 +30,8 @@ class MediaSideScroll(context: Context, attrs: AttributeSet) : RelativeLayout(co
|
|||
private var mSlideInfoText = ""
|
||||
private var mSlideInfoFadeHandler = Handler()
|
||||
private var mParentView: ViewGroup? = null
|
||||
private var activity: Activity? = null
|
||||
|
||||
private lateinit var activity: Activity
|
||||
private lateinit var slideInfoView: TextView
|
||||
private lateinit var callback: (Float, Float) -> Unit
|
||||
|
||||
|
@ -55,7 +55,7 @@ class MediaSideScroll(context: Context, attrs: AttributeSet) : RelativeLayout(co
|
|||
}
|
||||
|
||||
override fun onTouchEvent(event: MotionEvent): Boolean {
|
||||
if (mPassTouches) {
|
||||
if (mPassTouches && activity == null) {
|
||||
return false
|
||||
}
|
||||
|
||||
|
@ -112,11 +112,11 @@ class MediaSideScroll(context: Context, attrs: AttributeSet) : RelativeLayout(co
|
|||
return true
|
||||
}
|
||||
|
||||
private fun getCurrentVolume() = activity.audioManager.getStreamVolume(AudioManager.STREAM_MUSIC)
|
||||
private fun getCurrentVolume() = activity!!.audioManager.getStreamVolume(AudioManager.STREAM_MUSIC)
|
||||
|
||||
private fun getCurrentBrightness(): Int {
|
||||
return try {
|
||||
Settings.System.getInt(activity.contentResolver, Settings.System.SCREEN_BRIGHTNESS)
|
||||
Settings.System.getInt(activity!!.contentResolver, Settings.System.SCREEN_BRIGHTNESS)
|
||||
} catch (e: Settings.SettingNotFoundException) {
|
||||
70
|
||||
}
|
||||
|
@ -132,11 +132,11 @@ class MediaSideScroll(context: Context, attrs: AttributeSet) : RelativeLayout(co
|
|||
|
||||
private fun volumePercentChanged(percent: Int) {
|
||||
val stream = AudioManager.STREAM_MUSIC
|
||||
val maxVolume = activity.audioManager.getStreamMaxVolume(stream)
|
||||
val maxVolume = activity!!.audioManager.getStreamMaxVolume(stream)
|
||||
val percentPerPoint = 100 / maxVolume
|
||||
val addPoints = percent / percentPerPoint
|
||||
val newVolume = Math.min(maxVolume, Math.max(0, mTouchDownValue + addPoints))
|
||||
activity.audioManager.setStreamVolume(stream, newVolume, 0)
|
||||
activity!!.audioManager.setStreamVolume(stream, newVolume, 0)
|
||||
|
||||
val absolutePercent = ((newVolume / maxVolume.toFloat()) * 100).toInt()
|
||||
showValue(absolutePercent)
|
||||
|
@ -156,9 +156,9 @@ class MediaSideScroll(context: Context, attrs: AttributeSet) : RelativeLayout(co
|
|||
val absolutePercent = ((newBrightness / maxBrightness) * 100).toInt()
|
||||
showValue(absolutePercent)
|
||||
|
||||
val attributes = activity.window.attributes
|
||||
val attributes = activity!!.window.attributes
|
||||
attributes.screenBrightness = absolutePercent / 100f
|
||||
activity.window.attributes = attributes
|
||||
activity!!.window.attributes = attributes
|
||||
|
||||
mSlideInfoFadeHandler.removeCallbacksAndMessages(null)
|
||||
mSlideInfoFadeHandler.postDelayed({
|
||||
|
|
|
@ -60,13 +60,23 @@
|
|||
android:alpha="0"
|
||||
android:background="@drawable/black_rounded_background"
|
||||
android:gravity="center"
|
||||
android:paddingBottom="@dimen/medium_margin"
|
||||
android:paddingLeft="@dimen/activity_margin"
|
||||
android:paddingRight="@dimen/activity_margin"
|
||||
android:paddingTop="@dimen/medium_margin"
|
||||
android:paddingRight="@dimen/activity_margin"
|
||||
android:paddingBottom="@dimen/medium_margin"
|
||||
android:textColor="@android:color/white"
|
||||
android:textSize="@dimen/extra_big_text_size"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/panorama_outline"
|
||||
android:layout_width="@dimen/play_outline_size_big"
|
||||
android:layout_height="@dimen/play_outline_size_big"
|
||||
android:layout_centerInParent="true"
|
||||
android:background="@drawable/circle_black_background_with_inset"
|
||||
android:padding="28dp"
|
||||
android:src="@drawable/ic_panorama"
|
||||
android:visibility="gone"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/video_details"
|
||||
android:layout_width="wrap_content"
|
||||
|
@ -92,10 +102,10 @@
|
|||
style="@style/MyBorderlessBackgroundStyle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_alignBottom="@+id/video_seekbar"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_alignParentStart="true"
|
||||
android:layout_alignTop="@+id/video_seekbar"
|
||||
android:layout_alignBottom="@+id/video_seekbar"
|
||||
android:layout_alignParentStart="true"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:gravity="center_vertical"
|
||||
android:paddingLeft="@dimen/activity_margin"
|
||||
android:paddingRight="@dimen/activity_margin"
|
||||
|
@ -106,22 +116,22 @@
|
|||
android:id="@+id/video_seekbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_toEndOf="@+id/video_curr_time"
|
||||
android:layout_toLeftOf="@+id/video_duration"
|
||||
android:layout_toRightOf="@+id/video_curr_time"
|
||||
android:layout_toStartOf="@+id/video_duration"
|
||||
android:paddingBottom="@dimen/activity_margin"
|
||||
android:paddingTop="@dimen/activity_margin"/>
|
||||
android:layout_toLeftOf="@+id/video_duration"
|
||||
android:layout_toEndOf="@+id/video_curr_time"
|
||||
android:layout_toRightOf="@+id/video_curr_time"
|
||||
android:paddingTop="@dimen/activity_margin"
|
||||
android:paddingBottom="@dimen/activity_margin"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/video_duration"
|
||||
style="@style/MyBorderlessBackgroundStyle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignTop="@+id/video_seekbar"
|
||||
android:layout_alignBottom="@+id/video_seekbar"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_alignTop="@+id/video_seekbar"
|
||||
android:gravity="center_vertical"
|
||||
android:paddingLeft="@dimen/activity_margin"
|
||||
android:paddingRight="@dimen/activity_margin"
|
||||
|
|
Loading…
Reference in a new issue