Optimize wall load

pull/594/head
jhengazuki 7 months ago
parent e8bde7b8ac
commit 9994d93713
  1. 5
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/CastActivity.java
  2. 2
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java
  3. 6
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java
  4. 6
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/VideoActivity.java
  5. 32
      app/src/leanback/java/com/fongmi/android/tv/ui/base/BaseActivity.java
  6. 2
      app/src/main/java/com/fongmi/android/tv/api/EpgParser.java
  7. 23
      app/src/main/java/com/fongmi/android/tv/api/config/WallConfig.java
  8. 27
      app/src/main/java/com/fongmi/android/tv/impl/CustomTarget.java
  9. 25
      app/src/main/java/com/fongmi/android/tv/utils/ImgUtil.java
  10. 6
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java
  11. 6
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java
  12. 30
      app/src/mobile/java/com/fongmi/android/tv/ui/base/BaseActivity.java
  13. 2
      app/src/mobile/java/com/fongmi/android/tv/ui/fragment/VodFragment.java
  14. 4
      catvod/src/main/java/com/github/catvod/utils/Path.java
  15. 2
      quickjs/src/main/java/com/fongmi/quickjs/utils/Module.java

@ -71,6 +71,11 @@ public class CastActivity extends BaseActivity implements CustomKeyDownVod.Liste
activity.startActivity(new Intent(activity, CastActivity.class));
}
@Override
protected boolean customWall() {
return false;
}
@Override
protected ViewBinding getBinding() {
return mBinding = ActivityCastBinding.inflate(getLayoutInflater());

@ -296,7 +296,7 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen
}
private void setLogo() {
Glide.with(App.get()).load(UrlUtil.convert(VodConfig.get().getConfig().getLogo())).circleCrop().override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL).listener(getListener()).into(mBinding.logo);
Glide.with(mBinding.logo).load(UrlUtil.convert(VodConfig.get().getConfig().getLogo())).circleCrop().override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL).listener(getListener()).into(mBinding.logo);
}
private RequestListener<Drawable> getListener() {

@ -19,7 +19,6 @@ import androidx.media3.common.Player;
import androidx.recyclerview.widget.RecyclerView;
import androidx.viewbinding.ViewBinding;
import com.bumptech.glide.request.target.CustomTarget;
import com.bumptech.glide.request.transition.Transition;
import com.fongmi.android.tv.App;
import com.fongmi.android.tv.Constant;
@ -39,6 +38,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.impl.LiveCallback;
import com.fongmi.android.tv.impl.PassCallback;
import com.fongmi.android.tv.model.LiveViewModel;
@ -513,10 +513,6 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
mBinding.exo.setDefaultArtwork(resource);
}
@Override
public void onLoadCleared(@Nullable Drawable placeholder) {
}
});
}

@ -30,7 +30,6 @@ import androidx.media3.common.Player;
import androidx.recyclerview.widget.RecyclerView;
import androidx.viewbinding.ViewBinding;
import com.bumptech.glide.request.target.CustomTarget;
import com.bumptech.glide.request.transition.Transition;
import com.fongmi.android.tv.App;
import com.fongmi.android.tv.Constant;
@ -54,6 +53,7 @@ import com.fongmi.android.tv.event.ActionEvent;
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.CustomTarget;
import com.fongmi.android.tv.model.SiteViewModel;
import com.fongmi.android.tv.player.Players;
import com.fongmi.android.tv.player.exo.ExoUtil;
@ -920,10 +920,6 @@ public class VideoActivity extends BaseActivity implements CustomKeyDownVod.List
mBinding.exo.setDefaultArtwork(resource);
setMetadata();
}
@Override
public void onLoadCleared(@Nullable Drawable placeholder) {
}
});
}

