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 000000000..00d392c79 Binary files /dev/null and b/app/src/main/res/drawable-nodpi/radio.webp differ diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 9bec9cf95..a4ac1bf6e 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -68,6 +68,7 @@ User-Agent 连线方式 隧道模式 + 手动播放 解码方式 渲染方式 缩放比例 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