Clean image load

pull/594/head
jhengazuki 7 months ago
parent d1a55e7634
commit f0882af23b
  1. 4
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java
  2. 10
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java
  3. 2
      app/src/leanback/java/com/fongmi/android/tv/ui/adapter/KeepAdapter.java
  4. 2
      app/src/leanback/java/com/fongmi/android/tv/ui/holder/VodOvalHolder.java
  5. 2
      app/src/leanback/java/com/fongmi/android/tv/ui/holder/VodRectHolder.java
  6. 2
      app/src/leanback/java/com/fongmi/android/tv/ui/presenter/HistoryPresenter.java
  7. 73
      app/src/leanback/res/layout/activity_setting.xml
  8. 12
      app/src/main/java/com/fongmi/android/tv/Setting.java
  9. 2
      app/src/main/java/com/fongmi/android/tv/bean/Channel.java
  10. 6
      app/src/main/java/com/fongmi/android/tv/event/RefreshEvent.java
  11. 65
      app/src/main/java/com/fongmi/android/tv/utils/ImgUtil.java
  12. 10
      app/src/main/res/drawable/ic_img_error.xml
  13. 7
      app/src/main/res/values-zh-rCN/strings.xml
  14. 7
      app/src/main/res/values-zh-rTW/strings.xml
  15. 7
      app/src/main/res/values/strings.xml
  16. 2
      app/src/mobile/java/com/fongmi/android/tv/ui/adapter/HistoryAdapter.java
  17. 2
      app/src/mobile/java/com/fongmi/android/tv/ui/adapter/KeepAdapter.java
  18. 2
      app/src/mobile/java/com/fongmi/android/tv/ui/dialog/ReceiveDialog.java
  19. 2
      app/src/mobile/java/com/fongmi/android/tv/ui/holder/VodListHolder.java
  20. 2
      app/src/mobile/java/com/fongmi/android/tv/ui/holder/VodOneHolder.java
  21. 2
      app/src/mobile/java/com/fongmi/android/tv/ui/holder/VodOvalHolder.java
  22. 2
      app/src/mobile/java/com/fongmi/android/tv/ui/holder/VodRectHolder.java
  23. 4
      build.gradle

@ -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;

@ -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);

@ -91,7 +91,7 @@ public class KeepAdapter extends RecyclerView.Adapter<KeepAdapter.ViewHolder> {
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) {

@ -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);
}
}

@ -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);
}
}

@ -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) {

@ -161,7 +161,6 @@
android:background="@drawable/selector_item"
android:focusable="true"
android:focusableInTouchMode="true"
android:nextFocusDown="@id/player"
android:orientation="horizontal">
<TextView
@ -196,7 +195,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_home" />
@ -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">
<TextView
@ -294,69 +290,32 @@
</LinearLayout>
<LinearLayout
android:id="@+id/size"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:background="@drawable/selector_item"
android:focusable="true"
android:focusableInTouchMode="true"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/quality"
android:layout_width="0dp"
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_weight="1"
android:background="@drawable/selector_item"
android:focusable="true"
android:focusableInTouchMode="true"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:text="@string/setting_quality"
android:textColor="@color/white"
android:textSize="18sp" />
<TextView
android:id="@+id/qualityText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="end"
android:textColor="@color/white"
android:textSize="18sp"
tools:text="High" />
</LinearLayout>
android:text="@string/setting_size"
android:textColor="@color/white"
android:textSize="18sp" />
<LinearLayout
android:id="@+id/size"
android:layout_width="0dp"
<TextView
android:id="@+id/sizeText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/selector_item"
android:focusable="true"
android:focusableInTouchMode="true"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:text="@string/setting_size"
android:textColor="@color/white"
android:textSize="18sp" />
<TextView
android:id="@+id/sizeText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="end"
android:textColor="@color/white"
android:textSize="18sp"
tools:text="Medium" />
android:gravity="end"
android:textColor="@color/white"
android:textSize="18sp"
tools:text="Medium" />
</LinearLayout>
</LinearLayout>
<LinearLayout

@ -73,14 +73,6 @@ public class Setting {
Prefers.put("render", render);
}
public static int getQuality() {
return Prefers.getInt("quality", 2);
}
public static void putQuality(int quality) {
Prefers.put("quality", quality);
}
public static int getSize() {
return Prefers.getInt("size", 2);
}
@ -281,10 +273,6 @@ public class Setting {
Prefers.put("subtitle_position", value);
}
public static float getThumbnail() {
return 0.3f * getQuality() + 0.4f;
}
public static boolean isBackgroundOff() {
return getBackground() == 0;
}

@ -280,7 +280,7 @@ public class Channel {
}
public void loadLogo(ImageView view) {
ImgUtil.loadLive(getLogo(), view);
ImgUtil.load(getName(), getLogo(), view, false);
}
public void addUrls(String... urls) {

@ -14,10 +14,6 @@ public class RefreshEvent {
EventBus.getDefault().post(new RefreshEvent(Type.CONFIG));
}
public static void image() {
EventBus.getDefault().post(new RefreshEvent(Type.IMAGE));
}
public static void video() {
EventBus.getDefault().post(new RefreshEvent(Type.VIDEO));
}
@ -89,6 +85,6 @@ public class RefreshEvent {
}
public enum Type {
CONFIG, IMAGE, VIDEO, HISTORY, KEEP, SIZE, WALL, LIVE, DETAIL, PLAYER, SUBTITLE, DANMAKU, VOD
CONFIG, VIDEO, HISTORY, KEEP, SIZE, WALL, LIVE, DETAIL, PLAYER, SUBTITLE, DANMAKU, VOD
}
}

@ -1,11 +1,9 @@
package com.fongmi.android.tv.utils;
import static android.widget.ImageView.ScaleType.CENTER;
import static android.widget.ImageView.ScaleType.CENTER_CROP;
import static android.widget.ImageView.ScaleType.FIT_CENTER;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
import android.view.View;
@ -22,10 +20,7 @@ import com.bumptech.glide.load.model.LazyHeaders;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.target.CustomTarget;
import com.bumptech.glide.request.target.Target;
import com.bumptech.glide.signature.ObjectKey;
import com.fongmi.android.tv.App;
import com.fongmi.android.tv.R;
import com.fongmi.android.tv.Setting;
import com.github.catvod.utils.Json;
import com.google.common.net.HttpHeaders;
@ -35,43 +30,17 @@ import jahirfiquitiva.libs.textdrawable.TextDrawable;
public class ImgUtil {
private static ObjectKey getSignature(String url) {
return new ObjectKey(url + "_" + Setting.getQuality());
}
public static void load(String url, CustomTarget<Drawable> 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<String, String> entry : map.entrySet()) builder.addHeader(UrlUtil.fixHeader(entry.getKey()), entry.getValue());
}
private static RequestListener<Bitmap> 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<Bitmap> getListener(String text, ImageView view, boolean vod) {
return new RequestListener<>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, @NonNull Target<Bitmap> 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);
}
}

