mirror of
https://github.com/libre-tube/LibreTube.git
synced 2025-01-06 01:20:29 +05:30
refactor: simplify fullscreen player logic
This commit is contained in:
parent
cfdae3e6b1
commit
22e375e89a
@ -15,7 +15,6 @@ import android.os.Handler
|
|||||||
import android.os.Looper
|
import android.os.Looper
|
||||||
import android.os.PowerManager
|
import android.os.PowerManager
|
||||||
import android.text.format.DateUtils
|
import android.text.format.DateUtils
|
||||||
import android.util.Log
|
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
@ -23,19 +22,15 @@ import android.view.ViewGroup.LayoutParams
|
|||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.constraintlayout.motion.widget.MotionLayout
|
import androidx.constraintlayout.motion.widget.MotionLayout
|
||||||
import androidx.constraintlayout.motion.widget.TransitionAdapter
|
import androidx.constraintlayout.motion.widget.TransitionAdapter
|
||||||
import androidx.constraintlayout.widget.ConstraintLayout
|
|
||||||
import androidx.constraintlayout.widget.ConstraintSet
|
|
||||||
import androidx.core.content.getSystemService
|
import androidx.core.content.getSystemService
|
||||||
import androidx.core.graphics.drawable.toDrawable
|
import androidx.core.graphics.drawable.toDrawable
|
||||||
import androidx.core.net.toUri
|
import androidx.core.net.toUri
|
||||||
import androidx.core.os.bundleOf
|
import androidx.core.os.bundleOf
|
||||||
import androidx.core.os.postDelayed
|
import androidx.core.os.postDelayed
|
||||||
import androidx.core.view.WindowCompat
|
import androidx.core.view.WindowCompat
|
||||||
import androidx.core.view.WindowInsetsCompat
|
|
||||||
import androidx.core.view.isGone
|
import androidx.core.view.isGone
|
||||||
import androidx.core.view.isInvisible
|
import androidx.core.view.isInvisible
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import androidx.core.view.updateLayoutParams
|
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.fragment.app.activityViewModels
|
import androidx.fragment.app.activityViewModels
|
||||||
import androidx.fragment.app.commit
|
import androidx.fragment.app.commit
|
||||||
@ -104,7 +99,6 @@ import com.github.libretube.ui.dialogs.AddToPlaylistDialog
|
|||||||
import com.github.libretube.ui.dialogs.DownloadDialog
|
import com.github.libretube.ui.dialogs.DownloadDialog
|
||||||
import com.github.libretube.ui.dialogs.ShareDialog
|
import com.github.libretube.ui.dialogs.ShareDialog
|
||||||
import com.github.libretube.ui.extensions.setupSubscriptionButton
|
import com.github.libretube.ui.extensions.setupSubscriptionButton
|
||||||
import com.github.libretube.ui.extensions.toggleSystemBars
|
|
||||||
import com.github.libretube.ui.interfaces.OnlinePlayerOptions
|
import com.github.libretube.ui.interfaces.OnlinePlayerOptions
|
||||||
import com.github.libretube.ui.listeners.SeekbarPreviewListener
|
import com.github.libretube.ui.listeners.SeekbarPreviewListener
|
||||||
import com.github.libretube.ui.models.CommentsViewModel
|
import com.github.libretube.ui.models.CommentsViewModel
|
||||||
@ -519,11 +513,6 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun setFullscreen() {
|
private fun setFullscreen() {
|
||||||
with(binding.playerMotionLayout) {
|
|
||||||
getConstraintSet(R.id.start).constrainHeight(R.id.player, -1)
|
|
||||||
enableTransition(R.id.yt_transition, false)
|
|
||||||
}
|
|
||||||
|
|
||||||
// set status bar icon color to white
|
// set status bar icon color to white
|
||||||
windowInsetsControllerCompat.isAppearanceLightStatusBars = false
|
windowInsetsControllerCompat.isAppearanceLightStatusBars = false
|
||||||
|
|
||||||
@ -542,20 +531,11 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions {
|
|||||||
|
|
||||||
updateResolutionOnFullscreenChange(true)
|
updateResolutionOnFullscreenChange(true)
|
||||||
|
|
||||||
val playerView = binding.player
|
openOrCloseFullscreenDialog(true)
|
||||||
(binding.player.parent as ViewGroup).removeView(playerView)
|
|
||||||
fullscreenDialog.addContentView(binding.player, LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT))
|
|
||||||
fullscreenDialog.show()
|
|
||||||
WindowHelper.toggleFullscreen(fullscreenDialog.window!!, true)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("SourceLockedOrientationActivity")
|
@SuppressLint("SourceLockedOrientationActivity")
|
||||||
fun unsetFullscreen() {
|
fun unsetFullscreen() {
|
||||||
with(binding.playerMotionLayout) {
|
|
||||||
getConstraintSet(R.id.start).constrainHeight(R.id.player, 0)
|
|
||||||
enableTransition(R.id.yt_transition, true)
|
|
||||||
}
|
|
||||||
|
|
||||||
// set status bar icon color back to theme color
|
// set status bar icon color back to theme color
|
||||||
windowInsetsControllerCompat.isAppearanceLightStatusBars =
|
windowInsetsControllerCompat.isAppearanceLightStatusBars =
|
||||||
when (resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) {
|
when (resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) {
|
||||||
@ -574,10 +554,27 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions {
|
|||||||
viewModel.isFullscreen.value = false
|
viewModel.isFullscreen.value = false
|
||||||
updateResolutionOnFullscreenChange(false)
|
updateResolutionOnFullscreenChange(false)
|
||||||
|
|
||||||
|
openOrCloseFullscreenDialog(false)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun openOrCloseFullscreenDialog(open: Boolean) {
|
||||||
val playerView = binding.player
|
val playerView = binding.player
|
||||||
(playerView.parent as ViewGroup).removeView(playerView)
|
(playerView.parent as ViewGroup).removeView(playerView)
|
||||||
binding.playerMotionLayout.addView(playerView)
|
|
||||||
fullscreenDialog.dismiss()
|
if (open) {
|
||||||
|
fullscreenDialog.addContentView(
|
||||||
|
binding.player,
|
||||||
|
LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)
|
||||||
|
)
|
||||||
|
fullscreenDialog.show()
|
||||||
|
playerView.currentWindow = fullscreenDialog.window
|
||||||
|
} else {
|
||||||
|
binding.playerMotionLayout.addView(playerView)
|
||||||
|
playerView.currentWindow = null
|
||||||
|
fullscreenDialog.dismiss()
|
||||||
|
}
|
||||||
|
|
||||||
|
WindowHelper.toggleFullscreen(fullscreenDialog.window!!, open)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onPause() {
|
override fun onPause() {
|
||||||
@ -1482,13 +1479,9 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions {
|
|||||||
viewModel.isMiniPlayerVisible.value = false
|
viewModel.isMiniPlayerVisible.value = false
|
||||||
}
|
}
|
||||||
|
|
||||||
with(binding.playerMotionLayout) {
|
|
||||||
getConstraintSet(R.id.start).constrainHeight(R.id.player, -1)
|
|
||||||
enableTransition(R.id.yt_transition, false)
|
|
||||||
}
|
|
||||||
binding.linLayout.isGone = true
|
|
||||||
|
|
||||||
updateCurrentSubtitle(null)
|
updateCurrentSubtitle(null)
|
||||||
|
|
||||||
|
openOrCloseFullscreenDialog(true)
|
||||||
} else {
|
} else {
|
||||||
// close button got clicked in PiP mode
|
// close button got clicked in PiP mode
|
||||||
// pause the video and keep the app alive
|
// pause the video and keep the app alive
|
||||||
@ -1497,20 +1490,13 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions {
|
|||||||
// enable exoPlayer controls again
|
// enable exoPlayer controls again
|
||||||
binding.player.useController = true
|
binding.player.useController = true
|
||||||
|
|
||||||
// set back to portrait mode
|
|
||||||
if (viewModel.isFullscreen.value != true) {
|
|
||||||
with(binding.playerMotionLayout) {
|
|
||||||
getConstraintSet(R.id.start).constrainHeight(R.id.player, 0)
|
|
||||||
enableTransition(R.id.yt_transition, true)
|
|
||||||
}
|
|
||||||
binding.linLayout.isVisible = true
|
|
||||||
}
|
|
||||||
|
|
||||||
updateCurrentSubtitle(currentSubtitle)
|
updateCurrentSubtitle(currentSubtitle)
|
||||||
|
|
||||||
binding.optionsLL.post {
|
binding.optionsLL.post {
|
||||||
binding.optionsLL.requestLayout()
|
binding.optionsLL.requestLayout()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
openOrCloseFullscreenDialog(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@ import android.text.format.DateUtils
|
|||||||
import android.util.AttributeSet
|
import android.util.AttributeSet
|
||||||
import android.view.MotionEvent
|
import android.view.MotionEvent
|
||||||
import android.view.View
|
import android.view.View
|
||||||
|
import android.view.Window
|
||||||
import android.widget.FrameLayout
|
import android.widget.FrameLayout
|
||||||
import android.widget.ImageView
|
import android.widget.ImageView
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
@ -88,6 +89,12 @@ open class CustomExoPlayerView(
|
|||||||
updateCurrentPosition()
|
updateCurrentPosition()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The window that needs to be addressed for showing and hiding the system bars
|
||||||
|
* If null, the activity's default/main window will be used
|
||||||
|
*/
|
||||||
|
var currentWindow: Window? = null
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Preferences
|
* Preferences
|
||||||
*/
|
*/
|
||||||
@ -144,7 +151,7 @@ open class CustomExoPlayerView(
|
|||||||
// change locked status
|
// change locked status
|
||||||
isPlayerLocked = !isPlayerLocked
|
isPlayerLocked = !isPlayerLocked
|
||||||
|
|
||||||
activity.window.toggleSystemBars(
|
(currentWindow ?: activity.window).toggleSystemBars(
|
||||||
types = WindowInsetsCompat.Type.statusBars(),
|
types = WindowInsetsCompat.Type.statusBars(),
|
||||||
showBars = !isPlayerLocked
|
showBars = !isPlayerLocked
|
||||||
)
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user