From 9a061c3f1cdf2a867be20c3cbe574d86ed7a2957 Mon Sep 17 00:00:00 2001 From: FongMi Date: Fri, 24 Mar 2023 18:35:47 +0800 Subject: [PATCH] [mobile] support pip mode action --- .../com/fongmi/android/tv/bean/Config.java | 11 ++-- .../com/fongmi/android/tv/utils/Utils.java | 13 ----- .../tv/ui/activity/DetailActivity.java | 20 +++++--- .../com/fongmi/android/tv/ui/custom/Pip.java | 51 +++++++++++++++++++ .../mobile/res/drawable/ic_control_back.xml | 10 ++++ 5 files changed, 82 insertions(+), 23 deletions(-) create mode 100644 app/src/mobile/java/com/fongmi/android/tv/ui/custom/Pip.java create mode 100644 app/src/mobile/res/drawable/ic_control_back.xml diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Config.java b/app/src/main/java/com/fongmi/android/tv/bean/Config.java index e89305dfe..df5ee02dc 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Config.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Config.java @@ -6,7 +6,6 @@ import androidx.room.Entity; import androidx.room.Index; import androidx.room.PrimaryKey; -import com.fongmi.android.tv.api.ApiConfig; import com.fongmi.android.tv.db.AppDatabase; import java.util.List; @@ -24,6 +23,10 @@ public class Config { private String home; private String parse; + public static Config create(int type) { + return create("", type); + } + public static Config create(String url, int type) { return new Config(url, "", type); } @@ -149,17 +152,17 @@ public class Config { public static Config vod() { Config item = AppDatabase.get().getConfigDao().findOne(0); - return item == null ? create("", 0) : item; + return item == null ? create(0) : item; } public static Config live() { Config item = AppDatabase.get().getConfigDao().findOne(1); - return item == null ? create(ApiConfig.getUrl(), 1) : item; + return item == null ? create(1) : item; } public static Config wall() { Config item = AppDatabase.get().getConfigDao().findOne(2); - return item == null ? create("", 2) : item; + return item == null ? create(2) : item; } public static Config find(int id) { diff --git a/app/src/main/java/com/fongmi/android/tv/utils/Utils.java b/app/src/main/java/com/fongmi/android/tv/utils/Utils.java index 1f6f6bd51..f93c115ee 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/Utils.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/Utils.java @@ -2,7 +2,6 @@ package com.fongmi.android.tv.utils; import android.Manifest; import android.app.Activity; -import android.app.PictureInPictureParams; import android.content.ClipboardManager; import android.content.Context; import android.content.pm.PackageManager; @@ -12,7 +11,6 @@ import android.os.IBinder; import android.provider.Settings; import android.text.TextUtils; import android.util.Base64; -import android.util.Rational; import android.view.KeyEvent; import android.view.View; import android.view.Window; @@ -87,17 +85,6 @@ public class Utils { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && App.get().getPackageManager().hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE); } - public static void enterPIP(Activity activity, Rational rational) { - try { - if (!hasPIP() || activity.isInPictureInPictureMode()) return; - PictureInPictureParams.Builder builder = new PictureInPictureParams.Builder(); - builder.setAspectRatio(rational).build(); - activity.enterPictureInPictureMode(builder.build()); - } catch (Exception e) { - e.printStackTrace(); - } - } - public static boolean isVideoFormat(String url) { return isVideoFormat(url, new HashMap<>()); } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java index 57bda26a5..52d218029 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java @@ -7,7 +7,6 @@ import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.os.Bundle; import android.text.Html; -import android.util.Rational; import android.util.TypedValue; import android.view.MotionEvent; import android.view.View; @@ -40,12 +39,14 @@ import com.fongmi.android.tv.event.RefreshEvent; import com.fongmi.android.tv.model.SiteViewModel; import com.fongmi.android.tv.player.ExoUtil; import com.fongmi.android.tv.player.Players; +import com.fongmi.android.tv.receiver.PipReceiver; import com.fongmi.android.tv.ui.adapter.EpisodeAdapter; import com.fongmi.android.tv.ui.adapter.FlagAdapter; import com.fongmi.android.tv.ui.adapter.ParseAdapter; import com.fongmi.android.tv.ui.adapter.SearchAdapter; import com.fongmi.android.tv.ui.base.BaseActivity; import com.fongmi.android.tv.ui.custom.CustomKeyDownVod; +import com.fongmi.android.tv.ui.custom.Pip; import com.fongmi.android.tv.ui.custom.SpaceItemDecoration; import com.fongmi.android.tv.ui.custom.ViewType; import com.fongmi.android.tv.ui.custom.dialog.EpisodeDialog; @@ -84,9 +85,9 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis private SiteViewModel mViewModel; private FlagAdapter mFlagAdapter; private TrackDialog mTrackDialog; + private PipReceiver mReceiver; private History mHistory; private Players mPlayers; - private String mSiteKey; private boolean fullscreen; private boolean initTrack; private boolean initAuto; @@ -98,6 +99,8 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis private Runnable mR1; private Runnable mR2; private Runnable mR3; + private String mKey; + private Pip mPip; public static void push(Activity activity, String url) { start(activity, "push_agent", url, url); @@ -183,11 +186,13 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis mKeyDown = CustomKeyDownVod.create(this, mBinding.video); mFrameParams = mBinding.video.getLayoutParams(); mBinding.progressLayout.showProgress(); + mReceiver = new PipReceiver(mBinding); mPlayers = new Players().init(); mR1 = this::hideControl; mR2 = this::setTraffic; mR3 = this::setOrient; - mSiteKey = getKey(); + mPip = new Pip(); + mKey = getKey(); setRecyclerView(); setVideoView(); setViewModel(); @@ -733,6 +738,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis private void checkPlayImg(boolean playing) { mBinding.control.play.setImageResource(playing ? com.google.android.exoplayer2.ui.R.drawable.exo_icon_pause : com.google.android.exoplayer2.ui.R.drawable.exo_icon_play); + mPip.update(this, playing); } private void checkLockImg() { @@ -929,7 +935,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis private void nextSite() { if (mSearchAdapter.getItemCount() == 0) return; Vod vod = mSearchAdapter.get(0); - if (vod.getSiteKey().equals(mSiteKey)) return; + if (vod.getSiteKey().equals(mKey)) return; Notify.show(getString(R.string.play_switch_site, vod.getSiteName())); mSearchAdapter.remove(0); setInitAuto(false); @@ -1084,20 +1090,22 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis @Override protected void onUserLeaveHint() { super.onUserLeaveHint(); - Utils.enterPIP(this, getScale() == 2 ? new Rational(4, 3) : new Rational(16, 9)); - if (isLock()) onLock(); + mPip.enter(this, getScale() == 2); + if (isLock()) App.post(this::onLock, 500); } @Override public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) { super.onPictureInPictureModeChanged(isInPictureInPictureMode); if (isInPictureInPictureMode) { + mReceiver.register(this); enterFullscreen(); hideControl(); hideEpisode(); hideTrack(); } else { exitFullscreen(); + mReceiver.unregister(this); if (isStop()) finish(); } } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/custom/Pip.java b/app/src/mobile/java/com/fongmi/android/tv/ui/custom/Pip.java new file mode 100644 index 000000000..04c136586 --- /dev/null +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/custom/Pip.java @@ -0,0 +1,51 @@ +package com.fongmi.android.tv.ui.custom; + +import android.app.Activity; +import android.app.PendingIntent; +import android.app.PictureInPictureParams; +import android.app.RemoteAction; +import android.content.Intent; +import android.graphics.drawable.Icon; +import android.util.Rational; + +import com.fongmi.android.tv.utils.Utils; + +import java.util.ArrayList; +import java.util.List; + +public class Pip { + + public static final String ACTION_MEDIA_CONTROL = "media_control"; + public static final String EXTRA_CONTROL_TYPE = "control_type"; + + public static final int CONTROL_TYPE_PREV = 1; + public static final int CONTROL_TYPE_NEXT = 2; + public static final int CONTROL_TYPE_PLAY = 3; + + private PictureInPictureParams.Builder builder; + + public Pip() { + if (!Utils.hasPIP()) return; + this.builder = new PictureInPictureParams.Builder(); + } + + public void update(Activity activity, boolean play) { + if (!Utils.hasPIP()) return; + List actions = new ArrayList<>(); + actions.add(new RemoteAction(Icon.createWithResource(activity, com.google.android.exoplayer2.ui.R.drawable.exo_icon_previous), "", "", PendingIntent.getBroadcast(activity, CONTROL_TYPE_PREV, new Intent(ACTION_MEDIA_CONTROL).putExtra(EXTRA_CONTROL_TYPE, CONTROL_TYPE_PREV), 0))); + actions.add(new RemoteAction(Icon.createWithResource(activity, play ? com.google.android.exoplayer2.ui.R.drawable.exo_icon_pause : com.google.android.exoplayer2.ui.R.drawable.exo_icon_play), "", "", PendingIntent.getBroadcast(activity, CONTROL_TYPE_PLAY, new Intent(ACTION_MEDIA_CONTROL).putExtra(EXTRA_CONTROL_TYPE, CONTROL_TYPE_PLAY), 0))); + actions.add(new RemoteAction(Icon.createWithResource(activity, com.google.android.exoplayer2.ui.R.drawable.exo_icon_next), "", "", PendingIntent.getBroadcast(activity, CONTROL_TYPE_NEXT, new Intent(ACTION_MEDIA_CONTROL).putExtra(EXTRA_CONTROL_TYPE, CONTROL_TYPE_NEXT), 0))); + builder.setActions(actions); + activity.setPictureInPictureParams(builder.build()); + } + + public void enter(Activity activity, boolean four) { + try { + if (!Utils.hasPIP() || activity.isInPictureInPictureMode()) return; + builder.setAspectRatio(new Rational(four ? 4 : 16, four ? 3 : 9)).build(); + activity.enterPictureInPictureMode(builder.build()); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/app/src/mobile/res/drawable/ic_control_back.xml b/app/src/mobile/res/drawable/ic_control_back.xml new file mode 100644 index 000000000..541189c3e --- /dev/null +++ b/app/src/mobile/res/drawable/ic_control_back.xml @@ -0,0 +1,10 @@ + + +