diff --git a/app/src/main/java/com/github/libretube/sheets/VideoOptionsBottomSheet.kt b/app/src/main/java/com/github/libretube/sheets/VideoOptionsBottomSheet.kt index a9a39b859..4fa406f94 100644 --- a/app/src/main/java/com/github/libretube/sheets/VideoOptionsBottomSheet.kt +++ b/app/src/main/java/com/github/libretube/sheets/VideoOptionsBottomSheet.kt @@ -78,7 +78,7 @@ class VideoOptionsBottomSheet( shareDialog.show(parentFragmentManager, ShareDialog::class.java.name) } context?.getString(R.string.play_next) -> { - PlayingQueue.playNext(videoId) + PlayingQueue.addAsNext(videoId) } context?.getString(R.string.add_to_queue) -> { PlayingQueue.add(videoId) diff --git a/app/src/main/java/com/github/libretube/ui/adapters/BottomSheetAdapter.kt b/app/src/main/java/com/github/libretube/ui/adapters/BottomSheetAdapter.kt index 35076697d..656ea1ac9 100644 --- a/app/src/main/java/com/github/libretube/ui/adapters/BottomSheetAdapter.kt +++ b/app/src/main/java/com/github/libretube/ui/adapters/BottomSheetAdapter.kt @@ -35,16 +35,6 @@ class BottomSheetAdapter( root.setOnClickListener { listener.invoke(position) } - - // increase padding if there's no drawable - if (item.drawable == null) { - root.setPadding( - root.paddingLeft * 2, - root.paddingTop, - root.paddingRight, - root.paddingBottom - ) - } } } diff --git a/app/src/main/java/com/github/libretube/ui/dialogs/DownloadDialog.kt b/app/src/main/java/com/github/libretube/ui/dialogs/DownloadDialog.kt index d590722e1..9a1236a2a 100644 --- a/app/src/main/java/com/github/libretube/ui/dialogs/DownloadDialog.kt +++ b/app/src/main/java/com/github/libretube/ui/dialogs/DownloadDialog.kt @@ -34,11 +34,9 @@ class DownloadDialog( binding.audioRadio.setOnClickListener { binding.videoSpinner.visibility = View.GONE - binding.audioSpinner.visibility = View.VISIBLE } binding.videoRadio.setOnClickListener { - binding.audioSpinner.visibility = View.GONE binding.videoSpinner.visibility = View.VISIBLE } diff --git a/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt b/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt index d25c8a525..b6011c043 100644 --- a/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt @@ -25,7 +25,6 @@ import android.view.View import android.view.ViewGroup import android.widget.Toast import androidx.constraintlayout.motion.widget.MotionLayout -import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.net.toUri import androidx.core.os.bundleOf import androidx.core.view.isVisible @@ -78,6 +77,7 @@ import com.google.android.exoplayer2.ExoPlayer import com.google.android.exoplayer2.MediaItem import com.google.android.exoplayer2.MediaItem.SubtitleConfiguration import com.google.android.exoplayer2.MediaItem.fromUri +import com.google.android.exoplayer2.PlaybackException import com.google.android.exoplayer2.Player import com.google.android.exoplayer2.audio.AudioAttributes import com.google.android.exoplayer2.ext.cronet.CronetDataSource @@ -91,7 +91,6 @@ import com.google.android.exoplayer2.ui.StyledPlayerView import com.google.android.exoplayer2.upstream.DataSource import com.google.android.exoplayer2.upstream.DefaultDataSource import com.google.android.exoplayer2.upstream.DefaultHttpDataSource -import com.google.android.exoplayer2.video.VideoSize import com.google.android.material.dialog.MaterialAlertDialogBuilder import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -971,22 +970,6 @@ class PlayerFragment : BaseFragment() { } } - override fun onVideoSizeChanged( - videoSize: VideoSize - ) { - // Set new width/height of view - // height or width must be cast to float as int/int will give 0 - - // Redraw the player container with the new layout height - val params = binding.player.layoutParams - params.height = videoSize.height / videoSize.width * params.width - binding.player.layoutParams = params - binding.player.requestLayout() - (binding.mainContainer.layoutParams as ConstraintLayout.LayoutParams).apply { - matchConstraintPercentHeight = (videoSize.height / videoSize.width).toFloat() - } - } - override fun onPlaybackStateChanged(playbackState: Int) { exoPlayerView.keepScreenOn = !( playbackState == Player.STATE_IDLE || @@ -1032,6 +1015,18 @@ class PlayerFragment : BaseFragment() { } super.onPlaybackStateChanged(playbackState) } + + /** + * Catch player errors to prevent the app from stopping + */ + override fun onPlayerError(error: PlaybackException) { + Toast.makeText( + context, + error.localizedMessage, + Toast.LENGTH_LONG + ).show() + super.onPlayerError(error) + } }) // check if livestream diff --git a/app/src/main/java/com/github/libretube/ui/views/MaterialPreferenceFragment.kt b/app/src/main/java/com/github/libretube/ui/views/MaterialPreferenceFragment.kt index 01abb2ea0..8964b4570 100644 --- a/app/src/main/java/com/github/libretube/ui/views/MaterialPreferenceFragment.kt +++ b/app/src/main/java/com/github/libretube/ui/views/MaterialPreferenceFragment.kt @@ -36,7 +36,10 @@ open class MaterialPreferenceFragment : PreferenceFragmentCompat() { preference.callChangeListener(newValue) // invoke the on change listeners - preference.callChangeListener(preference.value) + if (preference.callChangeListener(newValue)) { + preference.value = newValue + } + dialog.dismiss() } .setNegativeButton(R.string.cancel, null) .show() @@ -52,14 +55,13 @@ open class MaterialPreferenceFragment : PreferenceFragmentCompat() { MaterialAlertDialogBuilder(requireContext()) .setTitle(preference.title) .setView(binding.root) - .setPositiveButton(R.string.okay) { _, _ -> - // save the new value - preference.text = binding.input.text.toString() - - // invoke the on change listeners - preference.callChangeListener(preference.text) + .setPositiveButton(android.R.string.ok) { _, _ -> + val newValue = binding.input.text.toString() + if (preference.callChangeListener(newValue)) { + preference.text = newValue + } } - .setNegativeButton(R.string.cancel, null) + .setNegativeButton(android.R.string.cancel, null) .show() } /** diff --git a/app/src/main/java/com/github/libretube/util/AutoPlayHelper.kt b/app/src/main/java/com/github/libretube/util/AutoPlayHelper.kt index 497b4fb26..1e1f17e1f 100644 --- a/app/src/main/java/com/github/libretube/util/AutoPlayHelper.kt +++ b/app/src/main/java/com/github/libretube/util/AutoPlayHelper.kt @@ -40,7 +40,7 @@ class AutoPlayHelper( if (relatedStreams == null || relatedStreams.isEmpty()) return null var index = 0 var nextStreamId: String? = null - while (nextStreamId == null || PlayingQueue.containsBefore(nextStreamId)) { + while (nextStreamId == null || PlayingQueue.containsBeforeCurrent(nextStreamId)) { nextStreamId = relatedStreams[index].url!!.toID() if (index + 1 < relatedStreams.size) { index += 1 diff --git a/app/src/main/java/com/github/libretube/util/NavBarHelper.kt b/app/src/main/java/com/github/libretube/util/NavBarHelper.kt index 32f66fda1..f29aae643 100644 --- a/app/src/main/java/com/github/libretube/util/NavBarHelper.kt +++ b/app/src/main/java/com/github/libretube/util/NavBarHelper.kt @@ -58,7 +58,7 @@ object NavBarHelper { */ fun applyNavBarStyle(bottomNav: BottomNavigationView): Int { val labelVisibilityMode = when ( - PreferenceHelper.getString(PreferenceKeys.LABEL_VISIBILITY, "always") + PreferenceHelper.getString(PreferenceKeys.LABEL_VISIBILITY, "selected") ) { "always" -> NavigationBarView.LABEL_VISIBILITY_LABELED "selected" -> NavigationBarView.LABEL_VISIBILITY_SELECTED diff --git a/app/src/main/java/com/github/libretube/util/PlayingQueue.kt b/app/src/main/java/com/github/libretube/util/PlayingQueue.kt index 651ff963c..7063c1d7d 100644 --- a/app/src/main/java/com/github/libretube/util/PlayingQueue.kt +++ b/app/src/main/java/com/github/libretube/util/PlayingQueue.kt @@ -4,17 +4,13 @@ object PlayingQueue { private val queue = mutableListOf() private var currentVideoId: String? = null - fun clear() { - queue.clear() - } - fun add(videoId: String) { if (currentVideoId == videoId) return if (queue.contains(videoId)) queue.remove(videoId) queue.add(videoId) } - fun playNext(videoId: String) { + fun addAsNext(videoId: String) { if (currentVideoId == videoId) return if (queue.contains(videoId)) queue.remove(videoId) queue.add( @@ -24,11 +20,10 @@ object PlayingQueue { } fun getNext(): String? { - val currentIndex = queue.indexOf(currentVideoId) - return if (currentIndex >= queue.size) { + return try { + queue[currentIndex() + 1] + } catch (e: Exception) { null - } else { - queue[currentIndex + 1] } } @@ -41,18 +36,20 @@ object PlayingQueue { return queue.indexOf(currentVideoId) > 0 } - fun contains(videoId: String): Boolean { - return queue.contains(videoId) - } - - fun containsBefore(videoId: String): Boolean { - return queue.contains(videoId) && queue.indexOf(videoId) < queue.indexOf(currentVideoId) - } - fun updateCurrent(videoId: String) { currentVideoId = videoId queue.add(videoId) } fun isNotEmpty() = queue.isNotEmpty() + + fun clear() = queue.clear() + + fun currentIndex() = queue.indexOf(currentVideoId) + + fun contains(videoId: String) = queue.contains(videoId) + + fun containsBeforeCurrent(videoId: String): Boolean { + return queue.contains(videoId) && queue.indexOf(videoId) < currentIndex() + } } diff --git a/app/src/main/res/layout/bottom_sheet.xml b/app/src/main/res/layout/bottom_sheet.xml index 89de54a36..7c6ebba35 100644 --- a/app/src/main/res/layout/bottom_sheet.xml +++ b/app/src/main/res/layout/bottom_sheet.xml @@ -9,7 +9,7 @@ style="@style/Widget.Material3.BottomSheet" android:layout_width="match_parent" android:layout_height="match_parent" - android:paddingBottom="10dp" + android:paddingBottom="20dp" app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"> + android:paddingHorizontal="30dp" + android:paddingVertical="12dp"> diff --git a/app/src/main/res/layout/dialog_download.xml b/app/src/main/res/layout/dialog_download.xml index 471ef9f5d..0743059f1 100644 --- a/app/src/main/res/layout/dialog_download.xml +++ b/app/src/main/res/layout/dialog_download.xml @@ -2,7 +2,8 @@ + android:orientation="vertical" + android:paddingHorizontal="20dp"> @@ -30,7 +30,7 @@ android:id="@+id/audio_radio" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginStart="10dp" + android:layout_marginStart="20dp" android:text="@string/audio" /> @@ -39,19 +39,20 @@ android:id="@+id/video_spinner" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_margin="8dp" /> + android:layout_marginVertical="10dp" /> + android:layout_marginVertical="10dp" />