From 3c432aa49fac491b2299bd53fbc19a64b00f8d6f Mon Sep 17 00:00:00 2001 From: Bnyro Date: Thu, 14 Jul 2022 12:15:58 +0200 Subject: [PATCH 1/3] basic landscape implementation --- app/src/main/AndroidManifest.xml | 2 +- .../libretube/activities/MainActivity.kt | 3 -- .../libretube/fragments/PlayerFragment.kt | 29 +++++++++++++++---- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dbc40491c..8ed717cba 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,7 +37,7 @@ android:exported="true" android:hardwareAccelerated="true" android:launchMode="singleTop" - android:screenOrientation="userPortrait" + android:screenOrientation="user" android:supportsPictureInPicture="true"> diff --git a/app/src/main/java/com/github/libretube/activities/MainActivity.kt b/app/src/main/java/com/github/libretube/activities/MainActivity.kt index 1156f1efe..74609b34e 100644 --- a/app/src/main/java/com/github/libretube/activities/MainActivity.kt +++ b/app/src/main/java/com/github/libretube/activities/MainActivity.kt @@ -84,8 +84,6 @@ class MainActivity : AppCompatActivity() { binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) - requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT - navController = findNavController(R.id.fragment) binding.bottomNav.setupWithNavController(navController) @@ -290,7 +288,6 @@ class MainActivity : AppCompatActivity() { // set the animation duration motionLayout.setTransitionDuration(250) motionLayout.transitionToEnd() - requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT with(motionLayout) { getConstraintSet(R.id.start).constrainHeight(R.id.player, 0) enableTransition(R.id.yt_transition, true) diff --git a/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt b/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt index edcdda4c3..9b06227b2 100644 --- a/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt @@ -6,6 +6,7 @@ import android.app.PictureInPictureParams import android.content.Context import android.content.Intent import android.content.pm.ActivityInfo +import android.content.res.Configuration import android.graphics.Color import android.graphics.Rect import android.net.Uri @@ -163,6 +164,9 @@ class PlayerFragment : Fragment() { super.onViewCreated(view, savedInstanceState) hideKeyboard() + val mainActivity = activity as MainActivity + mainActivity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_USER + onConfigurationChanged(resources.configuration) setSponsorBlockPrefs() createExoPlayer(view) initializeTransitionLayout(view) @@ -232,7 +236,6 @@ class PlayerFragment : Fragment() { Globals.isMiniPlayerVisible = false binding.playerMotionLayout.transitionToEnd() val mainActivity = activity as MainActivity - mainActivity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT mainActivity.supportFragmentManager.beginTransaction() .remove(this) .commit() @@ -241,7 +244,6 @@ class PlayerFragment : Fragment() { Globals.isMiniPlayerVisible = false binding.playerMotionLayout.transitionToEnd() val mainActivity = activity as MainActivity - mainActivity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT mainActivity.supportFragmentManager.beginTransaction() .remove(this) .commit() @@ -374,7 +376,7 @@ class PlayerFragment : Fragment() { scaleControls(1F) val mainActivity = activity as MainActivity - mainActivity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT + mainActivity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_USER Globals.isFullScreen = false } @@ -1435,9 +1437,6 @@ class PlayerFragment : Fragment() { enableTransition(R.id.yt_transition, false) } - val mainActivity = activity as MainActivity - mainActivity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT - Globals.isFullScreen = false } else { // enable exoPlayer controls again @@ -1462,4 +1461,22 @@ class PlayerFragment : Fragment() { private fun updatePipParams() = PictureInPictureParams.Builder() .setActions(emptyList()) .build() + + override fun onConfigurationChanged(newConfig: Configuration) { + super.onConfigurationChanged(newConfig) + val orientation = newConfig.orientation + + if (orientation == Configuration.ORIENTATION_LANDSCAPE) { + // go to fullscreen mode + setFullscreen() + } else { + // leave fullscreen mode + val rotationPref = PreferenceHelper.getString( + requireContext(), + "fullscreen_orientation", + "ratio" + ) + if (rotationPref!! != "portrait") unsetFullscreen() + } + } } From b5c4ec9e923133202a4c325242f24f49386793fe Mon Sep 17 00:00:00 2001 From: Bnyro Date: Thu, 14 Jul 2022 15:57:20 +0200 Subject: [PATCH 2/3] add option for auto fullscreen --- .../libretube/activities/MainActivity.kt | 1 - .../libretube/fragments/PlayerFragment.kt | 99 +++++++++++-------- .../libretube/preferences/PlayerSettings.kt | 17 ++++ .../main/res/drawable/ic_rotating_circle.xml | 4 + app/src/main/res/values/strings.xml | 2 + app/src/main/res/xml/player_settings.xml | 10 ++ 6 files changed, 92 insertions(+), 41 deletions(-) create mode 100644 app/src/main/res/drawable/ic_rotating_circle.xml diff --git a/app/src/main/java/com/github/libretube/activities/MainActivity.kt b/app/src/main/java/com/github/libretube/activities/MainActivity.kt index 74609b34e..dc79c69b5 100644 --- a/app/src/main/java/com/github/libretube/activities/MainActivity.kt +++ b/app/src/main/java/com/github/libretube/activities/MainActivity.kt @@ -3,7 +3,6 @@ package com.github.libretube.activities import android.app.Activity import android.content.Context import android.content.Intent -import android.content.pm.ActivityInfo import android.content.res.Configuration import android.net.Uri import android.os.Build diff --git a/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt b/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt index 9b06227b2..d24587ed9 100644 --- a/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt @@ -141,6 +141,8 @@ class PlayerFragment : Fragment() { private lateinit var chapters: List private val sponsorBlockPrefs = SponsorBlockPrefs() + private var autoRotationEnabled = true + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) arguments?.let { @@ -164,9 +166,34 @@ class PlayerFragment : Fragment() { super.onViewCreated(view, savedInstanceState) hideKeyboard() + // save whether auto rotation is enabled + autoRotationEnabled = PreferenceHelper.getBoolean( + requireContext(), + "auto_fullscreen", + true + ) val mainActivity = activity as MainActivity - mainActivity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_USER - onConfigurationChanged(resources.configuration) + if (autoRotationEnabled) { + // enable auto rotation + mainActivity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_USER + onConfigurationChanged(resources.configuration) + } else { + // go to portrait mode + mainActivity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT + } + + // save whether related streams and autoplay are enabled + autoplay = PreferenceHelper.getBoolean( + requireContext(), + "autoplay", + false + ) + relatedStreamsEnabled = PreferenceHelper.getBoolean( + requireContext(), + "related_streams_toggle", + true + ) + setSponsorBlockPrefs() createExoPlayer(view) initializeTransitionLayout(view) @@ -343,20 +370,23 @@ class PlayerFragment : Fragment() { scaleControls(1.3F) - val orientation = when (fullscreenOrientationPref) { - "ratio" -> { - val videoSize = exoPlayer.videoSize - // probably a youtube shorts video - if (videoSize.height > videoSize.width) ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT - // a video with normal aspect ratio - else ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE + if (!autoRotationEnabled) { + // different orientations of the video are only available when auto rotation is disabled + val orientation = when (fullscreenOrientationPref) { + "ratio" -> { + val videoSize = exoPlayer.videoSize + // probably a youtube shorts video + if (videoSize.height > videoSize.width) ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT + // a video with normal aspect ratio + else ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE + } + "auto" -> ActivityInfo.SCREEN_ORIENTATION_USER + "landscape" -> ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE + "portrait" -> ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT + else -> ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE } - "auto" -> ActivityInfo.SCREEN_ORIENTATION_USER - "landscape" -> ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE - "portrait" -> ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT - else -> ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE + mainActivity.requestedOrientation = orientation } - mainActivity.requestedOrientation = orientation Globals.isFullScreen = true } @@ -375,8 +405,11 @@ class PlayerFragment : Fragment() { scaleControls(1F) - val mainActivity = activity as MainActivity - mainActivity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_USER + if (!autoRotationEnabled) { + // switch back to portrait mode if auto rotation disabled + val mainActivity = activity as MainActivity + mainActivity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT + } Globals.isFullScreen = false } @@ -499,10 +532,6 @@ class PlayerFragment : Fragment() { uploader = response.uploader!! thumbnailUrl = response.thumbnailUrl!! - // save whether related streams and autoplay are enabled - autoplay = PreferenceHelper.getBoolean(requireContext(), "autoplay", false) - relatedStreamsEnabled = - PreferenceHelper.getBoolean(requireContext(), "related_streams_toggle", true) // save related streams for autoplay relatedStreams = response.relatedStreams @@ -1428,14 +1457,7 @@ class PlayerFragment : Fragment() { exoPlayerView.hideController() exoPlayerView.useController = false - // hide anything but the player - binding.linLayout.visibility = View.GONE - binding.mainContainer.isClickable = true - - with(binding.playerMotionLayout) { - getConstraintSet(R.id.start).constrainHeight(R.id.player, -1) - enableTransition(R.id.yt_transition, false) - } + unsetFullscreen() Globals.isFullScreen = false } else { @@ -1464,19 +1486,16 @@ class PlayerFragment : Fragment() { override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) - val orientation = newConfig.orientation - if (orientation == Configuration.ORIENTATION_LANDSCAPE) { - // go to fullscreen mode - setFullscreen() - } else { - // leave fullscreen mode - val rotationPref = PreferenceHelper.getString( - requireContext(), - "fullscreen_orientation", - "ratio" - ) - if (rotationPref!! != "portrait") unsetFullscreen() + if (autoRotationEnabled) { + val orientation = newConfig.orientation + if (orientation == Configuration.ORIENTATION_LANDSCAPE) { + // go to fullscreen mode + setFullscreen() + } else { + // exit fullscreen if not landscape + unsetFullscreen() + } } } } diff --git a/app/src/main/java/com/github/libretube/preferences/PlayerSettings.kt b/app/src/main/java/com/github/libretube/preferences/PlayerSettings.kt index f2fdc3fca..e3d014055 100644 --- a/app/src/main/java/com/github/libretube/preferences/PlayerSettings.kt +++ b/app/src/main/java/com/github/libretube/preferences/PlayerSettings.kt @@ -1,7 +1,9 @@ package com.github.libretube.preferences import android.os.Bundle +import androidx.preference.ListPreference import androidx.preference.PreferenceFragmentCompat +import androidx.preference.SwitchPreferenceCompat import com.github.libretube.R import com.github.libretube.activities.SettingsActivity @@ -13,5 +15,20 @@ class PlayerSettings : PreferenceFragmentCompat() { val settingsActivity = activity as SettingsActivity settingsActivity.changeTopBarText(getString(R.string.audio_video)) + + val playerOrientation = findPreference("fullscreen_orientation") + val autoRotateToFullscreen = findPreference("auto_fullscreen") + + // only show the player orientation option if auto fullscreen is disabled + playerOrientation?.isEnabled != PreferenceHelper.getBoolean( + requireContext(), + "auto_fullscreen", + true + ) + + autoRotateToFullscreen?.setOnPreferenceChangeListener { _, newValue -> + playerOrientation?.isEnabled = newValue != true + true + } } } diff --git a/app/src/main/res/drawable/ic_rotating_circle.xml b/app/src/main/res/drawable/ic_rotating_circle.xml new file mode 100644 index 000000000..7339373fe --- /dev/null +++ b/app/src/main/res/drawable/ic_rotating_circle.xml @@ -0,0 +1,4 @@ + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 141527a8f..ac64401d1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -237,4 +237,6 @@ Always Selected Never + Auto fullscreen + Automatically switch to player fullscreen when the device gets turned. \ No newline at end of file diff --git a/app/src/main/res/xml/player_settings.xml b/app/src/main/res/xml/player_settings.xml index dc0efc7b1..da3e50bf4 100644 --- a/app/src/main/res/xml/player_settings.xml +++ b/app/src/main/res/xml/player_settings.xml @@ -60,16 +60,26 @@ + + Date: Thu, 14 Jul 2022 16:04:03 +0200 Subject: [PATCH 3/3] disable by default --- .../main/java/com/github/libretube/fragments/PlayerFragment.kt | 2 ++ .../java/com/github/libretube/preferences/PlayerSettings.kt | 2 +- app/src/main/res/xml/player_settings.xml | 3 +-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt b/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt index d24587ed9..bde390d9b 100644 --- a/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt @@ -297,6 +297,8 @@ class PlayerFragment : Fragment() { } // FullScreen button trigger + // hide fullscreen button if auto rotation enabled + playerBinding.fullscreen.visibility = if (autoRotationEnabled) View.GONE else View.VISIBLE playerBinding.fullscreen.setOnClickListener { // hide player controller exoPlayerView.hideController() diff --git a/app/src/main/java/com/github/libretube/preferences/PlayerSettings.kt b/app/src/main/java/com/github/libretube/preferences/PlayerSettings.kt index e3d014055..b3428f4f7 100644 --- a/app/src/main/java/com/github/libretube/preferences/PlayerSettings.kt +++ b/app/src/main/java/com/github/libretube/preferences/PlayerSettings.kt @@ -23,7 +23,7 @@ class PlayerSettings : PreferenceFragmentCompat() { playerOrientation?.isEnabled != PreferenceHelper.getBoolean( requireContext(), "auto_fullscreen", - true + false ) autoRotateToFullscreen?.setOnPreferenceChangeListener { _, newValue -> diff --git a/app/src/main/res/xml/player_settings.xml b/app/src/main/res/xml/player_settings.xml index da3e50bf4..10563cdc6 100644 --- a/app/src/main/res/xml/player_settings.xml +++ b/app/src/main/res/xml/player_settings.xml @@ -74,12 +74,11 @@