Fix pip bug

pull/605/head
jhengazuki 7 months ago
parent 47701bf5c7
commit bbe0a203bf
  1. 3
      app/src/main/java/com/fongmi/android/tv/utils/FileUtil.java
  2. 6
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java
  3. 27
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java
  4. 33
      app/src/mobile/java/com/fongmi/android/tv/utils/PiP.java

@ -2,7 +2,6 @@ package com.fongmi.android.tv.utils;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.StatFs;
import android.text.TextUtils;
@ -117,7 +116,7 @@ public class FileUtil {
}
public static Uri getShareUri(File file) {
return Build.VERSION.SDK_INT < Build.VERSION_CODES.N ? Uri.fromFile(file) : FileProvider.getUriForFile(App.get(), App.get().getPackageName() + ".provider", file);
return FileProvider.getUriForFile(App.get(), App.get().getPackageName() + ".provider", file);
}
private static String getMimeType(String fileName) {

@ -479,7 +479,7 @@ public class LiveActivity extends BaseActivity implements CustomKeyDown.Listener
}
private void showControl() {
if (mPiP.isInMode(this)) return;
if (isInPictureInPictureMode()) return;
mBinding.control.info.setVisibility(mPlayers.isEmpty() ? View.GONE : View.VISIBLE);
mBinding.control.cast.setVisibility(mPlayers.isEmpty() ? View.GONE : View.VISIBLE);
mBinding.control.right.rotate.setVisibility(isLock() ? View.GONE : View.VISIBLE);
@ -498,8 +498,8 @@ public class LiveActivity extends BaseActivity implements CustomKeyDown.Listener
}
private void showInfo() {
mBinding.widget.infoPip.setVisibility(mPiP.isInMode(this) ? View.VISIBLE : View.GONE);
mBinding.widget.info.setVisibility(mPiP.isInMode(this) ? View.GONE : View.VISIBLE);
mBinding.widget.infoPip.setVisibility(isInPictureInPictureMode() ? View.VISIBLE : View.GONE);
mBinding.widget.info.setVisibility(isInPictureInPictureMode() ? View.GONE : View.VISIBLE);
setR3Callback();
hideControl();
setInfo();

@ -276,6 +276,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
@Override
protected void initView(Bundle savedInstanceState) {
ViewCompat.setOnApplyWindowInsetsListener(mBinding.getRoot(), (v, insets) -> setStatusBar(insets));
mKeyDown = CustomKeyDown.create(this, mBinding.exo);
mFrameParams = mBinding.video.getLayoutParams();
mBinding.progressLayout.showProgress();
@ -347,6 +348,15 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
mBinding.control.seek.setListener(mPlayers);
}
private WindowInsetsCompat setStatusBar(WindowInsetsCompat insets) {
if (getActivity().isInPictureInPictureMode()) return insets;
int top = insets.getInsets(WindowInsetsCompat.Type.statusBars()).top;
ViewGroup.LayoutParams lp = mBinding.statusBar.getLayoutParams();
lp.height = top;
mBinding.statusBar.setLayoutParams(lp);
return insets;
}
private void setRecyclerView() {
mBinding.flag.setHasFixedSize(true);
mBinding.flag.setItemAnimator(null);
@ -378,13 +388,6 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
mBinding.control.action.danmaku.setVisibility(Setting.isDanmakuLoad() ? View.VISIBLE : View.GONE);
mBinding.control.action.reset.setText(ResUtil.getStringArray(R.array.select_reset)[Setting.getReset()]);
mBinding.video.addOnLayoutChangeListener((view, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> mPiP.update(this, view));
ViewCompat.setOnApplyWindowInsetsListener(mBinding.getRoot(), (v, windowInsets) -> {
int top = windowInsets.getInsets(WindowInsetsCompat.Type.statusBars()).top;
ViewGroup.LayoutParams lp = mBinding.statusBar.getLayoutParams();
lp.height = top;
mBinding.statusBar.setLayoutParams(lp);
return windowInsets;
});
}
private void setVideoView(boolean isInPictureInPictureMode) {
@ -874,7 +877,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
private void enterFullscreen() {
if (isFullscreen()) return;
if (isLand()) setTransition();
mBinding.video.postDelayed(() -> mBinding.video.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT)), 100);
mBinding.video.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT));
setRequestedOrientation(mPlayers.isPortrait() ? ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT : ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
mBinding.control.title.setVisibility(View.VISIBLE);
setRotate(mPlayers.isPortrait(), true);
@ -949,7 +952,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
}
private void showControl() {
if (mPiP.isInMode(this)) return;
if (isInPictureInPictureMode()) return;
mBinding.control.danmaku.setVisibility(isLock() || !mPlayers.haveDanmaku() ? View.GONE : View.VISIBLE);
mBinding.control.setting.setVisibility(mHistory == null || isFullscreen() ? View.GONE : View.VISIBLE);
mBinding.control.right.rotate.setVisibility(isFullscreen() && !isLock() ? View.VISIBLE : View.GONE);
@ -1214,9 +1217,9 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
ValueAnimator animator = ValueAnimator.ofInt(mBinding.video.getHeight(), finalHeight).setDuration(300);
animator.setInterpolator(new DecelerateInterpolator());
animator.addUpdateListener(animation -> {
ViewGroup.LayoutParams params = mBinding.video.getLayoutParams();
params.height = (int) animation.getAnimatedValue();
mBinding.video.setLayoutParams(params);
mFrameParams = mBinding.video.getLayoutParams();
mFrameParams.height = (int) animation.getAnimatedValue();
mBinding.video.setLayoutParams(mFrameParams);
});
animator.start();
}