@ -1,10 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="48dp"
android:height="48dp"
android:tint="@color/white"
android:viewportWidth="960"
android:viewportHeight="960">
<path
android:fillColor="@android:color/white"
android:pathData="M200,840Q167,840 143.5,816.5Q120,793 120,760L120,200Q120,167 143.5,143.5Q167,120 200,120L760,120Q793,120 816.5,143.5Q840,167 840,200L840,760Q840,793 816.5,816.5Q793,840 760,840L200,840ZM240,503L400,343L560,503L720,343L760,383L760,200Q760,200 760,200Q760,200 760,200L200,200Q200,200 200,200Q200,200 200,200L200,463L240,503ZM200,760L760,760Q760,760 760,760Q760,760 760,760L760,496L720,456L560,616L400,456L240,616L200,576L200,760Q200,760 200,760Q200,760 200,760ZM200,760L200,760Q200,760 200,760Q200,760 200,760L200,496L200,576L200,463L200,383L200,200Q200,200 200,200Q200,200 200,200L200,200Q200,200 200,200Q200,200 200,200L200,463L200,463L200,576L200,576L200,760Q200,760 200,760Q200,760 200,760Z" />
</vector>

@ -69,7 +69,6 @@
<string name="setting_wall">壁纸</string>
<string name="setting_player">播放设置</string>
<string name="setting_incognito">无痕模式</string>
<string name="setting_quality">图片品质</string>
<string name="setting_size">图片尺寸</string>
<string name="setting_doh">DoH</string>
<string name="setting_proxy">Proxy</string>
@ -158,12 +157,6 @@
<item>硬解</item>
</string-array>
<string-array name="select_quality">
<item></item>
<item></item>
<item></item>
</string-array>
<string-array name="select_size">
<item></item>
<item></item>

@ -69,7 +69,6 @@
<string name="setting_wall">壁紙</string>
<string name="setting_player">播放設定</string>
<string name="setting_incognito">無痕模式</string>
<string name="setting_quality">圖片品質</string>
<string name="setting_size">圖片尺寸</string>
<string name="setting_doh">DoH</string>
<string name="setting_proxy">Proxy</string>
@ -158,12 +157,6 @@
<item>硬解</item>
</string-array>
<string-array name="select_quality">
<item></item>
<item></item>
<item></item>
</string-array>
<string-array name="select_size">
<item></item>
<item></item>

@ -70,7 +70,6 @@
<string name="setting_wall">Wallpaper</string>
<string name="setting_player">Player setting</string>
<string name="setting_incognito">Incognito mode</string>
<string name="setting_quality">Image quality</string>
<string name="setting_size">Image size</string>
<string name="setting_doh">DoH</string>
<string name="setting_proxy">Proxy</string>
@ -164,12 +163,6 @@
<item>Texture</item>
</string-array>
<string-array name="select_quality">
<item>Low</item>
<item>Medium</item>
<item>High</item>
</string-array>
<string-array name="select_size">
<item>Small</item>
<item>Medium</item>

@ -98,7 +98,7 @@ public class HistoryAdapter extends RecyclerView.Adapter<HistoryAdapter.ViewHold
holder.binding.progress.setProgress((int) item.getPosition(), animate);
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);
setClickListener(holder.binding.getRoot(), item);
}

@ -92,7 +92,7 @@ public class KeepAdapter extends RecyclerView.Adapter<KeepAdapter.ViewHolder> {
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);
}

@ -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

@ -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);
}
}

@ -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);
}
}

@ -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);
}
}

@ -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);
}
}

@ -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
}

Loading…
Cancel
Save