diff --git a/app/build.gradle b/app/build.gradle index 79824e9c2..c53c0e961 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,7 +11,7 @@ android { minSdk 21 targetSdk 28 versionCode 228 - versionName "2.2.8" + versionName "0227" javaCompileOptions { annotationProcessorOptions { arguments = ["room.schemaLocation": "$projectDir/schemas".toString()] 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 f32c648b1..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,11 +47,11 @@ 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; import com.fongmi.android.tv.utils.FileChooser; +import com.fongmi.android.tv.utils.FileUtil; import com.fongmi.android.tv.utils.KeyUtil; import com.fongmi.android.tv.utils.Notify; import com.fongmi.android.tv.utils.ResUtil; @@ -65,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; @@ -114,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); } }); } @@ -141,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)); } @@ -156,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() { @@ -175,7 +168,6 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen public void success() { mBinding.progressLayout.showContent(); checkAction(getIntent()); - getHistory(); getVideo(); setFocus(); } @@ -238,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)); @@ -249,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; @@ -303,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; @@ -336,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; @@ -364,6 +308,7 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen @Override public void onRefresh() { + FileUtil.clearCache(null); initConfig(); } @@ -388,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; } } @@ -463,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-hdpi/ic_home_history.png b/app/src/leanback/res/drawable-hdpi/ic_home_history.png new file mode 100644 index 000000000..41b4839bd Binary files /dev/null and b/app/src/leanback/res/drawable-hdpi/ic_home_history.png differ diff --git a/app/src/leanback/res/drawable-mdpi/ic_home_history.png b/app/src/leanback/res/drawable-mdpi/ic_home_history.png new file mode 100644 index 000000000..5d8ccc321 Binary files /dev/null and b/app/src/leanback/res/drawable-mdpi/ic_home_history.png differ diff --git a/app/src/leanback/res/drawable-xhdpi/ic_home_history.png b/app/src/leanback/res/drawable-xhdpi/ic_home_history.png new file mode 100644 index 000000000..5458467db Binary files /dev/null and b/app/src/leanback/res/drawable-xhdpi/ic_home_history.png differ diff --git a/app/src/leanback/res/drawable-xxhdpi/ic_home_history.png b/app/src/leanback/res/drawable-xxhdpi/ic_home_history.png new file mode 100644 index 000000000..505c257b2 Binary files /dev/null and b/app/src/leanback/res/drawable-xxhdpi/ic_home_history.png differ 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/selector_image.xml b/app/src/leanback/res/drawable/selector_image.xml index e9dff42b4..b007ef5c1 100644 --- a/app/src/leanback/res/drawable/selector_image.xml +++ b/app/src/leanback/res/drawable/selector_image.xml @@ -1,18 +1,16 @@ - - + + + - - - - - - - - + + + \ 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 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/leanback/res/values-zh-rCN/strings.xml b/app/src/leanback/res/values-zh-rCN/strings.xml index c031f9cb4..3cbe4c886 100644 --- a/app/src/leanback/res/values-zh-rCN/strings.xml +++ b/app/src/leanback/res/values-zh-rCN/strings.xml @@ -7,7 +7,7 @@ 收藏 推送 设置 - 最近观看 + 历史 更新推荐 diff --git a/app/src/leanback/res/values-zh-rTW/strings.xml b/app/src/leanback/res/values-zh-rTW/strings.xml index 403a145b2..fd040fbaa 100644 --- a/app/src/leanback/res/values-zh-rTW/strings.xml +++ b/app/src/leanback/res/values-zh-rTW/strings.xml @@ -7,7 +7,7 @@ 收藏 推送 設定 - 最近觀看 + 歷史 更新推薦 diff --git a/app/src/main/java/com/fongmi/android/tv/utils/FileUtil.java b/app/src/main/java/com/fongmi/android/tv/utils/FileUtil.java index 795914d91..dd81d8a04 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/FileUtil.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/FileUtil.java @@ -49,7 +49,7 @@ public class FileUtil { public static void clearCache(Callback callback) { App.execute(() -> { Path.clear(Path.cache()); - App.post(callback::success); + if (callback != null) App.post(callback::success); }); } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/MainActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/MainActivity.java index 284606277..6a5d7e3fa 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/MainActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/MainActivity.java @@ -103,7 +103,7 @@ public class MainActivity extends BaseActivity implements NavigationBarView.OnIt if (savedInstanceState == null) mManager.change(0); } - private void initConfig() { + public void initConfig() { WallConfig.get().init(); LiveConfig.get().init().load(); VodConfig.get().init().load(getCallback()); diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/VodFragment.java b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/VodFragment.java index 057a5394f..25585edbc 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/VodFragment.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/VodFragment.java @@ -33,6 +33,7 @@ import com.fongmi.android.tv.model.SiteViewModel; import com.fongmi.android.tv.ui.activity.CollectActivity; import com.fongmi.android.tv.ui.activity.HistoryActivity; import com.fongmi.android.tv.ui.activity.KeepActivity; +import com.fongmi.android.tv.ui.activity.MainActivity; import com.fongmi.android.tv.ui.activity.VideoActivity; import com.fongmi.android.tv.ui.adapter.TypeAdapter; import com.fongmi.android.tv.ui.base.BaseFragment; @@ -41,6 +42,7 @@ import com.fongmi.android.tv.ui.dialog.LinkDialog; import com.fongmi.android.tv.ui.dialog.ReceiveDialog; import com.fongmi.android.tv.ui.dialog.SiteDialog; import com.fongmi.android.tv.utils.FileChooser; +import com.fongmi.android.tv.utils.FileUtil; import com.github.catvod.net.OkHttp; import com.github.catvod.utils.Trans; import com.google.common.net.HttpHeaders; @@ -100,6 +102,7 @@ public class VodFragment extends BaseFragment implements SiteCallback, FilterCal mBinding.top.setOnClickListener(this::onTop); mBinding.link.setOnClickListener(this::onLink); mBinding.logo.setOnClickListener(this::onLogo); + mBinding.logo.setOnLongClickListener(this::onRefresh); mBinding.keep.setOnClickListener(this::onKeep); mBinding.retry.setOnClickListener(this::onRetry); mBinding.filter.setOnClickListener(this::onFilter); @@ -198,6 +201,12 @@ public class VodFragment extends BaseFragment implements SiteCallback, FilterCal SiteDialog.create(this).change().show(); } + private boolean onRefresh(View view) { + FileUtil.clearCache(null); + if (getActivity() instanceof MainActivity) ((MainActivity) getActivity()).initConfig(); + return true; + } + private void onKeep(View view) { KeepActivity.start(getActivity()); } diff --git a/catvod/src/main/java/com/github/catvod/utils/Util.java b/catvod/src/main/java/com/github/catvod/utils/Util.java index a3ddd6428..e771b57b3 100644 --- a/catvod/src/main/java/com/github/catvod/utils/Util.java +++ b/catvod/src/main/java/com/github/catvod/utils/Util.java @@ -61,6 +61,7 @@ public class Util { public static String md5(File file) { try { + if (!file.exists()) return ""; MessageDigest digest = MessageDigest.getInstance("MD5"); FileInputStream fis = new FileInputStream(file); byte[] byteArray = new byte[1024];