diff --git a/app/src/leanback/AndroidManifest.xml b/app/src/leanback/AndroidManifest.xml index c94370624..1ac0c25c1 100644 --- a/app/src/leanback/AndroidManifest.xml +++ b/app/src/leanback/AndroidManifest.xml @@ -115,6 +115,11 @@ android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation" android:screenOrientation="sensorLandscape" /> + + 0 ? View.VISIBLE : View.GONE); + } + + private void onDelete(View view) { + if (mAdapter.isDelete()) { + mAdapter.clear(); + } else if (mAdapter.getItemCount() > 0) { + mAdapter.setDelete(true); + } else { + mBinding.delete.setVisibility(View.GONE); + } + } + + @Override + public void onItemClick(History item) { + VideoActivity.start(this, item.getSiteKey(), item.getVodId(), item.getVodName(), item.getVodPic()); + } + + @Override + public void onItemDelete(History item) { + mAdapter.delete(item.delete()); + if (mAdapter.getItemCount() == 0) mAdapter.setDelete(false); + } + + @Override + public boolean onLongClick() { + mAdapter.setDelete(true); + return true; + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onRefreshEvent(RefreshEvent event) { + super.onRefreshEvent(event); + switch (event.getType()) { + case HISTORY: + getHistory(); + break; + case SIZE: + getHistory(); + break; + } + } + + @Override + public void onBackPressed() { + if (mAdapter.isDelete()) mAdapter.setDelete(false); + else super.onBackPressed(); + } + +} 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 89d652d54..d072f5526 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,7 +27,6 @@ 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; @@ -48,7 +47,6 @@ 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; @@ -66,11 +64,9 @@ import org.greenrobot.eventbus.ThreadMode; import java.util.List; -public class HomeActivity extends BaseActivity implements CustomTitleView.Listener, VodPresenter.OnClickListener, FuncPresenter.OnClickListener, HistoryPresenter.OnClickListener { +public class HomeActivity extends BaseActivity implements CustomTitleView.Listener, VodPresenter.OnClickListener, FuncPresenter.OnClickListener { private ActivityHomeBinding mBinding; - private ArrayObjectAdapter mHistoryAdapter; - private HistoryPresenter mPresenter; private ArrayObjectAdapter mAdapter; private SiteViewModel mViewModel; private boolean loading; @@ -115,7 +111,6 @@ 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.isDelete()) setHistoryDelete(false); } }); } @@ -142,7 +137,6 @@ 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)); } @@ -157,9 +151,7 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen private void setAdapter() { mAdapter.add(getFuncRow()); - mAdapter.add(R.string.home_history); mAdapter.add(R.string.home_recommend); - mHistoryAdapter = new ArrayObjectAdapter(mPresenter = new HistoryPresenter(this)); } private void initConfig() { @@ -176,7 +168,6 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen public void success() { mBinding.progressLayout.showContent(); checkAction(getIntent()); - getHistory(); getVideo(); setFocus(); } @@ -239,6 +230,7 @@ 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)); @@ -250,38 +242,6 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen return new ListRow(adapter); } - private void getHistory() { - getHistory(false); - } - - private void getHistory(boolean renew) { - List items = History.get(); - int historyIndex = getHistoryIndex(); - int recommendIndex = getRecommendIndex(); - boolean exist = recommendIndex - historyIndex == 2; - if (renew) mHistoryAdapter = new ArrayObjectAdapter(mPresenter = new HistoryPresenter(this)); - if ((items.isEmpty() && exist) || (renew && exist)) mAdapter.removeItems(historyIndex, 1); - if ((items.size() > 0 && !exist) || (renew && exist)) 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; @@ -304,6 +264,9 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen @Override public void onItemClick(Func item) { switch (item.getResId()) { + case R.string.home_history: + HistoryActivity.start(this); + break; case R.string.home_vod: VodActivity.start(this, mResult.clear()); break; @@ -337,26 +300,6 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen return true; } - @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 showDialog() { if (Setting.isHomeSiteLock()) return; @@ -390,12 +333,8 @@ 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; } } @@ -465,8 +404,6 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen protected void onBackPress() { if (mBinding.progressLayout.isProgress()) { mBinding.progressLayout.showContent(); - } else if (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/presenter/HistoryPresenter.java b/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/HistoryAdapter.java similarity index 61% rename from app/src/leanback/java/com/fongmi/android/tv/ui/presenter/HistoryPresenter.java rename to app/src/leanback/java/com/fongmi/android/tv/ui/adapter/HistoryAdapter.java index ffbdbdcc9..2d9b79f1d 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/HistoryPresenter.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/HistoryAdapter.java @@ -1,30 +1,43 @@ -package com.fongmi.android.tv.ui.presenter; +package com.fongmi.android.tv.ui.adapter; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; -import androidx.leanback.widget.Presenter; +import androidx.recyclerview.widget.RecyclerView; 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.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 { +import java.util.ArrayList; +import java.util.List; + +public class HistoryAdapter extends RecyclerView.Adapter { private final OnClickListener mListener; + private final List mItems; private int width, height; private boolean delete; - public HistoryPresenter(OnClickListener listener) { + public HistoryAdapter(OnClickListener listener) { + this.mItems = new ArrayList<>(); this.mListener = listener; setLayoutSize(); } + 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); + } + public interface OnClickListener { void onItemClick(History item); @@ -40,17 +53,37 @@ public class HistoryPresenter extends Presenter { public void setDelete(boolean delete) { this.delete = delete; + notifyItemRangeChanged(0, mItems.size()); } - 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); + public void addAll(List items) { + mItems.clear(); + mItems.addAll(items); + notifyDataSetChanged(); } + public void clear() { + mItems.clear(); + setDelete(false); + notifyDataSetChanged(); + History.delete(VodConfig.getCid()); + } + + public void delete(History item) { + int index = mItems.indexOf(item); + if (index == -1) return; + mItems.remove(index); + notifyItemRemoved(index); + } + + @Override + public int getItemCount() { + return mItems.size(); + } + + @NonNull @Override - public Presenter.ViewHolder onCreateViewHolder(ViewGroup parent) { + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { ViewHolder holder = new ViewHolder(AdapterVodBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); holder.binding.getRoot().getLayoutParams().width = width; holder.binding.getRoot().getLayoutParams().height = height; @@ -58,10 +91,10 @@ public class HistoryPresenter extends Presenter { } @Override - public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object object) { - History item = (History) object; - ViewHolder holder = (ViewHolder) viewHolder; - setClickListener(holder.view, item); + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + History item = mItems.get(position); + setFocusListener(holder.binding); + setClickListener(holder.itemView, item); holder.binding.name.setText(item.getVodName()); holder.binding.site.setText(item.getSiteName()); holder.binding.site.setVisibility(item.getSiteVisible()); @@ -71,6 +104,10 @@ public class HistoryPresenter extends Presenter { ImgUtil.loadVod(item.getVodName(), item.getVodPic(), holder.binding.image); } + private void setFocusListener(AdapterVodBinding binding) { + binding.getRoot().setOnFocusChangeListener((v, hasFocus) -> binding.name.setSelected(hasFocus)); + } + private void setClickListener(View root, History item) { root.setOnLongClickListener(view -> mListener.onLongClick()); root.setOnClickListener(view -> { @@ -79,11 +116,7 @@ public class HistoryPresenter extends Presenter { }); } - @Override - public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) { - } - - public static class ViewHolder extends Presenter.ViewHolder { + public static class ViewHolder extends RecyclerView.ViewHolder { private final AdapterVodBinding binding; @@ -92,4 +125,4 @@ public class HistoryPresenter extends Presenter { this.binding = binding; } } -} \ No newline at end of file +} diff --git a/app/src/leanback/res/drawable/ic_action_delete.xml b/app/src/leanback/res/drawable/ic_action_delete.xml new file mode 100644 index 000000000..a1efe1dfd --- /dev/null +++ b/app/src/leanback/res/drawable/ic_action_delete.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/leanback/res/drawable/ic_home_history.xml b/app/src/leanback/res/drawable/ic_home_history.xml new file mode 100644 index 000000000..8336cf5a2 --- /dev/null +++ b/app/src/leanback/res/drawable/ic_home_history.xml @@ -0,0 +1,12 @@ + + + + \ No newline at end of file diff --git a/app/src/leanback/res/drawable/selector_image.xml b/app/src/leanback/res/drawable/selector_image.xml index e9dff42b4..68df3dadc 100644 --- a/app/src/leanback/res/drawable/selector_image.xml +++ b/app/src/leanback/res/drawable/selector_image.xml @@ -12,7 +12,7 @@ - + \ No newline at end of file diff --git a/app/src/leanback/res/layout/activity_history.xml b/app/src/leanback/res/layout/activity_history.xml new file mode 100644 index 000000000..d9b01c7e9 --- /dev/null +++ b/app/src/leanback/res/layout/activity_history.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + +