Merge branch 'shorts-improv' into 'master'

Fix background play, disable artwork on background till improved, renamed...

See merge request videostreaming/grayjay!140
This commit is contained in:
Kelvin 2025-08-14 11:26:47 +00:00
commit d32d817e0a
4 changed files with 27 additions and 23 deletions

View file

@ -437,7 +437,7 @@ class VideoDetailFragment() : MainFragment() {
fun onUserLeaveHint() { fun onUserLeaveHint() {
val viewDetail = _viewDetail; val viewDetail = _viewDetail;
Logger.i(TAG, "onUserLeaveHint preventPictureInPicture=${viewDetail?.preventPictureInPicture} isCasting=${StateCasting.instance.isCasting} isBackgroundPictureInPicture=${Settings.instance.playback.isBackgroundPictureInPicture()} allowBackground=${viewDetail?.allowBackground}"); Logger.i(TAG, "onUserLeaveHint preventPictureInPicture=${viewDetail?.preventPictureInPicture} isCasting=${StateCasting.instance.isCasting} isBackgroundPictureInPicture=${Settings.instance.playback.isBackgroundPictureInPicture()} allowBackground=${viewDetail?.isAudioOnlyUserAction}");
if (viewDetail === null) { if (viewDetail === null) {
return return
@ -446,7 +446,7 @@ class VideoDetailFragment() : MainFragment() {
if (viewDetail.shouldEnterPictureInPicture) { if (viewDetail.shouldEnterPictureInPicture) {
_leavingPiP = false _leavingPiP = false
} }
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.S && viewDetail.preventPictureInPicture == false && !StateCasting.instance.isCasting && Settings.instance.playback.isBackgroundPictureInPicture() && !viewDetail.allowBackground) { if(Build.VERSION.SDK_INT < Build.VERSION_CODES.S && viewDetail.preventPictureInPicture == false && !StateCasting.instance.isCasting && Settings.instance.playback.isBackgroundPictureInPicture() && !viewDetail.isAudioOnlyUserAction) {
val params = _viewDetail?.getPictureInPictureParams(); val params = _viewDetail?.getPictureInPictureParams();
if(params != null) { if(params != null) {
Logger.i(TAG, "enterPictureInPictureMode") Logger.i(TAG, "enterPictureInPictureMode")
@ -526,7 +526,7 @@ class VideoDetailFragment() : MainFragment() {
private fun stopIfRequired() { private fun stopIfRequired() {
var shouldStop = true; var shouldStop = true;
if (_viewDetail?.allowBackground == true) { if (_viewDetail?.isAudioOnlyUserAction == true) {
shouldStop = false; shouldStop = false;
} else if (Settings.instance.playback.isBackgroundPictureInPicture() && !_leavingPiP) { } else if (Settings.instance.playback.isBackgroundPictureInPicture() && !_leavingPiP) {
shouldStop = false; shouldStop = false;

View file

@ -10,7 +10,6 @@ import android.content.Intent
import android.content.res.Configuration import android.content.res.Configuration
import android.content.res.Resources import android.content.res.Resources
import android.graphics.Bitmap import android.graphics.Bitmap
import android.graphics.Rect
import android.graphics.drawable.Animatable import android.graphics.drawable.Animatable
import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.BitmapDrawable
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
@ -51,7 +50,6 @@ import com.futo.platformplayer.Settings
import com.futo.platformplayer.UIDialogs import com.futo.platformplayer.UIDialogs
import com.futo.platformplayer.UISlideOverlays import com.futo.platformplayer.UISlideOverlays
import com.futo.platformplayer.activities.MainActivity import com.futo.platformplayer.activities.MainActivity
import com.futo.platformplayer.activities.SyncShowPairingCodeActivity.Companion.activity
import com.futo.platformplayer.api.media.IPluginSourced import com.futo.platformplayer.api.media.IPluginSourced
import com.futo.platformplayer.api.media.LiveChatManager import com.futo.platformplayer.api.media.LiveChatManager
import com.futo.platformplayer.api.media.PlatformID import com.futo.platformplayer.api.media.PlatformID
@ -82,7 +80,6 @@ import com.futo.platformplayer.api.media.models.video.IPlatformVideoDetails
import com.futo.platformplayer.api.media.models.video.SerializedPlatformVideo import com.futo.platformplayer.api.media.models.video.SerializedPlatformVideo
import com.futo.platformplayer.api.media.platforms.js.JSClient import com.futo.platformplayer.api.media.platforms.js.JSClient
import com.futo.platformplayer.api.media.platforms.js.SourcePluginConfig import com.futo.platformplayer.api.media.platforms.js.SourcePluginConfig
import com.futo.platformplayer.api.media.platforms.js.models.JSVideo
import com.futo.platformplayer.api.media.platforms.js.models.JSVideoDetails import com.futo.platformplayer.api.media.platforms.js.models.JSVideoDetails
import com.futo.platformplayer.api.media.platforms.js.models.sources.JSSource import com.futo.platformplayer.api.media.platforms.js.models.sources.JSSource
import com.futo.platformplayer.api.media.structures.IPager import com.futo.platformplayer.api.media.structures.IPager
@ -326,7 +323,7 @@ class VideoDetailView : ConstraintLayout {
val onEnterPictureInPicture = Event0(); val onEnterPictureInPicture = Event0();
val onVideoChanged = Event2<Int, Int>() val onVideoChanged = Event2<Int, Int>()
var allowBackground: Boolean = false var isAudioOnlyUserAction: Boolean = false
private set(value) { private set(value) {
if (field != value) { if (field != value) {
field = value field = value
@ -338,7 +335,7 @@ class VideoDetailView : ConstraintLayout {
get() = !preventPictureInPicture && get() = !preventPictureInPicture &&
!StateCasting.instance.isCasting && !StateCasting.instance.isCasting &&
Settings.instance.playback.isBackgroundPictureInPicture() && Settings.instance.playback.isBackgroundPictureInPicture() &&
!allowBackground && !isAudioOnlyUserAction &&
isPlaying isPlaying
val onShouldEnterPictureInPictureChanged = Event0(); val onShouldEnterPictureInPictureChanged = Event0();
@ -764,7 +761,7 @@ class VideoDetailView : ConstraintLayout {
MediaControlReceiver.onBackgroundReceived.subscribe(this) { MediaControlReceiver.onBackgroundReceived.subscribe(this) {
Logger.i(TAG, "MediaControlReceiver.onBackgroundReceived") Logger.i(TAG, "MediaControlReceiver.onBackgroundReceived")
_player.switchToAudioMode(video); _player.switchToAudioMode(video);
allowBackground = true; isAudioOnlyUserAction = true;
StateApp.instance.contextOrNull?.let { StateApp.instance.contextOrNull?.let {
try { try {
if (it is MainActivity) { if (it is MainActivity) {
@ -1009,14 +1006,14 @@ class VideoDetailView : ConstraintLayout {
} }
_slideUpOverlay?.hide(); _slideUpOverlay?.hide();
} else null, } else null,
if (!isLimitedVersion) RoundButton(context, R.drawable.ic_screen_share, if (allowBackground) context.getString(R.string.background_revert) else context.getString(R.string.background), TAG_BACKGROUND) { if (!isLimitedVersion) RoundButton(context, R.drawable.ic_screen_share, if (isAudioOnlyUserAction) context.getString(R.string.background_revert) else context.getString(R.string.background), TAG_BACKGROUND) {
if (!allowBackground) { if (!isAudioOnlyUserAction) {
_player.switchToAudioMode(video); _player.switchToAudioMode(video);
allowBackground = true; isAudioOnlyUserAction = true;
it.text.text = resources.getString(R.string.background_revert); it.text.text = resources.getString(R.string.background_revert);
} else { } else {
_player.switchToVideoMode(); _player.switchToVideoMode();
allowBackground = false; isAudioOnlyUserAction = false;
it.text.text = resources.getString(R.string.background); it.text.text = resources.getString(R.string.background);
} }
_slideUpOverlay?.hide(); _slideUpOverlay?.hide();
@ -1156,11 +1153,14 @@ class VideoDetailView : ConstraintLayout {
if(_player.isAudioMode) { if(_player.isAudioMode) {
//Requested behavior to leave it in audio mode. leaving it commented if it causes issues, revert? //Requested behavior to leave it in audio mode. leaving it commented if it causes issues, revert?
if(!allowBackground) { if(!isAudioOnlyUserAction) {
_player.switchToVideoMode(); _player.switchToVideoMode();
allowBackground = false; isAudioOnlyUserAction = false;
_buttonPins.getButtonByTag(TAG_BACKGROUND)?.text?.text = resources.getString(R.string.background); _buttonPins.getButtonByTag(TAG_BACKGROUND)?.text?.text = resources.getString(R.string.background);
} }
else {
_buttonPins.getButtonByTag(TAG_BACKGROUND)?.text?.text = resources.getString(R.string.video);
}
} }
if(!_player.isFitMode && !_player.isFullScreen && !fragment.isInPictureInPicture) if(!_player.isFitMode && !_player.isFullScreen && !fragment.isInPictureInPicture)
_player.fitHeight(); _player.fitHeight();
@ -1176,7 +1176,7 @@ class VideoDetailView : ConstraintLayout {
if(StateCasting.instance.isCasting) if(StateCasting.instance.isCasting)
return; return;
if(allowBackground) if(isAudioOnlyUserAction)
StatePlayer.instance.startOrUpdateMediaSession(context, video); StatePlayer.instance.startOrUpdateMediaSession(context, video);
else { else {
when (Settings.instance.playback.backgroundPlay) { when (Settings.instance.playback.backgroundPlay) {
@ -1184,7 +1184,6 @@ class VideoDetailView : ConstraintLayout {
1 -> { 1 -> {
if(!(video?.isLive ?: false)) { if(!(video?.isLive ?: false)) {
_player.switchToAudioMode(video); _player.switchToAudioMode(video);
allowBackground = true;
} }
StatePlayer.instance.startOrUpdateMediaSession(context, video); StatePlayer.instance.startOrUpdateMediaSession(context, video);
} }
@ -1972,10 +1971,10 @@ class VideoDetailView : ConstraintLayout {
if (isLimitedVersion && _player.isAudioMode) { if (isLimitedVersion && _player.isAudioMode) {
_player.switchToVideoMode() _player.switchToVideoMode()
allowBackground = false; isAudioOnlyUserAction = false;
} else { } else {
val thumbnail = video.thumbnails.getHQThumbnail(); val thumbnail = video.thumbnails.getHQThumbnail();
if ((videoSource == null || _player.isAudioMode) && !thumbnail.isNullOrBlank()) if ((videoSource == null) && !thumbnail.isNullOrBlank()) // || _player.isAudioMode
Glide.with(context).asBitmap().load(thumbnail) Glide.with(context).asBitmap().load(thumbnail)
.into(object: CustomTarget<Bitmap>() { .into(object: CustomTarget<Bitmap>() {
override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) { override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {

View file

@ -475,6 +475,7 @@ class StatePlugins {
delay(500); delay(500);
val client = ManagedHttpClient(); val client = ManagedHttpClient();
client.setTimeout(10000);
try { try {
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
onProgress.invoke("Validating script", 0.25); onProgress.invoke("Validating script", 0.25);
@ -489,14 +490,14 @@ class StatePlugins {
} }
val icon = config.absoluteIconUrl?.let { absIconUrl -> val icon = config.absoluteIconUrl?.let { absIconUrl ->
withContext(Dispatchers.Main) {
onProgress.invoke("Saving plugin", 0.75);
}
val iconResp = client.get(absIconUrl); val iconResp = client.get(absIconUrl);
if (iconResp.isOk) if (iconResp.isOk)
return@let iconResp.body?.byteStream()?.use { it.readBytes() }; return@let iconResp.body?.byteStream()?.use { it.readBytes() };
return@let null; return@let null;
} }
withContext(Dispatchers.Main) {
onProgress.invoke("Saving plugin", 0.75);
}
val installEx = StatePlugins.instance.createPlugin(config, script, icon, true); val installEx = StatePlugins.instance.createPlugin(config, script, icon, true);
if (installEx != null) if (installEx != null)
throw installEx; throw installEx;

View file

@ -907,11 +907,14 @@ class FutoVideoPlayer : FutoVideoPlayerBase {
override fun switchToVideoMode() { override fun switchToVideoMode() {
super.switchToVideoMode() super.switchToVideoMode()
setArtwork(null) //setArtwork(null)
} }
override fun switchToAudioMode(video: IPlatformVideoDetails?) { override fun switchToAudioMode(video: IPlatformVideoDetails?) {
super.switchToAudioMode(video) super.switchToAudioMode(video)
//This causes issues, and is in general confusing, needs improvements
/*
val thumbnail = video?.thumbnails?.getHQThumbnail() val thumbnail = video?.thumbnails?.getHQThumbnail()
if (!thumbnail.isNullOrBlank()) { if (!thumbnail.isNullOrBlank()) {
Glide.with(context).asBitmap().load(thumbnail) Glide.with(context).asBitmap().load(thumbnail)
@ -928,5 +931,6 @@ class FutoVideoPlayer : FutoVideoPlayerBase {
} }
}) })
} }
*/
} }
} }