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 5678469bc..67a322d42 100644 --- a/app/src/main/java/com/github/libretube/MainActivity.kt +++ b/app/src/main/java/com/github/libretube/MainActivity.kt @@ -263,14 +263,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) { @@ -324,6 +322,13 @@ class MainActivity : AppCompatActivity() { } } + override fun onUserLeaveHint() { + super.onUserLeaveHint() + supportFragmentManager.fragments.forEach { fragment -> + (fragment as? PlayerFragment)?.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..459a9809c 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 @@ -37,11 +36,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 @@ -51,6 +52,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 @@ -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)) @@ -332,8 +338,10 @@ 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 + exoPlayer.setAudioAttributes(audioAttributes,true); exoPlayerView.player = exoPlayer val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext()) @@ -434,6 +442,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, @@ -483,6 +492,7 @@ class PlayerFragment : Fragment() { MergingMediaSource(videoSource, audioSource) exoPlayer.setMediaSource(mergeSource) } + exoPlayer.seekTo(lastPosition); view.findViewById(R.id.quality_text).text = videosNameArray[which] } @@ -804,4 +814,39 @@ 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 + 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) + 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() { + 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() + }; + } } 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); 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 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"