Support epg - part 1

pull/362/head
FongMi 2 years ago
parent 811f8e7a77
commit 8c2d98a1cd
  1. 34
      app/src/main/java/com/fongmi/android/tv/bean/Epg.java
  2. 20
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java
  3. 67
      app/src/mobile/java/com/fongmi/android/tv/ui/adapter/EpgAdapter.java
  4. 6
      app/src/mobile/res/color/epg.xml
  5. 21
      app/src/mobile/res/layout/activity_live.xml
  6. 8
      app/src/mobile/res/layout/adapter_channel.xml
  7. 42
      app/src/mobile/res/layout/adapter_epg.xml
  8. 4
      app/src/mobile/res/layout/adapter_group.xml

@ -2,6 +2,8 @@ package com.fongmi.android.tv.bean;
import android.text.TextUtils;
import androidx.annotation.Nullable;
import com.fongmi.android.tv.App;
import com.fongmi.android.tv.R;
import com.fongmi.android.tv.utils.ResUtil;
@ -10,7 +12,9 @@ import com.github.catvod.utils.Trans;
import com.google.gson.annotations.SerializedName;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
public class Epg {
@ -58,6 +62,10 @@ public class Epg {
return list == null ? Collections.emptyList() : list;
}
public void setList(List<Epg> list) {
this.list = list;
}
public String getTitle() {
return TextUtils.isEmpty(title) ? "" : title;
}
@ -95,6 +103,7 @@ public class Epg {
}
private void setTime(SimpleDateFormat format) {
setList(new ArrayList<>(new LinkedHashSet<>(getList())));
for (Epg item : getList()) {
item.setStartTime(Util.format(format, getDate().concat(item.getStart())));
item.setEndTime(Util.format(format, getDate().concat(item.getEnd())));
@ -102,18 +111,39 @@ public class Epg {
}
}
private boolean isInRange() {
public boolean isInRange() {
return getStartTime() <= System.currentTimeMillis() && System.currentTimeMillis() <= getEndTime();
}
private String format() {
if (getTitle().isEmpty()) return "";
if (getStart().isEmpty() || getEnd().isEmpty()) return ResUtil.getString(R.string.play_now, getTitle());
if (getStart().isEmpty() && getEnd().isEmpty()) return ResUtil.getString(R.string.play_now, getTitle());
return getStart() + " ~ " + getEnd() + " " + getTitle();
}
public String getTime() {
if (getStart().isEmpty() && getEnd().isEmpty()) return "";
return getStart() + " ~ " + getEnd();
}
public String getEpg() {
for (Epg item : getList()) if (item.isInRange()) return item.format();
return "";
}
@Override
public boolean equals(@Nullable Object obj) {
if (this == obj) return true;
if (!(obj instanceof Epg)) return false;
Epg it = (Epg) obj;
return getTitle().equals(it.getTitle()) && getEnd().equals(it.getEnd()) && getStart().equals(it.getStart());
}
@Override
public int hashCode() {
int result = getTitle().hashCode();
result = 31 * result + getEnd().hashCode();
result = 31 * result + getStart().hashCode();
return result;
}
}

@ -51,6 +51,7 @@ import com.fongmi.android.tv.player.Source;
import com.fongmi.android.tv.server.Server;
import com.fongmi.android.tv.service.PlaybackService;
import com.fongmi.android.tv.ui.adapter.ChannelAdapter;
import com.fongmi.android.tv.ui.adapter.EpgAdapter;
import com.fongmi.android.tv.ui.adapter.GroupAdapter;
import com.fongmi.android.tv.ui.base.BaseActivity;
import com.fongmi.android.tv.ui.custom.CustomKeyDownLive;
@ -87,6 +88,7 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List
private GroupAdapter mGroupAdapter;
private Observer<Epg> mObserveEpg;
private LiveViewModel mViewModel;
private EpgAdapter mEpgAdapter;
private List<Group> mHides;
private Players mPlayers;
private Channel mChannel;
@ -205,8 +207,10 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List
}
private void setRecyclerView() {
mBinding.epg.setItemAnimator(null);
mBinding.group.setItemAnimator(null);
mBinding.channel.setItemAnimator(null);
mBinding.epg.setAdapter(mEpgAdapter = new EpgAdapter());
mBinding.group.setAdapter(mGroupAdapter = new GroupAdapter(this));
mBinding.channel.setAdapter(mChannelAdapter = new ChannelAdapter(this));
}
@ -299,10 +303,10 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List
}
private void setWidth(Live live) {
int base = ResUtil.dp2px(45);
int base = ResUtil.dp2px(44);
for (Group group : live.getGroups()) live.setWidth(Math.max(live.getWidth(), ResUtil.getTextWidth(group.getName(), 14)));
mBinding.group.getLayoutParams().width = live.getWidth() == 0 ? 0 : Math.min(live.getWidth() + base, ResUtil.dp2px(200));
mBinding.divide.setVisibility(live.getWidth() == 0 ? View.GONE : View.VISIBLE);
mBinding.group.getLayoutParams().width = live.getWidth() == 0 ? 0 : Math.min(live.getWidth() + base, ResUtil.dp2px(180));
mBinding.divide1.setVisibility(live.getWidth() == 0 ? View.GONE : View.VISIBLE);
}
private void setPosition(int[] position) {
@ -324,6 +328,7 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List
if (change) mChannelAdapter.addAll(mGroup.getChannel());
mChannelAdapter.setSelected(mGroup.getPosition());
mBinding.channel.scrollToPosition(mGroup.getPosition());
mBinding.epg.scrollToPosition(mEpgAdapter.getPosition());
}
private void onCast() {
@ -518,8 +523,11 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List
private void showEpg() {
String epg = mChannel.getData().getEpg();
mBinding.widget.name.setMaxEms(epg.isEmpty() ? mChannel.getName().length() : 12);
mBinding.widget.play.setText(epg);
mBinding.widget.name.setMaxEms(epg.isEmpty() ? mChannel.getName().length() : 12);
mBinding.epg.setVisibility(mChannel.getData().getList().isEmpty() ? View.GONE : View.VISIBLE);
mBinding.divide2.setVisibility(mChannel.getData().getList().isEmpty() ? View.GONE : View.VISIBLE);
mEpgAdapter.addAll(mChannel.getData().getList());
setMetadata();
}
@ -658,9 +666,11 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List
}
private void resetAdapter() {
mBinding.divide.setVisibility(View.GONE);
mBinding.divide1.setVisibility(View.GONE);
mBinding.divide2.setVisibility(View.GONE);
mChannelAdapter.clear();
mGroupAdapter.clear();
mEpgAdapter.clear();
mHides.clear();
mChannel = null;
mGroup = null;

@ -0,0 +1,67 @@
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.Epg;
import com.fongmi.android.tv.databinding.AdapterEpgBinding;
import java.util.ArrayList;
import java.util.List;
public class EpgAdapter extends RecyclerView.Adapter<EpgAdapter.ViewHolder> {
private final List<Epg> mItems;
public EpgAdapter() {
this.mItems = new ArrayList<>();
}
public void clear() {
mItems.clear();
notifyDataSetChanged();
}
public void addAll(List<Epg> items) {
mItems.clear();
mItems.addAll(items);
notifyDataSetChanged();
}
public int getPosition() {
for (int i = 0; i < mItems.size(); i++) if (mItems.get(i).isInRange()) return i;
return 0;
}
@Override
public int getItemCount() {
return mItems.size();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new ViewHolder(AdapterEpgBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Epg item = mItems.get(position);
holder.binding.time.setText(item.getTime());
holder.binding.title.setText(item.getTitle());
holder.binding.getRoot().setSelected(item.isInRange());
}
static class ViewHolder extends RecyclerView.ViewHolder {
private final AdapterEpgBinding binding;
ViewHolder(@NonNull AdapterEpgBinding binding) {
super(binding.getRoot());
this.binding = binding;
}
}
}

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/white" android:state_focused="true" android:state_selected="true" />
<item android:color="@color/yellow_500" android:state_selected="true" />
<item android:color="@color/white" />
</selector>

@ -72,7 +72,7 @@
tools:listitem="@layout/adapter_group" />
<View
android:id="@+id/divide"
android:id="@+id/divide1"
android:layout_width="0.3dp"
android:layout_height="match_parent"
android:background="@color/grey_700"
@ -80,7 +80,7 @@
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/channel"
android:layout_width="280dp"
android:layout_width="220dp"
android:layout_height="match_parent"
android:clipChildren="false"
android:clipToPadding="false"
@ -89,6 +89,23 @@
tools:itemCount="5"
tools:listitem="@layout/adapter_channel" />
<View
android:id="@+id/divide2"
android:layout_width="0.3dp"
android:layout_height="match_parent"
android:background="@color/grey_700" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/epg"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:clipChildren="false"
android:clipToPadding="false"
android:padding="8dp"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:itemCount="5"
tools:listitem="@layout/adapter_epg" />
</LinearLayout>
</FrameLayout>

@ -19,6 +19,10 @@
android:layout_height="wrap_content"
android:layout_marginEnd="12dp"
android:duplicateParentState="true"
android:shadowColor="@color/grey_900"
android:shadowDx="2"
android:shadowDy="2"
android:shadowRadius="1"
android:textColor="@color/channel"
android:textSize="14sp"
tools:text="01" />
@ -37,6 +41,10 @@
android:layout_height="wrap_content"
android:duplicateParentState="true"
android:ellipsize="marquee"
android:shadowColor="@color/grey_900"
android:shadowDx="2"
android:shadowDy="2"
android:shadowRadius="1"
android:singleLine="true"
android:textColor="@color/channel"
android:textSize="14sp"

@ -0,0 +1,42 @@
<?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="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingStart="8dp"
android:paddingTop="6dp"
android:paddingEnd="8dp"
android:paddingBottom="6dp">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:duplicateParentState="true"
android:ellipsize="marquee"
android:shadowColor="@color/grey_900"
android:shadowDx="2"
android:shadowDy="2"
android:shadowRadius="1"
android:singleLine="true"
android:textColor="@color/epg"
android:textSize="14sp"
tools:text="七龍珠" />
<TextView
android:id="@+id/time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:duplicateParentState="true"
android:ellipsize="marquee"
android:shadowColor="@color/grey_900"
android:shadowDx="2"
android:shadowDy="2"
android:shadowRadius="1"
android:singleLine="true"
android:textColor="@color/epg"
android:textSize="14sp"
tools:text="18:00 ~ 19:00" />
</LinearLayout>

@ -19,6 +19,10 @@
android:layout_height="wrap_content"
android:duplicateParentState="true"
android:ellipsize="marquee"
android:shadowColor="@color/grey_900"
android:shadowDx="2"
android:shadowDy="2"
android:shadowRadius="1"
android:singleLine="true"
android:textColor="@color/group"
android:textSize="14sp"

Loading…
Cancel
Save