Support epg - part 5

pull/362/head
FongMi 2 years ago
parent 3020f83f42
commit b6ab790734
  1. 90
      app/src/main/java/com/fongmi/android/tv/bean/Epg.java
  2. 85
      app/src/main/java/com/fongmi/android/tv/bean/EpgData.java
  3. 31
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java
  4. 19
      app/src/mobile/java/com/fongmi/android/tv/ui/adapter/EpgDataAdapter.java
  5. 11
      app/src/mobile/res/drawable/ic_action_arrow.xml
  6. 13
      app/src/mobile/res/layout/activity_live.xml
  7. 5
      app/src/mobile/res/layout/adapter_epg_data.xml
  8. 24
      app/src/mobile/res/layout/view_widget_live.xml

@ -2,11 +2,7 @@ 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;
import com.fongmi.android.tv.utils.Util;
import com.github.catvod.utils.Trans;
import com.google.gson.annotations.SerializedName;
@ -19,21 +15,12 @@ import java.util.List;
public class Epg {
@SerializedName("key")
private String key;
@SerializedName("date")
private String date;
@SerializedName("epg_data")
private List<Epg> list;
@SerializedName("title")
private String title;
@SerializedName("start")
private String start;
@SerializedName("end")
private String end;
@SerializedName("key")
private String key;
private long startTime;
private long endTime;
private List<EpgData> list;
public static Epg objectFrom(String str, String key, SimpleDateFormat format) {
try {
@ -58,92 +45,29 @@ public class Epg {
return TextUtils.isEmpty(date) ? "" : date;
}
public List<Epg> getList() {
public List<EpgData> getList() {
return list == null ? Collections.emptyList() : list;
}
public void setList(List<Epg> list) {
public void setList(List<EpgData> list) {
this.list = list;
}
public String getTitle() {
return TextUtils.isEmpty(title) ? "" : title;
}
public void setTitle(String title) {
this.title = title;
}
public String getStart() {
return TextUtils.isEmpty(start) ? "" : start;
}
public String getEnd() {
return TextUtils.isEmpty(end) ? "" : end;
}
public long getStartTime() {
return startTime;
}
public void setStartTime(long startTime) {
this.startTime = startTime;
}
public long getEndTime() {
return endTime;
}
public void setEndTime(long endTime) {
this.endTime = endTime;
}
public boolean equal(String date) {
return getDate().equals(date);
}
private void setTime(SimpleDateFormat format) {
setList(new ArrayList<>(new LinkedHashSet<>(getList())));
for (Epg item : getList()) {
for (EpgData item : getList()) {
item.setStartTime(Util.format(format, getDate().concat(item.getStart())));
item.setEndTime(Util.format(format, getDate().concat(item.getEnd())));
item.setTitle(Trans.s2t(item.getTitle()));
}
}
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());
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();
for (EpgData 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;
}
}

@ -0,0 +1,85 @@
package com.fongmi.android.tv.bean;
import android.text.TextUtils;
import androidx.annotation.Nullable;
import com.fongmi.android.tv.R;
import com.fongmi.android.tv.utils.ResUtil;
import com.google.gson.annotations.SerializedName;
public class EpgData {
@SerializedName("title")
private String title;
@SerializedName("start")
private String start;
@SerializedName("end")
private String end;
private long startTime;
private long endTime;
public String getTitle() {
return TextUtils.isEmpty(title) ? "" : title;
}
public void setTitle(String title) {
this.title = title;
}
public String getStart() {
return TextUtils.isEmpty(start) ? "" : start;
}
public String getEnd() {
return TextUtils.isEmpty(end) ? "" : end;
}
public long getStartTime() {
return startTime;
}
public void setStartTime(long startTime) {
this.startTime = startTime;
}
public long getEndTime() {
return endTime;
}
public void setEndTime(long endTime) {
this.endTime = endTime;
}
public boolean isInRange() {
return getStartTime() <= System.currentTimeMillis() && System.currentTimeMillis() <= getEndTime();
}
public String format() {
if (getTitle().isEmpty()) return "";
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();
}
@Override
public boolean equals(@Nullable Object obj) {
if (this == obj) return true;
if (!(obj instanceof EpgData)) return false;
EpgData it = (EpgData) 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,7 +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.EpgDataAdapter;
import com.fongmi.android.tv.ui.adapter.GroupAdapter;
import com.fongmi.android.tv.ui.base.BaseActivity;
import com.fongmi.android.tv.ui.custom.CustomKeyDownLive;
@ -79,16 +79,16 @@ import java.util.List;
import tv.danmaku.ijk.media.player.ui.IjkVideoView;
public class LiveActivity extends BaseActivity implements CustomKeyDownLive.Listener, TrackDialog.Listener, Biometric.Callback, PassCallback, LiveCallback, GroupAdapter.OnClickListener, ChannelAdapter.OnClickListener, EpgAdapter.OnClickListener, SubtitleCallback, CastDialog.Listener, InfoDialog.Listener {
public class LiveActivity extends BaseActivity implements CustomKeyDownLive.Listener, TrackDialog.Listener, Biometric.Callback, PassCallback, LiveCallback, GroupAdapter.OnClickListener, ChannelAdapter.OnClickListener, EpgDataAdapter.OnClickListener, SubtitleCallback, CastDialog.Listener, InfoDialog.Listener {
private ActivityLiveBinding mBinding;
private ChannelAdapter mChannelAdapter;
private EpgDataAdapter mEpgDataAdapter;
private Observer<Channel> mObserveUrl;
private CustomKeyDownLive mKeyDown;
private GroupAdapter mGroupAdapter;
private Observer<Epg> mObserveEpg;
private LiveViewModel mViewModel;
private EpgAdapter mEpgAdapter;
private List<Group> mHides;
private Players mPlayers;
private Channel mChannel;
@ -182,6 +182,7 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List
@SuppressLint("ClickableViewAccessibility")
protected void initEvent() {
mBinding.control.seek.setListener(mPlayers);
mBinding.arrow.setOnClickListener(view -> onArrow());
mBinding.control.cast.setOnClickListener(view -> onCast());
mBinding.control.info.setOnClickListener(view -> onInfo());
mBinding.control.right.back.setOnClickListener(view -> onBack());
@ -210,8 +211,8 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List
mBinding.group.setItemAnimator(null);
mBinding.channel.setItemAnimator(null);
mBinding.group.setAdapter(mGroupAdapter = new GroupAdapter(this));
mBinding.widget.epg.setAdapter(mEpgAdapter = new EpgAdapter(this));
mBinding.channel.setAdapter(mChannelAdapter = new ChannelAdapter(this));
mBinding.widget.epgData.setAdapter(mEpgDataAdapter = new EpgDataAdapter(this));
}
private void setPlayerView() {
@ -329,6 +330,10 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List
mBinding.channel.scrollToPosition(mGroup.getPosition());
}
private void onArrow() {
showEpg();
}
private void onCast() {
CastDialog.create().video(CastVideo.get(mBinding.control.title.getText().toString(), mPlayers.getUrl())).fm(false).show(this);
}
@ -461,6 +466,17 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List
mBinding.recycler.setVisibility(View.VISIBLE);
mBinding.channel.requestFocus();
setPosition();
hideEpg();
}
private void showEpg() {
mBinding.widget.epgData.scrollToPosition(mEpgDataAdapter.getPosition());
mBinding.widget.epg.setVisibility(View.VISIBLE);
hideUI();
}
private void hideEpg() {
mBinding.widget.epg.setVisibility(View.GONE);
}
private void showProgress() {
@ -497,6 +513,7 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List
mBinding.control.getRoot().setVisibility(View.VISIBLE);
setR1Callback();
hideInfo();
hideEpg();
}
private void hideControl() {
@ -636,7 +653,7 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List
private void setEpg() {
String epg = mChannel.getData().getEpg();
mBinding.widget.name.setMaxEms(epg.isEmpty() ? mChannel.getName().length() : 12);
mEpgAdapter.addAll(mChannel.getData().getList());
mEpgDataAdapter.addAll(mChannel.getData().getList());
mBinding.widget.play.setText(epg);
setMetadata();
}
@ -668,9 +685,9 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List
private void resetAdapter() {
mBinding.divide.setVisibility(View.GONE);
mEpgDataAdapter.clear();
mChannelAdapter.clear();
mGroupAdapter.clear();
mEpgAdapter.clear();
mHides.clear();
mChannel = null;
mGroup = null;
@ -1104,6 +1121,8 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List
hideControl();
} else if (isVisible(mBinding.widget.info)) {
hideInfo();
} else if (isVisible(mBinding.widget.epg)) {
hideEpg();
} else if (isVisible(mBinding.recycler)) {
hideUI();
} else if (!isLock()) {

@ -7,17 +7,18 @@ import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.fongmi.android.tv.bean.Epg;
import com.fongmi.android.tv.databinding.AdapterEpgBinding;
import com.fongmi.android.tv.bean.EpgData;
import com.fongmi.android.tv.databinding.AdapterEpgDataBinding;
import java.util.ArrayList;
import java.util.List;
public class EpgAdapter extends RecyclerView.Adapter<EpgAdapter.ViewHolder> {
public class EpgDataAdapter extends RecyclerView.Adapter<EpgDataAdapter.ViewHolder> {
private final OnClickListener mListener;
private final List<Epg> mItems;
private final List<EpgData> mItems;
public EpgAdapter(OnClickListener listener) {
public EpgDataAdapter(OnClickListener listener) {
this.mListener = listener;
this.mItems = new ArrayList<>();
}
@ -32,7 +33,7 @@ public class EpgAdapter extends RecyclerView.Adapter<EpgAdapter.ViewHolder> {
notifyDataSetChanged();
}
public void addAll(List<Epg> items) {
public void addAll(List<EpgData> items) {
mItems.clear();
mItems.addAll(items);
notifyDataSetChanged();
@ -51,12 +52,12 @@ public class EpgAdapter extends RecyclerView.Adapter<EpgAdapter.ViewHolder> {
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new ViewHolder(AdapterEpgBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
return new ViewHolder(AdapterEpgDataBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Epg item = mItems.get(position);
EpgData item = mItems.get(position);
holder.binding.time.setText(item.getTime());
holder.binding.title.setText(item.getTitle());
holder.binding.getRoot().setSelected(item.isInRange());
@ -64,9 +65,9 @@ public class EpgAdapter extends RecyclerView.Adapter<EpgAdapter.ViewHolder> {
static class ViewHolder extends RecyclerView.ViewHolder {
private final AdapterEpgBinding binding;
private final AdapterEpgDataBinding binding;
ViewHolder(@NonNull AdapterEpgBinding binding) {
ViewHolder(@NonNull AdapterEpgDataBinding binding) {
super(binding.getRoot());
this.binding = binding;
}

@ -0,0 +1,11 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="16dp"
android:height="16dp"
android:autoMirrored="true"
android:tint="#FFFFFF"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M6.23,20.23l1.77,1.77l10,-10l-10,-10l-1.77,1.77l8.23,8.23z" />
</vector>

@ -58,7 +58,8 @@
android:layout_height="match_parent"
android:background="@drawable/shape_live_list"
android:orientation="horizontal"
android:visibility="gone">
android:visibility="gone"
tools:visibility="visible">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/group"
@ -89,6 +90,16 @@
tools:itemCount="5"
tools:listitem="@layout/adapter_channel" />
<ImageView
android:id="@+id/arrow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginStart="-32dp"
android:background="?attr/selectableItemBackgroundBorderless"
android:padding="4dp"
android:src="@drawable/ic_action_arrow" />
</LinearLayout>
</FrameLayout>

@ -4,10 +4,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingStart="12dp"
android:paddingTop="6dp"
android:paddingEnd="12dp"
android:paddingBottom="6dp">
android:padding="8dp">
<TextView
android:id="@+id/title"

@ -182,17 +182,27 @@
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
<LinearLayout
android:id="@+id/epg"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:clipChildren="false"
android:clipToPadding="false"
android:padding="8dp"
android:background="@drawable/shape_live_list"
android:orientation="vertical"
android:visibility="gone"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:itemCount="5"
tools:listitem="@layout/adapter_epg" />
tools:visibility="visible">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/epg_data"
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_data" />
</LinearLayout>
<LinearLayout
android:id="@+id/info_pip"

Loading…
Cancel
Save