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 d072f5526..586df36de 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.api.config.VodConfig; import com.fongmi.android.tv.api.config.WallConfig; import com.fongmi.android.tv.bean.Config; import com.fongmi.android.tv.bean.Func; +import com.fongmi.android.tv.bean.History; import com.fongmi.android.tv.bean.Result; import com.fongmi.android.tv.bean.Site; import com.fongmi.android.tv.bean.Style; @@ -47,6 +48,7 @@ import com.fongmi.android.tv.ui.custom.CustomTitleView; import com.fongmi.android.tv.ui.dialog.SiteDialog; import com.fongmi.android.tv.ui.presenter.FuncPresenter; import com.fongmi.android.tv.ui.presenter.HeaderPresenter; +import com.fongmi.android.tv.ui.presenter.HistoryPresenter; import com.fongmi.android.tv.ui.presenter.ProgressPresenter; import com.fongmi.android.tv.ui.presenter.VodPresenter; import com.fongmi.android.tv.utils.Clock; @@ -64,15 +66,18 @@ import org.greenrobot.eventbus.ThreadMode; import java.util.List; -public class HomeActivity extends BaseActivity implements CustomTitleView.Listener, VodPresenter.OnClickListener, FuncPresenter.OnClickListener { +public class HomeActivity extends BaseActivity implements CustomTitleView.Listener, VodPresenter.OnClickListener, FuncPresenter.OnClickListener, HistoryPresenter.OnClickListener { private ActivityHomeBinding mBinding; + private ArrayObjectAdapter mHistoryAdapter; + private HistoryPresenter mPresenter; private ArrayObjectAdapter mAdapter; private SiteViewModel mViewModel; private boolean loading; private boolean confirm; private Result mResult; private Clock mClock; + private int recommend; private Site getHome() { return VodConfig.get().getHome(); @@ -111,6 +116,7 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen @Override public void onChildViewHolderSelected(@NonNull RecyclerView parent, @Nullable RecyclerView.ViewHolder child, int position, int subposition) { mBinding.toolbar.setVisibility(position == 0 ? View.VISIBLE : View.GONE); + if (mPresenter != null && mPresenter.isDelete()) setHistoryDelete(false); } }); } @@ -137,6 +143,7 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen selector.addPresenter(String.class, new ProgressPresenter()); selector.addPresenter(ListRow.class, new CustomRowPresenter(16), VodPresenter.class); selector.addPresenter(ListRow.class, new CustomRowPresenter(16), FuncPresenter.class); + selector.addPresenter(ListRow.class, new CustomRowPresenter(16), HistoryPresenter.class); mBinding.recycler.setAdapter(new ItemBridgeAdapter(mAdapter = new ArrayObjectAdapter(selector))); mBinding.recycler.setVerticalSpacing(ResUtil.dp2px(16)); } @@ -151,7 +158,11 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen private void setAdapter() { mAdapter.add(getFuncRow()); - mAdapter.add(R.string.home_recommend); + int homeRecommend = Setting.getHomeRecommend(); + if (homeRecommend == 0) mAdapter.add(R.string.home_history); + if (homeRecommend == 1) mAdapter.add(R.string.home_recommend); + if (homeRecommend == 0) mHistoryAdapter = new ArrayObjectAdapter(mPresenter = new HistoryPresenter(this)); + recommend = homeRecommend; } private void initConfig() { @@ -168,6 +179,7 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen public void success() { mBinding.progressLayout.showContent(); checkAction(getIntent()); + getHistory(); getVideo(); setFocus(); } @@ -213,13 +225,14 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen int index = getRecommendIndex(); String title = getHome().getName(); mBinding.title.setText(title.isEmpty() ? ResUtil.getString(R.string.app_name) : title); - if (mAdapter.size() > index) mAdapter.removeItems(index, mAdapter.size() - index); + if (mAdapter.size() > index && index > -1) mAdapter.removeItems(index, mAdapter.size() - index); if (getHome().getKey().isEmpty()) return; mViewModel.homeContent(); mAdapter.add("progress"); } private void addVideo(Result result) { + if (Setting.getHomeRecommend() == 0) return; Style style = result.getStyle(getHome().getStyle()); for (List items : Lists.partition(result.getList(), Product.getColumn(style))) { ArrayObjectAdapter adapter = new ArrayObjectAdapter(new VodPresenter(this, style)); @@ -230,18 +243,50 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen private ListRow getFuncRow() { ArrayObjectAdapter adapter = new ArrayObjectAdapter(new FuncPresenter(this)); - adapter.add(Func.create(R.string.home_history)); adapter.add(Func.create(R.string.home_vod)); adapter.add(Func.create(R.string.home_live)); adapter.add(Func.create(R.string.home_search)); adapter.add(Func.create(R.string.home_keep)); adapter.add(Func.create(R.string.home_push)); + if (Setting.getHomeRecommend() == 1) adapter.add(Func.create(R.string.home_history)); adapter.add(Func.create(R.string.home_setting)); ((Func) adapter.get(0)).setNextFocusLeft(((Func) adapter.get(adapter.size() - 1)).getId()); ((Func) adapter.get(adapter.size() - 1)).setNextFocusRight(((Func) adapter.get(0)).getId()); return new ListRow(adapter); } + private void getHistory() { + getHistory(false); + } + + private void getHistory(boolean renew) { + if (Setting.getHomeRecommend() == 1) return; + List items = History.get(); + int historyIndex = getHistoryIndex(); + int totalSize = mAdapter.size(); + if (renew) mHistoryAdapter = new ArrayObjectAdapter(mPresenter = new HistoryPresenter(this)); + if (renew) mAdapter.removeItems(historyIndex, 1); + if (totalSize == historyIndex || renew) mAdapter.add(historyIndex, new ListRow(mHistoryAdapter)); + mHistoryAdapter.setItems(items, null); + } + + private void setHistoryDelete(boolean delete) { + mPresenter.setDelete(delete); + mHistoryAdapter.notifyArrayItemRangeChanged(0, mHistoryAdapter.size()); + } + + private void clearHistory() { + mAdapter.removeItems(getHistoryIndex(), 1); + History.delete(VodConfig.getCid()); + mPresenter.setDelete(false); + mHistoryAdapter.clear(); + } + + private int getHistoryIndex() { + for (int i = 0; i < mAdapter.size(); i++) if (mAdapter.get(i).equals(R.string.home_history)) return i + 1; + return -1; + } + private int getRecommendIndex() { for (int i = 0; i < mAdapter.size(); i++) if (mAdapter.get(i).equals(R.string.home_recommend)) return i + 1; return -1; @@ -288,6 +333,26 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen } } + @Override + public void onItemClick(History item) { + VideoActivity.start(this, item.getSiteKey(), item.getVodId(), item.getVodName(), item.getVodPic()); + } + + @Override + public void onItemDelete(History item) { + mHistoryAdapter.remove(item.delete()); + if (mHistoryAdapter.size() > 0) return; + mAdapter.removeItems(getHistoryIndex(), 1); + mPresenter.setDelete(false); + } + + @Override + public boolean onLongClick() { + if (mPresenter.isDelete()) clearHistory(); + else setHistoryDelete(true); + return true; + } + @Override public void onItemClick(Vod item) { if (getHome().isIndexs()) CollectActivity.start(this, item.getVodName()); @@ -333,8 +398,12 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen int index = getRecommendIndex(); mAdapter.notifyArrayItemRangeChanged(index, mAdapter.size() - index); break; + case HISTORY: + getHistory(); + break; case SIZE: getVideo(); + getHistory(true); break; } } @@ -387,6 +456,14 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen super.onResume(); mClock.start(); setTitleView(); + reloadHomeRecommend(); + } + + private void reloadHomeRecommend() { + if (recommend == Setting.getHomeRecommend()) return; + mAdapter.clear(); + setAdapter(); + initConfig(); } @Override @@ -404,6 +481,8 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen protected void onBackPress() { if (mBinding.progressLayout.isProgress()) { mBinding.progressLayout.showContent(); + } else if (mPresenter != null && mPresenter.isDelete()) { + setHistoryDelete(false); } else if (mBinding.recycler.getSelectedPosition() != 0) { mBinding.recycler.scrollToPosition(0); } else if (!confirm) { diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingCustomActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingCustomActivity.java index 6570e982c..60672f0f2 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingCustomActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingCustomActivity.java @@ -23,6 +23,7 @@ public class SettingCustomActivity extends BaseActivity { private String[] episode; private String[] fullscreenMenuKey; private String[] smallWindowBackKey; + private String[] homeRecommend; @Override protected ViewBinding getBinding() { @@ -52,6 +53,7 @@ public class SettingCustomActivity extends BaseActivity { mBinding.homeSiteLockText.setText(getSwitch(Setting.isHomeSiteLock())); mBinding.incognitoText.setText(getSwitch(Setting.isIncognito())); mBinding.smallWindowBackKeyText.setText((smallWindowBackKey = ResUtil.getStringArray(R.array.select_small_window_back_key))[Setting.getSmallWindowBackKey()]); + mBinding.homeRecommonedText.setText((homeRecommend = ResUtil.getStringArray(R.array.select_home_recommend))[Setting.getHomeRecommend()]); } @Override @@ -69,6 +71,7 @@ public class SettingCustomActivity extends BaseActivity { mBinding.homeSiteLock.setOnClickListener(this::setHomeSiteLock); mBinding.incognito.setOnClickListener(this::setIncognito); mBinding.smallWindowBackKey.setOnClickListener(this::setSmallWindowBackKey); + mBinding.homeRecommoned.setOnClickListener(this::setHomeRecommend); } private void setQuality(View view) { @@ -151,4 +154,10 @@ public class SettingCustomActivity extends BaseActivity { mBinding.smallWindowBackKeyText.setText(smallWindowBackKey[index]); } + private void setHomeRecommend(View view) { + int index = Setting.getHomeRecommend(); + Setting.putHomeRecommend(index = index == homeRecommend.length - 1 ? 0 : ++index); + mBinding.homeRecommonedText.setText(homeRecommend[index]); + } + } diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/HistoryPresenter.java b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/HistoryPresenter.java new file mode 100644 index 000000000..ffbdbdcc9 --- /dev/null +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/HistoryPresenter.java @@ -0,0 +1,95 @@ +package com.fongmi.android.tv.ui.presenter; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.leanback.widget.Presenter; + +import com.fongmi.android.tv.Product; +import com.fongmi.android.tv.R; +import com.fongmi.android.tv.bean.History; +import com.fongmi.android.tv.databinding.AdapterVodBinding; +import com.fongmi.android.tv.utils.ImgUtil; +import com.fongmi.android.tv.utils.ResUtil; + +public class HistoryPresenter extends Presenter { + + private final OnClickListener mListener; + private int width, height; + private boolean delete; + + public HistoryPresenter(OnClickListener listener) { + this.mListener = listener; + setLayoutSize(); + } + + public interface OnClickListener { + + void onItemClick(History item); + + void onItemDelete(History item); + + boolean onLongClick(); + } + + public boolean isDelete() { + return delete; + } + + public void setDelete(boolean delete) { + this.delete = delete; + } + + private void setLayoutSize() { + int space = ResUtil.dp2px(48) + ResUtil.dp2px(16 * (Product.getColumn() - 1)); + int base = ResUtil.getScreenWidth() - space; + width = base / Product.getColumn(); + height = (int) (width / 0.75f); + } + + @Override + public Presenter.ViewHolder onCreateViewHolder(ViewGroup parent) { + ViewHolder holder = new ViewHolder(AdapterVodBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); + holder.binding.getRoot().getLayoutParams().width = width; + holder.binding.getRoot().getLayoutParams().height = height; + return holder; + } + + @Override + public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object object) { + History item = (History) object; + ViewHolder holder = (ViewHolder) viewHolder; + setClickListener(holder.view, item); + holder.binding.name.setText(item.getVodName()); + holder.binding.site.setText(item.getSiteName()); + holder.binding.site.setVisibility(item.getSiteVisible()); + holder.binding.remark.setVisibility(delete ? View.GONE : View.VISIBLE); + holder.binding.delete.setVisibility(!delete ? View.GONE : View.VISIBLE); + holder.binding.remark.setText(ResUtil.getString(R.string.vod_last, item.getVodRemarks())); + ImgUtil.loadVod(item.getVodName(), item.getVodPic(), holder.binding.image); + } + + private void setClickListener(View root, History item) { + root.setOnLongClickListener(view -> mListener.onLongClick()); + root.setOnClickListener(view -> { + if (isDelete()) mListener.onItemDelete(item); + else mListener.onItemClick(item); + }); + } + + @Override + public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) { + } + + public static class ViewHolder extends Presenter.ViewHolder { + + private final AdapterVodBinding binding; + + public ViewHolder(@NonNull AdapterVodBinding binding) { + super(binding.getRoot()); + this.binding = binding; + } + } +} \ No newline at end of file diff --git a/app/src/leanback/res/layout/activity_setting_custom.xml b/app/src/leanback/res/layout/activity_setting_custom.xml index f9dd0e1b1..c7067a64e 100644 --- a/app/src/leanback/res/layout/activity_setting_custom.xml +++ b/app/src/leanback/res/layout/activity_setting_custom.xml @@ -412,5 +412,42 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/fongmi/android/tv/Setting.java b/app/src/main/java/com/fongmi/android/tv/Setting.java index 49d7b3ea6..509d95106 100644 --- a/app/src/main/java/com/fongmi/android/tv/Setting.java +++ b/app/src/main/java/com/fongmi/android/tv/Setting.java @@ -413,4 +413,12 @@ public class Setting { return Prefers.getInt("small_window_back_key", 0); } + public static void putHomeRecommend(int recommend) { + Prefers.put("home_recommend", recommend); + } + + public static int getHomeRecommend() { + return Prefers.getInt("home_recommend", 0); + } + } diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index dcc2ddd79..2683ae48b 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -80,6 +80,7 @@ 首页源锁定 无痕模式 小窗返回键 + 首页推荐位 DoH Proxy 缓存 @@ -226,6 +227,11 @@ 焦点移动 + + 播放历史 + 站点推荐 + + 预设 系统 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 10115dc52..9dc827b5b 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -80,6 +80,7 @@ 首頁源鎖定 無痕模式 小窗返回鍵 + 首页推薦位 DoH Proxy 暫存 @@ -226,6 +227,11 @@ 焦點移動 + + 播放歷史 + 站點推薦 + + 預設 系統 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index dab3882ad..4a8a000da 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -80,6 +80,7 @@ Home site lock Incognito mode Small window back key + Home recommend DoH Proxy Cache @@ -231,6 +232,11 @@ Focus move + + History + Site recommend + + Default System