From 5c7ab5e2fb5672dd2d719c91e03f288084f6f68a Mon Sep 17 00:00:00 2001 From: FongMi Date: Sun, 16 Oct 2022 23:49:36 +0800 Subject: [PATCH] support live - part 2 --- .../android/tv/ui/activity/HomeActivity.java | 4 + .../android/tv/ui/adapter/ChannelAdapter.java | 68 +++++++++++ .../android/tv/ui/adapter/GroupAdapter.java | 62 ++++++++++ .../res/drawable/selector_live_channel.xml | 2 +- .../res/drawable/selector_live_group.xml | 2 +- app/src/leanback/res/layout/activity_live.xml | 18 +-- .../res/layout/adapter_live_channel.xml | 4 +- .../res/layout/adapter_live_group.xml | 4 +- .../com/fongmi/android/tv/bean/Channel.java | 106 ++++++++++++++++++ .../com/fongmi/android/tv/bean/Group.java | 96 ++++++++++++++++ 10 files changed, 354 insertions(+), 12 deletions(-) create mode 100644 app/src/leanback/java/com/fongmi/android/tv/ui/adapter/ChannelAdapter.java create mode 100644 app/src/leanback/java/com/fongmi/android/tv/ui/adapter/GroupAdapter.java create mode 100644 app/src/main/java/com/fongmi/android/tv/bean/Channel.java create mode 100644 app/src/main/java/com/fongmi/android/tv/bean/Group.java 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 bad3d1889..57b8ebcb5 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 @@ -16,6 +16,7 @@ import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.RecyclerView; import androidx.viewbinding.ViewBinding; +import com.fongmi.android.tv.BuildConfig; import com.fongmi.android.tv.R; import com.fongmi.android.tv.api.ApiConfig; import com.fongmi.android.tv.bean.Func; @@ -187,6 +188,9 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen case R.string.home_vod: VodActivity.start(this, mViewModel.getResult().getValue()); break; + case R.string.home_live: + if (BuildConfig.DEBUG) LiveActivity.start(this); + break; case R.string.home_search: SearchActivity.start(this); break; diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/ChannelAdapter.java b/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/ChannelAdapter.java new file mode 100644 index 000000000..57e4dfff7 --- /dev/null +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/ChannelAdapter.java @@ -0,0 +1,68 @@ +package com.fongmi.android.tv.ui.adapter; + +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.fongmi.android.tv.bean.Channel; +import com.fongmi.android.tv.bean.Group; +import com.fongmi.android.tv.databinding.AdapterLiveChannelBinding; + +import java.util.ArrayList; +import java.util.List; + +public class ChannelAdapter extends RecyclerView.Adapter { + + private final List mItems; + private Group group; + + public ChannelAdapter() { + this.mItems = new ArrayList<>(); + } + + public Group getGroup() { + return group; + } + + public void setGroup(Group group) { + this.group = group; + } + + public void addAll(Group group) { + setGroup(group); + mItems.clear(); + mItems.addAll(group.getChannel()); + notifyDataSetChanged(); + } + + @Override + public int getItemCount() { + return mItems.size(); + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new ViewHolder(AdapterLiveChannelBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + Channel item = mItems.get(position); + holder.binding.name.setText(item.getName()); + holder.binding.number.setText(item.getNumber()); + holder.binding.icon.setVisibility(item.getVisible()); + } + + public static class ViewHolder extends RecyclerView.ViewHolder { + + private final AdapterLiveChannelBinding binding; + + public ViewHolder(@NonNull AdapterLiveChannelBinding binding) { + super(binding.getRoot()); + this.binding = binding; + } + } +} \ No newline at end of file diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/GroupAdapter.java b/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/GroupAdapter.java new file mode 100644 index 000000000..7537db418 --- /dev/null +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/GroupAdapter.java @@ -0,0 +1,62 @@ +package com.fongmi.android.tv.ui.adapter; + +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.fongmi.android.tv.bean.Group; +import com.fongmi.android.tv.databinding.AdapterLiveGroupBinding; + +import java.util.ArrayList; +import java.util.List; + +public class GroupAdapter extends RecyclerView.Adapter { + + private final List mItems; + private final List mHides; + + public GroupAdapter() { + this.mItems = new ArrayList<>(); + this.mHides = new ArrayList<>(); + } + + public void addAll(List items) { + mItems.clear(); + addGroup(items); + notifyDataSetChanged(); + } + + private void addGroup(List items) { + for (Group item : items) if (item.isHidden()) mHides.add(item);else mItems.add(item); + } + + @Override + public int getItemCount() { + return mItems.size(); + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new ViewHolder(AdapterLiveGroupBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + Group item = mItems.get(position); + holder.binding.name.setText(item.getName()); + holder.binding.icon.setVisibility(item.getVisible()); + } + + public static class ViewHolder extends RecyclerView.ViewHolder { + + private final AdapterLiveGroupBinding binding; + + public ViewHolder(@NonNull AdapterLiveGroupBinding binding) { + super(binding.getRoot()); + this.binding = binding; + } + } +} diff --git a/app/src/leanback/res/drawable/selector_live_channel.xml b/app/src/leanback/res/drawable/selector_live_channel.xml index 947f817e3..a8c4a459e 100644 --- a/app/src/leanback/res/drawable/selector_live_channel.xml +++ b/app/src/leanback/res/drawable/selector_live_channel.xml @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/app/src/leanback/res/drawable/selector_live_group.xml b/app/src/leanback/res/drawable/selector_live_group.xml index ee00a4d93..bfa668dd0 100644 --- a/app/src/leanback/res/drawable/selector_live_group.xml +++ b/app/src/leanback/res/drawable/selector_live_group.xml @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/app/src/leanback/res/layout/activity_live.xml b/app/src/leanback/res/layout/activity_live.xml index a0952c4ec..9a857f60f 100644 --- a/app/src/leanback/res/layout/activity_live.xml +++ b/app/src/leanback/res/layout/activity_live.xml @@ -4,6 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" + android:background="@color/black" android:keepScreenOn="true"> + android:minWidth="400dp" + android:orientation="horizontal"> - @@ -43,10 +44,11 @@ android:layout_height="match_parent" android:background="@color/grey_700" /> - diff --git a/app/src/leanback/res/layout/adapter_live_channel.xml b/app/src/leanback/res/layout/adapter_live_channel.xml index 2ef7b1ba0..423ba796e 100644 --- a/app/src/leanback/res/layout/adapter_live_channel.xml +++ b/app/src/leanback/res/layout/adapter_live_channel.xml @@ -4,6 +4,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/selector_live_channel" + android:focusable="true" + android:focusableInTouchMode="true" android:gravity="center" android:orientation="horizontal" android:paddingStart="20dp" @@ -23,7 +25,7 @@ tools:text="01" /> urls; + private String number; + private String icon; + private String name; + private Group type; + private String ua; + private boolean select; + + public static Channel create(String number) { + return new Channel(String.format(Locale.getDefault(), "%03d", Integer.valueOf(number))); + } + + public Channel(String number) { + this.number = number; + } + + public Channel(String number, String name) { + this.number = number; + this.name = name; + } + + public List getUrls() { + return urls; + } + + public void setUrls(List urls) { + this.urls = urls; + } + + public String getNumber() { + return number; + } + + public void setNumber(String number) { + this.number = number; + } + + public String getIcon() { + return TextUtils.isEmpty(icon) ? "" : icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getName() { + return TextUtils.isEmpty(name) ? "" : name; + } + + public void setName(String name) { + this.name = name; + } + + public Group getType() { + return type; + } + + public void setType(Group type) { + this.type = type; + } + + public String getUa() { + return TextUtils.isEmpty(ua) ? "" : ua; + } + + public void setUa(String ua) { + this.ua = ua; + } + + public boolean isSelect() { + return select; + } + + public void setSelect(boolean select) { + this.select = select; + } + + public int getVisible() { + return getIcon().isEmpty() ? View.GONE : View.VISIBLE; + } + + public void loadIcon(ImageView view) { + if (!getIcon().isEmpty()) ImgUtil.load(getIcon(), view); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (!(obj instanceof Channel)) return false; + Channel it = (Channel) obj; + return getNumber().equals(it.getNumber()); + } +} diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Group.java b/app/src/main/java/com/fongmi/android/tv/bean/Group.java new file mode 100644 index 000000000..e4ad4f76a --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/bean/Group.java @@ -0,0 +1,96 @@ +package com.fongmi.android.tv.bean; + +import android.text.TextUtils; +import android.view.View; +import android.widget.ImageView; + +import com.fongmi.android.tv.utils.ImgUtil; + +import java.util.List; + +public class Group { + + private List channel; + private String icon; + private String name; + private String pass; + private boolean select; + private int position; + + public Group(String name) { + this.name = name; + } + + public List getChannel() { + return channel; + } + + public void setChannel(List channel) { + this.channel = channel; + } + + public String getIcon() { + return TextUtils.isEmpty(icon) ? "" : icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getName() { + return TextUtils.isEmpty(name) ? "" : name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPass() { + return TextUtils.isEmpty(pass) ? "" : pass; + } + + public void setPass(String pass) { + this.pass = pass; + } + + public boolean isSelect() { + return select; + } + + public void setSelect(boolean select) { + this.select = select; + } + + public int getPosition() { + return position; + } + + public void setPosition(int position) { + this.position = position; + } + + public boolean isHidden() { + return !TextUtils.isEmpty(getPass()); + } + + public int getVisible() { + return getIcon().isEmpty() ? View.GONE : View.VISIBLE; + } + + public void loadIcon(ImageView view) { + if (!getIcon().isEmpty()) ImgUtil.load(getIcon(), view); + } + + public int find(String number) { + return getChannel().lastIndexOf(Channel.create(number)); + } + + @Override + public boolean equals(Object obj) { + if (obj == null) return false; + if (this == obj) return true; + if (!(obj instanceof Group)) return false; + Group it = (Group) obj; + return getName().equals(it.getName()); + } +}