@ -1,12 +1,16 @@
package com.fongmi.android.tv.ui.base;
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
import static android.widget.ImageView.ScaleType.CENTER_CROP;
import android.app.Activity;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.window.OnBackInvokedCallback;
import android.window.OnBackInvokedDispatcher;
@ -17,24 +21,20 @@ import androidx.leanback.widget.ArrayObjectAdapter;
import androidx.recyclerview.widget.RecyclerView;
import androidx.viewbinding.ViewBinding;
import com.fongmi.android.tv.R;
import com.fongmi.android.tv.Setting;
import com.fongmi.android.tv.api.config.WallConfig;
import com.fongmi.android.tv.event.RefreshEvent;
import com.fongmi.android.tv.utils.FileUtil;
import com.fongmi.android.tv.utils.ResUtil;
import com.fongmi.android.tv.utils.Util;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.io.File;
import me.jessyan.autosize.AutoSizeCompat;
public abstract class BaseActivity extends AppCompatActivity {
private OnBackInvokedCallback callback;
private ImageView wall;
protected abstract ViewBinding getBinding();
@ -52,7 +52,7 @@ public abstract class BaseActivity extends AppCompatActivity {
@Override
public void setContentView(View view) {
super.setContentView(view);
refreshWall();
if (customWall()) addWallView();
}
protected Activity getActivity() {
@ -94,15 +94,11 @@ public abstract class BaseActivity extends AppCompatActivity {
}
}
private void refreshWall() {
try {
if (!customWall()) return;
File file = FileUtil.getWall(Setting.getWall());
if (file.exists() && file.length() > 0) getWindow().setBackgroundDrawable(Drawable.createFromPath(file.getAbsolutePath()));
else getWindow().setBackgroundDrawableResource(ResUtil.getDrawable(file.getName()));
} catch (Exception e) {
getWindow().setBackgroundDrawableResource(R.drawable.wallpaper_1);
}
private void addWallView() {
wall = new ImageView(this);
wall.setScaleType(CENTER_CROP);
((ViewGroup) findViewById(android.R.id.content)).addView(wall, 0, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));
WallConfig.refresh(wall);
}
private Resources hackResources(Resources resources) {
@ -116,7 +112,7 @@ public abstract class BaseActivity extends AppCompatActivity {
@Subscribe(threadMode = ThreadMode.MAIN)
public void onRefreshEvent(RefreshEvent event) {
if (event.getType() == RefreshEvent.Type.WALL) refreshWall();
if (event.getType() == RefreshEvent.Type.WALL && customWall()) WallConfig.refresh(wall);
}
@Override

@ -41,7 +41,7 @@ public class EpgParser {
}
private static boolean shouldDownload(File file) {
return !file.exists() || !isToday(file.lastModified()) || System.currentTimeMillis() - file.lastModified() > TimeUnit.HOURS.toMillis(6);
return !Path.exists(file) || !isToday(file.lastModified()) || System.currentTimeMillis() - file.lastModified() > TimeUnit.HOURS.toMillis(6);
}
private static boolean isToday(long millis) {

@ -1,10 +1,8 @@
package com.fongmi.android.tv.api.config;
import android.graphics.Bitmap;
import android.text.TextUtils;
import android.widget.ImageView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.fongmi.android.tv.App;
import com.fongmi.android.tv.R;
import com.fongmi.android.tv.Setting;
@ -12,6 +10,7 @@ import com.fongmi.android.tv.bean.Config;
import com.fongmi.android.tv.event.RefreshEvent;
import com.fongmi.android.tv.impl.Callback;
import com.fongmi.android.tv.utils.FileUtil;
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.UrlUtil;
@ -19,7 +18,6 @@ import com.github.catvod.net.OkHttp;
import com.github.catvod.utils.Path;
import java.io.File;
import java.io.FileOutputStream;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@ -79,7 +77,7 @@ public class WallConfig {
private void loadConfig(Callback callback) {
try {
File file = write(FileUtil.getWall(0));
if (file.exists() && file.length() > 0) refresh(0);
if (Path.exists(file)) refresh(0);
else config(Config.find(VodConfig.get().getWall(), 2));
App.post(callback::success);
config.update();
@ -90,12 +88,9 @@ public class WallConfig {
}
}
private File write(File file) throws Exception {
private File write(File file) {
if (TextUtils.isEmpty(getUrl())) return file;
Path.write(file, OkHttp.bytes(UrlUtil.convert(getUrl())));
Bitmap bitmap = Glide.with(App.get()).asBitmap().load(file).centerCrop().override(ResUtil.getScreenWidth(), ResUtil.getScreenHeight()).diskCacheStrategy(DiskCacheStrategy.NONE).submit().get();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, new FileOutputStream(file));
bitmap.recycle();
return file;
}
@ -107,4 +102,14 @@ public class WallConfig {
Setting.putWall(index);
RefreshEvent.wall();
}
public static void refresh(ImageView view) {
try {
File file = FileUtil.getWall(Setting.getWall());
if (Path.exists(file)) ImgUtil.load(file, view);
else view.setImageResource(ResUtil.getDrawable(file.getName()));
} catch (Exception e) {
view.setImageResource(R.drawable.wallpaper_1);
}
}
}

@ -0,0 +1,27 @@
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<T> extends com.bumptech.glide.request.target.CustomTarget<T> {
public CustomTarget() {
super();
}
public CustomTarget(int width, int height) {
super(width, height);
}
@Override
public void onResourceReady(@NonNull T resource, @Nullable Transition<? super T> transition) {
}
@Override
public void onLoadCleared(@Nullable Drawable placeholder) {
}
}

@ -3,7 +3,6 @@ package com.fongmi.android.tv.utils;
import static android.widget.ImageView.ScaleType.CENTER_CROP;
import static android.widget.ImageView.ScaleType.FIT_CENTER;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
import android.view.View;
@ -14,16 +13,19 @@ import androidx.annotation.Nullable;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.DataSource;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.engine.GlideException;
import com.bumptech.glide.load.model.GlideUrl;
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.request.transition.Transition;
import com.fongmi.android.tv.App;
import com.fongmi.android.tv.impl.CustomTarget;
import com.github.catvod.utils.Json;
import com.google.common.net.HttpHeaders;
import java.io.File;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
@ -35,7 +37,7 @@ public class ImgUtil {
private static final Set<String> failed = new HashSet<>();
public static void load(String url, CustomTarget<Drawable> target) {
Glide.with(App.get()).asDrawable().load(getUrl(url)).into(target);
Glide.with(App.get()).load(getUrl(url)).into(target);
}
public static void load(String text, String url, ImageView view) {
@ -45,7 +47,16 @@ public class ImgUtil {
public static void load(String text, String url, ImageView view, boolean vod) {
if (!vod) view.setVisibility(TextUtils.isEmpty(url) ? View.GONE : View.VISIBLE);
if (TextUtils.isEmpty(url) || failed.contains(url)) view.setImageDrawable(getTextDrawable(text, vod));
else view.post(() -> Glide.with(App.get()).asBitmap().load(getUrl(url)).override(view.getWidth(), view.getHeight()).listener(getListener(text, url, view, vod)).into(view));
else view.post(() -> Glide.with(view).load(getUrl(url)).override(view.getWidth(), view.getHeight()).dontAnimate().listener(getListener(text, url, view, vod)).into(view));
}
public static void load(File file, ImageView view) {
Glide.with(view).load(file).dontAnimate().skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.NONE).into(new CustomTarget<Drawable>() {
@Override
public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
view.setImageDrawable(resource);
}
});
}
public static Object getUrl(String url) {
@ -73,17 +84,17 @@ public class ImgUtil {
return builder.buildRoundRect(text, ColorGenerator.get400(text), ResUtil.dp2px(4));
}
private static RequestListener<Bitmap> getListener(String text, String url, ImageView view, boolean vod) {
private static RequestListener<Drawable> getListener(String text, String url, ImageView view, boolean vod) {
return new RequestListener<>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, @NonNull Target<Bitmap> target, boolean isFirstResource) {
public boolean onLoadFailed(@Nullable GlideException e, Object model, @NonNull Target<Drawable> target, boolean isFirstResource) {
view.setImageDrawable(getTextDrawable(text, vod));
failed.add(url);
return true;
}
@Override
public boolean onResourceReady(@NonNull Bitmap resource, @NonNull Object model, Target<Bitmap> target, @NonNull DataSource dataSource, boolean isFirstResource) {
public boolean onResourceReady(@NonNull Drawable resource, @NonNull Object model, Target<Drawable> target, @NonNull DataSource dataSource, boolean isFirstResource) {
view.setScaleType(vod ? CENTER_CROP : FIT_CENTER);
return false;
}

@ -18,7 +18,6 @@ import androidx.media3.common.C;
import androidx.media3.common.Player;
import androidx.viewbinding.ViewBinding;
import com.bumptech.glide.request.target.CustomTarget;
import com.bumptech.glide.request.transition.Transition;
import com.fongmi.android.tv.App;
import com.fongmi.android.tv.Constant;
@ -39,6 +38,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.impl.LiveCallback;
import com.fongmi.android.tv.impl.PassCallback;
import com.fongmi.android.tv.model.LiveViewModel;
@ -529,10 +529,6 @@ public class LiveActivity extends BaseActivity implements CustomKeyDown.Listener
public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
mBinding.exo.setDefaultArtwork(resource);
}
@Override
public void onLoadCleared(@Nullable Drawable placeholder) {
}
});
}

@ -33,7 +33,6 @@ import androidx.media3.common.Player;
import androidx.recyclerview.widget.RecyclerView;
import androidx.viewbinding.ViewBinding;
import com.bumptech.glide.request.target.CustomTarget;
import com.bumptech.glide.request.transition.Transition;
import com.fongmi.android.tv.App;
import com.fongmi.android.tv.Constant;
@ -59,6 +58,7 @@ import com.fongmi.android.tv.event.CastEvent;
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.CustomTarget;
import com.fongmi.android.tv.model.SiteViewModel;
import com.fongmi.android.tv.player.Players;
import com.fongmi.android.tv.player.exo.ExoUtil;
@ -989,10 +989,6 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo
mBinding.exo.setDefaultArtwork(resource);
setMetadata();
}
@Override
public void onLoadCleared(@Nullable Drawable placeholder) {
}
});
}

@ -1,14 +1,17 @@
package com.fongmi.android.tv.ui.base;
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
import static android.widget.ImageView.ScaleType.CENTER_CROP;
import android.app.Activity;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.view.DisplayCutout;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.ImageView;
import android.window.OnBackInvokedCallback;
import android.window.OnBackInvokedDispatcher;
@ -16,21 +19,18 @@ import androidx.activity.OnBackPressedCallback;
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewbinding.ViewBinding;
import com.fongmi.android.tv.R;
import com.fongmi.android.tv.Setting;
import com.fongmi.android.tv.api.config.WallConfig;
import com.fongmi.android.tv.event.RefreshEvent;
import com.fongmi.android.tv.utils.FileUtil;
import com.fongmi.android.tv.utils.ResUtil;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.io.File;
public abstract class BaseActivity extends AppCompatActivity {
private OnBackInvokedCallback callback;
private ImageView wall;
protected abstract ViewBinding getBinding();
@ -48,7 +48,7 @@ public abstract class BaseActivity extends AppCompatActivity {
@Override
public void setContentView(View view) {
super.setContentView(view);
refreshWall();
if (customWall()) addWallView();
}
protected Activity getActivity() {
@ -117,20 +117,16 @@ public abstract class BaseActivity extends AppCompatActivity {
activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
}
private void refreshWall() {
try {
if (!customWall()) return;
File file = FileUtil.getWall(Setting.getWall());
if (file.exists() && file.length() > 0) getWindow().setBackgroundDrawable(Drawable.createFromPath(file.getAbsolutePath()));
else getWindow().setBackgroundDrawableResource(ResUtil.getDrawable(file.getName()));
} catch (Exception e) {
getWindow().setBackgroundDrawableResource(R.drawable.wallpaper_1);
}
private void addWallView() {
wall = new ImageView(this);
wall.setScaleType(CENTER_CROP);
((ViewGroup) findViewById(android.R.id.content)).addView(wall, 0, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));
WallConfig.refresh(wall);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onRefreshEvent(RefreshEvent event) {
if (event.getType() == RefreshEvent.Type.WALL) refreshWall();
if (event.getType() == RefreshEvent.Type.WALL && customWall()) WallConfig.refresh(wall);
}
protected void onBackInvoked() {

@ -220,7 +220,7 @@ public class VodFragment extends BaseFragment implements ConfigCallback, SiteCal
}
private void setLogo() {
Glide.with(App.get()).load(UrlUtil.convert(VodConfig.get().getConfig().getLogo())).circleCrop().override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL).error(R.drawable.ic_logo).listener(getListener()).into(mBinding.logo);
Glide.with(mBinding.logo).load(UrlUtil.convert(VodConfig.get().getConfig().getLogo())).circleCrop().override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL).error(R.drawable.ic_logo).listener(getListener()).into(mBinding.logo);
}
private RequestListener<Drawable> getListener() {

@ -28,6 +28,10 @@ public class Path {
return new File(path.replace("file://", "")).exists();
}
public static boolean exists(File file) {
return file != null && file.exists() && file.length() > 0;
}
public static File root() {
return Environment.getExternalStorageDirectory();
}

@ -51,7 +51,7 @@ public class Module {
try {
Uri uri = Uri.parse(url);
File file = Path.js(uri.getLastPathSegment());
return file.exists() ? Path.read(file) : "";
return Path.exists(file) ? Path.read(file) : "";
} catch (Exception e) {
return "";
}

Loading…
Cancel
Save