From f0882af23bb1f0de6fccfa6d6568d9b9d8feb58c Mon Sep 17 00:00:00 2001 From: jhengazuki Date: Mon, 1 Sep 2025 14:53:58 +0800 Subject: [PATCH] Clean image load --- .../android/tv/ui/activity/HomeActivity.java | 4 - .../tv/ui/activity/SettingActivity.java | 10 --- .../android/tv/ui/adapter/KeepAdapter.java | 2 +- .../android/tv/ui/holder/VodOvalHolder.java | 2 +- .../android/tv/ui/holder/VodRectHolder.java | 2 +- .../tv/ui/presenter/HistoryPresenter.java | 2 +- .../leanback/res/layout/activity_setting.xml | 73 ++++--------------- .../java/com/fongmi/android/tv/Setting.java | 12 --- .../com/fongmi/android/tv/bean/Channel.java | 2 +- .../fongmi/android/tv/event/RefreshEvent.java | 6 +- .../com/fongmi/android/tv/utils/ImgUtil.java | 65 ++++------------- app/src/main/res/drawable/ic_img_error.xml | 10 --- app/src/main/res/values-zh-rCN/strings.xml | 7 -- app/src/main/res/values-zh-rTW/strings.xml | 7 -- app/src/main/res/values/strings.xml | 7 -- .../android/tv/ui/adapter/HistoryAdapter.java | 2 +- .../android/tv/ui/adapter/KeepAdapter.java | 2 +- .../android/tv/ui/dialog/ReceiveDialog.java | 2 +- .../android/tv/ui/holder/VodListHolder.java | 2 +- .../android/tv/ui/holder/VodOneHolder.java | 2 +- .../android/tv/ui/holder/VodOvalHolder.java | 2 +- .../android/tv/ui/holder/VodRectHolder.java | 2 +- build.gradle | 4 +- 23 files changed, 44 insertions(+), 185 deletions(-) delete mode 100644 app/src/main/res/drawable/ic_img_error.xml diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java index 3f941e8f5..441b38323 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java @@ -315,10 +315,6 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen case VIDEO: getVideo(); break; - case IMAGE: - int index = getRecommendIndex(); - mAdapter.notifyArrayItemRangeChanged(index, mAdapter.size() - index); - break; case HISTORY: getHistory(); break; diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java index 348d339be..1a710fd34 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java @@ -50,7 +50,6 @@ import javax.annotation.Nullable; public class SettingActivity extends BaseActivity implements ConfigCallback, SiteCallback, LiveCallback, DohCallback { private ActivitySettingBinding mBinding; - private String[] quality; private String[] size; private int type; @@ -92,7 +91,6 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit mBinding.dohText.setText(getDohList()[getDohIndex()]); mBinding.incognitoText.setText(getSwitch(Setting.isIncognito())); mBinding.sizeText.setText((size = ResUtil.getStringArray(R.array.select_size))[Setting.getSize()]); - mBinding.qualityText.setText((quality = ResUtil.getStringArray(R.array.select_quality))[Setting.getQuality()]); } private void setCacheText() { @@ -125,7 +123,6 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit mBinding.wallDefault.setOnClickListener(this::setWallDefault); mBinding.wallRefresh.setOnClickListener(this::setWallRefresh); mBinding.incognito.setOnClickListener(this::setIncognito); - mBinding.quality.setOnClickListener(this::setQuality); mBinding.size.setOnClickListener(this::setSize); mBinding.doh.setOnClickListener(this::setDoh); } @@ -291,13 +288,6 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit mBinding.incognitoText.setText(getSwitch(Setting.isIncognito())); } - private void setQuality(View view) { - int index = Setting.getQuality(); - Setting.putQuality(index = index == quality.length - 1 ? 0 : ++index); - mBinding.qualityText.setText(quality[index]); - RefreshEvent.image(); - } - private void setSize(View view) { int index = Setting.getSize(); Setting.putSize(index = index == size.length - 1 ? 0 : ++index); diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/KeepAdapter.java b/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/KeepAdapter.java index 23ad021d4..43fbcf9c8 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/KeepAdapter.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/KeepAdapter.java @@ -91,7 +91,7 @@ public class KeepAdapter extends RecyclerView.Adapter { holder.binding.site.setVisibility(View.VISIBLE); holder.binding.site.setText(item.getSiteName()); holder.binding.delete.setVisibility(!delete ? View.GONE : View.VISIBLE); - ImgUtil.loadVod(item.getVodName(), item.getVodPic(), holder.binding.image); + ImgUtil.load(item.getVodName(), item.getVodPic(), holder.binding.image); } private void setFocusListener(AdapterVodBinding binding) { diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/holder/VodOvalHolder.java b/app/src/leanback/java/com/fongmi/android/tv/ui/holder/VodOvalHolder.java index 525edaff9..6e466d57a 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/holder/VodOvalHolder.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/holder/VodOvalHolder.java @@ -31,6 +31,6 @@ public class VodOvalHolder extends BaseVodHolder { binding.name.setVisibility(item.getNameVisible()); binding.getRoot().setOnClickListener(v -> listener.onItemClick(item)); binding.getRoot().setOnLongClickListener(v -> listener.onLongClick(item)); - ImgUtil.oval(item.getVodName(), item.getVodPic(), binding.image); + ImgUtil.load(item.getVodName(), item.getVodPic(), binding.image); } } diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/holder/VodRectHolder.java b/app/src/leanback/java/com/fongmi/android/tv/ui/holder/VodRectHolder.java index 55492b14d..3596c5b85 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/holder/VodRectHolder.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/holder/VodRectHolder.java @@ -37,6 +37,6 @@ public class VodRectHolder extends BaseVodHolder { binding.remark.setVisibility(item.getRemarkVisible()); binding.getRoot().setOnClickListener(v -> listener.onItemClick(item)); binding.getRoot().setOnLongClickListener(v -> listener.onLongClick(item)); - ImgUtil.rect(item.getVodName(), item.getVodPic(), binding.image); + ImgUtil.load(item.getVodName(), item.getVodPic(), binding.image); } } diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/HistoryPresenter.java b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/HistoryPresenter.java index 6647eb9f0..ba1fc07ab 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/HistoryPresenter.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/HistoryPresenter.java @@ -67,7 +67,7 @@ public class HistoryPresenter extends Presenter { holder.binding.site.setVisibility(item.getSiteVisible()); holder.binding.remark.setVisibility(delete ? View.GONE : View.VISIBLE); holder.binding.delete.setVisibility(!delete ? View.GONE : View.VISIBLE); - ImgUtil.loadVod(item.getVodName(), item.getVodPic(), holder.binding.image); + ImgUtil.load(item.getVodName(), item.getVodPic(), holder.binding.image); } private void setClickListener(View root, History item) { diff --git a/app/src/leanback/res/layout/activity_setting.xml b/app/src/leanback/res/layout/activity_setting.xml index 563cb2eb3..03af492b6 100644 --- a/app/src/leanback/res/layout/activity_setting.xml +++ b/app/src/leanback/res/layout/activity_setting.xml @@ -161,7 +161,6 @@ android:background="@drawable/selector_item" android:focusable="true" android:focusableInTouchMode="true" - android:nextFocusDown="@id/player" android:orientation="horizontal"> @@ -208,7 +206,6 @@ android:background="@drawable/selector_item" android:focusable="true" android:focusableInTouchMode="true" - android:nextFocusDown="@id/player" android:padding="8dp" android:scaleType="fitCenter" android:src="@drawable/ic_setting_refresh" /> @@ -271,7 +268,6 @@ android:background="@drawable/selector_item" android:focusable="true" android:focusableInTouchMode="true" - android:nextFocusDown="@id/quality" android:orientation="horizontal"> - - - - - - - + android:text="@string/setting_size" + android:textColor="@color/white" + android:textSize="18sp" /> - - - - - + android:gravity="end" + android:textColor="@color/white" + android:textSize="18sp" + tools:text="Medium" /> - target) { - if (!TextUtils.isEmpty(url)) Glide.with(App.get()).asDrawable().load(getUrl(url)).skipMemoryCache(true).dontAnimate().signature(getSignature(url)).into(target); + Glide.with(App.get()).asDrawable().load(getUrl(url)).into(target); } - public static void rect(String text, String url, ImageView view) { + public static void load(String text, String url, ImageView view) { load(text, url, view, true); } - public static void oval(String text, String url, ImageView view) { - load(text, url, view, false); - } - - public static void load(String text, String url, ImageView view, boolean rect) { - if (!TextUtils.isEmpty(url)) Glide.with(App.get()).asBitmap().load(getUrl(url)).skipMemoryCache(true).dontAnimate().sizeMultiplier(Setting.getThumbnail()).signature(getSignature(url)).listener(getListener(true, view)).into(view); - else if (!text.isEmpty()) view.setImageDrawable(getTextDrawable(text.substring(0, 1), rect)); - else setError(view); - } - - public static void loadVod(String text, String url, ImageView view) { - if (!TextUtils.isEmpty(url)) Glide.with(App.get()).asBitmap().load(getUrl(url)).listener(getListener(true, view)).into(view); - else if (!text.isEmpty()) view.setImageDrawable(getTextDrawable(text.substring(0, 1), true)); - else setError(view); - } - - public static void loadLive(String url, ImageView view) { - view.setVisibility(TextUtils.isEmpty(url) ? View.GONE : View.VISIBLE); - if (!TextUtils.isEmpty(url)) Glide.with(App.get()).asBitmap().load(getUrl(url)).skipMemoryCache(true).dontAnimate().signature(getSignature(url)).listener(getListener(false, view)).into(view); - } - - private static Drawable getTextDrawable(String text, boolean rect) { - TextDrawable.Builder builder = new TextDrawable.Builder(); - if (rect) return builder.buildRect(text, ColorGenerator.get400(text)); - return builder.buildRound(text, ColorGenerator.get400(text)); + public static void load(String text, String url, ImageView view, boolean vod) { + if (!vod) view.setVisibility(TextUtils.isEmpty(url) ? View.GONE : View.VISIBLE); + view.post(() -> Glide.with(App.get()).asBitmap().load(getUrl(url)).override(view.getWidth(), view.getHeight()).listener(getListener(text, view, vod)).into(view)); } public static Object getUrl(String url) { @@ -92,12 +61,17 @@ public class ImgUtil { for (Map.Entry entry : map.entrySet()) builder.addHeader(UrlUtil.fixHeader(entry.getKey()), entry.getValue()); } - private static RequestListener getListener(boolean vod, ImageView view) { + private static Drawable getTextDrawable(String text, boolean vod) { + TextDrawable.Builder builder = new TextDrawable.Builder(); + if (vod) builder.buildRect(text, ColorGenerator.get400(text)); + return builder.buildRoundRect(text, ColorGenerator.get400(text), ResUtil.dp2px(4)); + } + + private static RequestListener getListener(String text, ImageView view, boolean vod) { return new RequestListener<>() { @Override public boolean onLoadFailed(@Nullable GlideException e, Object model, @NonNull Target target, boolean isFirstResource) { - if (!vod) view.setImageResource(R.drawable.ic_img_error); - else setError(view); + view.setImageDrawable(getTextDrawable(TextUtils.isEmpty(text) ? "!" : text.substring(0, 1), vod)); return true; } @@ -108,17 +82,4 @@ public class ImgUtil { } }; } - - private static void setError(ImageView view) { - int width = view.getWidth(); - int height = view.getHeight(); - if (width <= 0 || height <= 0) return; - int size = Math.min(width, height) / 2; - Bitmap bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); - Drawable drawable = ResUtil.getDrawable(R.drawable.ic_img_error); - drawable.setBounds(0, 0, size, size); - drawable.draw(new Canvas(bitmap)); - view.setImageBitmap(bitmap); - view.setScaleType(CENTER); - } } diff --git a/app/src/main/res/drawable/ic_img_error.xml b/app/src/main/res/drawable/ic_img_error.xml deleted file mode 100644 index e0b787288..000000000 --- a/app/src/main/res/drawable/ic_img_error.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 60337c352..58bdba028 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -69,7 +69,6 @@ 壁纸 播放设置 无痕模式 - 图片品质 图片尺寸 DoH Proxy @@ -158,12 +157,6 @@ 硬解 - - - - - - diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 61fccf20a..3a4af7d5b 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -69,7 +69,6 @@ 壁紙 播放設定 無痕模式 - 圖片品質 圖片尺寸 DoH Proxy @@ -158,12 +157,6 @@ 硬解 - - - - - - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f766801e5..ba6cb5553 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -70,7 +70,6 @@ Wallpaper Player setting Incognito mode - Image quality Image size DoH Proxy @@ -164,12 +163,6 @@ Texture - - Low - Medium - High - - Small Medium diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/HistoryAdapter.java b/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/HistoryAdapter.java index 126768fb0..d7fd82280 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/HistoryAdapter.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/HistoryAdapter.java @@ -98,7 +98,7 @@ public class HistoryAdapter extends RecyclerView.Adapter { holder.binding.site.setText(item.getSiteName()); holder.binding.progress.setVisibility(View.GONE); holder.binding.delete.setVisibility(!delete ? View.GONE : View.VISIBLE); - ImgUtil.loadVod(item.getVodName(), item.getVodPic(), holder.binding.image); + ImgUtil.load(item.getVodName(), item.getVodPic(), holder.binding.image); setClickListener(holder.binding.getRoot(), item); } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/ReceiveDialog.java b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/ReceiveDialog.java index f147b8752..1c9f92e20 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/ReceiveDialog.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/ReceiveDialog.java @@ -55,7 +55,7 @@ public class ReceiveDialog extends BaseDialog { History item = event.getHistory(); binding.name.setText(item.getVodName()); binding.from.setText(event.getDevice().getName()); - ImgUtil.loadVod(item.getVodName(), item.getVodPic(), binding.image); + ImgUtil.load(item.getVodName(), item.getVodPic(), binding.image); } @Override diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/holder/VodListHolder.java b/app/src/mobile/java/com/fongmi/android/tv/ui/holder/VodListHolder.java index a567fdf30..deb06c771 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/holder/VodListHolder.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/holder/VodListHolder.java @@ -27,6 +27,6 @@ public class VodListHolder extends BaseVodHolder { binding.remark.setVisibility(item.getRemarkVisible()); binding.getRoot().setOnClickListener(v -> listener.onItemClick(item)); binding.getRoot().setOnLongClickListener(v -> listener.onLongClick(item)); - ImgUtil.load(item.getVodName(), item.getVodPic(), binding.image, false); + ImgUtil.load(item.getVodName(), item.getVodPic(), binding.image); } } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/holder/VodOneHolder.java b/app/src/mobile/java/com/fongmi/android/tv/ui/holder/VodOneHolder.java index 0330ab86d..e7b6d121f 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/holder/VodOneHolder.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/holder/VodOneHolder.java @@ -28,6 +28,6 @@ public class VodOneHolder extends BaseVodHolder { binding.remark.setVisibility(item.getRemarkVisible()); binding.getRoot().setOnClickListener(v -> listener.onItemClick(item)); binding.getRoot().setOnLongClickListener(v -> listener.onLongClick(item)); - ImgUtil.rect(item.getVodName(), item.getVodPic(), binding.image); + ImgUtil.load(item.getVodName(), item.getVodPic(), binding.image); } } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/holder/VodOvalHolder.java b/app/src/mobile/java/com/fongmi/android/tv/ui/holder/VodOvalHolder.java index c2e147015..39f92c469 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/holder/VodOvalHolder.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/holder/VodOvalHolder.java @@ -31,6 +31,6 @@ public class VodOvalHolder extends BaseVodHolder { binding.name.setVisibility(item.getNameVisible()); binding.getRoot().setOnClickListener(v -> listener.onItemClick(item)); binding.getRoot().setOnLongClickListener(v -> listener.onLongClick(item)); - ImgUtil.oval(item.getVodName(), item.getVodPic(), binding.image); + ImgUtil.load(item.getVodName(), item.getVodPic(), binding.image); } } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/holder/VodRectHolder.java b/app/src/mobile/java/com/fongmi/android/tv/ui/holder/VodRectHolder.java index ac6377694..8fa97263a 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/holder/VodRectHolder.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/holder/VodRectHolder.java @@ -37,6 +37,6 @@ public class VodRectHolder extends BaseVodHolder { binding.remark.setVisibility(item.getRemarkVisible()); binding.getRoot().setOnClickListener(v -> listener.onItemClick(item)); binding.getRoot().setOnLongClickListener(v -> listener.onLongClick(item)); - ImgUtil.rect(item.getVodName(), item.getVodPic(), binding.image); + ImgUtil.load(item.getVodName(), item.getVodPic(), binding.image); } } diff --git a/build.gradle b/build.gradle index 299ce2e8c..4d272d9f3 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { - id 'com.android.application' version '8.12.1' apply false - id 'com.android.library' version '8.12.1' apply false + id 'com.android.application' version '8.12.2' apply false + id 'com.android.library' version '8.12.2' apply false id 'com.chaquo.python' version '16.1.0' apply false }