From 76e9fc6819cc732367c4500add7aa388e88d593b Mon Sep 17 00:00:00 2001 From: FongMi Date: Mon, 22 Dec 2025 15:28:22 +0800 Subject: [PATCH] Optimize filters --- .../com/fongmi/android/tv/bean/Cache.java | 42 +++++++++++++++++++ .../android/tv/ui/activity/HomeActivity.java | 2 + .../android/tv/ui/activity/VodActivity.java | 3 +- .../tv/ui/fragment/FolderFragment.java | 12 +++++- .../android/tv/ui/fragment/TypeFragment.java | 15 +++---- .../tv/ui/presenter/TypePresenter.java | 3 +- .../com/fongmi/android/tv/bean/Class.java | 15 ------- .../tv/ui/fragment/FolderFragment.java | 9 +++- .../android/tv/ui/fragment/VodFragment.java | 4 +- 9 files changed, 75 insertions(+), 30 deletions(-) create mode 100644 app/src/leanback/java/com/fongmi/android/tv/bean/Cache.java diff --git a/app/src/leanback/java/com/fongmi/android/tv/bean/Cache.java b/app/src/leanback/java/com/fongmi/android/tv/bean/Cache.java new file mode 100644 index 000000000..4e8c42dec --- /dev/null +++ b/app/src/leanback/java/com/fongmi/android/tv/bean/Cache.java @@ -0,0 +1,42 @@ +package com.fongmi.android.tv.bean; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Cache { + + private final Map> cache; + + private static class Loader { + static volatile Cache INSTANCE = new Cache(); + } + + private static Cache get() { + return Loader.INSTANCE; + } + + public Cache() { + cache = new HashMap<>(); + } + + public void put(Result result) { + if (result == null) return; + result.getTypes().forEach(type -> get().cache.put(type.getTypeId(), type.getFilters())); + } + + public static List get(Class type) { + return get(type.getTypeId()); + } + + public static List get(String typeId) { + List filters = get().cache.get(typeId); + return filters == null ? Collections.emptyList() : filters; + } + + public static Cache clear() { + get().cache.clear(); + return get(); + } +} 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 9c05d80b0..c4c6f3db4 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 @@ -27,6 +27,7 @@ import com.fongmi.android.tv.Updater; import com.fongmi.android.tv.api.config.LiveConfig; import com.fongmi.android.tv.api.config.VodConfig; import com.fongmi.android.tv.api.config.WallConfig; +import com.fongmi.android.tv.bean.Cache; import com.fongmi.android.tv.bean.Config; import com.fongmi.android.tv.bean.Func; import com.fongmi.android.tv.bean.History; @@ -171,6 +172,7 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen mViewModel.result.observe(this, result -> { mAdapter.remove("progress"); addVideo(mResult = result); + Cache.clear().put(result); }); } diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VodActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VodActivity.java index c08efcc53..11f06c094 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VodActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/VodActivity.java @@ -132,10 +132,9 @@ public class VodActivity extends BaseActivity implements TypePresenter.OnClickLi } private void updateFilter(Class item) { - if (!item.hasFilter()) return; item.setFilter(!item.getFilter()); getFragment().toggleFilter(item.getFilter()); - mAdapter.notifyArrayItemRangeChanged(0, mAdapter.size()); + mAdapter.notifyArrayItemRangeChanged(mAdapter.indexOf(item), 1); } public void closeFilter() { diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/FolderFragment.java b/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/FolderFragment.java index cdef44073..c990bb6cc 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/FolderFragment.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/FolderFragment.java @@ -10,7 +10,9 @@ import androidx.fragment.app.FragmentTransaction; import androidx.viewbinding.ViewBinding; import com.fongmi.android.tv.R; +import com.fongmi.android.tv.bean.Cache; import com.fongmi.android.tv.bean.Class; +import com.fongmi.android.tv.bean.Filter; import com.fongmi.android.tv.databinding.FragmentFolderBinding; import com.fongmi.android.tv.ui.activity.VodActivity; import com.fongmi.android.tv.ui.base.BaseFragment; @@ -56,11 +58,17 @@ public class FolderFragment extends BaseFragment { @Override protected void initView() { mType = getType(); - getChildFragmentManager().beginTransaction().replace(R.id.container, TypeFragment.newInstance(getKey(), mType.getTypeId(), mType.getStyle(), mType.getFilters(), mType.getExtend(false), mType.isFolder())).commit(); + getChildFragmentManager().beginTransaction().replace(R.id.container, TypeFragment.newInstance(getKey(), mType.getTypeId(), mType.getStyle(), getExtend(), mType.isFolder())).commit(); + } + + private HashMap getExtend() { + HashMap extend = new HashMap<>(); + for (Filter filter : Cache.get(mType)) if (filter.getInit() != null) extend.put(filter.getKey(), filter.getInit()); + return extend; } public void openFolder(String typeId, HashMap extend) { - TypeFragment next = TypeFragment.newInstance(getKey(), typeId, mType.getStyle(), mType.getFilters(), extend, mType.isFolder()); + TypeFragment next = TypeFragment.newInstance(getKey(), typeId, mType.getStyle(), extend, mType.isFolder()); FragmentTransaction ft = getChildFragmentManager().beginTransaction(); Optional.ofNullable(getParent()).ifPresent(VodActivity::closeFilter); Optional.ofNullable(getChild()).ifPresent(ft::hide); diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/TypeFragment.java b/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/TypeFragment.java index eb70f192d..12d2e84d5 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/TypeFragment.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/TypeFragment.java @@ -19,6 +19,7 @@ import androidx.viewbinding.ViewBinding; import com.fongmi.android.tv.Product; import com.fongmi.android.tv.R; import com.fongmi.android.tv.api.config.VodConfig; +import com.fongmi.android.tv.bean.Cache; import com.fongmi.android.tv.bean.Filter; import com.fongmi.android.tv.bean.Result; import com.fongmi.android.tv.bean.Site; @@ -56,14 +57,13 @@ public class TypeFragment extends BaseFragment implements CustomScroller.Callbac private boolean headerVisible; private boolean filterVisible; - public static TypeFragment newInstance(String key, String typeId, Style style, List filter, HashMap extend, boolean folder) { + public static TypeFragment newInstance(String key, String typeId, Style style, HashMap extend, boolean folder) { Bundle args = new Bundle(); args.putString("key", key); args.putString("typeId", typeId); args.putBoolean("folder", folder); args.putParcelable("style", style); args.putSerializable("extend", extend); - args.putParcelableArrayList("filter", new ArrayList<>(filter)); TypeFragment fragment = new TypeFragment(); fragment.setArguments(args); return fragment; @@ -85,14 +85,14 @@ public class TypeFragment extends BaseFragment implements CustomScroller.Callbac return isFolder() ? Style.list() : getSite().getStyle(getArguments().getParcelable("style")); } - private List getFilter() { - return getArguments().getParcelableArrayList("filter"); - } - private HashMap getExtend() { return (HashMap) getArguments().getSerializable("extend"); } + private List getFilter() { + return Cache.get(getTypeId()); + } + private Site getSite() { return VodConfig.get().getSite(getKey()); } @@ -110,8 +110,8 @@ public class TypeFragment extends BaseFragment implements CustomScroller.Callbac protected void initView() { mBinding.swipeLayout.setColorSchemeResources(R.color.accent); mScroller = new CustomScroller(this); - mFilters = getFilter(); mExtends = getExtend(); + mFilters = getFilter(); setRecyclerView(); setViewModel(); setFilters(); @@ -231,6 +231,7 @@ public class TypeFragment extends BaseFragment implements CustomScroller.Callbac } public void toggleFilter(boolean visible) { + if (mFilters.isEmpty()) return; this.filterVisible = visible; if (visible) showFilter(); else hideFilter(); diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/TypePresenter.java b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/TypePresenter.java index f3a089911..99f8c61c1 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/TypePresenter.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/TypePresenter.java @@ -7,6 +7,7 @@ import androidx.annotation.NonNull; import androidx.leanback.widget.Presenter; import com.fongmi.android.tv.R; +import com.fongmi.android.tv.bean.Cache; import com.fongmi.android.tv.bean.Class; import com.fongmi.android.tv.databinding.AdapterTypeBinding; import com.fongmi.android.tv.utils.ResUtil; @@ -48,7 +49,7 @@ public class TypePresenter extends Presenter { } private int getIcon(Class item) { - return !item.hasFilter() ? 0 : item.getFilter() ? R.drawable.ic_vod_filter_off : R.drawable.ic_vod_filter_on; + return Cache.get(item).isEmpty() ? 0 : item.getFilter() ? R.drawable.ic_vod_filter_off : R.drawable.ic_vod_filter_on; } public static class ViewHolder extends Presenter.ViewHolder { diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Class.java b/app/src/main/java/com/fongmi/android/tv/bean/Class.java index 395b4b092..aed0545d9 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Class.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Class.java @@ -15,9 +15,7 @@ import org.simpleframework.xml.Attribute; import org.simpleframework.xml.Root; import org.simpleframework.xml.Text; -import java.util.ArrayList; import java.util.Collections; -import java.util.HashMap; import java.util.List; @Root(strict = false) @@ -124,10 +122,6 @@ public class Class implements Parcelable, Diffable { return "1".equals(getTypeFlag()); } - public boolean hasFilter() { - return !getFilters().isEmpty(); - } - public void trans() { if (Trans.pass()) return; this.typeName = Trans.s2t(typeName); @@ -137,12 +131,6 @@ public class Class implements Parcelable, Diffable { return Style.get(getLand(), getCircle(), getRatio()); } - public HashMap getExtend(boolean change) { - HashMap extend = new HashMap<>(); - for (Filter filter : getFilters()) if (filter.getInit() != null) extend.put(filter.getKey(), change ? filter.setActivated(filter.getInit()) : filter.getInit()); - return extend; - } - @Override public boolean equals(@Nullable Object obj) { if (this == obj) return true; @@ -165,7 +153,6 @@ public class Class implements Parcelable, Diffable { dest.writeString(this.typeId); dest.writeString(this.typeName); dest.writeString(this.typeFlag); - dest.writeList(this.filters); dest.writeByte(this.filter ? (byte) 1 : (byte) 0); dest.writeInt(this.land); dest.writeInt(this.circle); @@ -177,8 +164,6 @@ public class Class implements Parcelable, Diffable { this.typeId = in.readString(); this.typeName = in.readString(); this.typeFlag = in.readString(); - this.filters = new ArrayList<>(); - in.readList(this.filters, Filter.class.getClassLoader()); this.filter = in.readByte() != 0; this.land = in.readInt(); this.circle = in.readInt(); diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/FolderFragment.java b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/FolderFragment.java index f867a1867..bd0fb2b1e 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/FolderFragment.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/FolderFragment.java @@ -11,6 +11,7 @@ import androidx.viewbinding.ViewBinding; import com.fongmi.android.tv.R; import com.fongmi.android.tv.bean.Class; +import com.fongmi.android.tv.bean.Filter; import com.fongmi.android.tv.bean.Result; import com.fongmi.android.tv.bean.Value; import com.fongmi.android.tv.databinding.FragmentFolderBinding; @@ -61,7 +62,13 @@ public class FolderFragment extends BaseFragment { @Override protected void initView() { mType = getType(); - getChildFragmentManager().beginTransaction().replace(R.id.container, TypeFragment.newInstance(getKey(), mType.getTypeId(), mType.getStyle(), mType.getExtend(true), mType.isFolder(), getY())).commit(); + getChildFragmentManager().beginTransaction().replace(R.id.container, TypeFragment.newInstance(getKey(), mType.getTypeId(), mType.getStyle(), getExtend(), mType.isFolder(), getY())).commit(); + } + + private HashMap getExtend() { + HashMap extend = new HashMap<>(); + for (Filter filter : mType.getFilters()) if (filter.getInit() != null) extend.put(filter.getKey(), filter.setActivated(filter.getInit())); + return extend; } public void openFolder(String typeId, HashMap extend) { diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/VodFragment.java b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/VodFragment.java index 2d782aee8..0267a6a5d 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/VodFragment.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/VodFragment.java @@ -147,11 +147,11 @@ public class VodFragment extends BaseFragment implements ConfigCallback, SiteCal mBinding.top.setVisibility(View.INVISIBLE); mBinding.link.setVisibility(View.VISIBLE); mBinding.filter.setVisibility(View.GONE); - } else if (mAdapter.get(position).hasFilter()) { + } else if (!mAdapter.get(position).getFilters().isEmpty()) { mBinding.top.setVisibility(View.INVISIBLE); mBinding.link.setVisibility(View.GONE); mBinding.filter.show(); - } else if (position == 0 || !mAdapter.get(position).hasFilter()) { + } else if (position == 0 || mAdapter.get(position).getFilters().isEmpty()) { mBinding.top.setVisibility(View.INVISIBLE); mBinding.filter.setVisibility(View.GONE); mBinding.link.show();