diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1a62b38..ab96abf 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -21,16 +21,19 @@ - + + \ No newline at end of file diff --git a/app/src/main/java/org/mosad/teapod/player/PlayerActivity.kt b/app/src/main/java/org/mosad/teapod/player/PlayerActivity.kt index d5b76e9..5c328d2 100644 --- a/app/src/main/java/org/mosad/teapod/player/PlayerActivity.kt +++ b/app/src/main/java/org/mosad/teapod/player/PlayerActivity.kt @@ -3,11 +3,16 @@ package org.mosad.teapod.player import android.animation.Animator import android.animation.AnimatorListenerAdapter import android.annotation.SuppressLint +import android.app.PictureInPictureParams +import android.content.pm.PackageManager +import android.content.res.Configuration import android.os.Build import android.os.Bundle import android.util.Log +import android.util.Rational import android.view.* import androidx.activity.viewModels +import androidx.annotation.RequiresApi import androidx.appcompat.app.AppCompatActivity import androidx.core.view.GestureDetectorCompat import androidx.core.view.isVisible @@ -73,6 +78,11 @@ class PlayerActivity : AppCompatActivity() { initActions() } + /** + * once minimum is android 7.0 this can be simplified + * only onStart and onStop should be needed then + * see: https://developer.android.com/guide/topics/ui/picture-in-picture#continuing_playback + */ override fun onStart() { super.onStart() if (Util.SDK_INT > 23) { @@ -83,6 +93,8 @@ class PlayerActivity : AppCompatActivity() { override fun onResume() { super.onResume() + if (isInPiPMode()) { return } + if (Util.SDK_INT <= 23) { initPlayer() video_view?.onResume() @@ -91,6 +103,8 @@ class PlayerActivity : AppCompatActivity() { override fun onPause() { super.onPause() + if (isInPiPMode()) { return } + if (Util.SDK_INT <= 23) { video_view?.onPause() releasePlayer() @@ -112,6 +126,38 @@ class PlayerActivity : AppCompatActivity() { super.onSaveInstanceState(outState) } + /** + * previous to android n, don't override + */ + @RequiresApi(Build.VERSION_CODES.N) + override fun onUserLeaveHint() { + super.onUserLeaveHint() + + // start pip mode, if supported + if (packageManager.hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE)) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { + @Suppress("deprecation") + enterPictureInPictureMode() + } else { + val width = model.player.videoFormat?.width ?: 0 + val height = model.player.videoFormat?.height ?: 0 + val params = PictureInPictureParams.Builder() + .setAspectRatio(Rational(width, height)) + .build() + enterPictureInPictureMode(params) + } + } + } + + override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean, newConfig: Configuration?) { + super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig) + + // Hide the full-screen UI (controls, etc.) while in picture-in-picture mode. + if (isInPictureInPictureMode) { + controller.hideImmediately() + } + } + private fun initPlayer() { if (model.media.id < 0) { Log.e(javaClass.name, "No media was set.") @@ -178,7 +224,9 @@ class PlayerActivity : AppCompatActivity() { } private fun initActions() { - exo_close_player.setOnClickListener { this.finish() } + exo_close_player.setOnClickListener { + this.finish() + } rwd_10.setOnButtonClickListener { rewind() } ffwd_10.setOnButtonClickListener { fastForward() } button_next_ep.setOnClickListener { playNextEpisode() } @@ -213,8 +261,8 @@ class PlayerActivity : AppCompatActivity() { } if (remainingTime in 1..20000) { - // if the next ep button is not visible, make it visible - if (!btnNextEpIsVisible && model.nextEpisode != null && Preferences.autoplay) { + // if the next ep button is not visible, make it visible. Don't show in pip mode + if (!btnNextEpIsVisible && model.nextEpisode != null && Preferences.autoplay && !isInPiPMode()) { withContext(Dispatchers.Main) { showButtonNextEp() } } } else if (btnNextEpIsVisible) { @@ -229,7 +277,7 @@ class PlayerActivity : AppCompatActivity() { } } - private fun releasePlayer(){ + private fun releasePlayer() { playbackPosition = model.player.currentPosition currentWindow = model.player.currentWindowIndex playWhenReady = model.player.playWhenReady @@ -378,6 +426,14 @@ class PlayerActivity : AppCompatActivity() { pauseAndHideControls() } + private fun isInPiPMode(): Boolean { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + isInPictureInPictureMode + } else { + false // pip mode not supported + } + } + /** * pause playback and hide controls */ @@ -393,7 +449,10 @@ class PlayerActivity : AppCompatActivity() { * on single tap hide or show the controls */ override fun onSingleTapConfirmed(e: MotionEvent?): Boolean { - if (controller.isVisible) controller.hide() else controller.show() + if (!isInPiPMode()) { + if (controller.isVisible) controller.hide() else controller.show() + } + return true }