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 6b18f8ec3..b05624a71 100644 --- a/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt @@ -140,6 +140,7 @@ class PlayerFragment : Fragment() { private lateinit var thumbnailUrl: String private lateinit var chapters: List private val sponsorBlockPrefs = SponsorBlockPrefs() + private lateinit var subtitle: MutableList private var autoRotationEnabled = true @@ -1093,7 +1094,6 @@ class PlayerFragment : Fragment() { } private fun setMediaSource( - subtitle: MutableList, videoUri: Uri, audioUrl: String ) { @@ -1117,7 +1117,6 @@ class PlayerFragment : Fragment() { private fun setResolutionAndSubtitles(response: Streams) { val videoFormatPreference = PreferenceHelper.getString(requireContext(), "player_video_format", "WEBM") - val defres = PreferenceHelper.getString(requireContext(), "default_res", "")!! var videosNameArray: Array = arrayOf() var videosUrlArray: Array = arrayOf() @@ -1133,13 +1132,13 @@ class PlayerFragment : Fragment() { if (vid.format.equals(videoFormatPreference) && vid.url != null) { // preferred format videosNameArray += vid.quality.toString() videosUrlArray += vid.url!!.toUri() - } else if (vid.quality.equals("LBRY") && vid.format.equals("MP4")) { // LBRY MP4 format) + } else if (vid.quality.equals("LBRY") && vid.format.equals("MP4")) { // LBRY MP4 format videosNameArray += "LBRY MP4" videosUrlArray += vid.url!!.toUri() } } // create a list of subtitles - val subtitle = mutableListOf() + subtitle = mutableListOf() response.subtitles!!.forEach { subtitle.add( SubtitleConfiguration.Builder(it.url!!.toUri()) @@ -1148,50 +1147,12 @@ class PlayerFragment : Fragment() { .build() ) } - // set resolution in the beginning - when { - // search for the default resolution in the videoNamesArray, select quality if found - defres != "" -> { - run lit@{ - videosNameArray.forEachIndexed { index, pipedStream -> - if (pipedStream.contains(defres)) { - val videoUri = videosUrlArray[index] - val audioUrl = getMostBitRate(response.audioStreams!!) - setMediaSource(subtitle, videoUri, audioUrl) - playerBinding.qualityText.text = videosNameArray[index] - return@lit - } else if (response.hls != null) { - val mediaItem: MediaItem = MediaItem.Builder() - .setUri(response.hls) - .setSubtitleConfigurations(subtitle) - .build() - exoPlayer.setMediaItem(mediaItem) - } else { - Toast.makeText( - context, - getString(R.string.unknown_error), - Toast.LENGTH_LONG - ).show() - } - } - } - } - // if defres doesn't match use hls if available - response.hls != null -> { - val mediaItem: MediaItem = MediaItem.Builder() - .setUri(response.hls) - .setSubtitleConfigurations(subtitle) - .build() - exoPlayer.setMediaItem(mediaItem) - } - // otherwise use the first list entry - else -> { - val videoUri = videosUrlArray[0] - val audioUrl = getMostBitRate(response.audioStreams!!) - setMediaSource(subtitle, videoUri, audioUrl) - playerBinding.qualityText.text = videosNameArray[0] - } - } + // set media source and resolution in the beginning + setStreamSource( + response, + videosNameArray, + videosUrlArray + ) playerBinding.qualityText.setOnClickListener { // Dialog for quality selection @@ -1217,7 +1178,7 @@ class PlayerFragment : Fragment() { } else { val videoUri = videosUrlArray[which] val audioUrl = getMostBitRate(response.audioStreams!!) - setMediaSource(subtitle, videoUri, audioUrl) + setMediaSource(videoUri, audioUrl) } exoPlayer.seekTo(lastPosition) playerBinding.qualityText.text = videosNameArray[which] @@ -1227,6 +1188,50 @@ class PlayerFragment : Fragment() { } } + private fun setStreamSource( + streams: Streams, + videosNameArray: Array, + videosUrlArray: Array + ) { + val defRes = PreferenceHelper.getString( + requireContext(), + "default_resolution", + "hls" + )!! + + if (defRes != "hls") { + videosNameArray.forEachIndexed { index, pipedStream -> + // search for quality preference in the available stream sources + if (pipedStream.contains(defRes)) { + val videoUri = videosUrlArray[index] + val audioUrl = getMostBitRate(streams.audioStreams!!) + setMediaSource(videoUri, audioUrl) + playerBinding.qualityText.text = videosNameArray[index] + return + } + } + } + + // if default resolution isn't set or available, use hls if available + if (streams.hls != null) { + val mediaItem: MediaItem = MediaItem.Builder() + .setUri(streams.hls) + .setSubtitleConfigurations(subtitle) + .build() + exoPlayer.setMediaItem(mediaItem) + playerBinding.qualityText.text = context?.getString(R.string.hls) + return + } + + // if nothing found, use the first list entry + if (videosUrlArray.isNotEmpty()) { + val videoUri = videosUrlArray[0] + val audioUrl = getMostBitRate(streams.audioStreams!!) + setMediaSource(videoUri, audioUrl) + playerBinding.qualityText.text = videosNameArray[0] + } + } + private fun createExoPlayer(view: View) { val bufferingGoal = PreferenceHelper.getString(requireContext(), "buffering_goal", "50")?.toInt()!! * 1000 @@ -1298,7 +1303,8 @@ class PlayerFragment : Fragment() { playerBinding.exoPlayPause.visibility = visibility playerBinding.exoBottomBar.visibility = visibility playerBinding.closeImageButton.visibility = visibility - playerBinding.exoTitle.visibility = visibility + playerBinding.exoTitle.visibility = + if (isLocked && Globals.isFullScreen) View.VISIBLE else View.INVISIBLE // disable double tap to seek when the player is locked if (isLocked) enableDoubleTapToSeek() else disableDoubleTapToSeek() diff --git a/app/src/main/java/com/github/libretube/preferences/AppearanceSettings.kt b/app/src/main/java/com/github/libretube/preferences/AppearanceSettings.kt index dfe9003dc..5a6dcc5e9 100644 --- a/app/src/main/java/com/github/libretube/preferences/AppearanceSettings.kt +++ b/app/src/main/java/com/github/libretube/preferences/AppearanceSettings.kt @@ -3,7 +3,7 @@ package com.github.libretube.preferences import android.os.Bundle import androidx.preference.ListPreference import androidx.preference.PreferenceFragmentCompat -import androidx.preference.SwitchPreference +import androidx.preference.SwitchPreferenceCompat import com.github.libretube.R import com.github.libretube.activities.SettingsActivity import com.github.libretube.dialogs.RequireRestartDialog @@ -25,6 +25,13 @@ class AppearanceSettings : PreferenceFragmentCompat() { true } + val pureTheme = findPreference("pure_theme") + pureTheme?.setOnPreferenceChangeListener { _, _ -> + val restartDialog = RequireRestartDialog() + restartDialog.show(childFragmentManager, "RequireRestartDialog") + true + } + val accentColor = findPreference("accent_color") updateAccentColorValues(accentColor!!) accentColor.setOnPreferenceChangeListener { _, _ -> @@ -46,7 +53,7 @@ class AppearanceSettings : PreferenceFragmentCompat() { true } - val hideTrending = findPreference("hide_trending_page") + val hideTrending = findPreference("hide_trending_page") hideTrending?.setOnPreferenceChangeListener { _, _ -> val restartDialog = RequireRestartDialog() restartDialog.show(childFragmentManager, "RequireRestartDialog") diff --git a/app/src/main/java/com/github/libretube/preferences/InstanceSettings.kt b/app/src/main/java/com/github/libretube/preferences/InstanceSettings.kt index 169cf7358..084d661af 100644 --- a/app/src/main/java/com/github/libretube/preferences/InstanceSettings.kt +++ b/app/src/main/java/com/github/libretube/preferences/InstanceSettings.kt @@ -18,7 +18,7 @@ import androidx.lifecycle.lifecycleScope import androidx.preference.ListPreference import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat -import androidx.preference.SwitchPreference +import androidx.preference.SwitchPreferenceCompat import com.github.libretube.R import com.github.libretube.activities.SettingsActivity import com.github.libretube.dialogs.CustomInstanceDialog @@ -146,7 +146,7 @@ class InstanceSettings : PreferenceFragmentCompat() { true } - val authInstanceToggle = findPreference("auth_instance_toggle") + val authInstanceToggle = findPreference("auth_instance_toggle") authInstanceToggle?.setOnPreferenceChangeListener { _, newValue -> authInstance.isVisible = newValue == true logout() diff --git a/app/src/main/java/com/github/libretube/util/ThemeHelper.kt b/app/src/main/java/com/github/libretube/util/ThemeHelper.kt index 8fa3bbb68..f246704c4 100644 --- a/app/src/main/java/com/github/libretube/util/ThemeHelper.kt +++ b/app/src/main/java/com/github/libretube/util/ThemeHelper.kt @@ -18,15 +18,15 @@ object ThemeHelper { fun updateTheme(activity: AppCompatActivity) { val themeMode = PreferenceHelper.getString(activity, "theme_toggle", "A")!! - val blackModeEnabled = themeMode == "O" + val pureThemeEnabled = PreferenceHelper.getBoolean(activity, "pure_theme", false) - updateAccentColor(activity, blackModeEnabled) + updateAccentColor(activity, pureThemeEnabled) updateThemeMode(themeMode) } private fun updateAccentColor( activity: AppCompatActivity, - blackThemeEnabled: Boolean + pureThemeEnabled: Boolean ) { val theme = when ( PreferenceHelper.getString( @@ -37,15 +37,16 @@ object ThemeHelper { ) { "my" -> { applyDynamicColors(activity) - if (blackThemeEnabled) R.style.MaterialYou_Black + if (pureThemeEnabled) R.style.MaterialYou_Pure else R.style.MaterialYou } - "red" -> if (blackThemeEnabled) R.style.Theme_Red_Black else R.style.Theme_Red - "blue" -> if (blackThemeEnabled) R.style.Theme_Blue_Black else R.style.Theme_Blue - "yellow" -> if (blackThemeEnabled) R.style.Theme_Yellow_Black else R.style.Theme_Yellow - "green" -> if (blackThemeEnabled) R.style.Theme_Green_Black else R.style.Theme_Green - "purple" -> if (blackThemeEnabled) R.style.Theme_Purple_Black else R.style.Theme_Purple - else -> if (blackThemeEnabled) R.style.Theme_Purple_Black else R.style.Theme_Purple + // set the theme, use the pure theme if enabled + "red" -> if (pureThemeEnabled) R.style.Theme_Red_Pure else R.style.Theme_Red + "blue" -> if (pureThemeEnabled) R.style.Theme_Blue_Pure else R.style.Theme_Blue + "yellow" -> if (pureThemeEnabled) R.style.Theme_Yellow_Pure else R.style.Theme_Yellow + "green" -> if (pureThemeEnabled) R.style.Theme_Green_Pure else R.style.Theme_Green + "purple" -> if (pureThemeEnabled) R.style.Theme_Purple_Pure else R.style.Theme_Purple + else -> if (pureThemeEnabled) R.style.Theme_Purple_Pure else R.style.Theme_Purple } activity.setTheme(theme) } @@ -62,7 +63,6 @@ object ThemeHelper { "A" -> AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM "L" -> AppCompatDelegate.MODE_NIGHT_NO "D" -> AppCompatDelegate.MODE_NIGHT_YES - "O" -> AppCompatDelegate.MODE_NIGHT_YES else -> AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM } AppCompatDelegate.setDefaultNightMode(mode) diff --git a/app/src/main/res/drawable/ic_invert_colors.xml b/app/src/main/res/drawable/ic_invert_colors.xml new file mode 100644 index 000000000..ece905850 --- /dev/null +++ b/app/src/main/res/drawable/ic_invert_colors.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_rotating_circle.xml b/app/src/main/res/drawable/ic_rotating_circle.xml index 7339373fe..63ad1c16a 100644 --- a/app/src/main/res/drawable/ic_rotating_circle.xml +++ b/app/src/main/res/drawable/ic_rotating_circle.xml @@ -1,4 +1,10 @@ - - + + diff --git a/app/src/main/res/layout/exo_styled_player_control_view.xml b/app/src/main/res/layout/exo_styled_player_control_view.xml index 6d56caafe..8df359629 100644 --- a/app/src/main/res/layout/exo_styled_player_control_view.xml +++ b/app/src/main/res/layout/exo_styled_player_control_view.xml @@ -20,28 +20,21 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" - android:layoutDirection="ltr" - android:paddingStart="@dimen/exo_styled_bottom_bar_time_padding" - android:paddingLeft="@dimen/exo_styled_bottom_bar_time_padding" - android:paddingEnd="@dimen/exo_styled_bottom_bar_time_padding" - android:paddingRight="@dimen/exo_styled_bottom_bar_time_padding"> + android:layout_marginStart="5dp" + android:layoutDirection="ltr"> - - @@ -64,42 +57,26 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" - android:layoutDirection="ltr" - android:paddingStart="@dimen/exo_styled_bottom_bar_time_padding" - android:paddingLeft="@dimen/exo_styled_bottom_bar_time_padding" - android:paddingEnd="@dimen/exo_styled_bottom_bar_time_padding" - android:paddingRight="@dimen/exo_styled_bottom_bar_time_padding"> + android:layout_marginEnd="10dp" + android:layoutDirection="ltr"> - + style="@style/PlayerControlTop" + android:text="1x" /> + style="@style/PlayerControlTop" + android:text="@string/hls" /> @@ -116,7 +93,6 @@ @@ -175,17 +152,17 @@ + style="@style/PlayerControlBottom" /> diff --git a/app/src/main/res/layout/fragment_player.xml b/app/src/main/res/layout/fragment_player.xml index 4ee4a9401..6584543e2 100644 --- a/app/src/main/res/layout/fragment_player.xml +++ b/app/src/main/res/layout/fragment_player.xml @@ -363,7 +363,7 @@ android:layout_height="0dp" android:background="?attr/colorSurface" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHeight_percent="0.3" + app:layout_constraintHeight_percent="0.275" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml index 2efaffbdd..90b219957 100644 --- a/app/src/main/res/values-night/themes.xml +++ b/app/src/main/res/values-night/themes.xml @@ -8,7 +8,7 @@ - - - - - - - + + + \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 1fe185fca..39c561d75 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -8,6 +8,13 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/advanced_settings.xml b/app/src/main/res/xml/advanced_settings.xml index 596003be4..41298efff 100644 --- a/app/src/main/res/xml/advanced_settings.xml +++ b/app/src/main/res/xml/advanced_settings.xml @@ -33,7 +33,7 @@ - - - + + - - -