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 super Drawable> 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 super Drawable> 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