diff --git a/app/build.gradle b/app/build.gradle index 848978f3a..732b8441b 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"] 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/main/java/com/fongmi/android/tv/utils/ResUtil.java b/app/src/main/java/com/fongmi/android/tv/utils/ResUtil.java index 9bb8c6c45..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 @@ -34,20 +34,21 @@ 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(); + 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) { + Rect rect = windowManager.getCurrentWindowMetrics().getBounds(); return isLand(context) ? Math.max(rect.width(), rect.height()) : Math.min(rect.width(), rect.height()); } else { - return getDisplayMetrics(context).widthPixels; + DisplayMetrics displayMetrics = new DisplayMetrics(); + windowManager.getDefaultDisplay().getMetrics(displayMetrics); + return displayMetrics.widthPixels; } } @@ -56,11 +57,16 @@ public class ResUtil { } public static int getScreenHeight(Context context) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - Rect rect = getWindowManager(context).getCurrentWindowMetrics().getBounds(); + 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) { + Rect rect = windowManager.getCurrentWindowMetrics().getBounds(); return isLand(context) ? Math.min(rect.width(), rect.height()) : Math.max(rect.width(), rect.height()); } else { - return getDisplayMetrics(context).heightPixels; + DisplayMetrics displayMetrics = new DisplayMetrics(); + windowManager.getDefaultDisplay().getMetrics(displayMetrics); + return displayMetrics.heightPixels; } } 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; + } } 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))); 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..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,21 +89,13 @@ 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() { - 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 +105,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 +119,27 @@ 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()); + 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)); 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..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 @@ -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())) if (!visible) Util.showKeyboard(mBinding.keyword); else setKeyword(getKeyword()); } 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" />