Merge pull request #316 from okcaptain/dev

Dev
pull/317/head^2
okcaptain 2 years ago committed by GitHub
commit 013886cae4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 2
      app/build.gradle
  2. 5
      app/src/leanback/AndroidManifest.xml
  3. 3
      app/src/leanback/java/com/fongmi/android/tv/bean/Func.java
  4. 105
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/HistoryActivity.java
  5. 75
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java
  6. 73
      app/src/leanback/java/com/fongmi/android/tv/ui/adapter/HistoryAdapter.java
  7. BIN
      app/src/leanback/res/drawable-hdpi/ic_home_history.png
  8. BIN
      app/src/leanback/res/drawable-mdpi/ic_home_history.png
  9. BIN
      app/src/leanback/res/drawable-xhdpi/ic_home_history.png
  10. BIN
      app/src/leanback/res/drawable-xxhdpi/ic_home_history.png
  11. 10
      app/src/leanback/res/drawable/ic_action_delete.xml
  12. 18
      app/src/leanback/res/drawable/selector_image.xml
  13. 52
      app/src/leanback/res/layout/activity_history.xml
  14. 2
      app/src/leanback/res/values-zh-rCN/strings.xml
  15. 2
      app/src/leanback/res/values-zh-rTW/strings.xml
  16. 2
      app/src/main/java/com/fongmi/android/tv/utils/FileUtil.java
  17. 2
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/MainActivity.java
  18. 9
      app/src/mobile/java/com/fongmi/android/tv/ui/fragment/VodFragment.java
  19. 1
      catvod/src/main/java/com/github/catvod/utils/Util.java

@ -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()]

@ -115,6 +115,11 @@
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
android:screenOrientation="sensorLandscape" />
<activity
android:name=".ui.activity.HistoryActivity"
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
android:screenOrientation="sensorLandscape" />
<activity
android:name=".ui.activity.KeepActivity"
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"

@ -59,6 +59,9 @@ public class Func {
@SuppressLint("NonConstantResourceId")
public void setDrawable() {
switch (resId) {
case R.string.home_history:
this.drawable = R.drawable.ic_home_history;
break;
case R.string.home_vod:
this.drawable = R.drawable.ic_home_vod;
break;

@ -0,0 +1,105 @@
package com.fongmi.android.tv.ui.activity;
import android.app.Activity;
import android.content.Intent;
import android.view.View;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.viewbinding.ViewBinding;
import com.fongmi.android.tv.Product;
import com.fongmi.android.tv.bean.History;
import com.fongmi.android.tv.databinding.ActivityHistoryBinding;
import com.fongmi.android.tv.event.RefreshEvent;
import com.fongmi.android.tv.ui.adapter.HistoryAdapter;
import com.fongmi.android.tv.ui.base.BaseActivity;
import com.fongmi.android.tv.ui.custom.SpaceItemDecoration;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
public class HistoryActivity extends BaseActivity implements HistoryAdapter.OnClickListener {
private ActivityHistoryBinding mBinding;
private HistoryAdapter mAdapter;
public static void start(Activity activity) {
activity.startActivity(new Intent(activity, HistoryActivity.class));
}
@Override
protected ViewBinding getBinding() {
return mBinding = ActivityHistoryBinding.inflate(getLayoutInflater());
}
@Override
protected void initView() {
setRecyclerView();
getHistory();
}
@Override
protected void initEvent() {
mBinding.delete.setOnClickListener(this::onDelete);
}
private void setRecyclerView() {
mBinding.recycler.setHasFixedSize(true);
mBinding.recycler.setItemAnimator(null);
mBinding.recycler.setAdapter(mAdapter = new HistoryAdapter(this));
mBinding.recycler.setLayoutManager(new GridLayoutManager(this, Product.getColumn()));
mBinding.recycler.addItemDecoration(new SpaceItemDecoration(Product.getColumn(), 16));
}
private void getHistory() {
mAdapter.addAll(History.get());
mBinding.delete.setVisibility(mAdapter.getItemCount() > 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();
}
}

@ -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<History> 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) {

@ -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<HistoryAdapter.ViewHolder> {
private final OnClickListener mListener;
private final List<History> 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<History> 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;
}
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 861 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="48dp"
android:height="48dp"
android:tint="#FFFFFF"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFFFFF"
android:pathData="M16,9v10H8V9h8m-1.5,-6h-5l-1,1H5v2h14V4h-3.5l-1,-1zM18,7H6v12c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V7z" />
</vector>

@ -1,18 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true">
<shape android:shape="oval">
<solid android:color="@color/blue_500"/>
<shape android:shape="oval">
<stroke
android:width="1.5dp"
android:color="@color/white" />
<solid android:color="@color/black_20"/>
</shape>
</item>
<item android:state_activated="true">
<shape android:shape="oval">
<solid android:color="@color/grey_600"/>
</shape>
</item>
<item >
<shape android:shape="oval">
<solid android:color="@color/grey_600"/>
<item>
<shape android:shape="oval">
<solid android:color="@color/black_20"/>
</shape>
</item>
</selector>

@ -0,0 +1,52 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:keepScreenOn="true"
android:orientation="vertical">
<LinearLayout
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="24dp"
android:paddingTop="24dp"
android:paddingEnd="24dp"
android:paddingBottom="16dp"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_gravity="start"
android:text="@string/home_history"
android:textColor="@color/white"
android:textSize="24sp" />
<ImageView
android:id="@+id/delete"
android:layout_width="32dp"
android:layout_height="32dp"
android:background="@drawable/selector_image"
android:src="@drawable/ic_action_delete"
android:visibility="gone"
tools:visibility="visible" />
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipChildren="false"
android:clipToPadding="false"
android:paddingStart="24dp"
android:paddingEnd="24dp"
android:paddingBottom="24dp" />
</LinearLayout>

@ -7,7 +7,7 @@
<string name="home_keep">收藏</string>
<string name="home_push">推送</string>
<string name="home_setting">设置</string>
<string name="home_history">最近观看</string>
<string name="home_history">历史</string>
<string name="home_recommend">更新推荐</string>
<!-- Collect -->

@ -7,7 +7,7 @@
<string name="home_keep">收藏</string>
<string name="home_push">推送</string>
<string name="home_setting">設定</string>
<string name="home_history">最近觀看</string>
<string name="home_history">歷史</string>
<string name="home_recommend">更新推薦</string>
<!-- Collect -->

@ -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);
});
}

@ -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());

@ -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());
}

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

Loading…
Cancel
Save