From 959b39800d36d0804ad75100cd68a44021b07328 Mon Sep 17 00:00:00 2001 From: janisslsm <97699850+janisslsm@users.noreply.github.com> Date: Fri, 13 May 2022 07:32:16 +0300 Subject: [PATCH 01/11] Enable video repeat (loop) button --- app/src/main/java/com/github/libretube/PlayerFragment.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/com/github/libretube/PlayerFragment.kt b/app/src/main/java/com/github/libretube/PlayerFragment.kt index fa6c60caf..4c7db20e6 100644 --- a/app/src/main/java/com/github/libretube/PlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/PlayerFragment.kt @@ -51,6 +51,7 @@ 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.util.RepeatModeUtil import com.google.android.material.button.MaterialButton import com.squareup.picasso.Picasso import org.chromium.net.CronetEngine @@ -332,6 +333,7 @@ class PlayerFragment : Fragment() { exoPlayerView.setShowSubtitleButton(true) exoPlayerView.setShowNextButton(false) exoPlayerView.setShowPreviousButton(false) + exoPlayerView.setRepeatToggleModes(RepeatModeUtil.REPEAT_TOGGLE_MODE_ALL); // exoPlayerView.controllerShowTimeoutMs = 1500 exoPlayerView.controllerHideOnTouch = true exoPlayerView.player = exoPlayer From 84b3786f17fe915db00aeadd4c45bde7839e332b Mon Sep 17 00:00:00 2001 From: janisslsm <97699850+janisslsm@users.noreply.github.com> Date: Fri, 13 May 2022 16:14:34 +0300 Subject: [PATCH 02/11] Seek back to last position --- app/src/main/java/com/github/libretube/PlayerFragment.kt | 4 ++++ app/src/main/java/com/github/libretube/myApp.kt | 4 ---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/github/libretube/PlayerFragment.kt b/app/src/main/java/com/github/libretube/PlayerFragment.kt index fa6c60caf..7b7483e83 100644 --- a/app/src/main/java/com/github/libretube/PlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/PlayerFragment.kt @@ -434,6 +434,7 @@ class PlayerFragment : Fragment() { val builder: AlertDialog.Builder? = activity?.let { AlertDialog.Builder(it) } + var lastPosition = exoPlayer.currentPosition builder!!.setTitle(R.string.choose_quality_dialog) .setItems( videosNameArray, @@ -455,6 +456,8 @@ class PlayerFragment : Fragment() { .setSubtitleConfigurations(subtitle) .build() exoPlayer.setMediaItem(mediaItem) + + } else { val dataSourceFactory: DataSource.Factory = DefaultHttpDataSource.Factory() @@ -483,6 +486,7 @@ class PlayerFragment : Fragment() { MergingMediaSource(videoSource, audioSource) exoPlayer.setMediaSource(mergeSource) } + exoPlayer.seekTo(lastPosition); view.findViewById(R.id.quality_text).text = videosNameArray[which] } diff --git a/app/src/main/java/com/github/libretube/myApp.kt b/app/src/main/java/com/github/libretube/myApp.kt index 1f0d7611d..a5c83da92 100644 --- a/app/src/main/java/com/github/libretube/myApp.kt +++ b/app/src/main/java/com/github/libretube/myApp.kt @@ -4,8 +4,4 @@ import android.app.Application class myApp : Application() { - companion object { - @JvmField - var seekTo : Long? = 0 - } } \ No newline at end of file From d723107d02ee373c85e6bb89ab931ef752c38c04 Mon Sep 17 00:00:00 2001 From: janisslsm <97699850+janisslsm@users.noreply.github.com> Date: Fri, 13 May 2022 16:15:52 +0300 Subject: [PATCH 03/11] Get rid of spaces I left --- app/src/main/java/com/github/libretube/PlayerFragment.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/java/com/github/libretube/PlayerFragment.kt b/app/src/main/java/com/github/libretube/PlayerFragment.kt index 7b7483e83..4bb8c8476 100644 --- a/app/src/main/java/com/github/libretube/PlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/PlayerFragment.kt @@ -456,8 +456,6 @@ class PlayerFragment : Fragment() { .setSubtitleConfigurations(subtitle) .build() exoPlayer.setMediaItem(mediaItem) - - } else { val dataSourceFactory: DataSource.Factory = DefaultHttpDataSource.Factory() From e2ebee2b3e41db1daf8ee35c09c458ddaa982745 Mon Sep 17 00:00:00 2001 From: janisslsm <97699850+janisslsm@users.noreply.github.com> Date: Fri, 13 May 2022 16:55:31 +0300 Subject: [PATCH 04/11] Added Audio Focus to Exo Player --- app/src/main/java/com/github/libretube/PlayerFragment.kt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/src/main/java/com/github/libretube/PlayerFragment.kt b/app/src/main/java/com/github/libretube/PlayerFragment.kt index 4bb8c8476..d299b4107 100644 --- a/app/src/main/java/com/github/libretube/PlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/PlayerFragment.kt @@ -37,11 +37,13 @@ import com.github.libretube.adapters.CommentsAdapter import com.github.libretube.adapters.TrendingAdapter import com.github.libretube.obj.PipedStream import com.github.libretube.obj.Subscribe +import com.google.android.exoplayer2.C 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.Player +import com.google.android.exoplayer2.audio.AudioAttributes import com.google.android.exoplayer2.ext.cronet.CronetDataSource import com.google.android.exoplayer2.source.DefaultMediaSourceFactory import com.google.android.exoplayer2.source.MediaSource @@ -323,6 +325,10 @@ class PlayerFragment : Fragment() { cronetDataSourceFactory ) + val audioAttributes = AudioAttributes.Builder() + .setUsage(C.USAGE_MEDIA) + .setContentType(C.CONTENT_TYPE_MOVIE) + .build() exoPlayer = ExoPlayer.Builder(view.context) .setMediaSourceFactory(DefaultMediaSourceFactory(dataSourceFactory)) @@ -334,6 +340,7 @@ class PlayerFragment : Fragment() { exoPlayerView.setShowPreviousButton(false) // exoPlayerView.controllerShowTimeoutMs = 1500 exoPlayerView.controllerHideOnTouch = true + exoPlayer.setAudioAttributes(audioAttributes,true); exoPlayerView.player = exoPlayer val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext()) From 665721fbdec8566bc844392b1656352aee89d111 Mon Sep 17 00:00:00 2001 From: janisslsm <97699850+janisslsm@users.noreply.github.com> Date: Fri, 13 May 2022 19:55:15 +0300 Subject: [PATCH 05/11] Fix animation --- app/src/main/java/com/github/libretube/SettingsActivity.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/github/libretube/SettingsActivity.kt b/app/src/main/java/com/github/libretube/SettingsActivity.kt index 0fb13644e..2ee7f5645 100644 --- a/app/src/main/java/com/github/libretube/SettingsActivity.kt +++ b/app/src/main/java/com/github/libretube/SettingsActivity.kt @@ -38,7 +38,9 @@ class SettingsActivity : AppCompatActivity(), override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - overridePendingTransition(50, 50); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + overridePendingTransition(50, 50); + } val view = this.findViewById(android.R.id.content) view.setAlpha(0F); view.animate().alpha(1F).setDuration(300); From 46e39026e8b0d8aa3cf1ee90b46fb2aafadf2394 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Fri, 13 May 2022 23:04:18 +0200 Subject: [PATCH 06/11] Fixed hardcoded search string and added margin Bottom --- app/src/main/res/layout/fragment_search.xml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout/fragment_search.xml b/app/src/main/res/layout/fragment_search.xml index e85581ed3..9a2b0e083 100644 --- a/app/src/main/res/layout/fragment_search.xml +++ b/app/src/main/res/layout/fragment_search.xml @@ -31,7 +31,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/transparent" - android:hint="Search" + android:hint="@string/search_hint" android:imeOptions="actionSearch" android:inputType="text" android:maxLines="1" @@ -304,7 +304,10 @@ android:id="@+id/search_recycler" android:layout_width="0dp" android:layout_height="0dp" - android:layout_margin="10dp" + android:layout_marginLeft="10dp" + android:layout_marginRight="10dp" + android:layout_marginBottom="10dp" + android:layout_marginTop="20dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" From 1d527d67eee720943689a154fc7fc74556d666a3 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Fri, 13 May 2022 23:13:50 +0200 Subject: [PATCH 07/11] Fixed Settings Loop on Back Pressed --- app/src/main/java/com/github/libretube/MainActivity.kt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/github/libretube/MainActivity.kt b/app/src/main/java/com/github/libretube/MainActivity.kt index 7cd322ee4..1323f220f 100644 --- a/app/src/main/java/com/github/libretube/MainActivity.kt +++ b/app/src/main/java/com/github/libretube/MainActivity.kt @@ -256,14 +256,12 @@ class MainActivity : AppCompatActivity() { }else{ navController.popBackStack() if (navController.currentBackStackEntry == null){ - super.onBackPressed() + moveTaskToBack(true) } } }catch (e: Exception){ navController.popBackStack() - if (navController.currentBackStackEntry == null){ - super.onBackPressed() - } + moveTaskToBack(true) } } override fun onConfigurationChanged(newConfig: Configuration) { From 0df217c14c97d378cd6853d2d2861baa5faef960 Mon Sep 17 00:00:00 2001 From: janisslsm <97699850+janisslsm@users.noreply.github.com> Date: Sat, 14 May 2022 13:38:28 +0300 Subject: [PATCH 08/11] PIP Support Adds support for PIP (Picture-in-picture). Currently only android Oreo and above. --- app/src/main/AndroidManifest.xml | 3 +- .../java/com/github/libretube/MainActivity.kt | 11 +++++++ .../com/github/libretube/PlayerFragment.kt | 30 +++++++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9bb2e0154..13a0ec59f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -33,7 +33,8 @@ diff --git a/app/src/main/java/com/github/libretube/MainActivity.kt b/app/src/main/java/com/github/libretube/MainActivity.kt index 7cd322ee4..03187e31a 100644 --- a/app/src/main/java/com/github/libretube/MainActivity.kt +++ b/app/src/main/java/com/github/libretube/MainActivity.kt @@ -317,6 +317,17 @@ class MainActivity : AppCompatActivity() { } } + override fun onUserLeaveHint() { + super.onUserLeaveHint() + for(fragment in supportFragmentManager.fragments) + { + if(fragment is PlayerFragment) + { + fragment.onUserLeaveHint(); + } + } + } + } fun Fragment.hideKeyboard() { view?.let { activity?.hideKeyboard(it) } diff --git a/app/src/main/java/com/github/libretube/PlayerFragment.kt b/app/src/main/java/com/github/libretube/PlayerFragment.kt index fa6c60caf..0df90f543 100644 --- a/app/src/main/java/com/github/libretube/PlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/PlayerFragment.kt @@ -85,6 +85,7 @@ class PlayerFragment : Fragment() { private lateinit var motionLayout: MotionLayout private lateinit var exoPlayer: ExoPlayer private lateinit var mediaSource: MediaSource + private lateinit var currentView: View private lateinit var relDownloadVideo: LinearLayout @@ -107,6 +108,7 @@ class PlayerFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) hideKeyboard() + currentView = view val playerDescription = view.findViewById(R.id.player_description) videoId = videoId!!.replace("/watch?v=", "") @@ -804,4 +806,32 @@ class PlayerFragment : Fragment() { } } } + + override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean) { + super.onPictureInPictureModeChanged(isInPictureInPictureMode) + if (isInPictureInPictureMode) { + exoPlayerView.hideController() + with(motionLayout) { + getConstraintSet(R.id.start).constrainHeight(R.id.player, -1) + enableTransition(R.id.yt_transition, false) + } + view?.findViewById(R.id.main_container)?.isClickable = true + view?.findViewById(R.id.linLayout)?.visibility = View.GONE + view?.findViewById(R.id.top_bar)?.visibility = View.GONE + } else { + with(motionLayout) { + getConstraintSet(R.id.start).constrainHeight(R.id.player, 0) + enableTransition(R.id.yt_transition, true) + } + view?.findViewById(R.id.main_container)?.isClickable = false + view?.findViewById(R.id.linLayout)?.visibility = View.VISIBLE + view?.findViewById(R.id.top_bar)?.visibility = View.VISIBLE + } + } + + fun onUserLeaveHint() { + if (SDK_INT >= Build.VERSION_CODES.N && exoPlayer.isPlaying) { + requireActivity().enterPictureInPictureMode() + }; + } } From b34e09c628291c75224cd1292748786c5753f070 Mon Sep 17 00:00:00 2001 From: janisslsm <97699850+janisslsm@users.noreply.github.com> Date: Sat, 14 May 2022 13:39:16 +0300 Subject: [PATCH 09/11] Get rid of currentView since I stopped using it --- app/src/main/java/com/github/libretube/PlayerFragment.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/java/com/github/libretube/PlayerFragment.kt b/app/src/main/java/com/github/libretube/PlayerFragment.kt index 0df90f543..4462b8e7f 100644 --- a/app/src/main/java/com/github/libretube/PlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/PlayerFragment.kt @@ -85,7 +85,6 @@ class PlayerFragment : Fragment() { private lateinit var motionLayout: MotionLayout private lateinit var exoPlayer: ExoPlayer private lateinit var mediaSource: MediaSource - private lateinit var currentView: View private lateinit var relDownloadVideo: LinearLayout @@ -108,7 +107,6 @@ class PlayerFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) hideKeyboard() - currentView = view val playerDescription = view.findViewById(R.id.player_description) videoId = videoId!!.replace("/watch?v=", "") From f261ca8b45a25048dd91836fed5a7b81172e88ec Mon Sep 17 00:00:00 2001 From: janisslsm <97699850+janisslsm@users.noreply.github.com> Date: Sat, 14 May 2022 14:31:33 +0300 Subject: [PATCH 10/11] Prevent PIP from opening in mini player --- .../main/java/com/github/libretube/MainActivity.kt | 8 ++------ .../main/java/com/github/libretube/PlayerFragment.kt | 11 ++++++++--- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/github/libretube/MainActivity.kt b/app/src/main/java/com/github/libretube/MainActivity.kt index 03187e31a..455b411c6 100644 --- a/app/src/main/java/com/github/libretube/MainActivity.kt +++ b/app/src/main/java/com/github/libretube/MainActivity.kt @@ -319,12 +319,8 @@ class MainActivity : AppCompatActivity() { override fun onUserLeaveHint() { super.onUserLeaveHint() - for(fragment in supportFragmentManager.fragments) - { - if(fragment is PlayerFragment) - { - fragment.onUserLeaveHint(); - } + supportFragmentManager.fragments.forEach { fragment -> + (fragment as? PlayerFragment)?.onUserLeaveHint() } } diff --git a/app/src/main/java/com/github/libretube/PlayerFragment.kt b/app/src/main/java/com/github/libretube/PlayerFragment.kt index 4462b8e7f..794932dc7 100644 --- a/app/src/main/java/com/github/libretube/PlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/PlayerFragment.kt @@ -2,12 +2,12 @@ package com.github.libretube import android.Manifest import android.annotation.SuppressLint -import android.app.Activity import android.content.Context import android.content.DialogInterface import android.content.Intent import android.content.pm.ActivityInfo import android.content.pm.PackageManager +import android.graphics.Rect import android.net.Uri import android.os.Build import android.os.Build.VERSION.SDK_INT @@ -15,7 +15,6 @@ import android.os.Bundle import android.os.Environment import android.text.Html import android.util.Log -import android.util.TypedValue import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -816,6 +815,8 @@ class PlayerFragment : Fragment() { view?.findViewById(R.id.main_container)?.isClickable = true view?.findViewById(R.id.linLayout)?.visibility = View.GONE view?.findViewById(R.id.top_bar)?.visibility = View.GONE + val mainActivity = activity as MainActivity + mainActivity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT } else { with(motionLayout) { getConstraintSet(R.id.start).constrainHeight(R.id.player, 0) @@ -828,7 +829,11 @@ class PlayerFragment : Fragment() { } fun onUserLeaveHint() { - if (SDK_INT >= Build.VERSION_CODES.N && exoPlayer.isPlaying) { + val bounds = Rect() + val scrollView = view?.findViewById(R.id.player_scrollView) + scrollView?.getHitRect(bounds) + + if (SDK_INT >= Build.VERSION_CODES.N && exoPlayer.isPlaying && (scrollView?.getLocalVisibleRect(bounds) == true || isFullScreen)) { requireActivity().enterPictureInPictureMode() }; } From f4e6bcc947975733735b7fbbbc573e99c9609b11 Mon Sep 17 00:00:00 2001 From: janisslsm <97699850+janisslsm@users.noreply.github.com> Date: Sat, 14 May 2022 14:56:05 +0300 Subject: [PATCH 11/11] Forgot to set isFullScreen to false upon disabling fullscreen --- app/src/main/java/com/github/libretube/PlayerFragment.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/com/github/libretube/PlayerFragment.kt b/app/src/main/java/com/github/libretube/PlayerFragment.kt index 794932dc7..f4af043fd 100644 --- a/app/src/main/java/com/github/libretube/PlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/PlayerFragment.kt @@ -817,6 +817,7 @@ class PlayerFragment : Fragment() { view?.findViewById(R.id.top_bar)?.visibility = View.GONE val mainActivity = activity as MainActivity mainActivity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT + isFullScreen = false; } else { with(motionLayout) { getConstraintSet(R.id.start).constrainHeight(R.id.player, 0)