From 152d730544be96271e61c27e1c2ded0295de0d15 Mon Sep 17 00:00:00 2001 From: jhengazuki Date: Thu, 2 Oct 2025 21:53:46 +0800 Subject: [PATCH 1/9] Fix bug --- .../com/fongmi/android/tv/utils/ResUtil.java | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/fongmi/android/tv/utils/ResUtil.java b/app/src/main/java/com/fongmi/android/tv/utils/ResUtil.java index 9bb8c6c45..1589878ed 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/ResUtil.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/ResUtil.java @@ -4,7 +4,6 @@ import android.content.Context; import android.content.res.Configuration; import android.content.res.TypedArray; import android.graphics.Paint; -import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Build; import android.util.DisplayMetrics; @@ -34,20 +33,20 @@ public class ResUtil { return context.getResources().getDisplayMetrics(); } - public static WindowManager getWindowManager(Context context) { - return (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); - } - public static int getScreenWidth() { return getScreenWidth(App.get()); } public static int getScreenWidth(Context context) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - Rect rect = getWindowManager(context).getCurrentWindowMetrics().getBounds(); - return isLand(context) ? Math.max(rect.width(), rect.height()) : Math.min(rect.width(), rect.height()); - } else { + WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + if (windowManager == null) { return getDisplayMetrics(context).widthPixels; + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + return windowManager.getCurrentWindowMetrics().getBounds().width(); + } else { + DisplayMetrics displayMetrics = new DisplayMetrics(); + windowManager.getDefaultDisplay().getMetrics(displayMetrics); + return displayMetrics.widthPixels; } } @@ -56,11 +55,15 @@ public class ResUtil { } public static int getScreenHeight(Context context) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - Rect rect = getWindowManager(context).getCurrentWindowMetrics().getBounds(); - return isLand(context) ? Math.min(rect.width(), rect.height()) : Math.max(rect.width(), rect.height()); - } else { + WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + if (windowManager == null) { return getDisplayMetrics(context).heightPixels; + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + return windowManager.getCurrentWindowMetrics().getBounds().height(); + } else { + DisplayMetrics displayMetrics = new DisplayMetrics(); + windowManager.getDefaultDisplay().getMetrics(displayMetrics); + return displayMetrics.heightPixels; } } From f7db005429aab3d165cfa1c83313633a16dbddad Mon Sep 17 00:00:00 2001 From: jhengazuki Date: Thu, 2 Oct 2025 21:54:21 +0800 Subject: [PATCH 2/9] Clean --- .../android/tv/ui/activity/HistoryActivity.java | 12 ++++++------ .../fongmi/android/tv/ui/activity/KeepActivity.java | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/HistoryActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/HistoryActivity.java index d79c79560..467a69dad 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/HistoryActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/HistoryActivity.java @@ -39,6 +39,12 @@ public class HistoryActivity extends BaseActivity implements HistoryAdapter.OnCl return mBinding = ActivityHistoryBinding.inflate(getLayoutInflater()); } + @Override + public void setSupportActionBar(@Nullable Toolbar toolbar) { + super.setSupportActionBar(toolbar); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + } + @Override protected void initView(Bundle savedInstanceState) { setSupportActionBar(mBinding.toolbar); @@ -46,12 +52,6 @@ public class HistoryActivity extends BaseActivity implements HistoryAdapter.OnCl getHistory(); } - @Override - public void setSupportActionBar(@Nullable Toolbar toolbar) { - super.setSupportActionBar(toolbar); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - } - private void setRecyclerView() { mBinding.recycler.setHasFixedSize(true); mBinding.recycler.setLayoutManager(new GridLayoutManager(this, Product.getColumn(this))); diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/KeepActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/KeepActivity.java index 6b14edbac..b6b001835 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/KeepActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/KeepActivity.java @@ -43,6 +43,12 @@ public class KeepActivity extends BaseActivity implements KeepAdapter.OnClickLis return mBinding = ActivityKeepBinding.inflate(getLayoutInflater()); } + @Override + public void setSupportActionBar(@Nullable Toolbar toolbar) { + super.setSupportActionBar(toolbar); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + } + @Override protected void initView(Bundle savedInstanceState) { setSupportActionBar(mBinding.toolbar); @@ -50,12 +56,6 @@ public class KeepActivity extends BaseActivity implements KeepAdapter.OnClickLis getKeep(); } - @Override - public void setSupportActionBar(@Nullable Toolbar toolbar) { - super.setSupportActionBar(toolbar); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - } - private void setRecyclerView() { mBinding.recycler.setHasFixedSize(true); mBinding.recycler.setLayoutManager(new GridLayoutManager(this, Product.getColumn(this))); From 085845a5e04af3b4cf6d92e3eb3b97eeeba53cb7 Mon Sep 17 00:00:00 2001 From: jhengazuki Date: Thu, 2 Oct 2025 22:28:51 +0800 Subject: [PATCH 3/9] Fix bug --- .../com/fongmi/android/tv/bean/Collect.java | 2 +- .../android/tv/model/SiteViewModel.java | 21 +++++++---- .../tv/ui/fragment/CollectFragment.java | 36 +++++++++++-------- 3 files changed, 38 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Collect.java b/app/src/main/java/com/fongmi/android/tv/bean/Collect.java index 0a09307bb..b8db64d34 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Collect.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Collect.java @@ -65,7 +65,7 @@ public class Collect implements Parcelable, Diffable { public boolean equals(@Nullable Object obj) { if (this == obj) return true; if (!(obj instanceof Collect it)) return false; - return getSite().equals(it.getSite()) && activated == it.activated; + return getSite().equals(it.getSite()); } @Override diff --git a/app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java b/app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java index dc8c33cf6..6a0d52cec 100644 --- a/app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java +++ b/app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java @@ -49,11 +49,20 @@ public class SiteViewModel extends ViewModel { private ExecutorService executor; public SiteViewModel() { - this.episode = new MutableLiveData<>(); - this.result = new MutableLiveData<>(); - this.player = new MutableLiveData<>(); - this.search = new MutableLiveData<>(); - this.action = new MutableLiveData<>(); + episode = new MutableLiveData<>(); + result = new MutableLiveData<>(); + player = new MutableLiveData<>(); + search = new MutableLiveData<>(); + action = new MutableLiveData<>(); + } + + public SiteViewModel init() { + search.setValue(null); + result.setValue(null); + player.setValue(null); + action.setValue(null); + episode.setValue(null); + return this; } public void setEpisode(Episode value) { @@ -271,7 +280,7 @@ public class SiteViewModel extends ViewModel { private void post(Site site, Result result) { if (result.getList().isEmpty()) return; for (Vod vod : result.getList()) vod.setSite(site); - this.search.postValue(result); + search.postValue(result); } private void execute(MutableLiveData result, Callable callable) { diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/CollectFragment.java b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/CollectFragment.java index 5745fd013..1f894ffc9 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/CollectFragment.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/CollectFragment.java @@ -91,18 +91,9 @@ public class CollectFragment extends BaseFragment implements MenuProvider, Colle } private void setViewModel() { - mViewModel = new ViewModelProvider(this).get(SiteViewModel.class); - mViewModel.search.observe(this, result -> { - if (mCollectAdapter.getPosition() == 0) mSearchAdapter.addItems(result.getList()); - mCollectAdapter.addItem(Collect.create(result.getList())); - mCollectAdapter.add(result.getList()); - }); - mViewModel.result.observe(this, result -> { - boolean same = !result.getList().isEmpty() && mCollectAdapter.getActivated().getSite().equals(result.getList().get(0).getSite()); - if (same) mCollectAdapter.getActivated().getList().addAll(result.getList()); - if (same) mSearchAdapter.addItems(result.getList()); - mScroller.endLoading(result); - }); + mViewModel = new ViewModelProvider(this).get(SiteViewModel.class).init(); + mViewModel.search.observe(this, this::setCollect); + mViewModel.result.observe(this, this::setSearch); } private List getSites() { @@ -112,9 +103,11 @@ public class CollectFragment extends BaseFragment implements MenuProvider, Colle } private void search() { + if (mExecutor != null) mExecutor.shutdownNow(); mExecutor = new PauseExecutor(20); - mCollectAdapter.setItems(List.of(Collect.all())); - for (Site site : getSites()) mExecutor.execute(() -> search(site, getKeyword())); + mCollectAdapter.setItems(List.of(Collect.all()), () -> { + for (Site site : getSites()) mExecutor.execute(() -> search(site, getKeyword())); + }); } private void search(Site site, String keyword) { @@ -124,6 +117,21 @@ public class CollectFragment extends BaseFragment implements MenuProvider, Colle } } + private void setCollect(Result result) { + if (result == null) return; + if (mCollectAdapter.getPosition() == 0) mSearchAdapter.addItems(result.getList()); + mCollectAdapter.addItem(Collect.create(result.getList())); + mCollectAdapter.add(result.getList()); + } + + private void setSearch(Result result) { + if (result == null) return; + boolean same = !result.getList().isEmpty() && mCollectAdapter.getActivated().getSite().equals(result.getList().get(0).getSite()); + if (same) mCollectAdapter.getActivated().getList().addAll(result.getList()); + if (same) mSearchAdapter.addItems(result.getList()); + mScroller.endLoading(result); + } + @Override public void onItemClick(int position, Collect item) { mSearchAdapter.setItems(item.getList(), () -> mBinding.recycler.scrollToPosition(0)); From 0afd1cd1a246c163df17045f9cede946f2f559b7 Mon Sep 17 00:00:00 2001 From: jhengazuki Date: Thu, 2 Oct 2025 22:36:15 +0800 Subject: [PATCH 4/9] Fix space --- .../java/com/fongmi/android/tv/Product.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/app/src/mobile/java/com/fongmi/android/tv/Product.java b/app/src/mobile/java/com/fongmi/android/tv/Product.java index a30cdfb4c..033e13039 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/Product.java +++ b/app/src/mobile/java/com/fongmi/android/tv/Product.java @@ -1,6 +1,8 @@ package com.fongmi.android.tv; import android.content.Context; +import android.os.Build; +import android.view.DisplayCutout; import com.fongmi.android.tv.bean.Style; import com.fongmi.android.tv.utils.ResUtil; @@ -27,14 +29,11 @@ public class Product { public static int[] getSpec(Context context, Style style) { int column = getColumn(context, style); - int space = ResUtil.dp2px(32) + ResUtil.dp2px(16 * (column - 1)); + int space = ResUtil.dp2px(32) + ResUtil.dp2px(16 * (column - 1)) + getCutout(context); if (style.isOval()) space += ResUtil.dp2px(column * 16); return getSpec(context, space, column, style); } - public static int[] getSpec(Context context, int space, int column) { - return getSpec(context, space, column, Style.rect()); - } private static int[] getSpec(Context context, int space, int column, Style style) { int base = ResUtil.getScreenWidth(context) - space; @@ -42,4 +41,13 @@ public class Product { int height = (int) (width / style.getRatio()); return new int[]{width, height}; } + + private static int getCutout(Context context) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) return 0; + DisplayCutout cutout = ResUtil.getDisplay(context).getCutout(); + if (cutout == null) return 0; + int left = cutout.getSafeInsetLeft(); + int right = cutout.getSafeInsetRight(); + return left | right; + } } From 2b9abec89e12436a6eeb8ad1c719e03d2e2e4fc6 Mon Sep 17 00:00:00 2001 From: jhengazuki Date: Thu, 2 Oct 2025 23:48:12 +0800 Subject: [PATCH 5/9] Fix bug --- .../java/com/fongmi/android/tv/ui/fragment/SearchFragment.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SearchFragment.java b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SearchFragment.java index fb3e5ce59..25fbec46d 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SearchFragment.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SearchFragment.java @@ -120,7 +120,8 @@ public class SearchFragment extends BaseFragment implements MenuProvider, WordAd } private void checkKeyword() { - if (TextUtils.isEmpty(getKeyword())) Util.showKeyboard(mBinding.keyword); + boolean visible = requireActivity().getSupportFragmentManager().findFragmentByTag(CollectFragment.class.getSimpleName()) != null; + if (TextUtils.isEmpty(getKeyword()) && !visible) Util.showKeyboard(mBinding.keyword); else setKeyword(getKeyword()); } From 8592b280a64a9f8fbdf75ce7c5c5174faa125dcf Mon Sep 17 00:00:00 2001 From: jhengazuki Date: Thu, 2 Oct 2025 23:48:48 +0800 Subject: [PATCH 6/9] Fix bug --- .../java/com/fongmi/android/tv/ui/fragment/SearchFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SearchFragment.java b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SearchFragment.java index 25fbec46d..beb769587 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SearchFragment.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SearchFragment.java @@ -121,7 +121,7 @@ public class SearchFragment extends BaseFragment implements MenuProvider, WordAd private void checkKeyword() { boolean visible = requireActivity().getSupportFragmentManager().findFragmentByTag(CollectFragment.class.getSimpleName()) != null; - if (TextUtils.isEmpty(getKeyword()) && !visible) Util.showKeyboard(mBinding.keyword); + if (TextUtils.isEmpty(getKeyword())) if (!visible) Util.showKeyboard(mBinding.keyword); else setKeyword(getKeyword()); } From f46b499b0429f1bd694ca0c2f9516c2532a71bfc Mon Sep 17 00:00:00 2001 From: jhengazuki Date: Thu, 2 Oct 2025 23:58:02 +0800 Subject: [PATCH 7/9] Optimize search result span count --- .../fongmi/android/tv/ui/fragment/CollectFragment.java | 8 ++++++++ app/src/mobile/res/layout/fragment_collect.xml | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/CollectFragment.java b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/CollectFragment.java index 1f894ffc9..dc884a5fd 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/CollectFragment.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/CollectFragment.java @@ -13,6 +13,7 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.core.view.MenuProvider; import androidx.lifecycle.Lifecycle; import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.GridLayoutManager; import androidx.viewbinding.ViewBinding; import com.fongmi.android.tv.api.config.VodConfig; @@ -88,6 +89,7 @@ public class CollectFragment extends BaseFragment implements MenuProvider, Colle mBinding.recycler.setHasFixedSize(true); mBinding.recycler.addOnScrollListener(mScroller); mBinding.recycler.setAdapter(mSearchAdapter = new SearchAdapter(this)); + ((GridLayoutManager) (mBinding.recycler.getLayoutManager())).setSpanCount(getCount()); } private void setViewModel() { @@ -117,6 +119,12 @@ public class CollectFragment extends BaseFragment implements MenuProvider, Colle } } + private int getCount() { + int count = ResUtil.isLand(requireActivity()) ? 2 : 1; + if (ResUtil.isPad()) count++; + return count; + } + private void setCollect(Result result) { if (result == null) return; if (mCollectAdapter.getPosition() == 0) mSearchAdapter.addItems(result.getList()); diff --git a/app/src/mobile/res/layout/fragment_collect.xml b/app/src/mobile/res/layout/fragment_collect.xml index b5bc4525f..47fd39244 100644 --- a/app/src/mobile/res/layout/fragment_collect.xml +++ b/app/src/mobile/res/layout/fragment_collect.xml @@ -44,7 +44,7 @@ android:paddingStart="0dp" android:paddingEnd="8dp" android:paddingBottom="8dp" - app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" + app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" tools:listitem="@layout/adapter_search" /> From 8fc6e12d813cf079921715de6af842bea8458282 Mon Sep 17 00:00:00 2001 From: jhengazuki Date: Thu, 2 Oct 2025 23:59:40 +0800 Subject: [PATCH 8/9] Revert --- app/src/main/java/com/fongmi/android/tv/utils/ResUtil.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/fongmi/android/tv/utils/ResUtil.java b/app/src/main/java/com/fongmi/android/tv/utils/ResUtil.java index 1589878ed..a457a2ed2 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/ResUtil.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/ResUtil.java @@ -4,6 +4,7 @@ import android.content.Context; import android.content.res.Configuration; import android.content.res.TypedArray; import android.graphics.Paint; +import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Build; import android.util.DisplayMetrics; @@ -42,7 +43,8 @@ public class ResUtil { if (windowManager == null) { return getDisplayMetrics(context).widthPixels; } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - return windowManager.getCurrentWindowMetrics().getBounds().width(); + Rect rect = windowManager.getCurrentWindowMetrics().getBounds(); + return isLand(context) ? Math.max(rect.width(), rect.height()) : Math.min(rect.width(), rect.height()); } else { DisplayMetrics displayMetrics = new DisplayMetrics(); windowManager.getDefaultDisplay().getMetrics(displayMetrics); @@ -59,7 +61,8 @@ public class ResUtil { if (windowManager == null) { return getDisplayMetrics(context).heightPixels; } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - return windowManager.getCurrentWindowMetrics().getBounds().height(); + Rect rect = windowManager.getCurrentWindowMetrics().getBounds(); + return isLand(context) ? Math.min(rect.width(), rect.height()) : Math.max(rect.width(), rect.height()); } else { DisplayMetrics displayMetrics = new DisplayMetrics(); windowManager.getDefaultDisplay().getMetrics(displayMetrics); From e2655e73a1fc342f7faa65843bf7a12745cac130 Mon Sep 17 00:00:00 2001 From: jhengazuki Date: Fri, 3 Oct 2025 00:02:32 +0800 Subject: [PATCH 9/9] Update build.gradle --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index f8c4ed943..ed5c02034 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,8 +11,8 @@ android { applicationId "com.fongmi.android.tv" minSdk 24 targetSdk 36 - versionCode 436 - versionName "4.3.6" + versionCode 437 + versionName "4.3.7" javaCompileOptions { annotationProcessorOptions { arguments = ["room.schemaLocation": "$projectDir/schemas".toString(), "eventBusIndex": "com.fongmi.android.tv.event.EventIndex"]