@ -31,6 +31,11 @@ public class PiP {
return Build.VERSION.SDK_INT < Build.VERSION_CODES.O || !App.get().getPackageManager().hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE);
}
public PiP() {
if (noPiP()) return;
this.builder = new PictureInPictureParams.Builder();
}
@TargetApi(Build.VERSION_CODES.O)
private RemoteAction buildRemoteAction(Activity activity, @DrawableRes int icon, @StringRes int title, String action) {
return new RemoteAction(Icon.createWithResource(activity, icon), activity.getString(title), "", ActionReceiver.getPendingIntent(activity, action));
@ -41,21 +46,12 @@ public class PiP {
return buildRemoteAction(activity, R.drawable.exo_icon_play, R.string.exo_controls_play_description, ActionEvent.PLAY);
}
public PiP() {
if (noPiP()) return;
this.builder = new PictureInPictureParams.Builder();
}
public boolean isInMode(Activity activity) {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && activity.isInPictureInPictureMode();
}
public void update(Activity activity, View view) {
if (noPiP()) return;
Rect sourceRectHint = new Rect();
view.getGlobalVisibleRect(sourceRectHint);
builder.setSourceRectHint(sourceRectHint);
try {
if (noPiP()) return;
Rect rect = new Rect();
view.getGlobalVisibleRect(rect);
builder.setSourceRectHint(rect);
activity.setPictureInPictureParams(builder.build());
} catch (Exception e) {
e.printStackTrace();
@ -63,12 +59,12 @@ public class PiP {
}
public void update(Activity activity, boolean play) {
if (noPiP()) return;
List<RemoteAction> actions = new ArrayList<>();
actions.add(buildRemoteAction(activity, com.fongmi.android.tv.R.drawable.ic_action_audio, R.string.exo_controls_hide, ActionEvent.AUDIO));
actions.add(getPlayPauseAction(activity, play));
actions.add(buildRemoteAction(activity, R.drawable.exo_icon_next, R.string.exo_controls_next_description, ActionEvent.NEXT));
try {
if (noPiP()) return;
List<RemoteAction> actions = new ArrayList<>();
actions.add(buildRemoteAction(activity, com.fongmi.android.tv.R.drawable.ic_action_audio, R.string.exo_controls_hide, ActionEvent.AUDIO));
actions.add(getPlayPauseAction(activity, play));
actions.add(buildRemoteAction(activity, R.drawable.exo_icon_next, R.string.exo_controls_next_description, ActionEvent.NEXT));
activity.setPictureInPictureParams(builder.setActions(actions).build());
} catch (Exception e) {
e.printStackTrace();
@ -89,6 +85,7 @@ public class PiP {
}
private Rational getRational(int width, int height) {
if (width <= 0 || height <= 0) return new Rational(16, 9);
Rational limitWide = new Rational(239, 100);
Rational limitTall = new Rational(100, 239);
Rational rational = new Rational(width, height);

Loading…
Cancel
Save