From b4cb3d2d8f4a759c04572bec009abf5b29df53a0 Mon Sep 17 00:00:00 2001 From: FongMi Date: Thu, 25 Aug 2022 00:18:47 +0800 Subject: [PATCH] Full screen search result --- .../tv/ui/activity/SearchActivity.java | 40 +++++++++++++------ .../android/tv/ui/fragment/VodFragment.java | 1 + .../android/tv/ui/presenter/VodPresenter.java | 2 + .../java/com/fongmi/android/tv/bean/Vod.java | 8 ++++ .../android/tv/ui/custom/ProgressLayout.java | 2 +- 5 files changed, 39 insertions(+), 14 deletions(-) diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SearchActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SearchActivity.java index f5a3c96b9..0126ec99d 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SearchActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SearchActivity.java @@ -28,7 +28,6 @@ import com.fongmi.android.tv.CustomListener; import com.fongmi.android.tv.R; import com.fongmi.android.tv.api.ApiConfig; import com.fongmi.android.tv.bean.Hot; -import com.fongmi.android.tv.bean.Result; import com.fongmi.android.tv.bean.Site; import com.fongmi.android.tv.bean.Suggest; import com.fongmi.android.tv.bean.Vod; @@ -39,11 +38,11 @@ import com.fongmi.android.tv.net.OKHttp; import com.fongmi.android.tv.ui.custom.CustomKeyboard; import com.fongmi.android.tv.ui.custom.CustomRowPresenter; import com.fongmi.android.tv.ui.custom.CustomSelector; -import com.fongmi.android.tv.ui.presenter.TitlePresenter; import com.fongmi.android.tv.ui.presenter.VodPresenter; import com.fongmi.android.tv.ui.presenter.WordPresenter; import com.fongmi.android.tv.utils.ResUtil; import com.fongmi.android.tv.utils.Utils; +import com.google.common.collect.Lists; import java.io.IOException; import java.util.ArrayList; @@ -59,10 +58,11 @@ public class SearchActivity extends BaseActivity implements VodPresenter.OnClick private final ActivityResultLauncher launcherString = registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> onVoice()); private ActivitySearchBinding mBinding; + private SpeechRecognizer mRecognizer; private SiteViewModel mSiteViewModel; private ArrayObjectAdapter mWordAdapter; private ArrayObjectAdapter mAdapter; - private SpeechRecognizer mRecognizer; + private ArrayObjectAdapter mLast; private ExecutorService mService; private List mSites; private Handler mHandler; @@ -144,7 +144,6 @@ public class SearchActivity extends BaseActivity implements VodPresenter.OnClick private void setRecyclerView() { CustomSelector selector = new CustomSelector(); - selector.addPresenter(String.class, new TitlePresenter()); selector.addPresenter(ListRow.class, new CustomRowPresenter(16), VodPresenter.class); mBinding.recycler.setVerticalSpacing(ResUtil.dp2px(16)); mBinding.recycler.setAdapter(new ItemBridgeAdapter(mAdapter = new ArrayObjectAdapter(selector))); @@ -155,7 +154,7 @@ public class SearchActivity extends BaseActivity implements VodPresenter.OnClick private void setViewModel() { mSiteViewModel = new ViewModelProvider(this).get(SiteViewModel.class); mSiteViewModel.result.observe(this, result -> { - if (mService != null) addVideo(result); + if (mService != null) addVideo(result.getList()); }); } @@ -176,14 +175,6 @@ public class SearchActivity extends BaseActivity implements VodPresenter.OnClick mSites.add(0, home); } - private void addVideo(Result result) { - ArrayObjectAdapter adapter = new ArrayObjectAdapter(new VodPresenter(this)); - adapter.setItems(result.getList(), null); - mAdapter.add(result.getList().get(0).getSite().getName()); - mAdapter.add(new ListRow(adapter)); - mBinding.progressLayout.showContent(); - } - private void onVoice() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) { launcherString.launch(Manifest.permission.RECORD_AUDIO); @@ -205,10 +196,33 @@ public class SearchActivity extends BaseActivity implements VodPresenter.OnClick showResult(); } + private boolean checkLastSize(List items) { + if (mLast == null || items.size() == 0) return false; + int size = 5 - mLast.size(); + if (size == 0) return false; + size = Math.min(size, items.size()); + mLast.addAll(mLast.size(), new ArrayList<>(items.subList(0, size))); + addVideo(new ArrayList<>(items.subList(size, items.size()))); + return true; + } + + private void addVideo(List items) { + if (checkLastSize(items)) return; + List rows = new ArrayList<>(); + for (List part : Lists.partition(items, 5)) { + mLast = new ArrayObjectAdapter(new VodPresenter(this)); + mLast.setItems(part, null); + rows.add(new ListRow(mLast)); + } + mAdapter.addAll(mAdapter.size(), rows); + mBinding.progressLayout.showContent(); + } + private void stopSearch() { if (mService == null) return; mService.shutdownNow(); mService = null; + mLast = null; } private void showResult() { diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/VodFragment.java b/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/VodFragment.java index 2cc4b6957..4f4984ac5 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/VodFragment.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/fragment/VodFragment.java @@ -124,6 +124,7 @@ public class VodFragment extends Fragment implements CustomScroller.Callback, Vo if (mLast == null || items.size() == 0) return false; int size = 5 - mLast.size(); if (size == 0) return false; + size = Math.min(size, items.size()); mLast.addAll(mLast.size(), new ArrayList<>(items.subList(0, size))); addVideo(new ArrayList<>(items.subList(size, items.size()))); return true; diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/VodPresenter.java b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/VodPresenter.java index 951e49521..90ee2840b 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/VodPresenter.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/VodPresenter.java @@ -46,7 +46,9 @@ public class VodPresenter extends Presenter { ViewHolder holder = (ViewHolder) viewHolder; holder.binding.name.setText(item.getVodName()); holder.binding.year.setText(item.getVodYear()); + holder.binding.site.setText(item.getSiteName()); holder.binding.remark.setText(item.getVodRemarks()); + holder.binding.site.setVisibility(item.getSiteVisible()); holder.binding.year.setVisibility(item.getYearVisible()); holder.binding.remark.setVisibility(item.getRemarkVisible()); ImgUtil.load(item.getVodName(), item.getVodPic(), holder.binding.image); diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Vod.java b/app/src/main/java/com/fongmi/android/tv/bean/Vod.java index 71fdddd08..293c49d18 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Vod.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Vod.java @@ -135,6 +135,14 @@ public class Vod { this.site = site; } + public String getSiteName() { + return getSite() == null ? "" : getSite().getName(); + } + + public int getSiteVisible() { + return getSite() == null ? View.GONE : View.VISIBLE; + } + public int getYearVisible() { return getVodYear().isEmpty() ? View.GONE : View.VISIBLE; } diff --git a/app/src/main/java/com/fongmi/android/tv/ui/custom/ProgressLayout.java b/app/src/main/java/com/fongmi/android/tv/ui/custom/ProgressLayout.java index 3682530fd..98afffaa4 100644 --- a/app/src/main/java/com/fongmi/android/tv/ui/custom/ProgressLayout.java +++ b/app/src/main/java/com/fongmi/android/tv/ui/custom/ProgressLayout.java @@ -115,6 +115,6 @@ public class ProgressLayout extends RelativeLayout { } private void hideView(View view) { - view.setVisibility(INVISIBLE); + view.setVisibility(GONE); } }