[mobile] init home

pull/102/head
FongMi 4 years ago
parent e3c0b3b83d
commit b00c29c6aa
  1. 2
      app/build.gradle
  2. 2
      app/src/main/java/com/fongmi/android/tv/ui/custom/SpaceItemDecoration.java
  3. 0
      app/src/main/res/drawable/ic_delete.xml
  4. 2
      app/src/mobile/AndroidManifest.xml
  5. 113
      app/src/mobile/java/com/fongmi/android/tv/ui/adapter/HistoryAdapter.java
  6. 4
      app/src/mobile/java/com/fongmi/android/tv/ui/adapter/SiteAdapter.java
  7. 88
      app/src/mobile/java/com/fongmi/android/tv/ui/adapter/VodAdapter.java
  8. 2
      app/src/mobile/java/com/fongmi/android/tv/ui/custom/SiteDialog.java
  9. 75
      app/src/mobile/java/com/fongmi/android/tv/ui/fragment/HomeFragment.java
  10. 2
      app/src/mobile/res/layout/activity_main.xml
  11. 85
      app/src/mobile/res/layout/adapter_vod.xml
  12. 49
      app/src/mobile/res/layout/fragment_home.xml
  13. 6
      app/src/mobile/res/menu/menu_nav.xml
  14. 8
      app/src/mobile/res/navigation/nav_graph.xml
  15. 8
      app/src/mobile/res/values-zh-rCN/strings.xml
  16. 8
      app/src/mobile/res/values-zh-rTW/strings.xml
  17. 8
      app/src/mobile/res/values/strings.xml

@ -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'

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

@ -27,7 +27,7 @@
<activity
android:name=".ui.activity.MainActivity"
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
android:screenOrientation="fullSensor" />
android:screenOrientation="sensorPortrait" />
</application>
</manifest>

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

@ -57,7 +57,7 @@ public class SiteAdapter extends RecyclerView.Adapter<SiteAdapter.ViewHolder> {
@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());
}
}

@ -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<VodAdapter.ViewHolder> {
private final OnClickListener mListener;
private final List<Vod> 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<Vod> 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);
}
}

@ -57,6 +57,6 @@ public class SiteDialog implements SiteAdapter.OnClickListener {
public interface Callback {
void setSite(Site site);
void setSite(Site item);
}
}

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

@ -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" />
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/navigation"

@ -0,0 +1,85 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="150dp"
android:layout_height="200dp"
android:background="@color/black_20">
<ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="center"
tools:src="@drawable/ic_img_loading" />
<ImageView
android:id="@+id/delete"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:background="@color/white_30"
android:scaleType="center"
android:src="@drawable/ic_delete"
android:visibility="gone"
tools:visibility="visible" />
<TextView
android:id="@+id/year"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:background="#CC2196F3"
android:ellipsize="end"
android:padding="4dp"
android:singleLine="true"
android:textColor="@color/white"
android:textSize="14sp"
android:visibility="gone"
tools:text="2022"
tools:visibility="visible" />
<TextView
android:id="@+id/site"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:background="#CCF44336"
android:ellipsize="end"
android:padding="4dp"
android:singleLine="true"
android:textColor="@color/white"
android:textSize="14sp"
android:visibility="gone"
tools:text="泥巴"
tools:visibility="visible" />
<TextView
android:id="@+id/remark"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/name"
android:background="#CC177535"
android:ellipsize="end"
android:padding="4dp"
android:singleLine="true"
android:textColor="@color/white"
android:textSize="14sp"
tools:text="1080p" />
<TextView
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="@color/black_60"
android:ellipsize="marquee"
android:gravity="center"
android:marqueeRepeatLimit="marquee_forever"
android:padding="6dp"
android:scrollHorizontally="true"
android:singleLine="true"
android:textColor="@color/white"
android:textSize="16sp"
tools:text="蜘蛛人" />
</RelativeLayout>

@ -1,6 +1,51 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_name"
android:textColor="@color/white"
android:textSize="20sp"
android:textStyle="bold" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="最近觀看"
android:textColor="@color/white"
android:textSize="18sp" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/history"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:nestedScrollingEnabled="false" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="更新推薦"
android:textColor="@color/white"
android:textSize="18sp" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recommend"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:nestedScrollingEnabled="false" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>

@ -4,16 +4,16 @@
<item
android:id="@+id/home"
android:icon="@drawable/ic_home"
android:title="@string/main_home" />
android:title="@string/nav_home" />
<item
android:id="@+id/vod"
android:icon="@drawable/ic_vod"
android:title="@string/main_vod" />
android:title="@string/nav_vod" />
<item
android:id="@+id/setting"
android:icon="@drawable/ic_setting"
android:title="@string/main_setting" />
android:title="@string/nav_setting" />
</menu>

@ -1,22 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/nav_main"
android:id="@+id/nav_graph"
app:startDestination="@id/home">
<fragment
android:id="@+id/home"
android:name="com.fongmi.android.tv.ui.fragment.HomeFragment"
android:label="@string/main_home" />
android:label="@string/nav_home" />
<fragment
android:id="@+id/vod"
android:name="com.fongmi.android.tv.ui.fragment.VodFragment"
android:label="@string/main_vod" />
android:label="@string/nav_vod" />
<fragment
android:id="@+id/setting"
android:name="com.fongmi.android.tv.ui.fragment.SettingFragment"
android:label="@string/main_setting" />
android:label="@string/nav_setting" />
</navigation>

@ -1,8 +1,8 @@
<resources>
<!-- Main -->
<string name="main_home">首页</string>
<string name="main_vod">片库</string>
<string name="main_setting">设定</string>
<!-- Nav -->
<string name="nav_home">首页</string>
<string name="nav_vod">片库</string>
<string name="nav_setting">设定</string>
</resources>

@ -1,8 +1,8 @@
<resources>
<!-- Main -->
<string name="main_home">首頁</string>
<string name="main_vod">片庫</string>
<string name="main_setting">設定</string>
<!-- Nav -->
<string name="nav_home">首頁</string>
<string name="nav_vod">片庫</string>
<string name="nav_setting">設定</string>
</resources>

@ -1,8 +1,8 @@
<resources>
<!-- Main -->
<string name="main_home">Home</string>
<string name="main_vod">Vod</string>
<string name="main_setting">Setting</string>
<!-- Nav -->
<string name="nav_home">Home</string>
<string name="nav_vod">Vod</string>
<string name="nav_setting">Setting</string>
</resources>
Loading…
Cancel
Save