From b00c29c6aa84bff5fd488dd62230120127642757 Mon Sep 17 00:00:00 2001 From: FongMi Date: Thu, 18 Aug 2022 16:33:13 +0800 Subject: [PATCH] [mobile] init home --- app/build.gradle | 2 +- .../tv/ui/custom/SpaceItemDecoration.java | 2 +- .../res/drawable/ic_delete.xml | 0 app/src/mobile/AndroidManifest.xml | 2 +- .../android/tv/ui/adapter/HistoryAdapter.java | 113 ++++++++++++++++++ .../android/tv/ui/adapter/SiteAdapter.java | 4 +- .../android/tv/ui/adapter/VodAdapter.java | 88 ++++++++++++++ .../android/tv/ui/custom/SiteDialog.java | 2 +- .../android/tv/ui/fragment/HomeFragment.java | 75 +++++++++++- app/src/mobile/res/layout/activity_main.xml | 2 +- app/src/mobile/res/layout/adapter_vod.xml | 85 +++++++++++++ app/src/mobile/res/layout/fragment_home.xml | 49 +++++++- app/src/mobile/res/menu/menu_nav.xml | 6 +- .../{nav_main.xml => nav_graph.xml} | 8 +- app/src/mobile/res/values-zh-rCN/strings.xml | 8 +- app/src/mobile/res/values-zh-rTW/strings.xml | 8 +- app/src/mobile/res/values/strings.xml | 8 +- 17 files changed, 433 insertions(+), 29 deletions(-) rename app/src/{leanback => main}/java/com/fongmi/android/tv/ui/custom/SpaceItemDecoration.java (99%) rename app/src/{leanback => main}/res/drawable/ic_delete.xml (100%) create mode 100644 app/src/mobile/java/com/fongmi/android/tv/ui/adapter/HistoryAdapter.java create mode 100644 app/src/mobile/java/com/fongmi/android/tv/ui/adapter/VodAdapter.java create mode 100644 app/src/mobile/res/layout/adapter_vod.xml rename app/src/mobile/res/navigation/{nav_main.xml => nav_graph.xml} (75%) diff --git a/app/build.gradle b/app/build.gradle index d5680749c..5c354dde3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -50,7 +50,7 @@ android { dependencies { implementation project(':catvod') - implementation 'androidx.appcompat:appcompat:1.4.2' + implementation 'androidx.appcompat:appcompat:1.5.0' implementation 'androidx.core:core-splashscreen:1.0.0' implementation 'androidx.preference:preference:1.2.0' implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/SpaceItemDecoration.java b/app/src/main/java/com/fongmi/android/tv/ui/custom/SpaceItemDecoration.java similarity index 99% rename from app/src/leanback/java/com/fongmi/android/tv/ui/custom/SpaceItemDecoration.java rename to app/src/main/java/com/fongmi/android/tv/ui/custom/SpaceItemDecoration.java index a73ff3f28..a49343451 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/SpaceItemDecoration.java +++ b/app/src/main/java/com/fongmi/android/tv/ui/custom/SpaceItemDecoration.java @@ -10,8 +10,8 @@ import com.fongmi.android.tv.utils.ResUtil; public class SpaceItemDecoration extends RecyclerView.ItemDecoration { - private final int spanCount; private final int spacing; + private final int spanCount; public SpaceItemDecoration(int spanCount, int spacing) { this.spanCount = spanCount; diff --git a/app/src/leanback/res/drawable/ic_delete.xml b/app/src/main/res/drawable/ic_delete.xml similarity index 100% rename from app/src/leanback/res/drawable/ic_delete.xml rename to app/src/main/res/drawable/ic_delete.xml diff --git a/app/src/mobile/AndroidManifest.xml b/app/src/mobile/AndroidManifest.xml index e43f2e477..bbb902852 100644 --- a/app/src/mobile/AndroidManifest.xml +++ b/app/src/mobile/AndroidManifest.xml @@ -27,7 +27,7 @@ + android:screenOrientation="sensorPortrait" /> \ No newline at end of file diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/HistoryAdapter.java b/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/HistoryAdapter.java new file mode 100644 index 000000000..3349048f2 --- /dev/null +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/HistoryAdapter.java @@ -0,0 +1,113 @@ +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.recyclerview.widget.RecyclerView; + +import com.fongmi.android.tv.R; +import com.fongmi.android.tv.api.ApiConfig; +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; + +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 HistoryAdapter(OnClickListener listener) { + this.mListener = listener; + this.mItems = new ArrayList<>(); + setLayoutSize(3); + } + + 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 spanCount) { + int space = ResUtil.dp2px(32 + ((spanCount - 1) * 16)); + int base = ResUtil.getScreenWidthPx() - space; + width = base / spanCount; + height = (int) (width / 0.75f); + } + + class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { + + private final AdapterVodBinding binding; + + ViewHolder(@NonNull AdapterVodBinding binding) { + super(binding.getRoot()); + this.binding = binding; + binding.getRoot().setOnClickListener(this); + binding.getRoot().setOnLongClickListener(this); + } + + @Override + public void onClick(View view) { + History item = mItems.get(getLayoutPosition()); + if (isDelete()) mListener.onItemDelete(item); + else mListener.onItemClick(item); + } + + @Override + public boolean onLongClick(View v) { + return mListener.onLongClick(); + } + } + + public void addAll(List items) { + mItems.clear(); + mItems.addAll(items); + notifyDataSetChanged(); + } + + @Override + public int getItemCount() { + return mItems.size(); + } + + @NonNull + @Override + 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; + return holder; + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + History item = mItems.get(position); + holder.binding.name.setText(item.getVodName()); + holder.binding.site.setText(ApiConfig.getSiteName(item.getSiteKey())); + holder.binding.remark.setText(ResUtil.getString(R.string.vod_last, item.getVodRemarks())); + holder.binding.name.setVisibility(delete ? View.GONE : View.VISIBLE); + holder.binding.site.setVisibility(delete ? View.GONE : View.VISIBLE); + holder.binding.remark.setVisibility(delete ? View.GONE : View.VISIBLE); + holder.binding.delete.setVisibility(!delete ? View.GONE : View.VISIBLE); + ImgUtil.load(item.getVodPic(), holder.binding.image); + } +} diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/SiteAdapter.java b/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/SiteAdapter.java index f89d7c15a..b1ee817d7 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/SiteAdapter.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/SiteAdapter.java @@ -57,7 +57,7 @@ public class SiteAdapter extends RecyclerView.Adapter { @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { - Site site = mItems.get(position); - holder.binding.text.setText(site.getActivatedName()); + Site item = mItems.get(position); + holder.binding.text.setText(item.getActivatedName()); } } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/VodAdapter.java b/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/VodAdapter.java new file mode 100644 index 000000000..8b53eb42c --- /dev/null +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/VodAdapter.java @@ -0,0 +1,88 @@ +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.recyclerview.widget.RecyclerView; + +import com.fongmi.android.tv.bean.Vod; +import com.fongmi.android.tv.databinding.AdapterVodBinding; +import com.fongmi.android.tv.utils.ImgUtil; +import com.fongmi.android.tv.utils.ResUtil; + +import java.util.ArrayList; +import java.util.List; + +public class VodAdapter extends RecyclerView.Adapter { + + private final OnClickListener mListener; + private final List mItems; + private int width, height; + + public VodAdapter(OnClickListener listener) { + this.mListener = listener; + this.mItems = new ArrayList<>(); + setLayoutSize(3); + } + + public interface OnClickListener { + + void onItemClick(Vod item); + } + + private void setLayoutSize(int spanCount) { + int space = ResUtil.dp2px(32 + ((spanCount - 1) * 16)); + int base = ResUtil.getScreenWidthPx() - space; + width = base / spanCount; + height = (int) (width / 0.75f); + } + + class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { + + private final AdapterVodBinding binding; + + ViewHolder(@NonNull AdapterVodBinding binding) { + super(binding.getRoot()); + this.binding = binding; + binding.getRoot().setOnClickListener(this); + } + + @Override + public void onClick(View view) { + mListener.onItemClick(mItems.get(getLayoutPosition())); + } + } + + public void addAll(List items) { + mItems.clear(); + mItems.addAll(items); + notifyDataSetChanged(); + } + + @Override + public int getItemCount() { + return mItems.size(); + } + + @NonNull + @Override + 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; + return holder; + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + Vod item = mItems.get(position); + holder.binding.name.setText(item.getVodName()); + holder.binding.year.setText(item.getVodYear()); + holder.binding.remark.setText(item.getVodRemarks()); + holder.binding.year.setVisibility(item.getYearVisible()); + holder.binding.remark.setVisibility(item.getRemarkVisible()); + ImgUtil.load(item.getVodName(), item.getVodPic(), holder.binding.image); + } +} diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/custom/SiteDialog.java b/app/src/mobile/java/com/fongmi/android/tv/ui/custom/SiteDialog.java index 57eb7e855..3797bff8c 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/custom/SiteDialog.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/custom/SiteDialog.java @@ -57,6 +57,6 @@ public class SiteDialog implements SiteAdapter.OnClickListener { public interface Callback { - void setSite(Site site); + void setSite(Site item); } } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/HomeFragment.java b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/HomeFragment.java index 6af2937f8..d4a3f629a 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/HomeFragment.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/HomeFragment.java @@ -5,17 +5,90 @@ import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.GridLayoutManager; import androidx.viewbinding.ViewBinding; +import com.fongmi.android.tv.api.ApiConfig; +import com.fongmi.android.tv.bean.History; +import com.fongmi.android.tv.bean.Vod; import com.fongmi.android.tv.databinding.FragmentHomeBinding; +import com.fongmi.android.tv.db.AppDatabase; +import com.fongmi.android.tv.model.SiteViewModel; import com.fongmi.android.tv.ui.activity.BaseFragment; +import com.fongmi.android.tv.ui.adapter.HistoryAdapter; +import com.fongmi.android.tv.ui.adapter.VodAdapter; +import com.fongmi.android.tv.ui.custom.SpaceItemDecoration; -public class HomeFragment extends BaseFragment { +public class HomeFragment extends BaseFragment implements VodAdapter.OnClickListener, HistoryAdapter.OnClickListener { private FragmentHomeBinding mBinding; + private SiteViewModel mSiteViewModel; + private HistoryAdapter mHistoryAdapter; + private VodAdapter mRecommendAdapter; @Override protected ViewBinding getBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) { return mBinding = FragmentHomeBinding.inflate(inflater, container, false); } + + @Override + protected void initView() { + setRecyclerView(); + setViewModel(); + getHistory(); + getVideo(); + } + + @Override + protected void initEvent() { + + } + + private void setRecyclerView() { + mBinding.history.setHasFixedSize(true); + mBinding.history.setLayoutManager(new GridLayoutManager(getContext(), 3)); + mBinding.history.addItemDecoration(new SpaceItemDecoration(3, 16)); + mBinding.history.setAdapter(mHistoryAdapter = new HistoryAdapter(this)); + mBinding.recommend.setHasFixedSize(true); + mBinding.recommend.setLayoutManager(new GridLayoutManager(getContext(), 3)); + mBinding.recommend.addItemDecoration(new SpaceItemDecoration(3, 16)); + mBinding.recommend.setAdapter(mRecommendAdapter = new VodAdapter(this)); + } + + private void setViewModel() { + mSiteViewModel = new ViewModelProvider(this).get(SiteViewModel.class); + mSiteViewModel.result.observe(getViewLifecycleOwner(), result -> { + if (result != null) mRecommendAdapter.addAll(result.getList()); + }); + } + + private void getVideo() { + if (ApiConfig.get().getHome().getKey().isEmpty()) return; + mSiteViewModel.homeContent(); + } + + private void getHistory() { + mHistoryAdapter.addAll(AppDatabase.get().getHistoryDao().getAll()); + } + + @Override + public void onItemClick(Vod item) { + } + + @Override + public void onItemClick(History item) { + } + + @Override + public void onItemDelete(History item) { + + } + + @Override + public boolean onLongClick() { + mHistoryAdapter.setDelete(true); + mHistoryAdapter.notifyDataSetChanged(); + return true; + } } diff --git a/app/src/mobile/res/layout/activity_main.xml b/app/src/mobile/res/layout/activity_main.xml index 4f7783a10..1510d7b32 100644 --- a/app/src/mobile/res/layout/activity_main.xml +++ b/app/src/mobile/res/layout/activity_main.xml @@ -12,7 +12,7 @@ android:layout_height="match_parent" android:layout_above="@+id/navigation" app:defaultNavHost="true" - app:navGraph="@navigation/nav_main" /> + app:navGraph="@navigation/nav_graph" /> + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/mobile/res/layout/fragment_home.xml b/app/src/mobile/res/layout/fragment_home.xml index 0f36c22be..71e7e063a 100644 --- a/app/src/mobile/res/layout/fragment_home.xml +++ b/app/src/mobile/res/layout/fragment_home.xml @@ -1,6 +1,51 @@ - - \ No newline at end of file + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/mobile/res/menu/menu_nav.xml b/app/src/mobile/res/menu/menu_nav.xml index 9392ad9af..37eeead9d 100644 --- a/app/src/mobile/res/menu/menu_nav.xml +++ b/app/src/mobile/res/menu/menu_nav.xml @@ -4,16 +4,16 @@ + android:title="@string/nav_home" /> + android:title="@string/nav_vod" /> + android:title="@string/nav_setting" /> \ No newline at end of file diff --git a/app/src/mobile/res/navigation/nav_main.xml b/app/src/mobile/res/navigation/nav_graph.xml similarity index 75% rename from app/src/mobile/res/navigation/nav_main.xml rename to app/src/mobile/res/navigation/nav_graph.xml index e852df31d..d32d3fcd7 100644 --- a/app/src/mobile/res/navigation/nav_main.xml +++ b/app/src/mobile/res/navigation/nav_graph.xml @@ -1,22 +1,22 @@ + android:label="@string/nav_home" /> + android:label="@string/nav_vod" /> + android:label="@string/nav_setting" /> \ No newline at end of file diff --git a/app/src/mobile/res/values-zh-rCN/strings.xml b/app/src/mobile/res/values-zh-rCN/strings.xml index e1278033c..a60b0bc27 100644 --- a/app/src/mobile/res/values-zh-rCN/strings.xml +++ b/app/src/mobile/res/values-zh-rCN/strings.xml @@ -1,8 +1,8 @@ - - 首页 - 片库 - 设定 + + 首页 + 片库 + 设定 \ No newline at end of file diff --git a/app/src/mobile/res/values-zh-rTW/strings.xml b/app/src/mobile/res/values-zh-rTW/strings.xml index 464bad633..d8530e2c7 100644 --- a/app/src/mobile/res/values-zh-rTW/strings.xml +++ b/app/src/mobile/res/values-zh-rTW/strings.xml @@ -1,8 +1,8 @@ - - 首頁 - 片庫 - 設定 + + 首頁 + 片庫 + 設定 \ No newline at end of file diff --git a/app/src/mobile/res/values/strings.xml b/app/src/mobile/res/values/strings.xml index 5e7ee03e8..9b544160c 100644 --- a/app/src/mobile/res/values/strings.xml +++ b/app/src/mobile/res/values/strings.xml @@ -1,8 +1,8 @@ - - Home - Vod - Setting + + Home + Vod + Setting \ No newline at end of file