From 2c94d4d03ab00453447db5b89e4814911149abc9 Mon Sep 17 00:00:00 2001 From: FongMi Date: Wed, 2 Aug 2023 18:32:58 +0800 Subject: [PATCH] [leanback] support manual play and preview --- .../tv/ui/activity/DetailActivity.java | 50 +++++++++++++++--- .../tv/ui/activity/SettingPlayerActivity.java | 7 +++ .../res/layout/activity_setting_player.xml | 29 ++++++++++ .../leanback/res/layout/view_widget_vod.xml | 8 +++ .../java/com/fongmi/android/tv/Setting.java | 8 +++ .../com/fongmi/android/tv/bean/History.java | 4 ++ .../java/com/fongmi/android/tv/bean/Vod.java | 7 ++- .../fongmi/android/tv/impl/CustomTarget.java | 19 +++++++ .../com/fongmi/android/tv/utils/ImgUtil.java | 5 +- app/src/main/res/drawable-nodpi/radio.webp | Bin 0 -> 23560 bytes app/src/main/res/values-zh-rCN/strings.xml | 1 + app/src/main/res/values-zh-rTW/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 13 files changed, 130 insertions(+), 10 deletions(-) create mode 100644 app/src/main/java/com/fongmi/android/tv/impl/CustomTarget.java create mode 100644 app/src/main/res/drawable-nodpi/radio.webp diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java index 6c6987cbf..758923526 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java @@ -4,6 +4,7 @@ import android.Manifest; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Intent; +import android.graphics.drawable.Drawable; import android.net.Uri; import android.text.Html; import android.text.TextUtils; @@ -27,6 +28,7 @@ import androidx.media3.ui.PlayerView; import androidx.recyclerview.widget.RecyclerView; import androidx.viewbinding.ViewBinding; +import com.bumptech.glide.request.transition.Transition; import com.fongmi.android.tv.App; import com.fongmi.android.tv.Constant; import com.fongmi.android.tv.R; @@ -45,6 +47,7 @@ import com.fongmi.android.tv.event.ErrorEvent; import com.fongmi.android.tv.event.PlayerEvent; import com.fongmi.android.tv.event.RefreshEvent; import com.fongmi.android.tv.impl.Callback; +import com.fongmi.android.tv.impl.CustomTarget; import com.fongmi.android.tv.model.SiteViewModel; import com.fongmi.android.tv.player.ExoUtil; import com.fongmi.android.tv.player.Players; @@ -61,6 +64,7 @@ import com.fongmi.android.tv.ui.presenter.PartPresenter; import com.fongmi.android.tv.ui.presenter.SearchPresenter; import com.fongmi.android.tv.utils.Clock; import com.fongmi.android.tv.utils.FileChooser; +import com.fongmi.android.tv.utils.ImgUtil; import com.fongmi.android.tv.utils.Notify; import com.fongmi.android.tv.utils.ResUtil; import com.fongmi.android.tv.utils.Sniffer; @@ -394,6 +398,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis mViewModel.playerContent(getKey(), flag.getFlag(), episode.getUrl()); updateHistory(episode, replay); showProgress(); + hidePreview(); hideCenter(); } @@ -429,6 +434,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis mFlagAdapter.setItems(item.getVodFlags(), null); mBinding.content.setMaxLines(getMaxLines()); mBinding.video.requestFocus(); + setArtwork(item.getVodPic()); getPart(item.getVodName()); checkHistory(item); checkFlag(item); @@ -465,11 +471,14 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis } private void seamless(Vod.Flag flag, boolean force) { - if (!force && !getSite().isChangeable()) return; - Vod.Flag.Episode episode = flag.find(mHistory.getVodRemarks(), getMark() == null); - if (episode == null || episode.isActivated()) return; - mHistory.setVodRemarks(episode.getName()); - setEpisodeActivated(episode); + if (Setting.isManual() && mHistory.isNew()) { + hideProgress(); + } else if (!Setting.isManual() || force) { + Vod.Flag.Episode episode = flag.find(mHistory.getVodRemarks(), getMark() == null); + if (episode == null || episode.isActivated()) return; + mHistory.setVodRemarks(episode.getName()); + setEpisodeActivated(episode); + } } private void setEpisodeActivated(Vod.Flag.Episode item) { @@ -564,8 +573,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis } private void onChange() { - if (getSite().isChangeable()) checkSearch(true); - else checkFlag(); + checkSearch(true); } private void onLoop() { @@ -770,6 +778,17 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis hideInfo(); } + private void showPreview(Drawable resource) { + if (!Setting.isManual() || isVisible(mBinding.widget.progress)) return; + mBinding.widget.preview.setVisibility(View.VISIBLE); + mBinding.widget.preview.setImageDrawable(resource); + } + + private void hidePreview() { + mBinding.widget.preview.setVisibility(View.VISIBLE); + mBinding.widget.preview.setImageDrawable(null); + } + private void setTraffic() { Traffic.setSpeed(mBinding.widget.traffic); App.post(mR2, Constant.INTERVAL_TRAFFIC); @@ -779,6 +798,23 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis App.post(mR1, Constant.INTERVAL_HIDE); } + private void setArtwork(String url) { + ImgUtil.load(url, R.drawable.radio, new CustomTarget() { + @Override + public void onResourceReady(@NonNull Drawable resource, @Nullable Transition transition) { + getExo().setDefaultArtwork(resource); + getIjk().setDefaultArtwork(resource); + showPreview(resource); + } + + @Override + public void onLoadFailed(@Nullable Drawable error) { + getExo().setDefaultArtwork(error); + getIjk().setDefaultArtwork(error); + } + }); + } + private void getPart(String source) { OkHttp.newCall("http://api.pullword.com/get.php?source=" + URLEncoder.encode(source.trim()) + "¶m1=0¶m2=0&json=1").enqueue(new Callback() { @Override diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingPlayerActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingPlayerActivity.java index 74b242ed5..75f739b18 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingPlayerActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingPlayerActivity.java @@ -38,6 +38,7 @@ public class SettingPlayerActivity extends BaseActivity implements UaCallback { protected void initView() { mBinding.uaText.setText(Setting.getUa()); mBinding.tunnelText.setText(getSwitch(Setting.isTunnel())); + mBinding.manualText.setText(getSwitch(Setting.isManual())); mBinding.http.setVisibility(Players.isExo(Setting.getPlayer()) ? View.VISIBLE : View.GONE); mBinding.tunnel.setVisibility(Players.isExo(Setting.getPlayer()) ? View.VISIBLE : View.GONE); mBinding.httpText.setText((http = ResUtil.getStringArray(R.array.select_exo_http))[Setting.getHttp()]); @@ -48,6 +49,7 @@ public class SettingPlayerActivity extends BaseActivity implements UaCallback { mBinding.ua.setOnClickListener(this::onUa); mBinding.http.setOnClickListener(this::setHttp); mBinding.tunnel.setOnClickListener(this::setTunnel); + mBinding.manual.setOnClickListener(this::setManual); } private void onUa(View view) { @@ -66,6 +68,11 @@ public class SettingPlayerActivity extends BaseActivity implements UaCallback { mBinding.tunnelText.setText(getSwitch(Setting.isTunnel())); } + private void setManual(View view) { + Setting.putManual(!Setting.isManual()); + mBinding.manualText.setText(getSwitch(Setting.isManual())); + } + @Override public void setUa(String ua) { mBinding.uaText.setText(ua); diff --git a/app/src/leanback/res/layout/activity_setting_player.xml b/app/src/leanback/res/layout/activity_setting_player.xml index 2b04e94ce..f46997362 100644 --- a/app/src/leanback/res/layout/activity_setting_player.xml +++ b/app/src/leanback/res/layout/activity_setting_player.xml @@ -102,5 +102,34 @@ tools:text="關" /> + + + + + + + + \ No newline at end of file diff --git a/app/src/leanback/res/layout/view_widget_vod.xml b/app/src/leanback/res/layout/view_widget_vod.xml index 4da99ed7d..b6ba9b8e0 100644 --- a/app/src/leanback/res/layout/view_widget_vod.xml +++ b/app/src/leanback/res/layout/view_widget_vod.xml @@ -227,4 +227,12 @@ app:trackColor="@color/grey_500" /> + + + \ No newline at end of file diff --git a/app/src/main/java/com/fongmi/android/tv/Setting.java b/app/src/main/java/com/fongmi/android/tv/Setting.java index a790d83d7..99f0aa4b0 100644 --- a/app/src/main/java/com/fongmi/android/tv/Setting.java +++ b/app/src/main/java/com/fongmi/android/tv/Setting.java @@ -183,6 +183,14 @@ public class Setting { Prefers.put("exo_http", http); } + public static boolean isManual() { + return Prefers.getBoolean("manual"); + } + + public static void putManual(boolean manual) { + Prefers.put("manual", manual); + } + public static int getSiteMode() { return Prefers.getInt("site_mode"); } diff --git a/app/src/main/java/com/fongmi/android/tv/bean/History.java b/app/src/main/java/com/fongmi/android/tv/bean/History.java index dbd5e4021..877d09f4d 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/History.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/History.java @@ -245,6 +245,10 @@ public class History { return isRevPlay() ? R.string.play_backward_hint : R.string.play_forward_hint; } + public boolean isNew() { + return getCreateTime() == 0 && getPosition() == 0; + } + public static List get() { return get(ApiConfig.getCid()); } diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Vod.java b/app/src/main/java/com/fongmi/android/tv/bean/Vod.java index 665fae117..eac7c1923 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Vod.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Vod.java @@ -261,6 +261,7 @@ public class Vod { public Flag() { this.episodes = new ArrayList<>(); + this.position = -1; } public Flag(String flag) { @@ -333,11 +334,11 @@ public class Vod { int number = Utils.getDigit(remarks); if (getEpisodes().size() == 0) return null; if (getEpisodes().size() == 1) return getEpisodes().get(0); - if (getPosition() != -1) return getEpisodes().get(getPosition()); for (Episode item : getEpisodes()) if (item.rule1(remarks)) return item; for (Episode item : getEpisodes()) if (item.rule2(number)) return item; for (Episode item : getEpisodes()) if (item.rule3(remarks)) return item; for (Episode item : getEpisodes()) if (item.rule4(remarks)) return item; + if (getPosition() != -1) return getEpisodes().get(getPosition()); return strict ? null : getEpisodes().get(0); } @@ -445,6 +446,10 @@ public class Vod { return name.toLowerCase().contains(getName().toLowerCase()); } + public boolean equals(Episode episode) { + return rule1(episode.getName()); + } + @Override public boolean equals(Object obj) { if (this == obj) return true; diff --git a/app/src/main/java/com/fongmi/android/tv/impl/CustomTarget.java b/app/src/main/java/com/fongmi/android/tv/impl/CustomTarget.java new file mode 100644 index 000000000..dbe456994 --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/impl/CustomTarget.java @@ -0,0 +1,19 @@ +package com.fongmi.android.tv.impl; + +import android.graphics.drawable.Drawable; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.bumptech.glide.request.transition.Transition; + +public class CustomTarget extends com.bumptech.glide.request.target.CustomTarget { + + @Override + public void onResourceReady(@NonNull Drawable resource, @Nullable Transition transition) { + } + + @Override + public void onLoadCleared(@Nullable Drawable placeholder) { + } +} diff --git a/app/src/main/java/com/fongmi/android/tv/utils/ImgUtil.java b/app/src/main/java/com/fongmi/android/tv/utils/ImgUtil.java index 874b376d8..5b9bd692d 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/ImgUtil.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/ImgUtil.java @@ -37,8 +37,9 @@ public class ImgUtil { load(url, view, ImageView.ScaleType.CENTER); } - public static void load(String url, CustomTarget target) { - if (!TextUtils.isEmpty(url)) Glide.with(App.get()).load(checkUrl(url)).dontAnimate().into(target); + public static void load(String url, int error, CustomTarget target) { + if (TextUtils.isEmpty(url)) target.onLoadFailed(ResUtil.getDrawable(error)); + else Glide.with(App.get()).load(checkUrl(url)).error(error).dontAnimate().into(target); } public static void load(String url, ImageView view, ImageView.ScaleType scaleType) { diff --git a/app/src/main/res/drawable-nodpi/radio.webp b/app/src/main/res/drawable-nodpi/radio.webp new file mode 100644 index 0000000000000000000000000000000000000000..00d392c7964acb9329917c4dc4ca4e7bc5c86636 GIT binary patch literal 23560 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 连线方式 隧道模式 + 手动播放 解码方式 渲染方式 缩放比例 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 3af3a1538..216afdf2b 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -68,6 +68,7 @@ User-Agent 連線方式 隧道模式 + 手動播放 解碼方式 渲染方式 縮放比例 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 195247aab..9f1d1afc9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -68,6 +68,7 @@ User-Agent HTTP method Tunnel mode + Manual play Decode Render Scale