From 505a23170e043dfafbe07db82fde9a7f4cb7a0bb Mon Sep 17 00:00:00 2001 From: okjack Date: Fri, 7 Jun 2024 10:41:16 +0800 Subject: [PATCH] Optimize pip mode --- .../com/fongmi/android/tv/player/Players.java | 6 ++++++ .../android/tv/ui/activity/LiveActivity.java | 2 +- .../android/tv/ui/activity/VideoActivity.java | 2 +- .../java/com/fongmi/android/tv/utils/PiP.java | 17 +++++++++++++++-- 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/fongmi/android/tv/player/Players.java b/app/src/main/java/com/fongmi/android/tv/player/Players.java index 8f1059b9a..88467cfce 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/Players.java +++ b/app/src/main/java/com/fongmi/android/tv/player/Players.java @@ -15,6 +15,7 @@ import androidx.annotation.NonNull; import androidx.media3.common.AudioAttributes; import androidx.media3.common.PlaybackException; import androidx.media3.common.Player; +import androidx.media3.common.VideoSize; import androidx.media3.exoplayer.ExoPlayer; import androidx.media3.exoplayer.analytics.AnalyticsListener; import androidx.media3.exoplayer.util.EventLogger; @@ -166,6 +167,11 @@ public class Players implements Player.Listener, IMediaPlayer.Listener, Analytic return ijkPlayer; } + public VideoSize getVideoSize() { + if (isExo()) return exo().getVideoSize(); + return new VideoSize(ijk().getVideoWidth(), ijk().getVideoHeight()); + } + public Map getHeaders() { return headers == null ? new HashMap<>() : checkUa(headers); } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java index a33ddaf7d..4e472e40c 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java @@ -1143,7 +1143,7 @@ public class LiveActivity extends BaseActivity implements Clock.Callback, Custom super.onUserLeaveHint(); if (isRedirect()) return; if (isLock()) App.post(this::onLock, 500); - if (mPlayers.haveTrack(C.TRACK_TYPE_VIDEO)) mPiP.enter(this, Setting.getLiveScale() == 2); + if (mPlayers.haveTrack(C.TRACK_TYPE_VIDEO)) mPiP.enter(this, mPlayers.getVideoSize(), Setting.getLiveScale()); } @Override diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index a150294f3..5c8e7243e 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -1700,7 +1700,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo super.onUserLeaveHint(); if (isRedirect()) return; if (isLock()) App.post(this::onLock, 500); - if (mPlayers.haveTrack(C.TRACK_TYPE_VIDEO)) mPiP.enter(this, getScale() == 2); + if (mPlayers.haveTrack(C.TRACK_TYPE_VIDEO)) mPiP.enter(this, mPlayers.getVideoSize(), getScale()); } @Override diff --git a/app/src/mobile/java/com/fongmi/android/tv/utils/PiP.java b/app/src/mobile/java/com/fongmi/android/tv/utils/PiP.java index e3392fe3e..2ba4d333c 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/utils/PiP.java +++ b/app/src/mobile/java/com/fongmi/android/tv/utils/PiP.java @@ -13,6 +13,7 @@ import android.view.View; import androidx.annotation.DrawableRes; import androidx.annotation.StringRes; +import androidx.media3.common.VideoSize; import androidx.media3.ui.R; import com.fongmi.android.tv.App; @@ -71,15 +72,27 @@ public class PiP { } } - public void enter(Activity activity, boolean four) { + public void enter(Activity activity, VideoSize size, int scale) { try { if (noPiP() || activity.isInPictureInPictureMode() || !Setting.isBackgroundPiP()) return; - builder.setAspectRatio(new Rational(four ? 4 : 16, four ? 3 : 9)); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) builder.setAutoEnterEnabled(true); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) builder.setSeamlessResizeEnabled(true); + if (scale == 1) builder.setAspectRatio(new Rational(16, 9)); + else if (scale == 2) builder.setAspectRatio(new Rational(4, 3)); + else builder.setAspectRatio(getRational(size)); activity.enterPictureInPictureMode(builder.build()); } catch (Exception e) { e.printStackTrace(); } } + + private Rational getRational(VideoSize size) { + Rational limitWide = new Rational(239, 100); + Rational limitTall = new Rational(100, 239); + Rational rational = new Rational(size.width, size.height); + if (rational.isInfinite()) return new Rational(16, 9); + if (rational.floatValue() > limitWide.floatValue()) return limitWide; + if (rational.floatValue() < limitTall.floatValue()) return limitTall; + return rational; + } }