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];